element-ui-wbi 1.0.3 → 1.0.5
Sign up to get free protection for your applications and to get access to all the features.
- package/README.md +4 -4
- package/element-ui-wbi.common.js +3 -3
- package/element-ui-wbi.css +1 -1
- package/element-ui-wbi.umd.js +3 -3
- package/element-ui-wbi.umd.min.js +1 -1
- package/package.json +1 -1
package/element-ui-wbi.common.js
CHANGED
@@ -9,11 +9,11 @@
|
|
9
9
|
/******/ (function() { // webpackBootstrap
|
10
10
|
/******/ var __webpack_modules__ = ({
|
11
11
|
|
12
|
-
/***/
|
12
|
+
/***/ 2634:
|
13
13
|
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
|
14
14
|
|
15
15
|
"use strict";
|
16
|
-
eval("// ESM COMPAT FLAG\n__webpack_require__.r(__webpack_exports__);\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n Http: function() { return /* reexport */ Http; },\n \"default\": function() { return /* binding */ entry_lib; }\n});\n\n// NAMESPACE OBJECT: ./node_modules/axios/lib/platform/common/utils.js\nvar common_utils_namespaceObject = {};\n__webpack_require__.r(common_utils_namespaceObject);\n__webpack_require__.d(common_utils_namespaceObject, {\n hasBrowserEnv: function() { return hasBrowserEnv; },\n hasStandardBrowserEnv: function() { return hasStandardBrowserEnv; },\n hasStandardBrowserWebWorkerEnv: function() { return hasStandardBrowserWebWorkerEnv; }\n});\n\n;// CONCATENATED MODULE: ./node_modules/@vue/cli-service/lib/commands/build/setPublicPath.js\n/* eslint-disable no-var */\n// This file is imported into lib/wc client bundles.\n\nif (typeof window !== 'undefined') {\n var currentScript = window.document.currentScript\n if (false) { var getCurrentScript; }\n\n var src = currentScript && currentScript.src.match(/(.+\\/)[^/]+\\.js(\\?.*)?$/)\n if (src) {\n __webpack_require__.p = src[1] // eslint-disable-line\n }\n}\n\n// Indicate to webpack that this file can be concatenated\n/* harmony default export */ var setPublicPath = (null);\n\n;// CONCATENATED MODULE: ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/pagination/Index.vue?vue&type=template&id=26b70fb4&scoped=true\nvar render = function render() {\n var _vm = this,\n _c = _vm._self._c;\n return _vm.total > 0 ? _c('div', [_c('el-pagination', _vm._b({\n attrs: {\n \"background\": \"\",\n \"current-page\": _vm.currentPage,\n \"page-size\": _vm.pageSize,\n \"page-sizes\": _vm.pageSizes,\n \"total\": _vm.total,\n \"layout\": \"prev, pager, next\"\n },\n on: {\n \"size-change\": _vm.handleSizeChange,\n \"current-change\": _vm.handleCurrentChange\n }\n }, 'el-pagination', _vm.$attrs, false))], 1) : _vm._e();\n};\nvar staticRenderFns = [];\n\n;// CONCATENATED MODULE: ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/pagination/Index.vue?vue&type=script&lang=js\n/* harmony default export */ var Indexvue_type_script_lang_js = ({\n name: 'Pagination',\n props: {\n total: {\n required: true,\n type: Number,\n default: 0\n },\n page: {\n type: Number,\n default: 1\n },\n limit: {\n type: Number,\n default: 20\n },\n pageSizes: {\n type: Array,\n default() {\n return [10, 15, 20, 30, 50];\n }\n }\n },\n computed: {\n currentPage: {\n get() {\n return this.page;\n },\n set(val) {\n this.$emit('update:page', val);\n }\n },\n pageSize: {\n get() {\n return this.limit;\n },\n set(val) {\n this.$emit('update:limit', val);\n }\n },\n totalCount: {\n get() {\n return this.total;\n },\n set(val) {\n this.$emit('update:total', val);\n }\n }\n },\n methods: {\n handleSizeChange(val) {\n this.$emit('pagination', {\n page: this.currentPage,\n limit: val\n });\n },\n handleCurrentChange(val) {\n this.$emit('pagination', {\n page: val,\n limit: this.pageSize\n });\n }\n }\n});\n;// CONCATENATED MODULE: ./src/components/pagination/Index.vue?vue&type=script&lang=js\n /* harmony default export */ var pagination_Indexvue_type_script_lang_js = (Indexvue_type_script_lang_js); \n;// CONCATENATED MODULE: ./node_modules/mini-css-extract-plugin/dist/loader.js??clonedRuleSet-22.use[0]!./node_modules/css-loader/dist/cjs.js??clonedRuleSet-22.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-22.use[2]!./node_modules/sass-loader/dist/cjs.js??clonedRuleSet-22.use[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/pagination/Index.vue?vue&type=style&index=0&id=26b70fb4&prod&lang=scss&scoped=true\n// extracted by mini-css-extract-plugin\n\n;// CONCATENATED MODULE: ./src/components/pagination/Index.vue?vue&type=style&index=0&id=26b70fb4&prod&lang=scss&scoped=true\n\n;// CONCATENATED MODULE: ./node_modules/@vue/vue-loader-v15/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 =\n typeof scriptExports === 'function' ? scriptExports.options : 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) {\n // server build\n hook = function (context) {\n // 2.3 injection\n context =\n context || // cached call\n (this.$vnode && this.$vnode.ssrContext) || // stateful\n (this.parent && this.parent.$vnode && this.parent.$vnode.ssrContext) // functional\n // 2.2 with runInNewContext: true\n if (!context && typeof __VUE_SSR_CONTEXT__ !== 'undefined') {\n context = __VUE_SSR_CONTEXT__\n }\n // inject component styles\n if (injectStyles) {\n injectStyles.call(this, context)\n }\n // register component module identifier for async chunk inferrence\n if (context && context._registeredComponents) {\n context._registeredComponents.add(moduleIdentifier)\n }\n }\n // used by ssr in case component is cached and beforeCreate\n // never gets called\n options._ssrRegister = hook\n } else if (injectStyles) {\n hook = shadowMode\n ? function () {\n injectStyles.call(\n this,\n (options.functional ? this.parent : this).$root.$options.shadowRoot\n )\n }\n : injectStyles\n }\n\n if (hook) {\n if (options.functional) {\n // for template-only hot-reload because in that case the render fn doesn't\n // go through the normalizer\n options._injectStyles = hook\n // register for functional component in vue file\n var originalRender = options.render\n options.render = function renderWithStyleInjection(h, context) {\n hook.call(context)\n return originalRender(h, context)\n }\n } else {\n // inject component registration as beforeCreate hook\n var existing = options.beforeCreate\n options.beforeCreate = existing ? [].concat(existing, hook) : [hook]\n }\n }\n\n return {\n exports: scriptExports,\n options: options\n }\n}\n\n;// CONCATENATED MODULE: ./src/components/pagination/Index.vue\n\n\n\n;\n\n\n/* normalize component */\n\nvar component = normalizeComponent(\n pagination_Indexvue_type_script_lang_js,\n render,\n staticRenderFns,\n false,\n null,\n \"26b70fb4\",\n null\n \n)\n\n/* harmony default export */ var Index = (component.exports);\n;// CONCATENATED MODULE: ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/page-table/Index.vue?vue&type=template&id=2da92c81&scoped=true\nvar Indexvue_type_template_id_2da92c81_scoped_true_render = function render() {\n var _vm = this,\n _c = _vm._self._c;\n return _c('div', {\n staticClass: \"page-table\",\n attrs: {\n \"id\": this.tableId\n }\n }, [_c('div', {\n staticClass: \"table\"\n }, [_c('el-scrollbar', {\n staticStyle: {\n \"height\": \"100%\"\n }\n }, [_c('el-table', _vm._b({\n ref: _vm.tableId,\n attrs: {\n \"stripe\": \"\",\n \"data\": _vm.list,\n \"row-key\": _vm.rowKey,\n \"load\": _vm.load,\n \"highlight-current-row\": _vm.hlightCurrentRow,\n \"default-expand-all\": _vm.defaultExpandAll\n },\n on: {\n \"select\": _vm.handelSelectionChange,\n \"select-all\": _vm.selectAll,\n \"row-click\": _vm.handleRowClick,\n \"expand-change\": val => _vm.$emit('expand-change', val)\n }\n }, 'el-table', _vm.$attrs, false), [_vm.showCheckBox ? _c('el-table-column', {\n attrs: {\n \"type\": \"selection\",\n \"width\": \"60px\",\n \"align\": \"center\"\n }\n }) : _vm._e(), _vm.sortNum ? _c('el-table-column', {\n attrs: {\n \"type\": \"index\",\n \"width\": \"60px\",\n \"label\": \"序号\",\n \"align\": \"center\"\n },\n scopedSlots: _vm._u([{\n key: \"default\",\n fn: function (scope) {\n return [_vm.page ? _c('span', [_vm._v(_vm._s((_vm.params.page - 1) * _vm.params.limit + scope.$index + 1))]) : _c('span', [_vm._v(_vm._s(scope.$index + 1))])];\n }\n }], null, false, 2786008021)\n }) : _vm._e(), _vm._t(\"default\")], 2)], 1)], 1), _vm.page ? _c('Pagination', {\n attrs: {\n \"total\": _vm.total,\n \"page\": _vm.params.page,\n \"limit\": _vm.params.limit\n },\n on: {\n \"update:page\": function ($event) {\n return _vm.$set(_vm.params, \"page\", $event);\n },\n \"pagination\": _vm.getList\n }\n }) : _vm._e()], 1);\n};\nvar Indexvue_type_template_id_2da92c81_scoped_true_staticRenderFns = [];\n\n;// CONCATENATED MODULE: ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/page-table/Index.vue?vue&type=script&lang=js\n/* harmony default export */ var page_table_Indexvue_type_script_lang_js = ({\n name: 'PageTable',\n props: {\n // 自定义数据\n data: {\n type: Array,\n default: null\n },\n // 请求地址\n url: {\n type: String,\n default: ''\n },\n // 请求方式\n method: {\n type: String,\n default: 'get'\n },\n // 是否显示序号\n sortNum: {\n type: Boolean,\n default: true\n },\n // 是否分页\n page: {\n type: Boolean,\n default: true\n },\n // 树形表格时,是否全部展开\n defaultExpandAll: {\n type: Boolean,\n default: false\n },\n // 初始请求参数\n defaultParams: {\n type: Object,\n default: () => ({})\n },\n // 默认选中数据\n defaultSelect: {\n type: Array,\n default: () => []\n },\n rowKey: {\n type: String,\n default: 'id'\n },\n hlightCurrentRow: {\n ype: Boolean,\n default: false\n }\n },\n watch: {\n data(newVal) {\n this.list = newVal;\n },\n defaultSelect: {\n handler() {\n this.setChecked();\n },\n deep: true\n },\n defaultParams(newVal, oldVal) {\n for (const key in newVal) {\n if (newVal[key] != oldVal[key]) {\n this.params = {\n page: 1,\n limit: 15,\n param: {\n ...newVal\n }\n };\n this.getList();\n break;\n }\n }\n }\n },\n data() {\n return {\n showCheckBox: false,\n params: {\n page: 1,\n limit: 15,\n param: {\n ...this.defaultParams\n }\n },\n total: 0,\n list: [],\n tableId: `table_${Math.random().toString(36).substring(2, 16)}`,\n selectData: {},\n selectIds: []\n };\n },\n mounted() {\n if (this.$listeners['selection-change']) {\n this.showCheckBox = true;\n }\n if (this.data) {\n this.list = this.data;\n return;\n }\n for (const item of this.defaultSelect) {\n this.selectData[item[this.rowKey]] = item;\n }\n this.getList();\n },\n methods: {\n // 获取数据\n getList(pageOption) {\n if (!this.url) {\n return;\n }\n if (pageOption) {\n this.params.page = pageOption.page;\n this.params.limit = pageOption.limit;\n }\n if (!this.page) {\n delete this.params.page;\n delete this.params.limit;\n }\n const storageParams = sessionStorage.getItem(this.$route.path);\n if (storageParams) {\n sessionStorage.setItem(this.$route.path, JSON.stringify(this.params));\n }\n switch (this.method) {\n case 'get':\n http.get(this.url, this.params, res => {\n this._setData(res);\n });\n break;\n case 'post':\n http.post(this.url, this.params, res => {\n this._setData(res);\n });\n break;\n default:\n break;\n }\n },\n _setData(res) {\n if (this.page) {\n this.list = res.data.records;\n this.total = res.data.total;\n } else {\n this.list = res.data;\n }\n this.setChecked();\n },\n // 设置默认选中\n setChecked() {\n if (this.defaultSelect.length > 0) {\n this.selectIds = this.defaultSelect.map(item => item[this.rowKey]);\n if (this.showCheckBox && this.list) {\n this.$nextTick(() => {\n // 默认选中数据\n if (this.$refs[this.tableId]) {\n for (const item of this.list) {\n if (this.selectIds.includes(item[this.rowKey])) {\n this.$refs[this.tableId].toggleRowSelection(item, true);\n this.selectData[item[this.rowKey]] = item;\n } else {\n this.$refs[this.tableId].toggleRowSelection(item, false);\n delete this.selectData[item[this.rowKey]];\n }\n }\n }\n });\n }\n } else {\n this.selectIds = [];\n this.selectData = {};\n if (this.$refs[this.tableId]) {\n for (const item of this.list) {\n this.$refs[this.tableId].toggleRowSelection(item, false);\n }\n }\n }\n },\n // 条件查询\n query(params = {}) {\n if (Object.keys(params).length > 0) {\n const param = {\n ...this.params.param,\n ...params\n };\n this.params = {\n ...this.params,\n param\n };\n this.params.page = 1;\n }\n this.getList();\n },\n // 点击行\n handleRowClick(row, column, event) {\n this.$emit('row-click', row, column, event);\n },\n handelSelectionChange(_, row) {\n if (this.selectData[row[this.rowKey]]) {\n delete this.selectData[row[this.rowKey]];\n } else {\n this.selectData[row[this.rowKey]] = row;\n }\n const selectionList = Object.values(this.selectData);\n this.selectIds = selectionList.map(item => item[this.rowKey]);\n this.$emit('selection-change', selectionList);\n },\n // 全选/全不选\n selectAll(selection) {\n if (selection.length > 0) {\n for (const item of selection) {\n this.selectData[item[this.rowKey]] = item;\n }\n } else {\n for (const item of this.list) {\n delete this.selectData[item[this.rowKey]];\n }\n }\n const selectionList = Object.values(this.selectData);\n this.selectIds = selectionList.map(item => item[this.rowKey]);\n this.$emit('selection-change', selectionList);\n },\n setCurrent(index) {\n this.$refs[this.tableId].setCurrentRow(this.list[index]);\n },\n getData() {\n return this.list;\n },\n load(tree, treeNode, resolve) {\n this.$emit('load', tree, treeNode, resolve);\n }\n }\n});\n;// CONCATENATED MODULE: ./src/components/page-table/Index.vue?vue&type=script&lang=js\n /* harmony default export */ var components_page_table_Indexvue_type_script_lang_js = (page_table_Indexvue_type_script_lang_js); \n;// CONCATENATED MODULE: ./node_modules/mini-css-extract-plugin/dist/loader.js??clonedRuleSet-22.use[0]!./node_modules/css-loader/dist/cjs.js??clonedRuleSet-22.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-22.use[2]!./node_modules/sass-loader/dist/cjs.js??clonedRuleSet-22.use[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/page-table/Index.vue?vue&type=style&index=0&id=2da92c81&prod&lang=scss&scoped=true\n// extracted by mini-css-extract-plugin\n\n;// CONCATENATED MODULE: ./src/components/page-table/Index.vue?vue&type=style&index=0&id=2da92c81&prod&lang=scss&scoped=true\n\n;// CONCATENATED MODULE: ./src/components/page-table/Index.vue\n\n\n\n;\n\n\n/* normalize component */\n\nvar Index_component = normalizeComponent(\n components_page_table_Indexvue_type_script_lang_js,\n Indexvue_type_template_id_2da92c81_scoped_true_render,\n Indexvue_type_template_id_2da92c81_scoped_true_staticRenderFns,\n false,\n null,\n \"2da92c81\",\n null\n \n)\n\n/* harmony default export */ var page_table_Index = (Index_component.exports);\n;// CONCATENATED MODULE: ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/dialog/Index.vue?vue&type=template&id=4148762e&scoped=true\nvar Indexvue_type_template_id_4148762e_scoped_true_render = function render() {\n var _vm = this,\n _c = _vm._self._c;\n return _c('el-dialog', _vm._b({\n directives: [{\n name: \"dialogDrag\",\n rawName: \"v-dialogDrag\"\n }],\n staticStyle: {\n \"margin-top\": \"0\"\n },\n attrs: {\n \"title\": _vm.title,\n \"visible\": _vm.dialogVisible,\n \"before-close\": _vm.handleClose,\n \"center\": \"\",\n \"close-on-click-modal\": false,\n \"show-close\": _vm.showClose,\n \"append-to-body\": \"\"\n }\n }, 'el-dialog', _vm.$attrs, false), [_c('div', {\n staticStyle: {\n \"overflow-y\": \"auto\",\n \"overflow-x\": \"hidden\",\n \"position\": \"relative\"\n },\n style: {\n maxHeight: _vm.maxHeight,\n minHeight: _vm.minHeight\n }\n }, [_vm._t(\"default\")], 2), _c('div', {\n staticStyle: {\n \"text-align\": \"center\"\n },\n attrs: {\n \"slot\": \"footer\"\n },\n slot: \"footer\"\n }, [_vm._t(\"footer\")], 2)]);\n};\nvar Indexvue_type_template_id_4148762e_scoped_true_staticRenderFns = [];\n\n// EXTERNAL MODULE: external {\"commonjs\":\"vue\",\"commonjs2\":\"vue\",\"root\":\"Vue\"}\nvar external_commonjs_vue_commonjs2_vue_root_Vue_ = __webpack_require__(4100);\nvar external_commonjs_vue_commonjs2_vue_root_Vue_default = /*#__PURE__*/__webpack_require__.n(external_commonjs_vue_commonjs2_vue_root_Vue_);\n;// CONCATENATED MODULE: ./src/components/dialog/dialog-drag.js\n// v-dialogDrag: 弹窗拖拽\n\nexternal_commonjs_vue_commonjs2_vue_root_Vue_default().directive('dialogDrag', {\n bind(el) {\n const dialogHeaderEl = el.querySelector('.el-dialog__header');\n const dragDom = el.querySelector('.el-dialog');\n dialogHeaderEl.style.cursor = 'move';\n\n // 获取原有属性 ie dom元素.currentStyle 火狐谷歌 window.getComputedStyle(dom元素, null);\n const sty = dragDom.currentStyle || window.getComputedStyle(dragDom, null);\n dialogHeaderEl.onmousedown = event => {\n // 鼠标按下,计算当前元素距离可视区的距离\n const disX = event.clientX - dialogHeaderEl.offsetLeft;\n const disY = event.clientY - dialogHeaderEl.offsetTop;\n\n // 获取到的值带px 正则匹配替换\n let styL = null;\n let styT = null;\n\n // 注意在ie中 第一次获取到的值为组件自带50% 移动之后赋值为px\n if (sty.left.includes('\\%')) {\n styL = +document.body.clientWidth * (+sty.left.replace(/\\%/g, '') / 100);\n styT = +document.body.clientHeight * (+sty.top.replace(/\\%/g, '') / 100);\n } else {\n styL = +sty.left.replace(/\\px/g, '');\n styT = +sty.top.replace(/\\px/g, '');\n }\n document.onmousemove = function (e) {\n // 通过事件委托,计算移动的距离\n const l = e.clientX - disX;\n const t = e.clientY - disY;\n\n // 移动当前元素\n dragDom.style.left = `${l + styL}px`;\n dragDom.style.top = `${t + styT}px`;\n };\n document.onmouseup = function () {\n document.onmousemove = null;\n document.onmouseup = null;\n };\n };\n }\n});\nexternal_commonjs_vue_commonjs2_vue_root_Vue_default().directive('removeAriaHidden', {\n bind(el) {\n let ariaEls = el.querySelectorAll('.el-radio__original');\n ariaEls.forEach(item => {\n item.removeAttribute('aria-hidden');\n });\n }\n});\n;// CONCATENATED MODULE: ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/dialog/Index.vue?vue&type=script&lang=js\n\n/* harmony default export */ var dialog_Indexvue_type_script_lang_js = ({\n name: 'Dialog',\n props: {\n title: {\n type: String,\n default: '提示'\n },\n maxHeight: {\n type: String,\n default: '60vh'\n },\n minHeight: {\n type: String,\n default: '150px'\n }\n },\n data() {\n return {\n dialogVisible: true,\n showClose: false\n };\n },\n mounted() {\n if (this.$listeners['close']) {\n this.showClose = true;\n }\n },\n methods: {\n handleClose() {\n this.$emit('close');\n }\n }\n});\n;// CONCATENATED MODULE: ./src/components/dialog/Index.vue?vue&type=script&lang=js\n /* harmony default export */ var components_dialog_Indexvue_type_script_lang_js = (dialog_Indexvue_type_script_lang_js); \n;// CONCATENATED MODULE: ./node_modules/mini-css-extract-plugin/dist/loader.js??clonedRuleSet-22.use[0]!./node_modules/css-loader/dist/cjs.js??clonedRuleSet-22.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-22.use[2]!./node_modules/sass-loader/dist/cjs.js??clonedRuleSet-22.use[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/dialog/Index.vue?vue&type=style&index=0&id=4148762e&prod&lang=scss&scoped=true\n// extracted by mini-css-extract-plugin\n\n;// CONCATENATED MODULE: ./src/components/dialog/Index.vue?vue&type=style&index=0&id=4148762e&prod&lang=scss&scoped=true\n\n;// CONCATENATED MODULE: ./src/components/dialog/Index.vue\n\n\n\n;\n\n\n/* normalize component */\n\nvar dialog_Index_component = normalizeComponent(\n components_dialog_Indexvue_type_script_lang_js,\n Indexvue_type_template_id_4148762e_scoped_true_render,\n Indexvue_type_template_id_4148762e_scoped_true_staticRenderFns,\n false,\n null,\n \"4148762e\",\n null\n \n)\n\n/* harmony default export */ var dialog_Index = (dialog_Index_component.exports);\n;// CONCATENATED MODULE: ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/card/Index.vue?vue&type=template&id=0c5de06e&scoped=true\nvar Indexvue_type_template_id_0c5de06e_scoped_true_render = function render() {\n var _vm = this,\n _c = _vm._self._c;\n return _c('el-card', {\n staticStyle: {\n \"height\": \"calc(100% - 2px)\",\n \"overflow\": \"auto\"\n },\n attrs: {\n \"shadow\": _vm.shadow\n }\n }, [_c('div', {\n staticClass: \"clearfix\",\n attrs: {\n \"slot\": \"header\"\n },\n slot: \"header\"\n }, [_c('div', {\n staticStyle: {\n \"font-size\": \"16px\"\n }\n }, [_vm.$slots['card-title'] ? [_vm._t(\"card-title\")] : [_vm._v(\" \" + _vm._s(_vm.title) + \" \")]], 2), _c('div', {\n staticStyle: {\n \"flex\": \"1\",\n \"position\": \"relative\"\n }\n }, [_c('div', {\n staticStyle: {\n \"position\": \"absolute\",\n \"right\": \"0px\",\n \"top\": \"-14px\",\n \"width\": \"100%\",\n \"text-align\": \"right\"\n }\n }, [_vm._t(\"card-tools\")], 2)])]), _vm._t(\"default\")], 2);\n};\nvar Indexvue_type_template_id_0c5de06e_scoped_true_staticRenderFns = [];\n\n;// CONCATENATED MODULE: ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/card/Index.vue?vue&type=script&lang=js\n/* harmony default export */ var card_Indexvue_type_script_lang_js = ({\n name: 'Card',\n props: {\n title: {\n type: String,\n default: ''\n },\n shadow: {\n type: String,\n default: ''\n }\n }\n});\n;// CONCATENATED MODULE: ./src/components/card/Index.vue?vue&type=script&lang=js\n /* harmony default export */ var components_card_Indexvue_type_script_lang_js = (card_Indexvue_type_script_lang_js); \n;// CONCATENATED MODULE: ./node_modules/mini-css-extract-plugin/dist/loader.js??clonedRuleSet-22.use[0]!./node_modules/css-loader/dist/cjs.js??clonedRuleSet-22.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-22.use[2]!./node_modules/sass-loader/dist/cjs.js??clonedRuleSet-22.use[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/card/Index.vue?vue&type=style&index=0&id=0c5de06e&prod&lang=scss&scoped=true\n// extracted by mini-css-extract-plugin\n\n;// CONCATENATED MODULE: ./src/components/card/Index.vue?vue&type=style&index=0&id=0c5de06e&prod&lang=scss&scoped=true\n\n;// CONCATENATED MODULE: ./src/components/card/Index.vue\n\n\n\n;\n\n\n/* normalize component */\n\nvar card_Index_component = normalizeComponent(\n components_card_Indexvue_type_script_lang_js,\n Indexvue_type_template_id_0c5de06e_scoped_true_render,\n Indexvue_type_template_id_0c5de06e_scoped_true_staticRenderFns,\n false,\n null,\n \"0c5de06e\",\n null\n \n)\n\n/* harmony default export */ var card_Index = (card_Index_component.exports);\n;// CONCATENATED MODULE: ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/tree/Index.vue?vue&type=template&id=5e81e05e&scoped=true\nvar Indexvue_type_template_id_5e81e05e_scoped_true_render = function render() {\n var _vm = this,\n _c = _vm._self._c;\n return _vm.show ? _c('div', [_vm.data.length > 0 ? _vm._l(_vm.data, function (item) {\n return _c('auth-tree', {\n key: item.id,\n attrs: {\n \"data\": item,\n \"props\": _vm.props\n },\n on: {\n \"on-node-expand\": data => _vm.onExpand(data),\n \"on-node-checked\": data => _vm.onChecked(data)\n }\n });\n }) : _vm._e()], 2) : _vm._e();\n};\nvar Indexvue_type_template_id_5e81e05e_scoped_true_staticRenderFns = [];\n\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.array.push.js\nvar es_array_push = __webpack_require__(4114);\n;// CONCATENATED MODULE: ./src/components/tree/tree.js\n\n// 是否有子节点\nconst hasChildren = data => {\n return Array.isArray(data.children) && data.children.length > 0;\n};\n\n// 创建节点\nconst renderLabel = (h, data, context) => {\n const {\n props,\n listeners\n } = context;\n const clickHandler = listeners['on-node-expand'];\n const checkedHandler = listeners['on-node-checked'];\n const label = data[props.props.label];\n const childNodes = [];\n childNodes.push(label);\n const icoClass = [];\n if (hasChildren(data)) {\n if (data.expand) {\n icoClass.push('icon-icon-dwon');\n } else {\n icoClass.push('icon-icon_right');\n }\n }\n return h('li', {}, [h('i', {\n domProps: {\n className: `iconfont ${icoClass.join(' ')}`\n },\n style: {\n marginLeft: `${14 * data._leve}px`,\n fontSize: '12px',\n transform: 'translateY(-2px)',\n color: '#666'\n },\n on: {\n click: () => {\n clickHandler(data);\n }\n }\n }, ''), h('i', {\n domProps: {\n className: data.checked ? 'iconfont icon-fangxingxuanzhongfil' : 'iconfont icon-fangxingweixuanzhong'\n },\n style: {\n color: '#666'\n },\n on: {\n click: () => {\n checkedHandler(data);\n }\n }\n }, ''), h('span', {}, childNodes)]);\n};\n\n// 创建 node 子节点\nconst renderChildren = (h, list, expand, context) => {\n if (Array.isArray(list) && list.length) {\n const children = list.map(item => {\n return renderNode(h, item, context);\n });\n let cls = ['tree-node-children'];\n if (!expand) {\n cls.push('expand');\n }\n return h('div', {\n domProps: {\n className: cls.join(' ')\n }\n }, children);\n }\n return '';\n};\nconst renderNode = (h, data, context) => {\n const childNodes = [];\n childNodes.push(renderLabel(h, data, context));\n const children = data.children;\n if (hasChildren(data)) {\n childNodes.push(renderChildren(h, children, data.expand, context));\n }\n return h('ul', {\n domProps: {\n className: 'node'\n }\n }, childNodes);\n};\nconst tree_render = (h, context) => {\n const {\n props\n } = context;\n return renderNode(h, props.data, context);\n};\n/* harmony default export */ var tree = (tree_render);\n;// CONCATENATED MODULE: ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/tree/Index.vue?vue&type=script&lang=js\n\n\n/* harmony default export */ var tree_Indexvue_type_script_lang_js = ({\n name: 'Tree',\n components: {\n AuthTree: {\n render: tree,\n functional: true\n }\n },\n props: {\n data: {\n type: Array,\n default: () => {\n return [];\n }\n },\n props: {\n type: Object,\n default: () => {\n return {\n label: 'name'\n };\n }\n }\n },\n data() {\n return {\n name: 1,\n show: false,\n list: [],\n checked: false\n };\n },\n methods: {\n init(data, leve) {\n data._leve = leve;\n if (data.children && data.children.length > 0) {\n leve++;\n for (const i in data.children) {\n this.init(data.children[i], leve);\n }\n }\n },\n // 刷新\n refresh() {\n this.show = false;\n this.$nextTick(() => {\n this.show = true;\n });\n },\n // 展开/隐藏\n onExpand(data) {\n data.expand = !data.expand;\n this.refresh();\n },\n // 选中/取消选中\n onChecked(data) {\n data.checked = !data.checked;\n this.toolerChecked(this.data, data);\n this.setParentChecked(this.data);\n this.refresh();\n },\n toolerChecked(list, node) {\n for (const i in list) {\n if (list[i].id === node.id) {\n this.setChildChecked(list[i].children, list[i].checked);\n } else {\n this.toolerChecked(list[i].children, node);\n }\n }\n },\n // 选中节点时,设置子节点全选\n setChildChecked(children, checked) {\n for (const i in children) {\n children[i].checked = checked;\n this.setChildChecked(children[i].children, checked);\n }\n },\n // 设置父节点选中\n setParentChecked(data) {\n for (const i in data) {\n this.checked = false;\n if (data[i].children && data[i].children.length > 0) {\n this.childIsChecked(data[i].children);\n if (this.checked) {\n data[i].checked = this.checked;\n }\n this.setParentChecked(data[i].children);\n }\n }\n this.refresh();\n },\n // 判断节点的子节点是否有选中\n childIsChecked(children) {\n for (const i in children) {\n if (children[i].checked) {\n this.checked = true;\n } else {\n this.childIsChecked(children[i].children);\n }\n }\n },\n // 设置默认选中\n setDefaultChecked(defaultIds) {\n for (const i in defaultIds) {\n this.setChecked(this.data, defaultIds[i]);\n }\n this.setParentChecked(this.data);\n },\n // 根据所给的id,设置改项选中\n setChecked(data, id) {\n for (const i in data) {\n if (data[i].id === id) {\n data[i].checked = true;\n break;\n } else {\n if (data[i].children && data[i].children.length > 0) {\n this.setChecked(data[i].children, id);\n }\n }\n }\n },\n // 获取选中选的key\n getCheckedKeys() {\n const keys = [];\n this._getCheckedKeys(this.data, keys);\n return keys;\n },\n // 遍历出选中选的key\n _getCheckedKeys(data, keys) {\n for (const i in data) {\n if (data[i].checked) {\n keys.push(data[i].id);\n }\n if (data[i].children && data[i].children.length > 0) {\n this._getCheckedKeys(data[i].children, keys);\n }\n }\n },\n // 获取选中选的节点\n getCheckedNodes() {\n const nodes = [];\n this._getCheckedNodes(this.data, nodes);\n return nodes;\n },\n // 遍历出选中选的节点\n _getCheckedNodes(data, nodes) {\n for (const i in data) {\n if (data[i].checked) {\n nodes.push(data[i]);\n }\n if (data[i].children && data[i].children.length > 0) {\n this._getCheckedNodes(data[i].children, nodes);\n }\n }\n }\n },\n watch: {\n data: {\n handler() {\n for (const i in this.data) {\n this.init(this.data[i], 0);\n }\n this.refresh();\n },\n immediate: true,\n deep: true\n }\n }\n});\n;// CONCATENATED MODULE: ./src/components/tree/Index.vue?vue&type=script&lang=js\n /* harmony default export */ var components_tree_Indexvue_type_script_lang_js = (tree_Indexvue_type_script_lang_js); \n;// CONCATENATED MODULE: ./node_modules/mini-css-extract-plugin/dist/loader.js??clonedRuleSet-22.use[0]!./node_modules/css-loader/dist/cjs.js??clonedRuleSet-22.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-22.use[2]!./node_modules/sass-loader/dist/cjs.js??clonedRuleSet-22.use[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/tree/Index.vue?vue&type=style&index=0&id=5e81e05e&prod&lang=scss&scoped=true\n// extracted by mini-css-extract-plugin\n\n;// CONCATENATED MODULE: ./src/components/tree/Index.vue?vue&type=style&index=0&id=5e81e05e&prod&lang=scss&scoped=true\n\n;// CONCATENATED MODULE: ./src/components/tree/Index.vue\n\n\n\n;\n\n\n/* normalize component */\n\nvar tree_Index_component = normalizeComponent(\n components_tree_Indexvue_type_script_lang_js,\n Indexvue_type_template_id_5e81e05e_scoped_true_render,\n Indexvue_type_template_id_5e81e05e_scoped_true_staticRenderFns,\n false,\n null,\n \"5e81e05e\",\n null\n \n)\n\n/* harmony default export */ var tree_Index = (tree_Index_component.exports);\n;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/checkPrivateRedeclaration.js\nfunction _checkPrivateRedeclaration(obj, privateCollection) {\n if (privateCollection.has(obj)) {\n throw new TypeError(\"Cannot initialize the same private elements twice on an object\");\n }\n}\n;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/classPrivateFieldInitSpec.js\n\nfunction _classPrivateFieldInitSpec(obj, privateMap, value) {\n _checkPrivateRedeclaration(obj, privateMap);\n privateMap.set(obj, value);\n}\n;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/assertClassBrand.js\nfunction _assertClassBrand(e, t, n) {\n if (\"function\" == typeof e ? e === t : e.has(t)) return arguments.length < 3 ? t : n;\n throw new TypeError(\"Private element is not present on this object\");\n}\n;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/classPrivateFieldSet2.js\n\nfunction _classPrivateFieldSet2(s, a, r) {\n return s.set(_assertClassBrand(s, a), r), r;\n}\n;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/classPrivateFieldGet2.js\n\nfunction _classPrivateFieldGet2(s, a) {\n return s.get(_assertClassBrand(s, a));\n}\n// EXTERNAL MODULE: ./node_modules/core-js/modules/web.url-search-params.delete.js\nvar web_url_search_params_delete = __webpack_require__(4603);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/web.url-search-params.has.js\nvar web_url_search_params_has = __webpack_require__(7566);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/web.url-search-params.size.js\nvar web_url_search_params_size = __webpack_require__(8721);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.typed-array.to-reversed.js\nvar es_typed_array_to_reversed = __webpack_require__(7467);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.typed-array.to-sorted.js\nvar es_typed_array_to_sorted = __webpack_require__(4732);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.typed-array.with.js\nvar es_typed_array_with = __webpack_require__(9577);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/esnext.array-buffer.detached.js\nvar esnext_array_buffer_detached = __webpack_require__(6280);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/esnext.array-buffer.transfer.js\nvar esnext_array_buffer_transfer = __webpack_require__(7913);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/esnext.array-buffer.transfer-to-fixed-length.js\nvar esnext_array_buffer_transfer_to_fixed_length = __webpack_require__(7801);\n;// CONCATENATED MODULE: ./node_modules/axios/lib/helpers/bind.js\n\n\nfunction bind(fn, thisArg) {\n return function wrap() {\n return fn.apply(thisArg, arguments);\n };\n}\n;// CONCATENATED MODULE: ./node_modules/axios/lib/utils.js\n\n\n\n\n\n\n\n\n\n\n\n// utils is a library of generic helper functions non-specific to axios\n\nconst {\n toString: utils_toString\n} = Object.prototype;\nconst {\n getPrototypeOf\n} = Object;\nconst kindOf = (cache => thing => {\n const str = utils_toString.call(thing);\n return cache[str] || (cache[str] = str.slice(8, -1).toLowerCase());\n})(Object.create(null));\nconst kindOfTest = type => {\n type = type.toLowerCase();\n return thing => kindOf(thing) === type;\n};\nconst typeOfTest = type => thing => typeof thing === type;\n\n/**\n * Determine if a value is an Array\n *\n * @param {Object} val The value to test\n *\n * @returns {boolean} True if value is an Array, otherwise false\n */\nconst {\n isArray\n} = Array;\n\n/**\n * Determine if a value is undefined\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if the value is undefined, otherwise false\n */\nconst isUndefined = typeOfTest('undefined');\n\n/**\n * Determine if a value is a Buffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Buffer, otherwise false\n */\nfunction isBuffer(val) {\n return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor) && isFunction(val.constructor.isBuffer) && val.constructor.isBuffer(val);\n}\n\n/**\n * Determine if a value is an ArrayBuffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is an ArrayBuffer, otherwise false\n */\nconst isArrayBuffer = kindOfTest('ArrayBuffer');\n\n/**\n * Determine if a value is a view on an ArrayBuffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false\n */\nfunction isArrayBufferView(val) {\n let result;\n if (typeof ArrayBuffer !== 'undefined' && ArrayBuffer.isView) {\n result = ArrayBuffer.isView(val);\n } else {\n result = val && val.buffer && isArrayBuffer(val.buffer);\n }\n return result;\n}\n\n/**\n * Determine if a value is a String\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a String, otherwise false\n */\nconst isString = typeOfTest('string');\n\n/**\n * Determine if a value is a Function\n *\n * @param {*} val The value to test\n * @returns {boolean} True if value is a Function, otherwise false\n */\nconst isFunction = typeOfTest('function');\n\n/**\n * Determine if a value is a Number\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Number, otherwise false\n */\nconst isNumber = typeOfTest('number');\n\n/**\n * Determine if a value is an Object\n *\n * @param {*} thing The value to test\n *\n * @returns {boolean} True if value is an Object, otherwise false\n */\nconst isObject = thing => thing !== null && typeof thing === 'object';\n\n/**\n * Determine if a value is a Boolean\n *\n * @param {*} thing The value to test\n * @returns {boolean} True if value is a Boolean, otherwise false\n */\nconst isBoolean = thing => thing === true || thing === false;\n\n/**\n * Determine if a value is a plain Object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a plain Object, otherwise false\n */\nconst isPlainObject = val => {\n if (kindOf(val) !== 'object') {\n return false;\n }\n const prototype = getPrototypeOf(val);\n return (prototype === null || prototype === Object.prototype || Object.getPrototypeOf(prototype) === null) && !(Symbol.toStringTag in val) && !(Symbol.iterator in val);\n};\n\n/**\n * Determine if a value is a Date\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Date, otherwise false\n */\nconst isDate = kindOfTest('Date');\n\n/**\n * Determine if a value is a File\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a File, otherwise false\n */\nconst isFile = kindOfTest('File');\n\n/**\n * Determine if a value is a Blob\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Blob, otherwise false\n */\nconst isBlob = kindOfTest('Blob');\n\n/**\n * Determine if a value is a FileList\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a File, otherwise false\n */\nconst isFileList = kindOfTest('FileList');\n\n/**\n * Determine if a value is a Stream\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Stream, otherwise false\n */\nconst isStream = val => isObject(val) && isFunction(val.pipe);\n\n/**\n * Determine if a value is a FormData\n *\n * @param {*} thing The value to test\n *\n * @returns {boolean} True if value is an FormData, otherwise false\n */\nconst isFormData = thing => {\n let kind;\n return thing && (typeof FormData === 'function' && thing instanceof FormData || isFunction(thing.append) && ((kind = kindOf(thing)) === 'formdata' ||\n // detect form-data instance\n kind === 'object' && isFunction(thing.toString) && thing.toString() === '[object FormData]'));\n};\n\n/**\n * Determine if a value is a URLSearchParams object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a URLSearchParams object, otherwise false\n */\nconst isURLSearchParams = kindOfTest('URLSearchParams');\n\n/**\n * Trim excess whitespace off the beginning and end of a string\n *\n * @param {String} str The String to trim\n *\n * @returns {String} The String freed of excess whitespace\n */\nconst trim = str => str.trim ? str.trim() : str.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n\n/**\n * Iterate over an Array or an Object invoking a function for each item.\n *\n * If `obj` is an Array callback will be called passing\n * the value, index, and complete array for each item.\n *\n * If 'obj' is an Object callback will be called passing\n * the value, key, and complete object for each property.\n *\n * @param {Object|Array} obj The object to iterate\n * @param {Function} fn The callback to invoke for each item\n *\n * @param {Boolean} [allOwnKeys = false]\n * @returns {any}\n */\nfunction forEach(obj, fn, {\n allOwnKeys = false\n} = {}) {\n // Don't bother if no value provided\n if (obj === null || typeof obj === 'undefined') {\n return;\n }\n let i;\n let l;\n\n // Force an array if not already something iterable\n if (typeof obj !== 'object') {\n /*eslint no-param-reassign:0*/\n obj = [obj];\n }\n if (isArray(obj)) {\n // Iterate over array values\n for (i = 0, l = obj.length; i < l; i++) {\n fn.call(null, obj[i], i, obj);\n }\n } else {\n // Iterate over object keys\n const keys = allOwnKeys ? Object.getOwnPropertyNames(obj) : Object.keys(obj);\n const len = keys.length;\n let key;\n for (i = 0; i < len; i++) {\n key = keys[i];\n fn.call(null, obj[key], key, obj);\n }\n }\n}\nfunction findKey(obj, key) {\n key = key.toLowerCase();\n const keys = Object.keys(obj);\n let i = keys.length;\n let _key;\n while (i-- > 0) {\n _key = keys[i];\n if (key === _key.toLowerCase()) {\n return _key;\n }\n }\n return null;\n}\nconst _global = (() => {\n /*eslint no-undef:0*/\n if (typeof globalThis !== \"undefined\") return globalThis;\n return typeof self !== \"undefined\" ? self : typeof window !== 'undefined' ? window : global;\n})();\nconst isContextDefined = context => !isUndefined(context) && context !== _global;\n\n/**\n * Accepts varargs expecting each argument to be an object, then\n * immutably merges the properties of each object and returns result.\n *\n * When multiple objects contain the same key the later object in\n * the arguments list will take precedence.\n *\n * Example:\n *\n * ```js\n * var result = merge({foo: 123}, {foo: 456});\n * console.log(result.foo); // outputs 456\n * ```\n *\n * @param {Object} obj1 Object to merge\n *\n * @returns {Object} Result of all merge properties\n */\nfunction merge( /* obj1, obj2, obj3, ... */\n) {\n const {\n caseless\n } = isContextDefined(this) && this || {};\n const result = {};\n const assignValue = (val, key) => {\n const targetKey = caseless && findKey(result, key) || key;\n if (isPlainObject(result[targetKey]) && isPlainObject(val)) {\n result[targetKey] = merge(result[targetKey], val);\n } else if (isPlainObject(val)) {\n result[targetKey] = merge({}, val);\n } else if (isArray(val)) {\n result[targetKey] = val.slice();\n } else {\n result[targetKey] = val;\n }\n };\n for (let i = 0, l = arguments.length; i < l; i++) {\n arguments[i] && forEach(arguments[i], assignValue);\n }\n return result;\n}\n\n/**\n * Extends object a by mutably adding to it the properties of object b.\n *\n * @param {Object} a The object to be extended\n * @param {Object} b The object to copy properties from\n * @param {Object} thisArg The object to bind function to\n *\n * @param {Boolean} [allOwnKeys]\n * @returns {Object} The resulting value of object a\n */\nconst extend = (a, b, thisArg, {\n allOwnKeys\n} = {}) => {\n forEach(b, (val, key) => {\n if (thisArg && isFunction(val)) {\n a[key] = bind(val, thisArg);\n } else {\n a[key] = val;\n }\n }, {\n allOwnKeys\n });\n return a;\n};\n\n/**\n * Remove byte order marker. This catches EF BB BF (the UTF-8 BOM)\n *\n * @param {string} content with BOM\n *\n * @returns {string} content value without BOM\n */\nconst stripBOM = content => {\n if (content.charCodeAt(0) === 0xFEFF) {\n content = content.slice(1);\n }\n return content;\n};\n\n/**\n * Inherit the prototype methods from one constructor into another\n * @param {function} constructor\n * @param {function} superConstructor\n * @param {object} [props]\n * @param {object} [descriptors]\n *\n * @returns {void}\n */\nconst inherits = (constructor, superConstructor, props, descriptors) => {\n constructor.prototype = Object.create(superConstructor.prototype, descriptors);\n constructor.prototype.constructor = constructor;\n Object.defineProperty(constructor, 'super', {\n value: superConstructor.prototype\n });\n props && Object.assign(constructor.prototype, props);\n};\n\n/**\n * Resolve object with deep prototype chain to a flat object\n * @param {Object} sourceObj source object\n * @param {Object} [destObj]\n * @param {Function|Boolean} [filter]\n * @param {Function} [propFilter]\n *\n * @returns {Object}\n */\nconst toFlatObject = (sourceObj, destObj, filter, propFilter) => {\n let props;\n let i;\n let prop;\n const merged = {};\n destObj = destObj || {};\n // eslint-disable-next-line no-eq-null,eqeqeq\n if (sourceObj == null) return destObj;\n do {\n props = Object.getOwnPropertyNames(sourceObj);\n i = props.length;\n while (i-- > 0) {\n prop = props[i];\n if ((!propFilter || propFilter(prop, sourceObj, destObj)) && !merged[prop]) {\n destObj[prop] = sourceObj[prop];\n merged[prop] = true;\n }\n }\n sourceObj = filter !== false && getPrototypeOf(sourceObj);\n } while (sourceObj && (!filter || filter(sourceObj, destObj)) && sourceObj !== Object.prototype);\n return destObj;\n};\n\n/**\n * Determines whether a string ends with the characters of a specified string\n *\n * @param {String} str\n * @param {String} searchString\n * @param {Number} [position= 0]\n *\n * @returns {boolean}\n */\nconst endsWith = (str, searchString, position) => {\n str = String(str);\n if (position === undefined || position > str.length) {\n position = str.length;\n }\n position -= searchString.length;\n const lastIndex = str.indexOf(searchString, position);\n return lastIndex !== -1 && lastIndex === position;\n};\n\n/**\n * Returns new array from array like object or null if failed\n *\n * @param {*} [thing]\n *\n * @returns {?Array}\n */\nconst toArray = thing => {\n if (!thing) return null;\n if (isArray(thing)) return thing;\n let i = thing.length;\n if (!isNumber(i)) return null;\n const arr = new Array(i);\n while (i-- > 0) {\n arr[i] = thing[i];\n }\n return arr;\n};\n\n/**\n * Checking if the Uint8Array exists and if it does, it returns a function that checks if the\n * thing passed in is an instance of Uint8Array\n *\n * @param {TypedArray}\n *\n * @returns {Array}\n */\n// eslint-disable-next-line func-names\nconst isTypedArray = (TypedArray => {\n // eslint-disable-next-line func-names\n return thing => {\n return TypedArray && thing instanceof TypedArray;\n };\n})(typeof Uint8Array !== 'undefined' && getPrototypeOf(Uint8Array));\n\n/**\n * For each entry in the object, call the function with the key and value.\n *\n * @param {Object<any, any>} obj - The object to iterate over.\n * @param {Function} fn - The function to call for each entry.\n *\n * @returns {void}\n */\nconst forEachEntry = (obj, fn) => {\n const generator = obj && obj[Symbol.iterator];\n const iterator = generator.call(obj);\n let result;\n while ((result = iterator.next()) && !result.done) {\n const pair = result.value;\n fn.call(obj, pair[0], pair[1]);\n }\n};\n\n/**\n * It takes a regular expression and a string, and returns an array of all the matches\n *\n * @param {string} regExp - The regular expression to match against.\n * @param {string} str - The string to search.\n *\n * @returns {Array<boolean>}\n */\nconst matchAll = (regExp, str) => {\n let matches;\n const arr = [];\n while ((matches = regExp.exec(str)) !== null) {\n arr.push(matches);\n }\n return arr;\n};\n\n/* Checking if the kindOfTest function returns true when passed an HTMLFormElement. */\nconst isHTMLForm = kindOfTest('HTMLFormElement');\nconst toCamelCase = str => {\n return str.toLowerCase().replace(/[-_\\s]([a-z\\d])(\\w*)/g, function replacer(m, p1, p2) {\n return p1.toUpperCase() + p2;\n });\n};\n\n/* Creating a function that will check if an object has a property. */\nconst utils_hasOwnProperty = (({\n hasOwnProperty\n}) => (obj, prop) => hasOwnProperty.call(obj, prop))(Object.prototype);\n\n/**\n * Determine if a value is a RegExp object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a RegExp object, otherwise false\n */\nconst isRegExp = kindOfTest('RegExp');\nconst reduceDescriptors = (obj, reducer) => {\n const descriptors = Object.getOwnPropertyDescriptors(obj);\n const reducedDescriptors = {};\n forEach(descriptors, (descriptor, name) => {\n let ret;\n if ((ret = reducer(descriptor, name, obj)) !== false) {\n reducedDescriptors[name] = ret || descriptor;\n }\n });\n Object.defineProperties(obj, reducedDescriptors);\n};\n\n/**\n * Makes all methods read-only\n * @param {Object} obj\n */\n\nconst freezeMethods = obj => {\n reduceDescriptors(obj, (descriptor, name) => {\n // skip restricted props in strict mode\n if (isFunction(obj) && ['arguments', 'caller', 'callee'].indexOf(name) !== -1) {\n return false;\n }\n const value = obj[name];\n if (!isFunction(value)) return;\n descriptor.enumerable = false;\n if ('writable' in descriptor) {\n descriptor.writable = false;\n return;\n }\n if (!descriptor.set) {\n descriptor.set = () => {\n throw Error('Can not rewrite read-only method \\'' + name + '\\'');\n };\n }\n });\n};\nconst toObjectSet = (arrayOrString, delimiter) => {\n const obj = {};\n const define = arr => {\n arr.forEach(value => {\n obj[value] = true;\n });\n };\n isArray(arrayOrString) ? define(arrayOrString) : define(String(arrayOrString).split(delimiter));\n return obj;\n};\nconst noop = () => {};\nconst toFiniteNumber = (value, defaultValue) => {\n value = +value;\n return Number.isFinite(value) ? value : defaultValue;\n};\nconst ALPHA = 'abcdefghijklmnopqrstuvwxyz';\nconst DIGIT = '0123456789';\nconst ALPHABET = {\n DIGIT,\n ALPHA,\n ALPHA_DIGIT: ALPHA + ALPHA.toUpperCase() + DIGIT\n};\nconst generateString = (size = 16, alphabet = ALPHABET.ALPHA_DIGIT) => {\n let str = '';\n const {\n length\n } = alphabet;\n while (size--) {\n str += alphabet[Math.random() * length | 0];\n }\n return str;\n};\n\n/**\n * If the thing is a FormData object, return true, otherwise return false.\n *\n * @param {unknown} thing - The thing to check.\n *\n * @returns {boolean}\n */\nfunction isSpecCompliantForm(thing) {\n return !!(thing && isFunction(thing.append) && thing[Symbol.toStringTag] === 'FormData' && thing[Symbol.iterator]);\n}\nconst toJSONObject = obj => {\n const stack = new Array(10);\n const visit = (source, i) => {\n if (isObject(source)) {\n if (stack.indexOf(source) >= 0) {\n return;\n }\n if (!('toJSON' in source)) {\n stack[i] = source;\n const target = isArray(source) ? [] : {};\n forEach(source, (value, key) => {\n const reducedValue = visit(value, i + 1);\n !isUndefined(reducedValue) && (target[key] = reducedValue);\n });\n stack[i] = undefined;\n return target;\n }\n }\n return source;\n };\n return visit(obj, 0);\n};\nconst isAsyncFn = kindOfTest('AsyncFunction');\nconst isThenable = thing => thing && (isObject(thing) || isFunction(thing)) && isFunction(thing.then) && isFunction(thing.catch);\n/* harmony default export */ var utils = ({\n isArray,\n isArrayBuffer,\n isBuffer,\n isFormData,\n isArrayBufferView,\n isString,\n isNumber,\n isBoolean,\n isObject,\n isPlainObject,\n isUndefined,\n isDate,\n isFile,\n isBlob,\n isRegExp,\n isFunction,\n isStream,\n isURLSearchParams,\n isTypedArray,\n isFileList,\n forEach,\n merge,\n extend,\n trim,\n stripBOM,\n inherits,\n toFlatObject,\n kindOf,\n kindOfTest,\n endsWith,\n toArray,\n forEachEntry,\n matchAll,\n isHTMLForm,\n hasOwnProperty: utils_hasOwnProperty,\n hasOwnProp: utils_hasOwnProperty,\n // an alias to avoid ESLint no-prototype-builtins detection\n reduceDescriptors,\n freezeMethods,\n toObjectSet,\n toCamelCase,\n noop,\n toFiniteNumber,\n findKey,\n global: _global,\n isContextDefined,\n ALPHABET,\n generateString,\n isSpecCompliantForm,\n toJSONObject,\n isAsyncFn,\n isThenable\n});\n;// CONCATENATED MODULE: ./node_modules/axios/lib/core/AxiosError.js\n\n\n\n\n/**\n * Create an Error with the specified message, config, error code, request and response.\n *\n * @param {string} message The error message.\n * @param {string} [code] The error code (for example, 'ECONNABORTED').\n * @param {Object} [config] The config.\n * @param {Object} [request] The request.\n * @param {Object} [response] The response.\n *\n * @returns {Error} The created error.\n */\nfunction AxiosError(message, code, config, request, response) {\n Error.call(this);\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n } else {\n this.stack = new Error().stack;\n }\n this.message = message;\n this.name = 'AxiosError';\n code && (this.code = code);\n config && (this.config = config);\n request && (this.request = request);\n response && (this.response = response);\n}\nutils.inherits(AxiosError, Error, {\n toJSON: function toJSON() {\n return {\n // Standard\n message: this.message,\n name: this.name,\n // Microsoft\n description: this.description,\n number: this.number,\n // Mozilla\n fileName: this.fileName,\n lineNumber: this.lineNumber,\n columnNumber: this.columnNumber,\n stack: this.stack,\n // Axios\n config: utils.toJSONObject(this.config),\n code: this.code,\n status: this.response && this.response.status ? this.response.status : null\n };\n }\n});\nconst AxiosError_prototype = AxiosError.prototype;\nconst descriptors = {};\n['ERR_BAD_OPTION_VALUE', 'ERR_BAD_OPTION', 'ECONNABORTED', 'ETIMEDOUT', 'ERR_NETWORK', 'ERR_FR_TOO_MANY_REDIRECTS', 'ERR_DEPRECATED', 'ERR_BAD_RESPONSE', 'ERR_BAD_REQUEST', 'ERR_CANCELED', 'ERR_NOT_SUPPORT', 'ERR_INVALID_URL'\n// eslint-disable-next-line func-names\n].forEach(code => {\n descriptors[code] = {\n value: code\n };\n});\nObject.defineProperties(AxiosError, descriptors);\nObject.defineProperty(AxiosError_prototype, 'isAxiosError', {\n value: true\n});\n\n// eslint-disable-next-line func-names\nAxiosError.from = (error, code, config, request, response, customProps) => {\n const axiosError = Object.create(AxiosError_prototype);\n utils.toFlatObject(error, axiosError, function filter(obj) {\n return obj !== Error.prototype;\n }, prop => {\n return prop !== 'isAxiosError';\n });\n AxiosError.call(axiosError, error.message, code, config, request, response);\n axiosError.cause = error;\n axiosError.name = error.name;\n customProps && Object.assign(axiosError, customProps);\n return axiosError;\n};\n/* harmony default export */ var core_AxiosError = (AxiosError);\n;// CONCATENATED MODULE: ./node_modules/axios/lib/helpers/null.js\n// eslint-disable-next-line strict\n/* harmony default export */ var helpers_null = (null);\n;// CONCATENATED MODULE: ./node_modules/axios/lib/helpers/toFormData.js\n\n\n\n\n\n// temporary hotfix to avoid circular references until AxiosURLSearchParams is refactored\n\n\n/**\n * Determines if the given thing is a array or js object.\n *\n * @param {string} thing - The object or array to be visited.\n *\n * @returns {boolean}\n */\nfunction isVisitable(thing) {\n return utils.isPlainObject(thing) || utils.isArray(thing);\n}\n\n/**\n * It removes the brackets from the end of a string\n *\n * @param {string} key - The key of the parameter.\n *\n * @returns {string} the key without the brackets.\n */\nfunction removeBrackets(key) {\n return utils.endsWith(key, '[]') ? key.slice(0, -2) : key;\n}\n\n/**\n * It takes a path, a key, and a boolean, and returns a string\n *\n * @param {string} path - The path to the current key.\n * @param {string} key - The key of the current object being iterated over.\n * @param {string} dots - If true, the key will be rendered with dots instead of brackets.\n *\n * @returns {string} The path to the current key.\n */\nfunction renderKey(path, key, dots) {\n if (!path) return key;\n return path.concat(key).map(function each(token, i) {\n // eslint-disable-next-line no-param-reassign\n token = removeBrackets(token);\n return !dots && i ? '[' + token + ']' : token;\n }).join(dots ? '.' : '');\n}\n\n/**\n * If the array is an array and none of its elements are visitable, then it's a flat array.\n *\n * @param {Array<any>} arr - The array to check\n *\n * @returns {boolean}\n */\nfunction isFlatArray(arr) {\n return utils.isArray(arr) && !arr.some(isVisitable);\n}\nconst predicates = utils.toFlatObject(utils, {}, null, function filter(prop) {\n return /^is[A-Z]/.test(prop);\n});\n\n/**\n * Convert a data object to FormData\n *\n * @param {Object} obj\n * @param {?Object} [formData]\n * @param {?Object} [options]\n * @param {Function} [options.visitor]\n * @param {Boolean} [options.metaTokens = true]\n * @param {Boolean} [options.dots = false]\n * @param {?Boolean} [options.indexes = false]\n *\n * @returns {Object}\n **/\n\n/**\n * It converts an object into a FormData object\n *\n * @param {Object<any, any>} obj - The object to convert to form data.\n * @param {string} formData - The FormData object to append to.\n * @param {Object<string, any>} options\n *\n * @returns\n */\nfunction toFormData(obj, formData, options) {\n if (!utils.isObject(obj)) {\n throw new TypeError('target must be an object');\n }\n\n // eslint-disable-next-line no-param-reassign\n formData = formData || new (helpers_null || FormData)();\n\n // eslint-disable-next-line no-param-reassign\n options = utils.toFlatObject(options, {\n metaTokens: true,\n dots: false,\n indexes: false\n }, false, function defined(option, source) {\n // eslint-disable-next-line no-eq-null,eqeqeq\n return !utils.isUndefined(source[option]);\n });\n const metaTokens = options.metaTokens;\n // eslint-disable-next-line no-use-before-define\n const visitor = options.visitor || defaultVisitor;\n const dots = options.dots;\n const indexes = options.indexes;\n const _Blob = options.Blob || typeof Blob !== 'undefined' && Blob;\n const useBlob = _Blob && utils.isSpecCompliantForm(formData);\n if (!utils.isFunction(visitor)) {\n throw new TypeError('visitor must be a function');\n }\n function convertValue(value) {\n if (value === null) return '';\n if (utils.isDate(value)) {\n return value.toISOString();\n }\n if (!useBlob && utils.isBlob(value)) {\n throw new core_AxiosError('Blob is not supported. Use a Buffer instead.');\n }\n if (utils.isArrayBuffer(value) || utils.isTypedArray(value)) {\n return useBlob && typeof Blob === 'function' ? new Blob([value]) : Buffer.from(value);\n }\n return value;\n }\n\n /**\n * Default visitor.\n *\n * @param {*} value\n * @param {String|Number} key\n * @param {Array<String|Number>} path\n * @this {FormData}\n *\n * @returns {boolean} return true to visit the each prop of the value recursively\n */\n function defaultVisitor(value, key, path) {\n let arr = value;\n if (value && !path && typeof value === 'object') {\n if (utils.endsWith(key, '{}')) {\n // eslint-disable-next-line no-param-reassign\n key = metaTokens ? key : key.slice(0, -2);\n // eslint-disable-next-line no-param-reassign\n value = JSON.stringify(value);\n } else if (utils.isArray(value) && isFlatArray(value) || (utils.isFileList(value) || utils.endsWith(key, '[]')) && (arr = utils.toArray(value))) {\n // eslint-disable-next-line no-param-reassign\n key = removeBrackets(key);\n arr.forEach(function each(el, index) {\n !(utils.isUndefined(el) || el === null) && formData.append(\n // eslint-disable-next-line no-nested-ternary\n indexes === true ? renderKey([key], index, dots) : indexes === null ? key : key + '[]', convertValue(el));\n });\n return false;\n }\n }\n if (isVisitable(value)) {\n return true;\n }\n formData.append(renderKey(path, key, dots), convertValue(value));\n return false;\n }\n const stack = [];\n const exposedHelpers = Object.assign(predicates, {\n defaultVisitor,\n convertValue,\n isVisitable\n });\n function build(value, path) {\n if (utils.isUndefined(value)) return;\n if (stack.indexOf(value) !== -1) {\n throw Error('Circular reference detected in ' + path.join('.'));\n }\n stack.push(value);\n utils.forEach(value, function each(el, key) {\n const result = !(utils.isUndefined(el) || el === null) && visitor.call(formData, el, utils.isString(key) ? key.trim() : key, path, exposedHelpers);\n if (result === true) {\n build(el, path ? path.concat(key) : [key]);\n }\n });\n stack.pop();\n }\n if (!utils.isObject(obj)) {\n throw new TypeError('data must be an object');\n }\n build(obj);\n return formData;\n}\n/* harmony default export */ var helpers_toFormData = (toFormData);\n;// CONCATENATED MODULE: ./node_modules/axios/lib/helpers/AxiosURLSearchParams.js\n\n\n\n\n\n/**\n * It encodes a string by replacing all characters that are not in the unreserved set with\n * their percent-encoded equivalents\n *\n * @param {string} str - The string to encode.\n *\n * @returns {string} The encoded string.\n */\nfunction encode(str) {\n const charMap = {\n '!': '%21',\n \"'\": '%27',\n '(': '%28',\n ')': '%29',\n '~': '%7E',\n '%20': '+',\n '%00': '\\x00'\n };\n return encodeURIComponent(str).replace(/[!'()~]|%20|%00/g, function replacer(match) {\n return charMap[match];\n });\n}\n\n/**\n * It takes a params object and converts it to a FormData object\n *\n * @param {Object<string, any>} params - The parameters to be converted to a FormData object.\n * @param {Object<string, any>} options - The options object passed to the Axios constructor.\n *\n * @returns {void}\n */\nfunction AxiosURLSearchParams(params, options) {\n this._pairs = [];\n params && helpers_toFormData(params, this, options);\n}\nconst AxiosURLSearchParams_prototype = AxiosURLSearchParams.prototype;\nAxiosURLSearchParams_prototype.append = function append(name, value) {\n this._pairs.push([name, value]);\n};\nAxiosURLSearchParams_prototype.toString = function toString(encoder) {\n const _encode = encoder ? function (value) {\n return encoder.call(this, value, encode);\n } : encode;\n return this._pairs.map(function each(pair) {\n return _encode(pair[0]) + '=' + _encode(pair[1]);\n }, '').join('&');\n};\n/* harmony default export */ var helpers_AxiosURLSearchParams = (AxiosURLSearchParams);\n;// CONCATENATED MODULE: ./node_modules/axios/lib/helpers/buildURL.js\n\n\n\n\n\n/**\n * It replaces all instances of the characters `:`, `$`, `,`, `+`, `[`, and `]` with their\n * URI encoded counterparts\n *\n * @param {string} val The value to be encoded.\n *\n * @returns {string} The encoded value.\n */\nfunction buildURL_encode(val) {\n return encodeURIComponent(val).replace(/%3A/gi, ':').replace(/%24/g, '$').replace(/%2C/gi, ',').replace(/%20/g, '+').replace(/%5B/gi, '[').replace(/%5D/gi, ']');\n}\n\n/**\n * Build a URL by appending params to the end\n *\n * @param {string} url The base of the url (e.g., http://www.google.com)\n * @param {object} [params] The params to be appended\n * @param {?object} options\n *\n * @returns {string} The formatted url\n */\nfunction buildURL(url, params, options) {\n /*eslint no-param-reassign:0*/\n if (!params) {\n return url;\n }\n const _encode = options && options.encode || buildURL_encode;\n const serializeFn = options && options.serialize;\n let serializedParams;\n if (serializeFn) {\n serializedParams = serializeFn(params, options);\n } else {\n serializedParams = utils.isURLSearchParams(params) ? params.toString() : new helpers_AxiosURLSearchParams(params, options).toString(_encode);\n }\n if (serializedParams) {\n const hashmarkIndex = url.indexOf(\"#\");\n if (hashmarkIndex !== -1) {\n url = url.slice(0, hashmarkIndex);\n }\n url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams;\n }\n return url;\n}\n;// CONCATENATED MODULE: ./node_modules/axios/lib/core/InterceptorManager.js\n\n\n\n\nclass InterceptorManager {\n constructor() {\n this.handlers = [];\n }\n\n /**\n * Add a new interceptor to the stack\n *\n * @param {Function} fulfilled The function to handle `then` for a `Promise`\n * @param {Function} rejected The function to handle `reject` for a `Promise`\n *\n * @return {Number} An ID used to remove interceptor later\n */\n use(fulfilled, rejected, options) {\n this.handlers.push({\n fulfilled,\n rejected,\n synchronous: options ? options.synchronous : false,\n runWhen: options ? options.runWhen : null\n });\n return this.handlers.length - 1;\n }\n\n /**\n * Remove an interceptor from the stack\n *\n * @param {Number} id The ID that was returned by `use`\n *\n * @returns {Boolean} `true` if the interceptor was removed, `false` otherwise\n */\n eject(id) {\n if (this.handlers[id]) {\n this.handlers[id] = null;\n }\n }\n\n /**\n * Clear all interceptors from the stack\n *\n * @returns {void}\n */\n clear() {\n if (this.handlers) {\n this.handlers = [];\n }\n }\n\n /**\n * Iterate over all the registered interceptors\n *\n * This method is particularly useful for skipping over any\n * interceptors that may have become `null` calling `eject`.\n *\n * @param {Function} fn The function to call for each interceptor\n *\n * @returns {void}\n */\n forEach(fn) {\n utils.forEach(this.handlers, function forEachHandler(h) {\n if (h !== null) {\n fn(h);\n }\n });\n }\n}\n/* harmony default export */ var core_InterceptorManager = (InterceptorManager);\n;// CONCATENATED MODULE: ./node_modules/axios/lib/defaults/transitional.js\n\n\n/* harmony default export */ var defaults_transitional = ({\n silentJSONParsing: true,\n forcedJSONParsing: true,\n clarifyTimeoutError: false\n});\n;// CONCATENATED MODULE: ./node_modules/axios/lib/platform/browser/classes/URLSearchParams.js\n\n\n\n\n\n\n/* harmony default export */ var classes_URLSearchParams = (typeof URLSearchParams !== 'undefined' ? URLSearchParams : helpers_AxiosURLSearchParams);\n;// CONCATENATED MODULE: ./node_modules/axios/lib/platform/browser/classes/FormData.js\n\n\n/* harmony default export */ var classes_FormData = (typeof FormData !== 'undefined' ? FormData : null);\n;// CONCATENATED MODULE: ./node_modules/axios/lib/platform/browser/classes/Blob.js\n\n\n/* harmony default export */ var classes_Blob = (typeof Blob !== 'undefined' ? Blob : null);\n;// CONCATENATED MODULE: ./node_modules/axios/lib/platform/browser/index.js\n\n\n\n/* harmony default export */ var browser = ({\n isBrowser: true,\n classes: {\n URLSearchParams: classes_URLSearchParams,\n FormData: classes_FormData,\n Blob: classes_Blob\n },\n protocols: ['http', 'https', 'file', 'blob', 'url', 'data']\n});\n;// CONCATENATED MODULE: ./node_modules/axios/lib/platform/common/utils.js\nconst hasBrowserEnv = typeof window !== 'undefined' && typeof document !== 'undefined';\n\n/**\n * Determine if we're running in a standard browser environment\n *\n * This allows axios to run in a web worker, and react-native.\n * Both environments support XMLHttpRequest, but not fully standard globals.\n *\n * web workers:\n * typeof window -> undefined\n * typeof document -> undefined\n *\n * react-native:\n * navigator.product -> 'ReactNative'\n * nativescript\n * navigator.product -> 'NativeScript' or 'NS'\n *\n * @returns {boolean}\n */\nconst hasStandardBrowserEnv = (product => {\n return hasBrowserEnv && ['ReactNative', 'NativeScript', 'NS'].indexOf(product) < 0;\n})(typeof navigator !== 'undefined' && navigator.product);\n\n/**\n * Determine if we're running in a standard browser webWorker environment\n *\n * Although the `isStandardBrowserEnv` method indicates that\n * `allows axios to run in a web worker`, the WebWorker will still be\n * filtered out due to its judgment standard\n * `typeof window !== 'undefined' && typeof document !== 'undefined'`.\n * This leads to a problem when axios post `FormData` in webWorker\n */\nconst hasStandardBrowserWebWorkerEnv = (() => {\n return typeof WorkerGlobalScope !== 'undefined' &&\n // eslint-disable-next-line no-undef\n self instanceof WorkerGlobalScope && typeof self.importScripts === 'function';\n})();\n\n;// CONCATENATED MODULE: ./node_modules/axios/lib/platform/index.js\n\n\n/* harmony default export */ var platform = ({\n ...common_utils_namespaceObject,\n ...browser\n});\n;// CONCATENATED MODULE: ./node_modules/axios/lib/helpers/toURLEncodedForm.js\n\n\n\n\n\nfunction toURLEncodedForm(data, options) {\n return helpers_toFormData(data, new platform.classes.URLSearchParams(), Object.assign({\n visitor: function (value, key, path, helpers) {\n if (platform.isNode && utils.isBuffer(value)) {\n this.append(key, value.toString('base64'));\n return false;\n }\n return helpers.defaultVisitor.apply(this, arguments);\n }\n }, options));\n}\n;// CONCATENATED MODULE: ./node_modules/axios/lib/helpers/formDataToJSON.js\n\n\n\n\n/**\n * It takes a string like `foo[x][y][z]` and returns an array like `['foo', 'x', 'y', 'z']\n *\n * @param {string} name - The name of the property to get.\n *\n * @returns An array of strings.\n */\nfunction parsePropPath(name) {\n // foo[x][y][z]\n // foo.x.y.z\n // foo-x-y-z\n // foo x y z\n return utils.matchAll(/\\w+|\\[(\\w*)]/g, name).map(match => {\n return match[0] === '[]' ? '' : match[1] || match[0];\n });\n}\n\n/**\n * Convert an array to an object.\n *\n * @param {Array<any>} arr - The array to convert to an object.\n *\n * @returns An object with the same keys and values as the array.\n */\nfunction arrayToObject(arr) {\n const obj = {};\n const keys = Object.keys(arr);\n let i;\n const len = keys.length;\n let key;\n for (i = 0; i < len; i++) {\n key = keys[i];\n obj[key] = arr[key];\n }\n return obj;\n}\n\n/**\n * It takes a FormData object and returns a JavaScript object\n *\n * @param {string} formData The FormData object to convert to JSON.\n *\n * @returns {Object<string, any> | null} The converted object.\n */\nfunction formDataToJSON(formData) {\n function buildPath(path, value, target, index) {\n let name = path[index++];\n if (name === '__proto__') return true;\n const isNumericKey = Number.isFinite(+name);\n const isLast = index >= path.length;\n name = !name && utils.isArray(target) ? target.length : name;\n if (isLast) {\n if (utils.hasOwnProp(target, name)) {\n target[name] = [target[name], value];\n } else {\n target[name] = value;\n }\n return !isNumericKey;\n }\n if (!target[name] || !utils.isObject(target[name])) {\n target[name] = [];\n }\n const result = buildPath(path, value, target[name], index);\n if (result && utils.isArray(target[name])) {\n target[name] = arrayToObject(target[name]);\n }\n return !isNumericKey;\n }\n if (utils.isFormData(formData) && utils.isFunction(formData.entries)) {\n const obj = {};\n utils.forEachEntry(formData, (name, value) => {\n buildPath(parsePropPath(name), value, obj, 0);\n });\n return obj;\n }\n return null;\n}\n/* harmony default export */ var helpers_formDataToJSON = (formDataToJSON);\n;// CONCATENATED MODULE: ./node_modules/axios/lib/defaults/index.js\n\n\n\n\n\n\n\n\n\n\n/**\n * It takes a string, tries to parse it, and if it fails, it returns the stringified version\n * of the input\n *\n * @param {any} rawValue - The value to be stringified.\n * @param {Function} parser - A function that parses a string into a JavaScript object.\n * @param {Function} encoder - A function that takes a value and returns a string.\n *\n * @returns {string} A stringified version of the rawValue.\n */\nfunction stringifySafely(rawValue, parser, encoder) {\n if (utils.isString(rawValue)) {\n try {\n (parser || JSON.parse)(rawValue);\n return utils.trim(rawValue);\n } catch (e) {\n if (e.name !== 'SyntaxError') {\n throw e;\n }\n }\n }\n return (encoder || JSON.stringify)(rawValue);\n}\nconst defaults = {\n transitional: defaults_transitional,\n adapter: ['xhr', 'http'],\n transformRequest: [function transformRequest(data, headers) {\n const contentType = headers.getContentType() || '';\n const hasJSONContentType = contentType.indexOf('application/json') > -1;\n const isObjectPayload = utils.isObject(data);\n if (isObjectPayload && utils.isHTMLForm(data)) {\n data = new FormData(data);\n }\n const isFormData = utils.isFormData(data);\n if (isFormData) {\n return hasJSONContentType ? JSON.stringify(helpers_formDataToJSON(data)) : data;\n }\n if (utils.isArrayBuffer(data) || utils.isBuffer(data) || utils.isStream(data) || utils.isFile(data) || utils.isBlob(data)) {\n return data;\n }\n if (utils.isArrayBufferView(data)) {\n return data.buffer;\n }\n if (utils.isURLSearchParams(data)) {\n headers.setContentType('application/x-www-form-urlencoded;charset=utf-8', false);\n return data.toString();\n }\n let isFileList;\n if (isObjectPayload) {\n if (contentType.indexOf('application/x-www-form-urlencoded') > -1) {\n return toURLEncodedForm(data, this.formSerializer).toString();\n }\n if ((isFileList = utils.isFileList(data)) || contentType.indexOf('multipart/form-data') > -1) {\n const _FormData = this.env && this.env.FormData;\n return helpers_toFormData(isFileList ? {\n 'files[]': data\n } : data, _FormData && new _FormData(), this.formSerializer);\n }\n }\n if (isObjectPayload || hasJSONContentType) {\n headers.setContentType('application/json', false);\n return stringifySafely(data);\n }\n return data;\n }],\n transformResponse: [function transformResponse(data) {\n const transitional = this.transitional || defaults.transitional;\n const forcedJSONParsing = transitional && transitional.forcedJSONParsing;\n const JSONRequested = this.responseType === 'json';\n if (data && utils.isString(data) && (forcedJSONParsing && !this.responseType || JSONRequested)) {\n const silentJSONParsing = transitional && transitional.silentJSONParsing;\n const strictJSONParsing = !silentJSONParsing && JSONRequested;\n try {\n return JSON.parse(data);\n } catch (e) {\n if (strictJSONParsing) {\n if (e.name === 'SyntaxError') {\n throw core_AxiosError.from(e, core_AxiosError.ERR_BAD_RESPONSE, this, null, this.response);\n }\n throw e;\n }\n }\n }\n return data;\n }],\n /**\n * A timeout in milliseconds to abort a request. If set to 0 (default) a\n * timeout is not created.\n */\n timeout: 0,\n xsrfCookieName: 'XSRF-TOKEN',\n xsrfHeaderName: 'X-XSRF-TOKEN',\n maxContentLength: -1,\n maxBodyLength: -1,\n env: {\n FormData: platform.classes.FormData,\n Blob: platform.classes.Blob\n },\n validateStatus: function validateStatus(status) {\n return status >= 200 && status < 300;\n },\n headers: {\n common: {\n 'Accept': 'application/json, text/plain, */*',\n 'Content-Type': undefined\n }\n }\n};\nutils.forEach(['delete', 'get', 'head', 'post', 'put', 'patch'], method => {\n defaults.headers[method] = {};\n});\n/* harmony default export */ var lib_defaults = (defaults);\n;// CONCATENATED MODULE: ./node_modules/axios/lib/helpers/parseHeaders.js\n\n\n\n\n\n// RawAxiosHeaders whose duplicates are ignored by node\n// c.f. https://nodejs.org/api/http.html#http_message_headers\nconst ignoreDuplicateOf = utils.toObjectSet(['age', 'authorization', 'content-length', 'content-type', 'etag', 'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since', 'last-modified', 'location', 'max-forwards', 'proxy-authorization', 'referer', 'retry-after', 'user-agent']);\n\n/**\n * Parse headers into an object\n *\n * ```\n * Date: Wed, 27 Aug 2014 08:58:49 GMT\n * Content-Type: application/json\n * Connection: keep-alive\n * Transfer-Encoding: chunked\n * ```\n *\n * @param {String} rawHeaders Headers needing to be parsed\n *\n * @returns {Object} Headers parsed into an object\n */\n/* harmony default export */ var parseHeaders = (rawHeaders => {\n const parsed = {};\n let key;\n let val;\n let i;\n rawHeaders && rawHeaders.split('\\n').forEach(function parser(line) {\n i = line.indexOf(':');\n key = line.substring(0, i).trim().toLowerCase();\n val = line.substring(i + 1).trim();\n if (!key || parsed[key] && ignoreDuplicateOf[key]) {\n return;\n }\n if (key === 'set-cookie') {\n if (parsed[key]) {\n parsed[key].push(val);\n } else {\n parsed[key] = [val];\n }\n } else {\n parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;\n }\n });\n return parsed;\n});\n;// CONCATENATED MODULE: ./node_modules/axios/lib/core/AxiosHeaders.js\n\n\n\n\nconst $internals = Symbol('internals');\nfunction normalizeHeader(header) {\n return header && String(header).trim().toLowerCase();\n}\nfunction normalizeValue(value) {\n if (value === false || value == null) {\n return value;\n }\n return utils.isArray(value) ? value.map(normalizeValue) : String(value);\n}\nfunction parseTokens(str) {\n const tokens = Object.create(null);\n const tokensRE = /([^\\s,;=]+)\\s*(?:=\\s*([^,;]+))?/g;\n let match;\n while (match = tokensRE.exec(str)) {\n tokens[match[1]] = match[2];\n }\n return tokens;\n}\nconst isValidHeaderName = str => /^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(str.trim());\nfunction matchHeaderValue(context, value, header, filter, isHeaderNameFilter) {\n if (utils.isFunction(filter)) {\n return filter.call(this, value, header);\n }\n if (isHeaderNameFilter) {\n value = header;\n }\n if (!utils.isString(value)) return;\n if (utils.isString(filter)) {\n return value.indexOf(filter) !== -1;\n }\n if (utils.isRegExp(filter)) {\n return filter.test(value);\n }\n}\nfunction formatHeader(header) {\n return header.trim().toLowerCase().replace(/([a-z\\d])(\\w*)/g, (w, char, str) => {\n return char.toUpperCase() + str;\n });\n}\nfunction buildAccessors(obj, header) {\n const accessorName = utils.toCamelCase(' ' + header);\n ['get', 'set', 'has'].forEach(methodName => {\n Object.defineProperty(obj, methodName + accessorName, {\n value: function (arg1, arg2, arg3) {\n return this[methodName].call(this, header, arg1, arg2, arg3);\n },\n configurable: true\n });\n });\n}\nclass AxiosHeaders {\n constructor(headers) {\n headers && this.set(headers);\n }\n set(header, valueOrRewrite, rewrite) {\n const self = this;\n function setHeader(_value, _header, _rewrite) {\n const lHeader = normalizeHeader(_header);\n if (!lHeader) {\n throw new Error('header name must be a non-empty string');\n }\n const key = utils.findKey(self, lHeader);\n if (!key || self[key] === undefined || _rewrite === true || _rewrite === undefined && self[key] !== false) {\n self[key || _header] = normalizeValue(_value);\n }\n }\n const setHeaders = (headers, _rewrite) => utils.forEach(headers, (_value, _header) => setHeader(_value, _header, _rewrite));\n if (utils.isPlainObject(header) || header instanceof this.constructor) {\n setHeaders(header, valueOrRewrite);\n } else if (utils.isString(header) && (header = header.trim()) && !isValidHeaderName(header)) {\n setHeaders(parseHeaders(header), valueOrRewrite);\n } else {\n header != null && setHeader(valueOrRewrite, header, rewrite);\n }\n return this;\n }\n get(header, parser) {\n header = normalizeHeader(header);\n if (header) {\n const key = utils.findKey(this, header);\n if (key) {\n const value = this[key];\n if (!parser) {\n return value;\n }\n if (parser === true) {\n return parseTokens(value);\n }\n if (utils.isFunction(parser)) {\n return parser.call(this, value, key);\n }\n if (utils.isRegExp(parser)) {\n return parser.exec(value);\n }\n throw new TypeError('parser must be boolean|regexp|function');\n }\n }\n }\n has(header, matcher) {\n header = normalizeHeader(header);\n if (header) {\n const key = utils.findKey(this, header);\n return !!(key && this[key] !== undefined && (!matcher || matchHeaderValue(this, this[key], key, matcher)));\n }\n return false;\n }\n delete(header, matcher) {\n const self = this;\n let deleted = false;\n function deleteHeader(_header) {\n _header = normalizeHeader(_header);\n if (_header) {\n const key = utils.findKey(self, _header);\n if (key && (!matcher || matchHeaderValue(self, self[key], key, matcher))) {\n delete self[key];\n deleted = true;\n }\n }\n }\n if (utils.isArray(header)) {\n header.forEach(deleteHeader);\n } else {\n deleteHeader(header);\n }\n return deleted;\n }\n clear(matcher) {\n const keys = Object.keys(this);\n let i = keys.length;\n let deleted = false;\n while (i--) {\n const key = keys[i];\n if (!matcher || matchHeaderValue(this, this[key], key, matcher, true)) {\n delete this[key];\n deleted = true;\n }\n }\n return deleted;\n }\n normalize(format) {\n const self = this;\n const headers = {};\n utils.forEach(this, (value, header) => {\n const key = utils.findKey(headers, header);\n if (key) {\n self[key] = normalizeValue(value);\n delete self[header];\n return;\n }\n const normalized = format ? formatHeader(header) : String(header).trim();\n if (normalized !== header) {\n delete self[header];\n }\n self[normalized] = normalizeValue(value);\n headers[normalized] = true;\n });\n return this;\n }\n concat(...targets) {\n return this.constructor.concat(this, ...targets);\n }\n toJSON(asStrings) {\n const obj = Object.create(null);\n utils.forEach(this, (value, header) => {\n value != null && value !== false && (obj[header] = asStrings && utils.isArray(value) ? value.join(', ') : value);\n });\n return obj;\n }\n [Symbol.iterator]() {\n return Object.entries(this.toJSON())[Symbol.iterator]();\n }\n toString() {\n return Object.entries(this.toJSON()).map(([header, value]) => header + ': ' + value).join('\\n');\n }\n get [Symbol.toStringTag]() {\n return 'AxiosHeaders';\n }\n static from(thing) {\n return thing instanceof this ? thing : new this(thing);\n }\n static concat(first, ...targets) {\n const computed = new this(first);\n targets.forEach(target => computed.set(target));\n return computed;\n }\n static accessor(header) {\n const internals = this[$internals] = this[$internals] = {\n accessors: {}\n };\n const accessors = internals.accessors;\n const prototype = this.prototype;\n function defineAccessor(_header) {\n const lHeader = normalizeHeader(_header);\n if (!accessors[lHeader]) {\n buildAccessors(prototype, _header);\n accessors[lHeader] = true;\n }\n }\n utils.isArray(header) ? header.forEach(defineAccessor) : defineAccessor(header);\n return this;\n }\n}\nAxiosHeaders.accessor(['Content-Type', 'Content-Length', 'Accept', 'Accept-Encoding', 'User-Agent', 'Authorization']);\n\n// reserved names hotfix\nutils.reduceDescriptors(AxiosHeaders.prototype, ({\n value\n}, key) => {\n let mapped = key[0].toUpperCase() + key.slice(1); // map `set` => `Set`\n return {\n get: () => value,\n set(headerValue) {\n this[mapped] = headerValue;\n }\n };\n});\nutils.freezeMethods(AxiosHeaders);\n/* harmony default export */ var core_AxiosHeaders = (AxiosHeaders);\n;// CONCATENATED MODULE: ./node_modules/axios/lib/core/transformData.js\n\n\n\n\n\n\n/**\n * Transform the data for a request or a response\n *\n * @param {Array|Function} fns A single function or Array of functions\n * @param {?Object} response The response object\n *\n * @returns {*} The resulting transformed data\n */\nfunction transformData(fns, response) {\n const config = this || lib_defaults;\n const context = response || config;\n const headers = core_AxiosHeaders.from(context.headers);\n let data = context.data;\n utils.forEach(fns, function transform(fn) {\n data = fn.call(config, data, headers.normalize(), response ? response.status : undefined);\n });\n headers.normalize();\n return data;\n}\n;// CONCATENATED MODULE: ./node_modules/axios/lib/cancel/isCancel.js\n\n\nfunction isCancel(value) {\n return !!(value && value.__CANCEL__);\n}\n;// CONCATENATED MODULE: ./node_modules/axios/lib/cancel/CanceledError.js\n\n\n\n\n\n/**\n * A `CanceledError` is an object that is thrown when an operation is canceled.\n *\n * @param {string=} message The message.\n * @param {Object=} config The config.\n * @param {Object=} request The request.\n *\n * @returns {CanceledError} The created error.\n */\nfunction CanceledError(message, config, request) {\n // eslint-disable-next-line no-eq-null,eqeqeq\n core_AxiosError.call(this, message == null ? 'canceled' : message, core_AxiosError.ERR_CANCELED, config, request);\n this.name = 'CanceledError';\n}\nutils.inherits(CanceledError, core_AxiosError, {\n __CANCEL__: true\n});\n/* harmony default export */ var cancel_CanceledError = (CanceledError);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/web.dom-exception.stack.js\nvar web_dom_exception_stack = __webpack_require__(4979);\n;// CONCATENATED MODULE: ./node_modules/axios/lib/core/settle.js\n\n\n\n\n/**\n * Resolve or reject a Promise based on response status.\n *\n * @param {Function} resolve A function that resolves the promise.\n * @param {Function} reject A function that rejects the promise.\n * @param {object} response The response.\n *\n * @returns {object} The response.\n */\nfunction settle(resolve, reject, response) {\n const validateStatus = response.config.validateStatus;\n if (!response.status || !validateStatus || validateStatus(response.status)) {\n resolve(response);\n } else {\n reject(new core_AxiosError('Request failed with status code ' + response.status, [core_AxiosError.ERR_BAD_REQUEST, core_AxiosError.ERR_BAD_RESPONSE][Math.floor(response.status / 100) - 4], response.config, response.request, response));\n }\n}\n;// CONCATENATED MODULE: ./node_modules/axios/lib/helpers/cookies.js\n\n\n\n/* harmony default export */ var cookies = (platform.hasStandardBrowserEnv ?\n// Standard browser envs support document.cookie\n{\n write(name, value, expires, path, domain, secure) {\n const cookie = [name + '=' + encodeURIComponent(value)];\n utils.isNumber(expires) && cookie.push('expires=' + new Date(expires).toGMTString());\n utils.isString(path) && cookie.push('path=' + path);\n utils.isString(domain) && cookie.push('domain=' + domain);\n secure === true && cookie.push('secure');\n document.cookie = cookie.join('; ');\n },\n read(name) {\n const match = document.cookie.match(new RegExp('(^|;\\\\s*)(' + name + ')=([^;]*)'));\n return match ? decodeURIComponent(match[3]) : null;\n },\n remove(name) {\n this.write(name, '', Date.now() - 86400000);\n }\n} :\n// Non-standard browser env (web workers, react-native) lack needed support.\n{\n write() {},\n read() {\n return null;\n },\n remove() {}\n});\n;// CONCATENATED MODULE: ./node_modules/axios/lib/helpers/isAbsoluteURL.js\n\n\n/**\n * Determines whether the specified URL is absolute\n *\n * @param {string} url The URL to test\n *\n * @returns {boolean} True if the specified URL is absolute, otherwise false\n */\nfunction isAbsoluteURL(url) {\n // A URL is considered absolute if it begins with \"<scheme>://\" or \"//\" (protocol-relative URL).\n // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed\n // by any combination of letters, digits, plus, period, or hyphen.\n return /^([a-z][a-z\\d+\\-.]*:)?\\/\\//i.test(url);\n}\n;// CONCATENATED MODULE: ./node_modules/axios/lib/helpers/combineURLs.js\n\n\n/**\n * Creates a new URL by combining the specified URLs\n *\n * @param {string} baseURL The base URL\n * @param {string} relativeURL The relative URL\n *\n * @returns {string} The combined URL\n */\nfunction combineURLs(baseURL, relativeURL) {\n return relativeURL ? baseURL.replace(/\\/?\\/$/, '') + '/' + relativeURL.replace(/^\\/+/, '') : baseURL;\n}\n;// CONCATENATED MODULE: ./node_modules/axios/lib/core/buildFullPath.js\n\n\n\n\n\n/**\n * Creates a new URL by combining the baseURL with the requestedURL,\n * only when the requestedURL is not already an absolute URL.\n * If the requestURL is absolute, this function returns the requestedURL untouched.\n *\n * @param {string} baseURL The base URL\n * @param {string} requestedURL Absolute or relative URL to combine\n *\n * @returns {string} The combined full path\n */\nfunction buildFullPath(baseURL, requestedURL) {\n if (baseURL && !isAbsoluteURL(requestedURL)) {\n return combineURLs(baseURL, requestedURL);\n }\n return requestedURL;\n}\n;// CONCATENATED MODULE: ./node_modules/axios/lib/helpers/isURLSameOrigin.js\n\n\n\n\n/* harmony default export */ var isURLSameOrigin = (platform.hasStandardBrowserEnv ?\n// Standard browser envs have full support of the APIs needed to test\n// whether the request URL is of the same origin as current location.\nfunction standardBrowserEnv() {\n const msie = /(msie|trident)/i.test(navigator.userAgent);\n const urlParsingNode = document.createElement('a');\n let originURL;\n\n /**\n * Parse a URL to discover its components\n *\n * @param {String} url The URL to be parsed\n * @returns {Object}\n */\n function resolveURL(url) {\n let href = url;\n if (msie) {\n // IE needs attribute set twice to normalize properties\n urlParsingNode.setAttribute('href', href);\n href = urlParsingNode.href;\n }\n urlParsingNode.setAttribute('href', href);\n\n // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils\n return {\n href: urlParsingNode.href,\n protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '',\n host: urlParsingNode.host,\n search: urlParsingNode.search ? urlParsingNode.search.replace(/^\\?/, '') : '',\n hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '',\n hostname: urlParsingNode.hostname,\n port: urlParsingNode.port,\n pathname: urlParsingNode.pathname.charAt(0) === '/' ? urlParsingNode.pathname : '/' + urlParsingNode.pathname\n };\n }\n originURL = resolveURL(window.location.href);\n\n /**\n * Determine if a URL shares the same origin as the current location\n *\n * @param {String} requestURL The URL to test\n * @returns {boolean} True if URL shares the same origin, otherwise false\n */\n return function isURLSameOrigin(requestURL) {\n const parsed = utils.isString(requestURL) ? resolveURL(requestURL) : requestURL;\n return parsed.protocol === originURL.protocol && parsed.host === originURL.host;\n };\n}() :\n// Non standard browser envs (web workers, react-native) lack needed support.\nfunction nonStandardBrowserEnv() {\n return function isURLSameOrigin() {\n return true;\n };\n}());\n;// CONCATENATED MODULE: ./node_modules/axios/lib/helpers/parseProtocol.js\n\n\nfunction parseProtocol(url) {\n const match = /^([-+\\w]{1,25})(:?\\/\\/|:)/.exec(url);\n return match && match[1] || '';\n}\n;// CONCATENATED MODULE: ./node_modules/axios/lib/helpers/speedometer.js\n\n\n/**\n * Calculate data maxRate\n * @param {Number} [samplesCount= 10]\n * @param {Number} [min= 1000]\n * @returns {Function}\n */\nfunction speedometer(samplesCount, min) {\n samplesCount = samplesCount || 10;\n const bytes = new Array(samplesCount);\n const timestamps = new Array(samplesCount);\n let head = 0;\n let tail = 0;\n let firstSampleTS;\n min = min !== undefined ? min : 1000;\n return function push(chunkLength) {\n const now = Date.now();\n const startedAt = timestamps[tail];\n if (!firstSampleTS) {\n firstSampleTS = now;\n }\n bytes[head] = chunkLength;\n timestamps[head] = now;\n let i = tail;\n let bytesCount = 0;\n while (i !== head) {\n bytesCount += bytes[i++];\n i = i % samplesCount;\n }\n head = (head + 1) % samplesCount;\n if (head === tail) {\n tail = (tail + 1) % samplesCount;\n }\n if (now - firstSampleTS < min) {\n return;\n }\n const passed = startedAt && now - startedAt;\n return passed ? Math.round(bytesCount * 1000 / passed) : undefined;\n };\n}\n/* harmony default export */ var helpers_speedometer = (speedometer);\n;// CONCATENATED MODULE: ./node_modules/axios/lib/adapters/xhr.js\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nfunction progressEventReducer(listener, isDownloadStream) {\n let bytesNotified = 0;\n const _speedometer = helpers_speedometer(50, 250);\n return e => {\n const loaded = e.loaded;\n const total = e.lengthComputable ? e.total : undefined;\n const progressBytes = loaded - bytesNotified;\n const rate = _speedometer(progressBytes);\n const inRange = loaded <= total;\n bytesNotified = loaded;\n const data = {\n loaded,\n total,\n progress: total ? loaded / total : undefined,\n bytes: progressBytes,\n rate: rate ? rate : undefined,\n estimated: rate && total && inRange ? (total - loaded) / rate : undefined,\n event: e\n };\n data[isDownloadStream ? 'download' : 'upload'] = true;\n listener(data);\n };\n}\nconst isXHRAdapterSupported = typeof XMLHttpRequest !== 'undefined';\n/* harmony default export */ var xhr = (isXHRAdapterSupported && function (config) {\n return new Promise(function dispatchXhrRequest(resolve, reject) {\n let requestData = config.data;\n const requestHeaders = core_AxiosHeaders.from(config.headers).normalize();\n let {\n responseType,\n withXSRFToken\n } = config;\n let onCanceled;\n function done() {\n if (config.cancelToken) {\n config.cancelToken.unsubscribe(onCanceled);\n }\n if (config.signal) {\n config.signal.removeEventListener('abort', onCanceled);\n }\n }\n let contentType;\n if (utils.isFormData(requestData)) {\n if (platform.hasStandardBrowserEnv || platform.hasStandardBrowserWebWorkerEnv) {\n requestHeaders.setContentType(false); // Let the browser set it\n } else if ((contentType = requestHeaders.getContentType()) !== false) {\n // fix semicolon duplication issue for ReactNative FormData implementation\n const [type, ...tokens] = contentType ? contentType.split(';').map(token => token.trim()).filter(Boolean) : [];\n requestHeaders.setContentType([type || 'multipart/form-data', ...tokens].join('; '));\n }\n }\n let request = new XMLHttpRequest();\n\n // HTTP basic authentication\n if (config.auth) {\n const username = config.auth.username || '';\n const password = config.auth.password ? unescape(encodeURIComponent(config.auth.password)) : '';\n requestHeaders.set('Authorization', 'Basic ' + btoa(username + ':' + password));\n }\n const fullPath = buildFullPath(config.baseURL, config.url);\n request.open(config.method.toUpperCase(), buildURL(fullPath, config.params, config.paramsSerializer), true);\n\n // Set the request timeout in MS\n request.timeout = config.timeout;\n function onloadend() {\n if (!request) {\n return;\n }\n // Prepare the response\n const responseHeaders = core_AxiosHeaders.from('getAllResponseHeaders' in request && request.getAllResponseHeaders());\n const responseData = !responseType || responseType === 'text' || responseType === 'json' ? request.responseText : request.response;\n const response = {\n data: responseData,\n status: request.status,\n statusText: request.statusText,\n headers: responseHeaders,\n config,\n request\n };\n settle(function _resolve(value) {\n resolve(value);\n done();\n }, function _reject(err) {\n reject(err);\n done();\n }, response);\n\n // Clean up request\n request = null;\n }\n if ('onloadend' in request) {\n // Use onloadend if available\n request.onloadend = onloadend;\n } else {\n // Listen for ready state to emulate onloadend\n request.onreadystatechange = function handleLoad() {\n if (!request || request.readyState !== 4) {\n return;\n }\n\n // The request errored out and we didn't get a response, this will be\n // handled by onerror instead\n // With one exception: request that using file: protocol, most browsers\n // will return status as 0 even though it's a successful request\n if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) {\n return;\n }\n // readystate handler is calling before onerror or ontimeout handlers,\n // so we should call onloadend on the next 'tick'\n setTimeout(onloadend);\n };\n }\n\n // Handle browser request cancellation (as opposed to a manual cancellation)\n request.onabort = function handleAbort() {\n if (!request) {\n return;\n }\n reject(new core_AxiosError('Request aborted', core_AxiosError.ECONNABORTED, config, request));\n\n // Clean up request\n request = null;\n };\n\n // Handle low level network errors\n request.onerror = function handleError() {\n // Real errors are hidden from us by the browser\n // onerror should only fire if it's a network error\n reject(new core_AxiosError('Network Error', core_AxiosError.ERR_NETWORK, config, request));\n\n // Clean up request\n request = null;\n };\n\n // Handle timeout\n request.ontimeout = function handleTimeout() {\n let timeoutErrorMessage = config.timeout ? 'timeout of ' + config.timeout + 'ms exceeded' : 'timeout exceeded';\n const transitional = config.transitional || defaults_transitional;\n if (config.timeoutErrorMessage) {\n timeoutErrorMessage = config.timeoutErrorMessage;\n }\n reject(new core_AxiosError(timeoutErrorMessage, transitional.clarifyTimeoutError ? core_AxiosError.ETIMEDOUT : core_AxiosError.ECONNABORTED, config, request));\n\n // Clean up request\n request = null;\n };\n\n // Add xsrf header\n // This is only done if running in a standard browser environment.\n // Specifically not if we're in a web worker, or react-native.\n if (platform.hasStandardBrowserEnv) {\n withXSRFToken && utils.isFunction(withXSRFToken) && (withXSRFToken = withXSRFToken(config));\n if (withXSRFToken || withXSRFToken !== false && isURLSameOrigin(fullPath)) {\n // Add xsrf header\n const xsrfValue = config.xsrfHeaderName && config.xsrfCookieName && cookies.read(config.xsrfCookieName);\n if (xsrfValue) {\n requestHeaders.set(config.xsrfHeaderName, xsrfValue);\n }\n }\n }\n\n // Remove Content-Type if data is undefined\n requestData === undefined && requestHeaders.setContentType(null);\n\n // Add headers to the request\n if ('setRequestHeader' in request) {\n utils.forEach(requestHeaders.toJSON(), function setRequestHeader(val, key) {\n request.setRequestHeader(key, val);\n });\n }\n\n // Add withCredentials to request if needed\n if (!utils.isUndefined(config.withCredentials)) {\n request.withCredentials = !!config.withCredentials;\n }\n\n // Add responseType to request if needed\n if (responseType && responseType !== 'json') {\n request.responseType = config.responseType;\n }\n\n // Handle progress if needed\n if (typeof config.onDownloadProgress === 'function') {\n request.addEventListener('progress', progressEventReducer(config.onDownloadProgress, true));\n }\n\n // Not all browsers support upload events\n if (typeof config.onUploadProgress === 'function' && request.upload) {\n request.upload.addEventListener('progress', progressEventReducer(config.onUploadProgress));\n }\n if (config.cancelToken || config.signal) {\n // Handle cancellation\n // eslint-disable-next-line func-names\n onCanceled = cancel => {\n if (!request) {\n return;\n }\n reject(!cancel || cancel.type ? new cancel_CanceledError(null, config, request) : cancel);\n request.abort();\n request = null;\n };\n config.cancelToken && config.cancelToken.subscribe(onCanceled);\n if (config.signal) {\n config.signal.aborted ? onCanceled() : config.signal.addEventListener('abort', onCanceled);\n }\n }\n const protocol = parseProtocol(fullPath);\n if (protocol && platform.protocols.indexOf(protocol) === -1) {\n reject(new core_AxiosError('Unsupported protocol ' + protocol + ':', core_AxiosError.ERR_BAD_REQUEST, config));\n return;\n }\n\n // Send the request\n request.send(requestData || null);\n });\n});\n;// CONCATENATED MODULE: ./node_modules/axios/lib/adapters/adapters.js\n\n\n\n\nconst knownAdapters = {\n http: helpers_null,\n xhr: xhr\n};\nutils.forEach(knownAdapters, (fn, value) => {\n if (fn) {\n try {\n Object.defineProperty(fn, 'name', {\n value\n });\n } catch (e) {\n // eslint-disable-next-line no-empty\n }\n Object.defineProperty(fn, 'adapterName', {\n value\n });\n }\n});\nconst renderReason = reason => `- ${reason}`;\nconst isResolvedHandle = adapter => utils.isFunction(adapter) || adapter === null || adapter === false;\n/* harmony default export */ var adapters = ({\n getAdapter: adapters => {\n adapters = utils.isArray(adapters) ? adapters : [adapters];\n const {\n length\n } = adapters;\n let nameOrAdapter;\n let adapter;\n const rejectedReasons = {};\n for (let i = 0; i < length; i++) {\n nameOrAdapter = adapters[i];\n let id;\n adapter = nameOrAdapter;\n if (!isResolvedHandle(nameOrAdapter)) {\n adapter = knownAdapters[(id = String(nameOrAdapter)).toLowerCase()];\n if (adapter === undefined) {\n throw new core_AxiosError(`Unknown adapter '${id}'`);\n }\n }\n if (adapter) {\n break;\n }\n rejectedReasons[id || '#' + i] = adapter;\n }\n if (!adapter) {\n const reasons = Object.entries(rejectedReasons).map(([id, state]) => `adapter ${id} ` + (state === false ? 'is not supported by the environment' : 'is not available in the build'));\n let s = length ? reasons.length > 1 ? 'since :\\n' + reasons.map(renderReason).join('\\n') : ' ' + renderReason(reasons[0]) : 'as no adapter specified';\n throw new core_AxiosError(`There is no suitable adapter to dispatch the request ` + s, 'ERR_NOT_SUPPORT');\n }\n return adapter;\n },\n adapters: knownAdapters\n});\n;// CONCATENATED MODULE: ./node_modules/axios/lib/core/dispatchRequest.js\n\n\n\n\n\n\n\n\n\n/**\n * Throws a `CanceledError` if cancellation has been requested.\n *\n * @param {Object} config The config that is to be used for the request\n *\n * @returns {void}\n */\nfunction throwIfCancellationRequested(config) {\n if (config.cancelToken) {\n config.cancelToken.throwIfRequested();\n }\n if (config.signal && config.signal.aborted) {\n throw new cancel_CanceledError(null, config);\n }\n}\n\n/**\n * Dispatch a request to the server using the configured adapter.\n *\n * @param {object} config The config that is to be used for the request\n *\n * @returns {Promise} The Promise to be fulfilled\n */\nfunction dispatchRequest(config) {\n throwIfCancellationRequested(config);\n config.headers = core_AxiosHeaders.from(config.headers);\n\n // Transform request data\n config.data = transformData.call(config, config.transformRequest);\n if (['post', 'put', 'patch'].indexOf(config.method) !== -1) {\n config.headers.setContentType('application/x-www-form-urlencoded', false);\n }\n const adapter = adapters.getAdapter(config.adapter || lib_defaults.adapter);\n return adapter(config).then(function onAdapterResolution(response) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n response.data = transformData.call(config, config.transformResponse, response);\n response.headers = core_AxiosHeaders.from(response.headers);\n return response;\n }, function onAdapterRejection(reason) {\n if (!isCancel(reason)) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n if (reason && reason.response) {\n reason.response.data = transformData.call(config, config.transformResponse, reason.response);\n reason.response.headers = core_AxiosHeaders.from(reason.response.headers);\n }\n }\n return Promise.reject(reason);\n });\n}\n;// CONCATENATED MODULE: ./node_modules/axios/lib/core/mergeConfig.js\n\n\n\n\nconst headersToObject = thing => thing instanceof core_AxiosHeaders ? thing.toJSON() : thing;\n\n/**\n * Config-specific merge-function which creates a new config-object\n * by merging two configuration objects together.\n *\n * @param {Object} config1\n * @param {Object} config2\n *\n * @returns {Object} New object resulting from merging config2 to config1\n */\nfunction mergeConfig(config1, config2) {\n // eslint-disable-next-line no-param-reassign\n config2 = config2 || {};\n const config = {};\n function getMergedValue(target, source, caseless) {\n if (utils.isPlainObject(target) && utils.isPlainObject(source)) {\n return utils.merge.call({\n caseless\n }, target, source);\n } else if (utils.isPlainObject(source)) {\n return utils.merge({}, source);\n } else if (utils.isArray(source)) {\n return source.slice();\n }\n return source;\n }\n\n // eslint-disable-next-line consistent-return\n function mergeDeepProperties(a, b, caseless) {\n if (!utils.isUndefined(b)) {\n return getMergedValue(a, b, caseless);\n } else if (!utils.isUndefined(a)) {\n return getMergedValue(undefined, a, caseless);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function valueFromConfig2(a, b) {\n if (!utils.isUndefined(b)) {\n return getMergedValue(undefined, b);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function defaultToConfig2(a, b) {\n if (!utils.isUndefined(b)) {\n return getMergedValue(undefined, b);\n } else if (!utils.isUndefined(a)) {\n return getMergedValue(undefined, a);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function mergeDirectKeys(a, b, prop) {\n if (prop in config2) {\n return getMergedValue(a, b);\n } else if (prop in config1) {\n return getMergedValue(undefined, a);\n }\n }\n const mergeMap = {\n url: valueFromConfig2,\n method: valueFromConfig2,\n data: valueFromConfig2,\n baseURL: defaultToConfig2,\n transformRequest: defaultToConfig2,\n transformResponse: defaultToConfig2,\n paramsSerializer: defaultToConfig2,\n timeout: defaultToConfig2,\n timeoutMessage: defaultToConfig2,\n withCredentials: defaultToConfig2,\n withXSRFToken: defaultToConfig2,\n adapter: defaultToConfig2,\n responseType: defaultToConfig2,\n xsrfCookieName: defaultToConfig2,\n xsrfHeaderName: defaultToConfig2,\n onUploadProgress: defaultToConfig2,\n onDownloadProgress: defaultToConfig2,\n decompress: defaultToConfig2,\n maxContentLength: defaultToConfig2,\n maxBodyLength: defaultToConfig2,\n beforeRedirect: defaultToConfig2,\n transport: defaultToConfig2,\n httpAgent: defaultToConfig2,\n httpsAgent: defaultToConfig2,\n cancelToken: defaultToConfig2,\n socketPath: defaultToConfig2,\n responseEncoding: defaultToConfig2,\n validateStatus: mergeDirectKeys,\n headers: (a, b) => mergeDeepProperties(headersToObject(a), headersToObject(b), true)\n };\n utils.forEach(Object.keys(Object.assign({}, config1, config2)), function computeConfigValue(prop) {\n const merge = mergeMap[prop] || mergeDeepProperties;\n const configValue = merge(config1[prop], config2[prop], prop);\n utils.isUndefined(configValue) && merge !== mergeDirectKeys || (config[prop] = configValue);\n });\n return config;\n}\n;// CONCATENATED MODULE: ./node_modules/axios/lib/env/data.js\nconst VERSION = \"1.6.7\";\n;// CONCATENATED MODULE: ./node_modules/axios/lib/helpers/validator.js\n\n\n\n\nconst validators = {};\n\n// eslint-disable-next-line func-names\n['object', 'boolean', 'number', 'function', 'string', 'symbol'].forEach((type, i) => {\n validators[type] = function validator(thing) {\n return typeof thing === type || 'a' + (i < 1 ? 'n ' : ' ') + type;\n };\n});\nconst deprecatedWarnings = {};\n\n/**\n * Transitional option validator\n *\n * @param {function|boolean?} validator - set to false if the transitional option has been removed\n * @param {string?} version - deprecated version / removed since version\n * @param {string?} message - some message with additional info\n *\n * @returns {function}\n */\nvalidators.transitional = function transitional(validator, version, message) {\n function formatMessage(opt, desc) {\n return '[Axios v' + VERSION + '] Transitional option \\'' + opt + '\\'' + desc + (message ? '. ' + message : '');\n }\n\n // eslint-disable-next-line func-names\n return (value, opt, opts) => {\n if (validator === false) {\n throw new core_AxiosError(formatMessage(opt, ' has been removed' + (version ? ' in ' + version : '')), core_AxiosError.ERR_DEPRECATED);\n }\n if (version && !deprecatedWarnings[opt]) {\n deprecatedWarnings[opt] = true;\n // eslint-disable-next-line no-console\n console.warn(formatMessage(opt, ' has been deprecated since v' + version + ' and will be removed in the near future'));\n }\n return validator ? validator(value, opt, opts) : true;\n };\n};\n\n/**\n * Assert object's properties type\n *\n * @param {object} options\n * @param {object} schema\n * @param {boolean?} allowUnknown\n *\n * @returns {object}\n */\n\nfunction assertOptions(options, schema, allowUnknown) {\n if (typeof options !== 'object') {\n throw new core_AxiosError('options must be an object', core_AxiosError.ERR_BAD_OPTION_VALUE);\n }\n const keys = Object.keys(options);\n let i = keys.length;\n while (i-- > 0) {\n const opt = keys[i];\n const validator = schema[opt];\n if (validator) {\n const value = options[opt];\n const result = value === undefined || validator(value, opt, options);\n if (result !== true) {\n throw new core_AxiosError('option ' + opt + ' must be ' + result, core_AxiosError.ERR_BAD_OPTION_VALUE);\n }\n continue;\n }\n if (allowUnknown !== true) {\n throw new core_AxiosError('Unknown option ' + opt, core_AxiosError.ERR_BAD_OPTION);\n }\n }\n}\n/* harmony default export */ var validator = ({\n assertOptions,\n validators\n});\n;// CONCATENATED MODULE: ./node_modules/axios/lib/core/Axios.js\n\n\n\n\n\n\n\n\n\n\n\nconst Axios_validators = validator.validators;\n\n/**\n * Create a new instance of Axios\n *\n * @param {Object} instanceConfig The default config for the instance\n *\n * @return {Axios} A new instance of Axios\n */\nclass Axios {\n constructor(instanceConfig) {\n this.defaults = instanceConfig;\n this.interceptors = {\n request: new core_InterceptorManager(),\n response: new core_InterceptorManager()\n };\n }\n\n /**\n * Dispatch a request\n *\n * @param {String|Object} configOrUrl The config specific for this request (merged with this.defaults)\n * @param {?Object} config\n *\n * @returns {Promise} The Promise to be fulfilled\n */\n async request(configOrUrl, config) {\n try {\n return await this._request(configOrUrl, config);\n } catch (err) {\n if (err instanceof Error) {\n let dummy;\n Error.captureStackTrace ? Error.captureStackTrace(dummy = {}) : dummy = new Error();\n\n // slice off the Error: ... line\n const stack = dummy.stack ? dummy.stack.replace(/^.+\\n/, '') : '';\n if (!err.stack) {\n err.stack = stack;\n // match without the 2 top stack lines\n } else if (stack && !String(err.stack).endsWith(stack.replace(/^.+\\n.+\\n/, ''))) {\n err.stack += '\\n' + stack;\n }\n }\n throw err;\n }\n }\n _request(configOrUrl, config) {\n /*eslint no-param-reassign:0*/\n // Allow for axios('example/url'[, config]) a la fetch API\n if (typeof configOrUrl === 'string') {\n config = config || {};\n config.url = configOrUrl;\n } else {\n config = configOrUrl || {};\n }\n config = mergeConfig(this.defaults, config);\n const {\n transitional,\n paramsSerializer,\n headers\n } = config;\n if (transitional !== undefined) {\n validator.assertOptions(transitional, {\n silentJSONParsing: Axios_validators.transitional(Axios_validators.boolean),\n forcedJSONParsing: Axios_validators.transitional(Axios_validators.boolean),\n clarifyTimeoutError: Axios_validators.transitional(Axios_validators.boolean)\n }, false);\n }\n if (paramsSerializer != null) {\n if (utils.isFunction(paramsSerializer)) {\n config.paramsSerializer = {\n serialize: paramsSerializer\n };\n } else {\n validator.assertOptions(paramsSerializer, {\n encode: Axios_validators.function,\n serialize: Axios_validators.function\n }, true);\n }\n }\n\n // Set config.method\n config.method = (config.method || this.defaults.method || 'get').toLowerCase();\n\n // Flatten headers\n let contextHeaders = headers && utils.merge(headers.common, headers[config.method]);\n headers && utils.forEach(['delete', 'get', 'head', 'post', 'put', 'patch', 'common'], method => {\n delete headers[method];\n });\n config.headers = core_AxiosHeaders.concat(contextHeaders, headers);\n\n // filter out skipped interceptors\n const requestInterceptorChain = [];\n let synchronousRequestInterceptors = true;\n this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {\n if (typeof interceptor.runWhen === 'function' && interceptor.runWhen(config) === false) {\n return;\n }\n synchronousRequestInterceptors = synchronousRequestInterceptors && interceptor.synchronous;\n requestInterceptorChain.unshift(interceptor.fulfilled, interceptor.rejected);\n });\n const responseInterceptorChain = [];\n this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {\n responseInterceptorChain.push(interceptor.fulfilled, interceptor.rejected);\n });\n let promise;\n let i = 0;\n let len;\n if (!synchronousRequestInterceptors) {\n const chain = [dispatchRequest.bind(this), undefined];\n chain.unshift.apply(chain, requestInterceptorChain);\n chain.push.apply(chain, responseInterceptorChain);\n len = chain.length;\n promise = Promise.resolve(config);\n while (i < len) {\n promise = promise.then(chain[i++], chain[i++]);\n }\n return promise;\n }\n len = requestInterceptorChain.length;\n let newConfig = config;\n i = 0;\n while (i < len) {\n const onFulfilled = requestInterceptorChain[i++];\n const onRejected = requestInterceptorChain[i++];\n try {\n newConfig = onFulfilled(newConfig);\n } catch (error) {\n onRejected.call(this, error);\n break;\n }\n }\n try {\n promise = dispatchRequest.call(this, newConfig);\n } catch (error) {\n return Promise.reject(error);\n }\n i = 0;\n len = responseInterceptorChain.length;\n while (i < len) {\n promise = promise.then(responseInterceptorChain[i++], responseInterceptorChain[i++]);\n }\n return promise;\n }\n getUri(config) {\n config = mergeConfig(this.defaults, config);\n const fullPath = buildFullPath(config.baseURL, config.url);\n return buildURL(fullPath, config.params, config.paramsSerializer);\n }\n}\n\n// Provide aliases for supported request methods\nutils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) {\n /*eslint func-names:0*/\n Axios.prototype[method] = function (url, config) {\n return this.request(mergeConfig(config || {}, {\n method,\n url,\n data: (config || {}).data\n }));\n };\n});\nutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\n /*eslint func-names:0*/\n\n function generateHTTPMethod(isForm) {\n return function httpMethod(url, data, config) {\n return this.request(mergeConfig(config || {}, {\n method,\n headers: isForm ? {\n 'Content-Type': 'multipart/form-data'\n } : {},\n url,\n data\n }));\n };\n }\n Axios.prototype[method] = generateHTTPMethod();\n Axios.prototype[method + 'Form'] = generateHTTPMethod(true);\n});\n/* harmony default export */ var core_Axios = (Axios);\n;// CONCATENATED MODULE: ./node_modules/axios/lib/cancel/CancelToken.js\n\n\n\n\n\n/**\n * A `CancelToken` is an object that can be used to request cancellation of an operation.\n *\n * @param {Function} executor The executor function.\n *\n * @returns {CancelToken}\n */\nclass CancelToken {\n constructor(executor) {\n if (typeof executor !== 'function') {\n throw new TypeError('executor must be a function.');\n }\n let resolvePromise;\n this.promise = new Promise(function promiseExecutor(resolve) {\n resolvePromise = resolve;\n });\n const token = this;\n\n // eslint-disable-next-line func-names\n this.promise.then(cancel => {\n if (!token._listeners) return;\n let i = token._listeners.length;\n while (i-- > 0) {\n token._listeners[i](cancel);\n }\n token._listeners = null;\n });\n\n // eslint-disable-next-line func-names\n this.promise.then = onfulfilled => {\n let _resolve;\n // eslint-disable-next-line func-names\n const promise = new Promise(resolve => {\n token.subscribe(resolve);\n _resolve = resolve;\n }).then(onfulfilled);\n promise.cancel = function reject() {\n token.unsubscribe(_resolve);\n };\n return promise;\n };\n executor(function cancel(message, config, request) {\n if (token.reason) {\n // Cancellation has already been requested\n return;\n }\n token.reason = new cancel_CanceledError(message, config, request);\n resolvePromise(token.reason);\n });\n }\n\n /**\n * Throws a `CanceledError` if cancellation has been requested.\n */\n throwIfRequested() {\n if (this.reason) {\n throw this.reason;\n }\n }\n\n /**\n * Subscribe to the cancel signal\n */\n\n subscribe(listener) {\n if (this.reason) {\n listener(this.reason);\n return;\n }\n if (this._listeners) {\n this._listeners.push(listener);\n } else {\n this._listeners = [listener];\n }\n }\n\n /**\n * Unsubscribe from the cancel signal\n */\n\n unsubscribe(listener) {\n if (!this._listeners) {\n return;\n }\n const index = this._listeners.indexOf(listener);\n if (index !== -1) {\n this._listeners.splice(index, 1);\n }\n }\n\n /**\n * Returns an object that contains a new `CancelToken` and a function that, when called,\n * cancels the `CancelToken`.\n */\n static source() {\n let cancel;\n const token = new CancelToken(function executor(c) {\n cancel = c;\n });\n return {\n token,\n cancel\n };\n }\n}\n/* harmony default export */ var cancel_CancelToken = (CancelToken);\n;// CONCATENATED MODULE: ./node_modules/axios/lib/helpers/spread.js\n\n\n/**\n * Syntactic sugar for invoking a function and expanding an array for arguments.\n *\n * Common use case would be to use `Function.prototype.apply`.\n *\n * ```js\n * function f(x, y, z) {}\n * var args = [1, 2, 3];\n * f.apply(null, args);\n * ```\n *\n * With `spread` this example can be re-written.\n *\n * ```js\n * spread(function(x, y, z) {})([1, 2, 3]);\n * ```\n *\n * @param {Function} callback\n *\n * @returns {Function}\n */\nfunction spread(callback) {\n return function wrap(arr) {\n return callback.apply(null, arr);\n };\n}\n;// CONCATENATED MODULE: ./node_modules/axios/lib/helpers/isAxiosError.js\n\n\n\n\n/**\n * Determines whether the payload is an error thrown by Axios\n *\n * @param {*} payload The value to test\n *\n * @returns {boolean} True if the payload is an error thrown by Axios, otherwise false\n */\nfunction isAxiosError(payload) {\n return utils.isObject(payload) && payload.isAxiosError === true;\n}\n;// CONCATENATED MODULE: ./node_modules/axios/lib/helpers/HttpStatusCode.js\nconst HttpStatusCode = {\n Continue: 100,\n SwitchingProtocols: 101,\n Processing: 102,\n EarlyHints: 103,\n Ok: 200,\n Created: 201,\n Accepted: 202,\n NonAuthoritativeInformation: 203,\n NoContent: 204,\n ResetContent: 205,\n PartialContent: 206,\n MultiStatus: 207,\n AlreadyReported: 208,\n ImUsed: 226,\n MultipleChoices: 300,\n MovedPermanently: 301,\n Found: 302,\n SeeOther: 303,\n NotModified: 304,\n UseProxy: 305,\n Unused: 306,\n TemporaryRedirect: 307,\n PermanentRedirect: 308,\n BadRequest: 400,\n Unauthorized: 401,\n PaymentRequired: 402,\n Forbidden: 403,\n NotFound: 404,\n MethodNotAllowed: 405,\n NotAcceptable: 406,\n ProxyAuthenticationRequired: 407,\n RequestTimeout: 408,\n Conflict: 409,\n Gone: 410,\n LengthRequired: 411,\n PreconditionFailed: 412,\n PayloadTooLarge: 413,\n UriTooLong: 414,\n UnsupportedMediaType: 415,\n RangeNotSatisfiable: 416,\n ExpectationFailed: 417,\n ImATeapot: 418,\n MisdirectedRequest: 421,\n UnprocessableEntity: 422,\n Locked: 423,\n FailedDependency: 424,\n TooEarly: 425,\n UpgradeRequired: 426,\n PreconditionRequired: 428,\n TooManyRequests: 429,\n RequestHeaderFieldsTooLarge: 431,\n UnavailableForLegalReasons: 451,\n InternalServerError: 500,\n NotImplemented: 501,\n BadGateway: 502,\n ServiceUnavailable: 503,\n GatewayTimeout: 504,\n HttpVersionNotSupported: 505,\n VariantAlsoNegotiates: 506,\n InsufficientStorage: 507,\n LoopDetected: 508,\n NotExtended: 510,\n NetworkAuthenticationRequired: 511\n};\nObject.entries(HttpStatusCode).forEach(([key, value]) => {\n HttpStatusCode[value] = key;\n});\n/* harmony default export */ var helpers_HttpStatusCode = (HttpStatusCode);\n;// CONCATENATED MODULE: ./node_modules/axios/lib/axios.js\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/**\n * Create an instance of Axios\n *\n * @param {Object} defaultConfig The default config for the instance\n *\n * @returns {Axios} A new instance of Axios\n */\nfunction createInstance(defaultConfig) {\n const context = new core_Axios(defaultConfig);\n const instance = bind(core_Axios.prototype.request, context);\n\n // Copy axios.prototype to instance\n utils.extend(instance, core_Axios.prototype, context, {\n allOwnKeys: true\n });\n\n // Copy context to instance\n utils.extend(instance, context, null, {\n allOwnKeys: true\n });\n\n // Factory for creating new instances\n instance.create = function create(instanceConfig) {\n return createInstance(mergeConfig(defaultConfig, instanceConfig));\n };\n return instance;\n}\n\n// Create the default instance to be exported\nconst axios = createInstance(lib_defaults);\n\n// Expose Axios class to allow class inheritance\naxios.Axios = core_Axios;\n\n// Expose Cancel & CancelToken\naxios.CanceledError = cancel_CanceledError;\naxios.CancelToken = cancel_CancelToken;\naxios.isCancel = isCancel;\naxios.VERSION = VERSION;\naxios.toFormData = helpers_toFormData;\n\n// Expose AxiosError class\naxios.AxiosError = core_AxiosError;\n\n// alias for CanceledError for backward compatibility\naxios.Cancel = axios.CanceledError;\n\n// Expose all/spread\naxios.all = function all(promises) {\n return Promise.all(promises);\n};\naxios.spread = spread;\n\n// Expose isAxiosError\naxios.isAxiosError = isAxiosError;\n\n// Expose mergeConfig\naxios.mergeConfig = mergeConfig;\naxios.AxiosHeaders = core_AxiosHeaders;\naxios.formToJSON = thing => helpers_formDataToJSON(utils.isHTMLForm(thing) ? new FormData(thing) : thing);\naxios.getAdapter = adapters.getAdapter;\naxios.HttpStatusCode = helpers_HttpStatusCode;\naxios.default = axios;\n\n// this module should only have a default export\n/* harmony default export */ var lib_axios = (axios);\n;// CONCATENATED MODULE: ./src/components/http/index.js\n\n\n\n\n\n\n\n\n\nvar _axios = /*#__PURE__*/new WeakMap();\nvar _requestCount = /*#__PURE__*/new WeakMap();\nvar _errorTipsCount = /*#__PURE__*/new WeakMap();\nvar _loadingInstance = /*#__PURE__*/new WeakMap();\nvar _config = /*#__PURE__*/new WeakMap();\nclass http_Http {\n constructor(options) {\n _classPrivateFieldInitSpec(this, _axios, void 0);\n _classPrivateFieldInitSpec(this, _requestCount, 0);\n // 请求次数\n _classPrivateFieldInitSpec(this, _errorTipsCount, 0);\n _classPrivateFieldInitSpec(this, _loadingInstance, null);\n _classPrivateFieldInitSpec(this, _config, {\n baseURL: '',\n timeout: 60 * 1000,\n withCredentials: false,\n successCode: 200,\n errorCode: 500\n });\n for (const k in _classPrivateFieldGet2(_config, this)) {\n if (options[k]) {\n _classPrivateFieldGet2(_config, this)[k] = options[k];\n }\n }\n lib_axios.defaults.headers['Content-Type'] = 'application/json;charset=UTF-8';\n lib_axios.defaults.headers['Accept'] = 'application/json';\n _classPrivateFieldSet2(_axios, this, lib_axios.create(_classPrivateFieldGet2(_config, this)));\n _classPrivateFieldGet2(_axios, this).interceptors.request.use(config => {\n var _this$requestCount, _this$requestCount2;\n if (!config.params) {\n config.params = {};\n }\n if (_classPrivateFieldGet2(_requestCount, this) == 0) {\n _classPrivateFieldSet2(_loadingInstance, this, loading());\n }\n _classPrivateFieldSet2(_requestCount, this, (_this$requestCount = _classPrivateFieldGet2(_requestCount, this), _this$requestCount2 = _this$requestCount++, _this$requestCount)), _this$requestCount2;\n config.headers.authorization = localStorage.getItem('token');\n return config;\n }, error => {\n return Promise.reject(error);\n });\n _classPrivateFieldGet2(_axios, this).interceptors.response.use(response => {\n var _this$requestCount3, _this$requestCount4;\n _classPrivateFieldSet2(_requestCount, this, (_this$requestCount3 = _classPrivateFieldGet2(_requestCount, this), _this$requestCount4 = _this$requestCount3--, _this$requestCount3)), _this$requestCount4;\n if (_classPrivateFieldGet2(_requestCount, this) === 0) {\n _classPrivateFieldSet2(_errorTipsCount, this, 0);\n _classPrivateFieldGet2(_loadingInstance, this).close();\n }\n return response.data;\n }, error => {\n var _this$requestCount5, _this$requestCount6;\n _classPrivateFieldSet2(_requestCount, this, (_this$requestCount5 = _classPrivateFieldGet2(_requestCount, this), _this$requestCount6 = _this$requestCount5--, _this$requestCount5)), _this$requestCount6;\n if (_classPrivateFieldGet2(_requestCount, this) === 0) {\n _classPrivateFieldGet2(_loadingInstance, this).close();\n }\n return Promise.reject(error);\n });\n }\n _handleResult(success, err, res) {\n if (!res) {\n return;\n }\n if (res.code === _classPrivateFieldGet2(_config, this).successCode) {\n if (typeof success === 'function') {\n success(res);\n }\n } else {\n if (_classPrivateFieldGet2(_errorTipsCount, this) === 0) {\n var _this$errorTipsCount, _this$errorTipsCount2;\n _classPrivateFieldSet2(_errorTipsCount, this, (_this$errorTipsCount = _classPrivateFieldGet2(_errorTipsCount, this), _this$errorTipsCount2 = _this$errorTipsCount++, _this$errorTipsCount)), _this$errorTipsCount2;\n }\n if (res.code === 401) {\n sessionStorage.clear();\n } else if (res.code === _classPrivateFieldGet2(_config, this).errorCode) {\n if (typeof err === 'function') {\n err(res);\n } else {\n error(res.msg);\n }\n } else {\n if (typeof err === 'function') {\n err(res);\n }\n }\n }\n }\n post(url, params, success, err) {\n _classPrivateFieldGet2(_axios, this).post(url, params).then(res => {\n this._handleResult(success, err, res);\n });\n }\n update(url, params, success, err) {\n _classPrivateFieldGet2(_axios, this).update(url, params).then(res => {\n this._handleResult(success, err, res);\n });\n }\n get(url, params, success, err) {\n _classPrivateFieldGet2(_axios, this).get(url, {\n params: params\n }).then(res => {\n this._handleResult(success, err, res);\n });\n }\n delete(url, params, success, err) {\n _classPrivateFieldGet2(_axios, this).delete(url, {\n params: params\n }).then(res => {\n this._handleResult(success, err, res);\n });\n }\n downLoad(url, params = {}) {\n _classPrivateFieldGet2(_axios, this).post(url, params, {\n 'responseType': 'blob'\n }).then(res => {\n if (res) {\n let fileName = params.fileName;\n if (!fileName) {\n fileName = res.headers['content-disposition'].split('filename=')[1].replace(/\"/g, '');\n }\n const blob = new Blob([res.data], {\n type: 'application/octet-stream;charset=UTF-8'\n });\n const link = document.createElement('a');\n link.style.display = 'none';\n link.href = window.URL.createObjectURL(blob);\n link.download = decodeURIComponent(fileName);\n link.click();\n window.URL.revokeObjectURL(link.href);\n }\n });\n }\n}\n;// CONCATENATED MODULE: ./src/components/index.js\n__webpack_require__(3472);\n\n\n\n\n\n\nconst coms = [Index, page_table_Index, dialog_Index, card_Index, tree_Index];\nconst install = function (Vue) {\n coms.forEach(com => {\n Vue.component(com.name, com);\n });\n};\n\n// 导出组件\n/* harmony default export */ var components = (install);\nclass Http extends http_Http {\n constructor(options) {\n super(options);\n }\n}\n;// CONCATENATED MODULE: ./node_modules/@vue/cli-service/lib/commands/build/entry-lib.js\n\n\n/* harmony default export */ var entry_lib = (components);\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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RUFDbEI7QUFDSixDOztBQ3JCd0I7QUFDQTtBQUN4Qiw4Q0FBZSxVQUFHO0FBQ0kiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly92dWUyLy4vbm9kZV9tb2R1bGVzL0B2dWUvY2xpLXNlcnZpY2UvbGliL2NvbW1hbmRzL2J1aWxkL3NldFB1YmxpY1BhdGguanM/NjljYiIsIndlYnBhY2s6Ly92dWUyLy4vc3JjL2NvbXBvbmVudHMvcGFnaW5hdGlvbi9JbmRleC52dWU/MjczMyIsIndlYnBhY2s6Ly92dWUyL3NyYy9jb21wb25lbnRzL3BhZ2luYXRpb24vSW5kZXgudnVlPzNjNWUiLCJ3ZWJwYWNrOi8vdnVlMi8uL3NyYy9jb21wb25lbnRzL3BhZ2luYXRpb24vSW5kZXgudnVlPzgyYWYiLCJ3ZWJwYWNrOi8vdnVlMi8uL3NyYy9jb21wb25lbnRzL3BhZ2luYXRpb24vSW5kZXgudnVlP2Q0ZDAiLCJ3ZWJwYWNrOi8vdnVlMi8uL3NyYy9jb21wb25lbnRzL3BhZ2luYXRpb24vSW5kZXgudnVlP2U4MjgiLCJ3ZWJwYWNrOi8vdnVlMi8uL25vZGVfbW9kdWxlcy9AdnVlL3Z1ZS1sb2FkZXItdjE1L2xpYi9ydW50aW1lL2NvbXBvbmVudE5vcm1hbGl6ZXIuanM/MmY4NSIsIndlYnBhY2s6Ly92dWUyLy4vc3JjL2NvbXBvbmVudHMvcGFnaW5hdGlvbi9JbmRleC52dWU/ZmIxZCIsIndlYnBhY2s6Ly92dWUyLy4vc3JjL2NvbXBvbmVudHMvcGFnZS10YWJsZS9JbmRleC52dWU/MDhiYSIsIndlYnBhY2s6Ly92dWUyL3NyYy9jb21wb25lbnRzL3BhZ2UtdGFibGUvSW5kZXgudnVlPzVkMDMiLCJ3ZWJwYWNrOi8vdnVlMi8uL3NyYy9jb21wb25lbnRzL3BhZ2UtdGFibGUvSW5kZXgudnVlPzc3NGEiLCJ3ZWJwYWNrOi8vdnVlMi8uL3NyYy9jb21wb25lbnRzL3BhZ2UtdGFibGUvSW5kZXgudnVlPzQwZjgiLCJ3ZWJwYWNrOi8vdnVlMi8uL3NyYy9jb21wb25lbnRzL3BhZ2UtdGFibGUvSW5kZXgudnVlPzc0ZGYiLCJ3ZWJwYWNrOi8vdnVlMi8uL3NyYy9jb21wb25lbnRzL3BhZ2UtdGFibGUvSW5kZXgudnVlPzM4YTAiLCJ3ZWJwYWNrOi8vdnVlMi8uL3NyYy9jb21wb25lbnRzL2RpYWxvZy9JbmRleC52dWU/MGU3MSIsIndlYnBhY2s6Ly92dWUyLy4vc3JjL2NvbXBvbmVudHMvZGlhbG9nL2RpYWxvZy1kcmFnLmpzPzVlYmQiLCJ3ZWJwYWNrOi8vdnVlMi9zcmMvY29tcG9uZW50cy9kaWFsb2cvSW5kZXgudnVlPzRkYjYiLCJ3ZWJwYWNrOi8vdnVlMi8uL3NyYy9jb21wb25lbnRzL2RpYWxvZy9JbmRleC52dWU/MjBlNyIsIndlYnBhY2s6Ly92dWUyLy4vc3JjL2NvbXBvbmVudHMvZGlhbG9nL0luZGV4LnZ1ZT84Nzc0Iiwid2VicGFjazovL3Z1ZTIvLi9zcmMvY29tcG9uZW50cy9kaWFsb2cvSW5kZXgudnVlP2IzOWYiLCJ3ZWJwYWNrOi8vdnVlMi8uL3NyYy9jb21wb25lbnRzL2RpYWxvZy9JbmRleC52dWU/NjExOCIsIndlYnBhY2s6Ly92dWUyLy4vc3JjL2NvbXBvbmVudHMvY2FyZC9JbmRleC52dWU/ZTdmYSIsIndlYnBhY2s6Ly92dWUyL3NyYy9jb21wb25lbnRzL2NhcmQvSW5kZXgudnVlP2MxZmIiLCJ3ZWJwYWNrOi8vdnVlMi8uL3NyYy9jb21wb25lbnRzL2NhcmQvSW5kZXgudnVlPzMwYmIiLCJ3ZWJwYWNrOi8vdnVlMi8uL3NyYy9jb21wb25lbnRzL2NhcmQvSW5kZXgudnVlP2U5NTgiLCJ3ZWJwYWNrOi8vdnVlMi8uL3NyYy9jb21wb25lbnRzL2NhcmQvSW5kZXgudnVlP2YxMmQiLCJ3ZWJwYWNrOi8vdnVlMi8uL3NyYy9jb21wb25lbnRzL2NhcmQvSW5kZXgudnVlP2YzMzUiLCJ3ZWJwYWNrOi8vdnVlMi8uL3NyYy9jb21wb25lbnRzL3RyZWUvSW5kZXgudnVlPzkwOWMiLCJ3ZWJwYWNrOi8vdnVlMi8uL3NyYy9jb21wb25lbnRzL3RyZWUvdHJlZS5qcz80MmM2Iiwid2VicGFjazovL3Z1ZTIvc3JjL2NvbXBvbmVudHMvdHJlZS9JbmRleC52dWU/YmY2NiIsIndlYnBhY2s6Ly92dWUyLy4vc3JjL2NvbXBvbmVudHMvdHJlZS9JbmRleC52dWU/MTU0YiIsIndlYnBhY2s6Ly92dWUyLy4vc3JjL2NvbXBvbmVudHMvdHJlZS9JbmRleC52dWU/ZTZiMCIsIndlYnBhY2s6Ly92dWUyLy4vc3JjL2NvbXBvbmVudHMvdHJlZS9JbmRleC52dWU/YThkMiIsIndlYnBhY2s6Ly92dWUyLy4vc3JjL2NvbXBvbmVudHMvdHJlZS9JbmRleC52dWU/N2EwMSIsIndlYnBhY2s6Ly92dWUyLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NoZWNrUHJpdmF0ZVJlZGVjbGFyYXRpb24uanM/Yjg1ZiIsIndlYnBhY2s6Ly92dWUyLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWMuanM/Y2ZkYSIsIndlYnBhY2s6Ly92dWUyLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2Fzc2VydENsYXNzQnJhbmQuanM/MTlmOCIsIndlYnBhY2s6Ly92dWUyLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NsYXNzUHJpdmF0ZUZpZWxkU2V0Mi5qcz80NGJmIiwid2VicGFjazovL3Z1ZTIvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY2xhc3NQcml2YXRlRmllbGRHZXQyLmpzPzkyOWUiLCJ3ZWJwYWNrOi8vdnVlMi8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9iaW5kLmpzPzRiZWEiLCJ3ZWJwYWNrOi8vdnVlMi8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvdXRpbHMuanM/YzllYiIsIndlYnBhY2s6Ly92dWUyLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9jb3JlL0F4aW9zRXJyb3IuanM/MjAyNyIsIndlYnBhY2s6Ly92dWUyLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL251bGwuanM/MWE5NCIsIndlYnBhY2s6Ly92dWUyLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL3RvRm9ybURhdGEuanM/OWJhMyIsIndlYnBhY2s6Ly92dWUyLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL0F4aW9zVVJMU2VhcmNoUGFyYW1zLmpzPzkzZTIiLCJ3ZWJwYWNrOi8vdnVlMi8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9idWlsZFVSTC5qcz9jMTc4Iiwid2VicGFjazovL3Z1ZTIvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvSW50ZXJjZXB0b3JNYW5hZ2VyLmpzP2M3OTIiLCJ3ZWJwYWNrOi8vdnVlMi8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvZGVmYXVsdHMvdHJhbnNpdGlvbmFsLmpzPzI3YTQiLCJ3ZWJwYWNrOi8vdnVlMi8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvcGxhdGZvcm0vYnJvd3Nlci9jbGFzc2VzL1VSTFNlYXJjaFBhcmFtcy5qcz9hMGVkIiwid2VicGFjazovL3Z1ZTIvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL3BsYXRmb3JtL2Jyb3dzZXIvY2xhc3Nlcy9Gb3JtRGF0YS5qcz8xZGI5Iiwid2VicGFjazovL3Z1ZTIvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL3BsYXRmb3JtL2Jyb3dzZXIvY2xhc3Nlcy9CbG9iLmpzPzZkNzgiLCJ3ZWJwYWNrOi8vdnVlMi8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvcGxhdGZvcm0vYnJvd3Nlci9pbmRleC5qcz9iMmU0Iiwid2VicGFjazovL3Z1ZTIvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL3BsYXRmb3JtL2NvbW1vbi91dGlscy5qcz9iZjhjIiwid2VicGFjazovL3Z1ZTIvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL3BsYXRmb3JtL2luZGV4LmpzPzc4ZjEiLCJ3ZWJwYWNrOi8vdnVlMi8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy90b1VSTEVuY29kZWRGb3JtLmpzPzhmZTkiLCJ3ZWJwYWNrOi8vdnVlMi8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9mb3JtRGF0YVRvSlNPTi5qcz9mNDM3Iiwid2VicGFjazovL3Z1ZTIvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2RlZmF1bHRzL2luZGV4LmpzP2ZmMTAiLCJ3ZWJwYWNrOi8vdnVlMi8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9wYXJzZUhlYWRlcnMuanM/NTRlOSIsIndlYnBhY2s6Ly92dWUyLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9jb3JlL0F4aW9zSGVhZGVycy5qcz85NTk3Iiwid2VicGFjazovL3Z1ZTIvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvdHJhbnNmb3JtRGF0YS5qcz83NjYyIiwid2VicGFjazovL3Z1ZTIvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NhbmNlbC9pc0NhbmNlbC5qcz9jMTdhIiwid2VicGFjazovL3Z1ZTIvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NhbmNlbC9DYW5jZWxlZEVycm9yLmpzPzY4YTQiLCJ3ZWJwYWNrOi8vdnVlMi8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvY29yZS9zZXR0bGUuanM/ODc2OCIsIndlYnBhY2s6Ly92dWUyLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL2Nvb2tpZXMuanM/MWQzZiIsIndlYnBhY2s6Ly92dWUyLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL2lzQWJzb2x1dGVVUkwuanM/YTIyNyIsIndlYnBhY2s6Ly92dWUyLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL2NvbWJpbmVVUkxzLmpzPzZiYzYiLCJ3ZWJwYWNrOi8vdnVlMi8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvY29yZS9idWlsZEZ1bGxQYXRoLmpzP2YwMmQiLCJ3ZWJwYWNrOi8vdnVlMi8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9pc1VSTFNhbWVPcmlnaW4uanM/ODc5NSIsIndlYnBhY2s6Ly92dWUyLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL3BhcnNlUHJvdG9jb2wuanM/OWZhYyIsIndlYnBhY2s6Ly92dWUyLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL3NwZWVkb21ldGVyLmpzPzU5YzAiLCJ3ZWJwYWNrOi8vdnVlMi8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvYWRhcHRlcnMveGhyLmpzPzFhNWMiLCJ3ZWJwYWNrOi8vdnVlMi8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvYWRhcHRlcnMvYWRhcHRlcnMuanM/NzgyNSIsIndlYnBhY2s6Ly92dWUyLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9jb3JlL2Rpc3BhdGNoUmVxdWVzdC5qcz80ZGM5Iiwid2VicGFjazovL3Z1ZTIvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvbWVyZ2VDb25maWcuanM/YmQxMyIsIndlYnBhY2s6Ly92dWUyLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9lbnYvZGF0YS5qcz8xMTBmIiwid2VicGFjazovL3Z1ZTIvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvdmFsaWRhdG9yLmpzPzAxMzIiLCJ3ZWJwYWNrOi8vdnVlMi8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvY29yZS9BeGlvcy5qcz8yOWZiIiwid2VicGFjazovL3Z1ZTIvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NhbmNlbC9DYW5jZWxUb2tlbi5qcz83MmM4Iiwid2VicGFjazovL3Z1ZTIvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvc3ByZWFkLmpzPzI3MjkiLCJ3ZWJwYWNrOi8vdnVlMi8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9pc0F4aW9zRXJyb3IuanM/YmQ5ZCIsIndlYnBhY2s6Ly92dWUyLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL0h0dHBTdGF0dXNDb2RlLmpzP2M2ZjMiLCJ3ZWJwYWNrOi8vdnVlMi8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvYXhpb3MuanM/ZmFkNiIsIndlYnBhY2s6Ly92dWUyLy4vc3JjL2NvbXBvbmVudHMvaHR0cC9pbmRleC5qcz9jYzZhIiwid2VicGFjazovL3Z1ZTIvLi9zcmMvY29tcG9uZW50cy9pbmRleC5qcz8xNTY4Iiwid2VicGFjazovL3Z1ZTIvLi9ub2RlX21vZHVsZXMvQHZ1ZS9jbGktc2VydmljZS9saWIvY29tbWFuZHMvYnVpbGQvZW50cnktbGliLmpzPzhhOTciXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tdmFyICovXG4vLyBUaGlzIGZpbGUgaXMgaW1wb3J0ZWQgaW50byBsaWIvd2MgY2xpZW50IGJ1bmRsZXMuXG5cbmlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICB2YXIgY3VycmVudFNjcmlwdCA9IHdpbmRvdy5kb2N1bWVudC5jdXJyZW50U2NyaXB0XG4gIGlmIChwcm9jZXNzLmVudi5ORUVEX0NVUlJFTlRTQ1JJUFRfUE9MWUZJTEwpIHtcbiAgICB2YXIgZ2V0Q3VycmVudFNjcmlwdCA9IHJlcXVpcmUoJ0Bzb2RhL2dldC1jdXJyZW50LXNjcmlwdCcpXG4gICAgY3VycmVudFNjcmlwdCA9IGdldEN1cnJlbnRTY3JpcHQoKVxuXG4gICAgLy8gZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIGJlY2F1c2UgcHJldmlvdXNseSB3ZSBkaXJlY3RseSBpbmNsdWRlZCB0aGUgcG9seWZpbGxcbiAgICBpZiAoISgnY3VycmVudFNjcmlwdCcgaW4gZG9jdW1lbnQpKSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZG9jdW1lbnQsICdjdXJyZW50U2NyaXB0JywgeyBnZXQ6IGdldEN1cnJlbnRTY3JpcHQgfSlcbiAgICB9XG4gIH1cblxuICB2YXIgc3JjID0gY3VycmVudFNjcmlwdCAmJiBjdXJyZW50U2NyaXB0LnNyYy5tYXRjaCgvKC4rXFwvKVteL10rXFwuanMoXFw/LiopPyQvKVxuICBpZiAoc3JjKSB7XG4gICAgX193ZWJwYWNrX3B1YmxpY19wYXRoX18gPSBzcmNbMV0gLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICB9XG59XG5cbi8vIEluZGljYXRlIHRvIHdlYnBhY2sgdGhhdCB0aGlzIGZpbGUgY2FuIGJlIGNvbmNhdGVuYXRlZFxuZXhwb3J0IGRlZmF1bHQgbnVsbFxuIiwidmFyIHJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpe3ZhciBfdm09dGhpcyxfYz1fdm0uX3NlbGYuX2M7cmV0dXJuIChfdm0udG90YWw+MCk/X2MoJ2RpdicsW19jKCdlbC1wYWdpbmF0aW9uJyxfdm0uX2Ioe2F0dHJzOntcImJhY2tncm91bmRcIjpcIlwiLFwiY3VycmVudC1wYWdlXCI6X3ZtLmN1cnJlbnRQYWdlLFwicGFnZS1zaXplXCI6X3ZtLnBhZ2VTaXplLFwicGFnZS1zaXplc1wiOl92bS5wYWdlU2l6ZXMsXCJ0b3RhbFwiOl92bS50b3RhbCxcImxheW91dFwiOlwicHJldiwgcGFnZXIsIG5leHRcIn0sb246e1wic2l6ZS1jaGFuZ2VcIjpfdm0uaGFuZGxlU2l6ZUNoYW5nZSxcImN1cnJlbnQtY2hhbmdlXCI6X3ZtLmhhbmRsZUN1cnJlbnRDaGFuZ2V9fSwnZWwtcGFnaW5hdGlvbicsX3ZtLiRhdHRycyxmYWxzZSkpXSwxKTpfdm0uX2UoKVxufVxudmFyIHN0YXRpY1JlbmRlckZucyA9IFtdXG5cbmV4cG9ydCB7IHJlbmRlciwgc3RhdGljUmVuZGVyRm5zIH0iLCI8dGVtcGxhdGU+XHJcbiAgICA8ZGl2IHYtaWY9XCJ0b3RhbD4wXCI+XHJcbiAgICAgICAgPGVsLXBhZ2luYXRpb25cclxuICAgICAgICAgICAgYmFja2dyb3VuZCBcclxuICAgICAgICAgICAgOmN1cnJlbnQtcGFnZT1cImN1cnJlbnRQYWdlXCJcclxuICAgICAgICAgICAgOnBhZ2Utc2l6ZT1cInBhZ2VTaXplXCJcclxuICAgICAgICAgICAgOnBhZ2Utc2l6ZXM9XCJwYWdlU2l6ZXNcIlxyXG4gICAgICAgICAgICA6dG90YWw9XCJ0b3RhbFwiXHJcbiAgICAgICAgICAgIGxheW91dD1cInByZXYsIHBhZ2VyLCBuZXh0XCJcclxuICAgICAgICAgICAgdi1iaW5kPVwiJGF0dHJzXCJcclxuICAgICAgICAgICAgQHNpemUtY2hhbmdlPVwiaGFuZGxlU2l6ZUNoYW5nZVwiXHJcbiAgICAgICAgICAgIEBjdXJyZW50LWNoYW5nZT1cImhhbmRsZUN1cnJlbnRDaGFuZ2VcIlxyXG4gICAgICAgIC8+XHJcbiAgICA8L2Rpdj5cclxuPC90ZW1wbGF0ZT5cclxuXHJcbjxzY3JpcHQ+XHJcbiAgICBleHBvcnQgZGVmYXVsdCB7XHJcbiAgICAgICAgbmFtZTogJ1BhZ2luYXRpb24nLFxyXG4gICAgICAgIHByb3BzOiB7XHJcbiAgICAgICAgICAgIHRvdGFsOiB7XHJcbiAgICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIHR5cGU6IE51bWJlcixcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IDBcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgcGFnZToge1xyXG4gICAgICAgICAgICAgICAgdHlwZTogTnVtYmVyLFxyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDogMVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBsaW1pdDoge1xyXG4gICAgICAgICAgICAgICAgdHlwZTogTnVtYmVyLFxyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDogMjBcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgcGFnZVNpemVzOiB7XHJcbiAgICAgICAgICAgICAgICB0eXBlOiBBcnJheSxcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsxMCwgMTUsIDIwLCAzMCwgNTBdXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgfSxcclxuICAgICAgICBjb21wdXRlZDoge1xyXG4gICAgICAgICAgICBjdXJyZW50UGFnZToge1xyXG4gICAgICAgICAgICAgICAgZ2V0KCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnBhZ2VcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBzZXQodmFsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kZW1pdCgndXBkYXRlOnBhZ2UnLCB2YWwpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHBhZ2VTaXplOiB7XHJcbiAgICAgICAgICAgICAgICBnZXQoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubGltaXRcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBzZXQodmFsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kZW1pdCgndXBkYXRlOmxpbWl0JywgdmFsKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB0b3RhbENvdW50OiB7XHJcbiAgICAgICAgICAgICAgICBnZXQoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudG90YWxcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBzZXQodmFsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kZW1pdCgndXBkYXRlOnRvdGFsJywgdmFsKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBtZXRob2RzOiB7XHJcbiAgICAgICAgICAgIGhhbmRsZVNpemVDaGFuZ2UodmFsKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLiRlbWl0KCdwYWdpbmF0aW9uJywgeyBwYWdlOiB0aGlzLmN1cnJlbnRQYWdlLCBsaW1pdDogdmFsIH0pXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGhhbmRsZUN1cnJlbnRDaGFuZ2UodmFsKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLiRlbWl0KCdwYWdpbmF0aW9uJywgeyBwYWdlOiB2YWwsIGxpbWl0OiB0aGlzLnBhZ2VTaXplIH0pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbjwvc2NyaXB0PlxyXG5cclxuPHN0eWxlIGxhbmc9XCJzY3NzXCIgc2NvcGVkPlxyXG4uZWwtcGFnaW5hdGlvbntcclxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcclxuICAgIG1hcmdpbi10b3A6IDIwcHg7XHJcbn1cclxuPC9zdHlsZT4iLCJpbXBvcnQgbW9kIGZyb20gXCItIS4uLy4uLy4uL25vZGVfbW9kdWxlcy90aHJlYWQtbG9hZGVyL2Rpc3QvY2pzLmpzIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliL2luZGV4LmpzPz9jbG9uZWRSdWxlU2V0LTQwLnVzZVsxXSEuLi8uLi8uLi9ub2RlX21vZHVsZXMvQHZ1ZS92dWUtbG9hZGVyLXYxNS9saWIvaW5kZXguanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL0luZGV4LnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qc1wiOyBleHBvcnQgZGVmYXVsdCBtb2Q7IGV4cG9ydCAqIGZyb20gXCItIS4uLy4uLy4uL25vZGVfbW9kdWxlcy90aHJlYWQtbG9hZGVyL2Rpc3QvY2pzLmpzIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliL2luZGV4LmpzPz9jbG9uZWRSdWxlU2V0LTQwLnVzZVsxXSEuLi8uLi8uLi9ub2RlX21vZHVsZXMvQHZ1ZS92dWUtbG9hZGVyLXYxNS9saWIvaW5kZXguanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL0luZGV4LnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qc1wiIiwiLy8gZXh0cmFjdGVkIGJ5IG1pbmktY3NzLWV4dHJhY3QtcGx1Z2luXG5leHBvcnQge307IiwiZXhwb3J0ICogZnJvbSBcIi0hLi4vLi4vLi4vbm9kZV9tb2R1bGVzL21pbmktY3NzLWV4dHJhY3QtcGx1Z2luL2Rpc3QvbG9hZGVyLmpzPz9jbG9uZWRSdWxlU2V0LTIyLnVzZVswXSEuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcz8/Y2xvbmVkUnVsZVNldC0yMi51c2VbMV0hLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0B2dWUvdnVlLWxvYWRlci12MTUvbGliL2xvYWRlcnMvc3R5bGVQb3N0TG9hZGVyLmpzIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9wb3N0Y3NzLWxvYWRlci9kaXN0L2Nqcy5qcz8/Y2xvbmVkUnVsZVNldC0yMi51c2VbMl0hLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3Nhc3MtbG9hZGVyL2Rpc3QvY2pzLmpzPz9jbG9uZWRSdWxlU2V0LTIyLnVzZVszXSEuLi8uLi8uLi9ub2RlX21vZHVsZXMvQHZ1ZS92dWUtbG9hZGVyLXYxNS9saWIvaW5kZXguanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL0luZGV4LnZ1ZT92dWUmdHlwZT1zdHlsZSZpbmRleD0wJmlkPTI2YjcwZmI0JnByb2QmbGFuZz1zY3NzJnNjb3BlZD10cnVlXCIiLCIvKiBnbG9iYWxzIF9fVlVFX1NTUl9DT05URVhUX18gKi9cblxuLy8gSU1QT1JUQU5UOiBEbyBOT1QgdXNlIEVTMjAxNSBmZWF0dXJlcyBpbiB0aGlzIGZpbGUgKGV4Y2VwdCBmb3IgbW9kdWxlcykuXG4vLyBUaGlzIG1vZHVsZSBpcyBhIHJ1bnRpbWUgdXRpbGl0eSBmb3IgY2xlYW5lciBjb21wb25lbnQgbW9kdWxlIG91dHB1dCBhbmQgd2lsbFxuLy8gYmUgaW5jbHVkZWQgaW4gdGhlIGZpbmFsIHdlYnBhY2sgdXNlciBidW5kbGUuXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG5vcm1hbGl6ZUNvbXBvbmVudChcbiAgc2NyaXB0RXhwb3J0cyxcbiAgcmVuZGVyLFxuICBzdGF0aWNSZW5kZXJGbnMsXG4gIGZ1bmN0aW9uYWxUZW1wbGF0ZSxcbiAgaW5qZWN0U3R5bGVzLFxuICBzY29wZUlkLFxuICBtb2R1bGVJZGVudGlmaWVyIC8qIHNlcnZlciBvbmx5ICovLFxuICBzaGFkb3dNb2RlIC8qIHZ1ZS1jbGkgb25seSAqL1xuKSB7XG4gIC8vIFZ1ZS5leHRlbmQgY29uc3RydWN0b3IgZXhwb3J0IGludGVyb3BcbiAgdmFyIG9wdGlvbnMgPVxuICAgIHR5cGVvZiBzY3JpcHRFeHBvcnRzID09PSAnZnVuY3Rpb24nID8gc2NyaXB0RXhwb3J0cy5vcHRpb25zIDogc2NyaXB0RXhwb3J0c1xuXG4gIC8vIHJlbmRlciBmdW5jdGlvbnNcbiAgaWYgKHJlbmRlcikge1xuICAgIG9wdGlvbnMucmVuZGVyID0gcmVuZGVyXG4gICAgb3B0aW9ucy5zdGF0aWNSZW5kZXJGbnMgPSBzdGF0aWNSZW5kZXJGbnNcbiAgICBvcHRpb25zLl9jb21waWxlZCA9IHRydWVcbiAgfVxuXG4gIC8vIGZ1bmN0aW9uYWwgdGVtcGxhdGVcbiAgaWYgKGZ1bmN0aW9uYWxUZW1wbGF0ZSkge1xuICAgIG9wdGlvbnMuZnVuY3Rpb25hbCA9IHRydWVcbiAgfVxuXG4gIC8vIHNjb3BlZElkXG4gIGlmIChzY29wZUlkKSB7XG4gICAgb3B0aW9ucy5fc2NvcGVJZCA9ICdkYXRhLXYtJyArIHNjb3BlSWRcbiAgfVxuXG4gIHZhciBob29rXG4gIGlmIChtb2R1bGVJZGVudGlmaWVyKSB7XG4gICAgLy8gc2VydmVyIGJ1aWxkXG4gICAgaG9vayA9IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICAvLyAyLjMgaW5qZWN0aW9uXG4gICAgICBjb250ZXh0ID1cbiAgICAgICAgY29udGV4dCB8fCAvLyBjYWNoZWQgY2FsbFxuICAgICAgICAodGhpcy4kdm5vZGUgJiYgdGhpcy4kdm5vZGUuc3NyQ29udGV4dCkgfHwgLy8gc3RhdGVmdWxcbiAgICAgICAgKHRoaXMucGFyZW50ICYmIHRoaXMucGFyZW50LiR2bm9kZSAmJiB0aGlzLnBhcmVudC4kdm5vZGUuc3NyQ29udGV4dCkgLy8gZnVuY3Rpb25hbFxuICAgICAgLy8gMi4yIHdpdGggcnVuSW5OZXdDb250ZXh0OiB0cnVlXG4gICAgICBpZiAoIWNvbnRleHQgJiYgdHlwZW9mIF9fVlVFX1NTUl9DT05URVhUX18gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGNvbnRleHQgPSBfX1ZVRV9TU1JfQ09OVEVYVF9fXG4gICAgICB9XG4gICAgICAvLyBpbmplY3QgY29tcG9uZW50IHN0eWxlc1xuICAgICAgaWYgKGluamVjdFN0eWxlcykge1xuICAgICAgICBpbmplY3RTdHlsZXMuY2FsbCh0aGlzLCBjb250ZXh0KVxuICAgICAgfVxuICAgICAgLy8gcmVnaXN0ZXIgY29tcG9uZW50IG1vZHVsZSBpZGVudGlmaWVyIGZvciBhc3luYyBjaHVuayBpbmZlcnJlbmNlXG4gICAgICBpZiAoY29udGV4dCAmJiBjb250ZXh0Ll9yZWdpc3RlcmVkQ29tcG9uZW50cykge1xuICAgICAgICBjb250ZXh0Ll9yZWdpc3RlcmVkQ29tcG9uZW50cy5hZGQobW9kdWxlSWRlbnRpZmllcilcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gdXNlZCBieSBzc3IgaW4gY2FzZSBjb21wb25lbnQgaXMgY2FjaGVkIGFuZCBiZWZvcmVDcmVhdGVcbiAgICAvLyBuZXZlciBnZXRzIGNhbGxlZFxuICAgIG9wdGlvbnMuX3NzclJlZ2lzdGVyID0gaG9va1xuICB9IGVsc2UgaWYgKGluamVjdFN0eWxlcykge1xuICAgIGhvb2sgPSBzaGFkb3dNb2RlXG4gICAgICA/IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpbmplY3RTdHlsZXMuY2FsbChcbiAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgICAob3B0aW9ucy5mdW5jdGlvbmFsID8gdGhpcy5wYXJlbnQgOiB0aGlzKS4kcm9vdC4kb3B0aW9ucy5zaGFkb3dSb290XG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICA6IGluamVjdFN0eWxlc1xuICB9XG5cbiAgaWYgKGhvb2spIHtcbiAgICBpZiAob3B0aW9ucy5mdW5jdGlvbmFsKSB7XG4gICAgICAvLyBmb3IgdGVtcGxhdGUtb25seSBob3QtcmVsb2FkIGJlY2F1c2UgaW4gdGhhdCBjYXNlIHRoZSByZW5kZXIgZm4gZG9lc24ndFxuICAgICAgLy8gZ28gdGhyb3VnaCB0aGUgbm9ybWFsaXplclxuICAgICAgb3B0aW9ucy5faW5qZWN0U3R5bGVzID0gaG9va1xuICAgICAgLy8gcmVnaXN0ZXIgZm9yIGZ1bmN0aW9uYWwgY29tcG9uZW50IGluIHZ1ZSBmaWxlXG4gICAgICB2YXIgb3JpZ2luYWxSZW5kZXIgPSBvcHRpb25zLnJlbmRlclxuICAgICAgb3B0aW9ucy5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXJXaXRoU3R5bGVJbmplY3Rpb24oaCwgY29udGV4dCkge1xuICAgICAgICBob29rLmNhbGwoY29udGV4dClcbiAgICAgICAgcmV0dXJuIG9yaWdpbmFsUmVuZGVyKGgsIGNvbnRleHQpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGluamVjdCBjb21wb25lbnQgcmVnaXN0cmF0aW9uIGFzIGJlZm9yZUNyZWF0ZSBob29rXG4gICAgICB2YXIgZXhpc3RpbmcgPSBvcHRpb25zLmJlZm9yZUNyZWF0ZVxuICAgICAgb3B0aW9ucy5iZWZvcmVDcmVhdGUgPSBleGlzdGluZyA/IFtdLmNvbmNhdChleGlzdGluZywgaG9vaykgOiBbaG9va11cbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGV4cG9ydHM6IHNjcmlwdEV4cG9ydHMsXG4gICAgb3B0aW9uczogb3B0aW9uc1xuICB9XG59XG4iLCJpbXBvcnQgeyByZW5kZXIsIHN0YXRpY1JlbmRlckZucyB9IGZyb20gXCIuL0luZGV4LnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD0yNmI3MGZiNCZzY29wZWQ9dHJ1ZVwiXG5pbXBvcnQgc2NyaXB0IGZyb20gXCIuL0luZGV4LnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qc1wiXG5leHBvcnQgKiBmcm9tIFwiLi9JbmRleC52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anNcIlxuaW1wb3J0IHN0eWxlMCBmcm9tIFwiLi9JbmRleC52dWU/dnVlJnR5cGU9c3R5bGUmaW5kZXg9MCZpZD0yNmI3MGZiNCZwcm9kJmxhbmc9c2NzcyZzY29wZWQ9dHJ1ZVwiXG5cblxuLyogbm9ybWFsaXplIGNvbXBvbmVudCAqL1xuaW1wb3J0IG5vcm1hbGl6ZXIgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvQHZ1ZS92dWUtbG9hZGVyLXYxNS9saWIvcnVudGltZS9jb21wb25lbnROb3JtYWxpemVyLmpzXCJcbnZhciBjb21wb25lbnQgPSBub3JtYWxpemVyKFxuICBzY3JpcHQsXG4gIHJlbmRlcixcbiAgc3RhdGljUmVuZGVyRm5zLFxuICBmYWxzZSxcbiAgbnVsbCxcbiAgXCIyNmI3MGZiNFwiLFxuICBudWxsXG4gIFxuKVxuXG5leHBvcnQgZGVmYXVsdCBjb21wb25lbnQuZXhwb3J0cyIsInZhciByZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKXt2YXIgX3ZtPXRoaXMsX2M9X3ZtLl9zZWxmLl9jO3JldHVybiBfYygnZGl2Jyx7c3RhdGljQ2xhc3M6XCJwYWdlLXRhYmxlXCIsYXR0cnM6e1wiaWRcIjp0aGlzLnRhYmxlSWR9fSxbX2MoJ2Rpdicse3N0YXRpY0NsYXNzOlwidGFibGVcIn0sW19jKCdlbC1zY3JvbGxiYXInLHtzdGF0aWNTdHlsZTp7XCJoZWlnaHRcIjpcIjEwMCVcIn19LFtfYygnZWwtdGFibGUnLF92bS5fYih7cmVmOl92bS50YWJsZUlkLGF0dHJzOntcInN0cmlwZVwiOlwiXCIsXCJkYXRhXCI6X3ZtLmxpc3QsXCJyb3cta2V5XCI6X3ZtLnJvd0tleSxcImxvYWRcIjpfdm0ubG9hZCxcImhpZ2hsaWdodC1jdXJyZW50LXJvd1wiOl92bS5obGlnaHRDdXJyZW50Um93LFwiZGVmYXVsdC1leHBhbmQtYWxsXCI6X3ZtLmRlZmF1bHRFeHBhbmRBbGx9LG9uOntcInNlbGVjdFwiOl92bS5oYW5kZWxTZWxlY3Rpb25DaGFuZ2UsXCJzZWxlY3QtYWxsXCI6X3ZtLnNlbGVjdEFsbCxcInJvdy1jbGlja1wiOl92bS5oYW5kbGVSb3dDbGljayxcImV4cGFuZC1jaGFuZ2VcIjp2YWw9Pl92bS4kZW1pdCgnZXhwYW5kLWNoYW5nZScsIHZhbCl9fSwnZWwtdGFibGUnLF92bS4kYXR0cnMsZmFsc2UpLFsoX3ZtLnNob3dDaGVja0JveCk/X2MoJ2VsLXRhYmxlLWNvbHVtbicse2F0dHJzOntcInR5cGVcIjpcInNlbGVjdGlvblwiLFwid2lkdGhcIjpcIjYwcHhcIixcImFsaWduXCI6XCJjZW50ZXJcIn19KTpfdm0uX2UoKSwoX3ZtLnNvcnROdW0pP19jKCdlbC10YWJsZS1jb2x1bW4nLHthdHRyczp7XCJ0eXBlXCI6XCJpbmRleFwiLFwid2lkdGhcIjpcIjYwcHhcIixcImxhYmVsXCI6XCLluo/lj7dcIixcImFsaWduXCI6XCJjZW50ZXJcIn0sc2NvcGVkU2xvdHM6X3ZtLl91KFt7a2V5OlwiZGVmYXVsdFwiLGZuOmZ1bmN0aW9uKHNjb3BlKXtyZXR1cm4gWyhfdm0ucGFnZSk/X2MoJ3NwYW4nLFtfdm0uX3YoX3ZtLl9zKChfdm0ucGFyYW1zLnBhZ2UtMSkqX3ZtLnBhcmFtcy5saW1pdCtzY29wZS4kaW5kZXgrMSkpXSk6X2MoJ3NwYW4nLFtfdm0uX3YoX3ZtLl9zKHNjb3BlLiRpbmRleCsxKSldKV19fV0sbnVsbCxmYWxzZSwyNzg2MDA4MDIxKX0pOl92bS5fZSgpLF92bS5fdChcImRlZmF1bHRcIildLDIpXSwxKV0sMSksKF92bS5wYWdlKT9fYygnUGFnaW5hdGlvbicse2F0dHJzOntcInRvdGFsXCI6X3ZtLnRvdGFsLFwicGFnZVwiOl92bS5wYXJhbXMucGFnZSxcImxpbWl0XCI6X3ZtLnBhcmFtcy5saW1pdH0sb246e1widXBkYXRlOnBhZ2VcIjpmdW5jdGlvbigkZXZlbnQpe3JldHVybiBfdm0uJHNldChfdm0ucGFyYW1zLCBcInBhZ2VcIiwgJGV2ZW50KX0sXCJwYWdpbmF0aW9uXCI6X3ZtLmdldExpc3R9fSk6X3ZtLl9lKCldLDEpXG59XG52YXIgc3RhdGljUmVuZGVyRm5zID0gW11cblxuZXhwb3J0IHsgcmVuZGVyLCBzdGF0aWNSZW5kZXJGbnMgfSIsIjx0ZW1wbGF0ZT5cclxuICAgIDxkaXYgY2xhc3M9XCJwYWdlLXRhYmxlXCIgOmlkPVwidGhpcy50YWJsZUlkXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlXCI+XHJcbiAgICAgICAgICAgIDxlbC1zY3JvbGxiYXIgc3R5bGU9XCJoZWlnaHQ6IDEwMCVcIj5cclxuICAgICAgICAgICAgICAgIDxlbC10YWJsZVxyXG4gICAgICAgICAgICAgICAgICAgIHYtYmluZD1cIiRhdHRyc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgc3RyaXBlXHJcbiAgICAgICAgICAgICAgICAgICAgOnJlZj1cInRhYmxlSWRcIlxyXG4gICAgICAgICAgICAgICAgICAgIDpkYXRhPVwibGlzdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgOnJvdy1rZXk9XCJyb3dLZXlcIlxyXG4gICAgICAgICAgICAgICAgICAgIDpsb2FkPVwibG9hZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgOmhpZ2hsaWdodC1jdXJyZW50LXJvdz1cImhsaWdodEN1cnJlbnRSb3dcIlxyXG4gICAgICAgICAgICAgICAgICAgIEBzZWxlY3Q9XCJoYW5kZWxTZWxlY3Rpb25DaGFuZ2VcIlxyXG4gICAgICAgICAgICAgICAgICAgIEBzZWxlY3QtYWxsPVwic2VsZWN0QWxsXCJcclxuICAgICAgICAgICAgICAgICAgICA6ZGVmYXVsdC1leHBhbmQtYWxsPVwiZGVmYXVsdEV4cGFuZEFsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgQHJvdy1jbGljaz1cImhhbmRsZVJvd0NsaWNrXCJcclxuICAgICAgICAgICAgICAgICAgICBAZXhwYW5kLWNoYW5nZT1cInZhbD0+JGVtaXQoJ2V4cGFuZC1jaGFuZ2UnLCB2YWwpXCJcclxuICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgPGVsLXRhYmxlLWNvbHVtbiB2LWlmPVwic2hvd0NoZWNrQm94XCIgdHlwZT1cInNlbGVjdGlvblwiIHdpZHRoPVwiNjBweFwiIGFsaWduPVwiY2VudGVyXCI+PC9lbC10YWJsZS1jb2x1bW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPGVsLXRhYmxlLWNvbHVtbiB2LWlmPVwic29ydE51bVwiIHR5cGU9XCJpbmRleFwiIHdpZHRoPVwiNjBweFwiIGxhYmVsPVwi5bqP5Y+3XCIgYWxpZ249XCJjZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIHNsb3Qtc2NvcGU9XCJzY29wZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdi1pZj1cInBhZ2VcIj57eyhwYXJhbXMucGFnZS0xKSpwYXJhbXMubGltaXQrc2NvcGUuJGluZGV4KzF9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHYtZWxzZT57e3Njb3BlLiRpbmRleCsxfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9lbC10YWJsZS1jb2x1bW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNsb3Q+PC9zbG90PlxyXG4gICAgICAgICAgICAgICAgPC9lbC10YWJsZT5cclxuICAgICAgICAgICAgPC9lbC1zY3JvbGxiYXI+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPFBhZ2luYXRpb24gdi1pZj1cInBhZ2VcIiA6dG90YWw9XCJ0b3RhbFwiIDpwYWdlLnN5bmM9XCJwYXJhbXMucGFnZVwiIDpsaW1pdD1cInBhcmFtcy5saW1pdFwiIEBwYWdpbmF0aW9uPVwiZ2V0TGlzdFwiIC8+XHJcbiAgICA8L2Rpdj5cclxuPC90ZW1wbGF0ZT5cclxuPHNjcmlwdD5cclxuZXhwb3J0IGRlZmF1bHQge1xyXG4gICAgbmFtZTogJ1BhZ2VUYWJsZScsXHJcbiAgICBwcm9wczoge1xyXG4gICAgICAgIC8vIOiHquWumuS5ieaVsOaNrlxyXG4gICAgICAgIGRhdGE6IHtcclxuICAgICAgICAgICAgdHlwZTogQXJyYXksXHJcbiAgICAgICAgICAgIGRlZmF1bHQ6IG51bGxcclxuICAgICAgICB9LFxyXG4gICAgICAgIC8vIOivt+axguWcsOWdgFxyXG4gICAgICAgIHVybDoge1xyXG4gICAgICAgICAgICB0eXBlOiBTdHJpbmcsXHJcbiAgICAgICAgICAgIGRlZmF1bHQ6ICcnXHJcbiAgICAgICAgfSxcclxuICAgICAgICAvLyDor7fmsYLmlrnlvI9cclxuICAgICAgICBtZXRob2Q6IHtcclxuICAgICAgICAgICAgdHlwZTogU3RyaW5nLFxyXG4gICAgICAgICAgICBkZWZhdWx0OiAnZ2V0J1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgLy8g5piv5ZCm5pi+56S65bqP5Y+3XHJcbiAgICAgICAgc29ydE51bToge1xyXG4gICAgICAgICAgICB0eXBlOiBCb29sZWFuLFxyXG4gICAgICAgICAgICBkZWZhdWx0OiB0cnVlXHJcbiAgICAgICAgfSxcclxuICAgICAgICAvLyDmmK/lkKbliIbpobVcclxuICAgICAgICBwYWdlOiB7XHJcbiAgICAgICAgICAgIHR5cGU6IEJvb2xlYW4sXHJcbiAgICAgICAgICAgIGRlZmF1bHQ6IHRydWVcclxuICAgICAgICB9LFxyXG4gICAgICAgIC8vIOagkeW9ouihqOagvOaXtu+8jOaYr+WQpuWFqOmDqOWxleW8gFxyXG4gICAgICAgIGRlZmF1bHRFeHBhbmRBbGw6IHtcclxuICAgICAgICAgICAgdHlwZTogQm9vbGVhbixcclxuICAgICAgICAgICAgZGVmYXVsdDogZmFsc2VcclxuICAgICAgICB9LFxyXG4gICAgICAgIC8vIOWIneWni+ivt+axguWPguaVsFxyXG4gICAgICAgIGRlZmF1bHRQYXJhbXM6IHtcclxuICAgICAgICAgICAgdHlwZTogT2JqZWN0LFxyXG4gICAgICAgICAgICBkZWZhdWx0OiAoKT0+KHt9KVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgLy8g6buY6K6k6YCJ5Lit5pWw5o2uXHJcbiAgICAgICAgZGVmYXVsdFNlbGVjdDoge1xyXG4gICAgICAgICAgICB0eXBlOiBBcnJheSxcclxuICAgICAgICAgICAgZGVmYXVsdDogKCk9PltdXHJcbiAgICAgICAgfSxcclxuICAgICAgICByb3dLZXk6IHtcclxuICAgICAgICAgICAgdHlwZTogU3RyaW5nLFxyXG4gICAgICAgICAgICBkZWZhdWx0OiAnaWQnXHJcbiAgICAgICAgfSxcclxuICAgICAgICBobGlnaHRDdXJyZW50Um93OiB7XHJcbiAgICAgICAgICAgIHlwZTogQm9vbGVhbixcclxuICAgICAgICAgICAgZGVmYXVsdDogZmFsc2VcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAgd2F0Y2g6IHtcclxuICAgICAgICBkYXRhKG5ld1ZhbCl7XHJcbiAgICAgICAgICAgIHRoaXMubGlzdCA9IG5ld1ZhbDtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGRlZmF1bHRTZWxlY3Q6IHtcclxuICAgICAgICAgICAgaGFuZGxlcigpe1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRDaGVja2VkKCk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGRlZXA6IHRydWVcclxuICAgICAgICB9LFxyXG4gICAgICAgIGRlZmF1bHRQYXJhbXMobmV3VmFsLCBvbGRWYWwpe1xyXG4gICAgICAgICAgICBmb3IoY29uc3Qga2V5IGluIG5ld1ZhbCl7XHJcbiAgICAgICAgICAgICAgICBpZihuZXdWYWxba2V5XSAhPSBvbGRWYWxba2V5XSl7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJhbXMgPSB7cGFnZTogMSwgbGltaXQ6IDE1LCBwYXJhbTogey4uLm5ld1ZhbH19O1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0TGlzdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIGRhdGEoKXtcclxuICAgICAgICByZXR1cm57XHJcbiAgICAgICAgICAgIHNob3dDaGVja0JveDogZmFsc2UsXHJcbiAgICAgICAgICAgIHBhcmFtczoge1xyXG4gICAgICAgICAgICAgICAgcGFnZTogMSxcclxuICAgICAgICAgICAgICAgIGxpbWl0OiAxNSxcclxuICAgICAgICAgICAgICAgIHBhcmFtOiB7Li4udGhpcy5kZWZhdWx0UGFyYW1zfVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB0b3RhbDogMCxcclxuICAgICAgICAgICAgbGlzdDogW10sXHJcbiAgICAgICAgICAgIHRhYmxlSWQ6IGB0YWJsZV8ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cmluZygyLCAxNil9YCxcclxuICAgICAgICAgICAgc2VsZWN0RGF0YToge30sXHJcbiAgICAgICAgICAgIHNlbGVjdElkczogW11cclxuICAgICAgICB9O1xyXG4gICAgfSxcclxuICAgIG1vdW50ZWQoKXtcclxuICAgICAgICBpZih0aGlzLiRsaXN0ZW5lcnNbJ3NlbGVjdGlvbi1jaGFuZ2UnXSl7XHJcbiAgICAgICAgICAgIHRoaXMuc2hvd0NoZWNrQm94ID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYodGhpcy5kYXRhKXtcclxuICAgICAgICAgICAgdGhpcy5saXN0ID0gdGhpcy5kYXRhO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvcihjb25zdCBpdGVtIG9mIHRoaXMuZGVmYXVsdFNlbGVjdCl7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0RGF0YVtpdGVtW3RoaXMucm93S2V5XV0gPSBpdGVtO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmdldExpc3QoKTtcclxuICAgIH0sXHJcbiAgICBtZXRob2RzOiB7XHJcbiAgICAgICAgLy8g6I635Y+W5pWw5o2uXHJcbiAgICAgICAgZ2V0TGlzdChwYWdlT3B0aW9uKXtcclxuICAgICAgICAgICAgaWYoIXRoaXMudXJsKXtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZihwYWdlT3B0aW9uKXtcclxuICAgICAgICAgICAgICAgIHRoaXMucGFyYW1zLnBhZ2UgPSBwYWdlT3B0aW9uLnBhZ2U7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnBhcmFtcy5saW1pdCA9IHBhZ2VPcHRpb24ubGltaXQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYoIXRoaXMucGFnZSl7XHJcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5wYXJhbXMucGFnZTtcclxuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnBhcmFtcy5saW1pdDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCBzdG9yYWdlUGFyYW1zID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSh0aGlzLiRyb3V0ZS5wYXRoKTtcclxuICAgICAgICAgICAgaWYoc3RvcmFnZVBhcmFtcyl7XHJcbiAgICAgICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKHRoaXMuJHJvdXRlLnBhdGgsIEpTT04uc3RyaW5naWZ5KHRoaXMucGFyYW1zKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgc3dpdGNoKHRoaXMubWV0aG9kKXtcclxuICAgICAgICAgICAgICAgIGNhc2UgJ2dldCc6XHJcbiAgICAgICAgICAgICAgICAgICAgaHR0cC5nZXQodGhpcy51cmwsIHRoaXMucGFyYW1zLCAocmVzKT0+e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zZXREYXRhKHJlcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlICdwb3N0JzpcclxuICAgICAgICAgICAgICAgICAgICBodHRwLnBvc3QodGhpcy51cmwsIHRoaXMucGFyYW1zLCAocmVzKT0+e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zZXREYXRhKHJlcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBfc2V0RGF0YShyZXMpe1xyXG4gICAgICAgICAgICBpZih0aGlzLnBhZ2Upe1xyXG4gICAgICAgICAgICAgICAgdGhpcy5saXN0ID0gcmVzLmRhdGEucmVjb3JkcztcclxuICAgICAgICAgICAgICAgIHRoaXMudG90YWwgPSByZXMuZGF0YS50b3RhbDtcclxuICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxpc3QgPSByZXMuZGF0YTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLnNldENoZWNrZWQoKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIC8vIOiuvue9rum7mOiupOmAieS4rVxyXG4gICAgICAgIHNldENoZWNrZWQoKXtcclxuICAgICAgICAgICAgaWYodGhpcy5kZWZhdWx0U2VsZWN0Lmxlbmd0aD4wKXtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0SWRzID0gdGhpcy5kZWZhdWx0U2VsZWN0Lm1hcCgoaXRlbSk9Pml0ZW1bdGhpcy5yb3dLZXldKTtcclxuICAgICAgICAgICAgICAgIGlmKHRoaXMuc2hvd0NoZWNrQm94ICYmIHRoaXMubGlzdCl7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kbmV4dFRpY2soKCk9PntcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8g6buY6K6k6YCJ5Lit5pWw5o2uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHRoaXMuJHJlZnNbdGhpcy50YWJsZUlkXSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IoY29uc3QgaXRlbSBvZiB0aGlzLmxpc3Qpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHRoaXMuc2VsZWN0SWRzLmluY2x1ZGVzKGl0ZW1bdGhpcy5yb3dLZXldKSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJHJlZnNbdGhpcy50YWJsZUlkXS50b2dnbGVSb3dTZWxlY3Rpb24oaXRlbSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0RGF0YVtpdGVtW3RoaXMucm93S2V5XV0gPSBpdGVtO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiRyZWZzW3RoaXMudGFibGVJZF0udG9nZ2xlUm93U2VsZWN0aW9uKGl0ZW0sIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuc2VsZWN0RGF0YVtpdGVtW3RoaXMucm93S2V5XV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RJZHMgPSBbXTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0RGF0YSA9IHt9O1xyXG4gICAgICAgICAgICAgICAgaWYodGhpcy4kcmVmc1t0aGlzLnRhYmxlSWRdKXtcclxuICAgICAgICAgICAgICAgICAgICBmb3IoY29uc3QgaXRlbSBvZiB0aGlzLmxpc3Qpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiRyZWZzW3RoaXMudGFibGVJZF0udG9nZ2xlUm93U2VsZWN0aW9uKGl0ZW0sIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIC8vIOadoeS7tuafpeivolxyXG4gICAgICAgIHF1ZXJ5KHBhcmFtcz17fSl7XHJcbiAgICAgICAgICAgIGlmKE9iamVjdC5rZXlzKHBhcmFtcykubGVuZ3RoPjApe1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcGFyYW0gPSB7Li4udGhpcy5wYXJhbXMucGFyYW0sIC4uLnBhcmFtc307XHJcbiAgICAgICAgICAgICAgICB0aGlzLnBhcmFtcyA9IHsuLi50aGlzLnBhcmFtcywgcGFyYW19O1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wYXJhbXMucGFnZSA9IDE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5nZXRMaXN0KCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAvLyDngrnlh7vooYxcclxuICAgICAgICBoYW5kbGVSb3dDbGljayhyb3csIGNvbHVtbiwgZXZlbnQpe1xyXG4gICAgICAgICAgICB0aGlzLiRlbWl0KCdyb3ctY2xpY2snLCByb3csIGNvbHVtbiwgZXZlbnQpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgaGFuZGVsU2VsZWN0aW9uQ2hhbmdlKF8sIHJvdyl7XHJcbiAgICAgICAgICAgIGlmKHRoaXMuc2VsZWN0RGF0YVtyb3dbdGhpcy5yb3dLZXldXSl7XHJcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5zZWxlY3REYXRhW3Jvd1t0aGlzLnJvd0tleV1dO1xyXG4gICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0RGF0YVtyb3dbdGhpcy5yb3dLZXldXSA9IHJvdztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCBzZWxlY3Rpb25MaXN0ID0gT2JqZWN0LnZhbHVlcyh0aGlzLnNlbGVjdERhdGEpO1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdElkcyA9IHNlbGVjdGlvbkxpc3QubWFwKChpdGVtKT0+aXRlbVt0aGlzLnJvd0tleV0pO1xyXG4gICAgICAgICAgICB0aGlzLiRlbWl0KCdzZWxlY3Rpb24tY2hhbmdlJywgc2VsZWN0aW9uTGlzdCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAvLyDlhajpgIkv5YWo5LiN6YCJXHJcbiAgICAgICAgc2VsZWN0QWxsKHNlbGVjdGlvbil7XHJcbiAgICAgICAgICAgIGlmKHNlbGVjdGlvbi5sZW5ndGg+MCl7XHJcbiAgICAgICAgICAgICAgICBmb3IoY29uc3QgaXRlbSBvZiBzZWxlY3Rpb24pe1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0RGF0YVtpdGVtW3RoaXMucm93S2V5XV0gPSBpdGVtO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgIGZvcihjb25zdCBpdGVtIG9mIHRoaXMubGlzdCl7XHJcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuc2VsZWN0RGF0YVtpdGVtW3RoaXMucm93S2V5XV07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3Qgc2VsZWN0aW9uTGlzdCA9IE9iamVjdC52YWx1ZXModGhpcy5zZWxlY3REYXRhKTtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RJZHMgPSBzZWxlY3Rpb25MaXN0Lm1hcCgoaXRlbSk9Pml0ZW1bdGhpcy5yb3dLZXldKTtcclxuICAgICAgICAgICAgdGhpcy4kZW1pdCgnc2VsZWN0aW9uLWNoYW5nZScsIHNlbGVjdGlvbkxpc3QpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgc2V0Q3VycmVudChpbmRleCkge1xyXG4gICAgICAgICAgICB0aGlzLiRyZWZzW3RoaXMudGFibGVJZF0uc2V0Q3VycmVudFJvdyh0aGlzLmxpc3RbaW5kZXhdKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGdldERhdGEoKXtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubGlzdDtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGxvYWQodHJlZSwgdHJlZU5vZGUsIHJlc29sdmUpe1xyXG4gICAgICAgICAgICB0aGlzLiRlbWl0KCdsb2FkJywgdHJlZSwgdHJlZU5vZGUsIHJlc29sdmUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufTtcclxuPC9zY3JpcHQ+XHJcbjxzdHlsZSBsYW5nPVwic2Nzc1wiIHNjb3BlZD5cclxuICAgIC5wYWdlLXRhYmxle1xyXG4gICAgICAgIGhlaWdodDogMTAwJTtcclxuICAgICAgICBmbGV4OiAxIDEgYXV0bztcclxuICAgICAgICBvdmVyZmxvdy15OiBhdXRvO1xyXG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcclxuICAgICAgICAudGFibGV7XHJcbiAgICAgICAgICAgIGZsZXg6IGF1dG8gMSAxO1xyXG4gICAgICAgICAgICBvdmVyZmxvdzogYXV0bztcclxuICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvZGVlcC8uZWwtdGFibGUgdGhlYWR7XHJcbiAgICAgICAgY29sb3I6ICMzMzMzMzM7XHJcbiAgICB9XHJcbiAgICAvZGVlcC8uZWwtdGFibGUgdGguZWwtdGFibGVfX2NlbGx7XHJcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI0Y1RjdGQTtcclxuICAgIH1cclxuICAgIC9kZWVwLy5lbC10YWJsZS0tbWluaSAuZWwtdGFibGVfX2NlbGx7XHJcbiAgICAgICAgcGFkZGluZzogM3B4IDA7XHJcbiAgICB9XHJcbjwvc3R5bGU+IiwiaW1wb3J0IG1vZCBmcm9tIFwiLSEuLi8uLi8uLi9ub2RlX21vZHVsZXMvdGhyZWFkLWxvYWRlci9kaXN0L2Nqcy5qcyEuLi8uLi8uLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYi9pbmRleC5qcz8/Y2xvbmVkUnVsZVNldC00MC51c2VbMV0hLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0B2dWUvdnVlLWxvYWRlci12MTUvbGliL2luZGV4LmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9JbmRleC52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anNcIjsgZXhwb3J0IGRlZmF1bHQgbW9kOyBleHBvcnQgKiBmcm9tIFwiLSEuLi8uLi8uLi9ub2RlX21vZHVsZXMvdGhyZWFkLWxvYWRlci9kaXN0L2Nqcy5qcyEuLi8uLi8uLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYi9pbmRleC5qcz8/Y2xvbmVkUnVsZVNldC00MC51c2VbMV0hLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0B2dWUvdnVlLWxvYWRlci12MTUvbGliL2luZGV4LmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9JbmRleC52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anNcIiIsIi8vIGV4dHJhY3RlZCBieSBtaW5pLWNzcy1leHRyYWN0LXBsdWdpblxuZXhwb3J0IHt9OyIsImV4cG9ydCAqIGZyb20gXCItIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9taW5pLWNzcy1leHRyYWN0LXBsdWdpbi9kaXN0L2xvYWRlci5qcz8/Y2xvbmVkUnVsZVNldC0yMi51c2VbMF0hLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanM/P2Nsb25lZFJ1bGVTZXQtMjIudXNlWzFdIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9AdnVlL3Z1ZS1sb2FkZXItdjE1L2xpYi9sb2FkZXJzL3N0eWxlUG9zdExvYWRlci5qcyEuLi8uLi8uLi9ub2RlX21vZHVsZXMvcG9zdGNzcy1sb2FkZXIvZGlzdC9janMuanM/P2Nsb25lZFJ1bGVTZXQtMjIudXNlWzJdIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zYXNzLWxvYWRlci9kaXN0L2Nqcy5qcz8/Y2xvbmVkUnVsZVNldC0yMi51c2VbM10hLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0B2dWUvdnVlLWxvYWRlci12MTUvbGliL2luZGV4LmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9JbmRleC52dWU/dnVlJnR5cGU9c3R5bGUmaW5kZXg9MCZpZD0yZGE5MmM4MSZwcm9kJmxhbmc9c2NzcyZzY29wZWQ9dHJ1ZVwiIiwiaW1wb3J0IHsgcmVuZGVyLCBzdGF0aWNSZW5kZXJGbnMgfSBmcm9tIFwiLi9JbmRleC52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9MmRhOTJjODEmc2NvcGVkPXRydWVcIlxuaW1wb3J0IHNjcmlwdCBmcm9tIFwiLi9JbmRleC52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anNcIlxuZXhwb3J0ICogZnJvbSBcIi4vSW5kZXgudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzXCJcbmltcG9ydCBzdHlsZTAgZnJvbSBcIi4vSW5kZXgudnVlP3Z1ZSZ0eXBlPXN0eWxlJmluZGV4PTAmaWQ9MmRhOTJjODEmcHJvZCZsYW5nPXNjc3Mmc2NvcGVkPXRydWVcIlxuXG5cbi8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi9cbmltcG9ydCBub3JtYWxpemVyIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0B2dWUvdnVlLWxvYWRlci12MTUvbGliL3J1bnRpbWUvY29tcG9uZW50Tm9ybWFsaXplci5qc1wiXG52YXIgY29tcG9uZW50ID0gbm9ybWFsaXplcihcbiAgc2NyaXB0LFxuICByZW5kZXIsXG4gIHN0YXRpY1JlbmRlckZucyxcbiAgZmFsc2UsXG4gIG51bGwsXG4gIFwiMmRhOTJjODFcIixcbiAgbnVsbFxuICBcbilcblxuZXhwb3J0IGRlZmF1bHQgY29tcG9uZW50LmV4cG9ydHMiLCJ2YXIgcmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCl7dmFyIF92bT10aGlzLF9jPV92bS5fc2VsZi5fYztyZXR1cm4gX2MoJ2VsLWRpYWxvZycsX3ZtLl9iKHtkaXJlY3RpdmVzOlt7bmFtZTpcImRpYWxvZ0RyYWdcIixyYXdOYW1lOlwidi1kaWFsb2dEcmFnXCJ9XSxzdGF0aWNTdHlsZTp7XCJtYXJnaW4tdG9wXCI6XCIwXCJ9LGF0dHJzOntcInRpdGxlXCI6X3ZtLnRpdGxlLFwidmlzaWJsZVwiOl92bS5kaWFsb2dWaXNpYmxlLFwiYmVmb3JlLWNsb3NlXCI6X3ZtLmhhbmRsZUNsb3NlLFwiY2VudGVyXCI6XCJcIixcImNsb3NlLW9uLWNsaWNrLW1vZGFsXCI6ZmFsc2UsXCJzaG93LWNsb3NlXCI6X3ZtLnNob3dDbG9zZSxcImFwcGVuZC10by1ib2R5XCI6XCJcIn19LCdlbC1kaWFsb2cnLF92bS4kYXR0cnMsZmFsc2UpLFtfYygnZGl2Jyx7c3RhdGljU3R5bGU6e1wib3ZlcmZsb3cteVwiOlwiYXV0b1wiLFwib3ZlcmZsb3cteFwiOlwiaGlkZGVuXCIsXCJwb3NpdGlvblwiOlwicmVsYXRpdmVcIn0sc3R5bGU6KHttYXhIZWlnaHQ6IF92bS5tYXhIZWlnaHQsIG1pbkhlaWdodDogX3ZtLm1pbkhlaWdodH0pfSxbX3ZtLl90KFwiZGVmYXVsdFwiKV0sMiksX2MoJ2Rpdicse3N0YXRpY1N0eWxlOntcInRleHQtYWxpZ25cIjpcImNlbnRlclwifSxhdHRyczp7XCJzbG90XCI6XCJmb290ZXJcIn0sc2xvdDpcImZvb3RlclwifSxbX3ZtLl90KFwiZm9vdGVyXCIpXSwyKV0pXG59XG52YXIgc3RhdGljUmVuZGVyRm5zID0gW11cblxuZXhwb3J0IHsgcmVuZGVyLCBzdGF0aWNSZW5kZXJGbnMgfSIsIi8vIHYtZGlhbG9nRHJhZzog5by556qX5ouW5ou9XHJcbmltcG9ydCBWdWUgZnJvbSAndnVlJztcclxuVnVlLmRpcmVjdGl2ZSgnZGlhbG9nRHJhZycsIHtcclxuICAgIGJpbmQoZWwpIHtcclxuXHRcdGNvbnN0IGRpYWxvZ0hlYWRlckVsID0gZWwucXVlcnlTZWxlY3RvcignLmVsLWRpYWxvZ19faGVhZGVyJyk7XHJcblx0XHRjb25zdCBkcmFnRG9tID0gZWwucXVlcnlTZWxlY3RvcignLmVsLWRpYWxvZycpO1xyXG5cdFx0ZGlhbG9nSGVhZGVyRWwuc3R5bGUuY3Vyc29yID0gJ21vdmUnO1xyXG5cclxuXHRcdC8vIOiOt+WPluWOn+acieWxnuaApyBpZSBkb23lhYPntKAuY3VycmVudFN0eWxlIOeBq+eLkOiwt+atjCB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShkb23lhYPntKAsIG51bGwpO1xyXG5cdFx0Y29uc3Qgc3R5ID0gZHJhZ0RvbS5jdXJyZW50U3R5bGUgfHwgd2luZG93LmdldENvbXB1dGVkU3R5bGUoZHJhZ0RvbSwgbnVsbCk7XHJcblxyXG5cdFx0ZGlhbG9nSGVhZGVyRWwub25tb3VzZWRvd24gPSAoZXZlbnQpPT57XHJcblx0XHRcdC8vIOm8oOagh+aMieS4i++8jOiuoeeul+W9k+WJjeWFg+e0oOi3neemu+WPr+inhuWMuueahOi3neemu1xyXG5cdFx0XHRjb25zdCBkaXNYID0gZXZlbnQuY2xpZW50WCAtIGRpYWxvZ0hlYWRlckVsLm9mZnNldExlZnQ7XHJcblx0XHRcdGNvbnN0IGRpc1kgPSBldmVudC5jbGllbnRZIC0gZGlhbG9nSGVhZGVyRWwub2Zmc2V0VG9wO1xyXG5cclxuXHRcdFx0Ly8g6I635Y+W5Yiw55qE5YC85bimcHgg5q2j5YiZ5Yy56YWN5pu/5o2iXHJcblx0XHRcdGxldCBzdHlMPW51bGw7XHJcblx0XHRcdGxldCBzdHlUPW51bGw7XHJcblxyXG5cdFx0XHQvLyDms6jmhI/lnKhpZeS4rSDnrKzkuIDmrKHojrflj5bliLDnmoTlgLzkuLrnu4Tku7boh6rluKY1MCUg56e75Yqo5LmL5ZCO6LWL5YC85Li6cHhcclxuXHRcdFx0aWYgKHN0eS5sZWZ0LmluY2x1ZGVzKCdcXCUnKSkge1xyXG5cdFx0XHRcdHN0eUwgPSArZG9jdW1lbnQuYm9keS5jbGllbnRXaWR0aCAqICgrc3R5LmxlZnQucmVwbGFjZSgvXFwlL2csICcnKSAvIDEwMCk7XHJcblx0XHRcdFx0c3R5VCA9ICtkb2N1bWVudC5ib2R5LmNsaWVudEhlaWdodCAqICgrc3R5LnRvcC5yZXBsYWNlKC9cXCUvZywgJycpIC8gMTAwKTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRzdHlMID0gK3N0eS5sZWZ0LnJlcGxhY2UoL1xccHgvZywgJycpO1xyXG5cdFx0XHRcdHN0eVQgPSArc3R5LnRvcC5yZXBsYWNlKC9cXHB4L2csICcnKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0ZG9jdW1lbnQub25tb3VzZW1vdmUgPSBmdW5jdGlvbihlKSB7XHJcblx0XHRcdFx0Ly8g6YCa6L+H5LqL5Lu25aeU5omY77yM6K6h566X56e75Yqo55qE6Led56a7XHJcblx0XHRcdFx0Y29uc3QgbCA9IGUuY2xpZW50WCAtIGRpc1g7XHJcblx0XHRcdFx0Y29uc3QgdCA9IGUuY2xpZW50WSAtIGRpc1k7XHJcblxyXG5cdFx0XHRcdC8vIOenu+WKqOW9k+WJjeWFg+e0oFxyXG5cdFx0XHRcdGRyYWdEb20uc3R5bGUubGVmdCA9IGAke2wgKyBzdHlMfXB4YDtcclxuXHRcdFx0XHRkcmFnRG9tLnN0eWxlLnRvcCA9IGAke3QgKyBzdHlUfXB4YDtcclxuXHRcdFx0fTtcclxuXHJcblx0XHRcdGRvY3VtZW50Lm9ubW91c2V1cCA9IGZ1bmN0aW9uKCkge1xyXG5cdFx0XHRcdGRvY3VtZW50Lm9ubW91c2Vtb3ZlID0gbnVsbDtcclxuXHRcdFx0XHRkb2N1bWVudC5vbm1vdXNldXAgPSBudWxsO1xyXG5cdFx0XHR9O1xyXG5cdFx0fTtcclxuXHR9XHJcbn0pO1xyXG5cclxuVnVlLmRpcmVjdGl2ZSgncmVtb3ZlQXJpYUhpZGRlbicsIHtcclxuXHRiaW5kKGVsKSB7XHJcblx0XHRsZXQgYXJpYUVscyA9IGVsLnF1ZXJ5U2VsZWN0b3JBbGwoJy5lbC1yYWRpb19fb3JpZ2luYWwnKTtcclxuXHRcdGFyaWFFbHMuZm9yRWFjaCgoaXRlbSk9PntcclxuXHRcdFx0aXRlbS5yZW1vdmVBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJyk7XHJcblx0XHR9KTtcclxuXHR9XHJcbn0pOyIsIjx0ZW1wbGF0ZT5cclxuICAgIDxlbC1kaWFsb2cgdi1iaW5kPVwiJGF0dHJzXCIgOnRpdGxlPVwidGl0bGVcIiA6dmlzaWJsZT1cImRpYWxvZ1Zpc2libGVcIiB2LWRpYWxvZ0RyYWcgOmJlZm9yZS1jbG9zZT1cImhhbmRsZUNsb3NlXCIgY2VudGVyIDpjbG9zZS1vbi1jbGljay1tb2RhbD1cImZhbHNlXCIgOnNob3ctY2xvc2U9XCJzaG93Q2xvc2VcIiBhcHBlbmQtdG8tYm9keSBzdHlsZT1cIm1hcmdpbi10b3A6IDA7XCI+XHJcbiAgICAgICAgPGRpdiBzdHlsZT1cIm92ZXJmbG93LXk6IGF1dG87b3ZlcmZsb3cteDogaGlkZGVuO3Bvc2l0aW9uOiByZWxhdGl2ZTtcIiA6c3R5bGU9XCJ7bWF4SGVpZ2h0LCBtaW5IZWlnaHR9XCI+XHJcbiAgICAgICAgICAgIDxzbG90Pjwvc2xvdD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IHNsb3Q9XCJmb290ZXJcIiBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlcjtcIj5cclxuICAgICAgICAgICAgPHNsb3QgbmFtZT1cImZvb3RlclwiPjwvc2xvdD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZWwtZGlhbG9nPlxyXG48L3RlbXBsYXRlPlxyXG5cclxuPHNjcmlwdD5cclxuaW1wb3J0ICcuL2RpYWxvZy1kcmFnJztcclxuZXhwb3J0IGRlZmF1bHQge1xyXG4gICAgbmFtZTogJ0RpYWxvZycsXHJcbiAgICBwcm9wczoge1xyXG4gICAgICAgIHRpdGxlOiB7XHJcbiAgICAgICAgICAgIHR5cGU6IFN0cmluZyxcclxuICAgICAgICAgICAgZGVmYXVsdDogJ+aPkOekuidcclxuICAgICAgICB9LFxyXG4gICAgICAgIG1heEhlaWdodDoge1xyXG4gICAgICAgICAgICB0eXBlOiBTdHJpbmcsXHJcbiAgICAgICAgICAgIGRlZmF1bHQ6ICc2MHZoJ1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgbWluSGVpZ2h0OiB7XHJcbiAgICAgICAgICAgIHR5cGU6IFN0cmluZyxcclxuICAgICAgICAgICAgZGVmYXVsdDogJzE1MHB4J1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICBkYXRhKCl7XHJcbiAgICAgICAgcmV0dXJue1xyXG4gICAgICAgICAgICBkaWFsb2dWaXNpYmxlOiB0cnVlLFxyXG4gICAgICAgICAgICBzaG93Q2xvc2U6IGZhbHNlXHJcbiAgICAgICAgfTtcclxuICAgIH0sXHJcbiAgICBtb3VudGVkKCl7XHJcbiAgICAgICAgaWYodGhpcy4kbGlzdGVuZXJzWydjbG9zZSddKXtcclxuICAgICAgICAgICAgdGhpcy5zaG93Q2xvc2UgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICBtZXRob2RzOiB7XHJcbiAgICAgICAgaGFuZGxlQ2xvc2UoKXtcclxuICAgICAgICAgICAgdGhpcy4kZW1pdCgnY2xvc2UnKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn07XHJcbjwvc2NyaXB0PlxyXG5cclxuPHN0eWxlIGxhbmc9XCJzY3NzXCIgc2NvcGVkPlxyXG4vZGVlcC8uZWwtZGlhbG9nX19oZWFkZXJ7XHJcbiAgICBwYWRkaW5nOiAxNXB4IDIwcHg7XHJcbn1cclxuL2RlZXAvLmVsLWRpYWxvZy0tY2VudGVyIC5lbC1kaWFsb2dfX2JvZHl7XHJcbiAgICBwYWRkaW5nOiAyMHB4O1xyXG59XHJcbjwvc3R5bGU+IiwiaW1wb3J0IG1vZCBmcm9tIFwiLSEuLi8uLi8uLi9ub2RlX21vZHVsZXMvdGhyZWFkLWxvYWRlci9kaXN0L2Nqcy5qcyEuLi8uLi8uLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYi9pbmRleC5qcz8/Y2xvbmVkUnVsZVNldC00MC51c2VbMV0hLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0B2dWUvdnVlLWxvYWRlci12MTUvbGliL2luZGV4LmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9JbmRleC52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anNcIjsgZXhwb3J0IGRlZmF1bHQgbW9kOyBleHBvcnQgKiBmcm9tIFwiLSEuLi8uLi8uLi9ub2RlX21vZHVsZXMvdGhyZWFkLWxvYWRlci9kaXN0L2Nqcy5qcyEuLi8uLi8uLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYi9pbmRleC5qcz8/Y2xvbmVkUnVsZVNldC00MC51c2VbMV0hLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0B2dWUvdnVlLWxvYWRlci12MTUvbGliL2luZGV4LmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9JbmRleC52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anNcIiIsIi8vIGV4dHJhY3RlZCBieSBtaW5pLWNzcy1leHRyYWN0LXBsdWdpblxuZXhwb3J0IHt9OyIsImV4cG9ydCAqIGZyb20gXCItIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9taW5pLWNzcy1leHRyYWN0LXBsdWdpbi9kaXN0L2xvYWRlci5qcz8/Y2xvbmVkUnVsZVNldC0yMi51c2VbMF0hLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanM/P2Nsb25lZFJ1bGVTZXQtMjIudXNlWzFdIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9AdnVlL3Z1ZS1sb2FkZXItdjE1L2xpYi9sb2FkZXJzL3N0eWxlUG9zdExvYWRlci5qcyEuLi8uLi8uLi9ub2RlX21vZHVsZXMvcG9zdGNzcy1sb2FkZXIvZGlzdC9janMuanM/P2Nsb25lZFJ1bGVTZXQtMjIudXNlWzJdIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zYXNzLWxvYWRlci9kaXN0L2Nqcy5qcz8/Y2xvbmVkUnVsZVNldC0yMi51c2VbM10hLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0B2dWUvdnVlLWxvYWRlci12MTUvbGliL2luZGV4LmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9JbmRleC52dWU/dnVlJnR5cGU9c3R5bGUmaW5kZXg9MCZpZD00MTQ4NzYyZSZwcm9kJmxhbmc9c2NzcyZzY29wZWQ9dHJ1ZVwiIiwiaW1wb3J0IHsgcmVuZGVyLCBzdGF0aWNSZW5kZXJGbnMgfSBmcm9tIFwiLi9JbmRleC52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9NDE0ODc2MmUmc2NvcGVkPXRydWVcIlxuaW1wb3J0IHNjcmlwdCBmcm9tIFwiLi9JbmRleC52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anNcIlxuZXhwb3J0ICogZnJvbSBcIi4vSW5kZXgudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzXCJcbmltcG9ydCBzdHlsZTAgZnJvbSBcIi4vSW5kZXgudnVlP3Z1ZSZ0eXBlPXN0eWxlJmluZGV4PTAmaWQ9NDE0ODc2MmUmcHJvZCZsYW5nPXNjc3Mmc2NvcGVkPXRydWVcIlxuXG5cbi8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi9cbmltcG9ydCBub3JtYWxpemVyIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0B2dWUvdnVlLWxvYWRlci12MTUvbGliL3J1bnRpbWUvY29tcG9uZW50Tm9ybWFsaXplci5qc1wiXG52YXIgY29tcG9uZW50ID0gbm9ybWFsaXplcihcbiAgc2NyaXB0LFxuICByZW5kZXIsXG4gIHN0YXRpY1JlbmRlckZucyxcbiAgZmFsc2UsXG4gIG51bGwsXG4gIFwiNDE0ODc2MmVcIixcbiAgbnVsbFxuICBcbilcblxuZXhwb3J0IGRlZmF1bHQgY29tcG9uZW50LmV4cG9ydHMiLCJ2YXIgcmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCl7dmFyIF92bT10aGlzLF9jPV92bS5fc2VsZi5fYztyZXR1cm4gX2MoJ2VsLWNhcmQnLHtzdGF0aWNTdHlsZTp7XCJoZWlnaHRcIjpcImNhbGMoMTAwJSAtIDJweClcIixcIm92ZXJmbG93XCI6XCJhdXRvXCJ9LGF0dHJzOntcInNoYWRvd1wiOl92bS5zaGFkb3d9fSxbX2MoJ2Rpdicse3N0YXRpY0NsYXNzOlwiY2xlYXJmaXhcIixhdHRyczp7XCJzbG90XCI6XCJoZWFkZXJcIn0sc2xvdDpcImhlYWRlclwifSxbX2MoJ2Rpdicse3N0YXRpY1N0eWxlOntcImZvbnQtc2l6ZVwiOlwiMTZweFwifX0sWyhfdm0uJHNsb3RzWydjYXJkLXRpdGxlJ10pP1tfdm0uX3QoXCJjYXJkLXRpdGxlXCIpXTpbX3ZtLl92KFwiIFwiK192bS5fcyhfdm0udGl0bGUpK1wiIFwiKV1dLDIpLF9jKCdkaXYnLHtzdGF0aWNTdHlsZTp7XCJmbGV4XCI6XCIxXCIsXCJwb3NpdGlvblwiOlwicmVsYXRpdmVcIn19LFtfYygnZGl2Jyx7c3RhdGljU3R5bGU6e1wicG9zaXRpb25cIjpcImFic29sdXRlXCIsXCJyaWdodFwiOlwiMHB4XCIsXCJ0b3BcIjpcIi0xNHB4XCIsXCJ3aWR0aFwiOlwiMTAwJVwiLFwidGV4dC1hbGlnblwiOlwicmlnaHRcIn19LFtfdm0uX3QoXCJjYXJkLXRvb2xzXCIpXSwyKV0pXSksX3ZtLl90KFwiZGVmYXVsdFwiKV0sMilcbn1cbnZhciBzdGF0aWNSZW5kZXJGbnMgPSBbXVxuXG5leHBvcnQgeyByZW5kZXIsIHN0YXRpY1JlbmRlckZucyB9IiwiPHRlbXBsYXRlPlxyXG4gICAgPGVsLWNhcmQgOnNoYWRvdz1cInNoYWRvd1wiIHN0eWxlPVwiaGVpZ2h0OiBjYWxjKDEwMCUgLSAycHgpO292ZXJmbG93OiBhdXRvO1wiPlxyXG4gICAgICAgIDxkaXYgc2xvdD1cImhlYWRlclwiIGNsYXNzPVwiY2xlYXJmaXhcIj5cclxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMTZweDtcIj5cclxuICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSB2LWlmPVwiJHNsb3RzWydjYXJkLXRpdGxlJ11cIj5cclxuICAgICAgICAgICAgICAgICAgICA8c2xvdCBuYW1lPVwiY2FyZC10aXRsZVwiPjwvc2xvdD5cclxuICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgdi1lbHNlPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7IHRpdGxlIH19XHJcbiAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZsZXg6IDE7cG9zaXRpb246IHJlbGF0aXZlO1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cInBvc2l0aW9uOiBhYnNvbHV0ZTtyaWdodDogMHB4O3RvcDogLTE0cHg7d2lkdGg6IDEwMCU7dGV4dC1hbGlnbjogcmlnaHQ7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNsb3QgbmFtZT1cImNhcmQtdG9vbHNcIj48L3Nsb3Q+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPHNsb3Q+PC9zbG90PlxyXG4gICAgPC9lbC1jYXJkPlxyXG48L3RlbXBsYXRlPlxyXG5cclxuPHNjcmlwdD5cclxuZXhwb3J0IGRlZmF1bHQge1xyXG4gICAgbmFtZTogJ0NhcmQnLFxyXG4gICAgcHJvcHM6IHtcclxuICAgICAgICB0aXRsZToge1xyXG4gICAgICAgICAgICB0eXBlOiBTdHJpbmcsXHJcbiAgICAgICAgICAgIGRlZmF1bHQ6ICcnXHJcbiAgICAgICAgfSxcclxuICAgICAgICBzaGFkb3c6IHtcclxuICAgICAgICAgICAgdHlwZTogU3RyaW5nLFxyXG4gICAgICAgICAgICBkZWZhdWx0OiAnJ1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufTtcclxuPC9zY3JpcHQ+XHJcblxyXG48c3R5bGUgbGFuZz1cInNjc3NcIiBzY29wZWQ+XHJcbi5jbGVhcmZpeHtcclxuICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG59XHJcbjwvc3R5bGU+IiwiaW1wb3J0IG1vZCBmcm9tIFwiLSEuLi8uLi8uLi9ub2RlX21vZHVsZXMvdGhyZWFkLWxvYWRlci9kaXN0L2Nqcy5qcyEuLi8uLi8uLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYi9pbmRleC5qcz8/Y2xvbmVkUnVsZVNldC00MC51c2VbMV0hLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0B2dWUvdnVlLWxvYWRlci12MTUvbGliL2luZGV4LmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9JbmRleC52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anNcIjsgZXhwb3J0IGRlZmF1bHQgbW9kOyBleHBvcnQgKiBmcm9tIFwiLSEuLi8uLi8uLi9ub2RlX21vZHVsZXMvdGhyZWFkLWxvYWRlci9kaXN0L2Nqcy5qcyEuLi8uLi8uLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYi9pbmRleC5qcz8/Y2xvbmVkUnVsZVNldC00MC51c2VbMV0hLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0B2dWUvdnVlLWxvYWRlci12MTUvbGliL2luZGV4LmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9JbmRleC52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anNcIiIsIi8vIGV4dHJhY3RlZCBieSBtaW5pLWNzcy1leHRyYWN0LXBsdWdpblxuZXhwb3J0IHt9OyIsImV4cG9ydCAqIGZyb20gXCItIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9taW5pLWNzcy1leHRyYWN0LXBsdWdpbi9kaXN0L2xvYWRlci5qcz8/Y2xvbmVkUnVsZVNldC0yMi51c2VbMF0hLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanM/P2Nsb25lZFJ1bGVTZXQtMjIudXNlWzFdIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9AdnVlL3Z1ZS1sb2FkZXItdjE1L2xpYi9sb2FkZXJzL3N0eWxlUG9zdExvYWRlci5qcyEuLi8uLi8uLi9ub2RlX21vZHVsZXMvcG9zdGNzcy1sb2FkZXIvZGlzdC9janMuanM/P2Nsb25lZFJ1bGVTZXQtMjIudXNlWzJdIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zYXNzLWxvYWRlci9kaXN0L2Nqcy5qcz8/Y2xvbmVkUnVsZVNldC0yMi51c2VbM10hLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0B2dWUvdnVlLWxvYWRlci12MTUvbGliL2luZGV4LmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9JbmRleC52dWU/dnVlJnR5cGU9c3R5bGUmaW5kZXg9MCZpZD0wYzVkZTA2ZSZwcm9kJmxhbmc9c2NzcyZzY29wZWQ9dHJ1ZVwiIiwiaW1wb3J0IHsgcmVuZGVyLCBzdGF0aWNSZW5kZXJGbnMgfSBmcm9tIFwiLi9JbmRleC52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9MGM1ZGUwNmUmc2NvcGVkPXRydWVcIlxuaW1wb3J0IHNjcmlwdCBmcm9tIFwiLi9JbmRleC52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anNcIlxuZXhwb3J0ICogZnJvbSBcIi4vSW5kZXgudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzXCJcbmltcG9ydCBzdHlsZTAgZnJvbSBcIi4vSW5kZXgudnVlP3Z1ZSZ0eXBlPXN0eWxlJmluZGV4PTAmaWQ9MGM1ZGUwNmUmcHJvZCZsYW5nPXNjc3Mmc2NvcGVkPXRydWVcIlxuXG5cbi8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi9cbmltcG9ydCBub3JtYWxpemVyIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0B2dWUvdnVlLWxvYWRlci12MTUvbGliL3J1bnRpbWUvY29tcG9uZW50Tm9ybWFsaXplci5qc1wiXG52YXIgY29tcG9uZW50ID0gbm9ybWFsaXplcihcbiAgc2NyaXB0LFxuICByZW5kZXIsXG4gIHN0YXRpY1JlbmRlckZucyxcbiAgZmFsc2UsXG4gIG51bGwsXG4gIFwiMGM1ZGUwNmVcIixcbiAgbnVsbFxuICBcbilcblxuZXhwb3J0IGRlZmF1bHQgY29tcG9uZW50LmV4cG9ydHMiLCJ2YXIgcmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCl7dmFyIF92bT10aGlzLF9jPV92bS5fc2VsZi5fYztyZXR1cm4gKF92bS5zaG93KT9fYygnZGl2JyxbKF92bS5kYXRhLmxlbmd0aCA+IDApP192bS5fbCgoX3ZtLmRhdGEpLGZ1bmN0aW9uKGl0ZW0pe3JldHVybiBfYygnYXV0aC10cmVlJyx7a2V5Oml0ZW0uaWQsYXR0cnM6e1wiZGF0YVwiOml0ZW0sXCJwcm9wc1wiOl92bS5wcm9wc30sb246e1wib24tbm9kZS1leHBhbmRcIjooZGF0YSk9Pl92bS5vbkV4cGFuZChkYXRhKSxcIm9uLW5vZGUtY2hlY2tlZFwiOihkYXRhKT0+X3ZtLm9uQ2hlY2tlZChkYXRhKX19KX0pOl92bS5fZSgpXSwyKTpfdm0uX2UoKVxufVxudmFyIHN0YXRpY1JlbmRlckZucyA9IFtdXG5cbmV4cG9ydCB7IHJlbmRlciwgc3RhdGljUmVuZGVyRm5zIH0iLCIvLyDmmK/lkKbmnInlrZDoioLngrlcbmNvbnN0IGhhc0NoaWxkcmVuID0gKGRhdGEpPT57XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoZGF0YS5jaGlsZHJlbikgJiYgZGF0YS5jaGlsZHJlbi5sZW5ndGggPiAwO1xufTtcblxuLy8g5Yib5bu66IqC54K5XG5leHBvcnQgY29uc3QgcmVuZGVyTGFiZWwgPSAoaCwgZGF0YSwgY29udGV4dCk9PntcbiAgICBjb25zdCB7cHJvcHMsIGxpc3RlbmVyc30gPSBjb250ZXh0O1xuICAgIGNvbnN0IGNsaWNrSGFuZGxlciA9IGxpc3RlbmVyc1snb24tbm9kZS1leHBhbmQnXTtcbiAgICBjb25zdCBjaGVja2VkSGFuZGxlciA9IGxpc3RlbmVyc1snb24tbm9kZS1jaGVja2VkJ107XG4gICAgY29uc3QgbGFiZWwgPSBkYXRhW3Byb3BzLnByb3BzLmxhYmVsXTtcbiAgICBjb25zdCBjaGlsZE5vZGVzID0gW107XG4gICAgY2hpbGROb2Rlcy5wdXNoKGxhYmVsKTtcblxuICAgIGNvbnN0IGljb0NsYXNzID0gW107XG4gICAgaWYoaGFzQ2hpbGRyZW4oZGF0YSkpe1xuICAgICAgICBpZihkYXRhLmV4cGFuZCl7XG4gICAgICAgICAgICBpY29DbGFzcy5wdXNoKCdpY29uLWljb24tZHdvbicpO1xuICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgIGljb0NsYXNzLnB1c2goJ2ljb24taWNvbl9yaWdodCcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBoKCdsaScsIHtcbiAgICB9LCBbXG4gICAgICAgIGgoJ2knLCB7XG4gICAgICAgICAgICBkb21Qcm9wczoge1xuICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogYGljb25mb250ICR7aWNvQ2xhc3Muam9pbignICcpfWBcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzdHlsZToge1xuICAgICAgICAgICAgICAgIG1hcmdpbkxlZnQ6IGAkezE0KmRhdGEuX2xldmV9cHhgLFxuICAgICAgICAgICAgICAgIGZvbnRTaXplOiAnMTJweCcsXG4gICAgICAgICAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlWSgtMnB4KScsXG4gICAgICAgICAgICAgICAgY29sb3I6ICcjNjY2J1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9uOiB7XG4gICAgICAgICAgICAgICAgY2xpY2s6ICgpPT57XG4gICAgICAgICAgICAgICAgICAgIGNsaWNrSGFuZGxlcihkYXRhKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sICcnKSxcbiAgICAgICAgaCgnaScsIHtcbiAgICAgICAgICAgIGRvbVByb3BzOiB7XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBkYXRhLmNoZWNrZWQ/J2ljb25mb250IGljb24tZmFuZ3hpbmd4dWFuemhvbmdmaWwnOidpY29uZm9udCBpY29uLWZhbmd4aW5nd2VpeHVhbnpob25nJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICAgICAgY29sb3I6ICcjNjY2J1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9uOiB7XG4gICAgICAgICAgICAgICAgY2xpY2s6ICgpPT57XG4gICAgICAgICAgICAgICAgICAgIGNoZWNrZWRIYW5kbGVyKGRhdGEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgJycpLFxuICAgICAgICBoKCdzcGFuJywge1xuXG4gICAgICAgIH0sIGNoaWxkTm9kZXMpXG4gICAgXSk7XG59O1xuXG4vLyDliJvlu7ogbm9kZSDlrZDoioLngrlcbmV4cG9ydCBjb25zdCByZW5kZXJDaGlsZHJlbiA9IChoLCBsaXN0LCBleHBhbmQsIGNvbnRleHQpPT57XG4gICAgaWYgKEFycmF5LmlzQXJyYXkobGlzdCkgJiYgbGlzdC5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBsaXN0Lm1hcChpdGVtPT57XG4gICAgICAgICAgICByZXR1cm4gcmVuZGVyTm9kZShoLCBpdGVtLCBjb250ZXh0KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGxldCBjbHMgPSBbJ3RyZWUtbm9kZS1jaGlsZHJlbiddO1xuICAgICAgICBpZighZXhwYW5kKXtcbiAgICAgICAgICAgIGNscy5wdXNoKCdleHBhbmQnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaCgnZGl2Jywge1xuICAgICAgICAgICAgZG9tUHJvcHM6IHtcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU6IGNscy5qb2luKCcgJylcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgY2hpbGRyZW4pO1xuICAgIH1cbiAgICByZXR1cm4gJyc7XG59O1xuXG5leHBvcnQgY29uc3QgcmVuZGVyTm9kZSA9IChoLCBkYXRhLCBjb250ZXh0KT0+e1xuICAgIGNvbnN0IGNoaWxkTm9kZXMgPSBbXTtcbiAgICBjaGlsZE5vZGVzLnB1c2gocmVuZGVyTGFiZWwoaCwgZGF0YSwgY29udGV4dCkpO1xuICAgIGNvbnN0IGNoaWxkcmVuID0gZGF0YS5jaGlsZHJlbjtcbiAgICBpZihoYXNDaGlsZHJlbihkYXRhKSl7XG4gICAgICAgIGNoaWxkTm9kZXMucHVzaChyZW5kZXJDaGlsZHJlbihoLCBjaGlsZHJlbiwgZGF0YS5leHBhbmQsIGNvbnRleHQpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaCgndWwnLCB7XG4gICAgICAgIGRvbVByb3BzOiB7XG4gICAgICAgICAgICBjbGFzc05hbWU6ICdub2RlJ1xuICAgICAgICB9XG4gICAgfSwgY2hpbGROb2Rlcyk7XG59O1xuXG5leHBvcnQgY29uc3QgcmVuZGVyID0gKGgsIGNvbnRleHQpPT57XG4gICAgY29uc3Qge3Byb3BzfSA9IGNvbnRleHQ7XG4gICAgcmV0dXJuIHJlbmRlck5vZGUoaCwgcHJvcHMuZGF0YSwgY29udGV4dCk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCByZW5kZXI7IiwiPHRlbXBsYXRlPlxuICAgIDxkaXYgdi1pZj1cInNob3dcIj5cbiAgICAgICAgPHRlbXBsYXRlIHYtaWY9XCJkYXRhLmxlbmd0aCA+IDBcIj5cbiAgICAgICAgICAgIDxhdXRoLXRyZWUgdi1mb3I9XCJpdGVtIGluIGRhdGFcIlxuICAgICAgICAgICAgICAgIDprZXk9XCJpdGVtLmlkXCJcbiAgICAgICAgICAgICAgICA6ZGF0YT1cIml0ZW1cIlxuICAgICAgICAgICAgICAgIDpwcm9wcz1cInByb3BzXCJcbiAgICAgICAgICAgICAgICBAb24tbm9kZS1leHBhbmQ9XCIoZGF0YSk9Pm9uRXhwYW5kKGRhdGEpXCJcbiAgICAgICAgICAgICAgICBAb24tbm9kZS1jaGVja2VkPVwiKGRhdGEpPT5vbkNoZWNrZWQoZGF0YSlcIlxuICAgICAgICAgICAgPjwvYXV0aC10cmVlPlxuICAgICAgICA8L3RlbXBsYXRlPlxuICAgIDwvZGl2PlxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCByZW5kZXIgZnJvbSAnLi90cmVlJztcbmV4cG9ydCBkZWZhdWx0IHtcbiAgICBuYW1lOiAnVHJlZScsXG4gICAgY29tcG9uZW50czoge1xuICAgICAgICBBdXRoVHJlZToge1xuICAgICAgICAgICAgcmVuZGVyLFxuICAgICAgICAgICAgZnVuY3Rpb25hbDogdHJ1ZVxuICAgICAgICB9XG4gICAgfSxcbiAgICBwcm9wczoge1xuICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICB0eXBlOiBBcnJheSxcbiAgICAgICAgICAgIGRlZmF1bHQ6ICgpPT57XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBwcm9wczoge1xuICAgICAgICAgICAgdHlwZTogT2JqZWN0LFxuICAgICAgICAgICAgZGVmYXVsdDogKCk9PntcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ25hbWUnXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG4gICAgZGF0YSgpe1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogMSxcbiAgICAgICAgICAgIHNob3c6IGZhbHNlLFxuICAgICAgICAgICAgbGlzdDogW10sXG4gICAgICAgICAgICBjaGVja2VkOiBmYWxzZVxuICAgICAgICB9O1xuICAgIH0sXG4gICAgbWV0aG9kczoge1xuICAgICAgICBpbml0KGRhdGEsIGxldmUpe1xuICAgICAgICAgICAgZGF0YS5fbGV2ZSA9IGxldmU7XG4gICAgICAgICAgICBpZihkYXRhLmNoaWxkcmVuICYmIGRhdGEuY2hpbGRyZW4ubGVuZ3RoID4gMCl7XG4gICAgICAgICAgICAgICAgbGV2ZSsrO1xuICAgICAgICAgICAgICAgIGZvcihjb25zdCBpIGluIGRhdGEuY2hpbGRyZW4pe1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmluaXQoZGF0YS5jaGlsZHJlbltpXSwgbGV2ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICAvLyDliLfmlrBcbiAgICAgICAgcmVmcmVzaCgpe1xuICAgICAgICAgICAgdGhpcy5zaG93ID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLiRuZXh0VGljaygoKT0+e1xuICAgICAgICAgICAgICAgIHRoaXMuc2hvdyA9IHRydWU7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgLy8g5bGV5byAL+makOiXj1xuICAgICAgICBvbkV4cGFuZChkYXRhKXtcbiAgICAgICAgICAgIGRhdGEuZXhwYW5kID0gIWRhdGEuZXhwYW5kO1xuICAgICAgICAgICAgdGhpcy5yZWZyZXNoKCk7XG4gICAgICAgIH0sXG4gICAgICAgIC8vIOmAieS4rS/lj5bmtojpgInkuK1cbiAgICAgICAgb25DaGVja2VkKGRhdGEpe1xuICAgICAgICAgICAgZGF0YS5jaGVja2VkID0gIWRhdGEuY2hlY2tlZDtcbiAgICAgICAgICAgIHRoaXMudG9vbGVyQ2hlY2tlZCh0aGlzLmRhdGEsIGRhdGEpO1xuICAgICAgICAgICAgdGhpcy5zZXRQYXJlbnRDaGVja2VkKHRoaXMuZGF0YSk7XG4gICAgICAgICAgICB0aGlzLnJlZnJlc2goKTtcbiAgICAgICAgfSxcbiAgICAgICAgdG9vbGVyQ2hlY2tlZChsaXN0LCBub2RlKXtcbiAgICAgICAgICAgIGZvcihjb25zdCBpIGluIGxpc3Qpe1xuICAgICAgICAgICAgICAgIGlmKGxpc3RbaV0uaWQgPT09IG5vZGUuaWQpe1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldENoaWxkQ2hlY2tlZChsaXN0W2ldLmNoaWxkcmVuLCBsaXN0W2ldLmNoZWNrZWQpO1xuICAgICAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvb2xlckNoZWNrZWQobGlzdFtpXS5jaGlsZHJlbiwgbm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICAvLyDpgInkuK3oioLngrnml7bvvIzorr7nva7lrZDoioLngrnlhajpgIlcbiAgICAgICAgc2V0Q2hpbGRDaGVja2VkKGNoaWxkcmVuLCBjaGVja2VkKXtcbiAgICAgICAgICAgIGZvcihjb25zdCBpIGluIGNoaWxkcmVuKXtcbiAgICAgICAgICAgICAgICBjaGlsZHJlbltpXS5jaGVja2VkID0gY2hlY2tlZDtcbiAgICAgICAgICAgICAgICB0aGlzLnNldENoaWxkQ2hlY2tlZChjaGlsZHJlbltpXS5jaGlsZHJlbiwgY2hlY2tlZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIC8vIOiuvue9rueItuiKgueCuemAieS4rVxuICAgICAgICBzZXRQYXJlbnRDaGVja2VkKGRhdGEpe1xuICAgICAgICAgICAgZm9yKGNvbnN0IGkgaW4gZGF0YSl7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGVja2VkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYoZGF0YVtpXS5jaGlsZHJlbiAmJiBkYXRhW2ldLmNoaWxkcmVuLmxlbmd0aCA+IDApe1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoaWxkSXNDaGVja2VkKGRhdGFbaV0uY2hpbGRyZW4pO1xuICAgICAgICAgICAgICAgICAgICBpZih0aGlzLmNoZWNrZWQpe1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVtpXS5jaGVja2VkID0gdGhpcy5jaGVja2VkO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0UGFyZW50Q2hlY2tlZChkYXRhW2ldLmNoaWxkcmVuKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnJlZnJlc2goKTtcbiAgICAgICAgfSxcbiAgICAgICAgLy8g5Yik5pat6IqC54K555qE5a2Q6IqC54K55piv5ZCm5pyJ6YCJ5LitXG4gICAgICAgIGNoaWxkSXNDaGVja2VkKGNoaWxkcmVuKXtcbiAgICAgICAgICAgIGZvcihjb25zdCBpIGluIGNoaWxkcmVuKXtcbiAgICAgICAgICAgICAgICBpZihjaGlsZHJlbltpXS5jaGVja2VkKXtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGVja2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGlsZElzQ2hlY2tlZChjaGlsZHJlbltpXS5jaGlsZHJlbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICAvLyDorr7nva7pu5jorqTpgInkuK1cbiAgICAgICAgc2V0RGVmYXVsdENoZWNrZWQoZGVmYXVsdElkcyl7XG4gICAgICAgICAgICBmb3IoY29uc3QgaSBpbiBkZWZhdWx0SWRzKXtcbiAgICAgICAgICAgICAgICB0aGlzLnNldENoZWNrZWQodGhpcy5kYXRhLCBkZWZhdWx0SWRzW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc2V0UGFyZW50Q2hlY2tlZCh0aGlzLmRhdGEpO1xuICAgICAgICB9LFxuICAgICAgICAvLyDmoLnmja7miYDnu5nnmoRpZO+8jOiuvue9ruaUuemhuemAieS4rVxuICAgICAgICBzZXRDaGVja2VkKGRhdGEsIGlkKXtcbiAgICAgICAgICAgIGZvcihjb25zdCBpIGluIGRhdGEpe1xuICAgICAgICAgICAgICAgIGlmKGRhdGFbaV0uaWQgPT09IGlkKXtcbiAgICAgICAgICAgICAgICAgICAgZGF0YVtpXS5jaGVja2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgICAgIGlmKGRhdGFbaV0uY2hpbGRyZW4gJiYgZGF0YVtpXS5jaGlsZHJlbi5sZW5ndGggPiAwKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0Q2hlY2tlZChkYXRhW2ldLmNoaWxkcmVuLCBpZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIC8vIOiOt+WPlumAieS4remAieeahGtleVxuICAgICAgICBnZXRDaGVja2VkS2V5cygpe1xuICAgICAgICAgICAgY29uc3Qga2V5cyA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fZ2V0Q2hlY2tlZEtleXModGhpcy5kYXRhLCBrZXlzKTtcbiAgICAgICAgICAgIHJldHVybiBrZXlzO1xuICAgICAgICB9LFxuICAgICAgICAvLyDpgY3ljoblh7rpgInkuK3pgInnmoRrZXlcbiAgICAgICAgX2dldENoZWNrZWRLZXlzKGRhdGEsIGtleXMpe1xuICAgICAgICAgICAgZm9yKGNvbnN0IGkgaW4gZGF0YSl7XG4gICAgICAgICAgICAgICAgaWYoZGF0YVtpXS5jaGVja2VkKXtcbiAgICAgICAgICAgICAgICAgICAga2V5cy5wdXNoKGRhdGFbaV0uaWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZihkYXRhW2ldLmNoaWxkcmVuICYmIGRhdGFbaV0uY2hpbGRyZW4ubGVuZ3RoID4gMCl7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2dldENoZWNrZWRLZXlzKGRhdGFbaV0uY2hpbGRyZW4sIGtleXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgLy8g6I635Y+W6YCJ5Lit6YCJ55qE6IqC54K5XG4gICAgICAgIGdldENoZWNrZWROb2Rlcygpe1xuICAgICAgICAgICAgY29uc3Qgbm9kZXMgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuX2dldENoZWNrZWROb2Rlcyh0aGlzLmRhdGEsIG5vZGVzKTtcbiAgICAgICAgICAgIHJldHVybiBub2RlcztcbiAgICAgICAgfSxcbiAgICAgICAgLy8g6YGN5Y6G5Ye66YCJ5Lit6YCJ55qE6IqC54K5XG4gICAgICAgIF9nZXRDaGVja2VkTm9kZXMoZGF0YSwgbm9kZXMpe1xuICAgICAgICAgICAgZm9yKGNvbnN0IGkgaW4gZGF0YSl7XG4gICAgICAgICAgICAgICAgaWYoZGF0YVtpXS5jaGVja2VkKXtcbiAgICAgICAgICAgICAgICAgICAgbm9kZXMucHVzaChkYXRhW2ldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYoZGF0YVtpXS5jaGlsZHJlbiAmJiBkYXRhW2ldLmNoaWxkcmVuLmxlbmd0aCA+IDApe1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9nZXRDaGVja2VkTm9kZXMoZGF0YVtpXS5jaGlsZHJlbiwgbm9kZXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG4gICAgd2F0Y2g6IHtcbiAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgaGFuZGxlcigpIHtcbiAgICAgICAgICAgICAgICBmb3IoY29uc3QgaSBpbiB0aGlzLmRhdGEpe1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmluaXQodGhpcy5kYXRhW2ldLCAwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaW1tZWRpYXRlOiB0cnVlLFxuICAgICAgICAgICAgZGVlcDogdHJ1ZVxuICAgICAgICB9XG4gICAgfVxufTtcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIiBzY29wZWQ+XG5AaW1wb3J0IHVybCguL2ljb24vaWNvbmZvbnQuY3NzKTtcbnVse1xuICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG4gICAgbWFyZ2luOiAwO1xuICAgIHBhZGRpbmc6IDA7XG4gICAgdGV4dC1hbGlnbjogbGVmdDtcblxuICAgIGxpe1xuICAgICAgICBwYWRkaW5nOiA1cHggMDtcbiAgICAgICAgY3Vyc29yOiBwb2ludGVyO1xuXG4gICAgICAgIC5jaGVjay1pY297XG4gICAgICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgICAgICAgICBoZWlnaHQ6IDVweDtcbiAgICAgICAgICAgIHdpZHRoOiA1cHg7XG4gICAgICAgICAgICBib3JkZXI6IDFweCBzb2xpZDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGxpOmhvdmVye1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKCRjb2xvcjogIzAwMDAwMCwgJGFscGhhOiAwLjEpO1xuICAgIH1cblxuICAgIC5leHBhbmR7XG4gICAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgfVxufVxuPC9zdHlsZT4iLCJpbXBvcnQgbW9kIGZyb20gXCItIS4uLy4uLy4uL25vZGVfbW9kdWxlcy90aHJlYWQtbG9hZGVyL2Rpc3QvY2pzLmpzIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliL2luZGV4LmpzPz9jbG9uZWRSdWxlU2V0LTQwLnVzZVsxXSEuLi8uLi8uLi9ub2RlX21vZHVsZXMvQHZ1ZS92dWUtbG9hZGVyLXYxNS9saWIvaW5kZXguanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL0luZGV4LnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qc1wiOyBleHBvcnQgZGVmYXVsdCBtb2Q7IGV4cG9ydCAqIGZyb20gXCItIS4uLy4uLy4uL25vZGVfbW9kdWxlcy90aHJlYWQtbG9hZGVyL2Rpc3QvY2pzLmpzIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliL2luZGV4LmpzPz9jbG9uZWRSdWxlU2V0LTQwLnVzZVsxXSEuLi8uLi8uLi9ub2RlX21vZHVsZXMvQHZ1ZS92dWUtbG9hZGVyLXYxNS9saWIvaW5kZXguanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL0luZGV4LnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qc1wiIiwiLy8gZXh0cmFjdGVkIGJ5IG1pbmktY3NzLWV4dHJhY3QtcGx1Z2luXG5leHBvcnQge307IiwiZXhwb3J0ICogZnJvbSBcIi0hLi4vLi4vLi4vbm9kZV9tb2R1bGVzL21pbmktY3NzLWV4dHJhY3QtcGx1Z2luL2Rpc3QvbG9hZGVyLmpzPz9jbG9uZWRSdWxlU2V0LTIyLnVzZVswXSEuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcz8/Y2xvbmVkUnVsZVNldC0yMi51c2VbMV0hLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0B2dWUvdnVlLWxvYWRlci12MTUvbGliL2xvYWRlcnMvc3R5bGVQb3N0TG9hZGVyLmpzIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9wb3N0Y3NzLWxvYWRlci9kaXN0L2Nqcy5qcz8/Y2xvbmVkUnVsZVNldC0yMi51c2VbMl0hLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3Nhc3MtbG9hZGVyL2Rpc3QvY2pzLmpzPz9jbG9uZWRSdWxlU2V0LTIyLnVzZVszXSEuLi8uLi8uLi9ub2RlX21vZHVsZXMvQHZ1ZS92dWUtbG9hZGVyLXYxNS9saWIvaW5kZXguanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL0luZGV4LnZ1ZT92dWUmdHlwZT1zdHlsZSZpbmRleD0wJmlkPTVlODFlMDVlJnByb2QmbGFuZz1zY3NzJnNjb3BlZD10cnVlXCIiLCJpbXBvcnQgeyByZW5kZXIsIHN0YXRpY1JlbmRlckZucyB9IGZyb20gXCIuL0luZGV4LnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD01ZTgxZTA1ZSZzY29wZWQ9dHJ1ZVwiXG5pbXBvcnQgc2NyaXB0IGZyb20gXCIuL0luZGV4LnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qc1wiXG5leHBvcnQgKiBmcm9tIFwiLi9JbmRleC52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anNcIlxuaW1wb3J0IHN0eWxlMCBmcm9tIFwiLi9JbmRleC52dWU/dnVlJnR5cGU9c3R5bGUmaW5kZXg9MCZpZD01ZTgxZTA1ZSZwcm9kJmxhbmc9c2NzcyZzY29wZWQ9dHJ1ZVwiXG5cblxuLyogbm9ybWFsaXplIGNvbXBvbmVudCAqL1xuaW1wb3J0IG5vcm1hbGl6ZXIgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvQHZ1ZS92dWUtbG9hZGVyLXYxNS9saWIvcnVudGltZS9jb21wb25lbnROb3JtYWxpemVyLmpzXCJcbnZhciBjb21wb25lbnQgPSBub3JtYWxpemVyKFxuICBzY3JpcHQsXG4gIHJlbmRlcixcbiAgc3RhdGljUmVuZGVyRm5zLFxuICBmYWxzZSxcbiAgbnVsbCxcbiAgXCI1ZTgxZTA1ZVwiLFxuICBudWxsXG4gIFxuKVxuXG5leHBvcnQgZGVmYXVsdCBjb21wb25lbnQuZXhwb3J0cyIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9jaGVja1ByaXZhdGVSZWRlY2xhcmF0aW9uKG9iaiwgcHJpdmF0ZUNvbGxlY3Rpb24pIHtcbiAgaWYgKHByaXZhdGVDb2xsZWN0aW9uLmhhcyhvYmopKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBpbml0aWFsaXplIHRoZSBzYW1lIHByaXZhdGUgZWxlbWVudHMgdHdpY2Ugb24gYW4gb2JqZWN0XCIpO1xuICB9XG59IiwiaW1wb3J0IGNoZWNrUHJpdmF0ZVJlZGVjbGFyYXRpb24gZnJvbSBcIi4vY2hlY2tQcml2YXRlUmVkZWNsYXJhdGlvbi5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWMob2JqLCBwcml2YXRlTWFwLCB2YWx1ZSkge1xuICBjaGVja1ByaXZhdGVSZWRlY2xhcmF0aW9uKG9iaiwgcHJpdmF0ZU1hcCk7XG4gIHByaXZhdGVNYXAuc2V0KG9iaiwgdmFsdWUpO1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9hc3NlcnRDbGFzc0JyYW5kKGUsIHQsIG4pIHtcbiAgaWYgKFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgZSA/IGUgPT09IHQgOiBlLmhhcyh0KSkgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPCAzID8gdCA6IG47XG4gIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGVsZW1lbnQgaXMgbm90IHByZXNlbnQgb24gdGhpcyBvYmplY3RcIik7XG59IiwiaW1wb3J0IGFzc2VydENsYXNzQnJhbmQgZnJvbSBcIi4vYXNzZXJ0Q2xhc3NCcmFuZC5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2NsYXNzUHJpdmF0ZUZpZWxkU2V0MihzLCBhLCByKSB7XG4gIHJldHVybiBzLnNldChhc3NlcnRDbGFzc0JyYW5kKHMsIGEpLCByKSwgcjtcbn0iLCJpbXBvcnQgYXNzZXJ0Q2xhc3NCcmFuZCBmcm9tIFwiLi9hc3NlcnRDbGFzc0JyYW5kLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfY2xhc3NQcml2YXRlRmllbGRHZXQyKHMsIGEpIHtcbiAgcmV0dXJuIHMuZ2V0KGFzc2VydENsYXNzQnJhbmQocywgYSkpO1xufSIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYmluZChmbiwgdGhpc0FyZykge1xuICByZXR1cm4gZnVuY3Rpb24gd3JhcCgpIHtcbiAgICByZXR1cm4gZm4uYXBwbHkodGhpc0FyZywgYXJndW1lbnRzKTtcbiAgfTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IGJpbmQgZnJvbSAnLi9oZWxwZXJzL2JpbmQuanMnO1xuXG4vLyB1dGlscyBpcyBhIGxpYnJhcnkgb2YgZ2VuZXJpYyBoZWxwZXIgZnVuY3Rpb25zIG5vbi1zcGVjaWZpYyB0byBheGlvc1xuXG5jb25zdCB7dG9TdHJpbmd9ID0gT2JqZWN0LnByb3RvdHlwZTtcbmNvbnN0IHtnZXRQcm90b3R5cGVPZn0gPSBPYmplY3Q7XG5cbmNvbnN0IGtpbmRPZiA9IChjYWNoZSA9PiB0aGluZyA9PiB7XG4gICAgY29uc3Qgc3RyID0gdG9TdHJpbmcuY2FsbCh0aGluZyk7XG4gICAgcmV0dXJuIGNhY2hlW3N0cl0gfHwgKGNhY2hlW3N0cl0gPSBzdHIuc2xpY2UoOCwgLTEpLnRvTG93ZXJDYXNlKCkpO1xufSkoT2JqZWN0LmNyZWF0ZShudWxsKSk7XG5cbmNvbnN0IGtpbmRPZlRlc3QgPSAodHlwZSkgPT4ge1xuICB0eXBlID0gdHlwZS50b0xvd2VyQ2FzZSgpO1xuICByZXR1cm4gKHRoaW5nKSA9PiBraW5kT2YodGhpbmcpID09PSB0eXBlXG59XG5cbmNvbnN0IHR5cGVPZlRlc3QgPSB0eXBlID0+IHRoaW5nID0+IHR5cGVvZiB0aGluZyA9PT0gdHlwZTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhbiBBcnJheVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhbiBBcnJheSwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IHtpc0FycmF5fSA9IEFycmF5O1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIHVuZGVmaW5lZFxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIHZhbHVlIGlzIHVuZGVmaW5lZCwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IGlzVW5kZWZpbmVkID0gdHlwZU9mVGVzdCgndW5kZWZpbmVkJyk7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBCdWZmZXJcbiAqXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgQnVmZmVyLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNCdWZmZXIodmFsKSB7XG4gIHJldHVybiB2YWwgIT09IG51bGwgJiYgIWlzVW5kZWZpbmVkKHZhbCkgJiYgdmFsLmNvbnN0cnVjdG9yICE9PSBudWxsICYmICFpc1VuZGVmaW5lZCh2YWwuY29uc3RydWN0b3IpXG4gICAgJiYgaXNGdW5jdGlvbih2YWwuY29uc3RydWN0b3IuaXNCdWZmZXIpICYmIHZhbC5jb25zdHJ1Y3Rvci5pc0J1ZmZlcih2YWwpO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGFuIEFycmF5QnVmZmVyXG4gKlxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhbiBBcnJheUJ1ZmZlciwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IGlzQXJyYXlCdWZmZXIgPSBraW5kT2ZUZXN0KCdBcnJheUJ1ZmZlcicpO1xuXG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSB2aWV3IG9uIGFuIEFycmF5QnVmZmVyXG4gKlxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIHZpZXcgb24gYW4gQXJyYXlCdWZmZXIsIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0FycmF5QnVmZmVyVmlldyh2YWwpIHtcbiAgbGV0IHJlc3VsdDtcbiAgaWYgKCh0eXBlb2YgQXJyYXlCdWZmZXIgIT09ICd1bmRlZmluZWQnKSAmJiAoQXJyYXlCdWZmZXIuaXNWaWV3KSkge1xuICAgIHJlc3VsdCA9IEFycmF5QnVmZmVyLmlzVmlldyh2YWwpO1xuICB9IGVsc2Uge1xuICAgIHJlc3VsdCA9ICh2YWwpICYmICh2YWwuYnVmZmVyKSAmJiAoaXNBcnJheUJ1ZmZlcih2YWwuYnVmZmVyKSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIFN0cmluZ1xuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBTdHJpbmcsIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc1N0cmluZyA9IHR5cGVPZlRlc3QoJ3N0cmluZycpO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgRnVuY3Rpb25cbiAqXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBGdW5jdGlvbiwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IGlzRnVuY3Rpb24gPSB0eXBlT2ZUZXN0KCdmdW5jdGlvbicpO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgTnVtYmVyXG4gKlxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIE51bWJlciwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IGlzTnVtYmVyID0gdHlwZU9mVGVzdCgnbnVtYmVyJyk7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYW4gT2JqZWN0XG4gKlxuICogQHBhcmFtIHsqfSB0aGluZyBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGFuIE9iamVjdCwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IGlzT2JqZWN0ID0gKHRoaW5nKSA9PiB0aGluZyAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpbmcgPT09ICdvYmplY3QnO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgQm9vbGVhblxuICpcbiAqIEBwYXJhbSB7Kn0gdGhpbmcgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgQm9vbGVhbiwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IGlzQm9vbGVhbiA9IHRoaW5nID0+IHRoaW5nID09PSB0cnVlIHx8IHRoaW5nID09PSBmYWxzZTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIHBsYWluIE9iamVjdFxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBwbGFpbiBPYmplY3QsIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc1BsYWluT2JqZWN0ID0gKHZhbCkgPT4ge1xuICBpZiAoa2luZE9mKHZhbCkgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgcHJvdG90eXBlID0gZ2V0UHJvdG90eXBlT2YodmFsKTtcbiAgcmV0dXJuIChwcm90b3R5cGUgPT09IG51bGwgfHwgcHJvdG90eXBlID09PSBPYmplY3QucHJvdG90eXBlIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90b3R5cGUpID09PSBudWxsKSAmJiAhKFN5bWJvbC50b1N0cmluZ1RhZyBpbiB2YWwpICYmICEoU3ltYm9sLml0ZXJhdG9yIGluIHZhbCk7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBEYXRlXG4gKlxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIERhdGUsIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc0RhdGUgPSBraW5kT2ZUZXN0KCdEYXRlJyk7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBGaWxlXG4gKlxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIEZpbGUsIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc0ZpbGUgPSBraW5kT2ZUZXN0KCdGaWxlJyk7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBCbG9iXG4gKlxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIEJsb2IsIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc0Jsb2IgPSBraW5kT2ZUZXN0KCdCbG9iJyk7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBGaWxlTGlzdFxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBGaWxlLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNGaWxlTGlzdCA9IGtpbmRPZlRlc3QoJ0ZpbGVMaXN0Jyk7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBTdHJlYW1cbiAqXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgU3RyZWFtLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNTdHJlYW0gPSAodmFsKSA9PiBpc09iamVjdCh2YWwpICYmIGlzRnVuY3Rpb24odmFsLnBpcGUpO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgRm9ybURhdGFcbiAqXG4gKiBAcGFyYW0geyp9IHRoaW5nIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYW4gRm9ybURhdGEsIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc0Zvcm1EYXRhID0gKHRoaW5nKSA9PiB7XG4gIGxldCBraW5kO1xuICByZXR1cm4gdGhpbmcgJiYgKFxuICAgICh0eXBlb2YgRm9ybURhdGEgPT09ICdmdW5jdGlvbicgJiYgdGhpbmcgaW5zdGFuY2VvZiBGb3JtRGF0YSkgfHwgKFxuICAgICAgaXNGdW5jdGlvbih0aGluZy5hcHBlbmQpICYmIChcbiAgICAgICAgKGtpbmQgPSBraW5kT2YodGhpbmcpKSA9PT0gJ2Zvcm1kYXRhJyB8fFxuICAgICAgICAvLyBkZXRlY3QgZm9ybS1kYXRhIGluc3RhbmNlXG4gICAgICAgIChraW5kID09PSAnb2JqZWN0JyAmJiBpc0Z1bmN0aW9uKHRoaW5nLnRvU3RyaW5nKSAmJiB0aGluZy50b1N0cmluZygpID09PSAnW29iamVjdCBGb3JtRGF0YV0nKVxuICAgICAgKVxuICAgIClcbiAgKVxufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgVVJMU2VhcmNoUGFyYW1zIG9iamVjdFxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBVUkxTZWFyY2hQYXJhbXMgb2JqZWN0LCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNVUkxTZWFyY2hQYXJhbXMgPSBraW5kT2ZUZXN0KCdVUkxTZWFyY2hQYXJhbXMnKTtcblxuLyoqXG4gKiBUcmltIGV4Y2VzcyB3aGl0ZXNwYWNlIG9mZiB0aGUgYmVnaW5uaW5nIGFuZCBlbmQgb2YgYSBzdHJpbmdcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyIFRoZSBTdHJpbmcgdG8gdHJpbVxuICpcbiAqIEByZXR1cm5zIHtTdHJpbmd9IFRoZSBTdHJpbmcgZnJlZWQgb2YgZXhjZXNzIHdoaXRlc3BhY2VcbiAqL1xuY29uc3QgdHJpbSA9IChzdHIpID0+IHN0ci50cmltID9cbiAgc3RyLnRyaW0oKSA6IHN0ci5yZXBsYWNlKC9eW1xcc1xcdUZFRkZcXHhBMF0rfFtcXHNcXHVGRUZGXFx4QTBdKyQvZywgJycpO1xuXG4vKipcbiAqIEl0ZXJhdGUgb3ZlciBhbiBBcnJheSBvciBhbiBPYmplY3QgaW52b2tpbmcgYSBmdW5jdGlvbiBmb3IgZWFjaCBpdGVtLlxuICpcbiAqIElmIGBvYmpgIGlzIGFuIEFycmF5IGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkIHBhc3NpbmdcbiAqIHRoZSB2YWx1ZSwgaW5kZXgsIGFuZCBjb21wbGV0ZSBhcnJheSBmb3IgZWFjaCBpdGVtLlxuICpcbiAqIElmICdvYmonIGlzIGFuIE9iamVjdCBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZCBwYXNzaW5nXG4gKiB0aGUgdmFsdWUsIGtleSwgYW5kIGNvbXBsZXRlIG9iamVjdCBmb3IgZWFjaCBwcm9wZXJ0eS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdHxBcnJheX0gb2JqIFRoZSBvYmplY3QgdG8gaXRlcmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGNhbGxiYWNrIHRvIGludm9rZSBmb3IgZWFjaCBpdGVtXG4gKlxuICogQHBhcmFtIHtCb29sZWFufSBbYWxsT3duS2V5cyA9IGZhbHNlXVxuICogQHJldHVybnMge2FueX1cbiAqL1xuZnVuY3Rpb24gZm9yRWFjaChvYmosIGZuLCB7YWxsT3duS2V5cyA9IGZhbHNlfSA9IHt9KSB7XG4gIC8vIERvbid0IGJvdGhlciBpZiBubyB2YWx1ZSBwcm92aWRlZFxuICBpZiAob2JqID09PSBudWxsIHx8IHR5cGVvZiBvYmogPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbGV0IGk7XG4gIGxldCBsO1xuXG4gIC8vIEZvcmNlIGFuIGFycmF5IGlmIG5vdCBhbHJlYWR5IHNvbWV0aGluZyBpdGVyYWJsZVxuICBpZiAodHlwZW9mIG9iaiAhPT0gJ29iamVjdCcpIHtcbiAgICAvKmVzbGludCBuby1wYXJhbS1yZWFzc2lnbjowKi9cbiAgICBvYmogPSBbb2JqXTtcbiAgfVxuXG4gIGlmIChpc0FycmF5KG9iaikpIHtcbiAgICAvLyBJdGVyYXRlIG92ZXIgYXJyYXkgdmFsdWVzXG4gICAgZm9yIChpID0gMCwgbCA9IG9iai5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIGZuLmNhbGwobnVsbCwgb2JqW2ldLCBpLCBvYmopO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBJdGVyYXRlIG92ZXIgb2JqZWN0IGtleXNcbiAgICBjb25zdCBrZXlzID0gYWxsT3duS2V5cyA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG9iaikgOiBPYmplY3Qua2V5cyhvYmopO1xuICAgIGNvbnN0IGxlbiA9IGtleXMubGVuZ3RoO1xuICAgIGxldCBrZXk7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGtleSA9IGtleXNbaV07XG4gICAgICBmbi5jYWxsKG51bGwsIG9ialtrZXldLCBrZXksIG9iaik7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmRLZXkob2JqLCBrZXkpIHtcbiAga2V5ID0ga2V5LnRvTG93ZXJDYXNlKCk7XG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhvYmopO1xuICBsZXQgaSA9IGtleXMubGVuZ3RoO1xuICBsZXQgX2tleTtcbiAgd2hpbGUgKGktLSA+IDApIHtcbiAgICBfa2V5ID0ga2V5c1tpXTtcbiAgICBpZiAoa2V5ID09PSBfa2V5LnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgIHJldHVybiBfa2V5O1xuICAgIH1cbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuY29uc3QgX2dsb2JhbCA9ICgoKSA9PiB7XG4gIC8qZXNsaW50IG5vLXVuZGVmOjAqL1xuICBpZiAodHlwZW9mIGdsb2JhbFRoaXMgIT09IFwidW5kZWZpbmVkXCIpIHJldHVybiBnbG9iYWxUaGlzO1xuICByZXR1cm4gdHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIgPyBzZWxmIDogKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnID8gd2luZG93IDogZ2xvYmFsKVxufSkoKTtcblxuY29uc3QgaXNDb250ZXh0RGVmaW5lZCA9IChjb250ZXh0KSA9PiAhaXNVbmRlZmluZWQoY29udGV4dCkgJiYgY29udGV4dCAhPT0gX2dsb2JhbDtcblxuLyoqXG4gKiBBY2NlcHRzIHZhcmFyZ3MgZXhwZWN0aW5nIGVhY2ggYXJndW1lbnQgdG8gYmUgYW4gb2JqZWN0LCB0aGVuXG4gKiBpbW11dGFibHkgbWVyZ2VzIHRoZSBwcm9wZXJ0aWVzIG9mIGVhY2ggb2JqZWN0IGFuZCByZXR1cm5zIHJlc3VsdC5cbiAqXG4gKiBXaGVuIG11bHRpcGxlIG9iamVjdHMgY29udGFpbiB0aGUgc2FtZSBrZXkgdGhlIGxhdGVyIG9iamVjdCBpblxuICogdGhlIGFyZ3VtZW50cyBsaXN0IHdpbGwgdGFrZSBwcmVjZWRlbmNlLlxuICpcbiAqIEV4YW1wbGU6XG4gKlxuICogYGBganNcbiAqIHZhciByZXN1bHQgPSBtZXJnZSh7Zm9vOiAxMjN9LCB7Zm9vOiA0NTZ9KTtcbiAqIGNvbnNvbGUubG9nKHJlc3VsdC5mb28pOyAvLyBvdXRwdXRzIDQ1NlxuICogYGBgXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9iajEgT2JqZWN0IHRvIG1lcmdlXG4gKlxuICogQHJldHVybnMge09iamVjdH0gUmVzdWx0IG9mIGFsbCBtZXJnZSBwcm9wZXJ0aWVzXG4gKi9cbmZ1bmN0aW9uIG1lcmdlKC8qIG9iajEsIG9iajIsIG9iajMsIC4uLiAqLykge1xuICBjb25zdCB7Y2FzZWxlc3N9ID0gaXNDb250ZXh0RGVmaW5lZCh0aGlzKSAmJiB0aGlzIHx8IHt9O1xuICBjb25zdCByZXN1bHQgPSB7fTtcbiAgY29uc3QgYXNzaWduVmFsdWUgPSAodmFsLCBrZXkpID0+IHtcbiAgICBjb25zdCB0YXJnZXRLZXkgPSBjYXNlbGVzcyAmJiBmaW5kS2V5KHJlc3VsdCwga2V5KSB8fCBrZXk7XG4gICAgaWYgKGlzUGxhaW5PYmplY3QocmVzdWx0W3RhcmdldEtleV0pICYmIGlzUGxhaW5PYmplY3QodmFsKSkge1xuICAgICAgcmVzdWx0W3RhcmdldEtleV0gPSBtZXJnZShyZXN1bHRbdGFyZ2V0S2V5XSwgdmFsKTtcbiAgICB9IGVsc2UgaWYgKGlzUGxhaW5PYmplY3QodmFsKSkge1xuICAgICAgcmVzdWx0W3RhcmdldEtleV0gPSBtZXJnZSh7fSwgdmFsKTtcbiAgICB9IGVsc2UgaWYgKGlzQXJyYXkodmFsKSkge1xuICAgICAgcmVzdWx0W3RhcmdldEtleV0gPSB2YWwuc2xpY2UoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0W3RhcmdldEtleV0gPSB2YWw7XG4gICAgfVxuICB9XG5cbiAgZm9yIChsZXQgaSA9IDAsIGwgPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgYXJndW1lbnRzW2ldICYmIGZvckVhY2goYXJndW1lbnRzW2ldLCBhc3NpZ25WYWx1ZSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBFeHRlbmRzIG9iamVjdCBhIGJ5IG11dGFibHkgYWRkaW5nIHRvIGl0IHRoZSBwcm9wZXJ0aWVzIG9mIG9iamVjdCBiLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBhIFRoZSBvYmplY3QgdG8gYmUgZXh0ZW5kZWRcbiAqIEBwYXJhbSB7T2JqZWN0fSBiIFRoZSBvYmplY3QgdG8gY29weSBwcm9wZXJ0aWVzIGZyb21cbiAqIEBwYXJhbSB7T2JqZWN0fSB0aGlzQXJnIFRoZSBvYmplY3QgdG8gYmluZCBmdW5jdGlvbiB0b1xuICpcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW2FsbE93bktleXNdXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgcmVzdWx0aW5nIHZhbHVlIG9mIG9iamVjdCBhXG4gKi9cbmNvbnN0IGV4dGVuZCA9IChhLCBiLCB0aGlzQXJnLCB7YWxsT3duS2V5c309IHt9KSA9PiB7XG4gIGZvckVhY2goYiwgKHZhbCwga2V5KSA9PiB7XG4gICAgaWYgKHRoaXNBcmcgJiYgaXNGdW5jdGlvbih2YWwpKSB7XG4gICAgICBhW2tleV0gPSBiaW5kKHZhbCwgdGhpc0FyZyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFba2V5XSA9IHZhbDtcbiAgICB9XG4gIH0sIHthbGxPd25LZXlzfSk7XG4gIHJldHVybiBhO1xufVxuXG4vKipcbiAqIFJlbW92ZSBieXRlIG9yZGVyIG1hcmtlci4gVGhpcyBjYXRjaGVzIEVGIEJCIEJGICh0aGUgVVRGLTggQk9NKVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb250ZW50IHdpdGggQk9NXG4gKlxuICogQHJldHVybnMge3N0cmluZ30gY29udGVudCB2YWx1ZSB3aXRob3V0IEJPTVxuICovXG5jb25zdCBzdHJpcEJPTSA9IChjb250ZW50KSA9PiB7XG4gIGlmIChjb250ZW50LmNoYXJDb2RlQXQoMCkgPT09IDB4RkVGRikge1xuICAgIGNvbnRlbnQgPSBjb250ZW50LnNsaWNlKDEpO1xuICB9XG4gIHJldHVybiBjb250ZW50O1xufVxuXG4vKipcbiAqIEluaGVyaXQgdGhlIHByb3RvdHlwZSBtZXRob2RzIGZyb20gb25lIGNvbnN0cnVjdG9yIGludG8gYW5vdGhlclxuICogQHBhcmFtIHtmdW5jdGlvbn0gY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IHN1cGVyQ29uc3RydWN0b3JcbiAqIEBwYXJhbSB7b2JqZWN0fSBbcHJvcHNdXG4gKiBAcGFyYW0ge29iamVjdH0gW2Rlc2NyaXB0b3JzXVxuICpcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5jb25zdCBpbmhlcml0cyA9IChjb25zdHJ1Y3Rvciwgc3VwZXJDb25zdHJ1Y3RvciwgcHJvcHMsIGRlc2NyaXB0b3JzKSA9PiB7XG4gIGNvbnN0cnVjdG9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIGRlc2NyaXB0b3JzKTtcbiAgY29uc3RydWN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gY29uc3RydWN0b3I7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb25zdHJ1Y3RvciwgJ3N1cGVyJywge1xuICAgIHZhbHVlOiBzdXBlckNvbnN0cnVjdG9yLnByb3RvdHlwZVxuICB9KTtcbiAgcHJvcHMgJiYgT2JqZWN0LmFzc2lnbihjb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3BzKTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIG9iamVjdCB3aXRoIGRlZXAgcHJvdG90eXBlIGNoYWluIHRvIGEgZmxhdCBvYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2VPYmogc291cmNlIG9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IFtkZXN0T2JqXVxuICogQHBhcmFtIHtGdW5jdGlvbnxCb29sZWFufSBbZmlsdGVyXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gW3Byb3BGaWx0ZXJdXG4gKlxuICogQHJldHVybnMge09iamVjdH1cbiAqL1xuY29uc3QgdG9GbGF0T2JqZWN0ID0gKHNvdXJjZU9iaiwgZGVzdE9iaiwgZmlsdGVyLCBwcm9wRmlsdGVyKSA9PiB7XG4gIGxldCBwcm9wcztcbiAgbGV0IGk7XG4gIGxldCBwcm9wO1xuICBjb25zdCBtZXJnZWQgPSB7fTtcblxuICBkZXN0T2JqID0gZGVzdE9iaiB8fCB7fTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWVxLW51bGwsZXFlcWVxXG4gIGlmIChzb3VyY2VPYmogPT0gbnVsbCkgcmV0dXJuIGRlc3RPYmo7XG5cbiAgZG8ge1xuICAgIHByb3BzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoc291cmNlT2JqKTtcbiAgICBpID0gcHJvcHMubGVuZ3RoO1xuICAgIHdoaWxlIChpLS0gPiAwKSB7XG4gICAgICBwcm9wID0gcHJvcHNbaV07XG4gICAgICBpZiAoKCFwcm9wRmlsdGVyIHx8IHByb3BGaWx0ZXIocHJvcCwgc291cmNlT2JqLCBkZXN0T2JqKSkgJiYgIW1lcmdlZFtwcm9wXSkge1xuICAgICAgICBkZXN0T2JqW3Byb3BdID0gc291cmNlT2JqW3Byb3BdO1xuICAgICAgICBtZXJnZWRbcHJvcF0gPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBzb3VyY2VPYmogPSBmaWx0ZXIgIT09IGZhbHNlICYmIGdldFByb3RvdHlwZU9mKHNvdXJjZU9iaik7XG4gIH0gd2hpbGUgKHNvdXJjZU9iaiAmJiAoIWZpbHRlciB8fCBmaWx0ZXIoc291cmNlT2JqLCBkZXN0T2JqKSkgJiYgc291cmNlT2JqICE9PSBPYmplY3QucHJvdG90eXBlKTtcblxuICByZXR1cm4gZGVzdE9iajtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgYSBzdHJpbmcgZW5kcyB3aXRoIHRoZSBjaGFyYWN0ZXJzIG9mIGEgc3BlY2lmaWVkIHN0cmluZ1xuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBzZWFyY2hTdHJpbmdcbiAqIEBwYXJhbSB7TnVtYmVyfSBbcG9zaXRpb249IDBdXG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGVuZHNXaXRoID0gKHN0ciwgc2VhcmNoU3RyaW5nLCBwb3NpdGlvbikgPT4ge1xuICBzdHIgPSBTdHJpbmcoc3RyKTtcbiAgaWYgKHBvc2l0aW9uID09PSB1bmRlZmluZWQgfHwgcG9zaXRpb24gPiBzdHIubGVuZ3RoKSB7XG4gICAgcG9zaXRpb24gPSBzdHIubGVuZ3RoO1xuICB9XG4gIHBvc2l0aW9uIC09IHNlYXJjaFN0cmluZy5sZW5ndGg7XG4gIGNvbnN0IGxhc3RJbmRleCA9IHN0ci5pbmRleE9mKHNlYXJjaFN0cmluZywgcG9zaXRpb24pO1xuICByZXR1cm4gbGFzdEluZGV4ICE9PSAtMSAmJiBsYXN0SW5kZXggPT09IHBvc2l0aW9uO1xufVxuXG5cbi8qKlxuICogUmV0dXJucyBuZXcgYXJyYXkgZnJvbSBhcnJheSBsaWtlIG9iamVjdCBvciBudWxsIGlmIGZhaWxlZFxuICpcbiAqIEBwYXJhbSB7Kn0gW3RoaW5nXVxuICpcbiAqIEByZXR1cm5zIHs/QXJyYXl9XG4gKi9cbmNvbnN0IHRvQXJyYXkgPSAodGhpbmcpID0+IHtcbiAgaWYgKCF0aGluZykgcmV0dXJuIG51bGw7XG4gIGlmIChpc0FycmF5KHRoaW5nKSkgcmV0dXJuIHRoaW5nO1xuICBsZXQgaSA9IHRoaW5nLmxlbmd0aDtcbiAgaWYgKCFpc051bWJlcihpKSkgcmV0dXJuIG51bGw7XG4gIGNvbnN0IGFyciA9IG5ldyBBcnJheShpKTtcbiAgd2hpbGUgKGktLSA+IDApIHtcbiAgICBhcnJbaV0gPSB0aGluZ1tpXTtcbiAgfVxuICByZXR1cm4gYXJyO1xufVxuXG4vKipcbiAqIENoZWNraW5nIGlmIHRoZSBVaW50OEFycmF5IGV4aXN0cyBhbmQgaWYgaXQgZG9lcywgaXQgcmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgY2hlY2tzIGlmIHRoZVxuICogdGhpbmcgcGFzc2VkIGluIGlzIGFuIGluc3RhbmNlIG9mIFVpbnQ4QXJyYXlcbiAqXG4gKiBAcGFyYW0ge1R5cGVkQXJyYXl9XG4gKlxuICogQHJldHVybnMge0FycmF5fVxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZnVuYy1uYW1lc1xuY29uc3QgaXNUeXBlZEFycmF5ID0gKFR5cGVkQXJyYXkgPT4ge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZnVuYy1uYW1lc1xuICByZXR1cm4gdGhpbmcgPT4ge1xuICAgIHJldHVybiBUeXBlZEFycmF5ICYmIHRoaW5nIGluc3RhbmNlb2YgVHlwZWRBcnJheTtcbiAgfTtcbn0pKHR5cGVvZiBVaW50OEFycmF5ICE9PSAndW5kZWZpbmVkJyAmJiBnZXRQcm90b3R5cGVPZihVaW50OEFycmF5KSk7XG5cbi8qKlxuICogRm9yIGVhY2ggZW50cnkgaW4gdGhlIG9iamVjdCwgY2FsbCB0aGUgZnVuY3Rpb24gd2l0aCB0aGUga2V5IGFuZCB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdDxhbnksIGFueT59IG9iaiAtIFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gLSBUaGUgZnVuY3Rpb24gdG8gY2FsbCBmb3IgZWFjaCBlbnRyeS5cbiAqXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuY29uc3QgZm9yRWFjaEVudHJ5ID0gKG9iaiwgZm4pID0+IHtcbiAgY29uc3QgZ2VuZXJhdG9yID0gb2JqICYmIG9ialtTeW1ib2wuaXRlcmF0b3JdO1xuXG4gIGNvbnN0IGl0ZXJhdG9yID0gZ2VuZXJhdG9yLmNhbGwob2JqKTtcblxuICBsZXQgcmVzdWx0O1xuXG4gIHdoaWxlICgocmVzdWx0ID0gaXRlcmF0b3IubmV4dCgpKSAmJiAhcmVzdWx0LmRvbmUpIHtcbiAgICBjb25zdCBwYWlyID0gcmVzdWx0LnZhbHVlO1xuICAgIGZuLmNhbGwob2JqLCBwYWlyWzBdLCBwYWlyWzFdKTtcbiAgfVxufVxuXG4vKipcbiAqIEl0IHRha2VzIGEgcmVndWxhciBleHByZXNzaW9uIGFuZCBhIHN0cmluZywgYW5kIHJldHVybnMgYW4gYXJyYXkgb2YgYWxsIHRoZSBtYXRjaGVzXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHJlZ0V4cCAtIFRoZSByZWd1bGFyIGV4cHJlc3Npb24gdG8gbWF0Y2ggYWdhaW5zdC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHIgLSBUaGUgc3RyaW5nIHRvIHNlYXJjaC5cbiAqXG4gKiBAcmV0dXJucyB7QXJyYXk8Ym9vbGVhbj59XG4gKi9cbmNvbnN0IG1hdGNoQWxsID0gKHJlZ0V4cCwgc3RyKSA9PiB7XG4gIGxldCBtYXRjaGVzO1xuICBjb25zdCBhcnIgPSBbXTtcblxuICB3aGlsZSAoKG1hdGNoZXMgPSByZWdFeHAuZXhlYyhzdHIpKSAhPT0gbnVsbCkge1xuICAgIGFyci5wdXNoKG1hdGNoZXMpO1xuICB9XG5cbiAgcmV0dXJuIGFycjtcbn1cblxuLyogQ2hlY2tpbmcgaWYgdGhlIGtpbmRPZlRlc3QgZnVuY3Rpb24gcmV0dXJucyB0cnVlIHdoZW4gcGFzc2VkIGFuIEhUTUxGb3JtRWxlbWVudC4gKi9cbmNvbnN0IGlzSFRNTEZvcm0gPSBraW5kT2ZUZXN0KCdIVE1MRm9ybUVsZW1lbnQnKTtcblxuY29uc3QgdG9DYW1lbENhc2UgPSBzdHIgPT4ge1xuICByZXR1cm4gc3RyLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvWy1fXFxzXShbYS16XFxkXSkoXFx3KikvZyxcbiAgICBmdW5jdGlvbiByZXBsYWNlcihtLCBwMSwgcDIpIHtcbiAgICAgIHJldHVybiBwMS50b1VwcGVyQ2FzZSgpICsgcDI7XG4gICAgfVxuICApO1xufTtcblxuLyogQ3JlYXRpbmcgYSBmdW5jdGlvbiB0aGF0IHdpbGwgY2hlY2sgaWYgYW4gb2JqZWN0IGhhcyBhIHByb3BlcnR5LiAqL1xuY29uc3QgaGFzT3duUHJvcGVydHkgPSAoKHtoYXNPd25Qcm9wZXJ0eX0pID0+IChvYmosIHByb3ApID0+IGhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkoT2JqZWN0LnByb3RvdHlwZSk7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBSZWdFeHAgb2JqZWN0XG4gKlxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIFJlZ0V4cCBvYmplY3QsIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc1JlZ0V4cCA9IGtpbmRPZlRlc3QoJ1JlZ0V4cCcpO1xuXG5jb25zdCByZWR1Y2VEZXNjcmlwdG9ycyA9IChvYmosIHJlZHVjZXIpID0+IHtcbiAgY29uc3QgZGVzY3JpcHRvcnMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhvYmopO1xuICBjb25zdCByZWR1Y2VkRGVzY3JpcHRvcnMgPSB7fTtcblxuICBmb3JFYWNoKGRlc2NyaXB0b3JzLCAoZGVzY3JpcHRvciwgbmFtZSkgPT4ge1xuICAgIGxldCByZXQ7XG4gICAgaWYgKChyZXQgPSByZWR1Y2VyKGRlc2NyaXB0b3IsIG5hbWUsIG9iaikpICE9PSBmYWxzZSkge1xuICAgICAgcmVkdWNlZERlc2NyaXB0b3JzW25hbWVdID0gcmV0IHx8IGRlc2NyaXB0b3I7XG4gICAgfVxuICB9KTtcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhvYmosIHJlZHVjZWREZXNjcmlwdG9ycyk7XG59XG5cbi8qKlxuICogTWFrZXMgYWxsIG1ldGhvZHMgcmVhZC1vbmx5XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqXG4gKi9cblxuY29uc3QgZnJlZXplTWV0aG9kcyA9IChvYmopID0+IHtcbiAgcmVkdWNlRGVzY3JpcHRvcnMob2JqLCAoZGVzY3JpcHRvciwgbmFtZSkgPT4ge1xuICAgIC8vIHNraXAgcmVzdHJpY3RlZCBwcm9wcyBpbiBzdHJpY3QgbW9kZVxuICAgIGlmIChpc0Z1bmN0aW9uKG9iaikgJiYgWydhcmd1bWVudHMnLCAnY2FsbGVyJywgJ2NhbGxlZSddLmluZGV4T2YobmFtZSkgIT09IC0xKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgdmFsdWUgPSBvYmpbbmFtZV07XG5cbiAgICBpZiAoIWlzRnVuY3Rpb24odmFsdWUpKSByZXR1cm47XG5cbiAgICBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBmYWxzZTtcblxuICAgIGlmICgnd3JpdGFibGUnIGluIGRlc2NyaXB0b3IpIHtcbiAgICAgIGRlc2NyaXB0b3Iud3JpdGFibGUgPSBmYWxzZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIWRlc2NyaXB0b3Iuc2V0KSB7XG4gICAgICBkZXNjcmlwdG9yLnNldCA9ICgpID0+IHtcbiAgICAgICAgdGhyb3cgRXJyb3IoJ0NhbiBub3QgcmV3cml0ZSByZWFkLW9ubHkgbWV0aG9kIFxcJycgKyBuYW1lICsgJ1xcJycpO1xuICAgICAgfTtcbiAgICB9XG4gIH0pO1xufVxuXG5jb25zdCB0b09iamVjdFNldCA9IChhcnJheU9yU3RyaW5nLCBkZWxpbWl0ZXIpID0+IHtcbiAgY29uc3Qgb2JqID0ge307XG5cbiAgY29uc3QgZGVmaW5lID0gKGFycikgPT4ge1xuICAgIGFyci5mb3JFYWNoKHZhbHVlID0+IHtcbiAgICAgIG9ialt2YWx1ZV0gPSB0cnVlO1xuICAgIH0pO1xuICB9XG5cbiAgaXNBcnJheShhcnJheU9yU3RyaW5nKSA/IGRlZmluZShhcnJheU9yU3RyaW5nKSA6IGRlZmluZShTdHJpbmcoYXJyYXlPclN0cmluZykuc3BsaXQoZGVsaW1pdGVyKSk7XG5cbiAgcmV0dXJuIG9iajtcbn1cblxuY29uc3Qgbm9vcCA9ICgpID0+IHt9XG5cbmNvbnN0IHRvRmluaXRlTnVtYmVyID0gKHZhbHVlLCBkZWZhdWx0VmFsdWUpID0+IHtcbiAgdmFsdWUgPSArdmFsdWU7XG4gIHJldHVybiBOdW1iZXIuaXNGaW5pdGUodmFsdWUpID8gdmFsdWUgOiBkZWZhdWx0VmFsdWU7XG59XG5cbmNvbnN0IEFMUEhBID0gJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6J1xuXG5jb25zdCBESUdJVCA9ICcwMTIzNDU2Nzg5JztcblxuY29uc3QgQUxQSEFCRVQgPSB7XG4gIERJR0lULFxuICBBTFBIQSxcbiAgQUxQSEFfRElHSVQ6IEFMUEhBICsgQUxQSEEudG9VcHBlckNhc2UoKSArIERJR0lUXG59XG5cbmNvbnN0IGdlbmVyYXRlU3RyaW5nID0gKHNpemUgPSAxNiwgYWxwaGFiZXQgPSBBTFBIQUJFVC5BTFBIQV9ESUdJVCkgPT4ge1xuICBsZXQgc3RyID0gJyc7XG4gIGNvbnN0IHtsZW5ndGh9ID0gYWxwaGFiZXQ7XG4gIHdoaWxlIChzaXplLS0pIHtcbiAgICBzdHIgKz0gYWxwaGFiZXRbTWF0aC5yYW5kb20oKSAqIGxlbmd0aHwwXVxuICB9XG5cbiAgcmV0dXJuIHN0cjtcbn1cblxuLyoqXG4gKiBJZiB0aGUgdGhpbmcgaXMgYSBGb3JtRGF0YSBvYmplY3QsIHJldHVybiB0cnVlLCBvdGhlcndpc2UgcmV0dXJuIGZhbHNlLlxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gdGhpbmcgLSBUaGUgdGhpbmcgdG8gY2hlY2suXG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGlzU3BlY0NvbXBsaWFudEZvcm0odGhpbmcpIHtcbiAgcmV0dXJuICEhKHRoaW5nICYmIGlzRnVuY3Rpb24odGhpbmcuYXBwZW5kKSAmJiB0aGluZ1tTeW1ib2wudG9TdHJpbmdUYWddID09PSAnRm9ybURhdGEnICYmIHRoaW5nW1N5bWJvbC5pdGVyYXRvcl0pO1xufVxuXG5jb25zdCB0b0pTT05PYmplY3QgPSAob2JqKSA9PiB7XG4gIGNvbnN0IHN0YWNrID0gbmV3IEFycmF5KDEwKTtcblxuICBjb25zdCB2aXNpdCA9IChzb3VyY2UsIGkpID0+IHtcblxuICAgIGlmIChpc09iamVjdChzb3VyY2UpKSB7XG4gICAgICBpZiAoc3RhY2suaW5kZXhPZihzb3VyY2UpID49IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZighKCd0b0pTT04nIGluIHNvdXJjZSkpIHtcbiAgICAgICAgc3RhY2tbaV0gPSBzb3VyY2U7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGlzQXJyYXkoc291cmNlKSA/IFtdIDoge307XG5cbiAgICAgICAgZm9yRWFjaChzb3VyY2UsICh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgICAgY29uc3QgcmVkdWNlZFZhbHVlID0gdmlzaXQodmFsdWUsIGkgKyAxKTtcbiAgICAgICAgICAhaXNVbmRlZmluZWQocmVkdWNlZFZhbHVlKSAmJiAodGFyZ2V0W2tleV0gPSByZWR1Y2VkVmFsdWUpO1xuICAgICAgICB9KTtcblxuICAgICAgICBzdGFja1tpXSA9IHVuZGVmaW5lZDtcblxuICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzb3VyY2U7XG4gIH1cblxuICByZXR1cm4gdmlzaXQob2JqLCAwKTtcbn1cblxuY29uc3QgaXNBc3luY0ZuID0ga2luZE9mVGVzdCgnQXN5bmNGdW5jdGlvbicpO1xuXG5jb25zdCBpc1RoZW5hYmxlID0gKHRoaW5nKSA9PlxuICB0aGluZyAmJiAoaXNPYmplY3QodGhpbmcpIHx8IGlzRnVuY3Rpb24odGhpbmcpKSAmJiBpc0Z1bmN0aW9uKHRoaW5nLnRoZW4pICYmIGlzRnVuY3Rpb24odGhpbmcuY2F0Y2gpO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGlzQXJyYXksXG4gIGlzQXJyYXlCdWZmZXIsXG4gIGlzQnVmZmVyLFxuICBpc0Zvcm1EYXRhLFxuICBpc0FycmF5QnVmZmVyVmlldyxcbiAgaXNTdHJpbmcsXG4gIGlzTnVtYmVyLFxuICBpc0Jvb2xlYW4sXG4gIGlzT2JqZWN0LFxuICBpc1BsYWluT2JqZWN0LFxuICBpc1VuZGVmaW5lZCxcbiAgaXNEYXRlLFxuICBpc0ZpbGUsXG4gIGlzQmxvYixcbiAgaXNSZWdFeHAsXG4gIGlzRnVuY3Rpb24sXG4gIGlzU3RyZWFtLFxuICBpc1VSTFNlYXJjaFBhcmFtcyxcbiAgaXNUeXBlZEFycmF5LFxuICBpc0ZpbGVMaXN0LFxuICBmb3JFYWNoLFxuICBtZXJnZSxcbiAgZXh0ZW5kLFxuICB0cmltLFxuICBzdHJpcEJPTSxcbiAgaW5oZXJpdHMsXG4gIHRvRmxhdE9iamVjdCxcbiAga2luZE9mLFxuICBraW5kT2ZUZXN0LFxuICBlbmRzV2l0aCxcbiAgdG9BcnJheSxcbiAgZm9yRWFjaEVudHJ5LFxuICBtYXRjaEFsbCxcbiAgaXNIVE1MRm9ybSxcbiAgaGFzT3duUHJvcGVydHksXG4gIGhhc093blByb3A6IGhhc093blByb3BlcnR5LCAvLyBhbiBhbGlhcyB0byBhdm9pZCBFU0xpbnQgbm8tcHJvdG90eXBlLWJ1aWx0aW5zIGRldGVjdGlvblxuICByZWR1Y2VEZXNjcmlwdG9ycyxcbiAgZnJlZXplTWV0aG9kcyxcbiAgdG9PYmplY3RTZXQsXG4gIHRvQ2FtZWxDYXNlLFxuICBub29wLFxuICB0b0Zpbml0ZU51bWJlcixcbiAgZmluZEtleSxcbiAgZ2xvYmFsOiBfZ2xvYmFsLFxuICBpc0NvbnRleHREZWZpbmVkLFxuICBBTFBIQUJFVCxcbiAgZ2VuZXJhdGVTdHJpbmcsXG4gIGlzU3BlY0NvbXBsaWFudEZvcm0sXG4gIHRvSlNPTk9iamVjdCxcbiAgaXNBc3luY0ZuLFxuICBpc1RoZW5hYmxlXG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgdXRpbHMgZnJvbSAnLi4vdXRpbHMuanMnO1xuXG4vKipcbiAqIENyZWF0ZSBhbiBFcnJvciB3aXRoIHRoZSBzcGVjaWZpZWQgbWVzc2FnZSwgY29uZmlnLCBlcnJvciBjb2RlLCByZXF1ZXN0IGFuZCByZXNwb25zZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZSBUaGUgZXJyb3IgbWVzc2FnZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbY29kZV0gVGhlIGVycm9yIGNvZGUgKGZvciBleGFtcGxlLCAnRUNPTk5BQk9SVEVEJykuXG4gKiBAcGFyYW0ge09iamVjdH0gW2NvbmZpZ10gVGhlIGNvbmZpZy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcmVxdWVzdF0gVGhlIHJlcXVlc3QuXG4gKiBAcGFyYW0ge09iamVjdH0gW3Jlc3BvbnNlXSBUaGUgcmVzcG9uc2UuXG4gKlxuICogQHJldHVybnMge0Vycm9yfSBUaGUgY3JlYXRlZCBlcnJvci5cbiAqL1xuZnVuY3Rpb24gQXhpb3NFcnJvcihtZXNzYWdlLCBjb2RlLCBjb25maWcsIHJlcXVlc3QsIHJlc3BvbnNlKSB7XG4gIEVycm9yLmNhbGwodGhpcyk7XG5cbiAgaWYgKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKSB7XG4gICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgdGhpcy5jb25zdHJ1Y3Rvcik7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5zdGFjayA9IChuZXcgRXJyb3IoKSkuc3RhY2s7XG4gIH1cblxuICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICB0aGlzLm5hbWUgPSAnQXhpb3NFcnJvcic7XG4gIGNvZGUgJiYgKHRoaXMuY29kZSA9IGNvZGUpO1xuICBjb25maWcgJiYgKHRoaXMuY29uZmlnID0gY29uZmlnKTtcbiAgcmVxdWVzdCAmJiAodGhpcy5yZXF1ZXN0ID0gcmVxdWVzdCk7XG4gIHJlc3BvbnNlICYmICh0aGlzLnJlc3BvbnNlID0gcmVzcG9uc2UpO1xufVxuXG51dGlscy5pbmhlcml0cyhBeGlvc0Vycm9yLCBFcnJvciwge1xuICB0b0pTT046IGZ1bmN0aW9uIHRvSlNPTigpIHtcbiAgICByZXR1cm4ge1xuICAgICAgLy8gU3RhbmRhcmRcbiAgICAgIG1lc3NhZ2U6IHRoaXMubWVzc2FnZSxcbiAgICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICAgIC8vIE1pY3Jvc29mdFxuICAgICAgZGVzY3JpcHRpb246IHRoaXMuZGVzY3JpcHRpb24sXG4gICAgICBudW1iZXI6IHRoaXMubnVtYmVyLFxuICAgICAgLy8gTW96aWxsYVxuICAgICAgZmlsZU5hbWU6IHRoaXMuZmlsZU5hbWUsXG4gICAgICBsaW5lTnVtYmVyOiB0aGlzLmxpbmVOdW1iZXIsXG4gICAgICBjb2x1bW5OdW1iZXI6IHRoaXMuY29sdW1uTnVtYmVyLFxuICAgICAgc3RhY2s6IHRoaXMuc3RhY2ssXG4gICAgICAvLyBBeGlvc1xuICAgICAgY29uZmlnOiB1dGlscy50b0pTT05PYmplY3QodGhpcy5jb25maWcpLFxuICAgICAgY29kZTogdGhpcy5jb2RlLFxuICAgICAgc3RhdHVzOiB0aGlzLnJlc3BvbnNlICYmIHRoaXMucmVzcG9uc2Uuc3RhdHVzID8gdGhpcy5yZXNwb25zZS5zdGF0dXMgOiBudWxsXG4gICAgfTtcbiAgfVxufSk7XG5cbmNvbnN0IHByb3RvdHlwZSA9IEF4aW9zRXJyb3IucHJvdG90eXBlO1xuY29uc3QgZGVzY3JpcHRvcnMgPSB7fTtcblxuW1xuICAnRVJSX0JBRF9PUFRJT05fVkFMVUUnLFxuICAnRVJSX0JBRF9PUFRJT04nLFxuICAnRUNPTk5BQk9SVEVEJyxcbiAgJ0VUSU1FRE9VVCcsXG4gICdFUlJfTkVUV09SSycsXG4gICdFUlJfRlJfVE9PX01BTllfUkVESVJFQ1RTJyxcbiAgJ0VSUl9ERVBSRUNBVEVEJyxcbiAgJ0VSUl9CQURfUkVTUE9OU0UnLFxuICAnRVJSX0JBRF9SRVFVRVNUJyxcbiAgJ0VSUl9DQU5DRUxFRCcsXG4gICdFUlJfTk9UX1NVUFBPUlQnLFxuICAnRVJSX0lOVkFMSURfVVJMJ1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGZ1bmMtbmFtZXNcbl0uZm9yRWFjaChjb2RlID0+IHtcbiAgZGVzY3JpcHRvcnNbY29kZV0gPSB7dmFsdWU6IGNvZGV9O1xufSk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKEF4aW9zRXJyb3IsIGRlc2NyaXB0b3JzKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShwcm90b3R5cGUsICdpc0F4aW9zRXJyb3InLCB7dmFsdWU6IHRydWV9KTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGZ1bmMtbmFtZXNcbkF4aW9zRXJyb3IuZnJvbSA9IChlcnJvciwgY29kZSwgY29uZmlnLCByZXF1ZXN0LCByZXNwb25zZSwgY3VzdG9tUHJvcHMpID0+IHtcbiAgY29uc3QgYXhpb3NFcnJvciA9IE9iamVjdC5jcmVhdGUocHJvdG90eXBlKTtcblxuICB1dGlscy50b0ZsYXRPYmplY3QoZXJyb3IsIGF4aW9zRXJyb3IsIGZ1bmN0aW9uIGZpbHRlcihvYmopIHtcbiAgICByZXR1cm4gb2JqICE9PSBFcnJvci5wcm90b3R5cGU7XG4gIH0sIHByb3AgPT4ge1xuICAgIHJldHVybiBwcm9wICE9PSAnaXNBeGlvc0Vycm9yJztcbiAgfSk7XG5cbiAgQXhpb3NFcnJvci5jYWxsKGF4aW9zRXJyb3IsIGVycm9yLm1lc3NhZ2UsIGNvZGUsIGNvbmZpZywgcmVxdWVzdCwgcmVzcG9uc2UpO1xuXG4gIGF4aW9zRXJyb3IuY2F1c2UgPSBlcnJvcjtcblxuICBheGlvc0Vycm9yLm5hbWUgPSBlcnJvci5uYW1lO1xuXG4gIGN1c3RvbVByb3BzICYmIE9iamVjdC5hc3NpZ24oYXhpb3NFcnJvciwgY3VzdG9tUHJvcHMpO1xuXG4gIHJldHVybiBheGlvc0Vycm9yO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgQXhpb3NFcnJvcjtcbiIsIi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBzdHJpY3RcbmV4cG9ydCBkZWZhdWx0IG51bGw7XG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCB1dGlscyBmcm9tICcuLi91dGlscy5qcyc7XG5pbXBvcnQgQXhpb3NFcnJvciBmcm9tICcuLi9jb3JlL0F4aW9zRXJyb3IuanMnO1xuLy8gdGVtcG9yYXJ5IGhvdGZpeCB0byBhdm9pZCBjaXJjdWxhciByZWZlcmVuY2VzIHVudGlsIEF4aW9zVVJMU2VhcmNoUGFyYW1zIGlzIHJlZmFjdG9yZWRcbmltcG9ydCBQbGF0Zm9ybUZvcm1EYXRhIGZyb20gJy4uL3BsYXRmb3JtL25vZGUvY2xhc3Nlcy9Gb3JtRGF0YS5qcyc7XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiB0aGUgZ2l2ZW4gdGhpbmcgaXMgYSBhcnJheSBvciBqcyBvYmplY3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHRoaW5nIC0gVGhlIG9iamVjdCBvciBhcnJheSB0byBiZSB2aXNpdGVkLlxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBpc1Zpc2l0YWJsZSh0aGluZykge1xuICByZXR1cm4gdXRpbHMuaXNQbGFpbk9iamVjdCh0aGluZykgfHwgdXRpbHMuaXNBcnJheSh0aGluZyk7XG59XG5cbi8qKlxuICogSXQgcmVtb3ZlcyB0aGUgYnJhY2tldHMgZnJvbSB0aGUgZW5kIG9mIGEgc3RyaW5nXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBrZXkgb2YgdGhlIHBhcmFtZXRlci5cbiAqXG4gKiBAcmV0dXJucyB7c3RyaW5nfSB0aGUga2V5IHdpdGhvdXQgdGhlIGJyYWNrZXRzLlxuICovXG5mdW5jdGlvbiByZW1vdmVCcmFja2V0cyhrZXkpIHtcbiAgcmV0dXJuIHV0aWxzLmVuZHNXaXRoKGtleSwgJ1tdJykgPyBrZXkuc2xpY2UoMCwgLTIpIDoga2V5O1xufVxuXG4vKipcbiAqIEl0IHRha2VzIGEgcGF0aCwgYSBrZXksIGFuZCBhIGJvb2xlYW4sIGFuZCByZXR1cm5zIGEgc3RyaW5nXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGggLSBUaGUgcGF0aCB0byB0aGUgY3VycmVudCBrZXkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIGtleSBvZiB0aGUgY3VycmVudCBvYmplY3QgYmVpbmcgaXRlcmF0ZWQgb3Zlci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBkb3RzIC0gSWYgdHJ1ZSwgdGhlIGtleSB3aWxsIGJlIHJlbmRlcmVkIHdpdGggZG90cyBpbnN0ZWFkIG9mIGJyYWNrZXRzLlxuICpcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBwYXRoIHRvIHRoZSBjdXJyZW50IGtleS5cbiAqL1xuZnVuY3Rpb24gcmVuZGVyS2V5KHBhdGgsIGtleSwgZG90cykge1xuICBpZiAoIXBhdGgpIHJldHVybiBrZXk7XG4gIHJldHVybiBwYXRoLmNvbmNhdChrZXkpLm1hcChmdW5jdGlvbiBlYWNoKHRva2VuLCBpKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgdG9rZW4gPSByZW1vdmVCcmFja2V0cyh0b2tlbik7XG4gICAgcmV0dXJuICFkb3RzICYmIGkgPyAnWycgKyB0b2tlbiArICddJyA6IHRva2VuO1xuICB9KS5qb2luKGRvdHMgPyAnLicgOiAnJyk7XG59XG5cbi8qKlxuICogSWYgdGhlIGFycmF5IGlzIGFuIGFycmF5IGFuZCBub25lIG9mIGl0cyBlbGVtZW50cyBhcmUgdmlzaXRhYmxlLCB0aGVuIGl0J3MgYSBmbGF0IGFycmF5LlxuICpcbiAqIEBwYXJhbSB7QXJyYXk8YW55Pn0gYXJyIC0gVGhlIGFycmF5IHRvIGNoZWNrXG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGlzRmxhdEFycmF5KGFycikge1xuICByZXR1cm4gdXRpbHMuaXNBcnJheShhcnIpICYmICFhcnIuc29tZShpc1Zpc2l0YWJsZSk7XG59XG5cbmNvbnN0IHByZWRpY2F0ZXMgPSB1dGlscy50b0ZsYXRPYmplY3QodXRpbHMsIHt9LCBudWxsLCBmdW5jdGlvbiBmaWx0ZXIocHJvcCkge1xuICByZXR1cm4gL15pc1tBLVpdLy50ZXN0KHByb3ApO1xufSk7XG5cbi8qKlxuICogQ29udmVydCBhIGRhdGEgb2JqZWN0IHRvIEZvcm1EYXRhXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9ialxuICogQHBhcmFtIHs/T2JqZWN0fSBbZm9ybURhdGFdXG4gKiBAcGFyYW0gez9PYmplY3R9IFtvcHRpb25zXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdGlvbnMudmlzaXRvcl1cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMubWV0YVRva2VucyA9IHRydWVdXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmRvdHMgPSBmYWxzZV1cbiAqIEBwYXJhbSB7P0Jvb2xlYW59IFtvcHRpb25zLmluZGV4ZXMgPSBmYWxzZV1cbiAqXG4gKiBAcmV0dXJucyB7T2JqZWN0fVxuICoqL1xuXG4vKipcbiAqIEl0IGNvbnZlcnRzIGFuIG9iamVjdCBpbnRvIGEgRm9ybURhdGEgb2JqZWN0XG4gKlxuICogQHBhcmFtIHtPYmplY3Q8YW55LCBhbnk+fSBvYmogLSBUaGUgb2JqZWN0IHRvIGNvbnZlcnQgdG8gZm9ybSBkYXRhLlxuICogQHBhcmFtIHtzdHJpbmd9IGZvcm1EYXRhIC0gVGhlIEZvcm1EYXRhIG9iamVjdCB0byBhcHBlbmQgdG8uXG4gKiBAcGFyYW0ge09iamVjdDxzdHJpbmcsIGFueT59IG9wdGlvbnNcbiAqXG4gKiBAcmV0dXJuc1xuICovXG5mdW5jdGlvbiB0b0Zvcm1EYXRhKG9iaiwgZm9ybURhdGEsIG9wdGlvbnMpIHtcbiAgaWYgKCF1dGlscy5pc09iamVjdChvYmopKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndGFyZ2V0IG11c3QgYmUgYW4gb2JqZWN0Jyk7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgZm9ybURhdGEgPSBmb3JtRGF0YSB8fCBuZXcgKFBsYXRmb3JtRm9ybURhdGEgfHwgRm9ybURhdGEpKCk7XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gIG9wdGlvbnMgPSB1dGlscy50b0ZsYXRPYmplY3Qob3B0aW9ucywge1xuICAgIG1ldGFUb2tlbnM6IHRydWUsXG4gICAgZG90czogZmFsc2UsXG4gICAgaW5kZXhlczogZmFsc2VcbiAgfSwgZmFsc2UsIGZ1bmN0aW9uIGRlZmluZWQob3B0aW9uLCBzb3VyY2UpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZXEtbnVsbCxlcWVxZXFcbiAgICByZXR1cm4gIXV0aWxzLmlzVW5kZWZpbmVkKHNvdXJjZVtvcHRpb25dKTtcbiAgfSk7XG5cbiAgY29uc3QgbWV0YVRva2VucyA9IG9wdGlvbnMubWV0YVRva2VucztcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lXG4gIGNvbnN0IHZpc2l0b3IgPSBvcHRpb25zLnZpc2l0b3IgfHwgZGVmYXVsdFZpc2l0b3I7XG4gIGNvbnN0IGRvdHMgPSBvcHRpb25zLmRvdHM7XG4gIGNvbnN0IGluZGV4ZXMgPSBvcHRpb25zLmluZGV4ZXM7XG4gIGNvbnN0IF9CbG9iID0gb3B0aW9ucy5CbG9iIHx8IHR5cGVvZiBCbG9iICE9PSAndW5kZWZpbmVkJyAmJiBCbG9iO1xuICBjb25zdCB1c2VCbG9iID0gX0Jsb2IgJiYgdXRpbHMuaXNTcGVjQ29tcGxpYW50Rm9ybShmb3JtRGF0YSk7XG5cbiAgaWYgKCF1dGlscy5pc0Z1bmN0aW9uKHZpc2l0b3IpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndmlzaXRvciBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNvbnZlcnRWYWx1ZSh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkgcmV0dXJuICcnO1xuXG4gICAgaWYgKHV0aWxzLmlzRGF0ZSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB2YWx1ZS50b0lTT1N0cmluZygpO1xuICAgIH1cblxuICAgIGlmICghdXNlQmxvYiAmJiB1dGlscy5pc0Jsb2IodmFsdWUpKSB7XG4gICAgICB0aHJvdyBuZXcgQXhpb3NFcnJvcignQmxvYiBpcyBub3Qgc3VwcG9ydGVkLiBVc2UgYSBCdWZmZXIgaW5zdGVhZC4nKTtcbiAgICB9XG5cbiAgICBpZiAodXRpbHMuaXNBcnJheUJ1ZmZlcih2YWx1ZSkgfHwgdXRpbHMuaXNUeXBlZEFycmF5KHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHVzZUJsb2IgJiYgdHlwZW9mIEJsb2IgPT09ICdmdW5jdGlvbicgPyBuZXcgQmxvYihbdmFsdWVdKSA6IEJ1ZmZlci5mcm9tKHZhbHVlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogRGVmYXVsdCB2aXNpdG9yLlxuICAgKlxuICAgKiBAcGFyYW0geyp9IHZhbHVlXG4gICAqIEBwYXJhbSB7U3RyaW5nfE51bWJlcn0ga2V5XG4gICAqIEBwYXJhbSB7QXJyYXk8U3RyaW5nfE51bWJlcj59IHBhdGhcbiAgICogQHRoaXMge0Zvcm1EYXRhfVxuICAgKlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gcmV0dXJuIHRydWUgdG8gdmlzaXQgdGhlIGVhY2ggcHJvcCBvZiB0aGUgdmFsdWUgcmVjdXJzaXZlbHlcbiAgICovXG4gIGZ1bmN0aW9uIGRlZmF1bHRWaXNpdG9yKHZhbHVlLCBrZXksIHBhdGgpIHtcbiAgICBsZXQgYXJyID0gdmFsdWU7XG5cbiAgICBpZiAodmFsdWUgJiYgIXBhdGggJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgaWYgKHV0aWxzLmVuZHNXaXRoKGtleSwgJ3t9JykpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgIGtleSA9IG1ldGFUb2tlbnMgPyBrZXkgOiBrZXkuc2xpY2UoMCwgLTIpO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAgdmFsdWUgPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAodXRpbHMuaXNBcnJheSh2YWx1ZSkgJiYgaXNGbGF0QXJyYXkodmFsdWUpKSB8fFxuICAgICAgICAoKHV0aWxzLmlzRmlsZUxpc3QodmFsdWUpIHx8IHV0aWxzLmVuZHNXaXRoKGtleSwgJ1tdJykpICYmIChhcnIgPSB1dGlscy50b0FycmF5KHZhbHVlKSlcbiAgICAgICAgKSkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAga2V5ID0gcmVtb3ZlQnJhY2tldHMoa2V5KTtcblxuICAgICAgICBhcnIuZm9yRWFjaChmdW5jdGlvbiBlYWNoKGVsLCBpbmRleCkge1xuICAgICAgICAgICEodXRpbHMuaXNVbmRlZmluZWQoZWwpIHx8IGVsID09PSBudWxsKSAmJiBmb3JtRGF0YS5hcHBlbmQoXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmVzdGVkLXRlcm5hcnlcbiAgICAgICAgICAgIGluZGV4ZXMgPT09IHRydWUgPyByZW5kZXJLZXkoW2tleV0sIGluZGV4LCBkb3RzKSA6IChpbmRleGVzID09PSBudWxsID8ga2V5IDoga2V5ICsgJ1tdJyksXG4gICAgICAgICAgICBjb252ZXJ0VmFsdWUoZWwpXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaXNWaXNpdGFibGUodmFsdWUpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBmb3JtRGF0YS5hcHBlbmQocmVuZGVyS2V5KHBhdGgsIGtleSwgZG90cyksIGNvbnZlcnRWYWx1ZSh2YWx1ZSkpO1xuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3Qgc3RhY2sgPSBbXTtcblxuICBjb25zdCBleHBvc2VkSGVscGVycyA9IE9iamVjdC5hc3NpZ24ocHJlZGljYXRlcywge1xuICAgIGRlZmF1bHRWaXNpdG9yLFxuICAgIGNvbnZlcnRWYWx1ZSxcbiAgICBpc1Zpc2l0YWJsZVxuICB9KTtcblxuICBmdW5jdGlvbiBidWlsZCh2YWx1ZSwgcGF0aCkge1xuICAgIGlmICh1dGlscy5pc1VuZGVmaW5lZCh2YWx1ZSkpIHJldHVybjtcblxuICAgIGlmIChzdGFjay5pbmRleE9mKHZhbHVlKSAhPT0gLTEpIHtcbiAgICAgIHRocm93IEVycm9yKCdDaXJjdWxhciByZWZlcmVuY2UgZGV0ZWN0ZWQgaW4gJyArIHBhdGguam9pbignLicpKTtcbiAgICB9XG5cbiAgICBzdGFjay5wdXNoKHZhbHVlKTtcblxuICAgIHV0aWxzLmZvckVhY2godmFsdWUsIGZ1bmN0aW9uIGVhY2goZWwsIGtleSkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gISh1dGlscy5pc1VuZGVmaW5lZChlbCkgfHwgZWwgPT09IG51bGwpICYmIHZpc2l0b3IuY2FsbChcbiAgICAgICAgZm9ybURhdGEsIGVsLCB1dGlscy5pc1N0cmluZyhrZXkpID8ga2V5LnRyaW0oKSA6IGtleSwgcGF0aCwgZXhwb3NlZEhlbHBlcnNcbiAgICAgICk7XG5cbiAgICAgIGlmIChyZXN1bHQgPT09IHRydWUpIHtcbiAgICAgICAgYnVpbGQoZWwsIHBhdGggPyBwYXRoLmNvbmNhdChrZXkpIDogW2tleV0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgc3RhY2sucG9wKCk7XG4gIH1cblxuICBpZiAoIXV0aWxzLmlzT2JqZWN0KG9iaikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdkYXRhIG11c3QgYmUgYW4gb2JqZWN0Jyk7XG4gIH1cblxuICBidWlsZChvYmopO1xuXG4gIHJldHVybiBmb3JtRGF0YTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgdG9Gb3JtRGF0YTtcbiIsIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IHRvRm9ybURhdGEgZnJvbSAnLi90b0Zvcm1EYXRhLmpzJztcblxuLyoqXG4gKiBJdCBlbmNvZGVzIGEgc3RyaW5nIGJ5IHJlcGxhY2luZyBhbGwgY2hhcmFjdGVycyB0aGF0IGFyZSBub3QgaW4gdGhlIHVucmVzZXJ2ZWQgc2V0IHdpdGhcbiAqIHRoZWlyIHBlcmNlbnQtZW5jb2RlZCBlcXVpdmFsZW50c1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHIgLSBUaGUgc3RyaW5nIHRvIGVuY29kZS5cbiAqXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgZW5jb2RlZCBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIGVuY29kZShzdHIpIHtcbiAgY29uc3QgY2hhck1hcCA9IHtcbiAgICAnISc6ICclMjEnLFxuICAgIFwiJ1wiOiAnJTI3JyxcbiAgICAnKCc6ICclMjgnLFxuICAgICcpJzogJyUyOScsXG4gICAgJ34nOiAnJTdFJyxcbiAgICAnJTIwJzogJysnLFxuICAgICclMDAnOiAnXFx4MDAnXG4gIH07XG4gIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQoc3RyKS5yZXBsYWNlKC9bIScoKX5dfCUyMHwlMDAvZywgZnVuY3Rpb24gcmVwbGFjZXIobWF0Y2gpIHtcbiAgICByZXR1cm4gY2hhck1hcFttYXRjaF07XG4gIH0pO1xufVxuXG4vKipcbiAqIEl0IHRha2VzIGEgcGFyYW1zIG9iamVjdCBhbmQgY29udmVydHMgaXQgdG8gYSBGb3JtRGF0YSBvYmplY3RcbiAqXG4gKiBAcGFyYW0ge09iamVjdDxzdHJpbmcsIGFueT59IHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIHRvIGJlIGNvbnZlcnRlZCB0byBhIEZvcm1EYXRhIG9iamVjdC5cbiAqIEBwYXJhbSB7T2JqZWN0PHN0cmluZywgYW55Pn0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIG9iamVjdCBwYXNzZWQgdG8gdGhlIEF4aW9zIGNvbnN0cnVjdG9yLlxuICpcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiBBeGlvc1VSTFNlYXJjaFBhcmFtcyhwYXJhbXMsIG9wdGlvbnMpIHtcbiAgdGhpcy5fcGFpcnMgPSBbXTtcblxuICBwYXJhbXMgJiYgdG9Gb3JtRGF0YShwYXJhbXMsIHRoaXMsIG9wdGlvbnMpO1xufVxuXG5jb25zdCBwcm90b3R5cGUgPSBBeGlvc1VSTFNlYXJjaFBhcmFtcy5wcm90b3R5cGU7XG5cbnByb3RvdHlwZS5hcHBlbmQgPSBmdW5jdGlvbiBhcHBlbmQobmFtZSwgdmFsdWUpIHtcbiAgdGhpcy5fcGFpcnMucHVzaChbbmFtZSwgdmFsdWVdKTtcbn07XG5cbnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKGVuY29kZXIpIHtcbiAgY29uc3QgX2VuY29kZSA9IGVuY29kZXIgPyBmdW5jdGlvbih2YWx1ZSkge1xuICAgIHJldHVybiBlbmNvZGVyLmNhbGwodGhpcywgdmFsdWUsIGVuY29kZSk7XG4gIH0gOiBlbmNvZGU7XG5cbiAgcmV0dXJuIHRoaXMuX3BhaXJzLm1hcChmdW5jdGlvbiBlYWNoKHBhaXIpIHtcbiAgICByZXR1cm4gX2VuY29kZShwYWlyWzBdKSArICc9JyArIF9lbmNvZGUocGFpclsxXSk7XG4gIH0sICcnKS5qb2luKCcmJyk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBBeGlvc1VSTFNlYXJjaFBhcmFtcztcbiIsIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IHV0aWxzIGZyb20gJy4uL3V0aWxzLmpzJztcbmltcG9ydCBBeGlvc1VSTFNlYXJjaFBhcmFtcyBmcm9tICcuLi9oZWxwZXJzL0F4aW9zVVJMU2VhcmNoUGFyYW1zLmpzJztcblxuLyoqXG4gKiBJdCByZXBsYWNlcyBhbGwgaW5zdGFuY2VzIG9mIHRoZSBjaGFyYWN0ZXJzIGA6YCwgYCRgLCBgLGAsIGArYCwgYFtgLCBhbmQgYF1gIHdpdGggdGhlaXJcbiAqIFVSSSBlbmNvZGVkIGNvdW50ZXJwYXJ0c1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWwgVGhlIHZhbHVlIHRvIGJlIGVuY29kZWQuXG4gKlxuICogQHJldHVybnMge3N0cmluZ30gVGhlIGVuY29kZWQgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGVuY29kZSh2YWwpIHtcbiAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudCh2YWwpLlxuICAgIHJlcGxhY2UoLyUzQS9naSwgJzonKS5cbiAgICByZXBsYWNlKC8lMjQvZywgJyQnKS5cbiAgICByZXBsYWNlKC8lMkMvZ2ksICcsJykuXG4gICAgcmVwbGFjZSgvJTIwL2csICcrJykuXG4gICAgcmVwbGFjZSgvJTVCL2dpLCAnWycpLlxuICAgIHJlcGxhY2UoLyU1RC9naSwgJ10nKTtcbn1cblxuLyoqXG4gKiBCdWlsZCBhIFVSTCBieSBhcHBlbmRpbmcgcGFyYW1zIHRvIHRoZSBlbmRcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdXJsIFRoZSBiYXNlIG9mIHRoZSB1cmwgKGUuZy4sIGh0dHA6Ly93d3cuZ29vZ2xlLmNvbSlcbiAqIEBwYXJhbSB7b2JqZWN0fSBbcGFyYW1zXSBUaGUgcGFyYW1zIHRvIGJlIGFwcGVuZGVkXG4gKiBAcGFyYW0gez9vYmplY3R9IG9wdGlvbnNcbiAqXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgZm9ybWF0dGVkIHVybFxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBidWlsZFVSTCh1cmwsIHBhcmFtcywgb3B0aW9ucykge1xuICAvKmVzbGludCBuby1wYXJhbS1yZWFzc2lnbjowKi9cbiAgaWYgKCFwYXJhbXMpIHtcbiAgICByZXR1cm4gdXJsO1xuICB9XG4gIFxuICBjb25zdCBfZW5jb2RlID0gb3B0aW9ucyAmJiBvcHRpb25zLmVuY29kZSB8fCBlbmNvZGU7XG5cbiAgY29uc3Qgc2VyaWFsaXplRm4gPSBvcHRpb25zICYmIG9wdGlvbnMuc2VyaWFsaXplO1xuXG4gIGxldCBzZXJpYWxpemVkUGFyYW1zO1xuXG4gIGlmIChzZXJpYWxpemVGbikge1xuICAgIHNlcmlhbGl6ZWRQYXJhbXMgPSBzZXJpYWxpemVGbihwYXJhbXMsIG9wdGlvbnMpO1xuICB9IGVsc2Uge1xuICAgIHNlcmlhbGl6ZWRQYXJhbXMgPSB1dGlscy5pc1VSTFNlYXJjaFBhcmFtcyhwYXJhbXMpID9cbiAgICAgIHBhcmFtcy50b1N0cmluZygpIDpcbiAgICAgIG5ldyBBeGlvc1VSTFNlYXJjaFBhcmFtcyhwYXJhbXMsIG9wdGlvbnMpLnRvU3RyaW5nKF9lbmNvZGUpO1xuICB9XG5cbiAgaWYgKHNlcmlhbGl6ZWRQYXJhbXMpIHtcbiAgICBjb25zdCBoYXNobWFya0luZGV4ID0gdXJsLmluZGV4T2YoXCIjXCIpO1xuXG4gICAgaWYgKGhhc2htYXJrSW5kZXggIT09IC0xKSB7XG4gICAgICB1cmwgPSB1cmwuc2xpY2UoMCwgaGFzaG1hcmtJbmRleCk7XG4gICAgfVxuICAgIHVybCArPSAodXJsLmluZGV4T2YoJz8nKSA9PT0gLTEgPyAnPycgOiAnJicpICsgc2VyaWFsaXplZFBhcmFtcztcbiAgfVxuXG4gIHJldHVybiB1cmw7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCB1dGlscyBmcm9tICcuLy4uL3V0aWxzLmpzJztcblxuY2xhc3MgSW50ZXJjZXB0b3JNYW5hZ2VyIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5oYW5kbGVycyA9IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIG5ldyBpbnRlcmNlcHRvciB0byB0aGUgc3RhY2tcbiAgICpcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVsZmlsbGVkIFRoZSBmdW5jdGlvbiB0byBoYW5kbGUgYHRoZW5gIGZvciBhIGBQcm9taXNlYFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSByZWplY3RlZCBUaGUgZnVuY3Rpb24gdG8gaGFuZGxlIGByZWplY3RgIGZvciBhIGBQcm9taXNlYFxuICAgKlxuICAgKiBAcmV0dXJuIHtOdW1iZXJ9IEFuIElEIHVzZWQgdG8gcmVtb3ZlIGludGVyY2VwdG9yIGxhdGVyXG4gICAqL1xuICB1c2UoZnVsZmlsbGVkLCByZWplY3RlZCwgb3B0aW9ucykge1xuICAgIHRoaXMuaGFuZGxlcnMucHVzaCh7XG4gICAgICBmdWxmaWxsZWQsXG4gICAgICByZWplY3RlZCxcbiAgICAgIHN5bmNocm9ub3VzOiBvcHRpb25zID8gb3B0aW9ucy5zeW5jaHJvbm91cyA6IGZhbHNlLFxuICAgICAgcnVuV2hlbjogb3B0aW9ucyA/IG9wdGlvbnMucnVuV2hlbiA6IG51bGxcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcy5oYW5kbGVycy5sZW5ndGggLSAxO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhbiBpbnRlcmNlcHRvciBmcm9tIHRoZSBzdGFja1xuICAgKlxuICAgKiBAcGFyYW0ge051bWJlcn0gaWQgVGhlIElEIHRoYXQgd2FzIHJldHVybmVkIGJ5IGB1c2VgXG4gICAqXG4gICAqIEByZXR1cm5zIHtCb29sZWFufSBgdHJ1ZWAgaWYgdGhlIGludGVyY2VwdG9yIHdhcyByZW1vdmVkLCBgZmFsc2VgIG90aGVyd2lzZVxuICAgKi9cbiAgZWplY3QoaWQpIHtcbiAgICBpZiAodGhpcy5oYW5kbGVyc1tpZF0pIHtcbiAgICAgIHRoaXMuaGFuZGxlcnNbaWRdID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgYWxsIGludGVyY2VwdG9ycyBmcm9tIHRoZSBzdGFja1xuICAgKlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGNsZWFyKCkge1xuICAgIGlmICh0aGlzLmhhbmRsZXJzKSB7XG4gICAgICB0aGlzLmhhbmRsZXJzID0gW107XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIHJlZ2lzdGVyZWQgaW50ZXJjZXB0b3JzXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIGlzIHBhcnRpY3VsYXJseSB1c2VmdWwgZm9yIHNraXBwaW5nIG92ZXIgYW55XG4gICAqIGludGVyY2VwdG9ycyB0aGF0IG1heSBoYXZlIGJlY29tZSBgbnVsbGAgY2FsbGluZyBgZWplY3RgLlxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZnVuY3Rpb24gdG8gY2FsbCBmb3IgZWFjaCBpbnRlcmNlcHRvclxuICAgKlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGZvckVhY2goZm4pIHtcbiAgICB1dGlscy5mb3JFYWNoKHRoaXMuaGFuZGxlcnMsIGZ1bmN0aW9uIGZvckVhY2hIYW5kbGVyKGgpIHtcbiAgICAgIGlmIChoICE9PSBudWxsKSB7XG4gICAgICAgIGZuKGgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEludGVyY2VwdG9yTWFuYWdlcjtcbiIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0IGRlZmF1bHQge1xuICBzaWxlbnRKU09OUGFyc2luZzogdHJ1ZSxcbiAgZm9yY2VkSlNPTlBhcnNpbmc6IHRydWUsXG4gIGNsYXJpZnlUaW1lb3V0RXJyb3I6IGZhbHNlXG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgQXhpb3NVUkxTZWFyY2hQYXJhbXMgZnJvbSAnLi4vLi4vLi4vaGVscGVycy9BeGlvc1VSTFNlYXJjaFBhcmFtcy5qcyc7XG5leHBvcnQgZGVmYXVsdCB0eXBlb2YgVVJMU2VhcmNoUGFyYW1zICE9PSAndW5kZWZpbmVkJyA/IFVSTFNlYXJjaFBhcmFtcyA6IEF4aW9zVVJMU2VhcmNoUGFyYW1zO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnQgZGVmYXVsdCB0eXBlb2YgRm9ybURhdGEgIT09ICd1bmRlZmluZWQnID8gRm9ybURhdGEgOiBudWxsO1xuIiwiJ3VzZSBzdHJpY3QnXG5cbmV4cG9ydCBkZWZhdWx0IHR5cGVvZiBCbG9iICE9PSAndW5kZWZpbmVkJyA/IEJsb2IgOiBudWxsXG4iLCJpbXBvcnQgVVJMU2VhcmNoUGFyYW1zIGZyb20gJy4vY2xhc3Nlcy9VUkxTZWFyY2hQYXJhbXMuanMnXG5pbXBvcnQgRm9ybURhdGEgZnJvbSAnLi9jbGFzc2VzL0Zvcm1EYXRhLmpzJ1xuaW1wb3J0IEJsb2IgZnJvbSAnLi9jbGFzc2VzL0Jsb2IuanMnXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgaXNCcm93c2VyOiB0cnVlLFxuICBjbGFzc2VzOiB7XG4gICAgVVJMU2VhcmNoUGFyYW1zLFxuICAgIEZvcm1EYXRhLFxuICAgIEJsb2JcbiAgfSxcbiAgcHJvdG9jb2xzOiBbJ2h0dHAnLCAnaHR0cHMnLCAnZmlsZScsICdibG9iJywgJ3VybCcsICdkYXRhJ11cbn07XG4iLCJjb25zdCBoYXNCcm93c2VyRW52ID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJztcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgd2UncmUgcnVubmluZyBpbiBhIHN0YW5kYXJkIGJyb3dzZXIgZW52aXJvbm1lbnRcbiAqXG4gKiBUaGlzIGFsbG93cyBheGlvcyB0byBydW4gaW4gYSB3ZWIgd29ya2VyLCBhbmQgcmVhY3QtbmF0aXZlLlxuICogQm90aCBlbnZpcm9ubWVudHMgc3VwcG9ydCBYTUxIdHRwUmVxdWVzdCwgYnV0IG5vdCBmdWxseSBzdGFuZGFyZCBnbG9iYWxzLlxuICpcbiAqIHdlYiB3b3JrZXJzOlxuICogIHR5cGVvZiB3aW5kb3cgLT4gdW5kZWZpbmVkXG4gKiAgdHlwZW9mIGRvY3VtZW50IC0+IHVuZGVmaW5lZFxuICpcbiAqIHJlYWN0LW5hdGl2ZTpcbiAqICBuYXZpZ2F0b3IucHJvZHVjdCAtPiAnUmVhY3ROYXRpdmUnXG4gKiBuYXRpdmVzY3JpcHRcbiAqICBuYXZpZ2F0b3IucHJvZHVjdCAtPiAnTmF0aXZlU2NyaXB0JyBvciAnTlMnXG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGhhc1N0YW5kYXJkQnJvd3NlckVudiA9IChcbiAgKHByb2R1Y3QpID0+IHtcbiAgICByZXR1cm4gaGFzQnJvd3NlckVudiAmJiBbJ1JlYWN0TmF0aXZlJywgJ05hdGl2ZVNjcmlwdCcsICdOUyddLmluZGV4T2YocHJvZHVjdCkgPCAwXG4gIH0pKHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmIG5hdmlnYXRvci5wcm9kdWN0KTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgd2UncmUgcnVubmluZyBpbiBhIHN0YW5kYXJkIGJyb3dzZXIgd2ViV29ya2VyIGVudmlyb25tZW50XG4gKlxuICogQWx0aG91Z2ggdGhlIGBpc1N0YW5kYXJkQnJvd3NlckVudmAgbWV0aG9kIGluZGljYXRlcyB0aGF0XG4gKiBgYWxsb3dzIGF4aW9zIHRvIHJ1biBpbiBhIHdlYiB3b3JrZXJgLCB0aGUgV2ViV29ya2VyIHdpbGwgc3RpbGwgYmVcbiAqIGZpbHRlcmVkIG91dCBkdWUgdG8gaXRzIGp1ZGdtZW50IHN0YW5kYXJkXG4gKiBgdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJ2AuXG4gKiBUaGlzIGxlYWRzIHRvIGEgcHJvYmxlbSB3aGVuIGF4aW9zIHBvc3QgYEZvcm1EYXRhYCBpbiB3ZWJXb3JrZXJcbiAqL1xuY29uc3QgaGFzU3RhbmRhcmRCcm93c2VyV2ViV29ya2VyRW52ID0gKCgpID0+IHtcbiAgcmV0dXJuIChcbiAgICB0eXBlb2YgV29ya2VyR2xvYmFsU2NvcGUgIT09ICd1bmRlZmluZWQnICYmXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gICAgc2VsZiBpbnN0YW5jZW9mIFdvcmtlckdsb2JhbFNjb3BlICYmXG4gICAgdHlwZW9mIHNlbGYuaW1wb3J0U2NyaXB0cyA9PT0gJ2Z1bmN0aW9uJ1xuICApO1xufSkoKTtcblxuZXhwb3J0IHtcbiAgaGFzQnJvd3NlckVudixcbiAgaGFzU3RhbmRhcmRCcm93c2VyV2ViV29ya2VyRW52LFxuICBoYXNTdGFuZGFyZEJyb3dzZXJFbnZcbn1cbiIsImltcG9ydCBwbGF0Zm9ybSBmcm9tICcuL25vZGUvaW5kZXguanMnO1xuaW1wb3J0ICogYXMgdXRpbHMgZnJvbSAnLi9jb21tb24vdXRpbHMuanMnO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIC4uLnV0aWxzLFxuICAuLi5wbGF0Zm9ybVxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgdXRpbHMgZnJvbSAnLi4vdXRpbHMuanMnO1xuaW1wb3J0IHRvRm9ybURhdGEgZnJvbSAnLi90b0Zvcm1EYXRhLmpzJztcbmltcG9ydCBwbGF0Zm9ybSBmcm9tICcuLi9wbGF0Zm9ybS9pbmRleC5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHRvVVJMRW5jb2RlZEZvcm0oZGF0YSwgb3B0aW9ucykge1xuICByZXR1cm4gdG9Gb3JtRGF0YShkYXRhLCBuZXcgcGxhdGZvcm0uY2xhc3Nlcy5VUkxTZWFyY2hQYXJhbXMoKSwgT2JqZWN0LmFzc2lnbih7XG4gICAgdmlzaXRvcjogZnVuY3Rpb24odmFsdWUsIGtleSwgcGF0aCwgaGVscGVycykge1xuICAgICAgaWYgKHBsYXRmb3JtLmlzTm9kZSAmJiB1dGlscy5pc0J1ZmZlcih2YWx1ZSkpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQoa2V5LCB2YWx1ZS50b1N0cmluZygnYmFzZTY0JykpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBoZWxwZXJzLmRlZmF1bHRWaXNpdG9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfVxuICB9LCBvcHRpb25zKSk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCB1dGlscyBmcm9tICcuLi91dGlscy5qcyc7XG5cbi8qKlxuICogSXQgdGFrZXMgYSBzdHJpbmcgbGlrZSBgZm9vW3hdW3ldW3pdYCBhbmQgcmV0dXJucyBhbiBhcnJheSBsaWtlIGBbJ2ZvbycsICd4JywgJ3knLCAneiddXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICpcbiAqIEByZXR1cm5zIEFuIGFycmF5IG9mIHN0cmluZ3MuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlUHJvcFBhdGgobmFtZSkge1xuICAvLyBmb29beF1beV1bel1cbiAgLy8gZm9vLngueS56XG4gIC8vIGZvby14LXktelxuICAvLyBmb28geCB5IHpcbiAgcmV0dXJuIHV0aWxzLm1hdGNoQWxsKC9cXHcrfFxcWyhcXHcqKV0vZywgbmFtZSkubWFwKG1hdGNoID0+IHtcbiAgICByZXR1cm4gbWF0Y2hbMF0gPT09ICdbXScgPyAnJyA6IG1hdGNoWzFdIHx8IG1hdGNoWzBdO1xuICB9KTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IGFuIGFycmF5IHRvIGFuIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0ge0FycmF5PGFueT59IGFyciAtIFRoZSBhcnJheSB0byBjb252ZXJ0IHRvIGFuIG9iamVjdC5cbiAqXG4gKiBAcmV0dXJucyBBbiBvYmplY3Qgd2l0aCB0aGUgc2FtZSBrZXlzIGFuZCB2YWx1ZXMgYXMgdGhlIGFycmF5LlxuICovXG5mdW5jdGlvbiBhcnJheVRvT2JqZWN0KGFycikge1xuICBjb25zdCBvYmogPSB7fTtcbiAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGFycik7XG4gIGxldCBpO1xuICBjb25zdCBsZW4gPSBrZXlzLmxlbmd0aDtcbiAgbGV0IGtleTtcbiAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAga2V5ID0ga2V5c1tpXTtcbiAgICBvYmpba2V5XSA9IGFycltrZXldO1xuICB9XG4gIHJldHVybiBvYmo7XG59XG5cbi8qKlxuICogSXQgdGFrZXMgYSBGb3JtRGF0YSBvYmplY3QgYW5kIHJldHVybnMgYSBKYXZhU2NyaXB0IG9iamVjdFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBmb3JtRGF0YSBUaGUgRm9ybURhdGEgb2JqZWN0IHRvIGNvbnZlcnQgdG8gSlNPTi5cbiAqXG4gKiBAcmV0dXJucyB7T2JqZWN0PHN0cmluZywgYW55PiB8IG51bGx9IFRoZSBjb252ZXJ0ZWQgb2JqZWN0LlxuICovXG5mdW5jdGlvbiBmb3JtRGF0YVRvSlNPTihmb3JtRGF0YSkge1xuICBmdW5jdGlvbiBidWlsZFBhdGgocGF0aCwgdmFsdWUsIHRhcmdldCwgaW5kZXgpIHtcbiAgICBsZXQgbmFtZSA9IHBhdGhbaW5kZXgrK107XG5cbiAgICBpZiAobmFtZSA9PT0gJ19fcHJvdG9fXycpIHJldHVybiB0cnVlO1xuXG4gICAgY29uc3QgaXNOdW1lcmljS2V5ID0gTnVtYmVyLmlzRmluaXRlKCtuYW1lKTtcbiAgICBjb25zdCBpc0xhc3QgPSBpbmRleCA+PSBwYXRoLmxlbmd0aDtcbiAgICBuYW1lID0gIW5hbWUgJiYgdXRpbHMuaXNBcnJheSh0YXJnZXQpID8gdGFyZ2V0Lmxlbmd0aCA6IG5hbWU7XG5cbiAgICBpZiAoaXNMYXN0KSB7XG4gICAgICBpZiAodXRpbHMuaGFzT3duUHJvcCh0YXJnZXQsIG5hbWUpKSB7XG4gICAgICAgIHRhcmdldFtuYW1lXSA9IFt0YXJnZXRbbmFtZV0sIHZhbHVlXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRhcmdldFtuYW1lXSA9IHZhbHVlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gIWlzTnVtZXJpY0tleTtcbiAgICB9XG5cbiAgICBpZiAoIXRhcmdldFtuYW1lXSB8fCAhdXRpbHMuaXNPYmplY3QodGFyZ2V0W25hbWVdKSkge1xuICAgICAgdGFyZ2V0W25hbWVdID0gW107XG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gYnVpbGRQYXRoKHBhdGgsIHZhbHVlLCB0YXJnZXRbbmFtZV0sIGluZGV4KTtcblxuICAgIGlmIChyZXN1bHQgJiYgdXRpbHMuaXNBcnJheSh0YXJnZXRbbmFtZV0pKSB7XG4gICAgICB0YXJnZXRbbmFtZV0gPSBhcnJheVRvT2JqZWN0KHRhcmdldFtuYW1lXSk7XG4gICAgfVxuXG4gICAgcmV0dXJuICFpc051bWVyaWNLZXk7XG4gIH1cblxuICBpZiAodXRpbHMuaXNGb3JtRGF0YShmb3JtRGF0YSkgJiYgdXRpbHMuaXNGdW5jdGlvbihmb3JtRGF0YS5lbnRyaWVzKSkge1xuICAgIGNvbnN0IG9iaiA9IHt9O1xuXG4gICAgdXRpbHMuZm9yRWFjaEVudHJ5KGZvcm1EYXRhLCAobmFtZSwgdmFsdWUpID0+IHtcbiAgICAgIGJ1aWxkUGF0aChwYXJzZVByb3BQYXRoKG5hbWUpLCB2YWx1ZSwgb2JqLCAwKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBvYmo7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZm9ybURhdGFUb0pTT047XG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCB1dGlscyBmcm9tICcuLi91dGlscy5qcyc7XG5pbXBvcnQgQXhpb3NFcnJvciBmcm9tICcuLi9jb3JlL0F4aW9zRXJyb3IuanMnO1xuaW1wb3J0IHRyYW5zaXRpb25hbERlZmF1bHRzIGZyb20gJy4vdHJhbnNpdGlvbmFsLmpzJztcbmltcG9ydCB0b0Zvcm1EYXRhIGZyb20gJy4uL2hlbHBlcnMvdG9Gb3JtRGF0YS5qcyc7XG5pbXBvcnQgdG9VUkxFbmNvZGVkRm9ybSBmcm9tICcuLi9oZWxwZXJzL3RvVVJMRW5jb2RlZEZvcm0uanMnO1xuaW1wb3J0IHBsYXRmb3JtIGZyb20gJy4uL3BsYXRmb3JtL2luZGV4LmpzJztcbmltcG9ydCBmb3JtRGF0YVRvSlNPTiBmcm9tICcuLi9oZWxwZXJzL2Zvcm1EYXRhVG9KU09OLmpzJztcblxuLyoqXG4gKiBJdCB0YWtlcyBhIHN0cmluZywgdHJpZXMgdG8gcGFyc2UgaXQsIGFuZCBpZiBpdCBmYWlscywgaXQgcmV0dXJucyB0aGUgc3RyaW5naWZpZWQgdmVyc2lvblxuICogb2YgdGhlIGlucHV0XG4gKlxuICogQHBhcmFtIHthbnl9IHJhd1ZhbHVlIC0gVGhlIHZhbHVlIHRvIGJlIHN0cmluZ2lmaWVkLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcGFyc2VyIC0gQSBmdW5jdGlvbiB0aGF0IHBhcnNlcyBhIHN0cmluZyBpbnRvIGEgSmF2YVNjcmlwdCBvYmplY3QuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBlbmNvZGVyIC0gQSBmdW5jdGlvbiB0aGF0IHRha2VzIGEgdmFsdWUgYW5kIHJldHVybnMgYSBzdHJpbmcuXG4gKlxuICogQHJldHVybnMge3N0cmluZ30gQSBzdHJpbmdpZmllZCB2ZXJzaW9uIG9mIHRoZSByYXdWYWx1ZS5cbiAqL1xuZnVuY3Rpb24gc3RyaW5naWZ5U2FmZWx5KHJhd1ZhbHVlLCBwYXJzZXIsIGVuY29kZXIpIHtcbiAgaWYgKHV0aWxzLmlzU3RyaW5nKHJhd1ZhbHVlKSkge1xuICAgIHRyeSB7XG4gICAgICAocGFyc2VyIHx8IEpTT04ucGFyc2UpKHJhd1ZhbHVlKTtcbiAgICAgIHJldHVybiB1dGlscy50cmltKHJhd1ZhbHVlKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoZS5uYW1lICE9PSAnU3ludGF4RXJyb3InKSB7XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIChlbmNvZGVyIHx8IEpTT04uc3RyaW5naWZ5KShyYXdWYWx1ZSk7XG59XG5cbmNvbnN0IGRlZmF1bHRzID0ge1xuXG4gIHRyYW5zaXRpb25hbDogdHJhbnNpdGlvbmFsRGVmYXVsdHMsXG5cbiAgYWRhcHRlcjogWyd4aHInLCAnaHR0cCddLFxuXG4gIHRyYW5zZm9ybVJlcXVlc3Q6IFtmdW5jdGlvbiB0cmFuc2Zvcm1SZXF1ZXN0KGRhdGEsIGhlYWRlcnMpIHtcbiAgICBjb25zdCBjb250ZW50VHlwZSA9IGhlYWRlcnMuZ2V0Q29udGVudFR5cGUoKSB8fCAnJztcbiAgICBjb25zdCBoYXNKU09OQ29udGVudFR5cGUgPSBjb250ZW50VHlwZS5pbmRleE9mKCdhcHBsaWNhdGlvbi9qc29uJykgPiAtMTtcbiAgICBjb25zdCBpc09iamVjdFBheWxvYWQgPSB1dGlscy5pc09iamVjdChkYXRhKTtcblxuICAgIGlmIChpc09iamVjdFBheWxvYWQgJiYgdXRpbHMuaXNIVE1MRm9ybShkYXRhKSkge1xuICAgICAgZGF0YSA9IG5ldyBGb3JtRGF0YShkYXRhKTtcbiAgICB9XG5cbiAgICBjb25zdCBpc0Zvcm1EYXRhID0gdXRpbHMuaXNGb3JtRGF0YShkYXRhKTtcblxuICAgIGlmIChpc0Zvcm1EYXRhKSB7XG4gICAgICByZXR1cm4gaGFzSlNPTkNvbnRlbnRUeXBlID8gSlNPTi5zdHJpbmdpZnkoZm9ybURhdGFUb0pTT04oZGF0YSkpIDogZGF0YTtcbiAgICB9XG5cbiAgICBpZiAodXRpbHMuaXNBcnJheUJ1ZmZlcihkYXRhKSB8fFxuICAgICAgdXRpbHMuaXNCdWZmZXIoZGF0YSkgfHxcbiAgICAgIHV0aWxzLmlzU3RyZWFtKGRhdGEpIHx8XG4gICAgICB1dGlscy5pc0ZpbGUoZGF0YSkgfHxcbiAgICAgIHV0aWxzLmlzQmxvYihkYXRhKVxuICAgICkge1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuICAgIGlmICh1dGlscy5pc0FycmF5QnVmZmVyVmlldyhkYXRhKSkge1xuICAgICAgcmV0dXJuIGRhdGEuYnVmZmVyO1xuICAgIH1cbiAgICBpZiAodXRpbHMuaXNVUkxTZWFyY2hQYXJhbXMoZGF0YSkpIHtcbiAgICAgIGhlYWRlcnMuc2V0Q29udGVudFR5cGUoJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDtjaGFyc2V0PXV0Zi04JywgZmFsc2UpO1xuICAgICAgcmV0dXJuIGRhdGEudG9TdHJpbmcoKTtcbiAgICB9XG5cbiAgICBsZXQgaXNGaWxlTGlzdDtcblxuICAgIGlmIChpc09iamVjdFBheWxvYWQpIHtcbiAgICAgIGlmIChjb250ZW50VHlwZS5pbmRleE9mKCdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnKSA+IC0xKSB7XG4gICAgICAgIHJldHVybiB0b1VSTEVuY29kZWRGb3JtKGRhdGEsIHRoaXMuZm9ybVNlcmlhbGl6ZXIpLnRvU3RyaW5nKCk7XG4gICAgICB9XG5cbiAgICAgIGlmICgoaXNGaWxlTGlzdCA9IHV0aWxzLmlzRmlsZUxpc3QoZGF0YSkpIHx8IGNvbnRlbnRUeXBlLmluZGV4T2YoJ211bHRpcGFydC9mb3JtLWRhdGEnKSA+IC0xKSB7XG4gICAgICAgIGNvbnN0IF9Gb3JtRGF0YSA9IHRoaXMuZW52ICYmIHRoaXMuZW52LkZvcm1EYXRhO1xuXG4gICAgICAgIHJldHVybiB0b0Zvcm1EYXRhKFxuICAgICAgICAgIGlzRmlsZUxpc3QgPyB7J2ZpbGVzW10nOiBkYXRhfSA6IGRhdGEsXG4gICAgICAgICAgX0Zvcm1EYXRhICYmIG5ldyBfRm9ybURhdGEoKSxcbiAgICAgICAgICB0aGlzLmZvcm1TZXJpYWxpemVyXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGlzT2JqZWN0UGF5bG9hZCB8fCBoYXNKU09OQ29udGVudFR5cGUgKSB7XG4gICAgICBoZWFkZXJzLnNldENvbnRlbnRUeXBlKCdhcHBsaWNhdGlvbi9qc29uJywgZmFsc2UpO1xuICAgICAgcmV0dXJuIHN0cmluZ2lmeVNhZmVseShkYXRhKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGF0YTtcbiAgfV0sXG5cbiAgdHJhbnNmb3JtUmVzcG9uc2U6IFtmdW5jdGlvbiB0cmFuc2Zvcm1SZXNwb25zZShkYXRhKSB7XG4gICAgY29uc3QgdHJhbnNpdGlvbmFsID0gdGhpcy50cmFuc2l0aW9uYWwgfHwgZGVmYXVsdHMudHJhbnNpdGlvbmFsO1xuICAgIGNvbnN0IGZvcmNlZEpTT05QYXJzaW5nID0gdHJhbnNpdGlvbmFsICYmIHRyYW5zaXRpb25hbC5mb3JjZWRKU09OUGFyc2luZztcbiAgICBjb25zdCBKU09OUmVxdWVzdGVkID0gdGhpcy5yZXNwb25zZVR5cGUgPT09ICdqc29uJztcblxuICAgIGlmIChkYXRhICYmIHV0aWxzLmlzU3RyaW5nKGRhdGEpICYmICgoZm9yY2VkSlNPTlBhcnNpbmcgJiYgIXRoaXMucmVzcG9uc2VUeXBlKSB8fCBKU09OUmVxdWVzdGVkKSkge1xuICAgICAgY29uc3Qgc2lsZW50SlNPTlBhcnNpbmcgPSB0cmFuc2l0aW9uYWwgJiYgdHJhbnNpdGlvbmFsLnNpbGVudEpTT05QYXJzaW5nO1xuICAgICAgY29uc3Qgc3RyaWN0SlNPTlBhcnNpbmcgPSAhc2lsZW50SlNPTlBhcnNpbmcgJiYgSlNPTlJlcXVlc3RlZDtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoZGF0YSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChzdHJpY3RKU09OUGFyc2luZykge1xuICAgICAgICAgIGlmIChlLm5hbWUgPT09ICdTeW50YXhFcnJvcicpIHtcbiAgICAgICAgICAgIHRocm93IEF4aW9zRXJyb3IuZnJvbShlLCBBeGlvc0Vycm9yLkVSUl9CQURfUkVTUE9OU0UsIHRoaXMsIG51bGwsIHRoaXMucmVzcG9uc2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGRhdGE7XG4gIH1dLFxuXG4gIC8qKlxuICAgKiBBIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIHRvIGFib3J0IGEgcmVxdWVzdC4gSWYgc2V0IHRvIDAgKGRlZmF1bHQpIGFcbiAgICogdGltZW91dCBpcyBub3QgY3JlYXRlZC5cbiAgICovXG4gIHRpbWVvdXQ6IDAsXG5cbiAgeHNyZkNvb2tpZU5hbWU6ICdYU1JGLVRPS0VOJyxcbiAgeHNyZkhlYWRlck5hbWU6ICdYLVhTUkYtVE9LRU4nLFxuXG4gIG1heENvbnRlbnRMZW5ndGg6IC0xLFxuICBtYXhCb2R5TGVuZ3RoOiAtMSxcblxuICBlbnY6IHtcbiAgICBGb3JtRGF0YTogcGxhdGZvcm0uY2xhc3Nlcy5Gb3JtRGF0YSxcbiAgICBCbG9iOiBwbGF0Zm9ybS5jbGFzc2VzLkJsb2JcbiAgfSxcblxuICB2YWxpZGF0ZVN0YXR1czogZnVuY3Rpb24gdmFsaWRhdGVTdGF0dXMoc3RhdHVzKSB7XG4gICAgcmV0dXJuIHN0YXR1cyA+PSAyMDAgJiYgc3RhdHVzIDwgMzAwO1xuICB9LFxuXG4gIGhlYWRlcnM6IHtcbiAgICBjb21tb246IHtcbiAgICAgICdBY2NlcHQnOiAnYXBwbGljYXRpb24vanNvbiwgdGV4dC9wbGFpbiwgKi8qJyxcbiAgICAgICdDb250ZW50LVR5cGUnOiB1bmRlZmluZWRcbiAgICB9XG4gIH1cbn07XG5cbnV0aWxzLmZvckVhY2goWydkZWxldGUnLCAnZ2V0JywgJ2hlYWQnLCAncG9zdCcsICdwdXQnLCAncGF0Y2gnXSwgKG1ldGhvZCkgPT4ge1xuICBkZWZhdWx0cy5oZWFkZXJzW21ldGhvZF0gPSB7fTtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBkZWZhdWx0cztcbiIsIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IHV0aWxzIGZyb20gJy4vLi4vdXRpbHMuanMnO1xuXG4vLyBSYXdBeGlvc0hlYWRlcnMgd2hvc2UgZHVwbGljYXRlcyBhcmUgaWdub3JlZCBieSBub2RlXG4vLyBjLmYuIGh0dHBzOi8vbm9kZWpzLm9yZy9hcGkvaHR0cC5odG1sI2h0dHBfbWVzc2FnZV9oZWFkZXJzXG5jb25zdCBpZ25vcmVEdXBsaWNhdGVPZiA9IHV0aWxzLnRvT2JqZWN0U2V0KFtcbiAgJ2FnZScsICdhdXRob3JpemF0aW9uJywgJ2NvbnRlbnQtbGVuZ3RoJywgJ2NvbnRlbnQtdHlwZScsICdldGFnJyxcbiAgJ2V4cGlyZXMnLCAnZnJvbScsICdob3N0JywgJ2lmLW1vZGlmaWVkLXNpbmNlJywgJ2lmLXVubW9kaWZpZWQtc2luY2UnLFxuICAnbGFzdC1tb2RpZmllZCcsICdsb2NhdGlvbicsICdtYXgtZm9yd2FyZHMnLCAncHJveHktYXV0aG9yaXphdGlvbicsXG4gICdyZWZlcmVyJywgJ3JldHJ5LWFmdGVyJywgJ3VzZXItYWdlbnQnXG5dKTtcblxuLyoqXG4gKiBQYXJzZSBoZWFkZXJzIGludG8gYW4gb2JqZWN0XG4gKlxuICogYGBgXG4gKiBEYXRlOiBXZWQsIDI3IEF1ZyAyMDE0IDA4OjU4OjQ5IEdNVFxuICogQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uXG4gKiBDb25uZWN0aW9uOiBrZWVwLWFsaXZlXG4gKiBUcmFuc2Zlci1FbmNvZGluZzogY2h1bmtlZFxuICogYGBgXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHJhd0hlYWRlcnMgSGVhZGVycyBuZWVkaW5nIHRvIGJlIHBhcnNlZFxuICpcbiAqIEByZXR1cm5zIHtPYmplY3R9IEhlYWRlcnMgcGFyc2VkIGludG8gYW4gb2JqZWN0XG4gKi9cbmV4cG9ydCBkZWZhdWx0IHJhd0hlYWRlcnMgPT4ge1xuICBjb25zdCBwYXJzZWQgPSB7fTtcbiAgbGV0IGtleTtcbiAgbGV0IHZhbDtcbiAgbGV0IGk7XG5cbiAgcmF3SGVhZGVycyAmJiByYXdIZWFkZXJzLnNwbGl0KCdcXG4nKS5mb3JFYWNoKGZ1bmN0aW9uIHBhcnNlcihsaW5lKSB7XG4gICAgaSA9IGxpbmUuaW5kZXhPZignOicpO1xuICAgIGtleSA9IGxpbmUuc3Vic3RyaW5nKDAsIGkpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgIHZhbCA9IGxpbmUuc3Vic3RyaW5nKGkgKyAxKS50cmltKCk7XG5cbiAgICBpZiAoIWtleSB8fCAocGFyc2VkW2tleV0gJiYgaWdub3JlRHVwbGljYXRlT2Zba2V5XSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoa2V5ID09PSAnc2V0LWNvb2tpZScpIHtcbiAgICAgIGlmIChwYXJzZWRba2V5XSkge1xuICAgICAgICBwYXJzZWRba2V5XS5wdXNoKHZhbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwYXJzZWRba2V5XSA9IFt2YWxdO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwYXJzZWRba2V5XSA9IHBhcnNlZFtrZXldID8gcGFyc2VkW2tleV0gKyAnLCAnICsgdmFsIDogdmFsO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIHBhcnNlZDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCB1dGlscyBmcm9tICcuLi91dGlscy5qcyc7XG5pbXBvcnQgcGFyc2VIZWFkZXJzIGZyb20gJy4uL2hlbHBlcnMvcGFyc2VIZWFkZXJzLmpzJztcblxuY29uc3QgJGludGVybmFscyA9IFN5bWJvbCgnaW50ZXJuYWxzJyk7XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUhlYWRlcihoZWFkZXIpIHtcbiAgcmV0dXJuIGhlYWRlciAmJiBTdHJpbmcoaGVhZGVyKS50cmltKCkudG9Mb3dlckNhc2UoKTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplVmFsdWUodmFsdWUpIHtcbiAgaWYgKHZhbHVlID09PSBmYWxzZSB8fCB2YWx1ZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgcmV0dXJuIHV0aWxzLmlzQXJyYXkodmFsdWUpID8gdmFsdWUubWFwKG5vcm1hbGl6ZVZhbHVlKSA6IFN0cmluZyh2YWx1ZSk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlVG9rZW5zKHN0cikge1xuICBjb25zdCB0b2tlbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICBjb25zdCB0b2tlbnNSRSA9IC8oW15cXHMsOz1dKylcXHMqKD86PVxccyooW14sO10rKSk/L2c7XG4gIGxldCBtYXRjaDtcblxuICB3aGlsZSAoKG1hdGNoID0gdG9rZW5zUkUuZXhlYyhzdHIpKSkge1xuICAgIHRva2Vuc1ttYXRjaFsxXV0gPSBtYXRjaFsyXTtcbiAgfVxuXG4gIHJldHVybiB0b2tlbnM7XG59XG5cbmNvbnN0IGlzVmFsaWRIZWFkZXJOYW1lID0gKHN0cikgPT4gL15bLV9hLXpBLVowLTleYHx+LCEjJCUmJyorLl0rJC8udGVzdChzdHIudHJpbSgpKTtcblxuZnVuY3Rpb24gbWF0Y2hIZWFkZXJWYWx1ZShjb250ZXh0LCB2YWx1ZSwgaGVhZGVyLCBmaWx0ZXIsIGlzSGVhZGVyTmFtZUZpbHRlcikge1xuICBpZiAodXRpbHMuaXNGdW5jdGlvbihmaWx0ZXIpKSB7XG4gICAgcmV0dXJuIGZpbHRlci5jYWxsKHRoaXMsIHZhbHVlLCBoZWFkZXIpO1xuICB9XG5cbiAgaWYgKGlzSGVhZGVyTmFtZUZpbHRlcikge1xuICAgIHZhbHVlID0gaGVhZGVyO1xuICB9XG5cbiAgaWYgKCF1dGlscy5pc1N0cmluZyh2YWx1ZSkpIHJldHVybjtcblxuICBpZiAodXRpbHMuaXNTdHJpbmcoZmlsdGVyKSkge1xuICAgIHJldHVybiB2YWx1ZS5pbmRleE9mKGZpbHRlcikgIT09IC0xO1xuICB9XG5cbiAgaWYgKHV0aWxzLmlzUmVnRXhwKGZpbHRlcikpIHtcbiAgICByZXR1cm4gZmlsdGVyLnRlc3QodmFsdWUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZvcm1hdEhlYWRlcihoZWFkZXIpIHtcbiAgcmV0dXJuIGhlYWRlci50cmltKClcbiAgICAudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC8oW2EtelxcZF0pKFxcdyopL2csICh3LCBjaGFyLCBzdHIpID0+IHtcbiAgICAgIHJldHVybiBjaGFyLnRvVXBwZXJDYXNlKCkgKyBzdHI7XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkQWNjZXNzb3JzKG9iaiwgaGVhZGVyKSB7XG4gIGNvbnN0IGFjY2Vzc29yTmFtZSA9IHV0aWxzLnRvQ2FtZWxDYXNlKCcgJyArIGhlYWRlcik7XG5cbiAgWydnZXQnLCAnc2V0JywgJ2hhcyddLmZvckVhY2gobWV0aG9kTmFtZSA9PiB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwgbWV0aG9kTmFtZSArIGFjY2Vzc29yTmFtZSwge1xuICAgICAgdmFsdWU6IGZ1bmN0aW9uKGFyZzEsIGFyZzIsIGFyZzMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXNbbWV0aG9kTmFtZV0uY2FsbCh0aGlzLCBoZWFkZXIsIGFyZzEsIGFyZzIsIGFyZzMpO1xuICAgICAgfSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICB9KTtcbn1cblxuY2xhc3MgQXhpb3NIZWFkZXJzIHtcbiAgY29uc3RydWN0b3IoaGVhZGVycykge1xuICAgIGhlYWRlcnMgJiYgdGhpcy5zZXQoaGVhZGVycyk7XG4gIH1cblxuICBzZXQoaGVhZGVyLCB2YWx1ZU9yUmV3cml0ZSwgcmV3cml0ZSkge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuXG4gICAgZnVuY3Rpb24gc2V0SGVhZGVyKF92YWx1ZSwgX2hlYWRlciwgX3Jld3JpdGUpIHtcbiAgICAgIGNvbnN0IGxIZWFkZXIgPSBub3JtYWxpemVIZWFkZXIoX2hlYWRlcik7XG5cbiAgICAgIGlmICghbEhlYWRlcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2hlYWRlciBuYW1lIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGtleSA9IHV0aWxzLmZpbmRLZXkoc2VsZiwgbEhlYWRlcik7XG5cbiAgICAgIGlmKCFrZXkgfHwgc2VsZltrZXldID09PSB1bmRlZmluZWQgfHwgX3Jld3JpdGUgPT09IHRydWUgfHwgKF9yZXdyaXRlID09PSB1bmRlZmluZWQgJiYgc2VsZltrZXldICE9PSBmYWxzZSkpIHtcbiAgICAgICAgc2VsZltrZXkgfHwgX2hlYWRlcl0gPSBub3JtYWxpemVWYWx1ZShfdmFsdWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHNldEhlYWRlcnMgPSAoaGVhZGVycywgX3Jld3JpdGUpID0+XG4gICAgICB1dGlscy5mb3JFYWNoKGhlYWRlcnMsIChfdmFsdWUsIF9oZWFkZXIpID0+IHNldEhlYWRlcihfdmFsdWUsIF9oZWFkZXIsIF9yZXdyaXRlKSk7XG5cbiAgICBpZiAodXRpbHMuaXNQbGFpbk9iamVjdChoZWFkZXIpIHx8IGhlYWRlciBpbnN0YW5jZW9mIHRoaXMuY29uc3RydWN0b3IpIHtcbiAgICAgIHNldEhlYWRlcnMoaGVhZGVyLCB2YWx1ZU9yUmV3cml0ZSlcbiAgICB9IGVsc2UgaWYodXRpbHMuaXNTdHJpbmcoaGVhZGVyKSAmJiAoaGVhZGVyID0gaGVhZGVyLnRyaW0oKSkgJiYgIWlzVmFsaWRIZWFkZXJOYW1lKGhlYWRlcikpIHtcbiAgICAgIHNldEhlYWRlcnMocGFyc2VIZWFkZXJzKGhlYWRlciksIHZhbHVlT3JSZXdyaXRlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaGVhZGVyICE9IG51bGwgJiYgc2V0SGVhZGVyKHZhbHVlT3JSZXdyaXRlLCBoZWFkZXIsIHJld3JpdGUpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgZ2V0KGhlYWRlciwgcGFyc2VyKSB7XG4gICAgaGVhZGVyID0gbm9ybWFsaXplSGVhZGVyKGhlYWRlcik7XG5cbiAgICBpZiAoaGVhZGVyKSB7XG4gICAgICBjb25zdCBrZXkgPSB1dGlscy5maW5kS2V5KHRoaXMsIGhlYWRlcik7XG5cbiAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzW2tleV07XG5cbiAgICAgICAgaWYgKCFwYXJzZXIpIHtcbiAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGFyc2VyID09PSB0cnVlKSB7XG4gICAgICAgICAgcmV0dXJuIHBhcnNlVG9rZW5zKHZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh1dGlscy5pc0Z1bmN0aW9uKHBhcnNlcikpIHtcbiAgICAgICAgICByZXR1cm4gcGFyc2VyLmNhbGwodGhpcywgdmFsdWUsIGtleSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodXRpbHMuaXNSZWdFeHAocGFyc2VyKSkge1xuICAgICAgICAgIHJldHVybiBwYXJzZXIuZXhlYyh2YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdwYXJzZXIgbXVzdCBiZSBib29sZWFufHJlZ2V4cHxmdW5jdGlvbicpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGhhcyhoZWFkZXIsIG1hdGNoZXIpIHtcbiAgICBoZWFkZXIgPSBub3JtYWxpemVIZWFkZXIoaGVhZGVyKTtcblxuICAgIGlmIChoZWFkZXIpIHtcbiAgICAgIGNvbnN0IGtleSA9IHV0aWxzLmZpbmRLZXkodGhpcywgaGVhZGVyKTtcblxuICAgICAgcmV0dXJuICEhKGtleSAmJiB0aGlzW2tleV0gIT09IHVuZGVmaW5lZCAmJiAoIW1hdGNoZXIgfHwgbWF0Y2hIZWFkZXJWYWx1ZSh0aGlzLCB0aGlzW2tleV0sIGtleSwgbWF0Y2hlcikpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBkZWxldGUoaGVhZGVyLCBtYXRjaGVyKSB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgbGV0IGRlbGV0ZWQgPSBmYWxzZTtcblxuICAgIGZ1bmN0aW9uIGRlbGV0ZUhlYWRlcihfaGVhZGVyKSB7XG4gICAgICBfaGVhZGVyID0gbm9ybWFsaXplSGVhZGVyKF9oZWFkZXIpO1xuXG4gICAgICBpZiAoX2hlYWRlcikge1xuICAgICAgICBjb25zdCBrZXkgPSB1dGlscy5maW5kS2V5KHNlbGYsIF9oZWFkZXIpO1xuXG4gICAgICAgIGlmIChrZXkgJiYgKCFtYXRjaGVyIHx8IG1hdGNoSGVhZGVyVmFsdWUoc2VsZiwgc2VsZltrZXldLCBrZXksIG1hdGNoZXIpKSkge1xuICAgICAgICAgIGRlbGV0ZSBzZWxmW2tleV07XG5cbiAgICAgICAgICBkZWxldGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh1dGlscy5pc0FycmF5KGhlYWRlcikpIHtcbiAgICAgIGhlYWRlci5mb3JFYWNoKGRlbGV0ZUhlYWRlcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbGV0ZUhlYWRlcihoZWFkZXIpO1xuICAgIH1cblxuICAgIHJldHVybiBkZWxldGVkO1xuICB9XG5cbiAgY2xlYXIobWF0Y2hlcikge1xuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyh0aGlzKTtcbiAgICBsZXQgaSA9IGtleXMubGVuZ3RoO1xuICAgIGxldCBkZWxldGVkID0gZmFsc2U7XG5cbiAgICB3aGlsZSAoaS0tKSB7XG4gICAgICBjb25zdCBrZXkgPSBrZXlzW2ldO1xuICAgICAgaWYoIW1hdGNoZXIgfHwgbWF0Y2hIZWFkZXJWYWx1ZSh0aGlzLCB0aGlzW2tleV0sIGtleSwgbWF0Y2hlciwgdHJ1ZSkpIHtcbiAgICAgICAgZGVsZXRlIHRoaXNba2V5XTtcbiAgICAgICAgZGVsZXRlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlbGV0ZWQ7XG4gIH1cblxuICBub3JtYWxpemUoZm9ybWF0KSB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuXG4gICAgdXRpbHMuZm9yRWFjaCh0aGlzLCAodmFsdWUsIGhlYWRlcikgPT4ge1xuICAgICAgY29uc3Qga2V5ID0gdXRpbHMuZmluZEtleShoZWFkZXJzLCBoZWFkZXIpO1xuXG4gICAgICBpZiAoa2V5KSB7XG4gICAgICAgIHNlbGZba2V5XSA9IG5vcm1hbGl6ZVZhbHVlKHZhbHVlKTtcbiAgICAgICAgZGVsZXRlIHNlbGZbaGVhZGVyXTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBub3JtYWxpemVkID0gZm9ybWF0ID8gZm9ybWF0SGVhZGVyKGhlYWRlcikgOiBTdHJpbmcoaGVhZGVyKS50cmltKCk7XG5cbiAgICAgIGlmIChub3JtYWxpemVkICE9PSBoZWFkZXIpIHtcbiAgICAgICAgZGVsZXRlIHNlbGZbaGVhZGVyXTtcbiAgICAgIH1cblxuICAgICAgc2VsZltub3JtYWxpemVkXSA9IG5vcm1hbGl6ZVZhbHVlKHZhbHVlKTtcblxuICAgICAgaGVhZGVyc1tub3JtYWxpemVkXSA9IHRydWU7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGNvbmNhdCguLi50YXJnZXRzKSB7XG4gICAgcmV0dXJuIHRoaXMuY29uc3RydWN0b3IuY29uY2F0KHRoaXMsIC4uLnRhcmdldHMpO1xuICB9XG5cbiAgdG9KU09OKGFzU3RyaW5ncykge1xuICAgIGNvbnN0IG9iaiA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbiAgICB1dGlscy5mb3JFYWNoKHRoaXMsICh2YWx1ZSwgaGVhZGVyKSA9PiB7XG4gICAgICB2YWx1ZSAhPSBudWxsICYmIHZhbHVlICE9PSBmYWxzZSAmJiAob2JqW2hlYWRlcl0gPSBhc1N0cmluZ3MgJiYgdXRpbHMuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZS5qb2luKCcsICcpIDogdmFsdWUpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIFtTeW1ib2wuaXRlcmF0b3JdKCkge1xuICAgIHJldHVybiBPYmplY3QuZW50cmllcyh0aGlzLnRvSlNPTigpKVtTeW1ib2wuaXRlcmF0b3JdKCk7XG4gIH1cblxuICB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gT2JqZWN0LmVudHJpZXModGhpcy50b0pTT04oKSkubWFwKChbaGVhZGVyLCB2YWx1ZV0pID0+IGhlYWRlciArICc6ICcgKyB2YWx1ZSkuam9pbignXFxuJyk7XG4gIH1cblxuICBnZXQgW1N5bWJvbC50b1N0cmluZ1RhZ10oKSB7XG4gICAgcmV0dXJuICdBeGlvc0hlYWRlcnMnO1xuICB9XG5cbiAgc3RhdGljIGZyb20odGhpbmcpIHtcbiAgICByZXR1cm4gdGhpbmcgaW5zdGFuY2VvZiB0aGlzID8gdGhpbmcgOiBuZXcgdGhpcyh0aGluZyk7XG4gIH1cblxuICBzdGF0aWMgY29uY2F0KGZpcnN0LCAuLi50YXJnZXRzKSB7XG4gICAgY29uc3QgY29tcHV0ZWQgPSBuZXcgdGhpcyhmaXJzdCk7XG5cbiAgICB0YXJnZXRzLmZvckVhY2goKHRhcmdldCkgPT4gY29tcHV0ZWQuc2V0KHRhcmdldCkpO1xuXG4gICAgcmV0dXJuIGNvbXB1dGVkO1xuICB9XG5cbiAgc3RhdGljIGFjY2Vzc29yKGhlYWRlcikge1xuICAgIGNvbnN0IGludGVybmFscyA9IHRoaXNbJGludGVybmFsc10gPSAodGhpc1skaW50ZXJuYWxzXSA9IHtcbiAgICAgIGFjY2Vzc29yczoge31cbiAgICB9KTtcblxuICAgIGNvbnN0IGFjY2Vzc29ycyA9IGludGVybmFscy5hY2Nlc3NvcnM7XG4gICAgY29uc3QgcHJvdG90eXBlID0gdGhpcy5wcm90b3R5cGU7XG5cbiAgICBmdW5jdGlvbiBkZWZpbmVBY2Nlc3NvcihfaGVhZGVyKSB7XG4gICAgICBjb25zdCBsSGVhZGVyID0gbm9ybWFsaXplSGVhZGVyKF9oZWFkZXIpO1xuXG4gICAgICBpZiAoIWFjY2Vzc29yc1tsSGVhZGVyXSkge1xuICAgICAgICBidWlsZEFjY2Vzc29ycyhwcm90b3R5cGUsIF9oZWFkZXIpO1xuICAgICAgICBhY2Nlc3NvcnNbbEhlYWRlcl0gPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHV0aWxzLmlzQXJyYXkoaGVhZGVyKSA/IGhlYWRlci5mb3JFYWNoKGRlZmluZUFjY2Vzc29yKSA6IGRlZmluZUFjY2Vzc29yKGhlYWRlcik7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuXG5BeGlvc0hlYWRlcnMuYWNjZXNzb3IoWydDb250ZW50LVR5cGUnLCAnQ29udGVudC1MZW5ndGgnLCAnQWNjZXB0JywgJ0FjY2VwdC1FbmNvZGluZycsICdVc2VyLUFnZW50JywgJ0F1dGhvcml6YXRpb24nXSk7XG5cbi8vIHJlc2VydmVkIG5hbWVzIGhvdGZpeFxudXRpbHMucmVkdWNlRGVzY3JpcHRvcnMoQXhpb3NIZWFkZXJzLnByb3RvdHlwZSwgKHt2YWx1ZX0sIGtleSkgPT4ge1xuICBsZXQgbWFwcGVkID0ga2V5WzBdLnRvVXBwZXJDYXNlKCkgKyBrZXkuc2xpY2UoMSk7IC8vIG1hcCBgc2V0YCA9PiBgU2V0YFxuICByZXR1cm4ge1xuICAgIGdldDogKCkgPT4gdmFsdWUsXG4gICAgc2V0KGhlYWRlclZhbHVlKSB7XG4gICAgICB0aGlzW21hcHBlZF0gPSBoZWFkZXJWYWx1ZTtcbiAgICB9XG4gIH1cbn0pO1xuXG51dGlscy5mcmVlemVNZXRob2RzKEF4aW9zSGVhZGVycyk7XG5cbmV4cG9ydCBkZWZhdWx0IEF4aW9zSGVhZGVycztcbiIsIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IHV0aWxzIGZyb20gJy4vLi4vdXRpbHMuanMnO1xuaW1wb3J0IGRlZmF1bHRzIGZyb20gJy4uL2RlZmF1bHRzL2luZGV4LmpzJztcbmltcG9ydCBBeGlvc0hlYWRlcnMgZnJvbSAnLi4vY29yZS9BeGlvc0hlYWRlcnMuanMnO1xuXG4vKipcbiAqIFRyYW5zZm9ybSB0aGUgZGF0YSBmb3IgYSByZXF1ZXN0IG9yIGEgcmVzcG9uc2VcbiAqXG4gKiBAcGFyYW0ge0FycmF5fEZ1bmN0aW9ufSBmbnMgQSBzaW5nbGUgZnVuY3Rpb24gb3IgQXJyYXkgb2YgZnVuY3Rpb25zXG4gKiBAcGFyYW0gez9PYmplY3R9IHJlc3BvbnNlIFRoZSByZXNwb25zZSBvYmplY3RcbiAqXG4gKiBAcmV0dXJucyB7Kn0gVGhlIHJlc3VsdGluZyB0cmFuc2Zvcm1lZCBkYXRhXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHRyYW5zZm9ybURhdGEoZm5zLCByZXNwb25zZSkge1xuICBjb25zdCBjb25maWcgPSB0aGlzIHx8IGRlZmF1bHRzO1xuICBjb25zdCBjb250ZXh0ID0gcmVzcG9uc2UgfHwgY29uZmlnO1xuICBjb25zdCBoZWFkZXJzID0gQXhpb3NIZWFkZXJzLmZyb20oY29udGV4dC5oZWFkZXJzKTtcbiAgbGV0IGRhdGEgPSBjb250ZXh0LmRhdGE7XG5cbiAgdXRpbHMuZm9yRWFjaChmbnMsIGZ1bmN0aW9uIHRyYW5zZm9ybShmbikge1xuICAgIGRhdGEgPSBmbi5jYWxsKGNvbmZpZywgZGF0YSwgaGVhZGVycy5ub3JtYWxpemUoKSwgcmVzcG9uc2UgPyByZXNwb25zZS5zdGF0dXMgOiB1bmRlZmluZWQpO1xuICB9KTtcblxuICBoZWFkZXJzLm5vcm1hbGl6ZSgpO1xuXG4gIHJldHVybiBkYXRhO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpc0NhbmNlbCh2YWx1ZSkge1xuICByZXR1cm4gISEodmFsdWUgJiYgdmFsdWUuX19DQU5DRUxfXyk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCBBeGlvc0Vycm9yIGZyb20gJy4uL2NvcmUvQXhpb3NFcnJvci5qcyc7XG5pbXBvcnQgdXRpbHMgZnJvbSAnLi4vdXRpbHMuanMnO1xuXG4vKipcbiAqIEEgYENhbmNlbGVkRXJyb3JgIGlzIGFuIG9iamVjdCB0aGF0IGlzIHRocm93biB3aGVuIGFuIG9wZXJhdGlvbiBpcyBjYW5jZWxlZC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZz19IG1lc3NhZ2UgVGhlIG1lc3NhZ2UuXG4gKiBAcGFyYW0ge09iamVjdD19IGNvbmZpZyBUaGUgY29uZmlnLlxuICogQHBhcmFtIHtPYmplY3Q9fSByZXF1ZXN0IFRoZSByZXF1ZXN0LlxuICpcbiAqIEByZXR1cm5zIHtDYW5jZWxlZEVycm9yfSBUaGUgY3JlYXRlZCBlcnJvci5cbiAqL1xuZnVuY3Rpb24gQ2FuY2VsZWRFcnJvcihtZXNzYWdlLCBjb25maWcsIHJlcXVlc3QpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWVxLW51bGwsZXFlcWVxXG4gIEF4aW9zRXJyb3IuY2FsbCh0aGlzLCBtZXNzYWdlID09IG51bGwgPyAnY2FuY2VsZWQnIDogbWVzc2FnZSwgQXhpb3NFcnJvci5FUlJfQ0FOQ0VMRUQsIGNvbmZpZywgcmVxdWVzdCk7XG4gIHRoaXMubmFtZSA9ICdDYW5jZWxlZEVycm9yJztcbn1cblxudXRpbHMuaW5oZXJpdHMoQ2FuY2VsZWRFcnJvciwgQXhpb3NFcnJvciwge1xuICBfX0NBTkNFTF9fOiB0cnVlXG59KTtcblxuZXhwb3J0IGRlZmF1bHQgQ2FuY2VsZWRFcnJvcjtcbiIsIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IEF4aW9zRXJyb3IgZnJvbSAnLi9BeGlvc0Vycm9yLmpzJztcblxuLyoqXG4gKiBSZXNvbHZlIG9yIHJlamVjdCBhIFByb21pc2UgYmFzZWQgb24gcmVzcG9uc2Ugc3RhdHVzLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHJlc29sdmUgQSBmdW5jdGlvbiB0aGF0IHJlc29sdmVzIHRoZSBwcm9taXNlLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcmVqZWN0IEEgZnVuY3Rpb24gdGhhdCByZWplY3RzIHRoZSBwcm9taXNlLlxuICogQHBhcmFtIHtvYmplY3R9IHJlc3BvbnNlIFRoZSByZXNwb25zZS5cbiAqXG4gKiBAcmV0dXJucyB7b2JqZWN0fSBUaGUgcmVzcG9uc2UuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHNldHRsZShyZXNvbHZlLCByZWplY3QsIHJlc3BvbnNlKSB7XG4gIGNvbnN0IHZhbGlkYXRlU3RhdHVzID0gcmVzcG9uc2UuY29uZmlnLnZhbGlkYXRlU3RhdHVzO1xuICBpZiAoIXJlc3BvbnNlLnN0YXR1cyB8fCAhdmFsaWRhdGVTdGF0dXMgfHwgdmFsaWRhdGVTdGF0dXMocmVzcG9uc2Uuc3RhdHVzKSkge1xuICAgIHJlc29sdmUocmVzcG9uc2UpO1xuICB9IGVsc2Uge1xuICAgIHJlamVjdChuZXcgQXhpb3NFcnJvcihcbiAgICAgICdSZXF1ZXN0IGZhaWxlZCB3aXRoIHN0YXR1cyBjb2RlICcgKyByZXNwb25zZS5zdGF0dXMsXG4gICAgICBbQXhpb3NFcnJvci5FUlJfQkFEX1JFUVVFU1QsIEF4aW9zRXJyb3IuRVJSX0JBRF9SRVNQT05TRV1bTWF0aC5mbG9vcihyZXNwb25zZS5zdGF0dXMgLyAxMDApIC0gNF0sXG4gICAgICByZXNwb25zZS5jb25maWcsXG4gICAgICByZXNwb25zZS5yZXF1ZXN0LFxuICAgICAgcmVzcG9uc2VcbiAgICApKTtcbiAgfVxufVxuIiwiaW1wb3J0IHV0aWxzIGZyb20gJy4vLi4vdXRpbHMuanMnO1xuaW1wb3J0IHBsYXRmb3JtIGZyb20gJy4uL3BsYXRmb3JtL2luZGV4LmpzJztcblxuZXhwb3J0IGRlZmF1bHQgcGxhdGZvcm0uaGFzU3RhbmRhcmRCcm93c2VyRW52ID9cblxuICAvLyBTdGFuZGFyZCBicm93c2VyIGVudnMgc3VwcG9ydCBkb2N1bWVudC5jb29raWVcbiAge1xuICAgIHdyaXRlKG5hbWUsIHZhbHVlLCBleHBpcmVzLCBwYXRoLCBkb21haW4sIHNlY3VyZSkge1xuICAgICAgY29uc3QgY29va2llID0gW25hbWUgKyAnPScgKyBlbmNvZGVVUklDb21wb25lbnQodmFsdWUpXTtcblxuICAgICAgdXRpbHMuaXNOdW1iZXIoZXhwaXJlcykgJiYgY29va2llLnB1c2goJ2V4cGlyZXM9JyArIG5ldyBEYXRlKGV4cGlyZXMpLnRvR01UU3RyaW5nKCkpO1xuXG4gICAgICB1dGlscy5pc1N0cmluZyhwYXRoKSAmJiBjb29raWUucHVzaCgncGF0aD0nICsgcGF0aCk7XG5cbiAgICAgIHV0aWxzLmlzU3RyaW5nKGRvbWFpbikgJiYgY29va2llLnB1c2goJ2RvbWFpbj0nICsgZG9tYWluKTtcblxuICAgICAgc2VjdXJlID09PSB0cnVlICYmIGNvb2tpZS5wdXNoKCdzZWN1cmUnKTtcblxuICAgICAgZG9jdW1lbnQuY29va2llID0gY29va2llLmpvaW4oJzsgJyk7XG4gICAgfSxcblxuICAgIHJlYWQobmFtZSkge1xuICAgICAgY29uc3QgbWF0Y2ggPSBkb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cCgnKF58O1xcXFxzKikoJyArIG5hbWUgKyAnKT0oW147XSopJykpO1xuICAgICAgcmV0dXJuIChtYXRjaCA/IGRlY29kZVVSSUNvbXBvbmVudChtYXRjaFszXSkgOiBudWxsKTtcbiAgICB9LFxuXG4gICAgcmVtb3ZlKG5hbWUpIHtcbiAgICAgIHRoaXMud3JpdGUobmFtZSwgJycsIERhdGUubm93KCkgLSA4NjQwMDAwMCk7XG4gICAgfVxuICB9XG5cbiAgOlxuXG4gIC8vIE5vbi1zdGFuZGFyZCBicm93c2VyIGVudiAod2ViIHdvcmtlcnMsIHJlYWN0LW5hdGl2ZSkgbGFjayBuZWVkZWQgc3VwcG9ydC5cbiAge1xuICAgIHdyaXRlKCkge30sXG4gICAgcmVhZCgpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0sXG4gICAgcmVtb3ZlKCkge31cbiAgfTtcblxuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciB0aGUgc3BlY2lmaWVkIFVSTCBpcyBhYnNvbHV0ZVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgVGhlIFVSTCB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIHNwZWNpZmllZCBVUkwgaXMgYWJzb2x1dGUsIG90aGVyd2lzZSBmYWxzZVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpc0Fic29sdXRlVVJMKHVybCkge1xuICAvLyBBIFVSTCBpcyBjb25zaWRlcmVkIGFic29sdXRlIGlmIGl0IGJlZ2lucyB3aXRoIFwiPHNjaGVtZT46Ly9cIiBvciBcIi8vXCIgKHByb3RvY29sLXJlbGF0aXZlIFVSTCkuXG4gIC8vIFJGQyAzOTg2IGRlZmluZXMgc2NoZW1lIG5hbWUgYXMgYSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIGJlZ2lubmluZyB3aXRoIGEgbGV0dGVyIGFuZCBmb2xsb3dlZFxuICAvLyBieSBhbnkgY29tYmluYXRpb24gb2YgbGV0dGVycywgZGlnaXRzLCBwbHVzLCBwZXJpb2QsIG9yIGh5cGhlbi5cbiAgcmV0dXJuIC9eKFthLXpdW2EtelxcZCtcXC0uXSo6KT9cXC9cXC8vaS50ZXN0KHVybCk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBVUkwgYnkgY29tYmluaW5nIHRoZSBzcGVjaWZpZWQgVVJMc1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlVVJMIFRoZSBiYXNlIFVSTFxuICogQHBhcmFtIHtzdHJpbmd9IHJlbGF0aXZlVVJMIFRoZSByZWxhdGl2ZSBVUkxcbiAqXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgY29tYmluZWQgVVJMXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNvbWJpbmVVUkxzKGJhc2VVUkwsIHJlbGF0aXZlVVJMKSB7XG4gIHJldHVybiByZWxhdGl2ZVVSTFxuICAgID8gYmFzZVVSTC5yZXBsYWNlKC9cXC8/XFwvJC8sICcnKSArICcvJyArIHJlbGF0aXZlVVJMLnJlcGxhY2UoL15cXC8rLywgJycpXG4gICAgOiBiYXNlVVJMO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgaXNBYnNvbHV0ZVVSTCBmcm9tICcuLi9oZWxwZXJzL2lzQWJzb2x1dGVVUkwuanMnO1xuaW1wb3J0IGNvbWJpbmVVUkxzIGZyb20gJy4uL2hlbHBlcnMvY29tYmluZVVSTHMuanMnO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgVVJMIGJ5IGNvbWJpbmluZyB0aGUgYmFzZVVSTCB3aXRoIHRoZSByZXF1ZXN0ZWRVUkwsXG4gKiBvbmx5IHdoZW4gdGhlIHJlcXVlc3RlZFVSTCBpcyBub3QgYWxyZWFkeSBhbiBhYnNvbHV0ZSBVUkwuXG4gKiBJZiB0aGUgcmVxdWVzdFVSTCBpcyBhYnNvbHV0ZSwgdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSByZXF1ZXN0ZWRVUkwgdW50b3VjaGVkLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlVVJMIFRoZSBiYXNlIFVSTFxuICogQHBhcmFtIHtzdHJpbmd9IHJlcXVlc3RlZFVSTCBBYnNvbHV0ZSBvciByZWxhdGl2ZSBVUkwgdG8gY29tYmluZVxuICpcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBjb21iaW5lZCBmdWxsIHBhdGhcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYnVpbGRGdWxsUGF0aChiYXNlVVJMLCByZXF1ZXN0ZWRVUkwpIHtcbiAgaWYgKGJhc2VVUkwgJiYgIWlzQWJzb2x1dGVVUkwocmVxdWVzdGVkVVJMKSkge1xuICAgIHJldHVybiBjb21iaW5lVVJMcyhiYXNlVVJMLCByZXF1ZXN0ZWRVUkwpO1xuICB9XG4gIHJldHVybiByZXF1ZXN0ZWRVUkw7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCB1dGlscyBmcm9tICcuLy4uL3V0aWxzLmpzJztcbmltcG9ydCBwbGF0Zm9ybSBmcm9tICcuLi9wbGF0Zm9ybS9pbmRleC5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IHBsYXRmb3JtLmhhc1N0YW5kYXJkQnJvd3NlckVudiA/XG5cbi8vIFN0YW5kYXJkIGJyb3dzZXIgZW52cyBoYXZlIGZ1bGwgc3VwcG9ydCBvZiB0aGUgQVBJcyBuZWVkZWQgdG8gdGVzdFxuLy8gd2hldGhlciB0aGUgcmVxdWVzdCBVUkwgaXMgb2YgdGhlIHNhbWUgb3JpZ2luIGFzIGN1cnJlbnQgbG9jYXRpb24uXG4gIChmdW5jdGlvbiBzdGFuZGFyZEJyb3dzZXJFbnYoKSB7XG4gICAgY29uc3QgbXNpZSA9IC8obXNpZXx0cmlkZW50KS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7XG4gICAgY29uc3QgdXJsUGFyc2luZ05vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgbGV0IG9yaWdpblVSTDtcblxuICAgIC8qKlxuICAgICogUGFyc2UgYSBVUkwgdG8gZGlzY292ZXIgaXRzIGNvbXBvbmVudHNcbiAgICAqXG4gICAgKiBAcGFyYW0ge1N0cmluZ30gdXJsIFRoZSBVUkwgdG8gYmUgcGFyc2VkXG4gICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgICovXG4gICAgZnVuY3Rpb24gcmVzb2x2ZVVSTCh1cmwpIHtcbiAgICAgIGxldCBocmVmID0gdXJsO1xuXG4gICAgICBpZiAobXNpZSkge1xuICAgICAgICAvLyBJRSBuZWVkcyBhdHRyaWJ1dGUgc2V0IHR3aWNlIHRvIG5vcm1hbGl6ZSBwcm9wZXJ0aWVzXG4gICAgICAgIHVybFBhcnNpbmdOb2RlLnNldEF0dHJpYnV0ZSgnaHJlZicsIGhyZWYpO1xuICAgICAgICBocmVmID0gdXJsUGFyc2luZ05vZGUuaHJlZjtcbiAgICAgIH1cblxuICAgICAgdXJsUGFyc2luZ05vZGUuc2V0QXR0cmlidXRlKCdocmVmJywgaHJlZik7XG5cbiAgICAgIC8vIHVybFBhcnNpbmdOb2RlIHByb3ZpZGVzIHRoZSBVcmxVdGlscyBpbnRlcmZhY2UgLSBodHRwOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jdXJsdXRpbHNcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGhyZWY6IHVybFBhcnNpbmdOb2RlLmhyZWYsXG4gICAgICAgIHByb3RvY29sOiB1cmxQYXJzaW5nTm9kZS5wcm90b2NvbCA/IHVybFBhcnNpbmdOb2RlLnByb3RvY29sLnJlcGxhY2UoLzokLywgJycpIDogJycsXG4gICAgICAgIGhvc3Q6IHVybFBhcnNpbmdOb2RlLmhvc3QsXG4gICAgICAgIHNlYXJjaDogdXJsUGFyc2luZ05vZGUuc2VhcmNoID8gdXJsUGFyc2luZ05vZGUuc2VhcmNoLnJlcGxhY2UoL15cXD8vLCAnJykgOiAnJyxcbiAgICAgICAgaGFzaDogdXJsUGFyc2luZ05vZGUuaGFzaCA/IHVybFBhcnNpbmdOb2RlLmhhc2gucmVwbGFjZSgvXiMvLCAnJykgOiAnJyxcbiAgICAgICAgaG9zdG5hbWU6IHVybFBhcnNpbmdOb2RlLmhvc3RuYW1lLFxuICAgICAgICBwb3J0OiB1cmxQYXJzaW5nTm9kZS5wb3J0LFxuICAgICAgICBwYXRobmFtZTogKHVybFBhcnNpbmdOb2RlLnBhdGhuYW1lLmNoYXJBdCgwKSA9PT0gJy8nKSA/XG4gICAgICAgICAgdXJsUGFyc2luZ05vZGUucGF0aG5hbWUgOlxuICAgICAgICAgICcvJyArIHVybFBhcnNpbmdOb2RlLnBhdGhuYW1lXG4gICAgICB9O1xuICAgIH1cblxuICAgIG9yaWdpblVSTCA9IHJlc29sdmVVUkwod2luZG93LmxvY2F0aW9uLmhyZWYpO1xuXG4gICAgLyoqXG4gICAgKiBEZXRlcm1pbmUgaWYgYSBVUkwgc2hhcmVzIHRoZSBzYW1lIG9yaWdpbiBhcyB0aGUgY3VycmVudCBsb2NhdGlvblxuICAgICpcbiAgICAqIEBwYXJhbSB7U3RyaW5nfSByZXF1ZXN0VVJMIFRoZSBVUkwgdG8gdGVzdFxuICAgICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgVVJMIHNoYXJlcyB0aGUgc2FtZSBvcmlnaW4sIG90aGVyd2lzZSBmYWxzZVxuICAgICovXG4gICAgcmV0dXJuIGZ1bmN0aW9uIGlzVVJMU2FtZU9yaWdpbihyZXF1ZXN0VVJMKSB7XG4gICAgICBjb25zdCBwYXJzZWQgPSAodXRpbHMuaXNTdHJpbmcocmVxdWVzdFVSTCkpID8gcmVzb2x2ZVVSTChyZXF1ZXN0VVJMKSA6IHJlcXVlc3RVUkw7XG4gICAgICByZXR1cm4gKHBhcnNlZC5wcm90b2NvbCA9PT0gb3JpZ2luVVJMLnByb3RvY29sICYmXG4gICAgICAgICAgcGFyc2VkLmhvc3QgPT09IG9yaWdpblVSTC5ob3N0KTtcbiAgICB9O1xuICB9KSgpIDpcblxuICAvLyBOb24gc3RhbmRhcmQgYnJvd3NlciBlbnZzICh3ZWIgd29ya2VycywgcmVhY3QtbmF0aXZlKSBsYWNrIG5lZWRlZCBzdXBwb3J0LlxuICAoZnVuY3Rpb24gbm9uU3RhbmRhcmRCcm93c2VyRW52KCkge1xuICAgIHJldHVybiBmdW5jdGlvbiBpc1VSTFNhbWVPcmlnaW4oKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuICB9KSgpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBwYXJzZVByb3RvY29sKHVybCkge1xuICBjb25zdCBtYXRjaCA9IC9eKFstK1xcd117MSwyNX0pKDo/XFwvXFwvfDopLy5leGVjKHVybCk7XG4gIHJldHVybiBtYXRjaCAmJiBtYXRjaFsxXSB8fCAnJztcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBDYWxjdWxhdGUgZGF0YSBtYXhSYXRlXG4gKiBAcGFyYW0ge051bWJlcn0gW3NhbXBsZXNDb3VudD0gMTBdXG4gKiBAcGFyYW0ge051bWJlcn0gW21pbj0gMTAwMF1cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn1cbiAqL1xuZnVuY3Rpb24gc3BlZWRvbWV0ZXIoc2FtcGxlc0NvdW50LCBtaW4pIHtcbiAgc2FtcGxlc0NvdW50ID0gc2FtcGxlc0NvdW50IHx8IDEwO1xuICBjb25zdCBieXRlcyA9IG5ldyBBcnJheShzYW1wbGVzQ291bnQpO1xuICBjb25zdCB0aW1lc3RhbXBzID0gbmV3IEFycmF5KHNhbXBsZXNDb3VudCk7XG4gIGxldCBoZWFkID0gMDtcbiAgbGV0IHRhaWwgPSAwO1xuICBsZXQgZmlyc3RTYW1wbGVUUztcblxuICBtaW4gPSBtaW4gIT09IHVuZGVmaW5lZCA/IG1pbiA6IDEwMDA7XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIHB1c2goY2h1bmtMZW5ndGgpIHtcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuXG4gICAgY29uc3Qgc3RhcnRlZEF0ID0gdGltZXN0YW1wc1t0YWlsXTtcblxuICAgIGlmICghZmlyc3RTYW1wbGVUUykge1xuICAgICAgZmlyc3RTYW1wbGVUUyA9IG5vdztcbiAgICB9XG5cbiAgICBieXRlc1toZWFkXSA9IGNodW5rTGVuZ3RoO1xuICAgIHRpbWVzdGFtcHNbaGVhZF0gPSBub3c7XG5cbiAgICBsZXQgaSA9IHRhaWw7XG4gICAgbGV0IGJ5dGVzQ291bnQgPSAwO1xuXG4gICAgd2hpbGUgKGkgIT09IGhlYWQpIHtcbiAgICAgIGJ5dGVzQ291bnQgKz0gYnl0ZXNbaSsrXTtcbiAgICAgIGkgPSBpICUgc2FtcGxlc0NvdW50O1xuICAgIH1cblxuICAgIGhlYWQgPSAoaGVhZCArIDEpICUgc2FtcGxlc0NvdW50O1xuXG4gICAgaWYgKGhlYWQgPT09IHRhaWwpIHtcbiAgICAgIHRhaWwgPSAodGFpbCArIDEpICUgc2FtcGxlc0NvdW50O1xuICAgIH1cblxuICAgIGlmIChub3cgLSBmaXJzdFNhbXBsZVRTIDwgbWluKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcGFzc2VkID0gc3RhcnRlZEF0ICYmIG5vdyAtIHN0YXJ0ZWRBdDtcblxuICAgIHJldHVybiBwYXNzZWQgPyBNYXRoLnJvdW5kKGJ5dGVzQ291bnQgKiAxMDAwIC8gcGFzc2VkKSA6IHVuZGVmaW5lZDtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgc3BlZWRvbWV0ZXI7XG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCB1dGlscyBmcm9tICcuLy4uL3V0aWxzLmpzJztcbmltcG9ydCBzZXR0bGUgZnJvbSAnLi8uLi9jb3JlL3NldHRsZS5qcyc7XG5pbXBvcnQgY29va2llcyBmcm9tICcuLy4uL2hlbHBlcnMvY29va2llcy5qcyc7XG5pbXBvcnQgYnVpbGRVUkwgZnJvbSAnLi8uLi9oZWxwZXJzL2J1aWxkVVJMLmpzJztcbmltcG9ydCBidWlsZEZ1bGxQYXRoIGZyb20gJy4uL2NvcmUvYnVpbGRGdWxsUGF0aC5qcyc7XG5pbXBvcnQgaXNVUkxTYW1lT3JpZ2luIGZyb20gJy4vLi4vaGVscGVycy9pc1VSTFNhbWVPcmlnaW4uanMnO1xuaW1wb3J0IHRyYW5zaXRpb25hbERlZmF1bHRzIGZyb20gJy4uL2RlZmF1bHRzL3RyYW5zaXRpb25hbC5qcyc7XG5pbXBvcnQgQXhpb3NFcnJvciBmcm9tICcuLi9jb3JlL0F4aW9zRXJyb3IuanMnO1xuaW1wb3J0IENhbmNlbGVkRXJyb3IgZnJvbSAnLi4vY2FuY2VsL0NhbmNlbGVkRXJyb3IuanMnO1xuaW1wb3J0IHBhcnNlUHJvdG9jb2wgZnJvbSAnLi4vaGVscGVycy9wYXJzZVByb3RvY29sLmpzJztcbmltcG9ydCBwbGF0Zm9ybSBmcm9tICcuLi9wbGF0Zm9ybS9pbmRleC5qcyc7XG5pbXBvcnQgQXhpb3NIZWFkZXJzIGZyb20gJy4uL2NvcmUvQXhpb3NIZWFkZXJzLmpzJztcbmltcG9ydCBzcGVlZG9tZXRlciBmcm9tICcuLi9oZWxwZXJzL3NwZWVkb21ldGVyLmpzJztcblxuZnVuY3Rpb24gcHJvZ3Jlc3NFdmVudFJlZHVjZXIobGlzdGVuZXIsIGlzRG93bmxvYWRTdHJlYW0pIHtcbiAgbGV0IGJ5dGVzTm90aWZpZWQgPSAwO1xuICBjb25zdCBfc3BlZWRvbWV0ZXIgPSBzcGVlZG9tZXRlcig1MCwgMjUwKTtcblxuICByZXR1cm4gZSA9PiB7XG4gICAgY29uc3QgbG9hZGVkID0gZS5sb2FkZWQ7XG4gICAgY29uc3QgdG90YWwgPSBlLmxlbmd0aENvbXB1dGFibGUgPyBlLnRvdGFsIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IHByb2dyZXNzQnl0ZXMgPSBsb2FkZWQgLSBieXRlc05vdGlmaWVkO1xuICAgIGNvbnN0IHJhdGUgPSBfc3BlZWRvbWV0ZXIocHJvZ3Jlc3NCeXRlcyk7XG4gICAgY29uc3QgaW5SYW5nZSA9IGxvYWRlZCA8PSB0b3RhbDtcblxuICAgIGJ5dGVzTm90aWZpZWQgPSBsb2FkZWQ7XG5cbiAgICBjb25zdCBkYXRhID0ge1xuICAgICAgbG9hZGVkLFxuICAgICAgdG90YWwsXG4gICAgICBwcm9ncmVzczogdG90YWwgPyAobG9hZGVkIC8gdG90YWwpIDogdW5kZWZpbmVkLFxuICAgICAgYnl0ZXM6IHByb2dyZXNzQnl0ZXMsXG4gICAgICByYXRlOiByYXRlID8gcmF0ZSA6IHVuZGVmaW5lZCxcbiAgICAgIGVzdGltYXRlZDogcmF0ZSAmJiB0b3RhbCAmJiBpblJhbmdlID8gKHRvdGFsIC0gbG9hZGVkKSAvIHJhdGUgOiB1bmRlZmluZWQsXG4gICAgICBldmVudDogZVxuICAgIH07XG5cbiAgICBkYXRhW2lzRG93bmxvYWRTdHJlYW0gPyAnZG93bmxvYWQnIDogJ3VwbG9hZCddID0gdHJ1ZTtcblxuICAgIGxpc3RlbmVyKGRhdGEpO1xuICB9O1xufVxuXG5jb25zdCBpc1hIUkFkYXB0ZXJTdXBwb3J0ZWQgPSB0eXBlb2YgWE1MSHR0cFJlcXVlc3QgIT09ICd1bmRlZmluZWQnO1xuXG5leHBvcnQgZGVmYXVsdCBpc1hIUkFkYXB0ZXJTdXBwb3J0ZWQgJiYgZnVuY3Rpb24gKGNvbmZpZykge1xuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gZGlzcGF0Y2hYaHJSZXF1ZXN0KHJlc29sdmUsIHJlamVjdCkge1xuICAgIGxldCByZXF1ZXN0RGF0YSA9IGNvbmZpZy5kYXRhO1xuICAgIGNvbnN0IHJlcXVlc3RIZWFkZXJzID0gQXhpb3NIZWFkZXJzLmZyb20oY29uZmlnLmhlYWRlcnMpLm5vcm1hbGl6ZSgpO1xuICAgIGxldCB7cmVzcG9uc2VUeXBlLCB3aXRoWFNSRlRva2VufSA9IGNvbmZpZztcbiAgICBsZXQgb25DYW5jZWxlZDtcbiAgICBmdW5jdGlvbiBkb25lKCkge1xuICAgICAgaWYgKGNvbmZpZy5jYW5jZWxUb2tlbikge1xuICAgICAgICBjb25maWcuY2FuY2VsVG9rZW4udW5zdWJzY3JpYmUob25DYW5jZWxlZCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcuc2lnbmFsKSB7XG4gICAgICAgIGNvbmZpZy5zaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBvbkNhbmNlbGVkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgY29udGVudFR5cGU7XG5cbiAgICBpZiAodXRpbHMuaXNGb3JtRGF0YShyZXF1ZXN0RGF0YSkpIHtcbiAgICAgIGlmIChwbGF0Zm9ybS5oYXNTdGFuZGFyZEJyb3dzZXJFbnYgfHwgcGxhdGZvcm0uaGFzU3RhbmRhcmRCcm93c2VyV2ViV29ya2VyRW52KSB7XG4gICAgICAgIHJlcXVlc3RIZWFkZXJzLnNldENvbnRlbnRUeXBlKGZhbHNlKTsgLy8gTGV0IHRoZSBicm93c2VyIHNldCBpdFxuICAgICAgfSBlbHNlIGlmICgoY29udGVudFR5cGUgPSByZXF1ZXN0SGVhZGVycy5nZXRDb250ZW50VHlwZSgpKSAhPT0gZmFsc2UpIHtcbiAgICAgICAgLy8gZml4IHNlbWljb2xvbiBkdXBsaWNhdGlvbiBpc3N1ZSBmb3IgUmVhY3ROYXRpdmUgRm9ybURhdGEgaW1wbGVtZW50YXRpb25cbiAgICAgICAgY29uc3QgW3R5cGUsIC4uLnRva2Vuc10gPSBjb250ZW50VHlwZSA/IGNvbnRlbnRUeXBlLnNwbGl0KCc7JykubWFwKHRva2VuID0+IHRva2VuLnRyaW0oKSkuZmlsdGVyKEJvb2xlYW4pIDogW107XG4gICAgICAgIHJlcXVlc3RIZWFkZXJzLnNldENvbnRlbnRUeXBlKFt0eXBlIHx8ICdtdWx0aXBhcnQvZm9ybS1kYXRhJywgLi4udG9rZW5zXS5qb2luKCc7ICcpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgcmVxdWVzdCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuXG4gICAgLy8gSFRUUCBiYXNpYyBhdXRoZW50aWNhdGlvblxuICAgIGlmIChjb25maWcuYXV0aCkge1xuICAgICAgY29uc3QgdXNlcm5hbWUgPSBjb25maWcuYXV0aC51c2VybmFtZSB8fCAnJztcbiAgICAgIGNvbnN0IHBhc3N3b3JkID0gY29uZmlnLmF1dGgucGFzc3dvcmQgPyB1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoY29uZmlnLmF1dGgucGFzc3dvcmQpKSA6ICcnO1xuICAgICAgcmVxdWVzdEhlYWRlcnMuc2V0KCdBdXRob3JpemF0aW9uJywgJ0Jhc2ljICcgKyBidG9hKHVzZXJuYW1lICsgJzonICsgcGFzc3dvcmQpKTtcbiAgICB9XG5cbiAgICBjb25zdCBmdWxsUGF0aCA9IGJ1aWxkRnVsbFBhdGgoY29uZmlnLmJhc2VVUkwsIGNvbmZpZy51cmwpO1xuXG4gICAgcmVxdWVzdC5vcGVuKGNvbmZpZy5tZXRob2QudG9VcHBlckNhc2UoKSwgYnVpbGRVUkwoZnVsbFBhdGgsIGNvbmZpZy5wYXJhbXMsIGNvbmZpZy5wYXJhbXNTZXJpYWxpemVyKSwgdHJ1ZSk7XG5cbiAgICAvLyBTZXQgdGhlIHJlcXVlc3QgdGltZW91dCBpbiBNU1xuICAgIHJlcXVlc3QudGltZW91dCA9IGNvbmZpZy50aW1lb3V0O1xuXG4gICAgZnVuY3Rpb24gb25sb2FkZW5kKCkge1xuICAgICAgaWYgKCFyZXF1ZXN0KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIFByZXBhcmUgdGhlIHJlc3BvbnNlXG4gICAgICBjb25zdCByZXNwb25zZUhlYWRlcnMgPSBBeGlvc0hlYWRlcnMuZnJvbShcbiAgICAgICAgJ2dldEFsbFJlc3BvbnNlSGVhZGVycycgaW4gcmVxdWVzdCAmJiByZXF1ZXN0LmdldEFsbFJlc3BvbnNlSGVhZGVycygpXG4gICAgICApO1xuICAgICAgY29uc3QgcmVzcG9uc2VEYXRhID0gIXJlc3BvbnNlVHlwZSB8fCByZXNwb25zZVR5cGUgPT09ICd0ZXh0JyB8fCByZXNwb25zZVR5cGUgPT09ICdqc29uJyA/XG4gICAgICAgIHJlcXVlc3QucmVzcG9uc2VUZXh0IDogcmVxdWVzdC5yZXNwb25zZTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0ge1xuICAgICAgICBkYXRhOiByZXNwb25zZURhdGEsXG4gICAgICAgIHN0YXR1czogcmVxdWVzdC5zdGF0dXMsXG4gICAgICAgIHN0YXR1c1RleHQ6IHJlcXVlc3Quc3RhdHVzVGV4dCxcbiAgICAgICAgaGVhZGVyczogcmVzcG9uc2VIZWFkZXJzLFxuICAgICAgICBjb25maWcsXG4gICAgICAgIHJlcXVlc3RcbiAgICAgIH07XG5cbiAgICAgIHNldHRsZShmdW5jdGlvbiBfcmVzb2x2ZSh2YWx1ZSkge1xuICAgICAgICByZXNvbHZlKHZhbHVlKTtcbiAgICAgICAgZG9uZSgpO1xuICAgICAgfSwgZnVuY3Rpb24gX3JlamVjdChlcnIpIHtcbiAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgIGRvbmUoKTtcbiAgICAgIH0sIHJlc3BvbnNlKTtcblxuICAgICAgLy8gQ2xlYW4gdXAgcmVxdWVzdFxuICAgICAgcmVxdWVzdCA9IG51bGw7XG4gICAgfVxuXG4gICAgaWYgKCdvbmxvYWRlbmQnIGluIHJlcXVlc3QpIHtcbiAgICAgIC8vIFVzZSBvbmxvYWRlbmQgaWYgYXZhaWxhYmxlXG4gICAgICByZXF1ZXN0Lm9ubG9hZGVuZCA9IG9ubG9hZGVuZDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTGlzdGVuIGZvciByZWFkeSBzdGF0ZSB0byBlbXVsYXRlIG9ubG9hZGVuZFxuICAgICAgcmVxdWVzdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbiBoYW5kbGVMb2FkKCkge1xuICAgICAgICBpZiAoIXJlcXVlc3QgfHwgcmVxdWVzdC5yZWFkeVN0YXRlICE9PSA0KSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVGhlIHJlcXVlc3QgZXJyb3JlZCBvdXQgYW5kIHdlIGRpZG4ndCBnZXQgYSByZXNwb25zZSwgdGhpcyB3aWxsIGJlXG4gICAgICAgIC8vIGhhbmRsZWQgYnkgb25lcnJvciBpbnN0ZWFkXG4gICAgICAgIC8vIFdpdGggb25lIGV4Y2VwdGlvbjogcmVxdWVzdCB0aGF0IHVzaW5nIGZpbGU6IHByb3RvY29sLCBtb3N0IGJyb3dzZXJzXG4gICAgICAgIC8vIHdpbGwgcmV0dXJuIHN0YXR1cyBhcyAwIGV2ZW4gdGhvdWdoIGl0J3MgYSBzdWNjZXNzZnVsIHJlcXVlc3RcbiAgICAgICAgaWYgKHJlcXVlc3Quc3RhdHVzID09PSAwICYmICEocmVxdWVzdC5yZXNwb25zZVVSTCAmJiByZXF1ZXN0LnJlc3BvbnNlVVJMLmluZGV4T2YoJ2ZpbGU6JykgPT09IDApKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIHJlYWR5c3RhdGUgaGFuZGxlciBpcyBjYWxsaW5nIGJlZm9yZSBvbmVycm9yIG9yIG9udGltZW91dCBoYW5kbGVycyxcbiAgICAgICAgLy8gc28gd2Ugc2hvdWxkIGNhbGwgb25sb2FkZW5kIG9uIHRoZSBuZXh0ICd0aWNrJ1xuICAgICAgICBzZXRUaW1lb3V0KG9ubG9hZGVuZCk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBicm93c2VyIHJlcXVlc3QgY2FuY2VsbGF0aW9uIChhcyBvcHBvc2VkIHRvIGEgbWFudWFsIGNhbmNlbGxhdGlvbilcbiAgICByZXF1ZXN0Lm9uYWJvcnQgPSBmdW5jdGlvbiBoYW5kbGVBYm9ydCgpIHtcbiAgICAgIGlmICghcmVxdWVzdCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHJlamVjdChuZXcgQXhpb3NFcnJvcignUmVxdWVzdCBhYm9ydGVkJywgQXhpb3NFcnJvci5FQ09OTkFCT1JURUQsIGNvbmZpZywgcmVxdWVzdCkpO1xuXG4gICAgICAvLyBDbGVhbiB1cCByZXF1ZXN0XG4gICAgICByZXF1ZXN0ID0gbnVsbDtcbiAgICB9O1xuXG4gICAgLy8gSGFuZGxlIGxvdyBsZXZlbCBuZXR3b3JrIGVycm9yc1xuICAgIHJlcXVlc3Qub25lcnJvciA9IGZ1bmN0aW9uIGhhbmRsZUVycm9yKCkge1xuICAgICAgLy8gUmVhbCBlcnJvcnMgYXJlIGhpZGRlbiBmcm9tIHVzIGJ5IHRoZSBicm93c2VyXG4gICAgICAvLyBvbmVycm9yIHNob3VsZCBvbmx5IGZpcmUgaWYgaXQncyBhIG5ldHdvcmsgZXJyb3JcbiAgICAgIHJlamVjdChuZXcgQXhpb3NFcnJvcignTmV0d29yayBFcnJvcicsIEF4aW9zRXJyb3IuRVJSX05FVFdPUkssIGNvbmZpZywgcmVxdWVzdCkpO1xuXG4gICAgICAvLyBDbGVhbiB1cCByZXF1ZXN0XG4gICAgICByZXF1ZXN0ID0gbnVsbDtcbiAgICB9O1xuXG4gICAgLy8gSGFuZGxlIHRpbWVvdXRcbiAgICByZXF1ZXN0Lm9udGltZW91dCA9IGZ1bmN0aW9uIGhhbmRsZVRpbWVvdXQoKSB7XG4gICAgICBsZXQgdGltZW91dEVycm9yTWVzc2FnZSA9IGNvbmZpZy50aW1lb3V0ID8gJ3RpbWVvdXQgb2YgJyArIGNvbmZpZy50aW1lb3V0ICsgJ21zIGV4Y2VlZGVkJyA6ICd0aW1lb3V0IGV4Y2VlZGVkJztcbiAgICAgIGNvbnN0IHRyYW5zaXRpb25hbCA9IGNvbmZpZy50cmFuc2l0aW9uYWwgfHwgdHJhbnNpdGlvbmFsRGVmYXVsdHM7XG4gICAgICBpZiAoY29uZmlnLnRpbWVvdXRFcnJvck1lc3NhZ2UpIHtcbiAgICAgICAgdGltZW91dEVycm9yTWVzc2FnZSA9IGNvbmZpZy50aW1lb3V0RXJyb3JNZXNzYWdlO1xuICAgICAgfVxuICAgICAgcmVqZWN0KG5ldyBBeGlvc0Vycm9yKFxuICAgICAgICB0aW1lb3V0RXJyb3JNZXNzYWdlLFxuICAgICAgICB0cmFuc2l0aW9uYWwuY2xhcmlmeVRpbWVvdXRFcnJvciA/IEF4aW9zRXJyb3IuRVRJTUVET1VUIDogQXhpb3NFcnJvci5FQ09OTkFCT1JURUQsXG4gICAgICAgIGNvbmZpZyxcbiAgICAgICAgcmVxdWVzdCkpO1xuXG4gICAgICAvLyBDbGVhbiB1cCByZXF1ZXN0XG4gICAgICByZXF1ZXN0ID0gbnVsbDtcbiAgICB9O1xuXG4gICAgLy8gQWRkIHhzcmYgaGVhZGVyXG4gICAgLy8gVGhpcyBpcyBvbmx5IGRvbmUgaWYgcnVubmluZyBpbiBhIHN0YW5kYXJkIGJyb3dzZXIgZW52aXJvbm1lbnQuXG4gICAgLy8gU3BlY2lmaWNhbGx5IG5vdCBpZiB3ZSdyZSBpbiBhIHdlYiB3b3JrZXIsIG9yIHJlYWN0LW5hdGl2ZS5cbiAgICBpZihwbGF0Zm9ybS5oYXNTdGFuZGFyZEJyb3dzZXJFbnYpIHtcbiAgICAgIHdpdGhYU1JGVG9rZW4gJiYgdXRpbHMuaXNGdW5jdGlvbih3aXRoWFNSRlRva2VuKSAmJiAod2l0aFhTUkZUb2tlbiA9IHdpdGhYU1JGVG9rZW4oY29uZmlnKSk7XG5cbiAgICAgIGlmICh3aXRoWFNSRlRva2VuIHx8ICh3aXRoWFNSRlRva2VuICE9PSBmYWxzZSAmJiBpc1VSTFNhbWVPcmlnaW4oZnVsbFBhdGgpKSkge1xuICAgICAgICAvLyBBZGQgeHNyZiBoZWFkZXJcbiAgICAgICAgY29uc3QgeHNyZlZhbHVlID0gY29uZmlnLnhzcmZIZWFkZXJOYW1lICYmIGNvbmZpZy54c3JmQ29va2llTmFtZSAmJiBjb29raWVzLnJlYWQoY29uZmlnLnhzcmZDb29raWVOYW1lKTtcblxuICAgICAgICBpZiAoeHNyZlZhbHVlKSB7XG4gICAgICAgICAgcmVxdWVzdEhlYWRlcnMuc2V0KGNvbmZpZy54c3JmSGVhZGVyTmFtZSwgeHNyZlZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJlbW92ZSBDb250ZW50LVR5cGUgaWYgZGF0YSBpcyB1bmRlZmluZWRcbiAgICByZXF1ZXN0RGF0YSA9PT0gdW5kZWZpbmVkICYmIHJlcXVlc3RIZWFkZXJzLnNldENvbnRlbnRUeXBlKG51bGwpO1xuXG4gICAgLy8gQWRkIGhlYWRlcnMgdG8gdGhlIHJlcXVlc3RcbiAgICBpZiAoJ3NldFJlcXVlc3RIZWFkZXInIGluIHJlcXVlc3QpIHtcbiAgICAgIHV0aWxzLmZvckVhY2gocmVxdWVzdEhlYWRlcnMudG9KU09OKCksIGZ1bmN0aW9uIHNldFJlcXVlc3RIZWFkZXIodmFsLCBrZXkpIHtcbiAgICAgICAgcmVxdWVzdC5zZXRSZXF1ZXN0SGVhZGVyKGtleSwgdmFsKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEFkZCB3aXRoQ3JlZGVudGlhbHMgdG8gcmVxdWVzdCBpZiBuZWVkZWRcbiAgICBpZiAoIXV0aWxzLmlzVW5kZWZpbmVkKGNvbmZpZy53aXRoQ3JlZGVudGlhbHMpKSB7XG4gICAgICByZXF1ZXN0LndpdGhDcmVkZW50aWFscyA9ICEhY29uZmlnLndpdGhDcmVkZW50aWFscztcbiAgICB9XG5cbiAgICAvLyBBZGQgcmVzcG9uc2VUeXBlIHRvIHJlcXVlc3QgaWYgbmVlZGVkXG4gICAgaWYgKHJlc3BvbnNlVHlwZSAmJiByZXNwb25zZVR5cGUgIT09ICdqc29uJykge1xuICAgICAgcmVxdWVzdC5yZXNwb25zZVR5cGUgPSBjb25maWcucmVzcG9uc2VUeXBlO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBwcm9ncmVzcyBpZiBuZWVkZWRcbiAgICBpZiAodHlwZW9mIGNvbmZpZy5vbkRvd25sb2FkUHJvZ3Jlc3MgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJlcXVlc3QuYWRkRXZlbnRMaXN0ZW5lcigncHJvZ3Jlc3MnLCBwcm9ncmVzc0V2ZW50UmVkdWNlcihjb25maWcub25Eb3dubG9hZFByb2dyZXNzLCB0cnVlKSk7XG4gICAgfVxuXG4gICAgLy8gTm90IGFsbCBicm93c2VycyBzdXBwb3J0IHVwbG9hZCBldmVudHNcbiAgICBpZiAodHlwZW9mIGNvbmZpZy5vblVwbG9hZFByb2dyZXNzID09PSAnZnVuY3Rpb24nICYmIHJlcXVlc3QudXBsb2FkKSB7XG4gICAgICByZXF1ZXN0LnVwbG9hZC5hZGRFdmVudExpc3RlbmVyKCdwcm9ncmVzcycsIHByb2dyZXNzRXZlbnRSZWR1Y2VyKGNvbmZpZy5vblVwbG9hZFByb2dyZXNzKSk7XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5jYW5jZWxUb2tlbiB8fCBjb25maWcuc2lnbmFsKSB7XG4gICAgICAvLyBIYW5kbGUgY2FuY2VsbGF0aW9uXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZnVuYy1uYW1lc1xuICAgICAgb25DYW5jZWxlZCA9IGNhbmNlbCA9PiB7XG4gICAgICAgIGlmICghcmVxdWVzdCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoIWNhbmNlbCB8fCBjYW5jZWwudHlwZSA/IG5ldyBDYW5jZWxlZEVycm9yKG51bGwsIGNvbmZpZywgcmVxdWVzdCkgOiBjYW5jZWwpO1xuICAgICAgICByZXF1ZXN0LmFib3J0KCk7XG4gICAgICAgIHJlcXVlc3QgPSBudWxsO1xuICAgICAgfTtcblxuICAgICAgY29uZmlnLmNhbmNlbFRva2VuICYmIGNvbmZpZy5jYW5jZWxUb2tlbi5zdWJzY3JpYmUob25DYW5jZWxlZCk7XG4gICAgICBpZiAoY29uZmlnLnNpZ25hbCkge1xuICAgICAgICBjb25maWcuc2lnbmFsLmFib3J0ZWQgPyBvbkNhbmNlbGVkKCkgOiBjb25maWcuc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0Jywgb25DYW5jZWxlZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcHJvdG9jb2wgPSBwYXJzZVByb3RvY29sKGZ1bGxQYXRoKTtcblxuICAgIGlmIChwcm90b2NvbCAmJiBwbGF0Zm9ybS5wcm90b2NvbHMuaW5kZXhPZihwcm90b2NvbCkgPT09IC0xKSB7XG4gICAgICByZWplY3QobmV3IEF4aW9zRXJyb3IoJ1Vuc3VwcG9ydGVkIHByb3RvY29sICcgKyBwcm90b2NvbCArICc6JywgQXhpb3NFcnJvci5FUlJfQkFEX1JFUVVFU1QsIGNvbmZpZykpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuXG4gICAgLy8gU2VuZCB0aGUgcmVxdWVzdFxuICAgIHJlcXVlc3Quc2VuZChyZXF1ZXN0RGF0YSB8fCBudWxsKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgdXRpbHMgZnJvbSAnLi4vdXRpbHMuanMnO1xuaW1wb3J0IGh0dHBBZGFwdGVyIGZyb20gJy4vaHR0cC5qcyc7XG5pbXBvcnQgeGhyQWRhcHRlciBmcm9tICcuL3hoci5qcyc7XG5pbXBvcnQgQXhpb3NFcnJvciBmcm9tIFwiLi4vY29yZS9BeGlvc0Vycm9yLmpzXCI7XG5cbmNvbnN0IGtub3duQWRhcHRlcnMgPSB7XG4gIGh0dHA6IGh0dHBBZGFwdGVyLFxuICB4aHI6IHhockFkYXB0ZXJcbn1cblxudXRpbHMuZm9yRWFjaChrbm93bkFkYXB0ZXJzLCAoZm4sIHZhbHVlKSA9PiB7XG4gIGlmIChmbikge1xuICAgIHRyeSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZm4sICduYW1lJywge3ZhbHVlfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWVtcHR5XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmbiwgJ2FkYXB0ZXJOYW1lJywge3ZhbHVlfSk7XG4gIH1cbn0pO1xuXG5jb25zdCByZW5kZXJSZWFzb24gPSAocmVhc29uKSA9PiBgLSAke3JlYXNvbn1gO1xuXG5jb25zdCBpc1Jlc29sdmVkSGFuZGxlID0gKGFkYXB0ZXIpID0+IHV0aWxzLmlzRnVuY3Rpb24oYWRhcHRlcikgfHwgYWRhcHRlciA9PT0gbnVsbCB8fCBhZGFwdGVyID09PSBmYWxzZTtcblxuZXhwb3J0IGRlZmF1bHQge1xuICBnZXRBZGFwdGVyOiAoYWRhcHRlcnMpID0+IHtcbiAgICBhZGFwdGVycyA9IHV0aWxzLmlzQXJyYXkoYWRhcHRlcnMpID8gYWRhcHRlcnMgOiBbYWRhcHRlcnNdO1xuXG4gICAgY29uc3Qge2xlbmd0aH0gPSBhZGFwdGVycztcbiAgICBsZXQgbmFtZU9yQWRhcHRlcjtcbiAgICBsZXQgYWRhcHRlcjtcblxuICAgIGNvbnN0IHJlamVjdGVkUmVhc29ucyA9IHt9O1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgbmFtZU9yQWRhcHRlciA9IGFkYXB0ZXJzW2ldO1xuICAgICAgbGV0IGlkO1xuXG4gICAgICBhZGFwdGVyID0gbmFtZU9yQWRhcHRlcjtcblxuICAgICAgaWYgKCFpc1Jlc29sdmVkSGFuZGxlKG5hbWVPckFkYXB0ZXIpKSB7XG4gICAgICAgIGFkYXB0ZXIgPSBrbm93bkFkYXB0ZXJzWyhpZCA9IFN0cmluZyhuYW1lT3JBZGFwdGVyKSkudG9Mb3dlckNhc2UoKV07XG5cbiAgICAgICAgaWYgKGFkYXB0ZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRocm93IG5ldyBBeGlvc0Vycm9yKGBVbmtub3duIGFkYXB0ZXIgJyR7aWR9J2ApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChhZGFwdGVyKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICByZWplY3RlZFJlYXNvbnNbaWQgfHwgJyMnICsgaV0gPSBhZGFwdGVyO1xuICAgIH1cblxuICAgIGlmICghYWRhcHRlcikge1xuXG4gICAgICBjb25zdCByZWFzb25zID0gT2JqZWN0LmVudHJpZXMocmVqZWN0ZWRSZWFzb25zKVxuICAgICAgICAubWFwKChbaWQsIHN0YXRlXSkgPT4gYGFkYXB0ZXIgJHtpZH0gYCArXG4gICAgICAgICAgKHN0YXRlID09PSBmYWxzZSA/ICdpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBlbnZpcm9ubWVudCcgOiAnaXMgbm90IGF2YWlsYWJsZSBpbiB0aGUgYnVpbGQnKVxuICAgICAgICApO1xuXG4gICAgICBsZXQgcyA9IGxlbmd0aCA/XG4gICAgICAgIChyZWFzb25zLmxlbmd0aCA+IDEgPyAnc2luY2UgOlxcbicgKyByZWFzb25zLm1hcChyZW5kZXJSZWFzb24pLmpvaW4oJ1xcbicpIDogJyAnICsgcmVuZGVyUmVhc29uKHJlYXNvbnNbMF0pKSA6XG4gICAgICAgICdhcyBubyBhZGFwdGVyIHNwZWNpZmllZCc7XG5cbiAgICAgIHRocm93IG5ldyBBeGlvc0Vycm9yKFxuICAgICAgICBgVGhlcmUgaXMgbm8gc3VpdGFibGUgYWRhcHRlciB0byBkaXNwYXRjaCB0aGUgcmVxdWVzdCBgICsgcyxcbiAgICAgICAgJ0VSUl9OT1RfU1VQUE9SVCdcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFkYXB0ZXI7XG4gIH0sXG4gIGFkYXB0ZXJzOiBrbm93bkFkYXB0ZXJzXG59XG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCB0cmFuc2Zvcm1EYXRhIGZyb20gJy4vdHJhbnNmb3JtRGF0YS5qcyc7XG5pbXBvcnQgaXNDYW5jZWwgZnJvbSAnLi4vY2FuY2VsL2lzQ2FuY2VsLmpzJztcbmltcG9ydCBkZWZhdWx0cyBmcm9tICcuLi9kZWZhdWx0cy9pbmRleC5qcyc7XG5pbXBvcnQgQ2FuY2VsZWRFcnJvciBmcm9tICcuLi9jYW5jZWwvQ2FuY2VsZWRFcnJvci5qcyc7XG5pbXBvcnQgQXhpb3NIZWFkZXJzIGZyb20gJy4uL2NvcmUvQXhpb3NIZWFkZXJzLmpzJztcbmltcG9ydCBhZGFwdGVycyBmcm9tIFwiLi4vYWRhcHRlcnMvYWRhcHRlcnMuanNcIjtcblxuLyoqXG4gKiBUaHJvd3MgYSBgQ2FuY2VsZWRFcnJvcmAgaWYgY2FuY2VsbGF0aW9uIGhhcyBiZWVuIHJlcXVlc3RlZC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIFRoZSBjb25maWcgdGhhdCBpcyB0byBiZSB1c2VkIGZvciB0aGUgcmVxdWVzdFxuICpcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiB0aHJvd0lmQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKGNvbmZpZykge1xuICBpZiAoY29uZmlnLmNhbmNlbFRva2VuKSB7XG4gICAgY29uZmlnLmNhbmNlbFRva2VuLnRocm93SWZSZXF1ZXN0ZWQoKTtcbiAgfVxuXG4gIGlmIChjb25maWcuc2lnbmFsICYmIGNvbmZpZy5zaWduYWwuYWJvcnRlZCkge1xuICAgIHRocm93IG5ldyBDYW5jZWxlZEVycm9yKG51bGwsIGNvbmZpZyk7XG4gIH1cbn1cblxuLyoqXG4gKiBEaXNwYXRjaCBhIHJlcXVlc3QgdG8gdGhlIHNlcnZlciB1c2luZyB0aGUgY29uZmlndXJlZCBhZGFwdGVyLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBjb25maWcgVGhlIGNvbmZpZyB0aGF0IGlzIHRvIGJlIHVzZWQgZm9yIHRoZSByZXF1ZXN0XG4gKlxuICogQHJldHVybnMge1Byb21pc2V9IFRoZSBQcm9taXNlIHRvIGJlIGZ1bGZpbGxlZFxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBkaXNwYXRjaFJlcXVlc3QoY29uZmlnKSB7XG4gIHRocm93SWZDYW5jZWxsYXRpb25SZXF1ZXN0ZWQoY29uZmlnKTtcblxuICBjb25maWcuaGVhZGVycyA9IEF4aW9zSGVhZGVycy5mcm9tKGNvbmZpZy5oZWFkZXJzKTtcblxuICAvLyBUcmFuc2Zvcm0gcmVxdWVzdCBkYXRhXG4gIGNvbmZpZy5kYXRhID0gdHJhbnNmb3JtRGF0YS5jYWxsKFxuICAgIGNvbmZpZyxcbiAgICBjb25maWcudHJhbnNmb3JtUmVxdWVzdFxuICApO1xuXG4gIGlmIChbJ3Bvc3QnLCAncHV0JywgJ3BhdGNoJ10uaW5kZXhPZihjb25maWcubWV0aG9kKSAhPT0gLTEpIHtcbiAgICBjb25maWcuaGVhZGVycy5zZXRDb250ZW50VHlwZSgnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJywgZmFsc2UpO1xuICB9XG5cbiAgY29uc3QgYWRhcHRlciA9IGFkYXB0ZXJzLmdldEFkYXB0ZXIoY29uZmlnLmFkYXB0ZXIgfHwgZGVmYXVsdHMuYWRhcHRlcik7XG5cbiAgcmV0dXJuIGFkYXB0ZXIoY29uZmlnKS50aGVuKGZ1bmN0aW9uIG9uQWRhcHRlclJlc29sdXRpb24ocmVzcG9uc2UpIHtcbiAgICB0aHJvd0lmQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKGNvbmZpZyk7XG5cbiAgICAvLyBUcmFuc2Zvcm0gcmVzcG9uc2UgZGF0YVxuICAgIHJlc3BvbnNlLmRhdGEgPSB0cmFuc2Zvcm1EYXRhLmNhbGwoXG4gICAgICBjb25maWcsXG4gICAgICBjb25maWcudHJhbnNmb3JtUmVzcG9uc2UsXG4gICAgICByZXNwb25zZVxuICAgICk7XG5cbiAgICByZXNwb25zZS5oZWFkZXJzID0gQXhpb3NIZWFkZXJzLmZyb20ocmVzcG9uc2UuaGVhZGVycyk7XG5cbiAgICByZXR1cm4gcmVzcG9uc2U7XG4gIH0sIGZ1bmN0aW9uIG9uQWRhcHRlclJlamVjdGlvbihyZWFzb24pIHtcbiAgICBpZiAoIWlzQ2FuY2VsKHJlYXNvbikpIHtcbiAgICAgIHRocm93SWZDYW5jZWxsYXRpb25SZXF1ZXN0ZWQoY29uZmlnKTtcblxuICAgICAgLy8gVHJhbnNmb3JtIHJlc3BvbnNlIGRhdGFcbiAgICAgIGlmIChyZWFzb24gJiYgcmVhc29uLnJlc3BvbnNlKSB7XG4gICAgICAgIHJlYXNvbi5yZXNwb25zZS5kYXRhID0gdHJhbnNmb3JtRGF0YS5jYWxsKFxuICAgICAgICAgIGNvbmZpZyxcbiAgICAgICAgICBjb25maWcudHJhbnNmb3JtUmVzcG9uc2UsXG4gICAgICAgICAgcmVhc29uLnJlc3BvbnNlXG4gICAgICAgICk7XG4gICAgICAgIHJlYXNvbi5yZXNwb25zZS5oZWFkZXJzID0gQXhpb3NIZWFkZXJzLmZyb20ocmVhc29uLnJlc3BvbnNlLmhlYWRlcnMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBQcm9taXNlLnJlamVjdChyZWFzb24pO1xuICB9KTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IHV0aWxzIGZyb20gJy4uL3V0aWxzLmpzJztcbmltcG9ydCBBeGlvc0hlYWRlcnMgZnJvbSBcIi4vQXhpb3NIZWFkZXJzLmpzXCI7XG5cbmNvbnN0IGhlYWRlcnNUb09iamVjdCA9ICh0aGluZykgPT4gdGhpbmcgaW5zdGFuY2VvZiBBeGlvc0hlYWRlcnMgPyB0aGluZy50b0pTT04oKSA6IHRoaW5nO1xuXG4vKipcbiAqIENvbmZpZy1zcGVjaWZpYyBtZXJnZS1mdW5jdGlvbiB3aGljaCBjcmVhdGVzIGEgbmV3IGNvbmZpZy1vYmplY3RcbiAqIGJ5IG1lcmdpbmcgdHdvIGNvbmZpZ3VyYXRpb24gb2JqZWN0cyB0b2dldGhlci5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gY29uZmlnMVxuICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZzJcbiAqXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBOZXcgb2JqZWN0IHJlc3VsdGluZyBmcm9tIG1lcmdpbmcgY29uZmlnMiB0byBjb25maWcxXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG1lcmdlQ29uZmlnKGNvbmZpZzEsIGNvbmZpZzIpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gIGNvbmZpZzIgPSBjb25maWcyIHx8IHt9O1xuICBjb25zdCBjb25maWcgPSB7fTtcblxuICBmdW5jdGlvbiBnZXRNZXJnZWRWYWx1ZSh0YXJnZXQsIHNvdXJjZSwgY2FzZWxlc3MpIHtcbiAgICBpZiAodXRpbHMuaXNQbGFpbk9iamVjdCh0YXJnZXQpICYmIHV0aWxzLmlzUGxhaW5PYmplY3Qoc291cmNlKSkge1xuICAgICAgcmV0dXJuIHV0aWxzLm1lcmdlLmNhbGwoe2Nhc2VsZXNzfSwgdGFyZ2V0LCBzb3VyY2UpO1xuICAgIH0gZWxzZSBpZiAodXRpbHMuaXNQbGFpbk9iamVjdChzb3VyY2UpKSB7XG4gICAgICByZXR1cm4gdXRpbHMubWVyZ2Uoe30sIHNvdXJjZSk7XG4gICAgfSBlbHNlIGlmICh1dGlscy5pc0FycmF5KHNvdXJjZSkpIHtcbiAgICAgIHJldHVybiBzb3VyY2Uuc2xpY2UoKTtcbiAgICB9XG4gICAgcmV0dXJuIHNvdXJjZTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb25zaXN0ZW50LXJldHVyblxuICBmdW5jdGlvbiBtZXJnZURlZXBQcm9wZXJ0aWVzKGEsIGIsIGNhc2VsZXNzKSB7XG4gICAgaWYgKCF1dGlscy5pc1VuZGVmaW5lZChiKSkge1xuICAgICAgcmV0dXJuIGdldE1lcmdlZFZhbHVlKGEsIGIsIGNhc2VsZXNzKTtcbiAgICB9IGVsc2UgaWYgKCF1dGlscy5pc1VuZGVmaW5lZChhKSkge1xuICAgICAgcmV0dXJuIGdldE1lcmdlZFZhbHVlKHVuZGVmaW5lZCwgYSwgY2FzZWxlc3MpO1xuICAgIH1cbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb25zaXN0ZW50LXJldHVyblxuICBmdW5jdGlvbiB2YWx1ZUZyb21Db25maWcyKGEsIGIpIHtcbiAgICBpZiAoIXV0aWxzLmlzVW5kZWZpbmVkKGIpKSB7XG4gICAgICByZXR1cm4gZ2V0TWVyZ2VkVmFsdWUodW5kZWZpbmVkLCBiKTtcbiAgICB9XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29uc2lzdGVudC1yZXR1cm5cbiAgZnVuY3Rpb24gZGVmYXVsdFRvQ29uZmlnMihhLCBiKSB7XG4gICAgaWYgKCF1dGlscy5pc1VuZGVmaW5lZChiKSkge1xuICAgICAgcmV0dXJuIGdldE1lcmdlZFZhbHVlKHVuZGVmaW5lZCwgYik7XG4gICAgfSBlbHNlIGlmICghdXRpbHMuaXNVbmRlZmluZWQoYSkpIHtcbiAgICAgIHJldHVybiBnZXRNZXJnZWRWYWx1ZSh1bmRlZmluZWQsIGEpO1xuICAgIH1cbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb25zaXN0ZW50LXJldHVyblxuICBmdW5jdGlvbiBtZXJnZURpcmVjdEtleXMoYSwgYiwgcHJvcCkge1xuICAgIGlmIChwcm9wIGluIGNvbmZpZzIpIHtcbiAgICAgIHJldHVybiBnZXRNZXJnZWRWYWx1ZShhLCBiKTtcbiAgICB9IGVsc2UgaWYgKHByb3AgaW4gY29uZmlnMSkge1xuICAgICAgcmV0dXJuIGdldE1lcmdlZFZhbHVlKHVuZGVmaW5lZCwgYSk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgbWVyZ2VNYXAgPSB7XG4gICAgdXJsOiB2YWx1ZUZyb21Db25maWcyLFxuICAgIG1ldGhvZDogdmFsdWVGcm9tQ29uZmlnMixcbiAgICBkYXRhOiB2YWx1ZUZyb21Db25maWcyLFxuICAgIGJhc2VVUkw6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgdHJhbnNmb3JtUmVxdWVzdDogZGVmYXVsdFRvQ29uZmlnMixcbiAgICB0cmFuc2Zvcm1SZXNwb25zZTogZGVmYXVsdFRvQ29uZmlnMixcbiAgICBwYXJhbXNTZXJpYWxpemVyOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIHRpbWVvdXQ6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgdGltZW91dE1lc3NhZ2U6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgd2l0aENyZWRlbnRpYWxzOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIHdpdGhYU1JGVG9rZW46IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgYWRhcHRlcjogZGVmYXVsdFRvQ29uZmlnMixcbiAgICByZXNwb25zZVR5cGU6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgeHNyZkNvb2tpZU5hbWU6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgeHNyZkhlYWRlck5hbWU6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgb25VcGxvYWRQcm9ncmVzczogZGVmYXVsdFRvQ29uZmlnMixcbiAgICBvbkRvd25sb2FkUHJvZ3Jlc3M6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgZGVjb21wcmVzczogZGVmYXVsdFRvQ29uZmlnMixcbiAgICBtYXhDb250ZW50TGVuZ3RoOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIG1heEJvZHlMZW5ndGg6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgYmVmb3JlUmVkaXJlY3Q6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgdHJhbnNwb3J0OiBkZWZhdWx0VG9Db25maWcyLFxuICAgIGh0dHBBZ2VudDogZGVmYXVsdFRvQ29uZmlnMixcbiAgICBodHRwc0FnZW50OiBkZWZhdWx0VG9Db25maWcyLFxuICAgIGNhbmNlbFRva2VuOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIHNvY2tldFBhdGg6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgcmVzcG9uc2VFbmNvZGluZzogZGVmYXVsdFRvQ29uZmlnMixcbiAgICB2YWxpZGF0ZVN0YXR1czogbWVyZ2VEaXJlY3RLZXlzLFxuICAgIGhlYWRlcnM6IChhLCBiKSA9PiBtZXJnZURlZXBQcm9wZXJ0aWVzKGhlYWRlcnNUb09iamVjdChhKSwgaGVhZGVyc1RvT2JqZWN0KGIpLCB0cnVlKVxuICB9O1xuXG4gIHV0aWxzLmZvckVhY2goT2JqZWN0LmtleXMoT2JqZWN0LmFzc2lnbih7fSwgY29uZmlnMSwgY29uZmlnMikpLCBmdW5jdGlvbiBjb21wdXRlQ29uZmlnVmFsdWUocHJvcCkge1xuICAgIGNvbnN0IG1lcmdlID0gbWVyZ2VNYXBbcHJvcF0gfHwgbWVyZ2VEZWVwUHJvcGVydGllcztcbiAgICBjb25zdCBjb25maWdWYWx1ZSA9IG1lcmdlKGNvbmZpZzFbcHJvcF0sIGNvbmZpZzJbcHJvcF0sIHByb3ApO1xuICAgICh1dGlscy5pc1VuZGVmaW5lZChjb25maWdWYWx1ZSkgJiYgbWVyZ2UgIT09IG1lcmdlRGlyZWN0S2V5cykgfHwgKGNvbmZpZ1twcm9wXSA9IGNvbmZpZ1ZhbHVlKTtcbiAgfSk7XG5cbiAgcmV0dXJuIGNvbmZpZztcbn1cbiIsImV4cG9ydCBjb25zdCBWRVJTSU9OID0gXCIxLjYuN1wiOyIsIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IHtWRVJTSU9OfSBmcm9tICcuLi9lbnYvZGF0YS5qcyc7XG5pbXBvcnQgQXhpb3NFcnJvciBmcm9tICcuLi9jb3JlL0F4aW9zRXJyb3IuanMnO1xuXG5jb25zdCB2YWxpZGF0b3JzID0ge307XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBmdW5jLW5hbWVzXG5bJ29iamVjdCcsICdib29sZWFuJywgJ251bWJlcicsICdmdW5jdGlvbicsICdzdHJpbmcnLCAnc3ltYm9sJ10uZm9yRWFjaCgodHlwZSwgaSkgPT4ge1xuICB2YWxpZGF0b3JzW3R5cGVdID0gZnVuY3Rpb24gdmFsaWRhdG9yKHRoaW5nKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB0aGluZyA9PT0gdHlwZSB8fCAnYScgKyAoaSA8IDEgPyAnbiAnIDogJyAnKSArIHR5cGU7XG4gIH07XG59KTtcblxuY29uc3QgZGVwcmVjYXRlZFdhcm5pbmdzID0ge307XG5cbi8qKlxuICogVHJhbnNpdGlvbmFsIG9wdGlvbiB2YWxpZGF0b3JcbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufGJvb2xlYW4/fSB2YWxpZGF0b3IgLSBzZXQgdG8gZmFsc2UgaWYgdGhlIHRyYW5zaXRpb25hbCBvcHRpb24gaGFzIGJlZW4gcmVtb3ZlZFxuICogQHBhcmFtIHtzdHJpbmc/fSB2ZXJzaW9uIC0gZGVwcmVjYXRlZCB2ZXJzaW9uIC8gcmVtb3ZlZCBzaW5jZSB2ZXJzaW9uXG4gKiBAcGFyYW0ge3N0cmluZz99IG1lc3NhZ2UgLSBzb21lIG1lc3NhZ2Ugd2l0aCBhZGRpdGlvbmFsIGluZm9cbiAqXG4gKiBAcmV0dXJucyB7ZnVuY3Rpb259XG4gKi9cbnZhbGlkYXRvcnMudHJhbnNpdGlvbmFsID0gZnVuY3Rpb24gdHJhbnNpdGlvbmFsKHZhbGlkYXRvciwgdmVyc2lvbiwgbWVzc2FnZSkge1xuICBmdW5jdGlvbiBmb3JtYXRNZXNzYWdlKG9wdCwgZGVzYykge1xuICAgIHJldHVybiAnW0F4aW9zIHYnICsgVkVSU0lPTiArICddIFRyYW5zaXRpb25hbCBvcHRpb24gXFwnJyArIG9wdCArICdcXCcnICsgZGVzYyArIChtZXNzYWdlID8gJy4gJyArIG1lc3NhZ2UgOiAnJyk7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZnVuYy1uYW1lc1xuICByZXR1cm4gKHZhbHVlLCBvcHQsIG9wdHMpID0+IHtcbiAgICBpZiAodmFsaWRhdG9yID09PSBmYWxzZSkge1xuICAgICAgdGhyb3cgbmV3IEF4aW9zRXJyb3IoXG4gICAgICAgIGZvcm1hdE1lc3NhZ2Uob3B0LCAnIGhhcyBiZWVuIHJlbW92ZWQnICsgKHZlcnNpb24gPyAnIGluICcgKyB2ZXJzaW9uIDogJycpKSxcbiAgICAgICAgQXhpb3NFcnJvci5FUlJfREVQUkVDQVRFRFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAodmVyc2lvbiAmJiAhZGVwcmVjYXRlZFdhcm5pbmdzW29wdF0pIHtcbiAgICAgIGRlcHJlY2F0ZWRXYXJuaW5nc1tvcHRdID0gdHJ1ZTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGZvcm1hdE1lc3NhZ2UoXG4gICAgICAgICAgb3B0LFxuICAgICAgICAgICcgaGFzIGJlZW4gZGVwcmVjYXRlZCBzaW5jZSB2JyArIHZlcnNpb24gKyAnIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5lYXIgZnV0dXJlJ1xuICAgICAgICApXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiB2YWxpZGF0b3IgPyB2YWxpZGF0b3IodmFsdWUsIG9wdCwgb3B0cykgOiB0cnVlO1xuICB9O1xufTtcblxuLyoqXG4gKiBBc3NlcnQgb2JqZWN0J3MgcHJvcGVydGllcyB0eXBlXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAqIEBwYXJhbSB7b2JqZWN0fSBzY2hlbWFcbiAqIEBwYXJhbSB7Ym9vbGVhbj99IGFsbG93VW5rbm93blxuICpcbiAqIEByZXR1cm5zIHtvYmplY3R9XG4gKi9cblxuZnVuY3Rpb24gYXNzZXJ0T3B0aW9ucyhvcHRpb25zLCBzY2hlbWEsIGFsbG93VW5rbm93bikge1xuICBpZiAodHlwZW9mIG9wdGlvbnMgIT09ICdvYmplY3QnKSB7XG4gICAgdGhyb3cgbmV3IEF4aW9zRXJyb3IoJ29wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QnLCBBeGlvc0Vycm9yLkVSUl9CQURfT1BUSU9OX1ZBTFVFKTtcbiAgfVxuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMob3B0aW9ucyk7XG4gIGxldCBpID0ga2V5cy5sZW5ndGg7XG4gIHdoaWxlIChpLS0gPiAwKSB7XG4gICAgY29uc3Qgb3B0ID0ga2V5c1tpXTtcbiAgICBjb25zdCB2YWxpZGF0b3IgPSBzY2hlbWFbb3B0XTtcbiAgICBpZiAodmFsaWRhdG9yKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IG9wdGlvbnNbb3B0XTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsaWRhdG9yKHZhbHVlLCBvcHQsIG9wdGlvbnMpO1xuICAgICAgaWYgKHJlc3VsdCAhPT0gdHJ1ZSkge1xuICAgICAgICB0aHJvdyBuZXcgQXhpb3NFcnJvcignb3B0aW9uICcgKyBvcHQgKyAnIG11c3QgYmUgJyArIHJlc3VsdCwgQXhpb3NFcnJvci5FUlJfQkFEX09QVElPTl9WQUxVRSk7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGFsbG93VW5rbm93biAhPT0gdHJ1ZSkge1xuICAgICAgdGhyb3cgbmV3IEF4aW9zRXJyb3IoJ1Vua25vd24gb3B0aW9uICcgKyBvcHQsIEF4aW9zRXJyb3IuRVJSX0JBRF9PUFRJT04pO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGFzc2VydE9wdGlvbnMsXG4gIHZhbGlkYXRvcnNcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCB1dGlscyBmcm9tICcuLy4uL3V0aWxzLmpzJztcbmltcG9ydCBidWlsZFVSTCBmcm9tICcuLi9oZWxwZXJzL2J1aWxkVVJMLmpzJztcbmltcG9ydCBJbnRlcmNlcHRvck1hbmFnZXIgZnJvbSAnLi9JbnRlcmNlcHRvck1hbmFnZXIuanMnO1xuaW1wb3J0IGRpc3BhdGNoUmVxdWVzdCBmcm9tICcuL2Rpc3BhdGNoUmVxdWVzdC5qcyc7XG5pbXBvcnQgbWVyZ2VDb25maWcgZnJvbSAnLi9tZXJnZUNvbmZpZy5qcyc7XG5pbXBvcnQgYnVpbGRGdWxsUGF0aCBmcm9tICcuL2J1aWxkRnVsbFBhdGguanMnO1xuaW1wb3J0IHZhbGlkYXRvciBmcm9tICcuLi9oZWxwZXJzL3ZhbGlkYXRvci5qcyc7XG5pbXBvcnQgQXhpb3NIZWFkZXJzIGZyb20gJy4vQXhpb3NIZWFkZXJzLmpzJztcblxuY29uc3QgdmFsaWRhdG9ycyA9IHZhbGlkYXRvci52YWxpZGF0b3JzO1xuXG4vKipcbiAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBBeGlvc1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBpbnN0YW5jZUNvbmZpZyBUaGUgZGVmYXVsdCBjb25maWcgZm9yIHRoZSBpbnN0YW5jZVxuICpcbiAqIEByZXR1cm4ge0F4aW9zfSBBIG5ldyBpbnN0YW5jZSBvZiBBeGlvc1xuICovXG5jbGFzcyBBeGlvcyB7XG4gIGNvbnN0cnVjdG9yKGluc3RhbmNlQ29uZmlnKSB7XG4gICAgdGhpcy5kZWZhdWx0cyA9IGluc3RhbmNlQ29uZmlnO1xuICAgIHRoaXMuaW50ZXJjZXB0b3JzID0ge1xuICAgICAgcmVxdWVzdDogbmV3IEludGVyY2VwdG9yTWFuYWdlcigpLFxuICAgICAgcmVzcG9uc2U6IG5ldyBJbnRlcmNlcHRvck1hbmFnZXIoKVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRGlzcGF0Y2ggYSByZXF1ZXN0XG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfE9iamVjdH0gY29uZmlnT3JVcmwgVGhlIGNvbmZpZyBzcGVjaWZpYyBmb3IgdGhpcyByZXF1ZXN0IChtZXJnZWQgd2l0aCB0aGlzLmRlZmF1bHRzKVxuICAgKiBAcGFyYW0gez9PYmplY3R9IGNvbmZpZ1xuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gVGhlIFByb21pc2UgdG8gYmUgZnVsZmlsbGVkXG4gICAqL1xuICBhc3luYyByZXF1ZXN0KGNvbmZpZ09yVXJsLCBjb25maWcpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX3JlcXVlc3QoY29uZmlnT3JVcmwsIGNvbmZpZyk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAoZXJyIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgbGV0IGR1bW15O1xuXG4gICAgICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlID8gRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UoZHVtbXkgPSB7fSkgOiAoZHVtbXkgPSBuZXcgRXJyb3IoKSk7XG5cbiAgICAgICAgLy8gc2xpY2Ugb2ZmIHRoZSBFcnJvcjogLi4uIGxpbmVcbiAgICAgICAgY29uc3Qgc3RhY2sgPSBkdW1teS5zdGFjayA/IGR1bW15LnN0YWNrLnJlcGxhY2UoL14uK1xcbi8sICcnKSA6ICcnO1xuXG4gICAgICAgIGlmICghZXJyLnN0YWNrKSB7XG4gICAgICAgICAgZXJyLnN0YWNrID0gc3RhY2s7XG4gICAgICAgICAgLy8gbWF0Y2ggd2l0aG91dCB0aGUgMiB0b3Agc3RhY2sgbGluZXNcbiAgICAgICAgfSBlbHNlIGlmIChzdGFjayAmJiAhU3RyaW5nKGVyci5zdGFjaykuZW5kc1dpdGgoc3RhY2sucmVwbGFjZSgvXi4rXFxuLitcXG4vLCAnJykpKSB7XG4gICAgICAgICAgZXJyLnN0YWNrICs9ICdcXG4nICsgc3RhY2tcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICB9XG5cbiAgX3JlcXVlc3QoY29uZmlnT3JVcmwsIGNvbmZpZykge1xuICAgIC8qZXNsaW50IG5vLXBhcmFtLXJlYXNzaWduOjAqL1xuICAgIC8vIEFsbG93IGZvciBheGlvcygnZXhhbXBsZS91cmwnWywgY29uZmlnXSkgYSBsYSBmZXRjaCBBUElcbiAgICBpZiAodHlwZW9mIGNvbmZpZ09yVXJsID09PSAnc3RyaW5nJykge1xuICAgICAgY29uZmlnID0gY29uZmlnIHx8IHt9O1xuICAgICAgY29uZmlnLnVybCA9IGNvbmZpZ09yVXJsO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25maWcgPSBjb25maWdPclVybCB8fCB7fTtcbiAgICB9XG5cbiAgICBjb25maWcgPSBtZXJnZUNvbmZpZyh0aGlzLmRlZmF1bHRzLCBjb25maWcpO1xuXG4gICAgY29uc3Qge3RyYW5zaXRpb25hbCwgcGFyYW1zU2VyaWFsaXplciwgaGVhZGVyc30gPSBjb25maWc7XG5cbiAgICBpZiAodHJhbnNpdGlvbmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhbGlkYXRvci5hc3NlcnRPcHRpb25zKHRyYW5zaXRpb25hbCwge1xuICAgICAgICBzaWxlbnRKU09OUGFyc2luZzogdmFsaWRhdG9ycy50cmFuc2l0aW9uYWwodmFsaWRhdG9ycy5ib29sZWFuKSxcbiAgICAgICAgZm9yY2VkSlNPTlBhcnNpbmc6IHZhbGlkYXRvcnMudHJhbnNpdGlvbmFsKHZhbGlkYXRvcnMuYm9vbGVhbiksXG4gICAgICAgIGNsYXJpZnlUaW1lb3V0RXJyb3I6IHZhbGlkYXRvcnMudHJhbnNpdGlvbmFsKHZhbGlkYXRvcnMuYm9vbGVhbilcbiAgICAgIH0sIGZhbHNlKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zU2VyaWFsaXplciAhPSBudWxsKSB7XG4gICAgICBpZiAodXRpbHMuaXNGdW5jdGlvbihwYXJhbXNTZXJpYWxpemVyKSkge1xuICAgICAgICBjb25maWcucGFyYW1zU2VyaWFsaXplciA9IHtcbiAgICAgICAgICBzZXJpYWxpemU6IHBhcmFtc1NlcmlhbGl6ZXJcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsaWRhdG9yLmFzc2VydE9wdGlvbnMocGFyYW1zU2VyaWFsaXplciwge1xuICAgICAgICAgIGVuY29kZTogdmFsaWRhdG9ycy5mdW5jdGlvbixcbiAgICAgICAgICBzZXJpYWxpemU6IHZhbGlkYXRvcnMuZnVuY3Rpb25cbiAgICAgICAgfSwgdHJ1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gU2V0IGNvbmZpZy5tZXRob2RcbiAgICBjb25maWcubWV0aG9kID0gKGNvbmZpZy5tZXRob2QgfHwgdGhpcy5kZWZhdWx0cy5tZXRob2QgfHwgJ2dldCcpLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAvLyBGbGF0dGVuIGhlYWRlcnNcbiAgICBsZXQgY29udGV4dEhlYWRlcnMgPSBoZWFkZXJzICYmIHV0aWxzLm1lcmdlKFxuICAgICAgaGVhZGVycy5jb21tb24sXG4gICAgICBoZWFkZXJzW2NvbmZpZy5tZXRob2RdXG4gICAgKTtcblxuICAgIGhlYWRlcnMgJiYgdXRpbHMuZm9yRWFjaChcbiAgICAgIFsnZGVsZXRlJywgJ2dldCcsICdoZWFkJywgJ3Bvc3QnLCAncHV0JywgJ3BhdGNoJywgJ2NvbW1vbiddLFxuICAgICAgKG1ldGhvZCkgPT4ge1xuICAgICAgICBkZWxldGUgaGVhZGVyc1ttZXRob2RdO1xuICAgICAgfVxuICAgICk7XG5cbiAgICBjb25maWcuaGVhZGVycyA9IEF4aW9zSGVhZGVycy5jb25jYXQoY29udGV4dEhlYWRlcnMsIGhlYWRlcnMpO1xuXG4gICAgLy8gZmlsdGVyIG91dCBza2lwcGVkIGludGVyY2VwdG9yc1xuICAgIGNvbnN0IHJlcXVlc3RJbnRlcmNlcHRvckNoYWluID0gW107XG4gICAgbGV0IHN5bmNocm9ub3VzUmVxdWVzdEludGVyY2VwdG9ycyA9IHRydWU7XG4gICAgdGhpcy5pbnRlcmNlcHRvcnMucmVxdWVzdC5mb3JFYWNoKGZ1bmN0aW9uIHVuc2hpZnRSZXF1ZXN0SW50ZXJjZXB0b3JzKGludGVyY2VwdG9yKSB7XG4gICAgICBpZiAodHlwZW9mIGludGVyY2VwdG9yLnJ1bldoZW4gPT09ICdmdW5jdGlvbicgJiYgaW50ZXJjZXB0b3IucnVuV2hlbihjb25maWcpID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHN5bmNocm9ub3VzUmVxdWVzdEludGVyY2VwdG9ycyA9IHN5bmNocm9ub3VzUmVxdWVzdEludGVyY2VwdG9ycyAmJiBpbnRlcmNlcHRvci5zeW5jaHJvbm91cztcblxuICAgICAgcmVxdWVzdEludGVyY2VwdG9yQ2hhaW4udW5zaGlmdChpbnRlcmNlcHRvci5mdWxmaWxsZWQsIGludGVyY2VwdG9yLnJlamVjdGVkKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHJlc3BvbnNlSW50ZXJjZXB0b3JDaGFpbiA9IFtdO1xuICAgIHRoaXMuaW50ZXJjZXB0b3JzLnJlc3BvbnNlLmZvckVhY2goZnVuY3Rpb24gcHVzaFJlc3BvbnNlSW50ZXJjZXB0b3JzKGludGVyY2VwdG9yKSB7XG4gICAgICByZXNwb25zZUludGVyY2VwdG9yQ2hhaW4ucHVzaChpbnRlcmNlcHRvci5mdWxmaWxsZWQsIGludGVyY2VwdG9yLnJlamVjdGVkKTtcbiAgICB9KTtcblxuICAgIGxldCBwcm9taXNlO1xuICAgIGxldCBpID0gMDtcbiAgICBsZXQgbGVuO1xuXG4gICAgaWYgKCFzeW5jaHJvbm91c1JlcXVlc3RJbnRlcmNlcHRvcnMpIHtcbiAgICAgIGNvbnN0IGNoYWluID0gW2Rpc3BhdGNoUmVxdWVzdC5iaW5kKHRoaXMpLCB1bmRlZmluZWRdO1xuICAgICAgY2hhaW4udW5zaGlmdC5hcHBseShjaGFpbiwgcmVxdWVzdEludGVyY2VwdG9yQ2hhaW4pO1xuICAgICAgY2hhaW4ucHVzaC5hcHBseShjaGFpbiwgcmVzcG9uc2VJbnRlcmNlcHRvckNoYWluKTtcbiAgICAgIGxlbiA9IGNoYWluLmxlbmd0aDtcblxuICAgICAgcHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZShjb25maWcpO1xuXG4gICAgICB3aGlsZSAoaSA8IGxlbikge1xuICAgICAgICBwcm9taXNlID0gcHJvbWlzZS50aGVuKGNoYWluW2krK10sIGNoYWluW2krK10pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICB9XG5cbiAgICBsZW4gPSByZXF1ZXN0SW50ZXJjZXB0b3JDaGFpbi5sZW5ndGg7XG5cbiAgICBsZXQgbmV3Q29uZmlnID0gY29uZmlnO1xuXG4gICAgaSA9IDA7XG5cbiAgICB3aGlsZSAoaSA8IGxlbikge1xuICAgICAgY29uc3Qgb25GdWxmaWxsZWQgPSByZXF1ZXN0SW50ZXJjZXB0b3JDaGFpbltpKytdO1xuICAgICAgY29uc3Qgb25SZWplY3RlZCA9IHJlcXVlc3RJbnRlcmNlcHRvckNoYWluW2krK107XG4gICAgICB0cnkge1xuICAgICAgICBuZXdDb25maWcgPSBvbkZ1bGZpbGxlZChuZXdDb25maWcpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgb25SZWplY3RlZC5jYWxsKHRoaXMsIGVycm9yKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHByb21pc2UgPSBkaXNwYXRjaFJlcXVlc3QuY2FsbCh0aGlzLCBuZXdDb25maWcpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgIH1cblxuICAgIGkgPSAwO1xuICAgIGxlbiA9IHJlc3BvbnNlSW50ZXJjZXB0b3JDaGFpbi5sZW5ndGg7XG5cbiAgICB3aGlsZSAoaSA8IGxlbikge1xuICAgICAgcHJvbWlzZSA9IHByb21pc2UudGhlbihyZXNwb25zZUludGVyY2VwdG9yQ2hhaW5baSsrXSwgcmVzcG9uc2VJbnRlcmNlcHRvckNoYWluW2krK10pO1xuICAgIH1cblxuICAgIHJldHVybiBwcm9taXNlO1xuICB9XG5cbiAgZ2V0VXJpKGNvbmZpZykge1xuICAgIGNvbmZpZyA9IG1lcmdlQ29uZmlnKHRoaXMuZGVmYXVsdHMsIGNvbmZpZyk7XG4gICAgY29uc3QgZnVsbFBhdGggPSBidWlsZEZ1bGxQYXRoKGNvbmZpZy5iYXNlVVJMLCBjb25maWcudXJsKTtcbiAgICByZXR1cm4gYnVpbGRVUkwoZnVsbFBhdGgsIGNvbmZpZy5wYXJhbXMsIGNvbmZpZy5wYXJhbXNTZXJpYWxpemVyKTtcbiAgfVxufVxuXG4vLyBQcm92aWRlIGFsaWFzZXMgZm9yIHN1cHBvcnRlZCByZXF1ZXN0IG1ldGhvZHNcbnV0aWxzLmZvckVhY2goWydkZWxldGUnLCAnZ2V0JywgJ2hlYWQnLCAnb3B0aW9ucyddLCBmdW5jdGlvbiBmb3JFYWNoTWV0aG9kTm9EYXRhKG1ldGhvZCkge1xuICAvKmVzbGludCBmdW5jLW5hbWVzOjAqL1xuICBBeGlvcy5wcm90b3R5cGVbbWV0aG9kXSA9IGZ1bmN0aW9uKHVybCwgY29uZmlnKSB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdChtZXJnZUNvbmZpZyhjb25maWcgfHwge30sIHtcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIGRhdGE6IChjb25maWcgfHwge30pLmRhdGFcbiAgICB9KSk7XG4gIH07XG59KTtcblxudXRpbHMuZm9yRWFjaChbJ3Bvc3QnLCAncHV0JywgJ3BhdGNoJ10sIGZ1bmN0aW9uIGZvckVhY2hNZXRob2RXaXRoRGF0YShtZXRob2QpIHtcbiAgLyplc2xpbnQgZnVuYy1uYW1lczowKi9cblxuICBmdW5jdGlvbiBnZW5lcmF0ZUhUVFBNZXRob2QoaXNGb3JtKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIGh0dHBNZXRob2QodXJsLCBkYXRhLCBjb25maWcpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlcXVlc3QobWVyZ2VDb25maWcoY29uZmlnIHx8IHt9LCB7XG4gICAgICAgIG1ldGhvZCxcbiAgICAgICAgaGVhZGVyczogaXNGb3JtID8ge1xuICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnbXVsdGlwYXJ0L2Zvcm0tZGF0YSdcbiAgICAgICAgfSA6IHt9LFxuICAgICAgICB1cmwsXG4gICAgICAgIGRhdGFcbiAgICAgIH0pKTtcbiAgICB9O1xuICB9XG5cbiAgQXhpb3MucHJvdG90eXBlW21ldGhvZF0gPSBnZW5lcmF0ZUhUVFBNZXRob2QoKTtcblxuICBBeGlvcy5wcm90b3R5cGVbbWV0aG9kICsgJ0Zvcm0nXSA9IGdlbmVyYXRlSFRUUE1ldGhvZCh0cnVlKTtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBBeGlvcztcbiIsIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IENhbmNlbGVkRXJyb3IgZnJvbSAnLi9DYW5jZWxlZEVycm9yLmpzJztcblxuLyoqXG4gKiBBIGBDYW5jZWxUb2tlbmAgaXMgYW4gb2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgdG8gcmVxdWVzdCBjYW5jZWxsYXRpb24gb2YgYW4gb3BlcmF0aW9uLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGV4ZWN1dG9yIFRoZSBleGVjdXRvciBmdW5jdGlvbi5cbiAqXG4gKiBAcmV0dXJucyB7Q2FuY2VsVG9rZW59XG4gKi9cbmNsYXNzIENhbmNlbFRva2VuIHtcbiAgY29uc3RydWN0b3IoZXhlY3V0b3IpIHtcbiAgICBpZiAodHlwZW9mIGV4ZWN1dG9yICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdleGVjdXRvciBtdXN0IGJlIGEgZnVuY3Rpb24uJyk7XG4gICAgfVxuXG4gICAgbGV0IHJlc29sdmVQcm9taXNlO1xuXG4gICAgdGhpcy5wcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24gcHJvbWlzZUV4ZWN1dG9yKHJlc29sdmUpIHtcbiAgICAgIHJlc29sdmVQcm9taXNlID0gcmVzb2x2ZTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHRva2VuID0gdGhpcztcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBmdW5jLW5hbWVzXG4gICAgdGhpcy5wcm9taXNlLnRoZW4oY2FuY2VsID0+IHtcbiAgICAgIGlmICghdG9rZW4uX2xpc3RlbmVycykgcmV0dXJuO1xuXG4gICAgICBsZXQgaSA9IHRva2VuLl9saXN0ZW5lcnMubGVuZ3RoO1xuXG4gICAgICB3aGlsZSAoaS0tID4gMCkge1xuICAgICAgICB0b2tlbi5fbGlzdGVuZXJzW2ldKGNhbmNlbCk7XG4gICAgICB9XG4gICAgICB0b2tlbi5fbGlzdGVuZXJzID0gbnVsbDtcbiAgICB9KTtcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBmdW5jLW5hbWVzXG4gICAgdGhpcy5wcm9taXNlLnRoZW4gPSBvbmZ1bGZpbGxlZCA9PiB7XG4gICAgICBsZXQgX3Jlc29sdmU7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZnVuYy1uYW1lc1xuICAgICAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgICB0b2tlbi5zdWJzY3JpYmUocmVzb2x2ZSk7XG4gICAgICAgIF9yZXNvbHZlID0gcmVzb2x2ZTtcbiAgICAgIH0pLnRoZW4ob25mdWxmaWxsZWQpO1xuXG4gICAgICBwcm9taXNlLmNhbmNlbCA9IGZ1bmN0aW9uIHJlamVjdCgpIHtcbiAgICAgICAgdG9rZW4udW5zdWJzY3JpYmUoX3Jlc29sdmUpO1xuICAgICAgfTtcblxuICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgfTtcblxuICAgIGV4ZWN1dG9yKGZ1bmN0aW9uIGNhbmNlbChtZXNzYWdlLCBjb25maWcsIHJlcXVlc3QpIHtcbiAgICAgIGlmICh0b2tlbi5yZWFzb24pIHtcbiAgICAgICAgLy8gQ2FuY2VsbGF0aW9uIGhhcyBhbHJlYWR5IGJlZW4gcmVxdWVzdGVkXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdG9rZW4ucmVhc29uID0gbmV3IENhbmNlbGVkRXJyb3IobWVzc2FnZSwgY29uZmlnLCByZXF1ZXN0KTtcbiAgICAgIHJlc29sdmVQcm9taXNlKHRva2VuLnJlYXNvbik7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVGhyb3dzIGEgYENhbmNlbGVkRXJyb3JgIGlmIGNhbmNlbGxhdGlvbiBoYXMgYmVlbiByZXF1ZXN0ZWQuXG4gICAqL1xuICB0aHJvd0lmUmVxdWVzdGVkKCkge1xuICAgIGlmICh0aGlzLnJlYXNvbikge1xuICAgICAgdGhyb3cgdGhpcy5yZWFzb247XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFN1YnNjcmliZSB0byB0aGUgY2FuY2VsIHNpZ25hbFxuICAgKi9cblxuICBzdWJzY3JpYmUobGlzdGVuZXIpIHtcbiAgICBpZiAodGhpcy5yZWFzb24pIHtcbiAgICAgIGxpc3RlbmVyKHRoaXMucmVhc29uKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fbGlzdGVuZXJzKSB7XG4gICAgICB0aGlzLl9saXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2xpc3RlbmVycyA9IFtsaXN0ZW5lcl07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVuc3Vic2NyaWJlIGZyb20gdGhlIGNhbmNlbCBzaWduYWxcbiAgICovXG5cbiAgdW5zdWJzY3JpYmUobGlzdGVuZXIpIHtcbiAgICBpZiAoIXRoaXMuX2xpc3RlbmVycykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpbmRleCA9IHRoaXMuX2xpc3RlbmVycy5pbmRleE9mKGxpc3RlbmVyKTtcbiAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICB0aGlzLl9saXN0ZW5lcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBvYmplY3QgdGhhdCBjb250YWlucyBhIG5ldyBgQ2FuY2VsVG9rZW5gIGFuZCBhIGZ1bmN0aW9uIHRoYXQsIHdoZW4gY2FsbGVkLFxuICAgKiBjYW5jZWxzIHRoZSBgQ2FuY2VsVG9rZW5gLlxuICAgKi9cbiAgc3RhdGljIHNvdXJjZSgpIHtcbiAgICBsZXQgY2FuY2VsO1xuICAgIGNvbnN0IHRva2VuID0gbmV3IENhbmNlbFRva2VuKGZ1bmN0aW9uIGV4ZWN1dG9yKGMpIHtcbiAgICAgIGNhbmNlbCA9IGM7XG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRva2VuLFxuICAgICAgY2FuY2VsXG4gICAgfTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBDYW5jZWxUb2tlbjtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBTeW50YWN0aWMgc3VnYXIgZm9yIGludm9raW5nIGEgZnVuY3Rpb24gYW5kIGV4cGFuZGluZyBhbiBhcnJheSBmb3IgYXJndW1lbnRzLlxuICpcbiAqIENvbW1vbiB1c2UgY2FzZSB3b3VsZCBiZSB0byB1c2UgYEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseWAuXG4gKlxuICogIGBgYGpzXG4gKiAgZnVuY3Rpb24gZih4LCB5LCB6KSB7fVxuICogIHZhciBhcmdzID0gWzEsIDIsIDNdO1xuICogIGYuYXBwbHkobnVsbCwgYXJncyk7XG4gKiAgYGBgXG4gKlxuICogV2l0aCBgc3ByZWFkYCB0aGlzIGV4YW1wbGUgY2FuIGJlIHJlLXdyaXR0ZW4uXG4gKlxuICogIGBgYGpzXG4gKiAgc3ByZWFkKGZ1bmN0aW9uKHgsIHksIHopIHt9KShbMSwgMiwgM10pO1xuICogIGBgYFxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gKlxuICogQHJldHVybnMge0Z1bmN0aW9ufVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzcHJlYWQoY2FsbGJhY2spIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHdyYXAoYXJyKSB7XG4gICAgcmV0dXJuIGNhbGxiYWNrLmFwcGx5KG51bGwsIGFycik7XG4gIH07XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCB1dGlscyBmcm9tICcuLy4uL3V0aWxzLmpzJztcblxuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHBheWxvYWQgaXMgYW4gZXJyb3IgdGhyb3duIGJ5IEF4aW9zXG4gKlxuICogQHBhcmFtIHsqfSBwYXlsb2FkIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIHBheWxvYWQgaXMgYW4gZXJyb3IgdGhyb3duIGJ5IEF4aW9zLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNBeGlvc0Vycm9yKHBheWxvYWQpIHtcbiAgcmV0dXJuIHV0aWxzLmlzT2JqZWN0KHBheWxvYWQpICYmIChwYXlsb2FkLmlzQXhpb3NFcnJvciA9PT0gdHJ1ZSk7XG59XG4iLCJjb25zdCBIdHRwU3RhdHVzQ29kZSA9IHtcbiAgQ29udGludWU6IDEwMCxcbiAgU3dpdGNoaW5nUHJvdG9jb2xzOiAxMDEsXG4gIFByb2Nlc3Npbmc6IDEwMixcbiAgRWFybHlIaW50czogMTAzLFxuICBPazogMjAwLFxuICBDcmVhdGVkOiAyMDEsXG4gIEFjY2VwdGVkOiAyMDIsXG4gIE5vbkF1dGhvcml0YXRpdmVJbmZvcm1hdGlvbjogMjAzLFxuICBOb0NvbnRlbnQ6IDIwNCxcbiAgUmVzZXRDb250ZW50OiAyMDUsXG4gIFBhcnRpYWxDb250ZW50OiAyMDYsXG4gIE11bHRpU3RhdHVzOiAyMDcsXG4gIEFscmVhZHlSZXBvcnRlZDogMjA4LFxuICBJbVVzZWQ6IDIyNixcbiAgTXVsdGlwbGVDaG9pY2VzOiAzMDAsXG4gIE1vdmVkUGVybWFuZW50bHk6IDMwMSxcbiAgRm91bmQ6IDMwMixcbiAgU2VlT3RoZXI6IDMwMyxcbiAgTm90TW9kaWZpZWQ6IDMwNCxcbiAgVXNlUHJveHk6IDMwNSxcbiAgVW51c2VkOiAzMDYsXG4gIFRlbXBvcmFyeVJlZGlyZWN0OiAzMDcsXG4gIFBlcm1hbmVudFJlZGlyZWN0OiAzMDgsXG4gIEJhZFJlcXVlc3Q6IDQwMCxcbiAgVW5hdXRob3JpemVkOiA0MDEsXG4gIFBheW1lbnRSZXF1aXJlZDogNDAyLFxuICBGb3JiaWRkZW46IDQwMyxcbiAgTm90Rm91bmQ6IDQwNCxcbiAgTWV0aG9kTm90QWxsb3dlZDogNDA1LFxuICBOb3RBY2NlcHRhYmxlOiA0MDYsXG4gIFByb3h5QXV0aGVudGljYXRpb25SZXF1aXJlZDogNDA3LFxuICBSZXF1ZXN0VGltZW91dDogNDA4LFxuICBDb25mbGljdDogNDA5LFxuICBHb25lOiA0MTAsXG4gIExlbmd0aFJlcXVpcmVkOiA0MTEsXG4gIFByZWNvbmRpdGlvbkZhaWxlZDogNDEyLFxuICBQYXlsb2FkVG9vTGFyZ2U6IDQxMyxcbiAgVXJpVG9vTG9uZzogNDE0LFxuICBVbnN1cHBvcnRlZE1lZGlhVHlwZTogNDE1LFxuICBSYW5nZU5vdFNhdGlzZmlhYmxlOiA0MTYsXG4gIEV4cGVjdGF0aW9uRmFpbGVkOiA0MTcsXG4gIEltQVRlYXBvdDogNDE4LFxuICBNaXNkaXJlY3RlZFJlcXVlc3Q6IDQyMSxcbiAgVW5wcm9jZXNzYWJsZUVudGl0eTogNDIyLFxuICBMb2NrZWQ6IDQyMyxcbiAgRmFpbGVkRGVwZW5kZW5jeTogNDI0LFxuICBUb29FYXJseTogNDI1LFxuICBVcGdyYWRlUmVxdWlyZWQ6IDQyNixcbiAgUHJlY29uZGl0aW9uUmVxdWlyZWQ6IDQyOCxcbiAgVG9vTWFueVJlcXVlc3RzOiA0MjksXG4gIFJlcXVlc3RIZWFkZXJGaWVsZHNUb29MYXJnZTogNDMxLFxuICBVbmF2YWlsYWJsZUZvckxlZ2FsUmVhc29uczogNDUxLFxuICBJbnRlcm5hbFNlcnZlckVycm9yOiA1MDAsXG4gIE5vdEltcGxlbWVudGVkOiA1MDEsXG4gIEJhZEdhdGV3YXk6IDUwMixcbiAgU2VydmljZVVuYXZhaWxhYmxlOiA1MDMsXG4gIEdhdGV3YXlUaW1lb3V0OiA1MDQsXG4gIEh0dHBWZXJzaW9uTm90U3VwcG9ydGVkOiA1MDUsXG4gIFZhcmlhbnRBbHNvTmVnb3RpYXRlczogNTA2LFxuICBJbnN1ZmZpY2llbnRTdG9yYWdlOiA1MDcsXG4gIExvb3BEZXRlY3RlZDogNTA4LFxuICBOb3RFeHRlbmRlZDogNTEwLFxuICBOZXR3b3JrQXV0aGVudGljYXRpb25SZXF1aXJlZDogNTExLFxufTtcblxuT2JqZWN0LmVudHJpZXMoSHR0cFN0YXR1c0NvZGUpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICBIdHRwU3RhdHVzQ29kZVt2YWx1ZV0gPSBrZXk7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgSHR0cFN0YXR1c0NvZGU7XG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCB1dGlscyBmcm9tICcuL3V0aWxzLmpzJztcbmltcG9ydCBiaW5kIGZyb20gJy4vaGVscGVycy9iaW5kLmpzJztcbmltcG9ydCBBeGlvcyBmcm9tICcuL2NvcmUvQXhpb3MuanMnO1xuaW1wb3J0IG1lcmdlQ29uZmlnIGZyb20gJy4vY29yZS9tZXJnZUNvbmZpZy5qcyc7XG5pbXBvcnQgZGVmYXVsdHMgZnJvbSAnLi9kZWZhdWx0cy9pbmRleC5qcyc7XG5pbXBvcnQgZm9ybURhdGFUb0pTT04gZnJvbSAnLi9oZWxwZXJzL2Zvcm1EYXRhVG9KU09OLmpzJztcbmltcG9ydCBDYW5jZWxlZEVycm9yIGZyb20gJy4vY2FuY2VsL0NhbmNlbGVkRXJyb3IuanMnO1xuaW1wb3J0IENhbmNlbFRva2VuIGZyb20gJy4vY2FuY2VsL0NhbmNlbFRva2VuLmpzJztcbmltcG9ydCBpc0NhbmNlbCBmcm9tICcuL2NhbmNlbC9pc0NhbmNlbC5qcyc7XG5pbXBvcnQge1ZFUlNJT059IGZyb20gJy4vZW52L2RhdGEuanMnO1xuaW1wb3J0IHRvRm9ybURhdGEgZnJvbSAnLi9oZWxwZXJzL3RvRm9ybURhdGEuanMnO1xuaW1wb3J0IEF4aW9zRXJyb3IgZnJvbSAnLi9jb3JlL0F4aW9zRXJyb3IuanMnO1xuaW1wb3J0IHNwcmVhZCBmcm9tICcuL2hlbHBlcnMvc3ByZWFkLmpzJztcbmltcG9ydCBpc0F4aW9zRXJyb3IgZnJvbSAnLi9oZWxwZXJzL2lzQXhpb3NFcnJvci5qcyc7XG5pbXBvcnQgQXhpb3NIZWFkZXJzIGZyb20gXCIuL2NvcmUvQXhpb3NIZWFkZXJzLmpzXCI7XG5pbXBvcnQgYWRhcHRlcnMgZnJvbSAnLi9hZGFwdGVycy9hZGFwdGVycy5qcyc7XG5pbXBvcnQgSHR0cFN0YXR1c0NvZGUgZnJvbSAnLi9oZWxwZXJzL0h0dHBTdGF0dXNDb2RlLmpzJztcblxuLyoqXG4gKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgQXhpb3NcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gZGVmYXVsdENvbmZpZyBUaGUgZGVmYXVsdCBjb25maWcgZm9yIHRoZSBpbnN0YW5jZVxuICpcbiAqIEByZXR1cm5zIHtBeGlvc30gQSBuZXcgaW5zdGFuY2Ugb2YgQXhpb3NcbiAqL1xuZnVuY3Rpb24gY3JlYXRlSW5zdGFuY2UoZGVmYXVsdENvbmZpZykge1xuICBjb25zdCBjb250ZXh0ID0gbmV3IEF4aW9zKGRlZmF1bHRDb25maWcpO1xuICBjb25zdCBpbnN0YW5jZSA9IGJpbmQoQXhpb3MucHJvdG90eXBlLnJlcXVlc3QsIGNvbnRleHQpO1xuXG4gIC8vIENvcHkgYXhpb3MucHJvdG90eXBlIHRvIGluc3RhbmNlXG4gIHV0aWxzLmV4dGVuZChpbnN0YW5jZSwgQXhpb3MucHJvdG90eXBlLCBjb250ZXh0LCB7YWxsT3duS2V5czogdHJ1ZX0pO1xuXG4gIC8vIENvcHkgY29udGV4dCB0byBpbnN0YW5jZVxuICB1dGlscy5leHRlbmQoaW5zdGFuY2UsIGNvbnRleHQsIG51bGwsIHthbGxPd25LZXlzOiB0cnVlfSk7XG5cbiAgLy8gRmFjdG9yeSBmb3IgY3JlYXRpbmcgbmV3IGluc3RhbmNlc1xuICBpbnN0YW5jZS5jcmVhdGUgPSBmdW5jdGlvbiBjcmVhdGUoaW5zdGFuY2VDb25maWcpIHtcbiAgICByZXR1cm4gY3JlYXRlSW5zdGFuY2UobWVyZ2VDb25maWcoZGVmYXVsdENvbmZpZywgaW5zdGFuY2VDb25maWcpKTtcbiAgfTtcblxuICByZXR1cm4gaW5zdGFuY2U7XG59XG5cbi8vIENyZWF0ZSB0aGUgZGVmYXVsdCBpbnN0YW5jZSB0byBiZSBleHBvcnRlZFxuY29uc3QgYXhpb3MgPSBjcmVhdGVJbnN0YW5jZShkZWZhdWx0cyk7XG5cbi8vIEV4cG9zZSBBeGlvcyBjbGFzcyB0byBhbGxvdyBjbGFzcyBpbmhlcml0YW5jZVxuYXhpb3MuQXhpb3MgPSBBeGlvcztcblxuLy8gRXhwb3NlIENhbmNlbCAmIENhbmNlbFRva2VuXG5heGlvcy5DYW5jZWxlZEVycm9yID0gQ2FuY2VsZWRFcnJvcjtcbmF4aW9zLkNhbmNlbFRva2VuID0gQ2FuY2VsVG9rZW47XG5heGlvcy5pc0NhbmNlbCA9IGlzQ2FuY2VsO1xuYXhpb3MuVkVSU0lPTiA9IFZFUlNJT047XG5heGlvcy50b0Zvcm1EYXRhID0gdG9Gb3JtRGF0YTtcblxuLy8gRXhwb3NlIEF4aW9zRXJyb3IgY2xhc3NcbmF4aW9zLkF4aW9zRXJyb3IgPSBBeGlvc0Vycm9yO1xuXG4vLyBhbGlhcyBmb3IgQ2FuY2VsZWRFcnJvciBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuYXhpb3MuQ2FuY2VsID0gYXhpb3MuQ2FuY2VsZWRFcnJvcjtcblxuLy8gRXhwb3NlIGFsbC9zcHJlYWRcbmF4aW9zLmFsbCA9IGZ1bmN0aW9uIGFsbChwcm9taXNlcykge1xuICByZXR1cm4gUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xufTtcblxuYXhpb3Muc3ByZWFkID0gc3ByZWFkO1xuXG4vLyBFeHBvc2UgaXNBeGlvc0Vycm9yXG5heGlvcy5pc0F4aW9zRXJyb3IgPSBpc0F4aW9zRXJyb3I7XG5cbi8vIEV4cG9zZSBtZXJnZUNvbmZpZ1xuYXhpb3MubWVyZ2VDb25maWcgPSBtZXJnZUNvbmZpZztcblxuYXhpb3MuQXhpb3NIZWFkZXJzID0gQXhpb3NIZWFkZXJzO1xuXG5heGlvcy5mb3JtVG9KU09OID0gdGhpbmcgPT4gZm9ybURhdGFUb0pTT04odXRpbHMuaXNIVE1MRm9ybSh0aGluZykgPyBuZXcgRm9ybURhdGEodGhpbmcpIDogdGhpbmcpO1xuXG5heGlvcy5nZXRBZGFwdGVyID0gYWRhcHRlcnMuZ2V0QWRhcHRlcjtcblxuYXhpb3MuSHR0cFN0YXR1c0NvZGUgPSBIdHRwU3RhdHVzQ29kZTtcblxuYXhpb3MuZGVmYXVsdCA9IGF4aW9zO1xuXG4vLyB0aGlzIG1vZHVsZSBzaG91bGQgb25seSBoYXZlIGEgZGVmYXVsdCBleHBvcnRcbmV4cG9ydCBkZWZhdWx0IGF4aW9zXG4iLCJcInVzZSBzdHJpY3RcIjtcclxuaW1wb3J0IGF4aW9zIGZyb20gXCJheGlvc1wiO1xyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBIdHRwe1xyXG4gICAgI2F4aW9zO1xyXG4gICAgI3JlcXVlc3RDb3VudCA9IDA7IC8vIOivt+axguasoeaVsFxyXG4gICAgI2Vycm9yVGlwc0NvdW50ID0gMDtcclxuICAgICNsb2FkaW5nSW5zdGFuY2UgPSBudWxsO1xyXG4gICAgI2NvbmZpZyA9IHtcclxuICAgICAgICBiYXNlVVJMOiAnJyxcclxuICAgICAgICB0aW1lb3V0OiA2MCAqIDEwMDAsXHJcbiAgICAgICAgd2l0aENyZWRlbnRpYWxzOiBmYWxzZSxcclxuICAgICAgICBzdWNjZXNzQ29kZTogMjAwLFxyXG4gICAgICAgIGVycm9yQ29kZTogNTAwXHJcbiAgICB9XHJcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKXtcclxuICAgICAgICBmb3IoY29uc3QgayBpbiB0aGlzLiNjb25maWcpe1xyXG4gICAgICAgICAgICBpZihvcHRpb25zW2tdKXtcclxuICAgICAgICAgICAgICAgIHRoaXMuI2NvbmZpZ1trXSA9IG9wdGlvbnNba107XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgYXhpb3MuZGVmYXVsdHMuaGVhZGVyc1snQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04JztcclxuICAgICAgICBheGlvcy5kZWZhdWx0cy5oZWFkZXJzWydBY2NlcHQnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcclxuICAgICAgICB0aGlzLiNheGlvcyA9IGF4aW9zLmNyZWF0ZSh0aGlzLiNjb25maWcpO1xyXG5cclxuICAgICAgICB0aGlzLiNheGlvcy5pbnRlcmNlcHRvcnMucmVxdWVzdC51c2UoXHJcbiAgICAgICAgICAgIGNvbmZpZz0+e1xyXG4gICAgICAgICAgICAgICAgaWYoIWNvbmZpZy5wYXJhbXMpe1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZy5wYXJhbXMgPSB7fTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmKHRoaXMuI3JlcXVlc3RDb3VudCA9PSAwKXtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLiNsb2FkaW5nSW5zdGFuY2UgPSBsb2FkaW5nKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLiNyZXF1ZXN0Q291bnQrKztcclxuICAgICAgICAgICAgICAgIGNvbmZpZy5oZWFkZXJzLmF1dGhvcml6YXRpb24gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndG9rZW4nKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBjb25maWc7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVycm9yPT57XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgKTtcclxuICAgICAgICB0aGlzLiNheGlvcy5pbnRlcmNlcHRvcnMucmVzcG9uc2UudXNlKFxyXG4gICAgICAgICAgICByZXNwb25zZT0+e1xyXG4gICAgICAgICAgICAgICAgdGhpcy4jcmVxdWVzdENvdW50LS07XHJcbiAgICAgICAgICAgICAgICBpZih0aGlzLiNyZXF1ZXN0Q291bnQgPT09IDApe1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI2Vycm9yVGlwc0NvdW50ID0gMDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLiNsb2FkaW5nSW5zdGFuY2UuY2xvc2UoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZS5kYXRhO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnJvcj0+e1xyXG4gICAgICAgICAgICAgICAgdGhpcy4jcmVxdWVzdENvdW50LS07XHJcbiAgICAgICAgICAgICAgICBpZih0aGlzLiNyZXF1ZXN0Q291bnQgPT09IDApe1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI2xvYWRpbmdJbnN0YW5jZS5jbG9zZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgX2hhbmRsZVJlc3VsdChzdWNjZXNzLGVycixyZXMpe1xyXG4gICAgICAgIGlmKCFyZXMpe1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKHJlcy5jb2RlID09PSB0aGlzLiNjb25maWcuc3VjY2Vzc0NvZGUpe1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIHN1Y2Nlc3MgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgICAgIHN1Y2Nlc3MocmVzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1lbHNlIHtcclxuICAgICAgICAgICAgaWYodGhpcy4jZXJyb3JUaXBzQ291bnQ9PT0wKXtcclxuICAgICAgICAgICAgICAgIHRoaXMuI2Vycm9yVGlwc0NvdW50Kys7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYocmVzLmNvZGUgPT09IDQwMSl7XHJcbiAgICAgICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5jbGVhcigpO1xyXG4gICAgICAgICAgICB9ZWxzZSBpZihyZXMuY29kZSA9PT0gdGhpcy4jY29uZmlnLmVycm9yQ29kZSl7XHJcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGVyciA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGVycihyZXMpO1xyXG4gICAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICAgICAgZXJyb3IocmVzLm1zZyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBlcnIgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgICAgICAgICBlcnIocmVzKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwb3N0KHVybCxwYXJhbXMsc3VjY2VzcyxlcnIpe1xyXG4gICAgICAgIHRoaXMuI2F4aW9zLnBvc3QodXJsLHBhcmFtcykudGhlbihyZXM9PntcclxuICAgICAgICAgICAgdGhpcy5faGFuZGxlUmVzdWx0KHN1Y2Nlc3MsZXJyLHJlcyk7XHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgICB1cGRhdGUodXJsLHBhcmFtcyxzdWNjZXNzLGVycil7XHJcbiAgICAgICAgdGhpcy4jYXhpb3MudXBkYXRlKHVybCxwYXJhbXMpLnRoZW4ocmVzPT57XHJcbiAgICAgICAgICAgIHRoaXMuX2hhbmRsZVJlc3VsdChzdWNjZXNzLGVycixyZXMpO1xyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0KHVybCwgcGFyYW1zLCBzdWNjZXNzLCBlcnIpe1xyXG4gICAgICAgIHRoaXMuI2F4aW9zLmdldCh1cmwsIHsgcGFyYW1zOiBwYXJhbXN9KS50aGVuKHJlcyA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuX2hhbmRsZVJlc3VsdChzdWNjZXNzLGVycixyZXMpO1xyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgZGVsZXRlKHVybCwgcGFyYW1zLCBzdWNjZXNzLCBlcnIpe1xyXG5cdFx0dGhpcy4jYXhpb3MuZGVsZXRlKHVybCwgeyBwYXJhbXM6IHBhcmFtc30pLnRoZW4ocmVzID0+IHtcclxuXHRcdFx0dGhpcy5faGFuZGxlUmVzdWx0KHN1Y2Nlc3MsZXJyLHJlcyk7XHJcblx0XHR9KVxyXG5cdH1cclxuXHJcbiAgICBkb3duTG9hZCh1cmwsIHBhcmFtcz17fSl7XHJcbiAgICAgICAgdGhpcy4jYXhpb3MucG9zdCh1cmwsIHBhcmFtcywgeydyZXNwb25zZVR5cGUnOiAnYmxvYid9KS50aGVuKHJlcz0+e1xyXG5cdFx0XHRpZihyZXMpe1xyXG5cdFx0XHRcdGxldCBmaWxlTmFtZSA9IHBhcmFtcy5maWxlTmFtZTtcclxuXHRcdFx0XHRpZighZmlsZU5hbWUpe1xyXG5cdFx0XHRcdFx0ZmlsZU5hbWUgPSByZXMuaGVhZGVyc1snY29udGVudC1kaXNwb3NpdGlvbiddLnNwbGl0KCdmaWxlbmFtZT0nKVsxXS5yZXBsYWNlKC9cIi9nLCAnJyk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbcmVzLmRhdGFdLCB7dHlwZTogJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbTtjaGFyc2V0PVVURi04J30pO1xyXG5cdFx0XHRcdGNvbnN0IGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XHJcblx0XHRcdFx0bGluay5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG5cdFx0XHRcdGxpbmsuaHJlZiA9IHdpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xyXG5cdFx0XHRcdGxpbmsuZG93bmxvYWQgPSBkZWNvZGVVUklDb21wb25lbnQoZmlsZU5hbWUpO1xyXG5cdFx0XHRcdGxpbmsuY2xpY2soKTtcclxuXHRcdFx0XHR3aW5kb3cuVVJMLnJldm9rZU9iamVjdFVSTChsaW5rLmhyZWYpO1xyXG5cdFx0XHR9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn0iLCJyZXF1aXJlKCcuL21lc3NhZ2UvaW5kZXguanMnKTtcclxuaW1wb3J0IFBhZ2luYXRpb24gZnJvbSAnLi9wYWdpbmF0aW9uL0luZGV4LnZ1ZSc7XHJcbmltcG9ydCBQYWdlVGFibGUgZnJvbSAnLi9wYWdlLXRhYmxlL0luZGV4LnZ1ZSc7XHJcbmltcG9ydCBEaWFsb2cgZnJvbSAnLi9kaWFsb2cvSW5kZXgudnVlJztcclxuaW1wb3J0IENhcmQgZnJvbSAnLi9jYXJkL0luZGV4LnZ1ZSc7XHJcbmltcG9ydCBUcmVlIGZyb20gJy4vdHJlZS9JbmRleC52dWUnO1xyXG5pbXBvcnQgX0h0dHAgZnJvbSAnLi9odHRwL2luZGV4LmpzJztcclxuY29uc3QgY29tcyA9IFtQYWdpbmF0aW9uLCBQYWdlVGFibGUsIERpYWxvZywgQ2FyZCwgVHJlZV07XHJcbmNvbnN0IGluc3RhbGwgPSBmdW5jdGlvbihWdWUpe1xyXG4gICAgY29tcy5mb3JFYWNoKGNvbSA9PiB7XHJcbiAgICAgICAgVnVlLmNvbXBvbmVudChjb20ubmFtZSwgY29tKTtcclxuICAgIH0pXHJcbn1cclxuXHJcbi8vIOWvvOWHuue7hOS7tlxyXG5leHBvcnQgZGVmYXVsdCBpbnN0YWxsO1xyXG5cclxuZXhwb3J0IGNsYXNzIEh0dHAgZXh0ZW5kcyBfSHR0cHtcclxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpe1xyXG4gICAgICAgIHN1cGVyKG9wdGlvbnMpO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0ICcuL3NldFB1YmxpY1BhdGgnXG5pbXBvcnQgbW9kIGZyb20gJ35lbnRyeSdcbmV4cG9ydCBkZWZhdWx0IG1vZFxuZXhwb3J0ICogZnJvbSAnfmVudHJ5J1xuIl0sIm5hbWVzIjpbInJlbmRlciIsIl92bSIsIl9jIiwiX3NlbGYiLCJ0b3RhbCIsIl9iIiwiYXR0cnMiLCJjdXJyZW50UGFnZSIsInBhZ2VTaXplIiwicGFnZVNpemVzIiwib24iLCJoYW5kbGVTaXplQ2hhbmdlIiwiaGFuZGxlQ3VycmVudENoYW5nZSIsIiRhdHRycyIsIl9lIiwic3RhdGljUmVuZGVyRm5zIiwibmFtZSIsInByb3BzIiwicmVxdWlyZWQiLCJ0eXBlIiwiTnVtYmVyIiwiZGVmYXVsdCIsInBhZ2UiLCJsaW1pdCIsIkFycmF5IiwiY29tcHV0ZWQiLCJnZXQiLCJzZXQiLCJ2YWwiLCIkZW1pdCIsInRvdGFsQ291bnQiLCJtZXRob2RzIiwic3RhdGljQ2xhc3MiLCJ0YWJsZUlkIiwic3RhdGljU3R5bGUiLCJyZWYiLCJsaXN0Iiwicm93S2V5IiwibG9hZCIsImhsaWdodEN1cnJlbnRSb3ciLCJkZWZhdWx0RXhwYW5kQWxsIiwiaGFuZGVsU2VsZWN0aW9uQ2hhbmdlIiwic2VsZWN0QWxsIiwiaGFuZGxlUm93Q2xpY2siLCJzaG93Q2hlY2tCb3giLCJzb3J0TnVtIiwic2NvcGVkU2xvdHMiLCJfdSIsImtleSIsImZuIiwic2NvcGUiLCJfdiIsIl9zIiwicGFyYW1zIiwiJGluZGV4IiwiX3QiLCJ1cGRhdGU6cGFnZSIsIiRldmVudCIsIiRzZXQiLCJnZXRMaXN0IiwiZGF0YSIsInVybCIsIlN0cmluZyIsIm1ldGhvZCIsIkJvb2xlYW4iLCJkZWZhdWx0UGFyYW1zIiwiT2JqZWN0IiwiZGVmYXVsdFNlbGVjdCIsInlwZSIsIndhdGNoIiwibmV3VmFsIiwiaGFuZGxlciIsInNldENoZWNrZWQiLCJkZWVwIiwib2xkVmFsIiwicGFyYW0iLCJNYXRoIiwicmFuZG9tIiwidG9TdHJpbmciLCJzdWJzdHJpbmciLCJzZWxlY3REYXRhIiwic2VsZWN0SWRzIiwibW91bnRlZCIsIiRsaXN0ZW5lcnMiLCJpdGVtIiwicGFnZU9wdGlvbiIsInN0b3JhZ2VQYXJhbXMiLCJzZXNzaW9uU3RvcmFnZSIsImdldEl0ZW0iLCIkcm91dGUiLCJwYXRoIiwic2V0SXRlbSIsIkpTT04iLCJzdHJpbmdpZnkiLCJodHRwIiwicmVzIiwiX3NldERhdGEiLCJwb3N0IiwicmVjb3JkcyIsImxlbmd0aCIsIm1hcCIsIiRuZXh0VGljayIsIiRyZWZzIiwiaW5jbHVkZXMiLCJ0b2dnbGVSb3dTZWxlY3Rpb24iLCJxdWVyeSIsImtleXMiLCJyb3ciLCJjb2x1bW4iLCJldmVudCIsIl8iLCJzZWxlY3Rpb25MaXN0IiwidmFsdWVzIiwic2VsZWN0aW9uIiwic2V0Q3VycmVudCIsImluZGV4Iiwic2V0Q3VycmVudFJvdyIsImdldERhdGEiLCJ0cmVlIiwidHJlZU5vZGUiLCJyZXNvbHZlIiwiZGlyZWN0aXZlcyIsInJhd05hbWUiLCJ0aXRsZSIsImRpYWxvZ1Zpc2libGUiLCJoYW5kbGVDbG9zZSIsInNob3dDbG9zZSIsInN0eWxlIiwibWF4SGVpZ2h0IiwibWluSGVpZ2h0Iiwic2xvdCIsIlZ1ZSIsImRpcmVjdGl2ZSIsImJpbmQiLCJlbCIsImRpYWxvZ0hlYWRlckVsIiwicXVlcnlTZWxlY3RvciIsImRyYWdEb20iLCJjdXJzb3IiLCJzdHkiLCJjdXJyZW50U3R5bGUiLCJ3aW5kb3ciLCJnZXRDb21wdXRlZFN0eWxlIiwib25tb3VzZWRvd24iLCJkaXNYIiwiY2xpZW50WCIsIm9mZnNldExlZnQiLCJkaXNZIiwiY2xpZW50WSIsIm9mZnNldFRvcCIsInN0eUwiLCJzdHlUIiwibGVmdCIsImRvY3VtZW50IiwiYm9keSIsImNsaWVudFdpZHRoIiwicmVwbGFjZSIsImNsaWVudEhlaWdodCIsInRvcCIsIm9ubW91c2Vtb3ZlIiwiZSIsImwiLCJ0Iiwib25tb3VzZXVwIiwiYXJpYUVscyIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJmb3JFYWNoIiwicmVtb3ZlQXR0cmlidXRlIiwic2hhZG93IiwiJHNsb3RzIiwic2hvdyIsIl9sIiwiaWQiLCJvbkV4cGFuZCIsIm9uQ2hlY2tlZCIsImhhc0NoaWxkcmVuIiwiaXNBcnJheSIsImNoaWxkcmVuIiwicmVuZGVyTGFiZWwiLCJoIiwiY29udGV4dCIsImxpc3RlbmVycyIsImNsaWNrSGFuZGxlciIsImNoZWNrZWRIYW5kbGVyIiwibGFiZWwiLCJjaGlsZE5vZGVzIiwicHVzaCIsImljb0NsYXNzIiwiZXhwYW5kIiwiZG9tUHJvcHMiLCJjbGFzc05hbWUiLCJqb2luIiwibWFyZ2luTGVmdCIsIl9sZXZlIiwiZm9udFNpemUiLCJ0cmFuc2Zvcm0iLCJjb2xvciIsImNsaWNrIiwiY2hlY2tlZCIsInJlbmRlckNoaWxkcmVuIiwicmVuZGVyTm9kZSIsImNscyIsImNvbXBvbmVudHMiLCJBdXRoVHJlZSIsImZ1bmN0aW9uYWwiLCJpbml0IiwibGV2ZSIsImkiLCJyZWZyZXNoIiwidG9vbGVyQ2hlY2tlZCIsInNldFBhcmVudENoZWNrZWQiLCJub2RlIiwic2V0Q2hpbGRDaGVja2VkIiwiY2hpbGRJc0NoZWNrZWQiLCJzZXREZWZhdWx0Q2hlY2tlZCIsImRlZmF1bHRJZHMiLCJnZXRDaGVja2VkS2V5cyIsIl9nZXRDaGVja2VkS2V5cyIsImdldENoZWNrZWROb2RlcyIsIm5vZGVzIiwiX2dldENoZWNrZWROb2RlcyIsImltbWVkaWF0ZSIsIl9jaGVja1ByaXZhdGVSZWRlY2xhcmF0aW9uIiwib2JqIiwicHJpdmF0ZUNvbGxlY3Rpb24iLCJoYXMiLCJUeXBlRXJyb3IiLCJjaGVja1ByaXZhdGVSZWRlY2xhcmF0aW9uIiwiX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWMiLCJwcml2YXRlTWFwIiwidmFsdWUiLCJfYXNzZXJ0Q2xhc3NCcmFuZCIsIm4iLCJhcmd1bWVudHMiLCJhc3NlcnRDbGFzc0JyYW5kIiwiX2NsYXNzUHJpdmF0ZUZpZWxkU2V0MiIsInMiLCJhIiwiciIsIl9jbGFzc1ByaXZhdGVGaWVsZEdldDIiLCJ0aGlzQXJnIiwid3JhcCIsImFwcGx5IiwicHJvdG90eXBlIiwiZ2V0UHJvdG90eXBlT2YiLCJraW5kT2YiLCJjYWNoZSIsInRoaW5nIiwic3RyIiwiY2FsbCIsInNsaWNlIiwidG9Mb3dlckNhc2UiLCJjcmVhdGUiLCJraW5kT2ZUZXN0IiwidHlwZU9mVGVzdCIsImlzVW5kZWZpbmVkIiwiaXNCdWZmZXIiLCJjb25zdHJ1Y3RvciIsImlzRnVuY3Rpb24iLCJpc0FycmF5QnVmZmVyIiwiaXNBcnJheUJ1ZmZlclZpZXciLCJyZXN1bHQiLCJBcnJheUJ1ZmZlciIsImlzVmlldyIsImJ1ZmZlciIsImlzU3RyaW5nIiwiaXNOdW1iZXIiLCJpc09iamVjdCIsImlzQm9vbGVhbiIsImlzUGxhaW5PYmplY3QiLCJTeW1ib2wiLCJ0b1N0cmluZ1RhZyIsIml0ZXJhdG9yIiwiaXNEYXRlIiwiaXNGaWxlIiwiaXNCbG9iIiwiaXNGaWxlTGlzdCIsImlzU3RyZWFtIiwicGlwZSIsImlzRm9ybURhdGEiLCJraW5kIiwiRm9ybURhdGEiLCJhcHBlbmQiLCJpc1VSTFNlYXJjaFBhcmFtcyIsInRyaW0iLCJhbGxPd25LZXlzIiwiZ2V0T3duUHJvcGVydHlOYW1lcyIsImxlbiIsImZpbmRLZXkiLCJfa2V5IiwiX2dsb2JhbCIsImdsb2JhbFRoaXMiLCJzZWxmIiwiZ2xvYmFsIiwiaXNDb250ZXh0RGVmaW5lZCIsIm1lcmdlIiwiY2FzZWxlc3MiLCJhc3NpZ25WYWx1ZSIsInRhcmdldEtleSIsImV4dGVuZCIsImIiLCJzdHJpcEJPTSIsImNvbnRlbnQiLCJjaGFyQ29kZUF0IiwiaW5oZXJpdHMiLCJzdXBlckNvbnN0cnVjdG9yIiwiZGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0eSIsImFzc2lnbiIsInRvRmxhdE9iamVjdCIsInNvdXJjZU9iaiIsImRlc3RPYmoiLCJmaWx0ZXIiLCJwcm9wRmlsdGVyIiwicHJvcCIsIm1lcmdlZCIsImVuZHNXaXRoIiwic2VhcmNoU3RyaW5nIiwicG9zaXRpb24iLCJ1bmRlZmluZWQiLCJsYXN0SW5kZXgiLCJpbmRleE9mIiwidG9BcnJheSIsImFyciIsImlzVHlwZWRBcnJheSIsIlR5cGVkQXJyYXkiLCJVaW50OEFycmF5IiwiZm9yRWFjaEVudHJ5IiwiZ2VuZXJhdG9yIiwibmV4dCIsImRvbmUiLCJwYWlyIiwibWF0Y2hBbGwiLCJyZWdFeHAiLCJtYXRjaGVzIiwiZXhlYyIsImlzSFRNTEZvcm0iLCJ0b0NhbWVsQ2FzZSIsInJlcGxhY2VyIiwibSIsInAxIiwicDIiLCJ0b1VwcGVyQ2FzZSIsImhhc093blByb3BlcnR5IiwiaXNSZWdFeHAiLCJyZWR1Y2VEZXNjcmlwdG9ycyIsInJlZHVjZXIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwicmVkdWNlZERlc2NyaXB0b3JzIiwiZGVzY3JpcHRvciIsInJldCIsImRlZmluZVByb3BlcnRpZXMiLCJmcmVlemVNZXRob2RzIiwiZW51bWVyYWJsZSIsIndyaXRhYmxlIiwiRXJyb3IiLCJ0b09iamVjdFNldCIsImFycmF5T3JTdHJpbmciLCJkZWxpbWl0ZXIiLCJkZWZpbmUiLCJzcGxpdCIsIm5vb3AiLCJ0b0Zpbml0ZU51bWJlciIsImRlZmF1bHRWYWx1ZSIsImlzRmluaXRlIiwiQUxQSEEiLCJESUdJVCIsIkFMUEhBQkVUIiwiQUxQSEFfRElHSVQiLCJnZW5lcmF0ZVN0cmluZyIsInNpemUiLCJhbHBoYWJldCIsImlzU3BlY0NvbXBsaWFudEZvcm0iLCJ0b0pTT05PYmplY3QiLCJzdGFjayIsInZpc2l0Iiwic291cmNlIiwidGFyZ2V0IiwicmVkdWNlZFZhbHVlIiwiaXNBc3luY0ZuIiwiaXNUaGVuYWJsZSIsInRoZW4iLCJjYXRjaCIsImhhc093blByb3AiLCJ1dGlscyIsIkF4aW9zRXJyb3IiLCJtZXNzYWdlIiwiY29kZSIsImNvbmZpZyIsInJlcXVlc3QiLCJyZXNwb25zZSIsImNhcHR1cmVTdGFja1RyYWNlIiwidG9KU09OIiwiZGVzY3JpcHRpb24iLCJudW1iZXIiLCJmaWxlTmFtZSIsImxpbmVOdW1iZXIiLCJjb2x1bW5OdW1iZXIiLCJzdGF0dXMiLCJmcm9tIiwiZXJyb3IiLCJjdXN0b21Qcm9wcyIsImF4aW9zRXJyb3IiLCJjYXVzZSIsIlBsYXRmb3JtRm9ybURhdGEiLCJpc1Zpc2l0YWJsZSIsInJlbW92ZUJyYWNrZXRzIiwicmVuZGVyS2V5IiwiZG90cyIsImNvbmNhdCIsImVhY2giLCJ0b2tlbiIsImlzRmxhdEFycmF5Iiwic29tZSIsInByZWRpY2F0ZXMiLCJ0ZXN0IiwidG9Gb3JtRGF0YSIsImZvcm1EYXRhIiwib3B0aW9ucyIsIm1ldGFUb2tlbnMiLCJpbmRleGVzIiwiZGVmaW5lZCIsIm9wdGlvbiIsInZpc2l0b3IiLCJkZWZhdWx0VmlzaXRvciIsIl9CbG9iIiwiQmxvYiIsInVzZUJsb2IiLCJjb252ZXJ0VmFsdWUiLCJ0b0lTT1N0cmluZyIsIkJ1ZmZlciIsImV4cG9zZWRIZWxwZXJzIiwiYnVpbGQiLCJwb3AiLCJlbmNvZGUiLCJjaGFyTWFwIiwiZW5jb2RlVVJJQ29tcG9uZW50IiwibWF0Y2giLCJBeGlvc1VSTFNlYXJjaFBhcmFtcyIsIl9wYWlycyIsImVuY29kZXIiLCJfZW5jb2RlIiwiYnVpbGRVUkwiLCJzZXJpYWxpemVGbiIsInNlcmlhbGl6ZSIsInNlcmlhbGl6ZWRQYXJhbXMiLCJoYXNobWFya0luZGV4IiwiSW50ZXJjZXB0b3JNYW5hZ2VyIiwiaGFuZGxlcnMiLCJ1c2UiLCJmdWxmaWxsZWQiLCJyZWplY3RlZCIsInN5bmNocm9ub3VzIiwicnVuV2hlbiIsImVqZWN0IiwiY2xlYXIiLCJmb3JFYWNoSGFuZGxlciIsInNpbGVudEpTT05QYXJzaW5nIiwiZm9yY2VkSlNPTlBhcnNpbmciLCJjbGFyaWZ5VGltZW91dEVycm9yIiwiVVJMU2VhcmNoUGFyYW1zIiwiaXNCcm93c2VyIiwiY2xhc3NlcyIsInByb3RvY29scyIsImhhc0Jyb3dzZXJFbnYiLCJoYXNTdGFuZGFyZEJyb3dzZXJFbnYiLCJwcm9kdWN0IiwibmF2aWdhdG9yIiwiaGFzU3RhbmRhcmRCcm93c2VyV2ViV29ya2VyRW52IiwiV29ya2VyR2xvYmFsU2NvcGUiLCJpbXBvcnRTY3JpcHRzIiwicGxhdGZvcm0iLCJ0b1VSTEVuY29kZWRGb3JtIiwiaGVscGVycyIsImlzTm9kZSIsInBhcnNlUHJvcFBhdGgiLCJhcnJheVRvT2JqZWN0IiwiZm9ybURhdGFUb0pTT04iLCJidWlsZFBhdGgiLCJpc051bWVyaWNLZXkiLCJpc0xhc3QiLCJlbnRyaWVzIiwidHJhbnNpdGlvbmFsRGVmYXVsdHMiLCJzdHJpbmdpZnlTYWZlbHkiLCJyYXdWYWx1ZSIsInBhcnNlciIsInBhcnNlIiwiZGVmYXVsdHMiLCJ0cmFuc2l0aW9uYWwiLCJhZGFwdGVyIiwidHJhbnNmb3JtUmVxdWVzdCIsImhlYWRlcnMiLCJjb250ZW50VHlwZSIsImdldENvbnRlbnRUeXBlIiwiaGFzSlNPTkNvbnRlbnRUeXBlIiwiaXNPYmplY3RQYXlsb2FkIiwic2V0Q29udGVudFR5cGUiLCJmb3JtU2VyaWFsaXplciIsIl9Gb3JtRGF0YSIsImVudiIsInRyYW5zZm9ybVJlc3BvbnNlIiwiSlNPTlJlcXVlc3RlZCIsInJlc3BvbnNlVHlwZSIsInN0cmljdEpTT05QYXJzaW5nIiwiRVJSX0JBRF9SRVNQT05TRSIsInRpbWVvdXQiLCJ4c3JmQ29va2llTmFtZSIsInhzcmZIZWFkZXJOYW1lIiwibWF4Q29udGVudExlbmd0aCIsIm1heEJvZHlMZW5ndGgiLCJ2YWxpZGF0ZVN0YXR1cyIsImNvbW1vbiIsImlnbm9yZUR1cGxpY2F0ZU9mIiwicmF3SGVhZGVycyIsInBhcnNlZCIsImxpbmUiLCJwYXJzZUhlYWRlcnMiLCIkaW50ZXJuYWxzIiwibm9ybWFsaXplSGVhZGVyIiwiaGVhZGVyIiwibm9ybWFsaXplVmFsdWUiLCJwYXJzZVRva2VucyIsInRva2VucyIsInRva2Vuc1JFIiwiaXNWYWxpZEhlYWRlck5hbWUiLCJtYXRjaEhlYWRlclZhbHVlIiwiaXNIZWFkZXJOYW1lRmlsdGVyIiwiZm9ybWF0SGVhZGVyIiwidyIsImNoYXIiLCJidWlsZEFjY2Vzc29ycyIsImFjY2Vzc29yTmFtZSIsIm1ldGhvZE5hbWUiLCJhcmcxIiwiYXJnMiIsImFyZzMiLCJjb25maWd1cmFibGUiLCJBeGlvc0hlYWRlcnMiLCJ2YWx1ZU9yUmV3cml0ZSIsInJld3JpdGUiLCJzZXRIZWFkZXIiLCJfdmFsdWUiLCJfaGVhZGVyIiwiX3Jld3JpdGUiLCJsSGVhZGVyIiwic2V0SGVhZGVycyIsIm1hdGNoZXIiLCJkZWxldGUiLCJkZWxldGVkIiwiZGVsZXRlSGVhZGVyIiwibm9ybWFsaXplIiwiZm9ybWF0Iiwibm9ybWFsaXplZCIsInRhcmdldHMiLCJhc1N0cmluZ3MiLCJmaXJzdCIsImFjY2Vzc29yIiwiaW50ZXJuYWxzIiwiYWNjZXNzb3JzIiwiZGVmaW5lQWNjZXNzb3IiLCJtYXBwZWQiLCJoZWFkZXJWYWx1ZSIsInRyYW5zZm9ybURhdGEiLCJmbnMiLCJpc0NhbmNlbCIsIl9fQ0FOQ0VMX18iLCJDYW5jZWxlZEVycm9yIiwiRVJSX0NBTkNFTEVEIiwic2V0dGxlIiwicmVqZWN0IiwiRVJSX0JBRF9SRVFVRVNUIiwiZmxvb3IiLCJ3cml0ZSIsImV4cGlyZXMiLCJkb21haW4iLCJzZWN1cmUiLCJjb29raWUiLCJEYXRlIiwidG9HTVRTdHJpbmciLCJyZWFkIiwiUmVnRXhwIiwiZGVjb2RlVVJJQ29tcG9uZW50IiwicmVtb3ZlIiwibm93IiwiaXNBYnNvbHV0ZVVSTCIsImNvbWJpbmVVUkxzIiwiYmFzZVVSTCIsInJlbGF0aXZlVVJMIiwiYnVpbGRGdWxsUGF0aCIsInJlcXVlc3RlZFVSTCIsInN0YW5kYXJkQnJvd3NlckVudiIsIm1zaWUiLCJ1c2VyQWdlbnQiLCJ1cmxQYXJzaW5nTm9kZSIsImNyZWF0ZUVsZW1lbnQiLCJvcmlnaW5VUkwiLCJyZXNvbHZlVVJMIiwiaHJlZiIsInNldEF0dHJpYnV0ZSIsInByb3RvY29sIiwiaG9zdCIsInNlYXJjaCIsImhhc2giLCJob3N0bmFtZSIsInBvcnQiLCJwYXRobmFtZSIsImNoYXJBdCIsImxvY2F0aW9uIiwiaXNVUkxTYW1lT3JpZ2luIiwicmVxdWVzdFVSTCIsIm5vblN0YW5kYXJkQnJvd3NlckVudiIsInBhcnNlUHJvdG9jb2wiLCJzcGVlZG9tZXRlciIsInNhbXBsZXNDb3VudCIsIm1pbiIsImJ5dGVzIiwidGltZXN0YW1wcyIsImhlYWQiLCJ0YWlsIiwiZmlyc3RTYW1wbGVUUyIsImNodW5rTGVuZ3RoIiwic3RhcnRlZEF0IiwiYnl0ZXNDb3VudCIsInBhc3NlZCIsInJvdW5kIiwiY29va2llcyIsInByb2dyZXNzRXZlbnRSZWR1Y2VyIiwibGlzdGVuZXIiLCJpc0Rvd25sb2FkU3RyZWFtIiwiYnl0ZXNOb3RpZmllZCIsIl9zcGVlZG9tZXRlciIsImxvYWRlZCIsImxlbmd0aENvbXB1dGFibGUiLCJwcm9ncmVzc0J5dGVzIiwicmF0ZSIsImluUmFuZ2UiLCJwcm9ncmVzcyIsImVzdGltYXRlZCIsImlzWEhSQWRhcHRlclN1cHBvcnRlZCIsIlhNTEh0dHBSZXF1ZXN0IiwiUHJvbWlzZSIsImRpc3BhdGNoWGhyUmVxdWVzdCIsInJlcXVlc3REYXRhIiwicmVxdWVzdEhlYWRlcnMiLCJ3aXRoWFNSRlRva2VuIiwib25DYW5jZWxlZCIsImNhbmNlbFRva2VuIiwidW5zdWJzY3JpYmUiLCJzaWduYWwiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwiYXV0aCIsInVzZXJuYW1lIiwicGFzc3dvcmQiLCJ1bmVzY2FwZSIsImJ0b2EiLCJmdWxsUGF0aCIsIm9wZW4iLCJwYXJhbXNTZXJpYWxpemVyIiwib25sb2FkZW5kIiwicmVzcG9uc2VIZWFkZXJzIiwiZ2V0QWxsUmVzcG9uc2VIZWFkZXJzIiwicmVzcG9uc2VEYXRhIiwicmVzcG9uc2VUZXh0Iiwic3RhdHVzVGV4dCIsIl9yZXNvbHZlIiwiX3JlamVjdCIsImVyciIsIm9ucmVhZHlzdGF0ZWNoYW5nZSIsImhhbmRsZUxvYWQiLCJyZWFkeVN0YXRlIiwicmVzcG9uc2VVUkwiLCJzZXRUaW1lb3V0Iiwib25hYm9ydCIsImhhbmRsZUFib3J0IiwiRUNPTk5BQk9SVEVEIiwib25lcnJvciIsImhhbmRsZUVycm9yIiwiRVJSX05FVFdPUksiLCJvbnRpbWVvdXQiLCJoYW5kbGVUaW1lb3V0IiwidGltZW91dEVycm9yTWVzc2FnZSIsIkVUSU1FRE9VVCIsInhzcmZWYWx1ZSIsInNldFJlcXVlc3RIZWFkZXIiLCJ3aXRoQ3JlZGVudGlhbHMiLCJvbkRvd25sb2FkUHJvZ3Jlc3MiLCJhZGRFdmVudExpc3RlbmVyIiwib25VcGxvYWRQcm9ncmVzcyIsInVwbG9hZCIsImNhbmNlbCIsImFib3J0Iiwic3Vic2NyaWJlIiwiYWJvcnRlZCIsInNlbmQiLCJodHRwQWRhcHRlciIsInhockFkYXB0ZXIiLCJrbm93bkFkYXB0ZXJzIiwieGhyIiwicmVuZGVyUmVhc29uIiwicmVhc29uIiwiaXNSZXNvbHZlZEhhbmRsZSIsImdldEFkYXB0ZXIiLCJhZGFwdGVycyIsIm5hbWVPckFkYXB0ZXIiLCJyZWplY3RlZFJlYXNvbnMiLCJyZWFzb25zIiwic3RhdGUiLCJ0aHJvd0lmQ2FuY2VsbGF0aW9uUmVxdWVzdGVkIiwidGhyb3dJZlJlcXVlc3RlZCIsImRpc3BhdGNoUmVxdWVzdCIsIm9uQWRhcHRlclJlc29sdXRpb24iLCJvbkFkYXB0ZXJSZWplY3Rpb24iLCJoZWFkZXJzVG9PYmplY3QiLCJtZXJnZUNvbmZpZyIsImNvbmZpZzEiLCJjb25maWcyIiwiZ2V0TWVyZ2VkVmFsdWUiLCJtZXJnZURlZXBQcm9wZXJ0aWVzIiwidmFsdWVGcm9tQ29uZmlnMiIsImRlZmF1bHRUb0NvbmZpZzIiLCJtZXJnZURpcmVjdEtleXMiLCJtZXJnZU1hcCIsInRpbWVvdXRNZXNzYWdlIiwiZGVjb21wcmVzcyIsImJlZm9yZVJlZGlyZWN0IiwidHJhbnNwb3J0IiwiaHR0cEFnZW50IiwiaHR0cHNBZ2VudCIsInNvY2tldFBhdGgiLCJyZXNwb25zZUVuY29kaW5nIiwiY29tcHV0ZUNvbmZpZ1ZhbHVlIiwiY29uZmlnVmFsdWUiLCJWRVJTSU9OIiwidmFsaWRhdG9ycyIsInZhbGlkYXRvciIsImRlcHJlY2F0ZWRXYXJuaW5ncyIsInZlcnNpb24iLCJmb3JtYXRNZXNzYWdlIiwib3B0IiwiZGVzYyIsIm9wdHMiLCJFUlJfREVQUkVDQVRFRCIsImNvbnNvbGUiLCJ3YXJuIiwiYXNzZXJ0T3B0aW9ucyIsInNjaGVtYSIsImFsbG93VW5rbm93biIsIkVSUl9CQURfT1BUSU9OX1ZBTFVFIiwiRVJSX0JBRF9PUFRJT04iLCJBeGlvcyIsImluc3RhbmNlQ29uZmlnIiwiaW50ZXJjZXB0b3JzIiwiY29uZmlnT3JVcmwiLCJfcmVxdWVzdCIsImR1bW15IiwiYm9vbGVhbiIsImZ1bmN0aW9uIiwiY29udGV4dEhlYWRlcnMiLCJyZXF1ZXN0SW50ZXJjZXB0b3JDaGFpbiIsInN5bmNocm9ub3VzUmVxdWVzdEludGVyY2VwdG9ycyIsInVuc2hpZnRSZXF1ZXN0SW50ZXJjZXB0b3JzIiwiaW50ZXJjZXB0b3IiLCJ1bnNoaWZ0IiwicmVzcG9uc2VJbnRlcmNlcHRvckNoYWluIiwicHVzaFJlc3BvbnNlSW50ZXJjZXB0b3JzIiwicHJvbWlzZSIsImNoYWluIiwibmV3Q29uZmlnIiwib25GdWxmaWxsZWQiLCJvblJlamVjdGVkIiwiZ2V0VXJpIiwiZm9yRWFjaE1ldGhvZE5vRGF0YSIsImZvckVhY2hNZXRob2RXaXRoRGF0YSIsImdlbmVyYXRlSFRUUE1ldGhvZCIsImlzRm9ybSIsImh0dHBNZXRob2QiLCJDYW5jZWxUb2tlbiIsImV4ZWN1dG9yIiwicmVzb2x2ZVByb21pc2UiLCJwcm9taXNlRXhlY3V0b3IiLCJfbGlzdGVuZXJzIiwib25mdWxmaWxsZWQiLCJzcGxpY2UiLCJjIiwic3ByZWFkIiwiY2FsbGJhY2siLCJpc0F4aW9zRXJyb3IiLCJwYXlsb2FkIiwiSHR0cFN0YXR1c0NvZGUiLCJDb250aW51ZSIsIlN3aXRjaGluZ1Byb3RvY29scyIsIlByb2Nlc3NpbmciLCJFYXJseUhpbnRzIiwiT2siLCJDcmVhdGVkIiwiQWNjZXB0ZWQiLCJOb25BdXRob3JpdGF0aXZlSW5mb3JtYXRpb24iLCJOb0NvbnRlbnQiLCJSZXNldENvbnRlbnQiLCJQYXJ0aWFsQ29udGVudCIsIk11bHRpU3RhdHVzIiwiQWxyZWFkeVJlcG9ydGVkIiwiSW1Vc2VkIiwiTXVsdGlwbGVDaG9pY2VzIiwiTW92ZWRQZXJtYW5lbnRseSIsIkZvdW5kIiwiU2VlT3RoZXIiLCJOb3RNb2RpZmllZCIsIlVzZVByb3h5IiwiVW51c2VkIiwiVGVtcG9yYXJ5UmVkaXJlY3QiLCJQZXJtYW5lbnRSZWRpcmVjdCIsIkJhZFJlcXVlc3QiLCJVbmF1dGhvcml6ZWQiLCJQYXltZW50UmVxdWlyZWQiLCJGb3JiaWRkZW4iLCJOb3RGb3VuZCIsIk1ldGhvZE5vdEFsbG93ZWQiLCJOb3RBY2NlcHRhYmxlIiwiUHJveHlBdXRoZW50aWNhdGlvblJlcXVpcmVkIiwiUmVxdWVzdFRpbWVvdXQiLCJDb25mbGljdCIsIkdvbmUiLCJMZW5ndGhSZXF1aXJlZCIsIlByZWNvbmRpdGlvbkZhaWxlZCIsIlBheWxvYWRUb29MYXJnZSIsIlVyaVRvb0xvbmciLCJVbnN1cHBvcnRlZE1lZGlhVHlwZSIsIlJhbmdlTm90U2F0aXNmaWFibGUiLCJFeHBlY3RhdGlvbkZhaWxlZCIsIkltQVRlYXBvdCIsIk1pc2RpcmVjdGVkUmVxdWVzdCIsIlVucHJvY2Vzc2FibGVFbnRpdHkiLCJMb2NrZWQiLCJGYWlsZWREZXBlbmRlbmN5IiwiVG9vRWFybHkiLCJVcGdyYWRlUmVxdWlyZWQiLCJQcmVjb25kaXRpb25SZXF1aXJlZCIsIlRvb01hbnlSZXF1ZXN0cyIsIlJlcXVlc3RIZWFkZXJGaWVsZHNUb29MYXJnZSIsIlVuYXZhaWxhYmxlRm9yTGVnYWxSZWFzb25zIiwiSW50ZXJuYWxTZXJ2ZXJFcnJvciIsIk5vdEltcGxlbWVudGVkIiwiQmFkR2F0ZXdheSIsIlNlcnZpY2VVbmF2YWlsYWJsZSIsIkdhdGV3YXlUaW1lb3V0IiwiSHR0cFZlcnNpb25Ob3RTdXBwb3J0ZWQiLCJWYXJpYW50QWxzb05lZ290aWF0ZXMiLCJJbnN1ZmZpY2llbnRTdG9yYWdlIiwiTG9vcERldGVjdGVkIiwiTm90RXh0ZW5kZWQiLCJOZXR3b3JrQXV0aGVudGljYXRpb25SZXF1aXJlZCIsImNyZWF0ZUluc3RhbmNlIiwiZGVmYXVsdENvbmZpZyIsImluc3RhbmNlIiwiYXhpb3MiLCJDYW5jZWwiLCJhbGwiLCJwcm9taXNlcyIsImZvcm1Ub0pTT04iLCJfY2xhc3NQcml2YXRlRmllbGRTZXQiLCJfY2xhc3NQcml2YXRlRmllbGRHZXQiLCJfYXhpb3MiLCJXZWFrTWFwIiwiX3JlcXVlc3RDb3VudCIsIl9lcnJvclRpcHNDb3VudCIsIl9sb2FkaW5nSW5zdGFuY2UiLCJfY29uZmlnIiwiSHR0cCIsInN1Y2Nlc3NDb2RlIiwiZXJyb3JDb2RlIiwiayIsIl90aGlzJHJlcXVlc3RDb3VudCIsIl90aGlzJHJlcXVlc3RDb3VudDIiLCJsb2FkaW5nIiwiYXV0aG9yaXphdGlvbiIsImxvY2FsU3RvcmFnZSIsIl90aGlzJHJlcXVlc3RDb3VudDMiLCJfdGhpcyRyZXF1ZXN0Q291bnQ0IiwiY2xvc2UiLCJfdGhpcyRyZXF1ZXN0Q291bnQ1IiwiX3RoaXMkcmVxdWVzdENvdW50NiIsIl9oYW5kbGVSZXN1bHQiLCJzdWNjZXNzIiwiX3RoaXMkZXJyb3JUaXBzQ291bnQiLCJfdGhpcyRlcnJvclRpcHNDb3VudDIiLCJtc2ciLCJ1cGRhdGUiLCJkb3duTG9hZCIsImJsb2IiLCJsaW5rIiwiZGlzcGxheSIsIlVSTCIsImNyZWF0ZU9iamVjdFVSTCIsImRvd25sb2FkIiwicmV2b2tlT2JqZWN0VVJMIiwicmVxdWlyZSIsIlBhZ2luYXRpb24iLCJQYWdlVGFibGUiLCJEaWFsb2ciLCJDYXJkIiwiVHJlZSIsIl9IdHRwIiwiY29tcyIsImluc3RhbGwiLCJjb20iLCJjb21wb25lbnQiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///9618\n");
|
16
|
+
eval("// ESM COMPAT FLAG\n__webpack_require__.r(__webpack_exports__);\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n Http: function() { return /* reexport */ Http; },\n \"default\": function() { return /* binding */ entry_lib; }\n});\n\n// NAMESPACE OBJECT: ./node_modules/axios/lib/platform/common/utils.js\nvar common_utils_namespaceObject = {};\n__webpack_require__.r(common_utils_namespaceObject);\n__webpack_require__.d(common_utils_namespaceObject, {\n hasBrowserEnv: function() { return hasBrowserEnv; },\n hasStandardBrowserEnv: function() { return hasStandardBrowserEnv; },\n hasStandardBrowserWebWorkerEnv: function() { return hasStandardBrowserWebWorkerEnv; }\n});\n\n;// CONCATENATED MODULE: ./node_modules/@vue/cli-service/lib/commands/build/setPublicPath.js\n/* eslint-disable no-var */\n// This file is imported into lib/wc client bundles.\n\nif (typeof window !== 'undefined') {\n var currentScript = window.document.currentScript\n if (false) { var getCurrentScript; }\n\n var src = currentScript && currentScript.src.match(/(.+\\/)[^/]+\\.js(\\?.*)?$/)\n if (src) {\n __webpack_require__.p = src[1] // eslint-disable-line\n }\n}\n\n// Indicate to webpack that this file can be concatenated\n/* harmony default export */ var setPublicPath = (null);\n\n;// CONCATENATED MODULE: ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/pagination/Index.vue?vue&type=template&id=26b70fb4&scoped=true\nvar render = function render() {\n var _vm = this,\n _c = _vm._self._c;\n return _vm.total > 0 ? _c('div', [_c('el-pagination', _vm._b({\n attrs: {\n \"background\": \"\",\n \"current-page\": _vm.currentPage,\n \"page-size\": _vm.pageSize,\n \"page-sizes\": _vm.pageSizes,\n \"total\": _vm.total,\n \"layout\": \"prev, pager, next\"\n },\n on: {\n \"size-change\": _vm.handleSizeChange,\n \"current-change\": _vm.handleCurrentChange\n }\n }, 'el-pagination', _vm.$attrs, false))], 1) : _vm._e();\n};\nvar staticRenderFns = [];\n\n;// CONCATENATED MODULE: ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/pagination/Index.vue?vue&type=script&lang=js\n/* harmony default export */ var Indexvue_type_script_lang_js = ({\n name: 'Pagination',\n props: {\n total: {\n required: true,\n type: Number,\n default: 0\n },\n page: {\n type: Number,\n default: 1\n },\n limit: {\n type: Number,\n default: 20\n },\n pageSizes: {\n type: Array,\n default() {\n return [10, 15, 20, 30, 50];\n }\n }\n },\n computed: {\n currentPage: {\n get() {\n return this.page;\n },\n set(val) {\n this.$emit('update:page', val);\n }\n },\n pageSize: {\n get() {\n return this.limit;\n },\n set(val) {\n this.$emit('update:limit', val);\n }\n },\n totalCount: {\n get() {\n return this.total;\n },\n set(val) {\n this.$emit('update:total', val);\n }\n }\n },\n methods: {\n handleSizeChange(val) {\n this.$emit('pagination', {\n page: this.currentPage,\n limit: val\n });\n },\n handleCurrentChange(val) {\n this.$emit('pagination', {\n page: val,\n limit: this.pageSize\n });\n }\n }\n});\n;// CONCATENATED MODULE: ./src/components/pagination/Index.vue?vue&type=script&lang=js\n /* harmony default export */ var pagination_Indexvue_type_script_lang_js = (Indexvue_type_script_lang_js); \n;// CONCATENATED MODULE: ./node_modules/mini-css-extract-plugin/dist/loader.js??clonedRuleSet-22.use[0]!./node_modules/css-loader/dist/cjs.js??clonedRuleSet-22.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-22.use[2]!./node_modules/sass-loader/dist/cjs.js??clonedRuleSet-22.use[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/pagination/Index.vue?vue&type=style&index=0&id=26b70fb4&prod&lang=scss&scoped=true\n// extracted by mini-css-extract-plugin\n\n;// CONCATENATED MODULE: ./src/components/pagination/Index.vue?vue&type=style&index=0&id=26b70fb4&prod&lang=scss&scoped=true\n\n;// CONCATENATED MODULE: ./node_modules/@vue/vue-loader-v15/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 =\n typeof scriptExports === 'function' ? scriptExports.options : 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) {\n // server build\n hook = function (context) {\n // 2.3 injection\n context =\n context || // cached call\n (this.$vnode && this.$vnode.ssrContext) || // stateful\n (this.parent && this.parent.$vnode && this.parent.$vnode.ssrContext) // functional\n // 2.2 with runInNewContext: true\n if (!context && typeof __VUE_SSR_CONTEXT__ !== 'undefined') {\n context = __VUE_SSR_CONTEXT__\n }\n // inject component styles\n if (injectStyles) {\n injectStyles.call(this, context)\n }\n // register component module identifier for async chunk inferrence\n if (context && context._registeredComponents) {\n context._registeredComponents.add(moduleIdentifier)\n }\n }\n // used by ssr in case component is cached and beforeCreate\n // never gets called\n options._ssrRegister = hook\n } else if (injectStyles) {\n hook = shadowMode\n ? function () {\n injectStyles.call(\n this,\n (options.functional ? this.parent : this).$root.$options.shadowRoot\n )\n }\n : injectStyles\n }\n\n if (hook) {\n if (options.functional) {\n // for template-only hot-reload because in that case the render fn doesn't\n // go through the normalizer\n options._injectStyles = hook\n // register for functional component in vue file\n var originalRender = options.render\n options.render = function renderWithStyleInjection(h, context) {\n hook.call(context)\n return originalRender(h, context)\n }\n } else {\n // inject component registration as beforeCreate hook\n var existing = options.beforeCreate\n options.beforeCreate = existing ? [].concat(existing, hook) : [hook]\n }\n }\n\n return {\n exports: scriptExports,\n options: options\n }\n}\n\n;// CONCATENATED MODULE: ./src/components/pagination/Index.vue\n\n\n\n;\n\n\n/* normalize component */\n\nvar component = normalizeComponent(\n pagination_Indexvue_type_script_lang_js,\n render,\n staticRenderFns,\n false,\n null,\n \"26b70fb4\",\n null\n \n)\n\n/* harmony default export */ var Index = (component.exports);\n;// CONCATENATED MODULE: ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/page-table/Index.vue?vue&type=template&id=6ae25121&scoped=true\nvar Indexvue_type_template_id_6ae25121_scoped_true_render = function render() {\n var _vm = this,\n _c = _vm._self._c;\n return _c('div', {\n staticClass: \"page-table\",\n attrs: {\n \"id\": this.tableId\n }\n }, [_c('div', {\n staticClass: \"table\"\n }, [_c('el-scrollbar', {\n staticStyle: {\n \"height\": \"100%\"\n }\n }, [_c('el-table', _vm._b({\n ref: _vm.tableId,\n attrs: {\n \"stripe\": \"\",\n \"data\": _vm.list,\n \"row-key\": _vm.rowKey,\n \"load\": _vm.load,\n \"highlight-current-row\": _vm.hlightCurrentRow,\n \"default-expand-all\": _vm.defaultExpandAll\n },\n on: {\n \"select\": _vm.handelSelectionChange,\n \"select-all\": _vm.selectAll,\n \"row-click\": _vm.handleRowClick,\n \"expand-change\": val => _vm.$emit('expand-change', val)\n }\n }, 'el-table', _vm.$attrs, false), [_vm.showCheckBox ? _c('el-table-column', {\n attrs: {\n \"type\": \"selection\",\n \"width\": \"60px\",\n \"align\": \"center\"\n }\n }) : _vm._e(), _vm.sortNum ? _c('el-table-column', {\n attrs: {\n \"type\": \"index\",\n \"width\": \"60px\",\n \"label\": \"序号\",\n \"align\": \"center\"\n },\n scopedSlots: _vm._u([{\n key: \"default\",\n fn: function (scope) {\n return [_vm.page ? _c('span', [_vm._v(_vm._s((_vm.params.page - 1) * _vm.params.limit + scope.$index + 1))]) : _c('span', [_vm._v(_vm._s(scope.$index + 1))])];\n }\n }], null, false, 2786008021)\n }) : _vm._e(), _vm._t(\"default\")], 2)], 1)], 1), _vm.page ? _c('Pagination', {\n attrs: {\n \"total\": _vm.total,\n \"page\": _vm.params.page,\n \"limit\": _vm.params.limit\n },\n on: {\n \"update:page\": function ($event) {\n return _vm.$set(_vm.params, \"page\", $event);\n },\n \"pagination\": _vm.getList\n }\n }) : _vm._e()], 1);\n};\nvar Indexvue_type_template_id_6ae25121_scoped_true_staticRenderFns = [];\n\n;// CONCATENATED MODULE: ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/page-table/Index.vue?vue&type=script&lang=js\n/* harmony default export */ var page_table_Indexvue_type_script_lang_js = ({\n name: 'PageTable',\n props: {\n // 自定义数据\n data: {\n type: Array,\n default: null\n },\n // 请求地址\n url: {\n type: String,\n default: ''\n },\n // 请求方式\n method: {\n type: String,\n default: 'get'\n },\n // 是否显示序号\n sortNum: {\n type: Boolean,\n default: true\n },\n // 是否分页\n page: {\n type: Boolean,\n default: true\n },\n // 树形表格时,是否全部展开\n defaultExpandAll: {\n type: Boolean,\n default: false\n },\n // 初始请求参数\n defaultParams: {\n type: Object,\n default: () => ({})\n },\n // 默认选中数据\n defaultSelect: {\n type: Array,\n default: () => []\n },\n rowKey: {\n type: String,\n default: 'id'\n },\n hlightCurrentRow: {\n ype: Boolean,\n default: false\n }\n },\n watch: {\n data(newVal) {\n this.list = newVal;\n },\n defaultSelect: {\n handler() {\n this.setChecked();\n },\n deep: true\n },\n defaultParams(newVal, oldVal) {\n for (const key in newVal) {\n if (newVal[key] != oldVal[key]) {\n this.params = {\n page: 1,\n limit: 15,\n param: {\n ...newVal\n }\n };\n this.getList();\n break;\n }\n }\n }\n },\n data() {\n return {\n showCheckBox: false,\n params: {\n page: 1,\n limit: 15,\n param: {\n ...this.defaultParams\n }\n },\n total: 0,\n list: [],\n tableId: `table_${Math.random().toString(36).substring(2, 16)}`,\n selectData: {},\n selectIds: []\n };\n },\n mounted() {\n log(this);\n if (this.$listeners['selection-change']) {\n this.showCheckBox = true;\n }\n if (this.data) {\n this.list = this.data;\n return;\n }\n for (const item of this.defaultSelect) {\n this.selectData[item[this.rowKey]] = item;\n }\n this.getList();\n },\n methods: {\n // 获取数据\n getList(pageOption) {\n if (!this.url) {\n return;\n }\n if (pageOption) {\n this.params.page = pageOption.page;\n this.params.limit = pageOption.limit;\n }\n if (!this.page) {\n delete this.params.page;\n delete this.params.limit;\n }\n const storageParams = sessionStorage.getItem(this.$route.path);\n if (storageParams) {\n sessionStorage.setItem(this.$route.path, JSON.stringify(this.params));\n }\n switch (this.method) {\n case 'get':\n http.get(this.url, this.params, res => {\n this._setData(res);\n });\n break;\n case 'post':\n http.post(this.url, this.params, res => {\n this._setData(res);\n });\n break;\n default:\n break;\n }\n },\n _setData(res) {\n if (this.page) {\n this.list = res.data.records;\n this.total = res.data.total;\n } else {\n this.list = res.data;\n }\n this.setChecked();\n },\n // 设置默认选中\n setChecked() {\n if (this.defaultSelect.length > 0) {\n this.selectIds = this.defaultSelect.map(item => item[this.rowKey]);\n if (this.showCheckBox && this.list) {\n this.$nextTick(() => {\n // 默认选中数据\n if (this.$refs[this.tableId]) {\n for (const item of this.list) {\n if (this.selectIds.includes(item[this.rowKey])) {\n this.$refs[this.tableId].toggleRowSelection(item, true);\n this.selectData[item[this.rowKey]] = item;\n } else {\n this.$refs[this.tableId].toggleRowSelection(item, false);\n delete this.selectData[item[this.rowKey]];\n }\n }\n }\n });\n }\n } else {\n this.selectIds = [];\n this.selectData = {};\n if (this.$refs[this.tableId]) {\n for (const item of this.list) {\n this.$refs[this.tableId].toggleRowSelection(item, false);\n }\n }\n }\n },\n // 条件查询\n query(params = {}) {\n if (Object.keys(params).length > 0) {\n const param = {\n ...this.params.param,\n ...params\n };\n this.params = {\n ...this.params,\n param\n };\n this.params.page = 1;\n }\n this.getList();\n },\n // 点击行\n handleRowClick(row, column, event) {\n this.$emit('row-click', row, column, event);\n },\n handelSelectionChange(_, row) {\n if (this.selectData[row[this.rowKey]]) {\n delete this.selectData[row[this.rowKey]];\n } else {\n this.selectData[row[this.rowKey]] = row;\n }\n const selectionList = Object.values(this.selectData);\n this.selectIds = selectionList.map(item => item[this.rowKey]);\n this.$emit('selection-change', selectionList);\n },\n // 全选/全不选\n selectAll(selection) {\n if (selection.length > 0) {\n for (const item of selection) {\n this.selectData[item[this.rowKey]] = item;\n }\n } else {\n for (const item of this.list) {\n delete this.selectData[item[this.rowKey]];\n }\n }\n const selectionList = Object.values(this.selectData);\n this.selectIds = selectionList.map(item => item[this.rowKey]);\n this.$emit('selection-change', selectionList);\n },\n setCurrent(index) {\n this.$refs[this.tableId].setCurrentRow(this.list[index]);\n },\n getData() {\n return this.list;\n },\n load(tree, treeNode, resolve) {\n this.$emit('load', tree, treeNode, resolve);\n }\n }\n});\n;// CONCATENATED MODULE: ./src/components/page-table/Index.vue?vue&type=script&lang=js\n /* harmony default export */ var components_page_table_Indexvue_type_script_lang_js = (page_table_Indexvue_type_script_lang_js); \n;// CONCATENATED MODULE: ./node_modules/mini-css-extract-plugin/dist/loader.js??clonedRuleSet-22.use[0]!./node_modules/css-loader/dist/cjs.js??clonedRuleSet-22.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-22.use[2]!./node_modules/sass-loader/dist/cjs.js??clonedRuleSet-22.use[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/page-table/Index.vue?vue&type=style&index=0&id=6ae25121&prod&lang=scss&scoped=true\n// extracted by mini-css-extract-plugin\n\n;// CONCATENATED MODULE: ./src/components/page-table/Index.vue?vue&type=style&index=0&id=6ae25121&prod&lang=scss&scoped=true\n\n;// CONCATENATED MODULE: ./src/components/page-table/Index.vue\n\n\n\n;\n\n\n/* normalize component */\n\nvar Index_component = normalizeComponent(\n components_page_table_Indexvue_type_script_lang_js,\n Indexvue_type_template_id_6ae25121_scoped_true_render,\n Indexvue_type_template_id_6ae25121_scoped_true_staticRenderFns,\n false,\n null,\n \"6ae25121\",\n null\n \n)\n\n/* harmony default export */ var page_table_Index = (Index_component.exports);\n;// CONCATENATED MODULE: ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/dialog/Index.vue?vue&type=template&id=4148762e&scoped=true\nvar Indexvue_type_template_id_4148762e_scoped_true_render = function render() {\n var _vm = this,\n _c = _vm._self._c;\n return _c('el-dialog', _vm._b({\n directives: [{\n name: \"dialogDrag\",\n rawName: \"v-dialogDrag\"\n }],\n staticStyle: {\n \"margin-top\": \"0\"\n },\n attrs: {\n \"title\": _vm.title,\n \"visible\": _vm.dialogVisible,\n \"before-close\": _vm.handleClose,\n \"center\": \"\",\n \"close-on-click-modal\": false,\n \"show-close\": _vm.showClose,\n \"append-to-body\": \"\"\n }\n }, 'el-dialog', _vm.$attrs, false), [_c('div', {\n staticStyle: {\n \"overflow-y\": \"auto\",\n \"overflow-x\": \"hidden\",\n \"position\": \"relative\"\n },\n style: {\n maxHeight: _vm.maxHeight,\n minHeight: _vm.minHeight\n }\n }, [_vm._t(\"default\")], 2), _c('div', {\n staticStyle: {\n \"text-align\": \"center\"\n },\n attrs: {\n \"slot\": \"footer\"\n },\n slot: \"footer\"\n }, [_vm._t(\"footer\")], 2)]);\n};\nvar Indexvue_type_template_id_4148762e_scoped_true_staticRenderFns = [];\n\n// EXTERNAL MODULE: external {\"commonjs\":\"vue\",\"commonjs2\":\"vue\",\"root\":\"Vue\"}\nvar external_commonjs_vue_commonjs2_vue_root_Vue_ = __webpack_require__(4100);\nvar external_commonjs_vue_commonjs2_vue_root_Vue_default = /*#__PURE__*/__webpack_require__.n(external_commonjs_vue_commonjs2_vue_root_Vue_);\n;// CONCATENATED MODULE: ./src/components/dialog/dialog-drag.js\n// v-dialogDrag: 弹窗拖拽\n\nexternal_commonjs_vue_commonjs2_vue_root_Vue_default().directive('dialogDrag', {\n bind(el) {\n const dialogHeaderEl = el.querySelector('.el-dialog__header');\n const dragDom = el.querySelector('.el-dialog');\n dialogHeaderEl.style.cursor = 'move';\n\n // 获取原有属性 ie dom元素.currentStyle 火狐谷歌 window.getComputedStyle(dom元素, null);\n const sty = dragDom.currentStyle || window.getComputedStyle(dragDom, null);\n dialogHeaderEl.onmousedown = event => {\n // 鼠标按下,计算当前元素距离可视区的距离\n const disX = event.clientX - dialogHeaderEl.offsetLeft;\n const disY = event.clientY - dialogHeaderEl.offsetTop;\n\n // 获取到的值带px 正则匹配替换\n let styL = null;\n let styT = null;\n\n // 注意在ie中 第一次获取到的值为组件自带50% 移动之后赋值为px\n if (sty.left.includes('\\%')) {\n styL = +document.body.clientWidth * (+sty.left.replace(/\\%/g, '') / 100);\n styT = +document.body.clientHeight * (+sty.top.replace(/\\%/g, '') / 100);\n } else {\n styL = +sty.left.replace(/\\px/g, '');\n styT = +sty.top.replace(/\\px/g, '');\n }\n document.onmousemove = function (e) {\n // 通过事件委托,计算移动的距离\n const l = e.clientX - disX;\n const t = e.clientY - disY;\n\n // 移动当前元素\n dragDom.style.left = `${l + styL}px`;\n dragDom.style.top = `${t + styT}px`;\n };\n document.onmouseup = function () {\n document.onmousemove = null;\n document.onmouseup = null;\n };\n };\n }\n});\nexternal_commonjs_vue_commonjs2_vue_root_Vue_default().directive('removeAriaHidden', {\n bind(el) {\n let ariaEls = el.querySelectorAll('.el-radio__original');\n ariaEls.forEach(item => {\n item.removeAttribute('aria-hidden');\n });\n }\n});\n;// CONCATENATED MODULE: ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/dialog/Index.vue?vue&type=script&lang=js\n\n/* harmony default export */ var dialog_Indexvue_type_script_lang_js = ({\n name: 'Dialog',\n props: {\n title: {\n type: String,\n default: '提示'\n },\n maxHeight: {\n type: String,\n default: '60vh'\n },\n minHeight: {\n type: String,\n default: '150px'\n }\n },\n data() {\n return {\n dialogVisible: true,\n showClose: false\n };\n },\n mounted() {\n if (this.$listeners['close']) {\n this.showClose = true;\n }\n },\n methods: {\n handleClose() {\n this.$emit('close');\n }\n }\n});\n;// CONCATENATED MODULE: ./src/components/dialog/Index.vue?vue&type=script&lang=js\n /* harmony default export */ var components_dialog_Indexvue_type_script_lang_js = (dialog_Indexvue_type_script_lang_js); \n;// CONCATENATED MODULE: ./node_modules/mini-css-extract-plugin/dist/loader.js??clonedRuleSet-22.use[0]!./node_modules/css-loader/dist/cjs.js??clonedRuleSet-22.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-22.use[2]!./node_modules/sass-loader/dist/cjs.js??clonedRuleSet-22.use[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/dialog/Index.vue?vue&type=style&index=0&id=4148762e&prod&lang=scss&scoped=true\n// extracted by mini-css-extract-plugin\n\n;// CONCATENATED MODULE: ./src/components/dialog/Index.vue?vue&type=style&index=0&id=4148762e&prod&lang=scss&scoped=true\n\n;// CONCATENATED MODULE: ./src/components/dialog/Index.vue\n\n\n\n;\n\n\n/* normalize component */\n\nvar dialog_Index_component = normalizeComponent(\n components_dialog_Indexvue_type_script_lang_js,\n Indexvue_type_template_id_4148762e_scoped_true_render,\n Indexvue_type_template_id_4148762e_scoped_true_staticRenderFns,\n false,\n null,\n \"4148762e\",\n null\n \n)\n\n/* harmony default export */ var dialog_Index = (dialog_Index_component.exports);\n;// CONCATENATED MODULE: ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/card/Index.vue?vue&type=template&id=0c5de06e&scoped=true\nvar Indexvue_type_template_id_0c5de06e_scoped_true_render = function render() {\n var _vm = this,\n _c = _vm._self._c;\n return _c('el-card', {\n staticStyle: {\n \"height\": \"calc(100% - 2px)\",\n \"overflow\": \"auto\"\n },\n attrs: {\n \"shadow\": _vm.shadow\n }\n }, [_c('div', {\n staticClass: \"clearfix\",\n attrs: {\n \"slot\": \"header\"\n },\n slot: \"header\"\n }, [_c('div', {\n staticStyle: {\n \"font-size\": \"16px\"\n }\n }, [_vm.$slots['card-title'] ? [_vm._t(\"card-title\")] : [_vm._v(\" \" + _vm._s(_vm.title) + \" \")]], 2), _c('div', {\n staticStyle: {\n \"flex\": \"1\",\n \"position\": \"relative\"\n }\n }, [_c('div', {\n staticStyle: {\n \"position\": \"absolute\",\n \"right\": \"0px\",\n \"top\": \"-14px\",\n \"width\": \"100%\",\n \"text-align\": \"right\"\n }\n }, [_vm._t(\"card-tools\")], 2)])]), _vm._t(\"default\")], 2);\n};\nvar Indexvue_type_template_id_0c5de06e_scoped_true_staticRenderFns = [];\n\n;// CONCATENATED MODULE: ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/card/Index.vue?vue&type=script&lang=js\n/* harmony default export */ var card_Indexvue_type_script_lang_js = ({\n name: 'Card',\n props: {\n title: {\n type: String,\n default: ''\n },\n shadow: {\n type: String,\n default: ''\n }\n }\n});\n;// CONCATENATED MODULE: ./src/components/card/Index.vue?vue&type=script&lang=js\n /* harmony default export */ var components_card_Indexvue_type_script_lang_js = (card_Indexvue_type_script_lang_js); \n;// CONCATENATED MODULE: ./node_modules/mini-css-extract-plugin/dist/loader.js??clonedRuleSet-22.use[0]!./node_modules/css-loader/dist/cjs.js??clonedRuleSet-22.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-22.use[2]!./node_modules/sass-loader/dist/cjs.js??clonedRuleSet-22.use[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/card/Index.vue?vue&type=style&index=0&id=0c5de06e&prod&lang=scss&scoped=true\n// extracted by mini-css-extract-plugin\n\n;// CONCATENATED MODULE: ./src/components/card/Index.vue?vue&type=style&index=0&id=0c5de06e&prod&lang=scss&scoped=true\n\n;// CONCATENATED MODULE: ./src/components/card/Index.vue\n\n\n\n;\n\n\n/* normalize component */\n\nvar card_Index_component = normalizeComponent(\n components_card_Indexvue_type_script_lang_js,\n Indexvue_type_template_id_0c5de06e_scoped_true_render,\n Indexvue_type_template_id_0c5de06e_scoped_true_staticRenderFns,\n false,\n null,\n \"0c5de06e\",\n null\n \n)\n\n/* harmony default export */ var card_Index = (card_Index_component.exports);\n;// CONCATENATED MODULE: ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/tree/Index.vue?vue&type=template&id=5e81e05e&scoped=true\nvar Indexvue_type_template_id_5e81e05e_scoped_true_render = function render() {\n var _vm = this,\n _c = _vm._self._c;\n return _vm.show ? _c('div', [_vm.data.length > 0 ? _vm._l(_vm.data, function (item) {\n return _c('auth-tree', {\n key: item.id,\n attrs: {\n \"data\": item,\n \"props\": _vm.props\n },\n on: {\n \"on-node-expand\": data => _vm.onExpand(data),\n \"on-node-checked\": data => _vm.onChecked(data)\n }\n });\n }) : _vm._e()], 2) : _vm._e();\n};\nvar Indexvue_type_template_id_5e81e05e_scoped_true_staticRenderFns = [];\n\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.array.push.js\nvar es_array_push = __webpack_require__(4114);\n;// CONCATENATED MODULE: ./src/components/tree/tree.js\n\n// 是否有子节点\nconst hasChildren = data => {\n return Array.isArray(data.children) && data.children.length > 0;\n};\n\n// 创建节点\nconst renderLabel = (h, data, context) => {\n const {\n props,\n listeners\n } = context;\n const clickHandler = listeners['on-node-expand'];\n const checkedHandler = listeners['on-node-checked'];\n const label = data[props.props.label];\n const childNodes = [];\n childNodes.push(label);\n const icoClass = [];\n if (hasChildren(data)) {\n if (data.expand) {\n icoClass.push('icon-icon-dwon');\n } else {\n icoClass.push('icon-icon_right');\n }\n }\n return h('li', {}, [h('i', {\n domProps: {\n className: `iconfont ${icoClass.join(' ')}`\n },\n style: {\n marginLeft: `${14 * data._leve}px`,\n fontSize: '12px',\n transform: 'translateY(-2px)',\n color: '#666'\n },\n on: {\n click: () => {\n clickHandler(data);\n }\n }\n }, ''), h('i', {\n domProps: {\n className: data.checked ? 'iconfont icon-fangxingxuanzhongfil' : 'iconfont icon-fangxingweixuanzhong'\n },\n style: {\n color: '#666'\n },\n on: {\n click: () => {\n checkedHandler(data);\n }\n }\n }, ''), h('span', {}, childNodes)]);\n};\n\n// 创建 node 子节点\nconst renderChildren = (h, list, expand, context) => {\n if (Array.isArray(list) && list.length) {\n const children = list.map(item => {\n return renderNode(h, item, context);\n });\n let cls = ['tree-node-children'];\n if (!expand) {\n cls.push('expand');\n }\n return h('div', {\n domProps: {\n className: cls.join(' ')\n }\n }, children);\n }\n return '';\n};\nconst renderNode = (h, data, context) => {\n const childNodes = [];\n childNodes.push(renderLabel(h, data, context));\n const children = data.children;\n if (hasChildren(data)) {\n childNodes.push(renderChildren(h, children, data.expand, context));\n }\n return h('ul', {\n domProps: {\n className: 'node'\n }\n }, childNodes);\n};\nconst tree_render = (h, context) => {\n const {\n props\n } = context;\n return renderNode(h, props.data, context);\n};\n/* harmony default export */ var tree = (tree_render);\n;// CONCATENATED MODULE: ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/tree/Index.vue?vue&type=script&lang=js\n\n\n/* harmony default export */ var tree_Indexvue_type_script_lang_js = ({\n name: 'Tree',\n components: {\n AuthTree: {\n render: tree,\n functional: true\n }\n },\n props: {\n data: {\n type: Array,\n default: () => {\n return [];\n }\n },\n props: {\n type: Object,\n default: () => {\n return {\n label: 'name'\n };\n }\n }\n },\n data() {\n return {\n name: 1,\n show: false,\n list: [],\n checked: false\n };\n },\n methods: {\n init(data, leve) {\n data._leve = leve;\n if (data.children && data.children.length > 0) {\n leve++;\n for (const i in data.children) {\n this.init(data.children[i], leve);\n }\n }\n },\n // 刷新\n refresh() {\n this.show = false;\n this.$nextTick(() => {\n this.show = true;\n });\n },\n // 展开/隐藏\n onExpand(data) {\n data.expand = !data.expand;\n this.refresh();\n },\n // 选中/取消选中\n onChecked(data) {\n data.checked = !data.checked;\n this.toolerChecked(this.data, data);\n this.setParentChecked(this.data);\n this.refresh();\n },\n toolerChecked(list, node) {\n for (const i in list) {\n if (list[i].id === node.id) {\n this.setChildChecked(list[i].children, list[i].checked);\n } else {\n this.toolerChecked(list[i].children, node);\n }\n }\n },\n // 选中节点时,设置子节点全选\n setChildChecked(children, checked) {\n for (const i in children) {\n children[i].checked = checked;\n this.setChildChecked(children[i].children, checked);\n }\n },\n // 设置父节点选中\n setParentChecked(data) {\n for (const i in data) {\n this.checked = false;\n if (data[i].children && data[i].children.length > 0) {\n this.childIsChecked(data[i].children);\n if (this.checked) {\n data[i].checked = this.checked;\n }\n this.setParentChecked(data[i].children);\n }\n }\n this.refresh();\n },\n // 判断节点的子节点是否有选中\n childIsChecked(children) {\n for (const i in children) {\n if (children[i].checked) {\n this.checked = true;\n } else {\n this.childIsChecked(children[i].children);\n }\n }\n },\n // 设置默认选中\n setDefaultChecked(defaultIds) {\n for (const i in defaultIds) {\n this.setChecked(this.data, defaultIds[i]);\n }\n this.setParentChecked(this.data);\n },\n // 根据所给的id,设置改项选中\n setChecked(data, id) {\n for (const i in data) {\n if (data[i].id === id) {\n data[i].checked = true;\n break;\n } else {\n if (data[i].children && data[i].children.length > 0) {\n this.setChecked(data[i].children, id);\n }\n }\n }\n },\n // 获取选中选的key\n getCheckedKeys() {\n const keys = [];\n this._getCheckedKeys(this.data, keys);\n return keys;\n },\n // 遍历出选中选的key\n _getCheckedKeys(data, keys) {\n for (const i in data) {\n if (data[i].checked) {\n keys.push(data[i].id);\n }\n if (data[i].children && data[i].children.length > 0) {\n this._getCheckedKeys(data[i].children, keys);\n }\n }\n },\n // 获取选中选的节点\n getCheckedNodes() {\n const nodes = [];\n this._getCheckedNodes(this.data, nodes);\n return nodes;\n },\n // 遍历出选中选的节点\n _getCheckedNodes(data, nodes) {\n for (const i in data) {\n if (data[i].checked) {\n nodes.push(data[i]);\n }\n if (data[i].children && data[i].children.length > 0) {\n this._getCheckedNodes(data[i].children, nodes);\n }\n }\n }\n },\n watch: {\n data: {\n handler() {\n for (const i in this.data) {\n this.init(this.data[i], 0);\n }\n this.refresh();\n },\n immediate: true,\n deep: true\n }\n }\n});\n;// CONCATENATED MODULE: ./src/components/tree/Index.vue?vue&type=script&lang=js\n /* harmony default export */ var components_tree_Indexvue_type_script_lang_js = (tree_Indexvue_type_script_lang_js); \n;// CONCATENATED MODULE: ./node_modules/mini-css-extract-plugin/dist/loader.js??clonedRuleSet-22.use[0]!./node_modules/css-loader/dist/cjs.js??clonedRuleSet-22.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-22.use[2]!./node_modules/sass-loader/dist/cjs.js??clonedRuleSet-22.use[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/tree/Index.vue?vue&type=style&index=0&id=5e81e05e&prod&lang=scss&scoped=true\n// extracted by mini-css-extract-plugin\n\n;// CONCATENATED MODULE: ./src/components/tree/Index.vue?vue&type=style&index=0&id=5e81e05e&prod&lang=scss&scoped=true\n\n;// CONCATENATED MODULE: ./src/components/tree/Index.vue\n\n\n\n;\n\n\n/* normalize component */\n\nvar tree_Index_component = normalizeComponent(\n components_tree_Indexvue_type_script_lang_js,\n Indexvue_type_template_id_5e81e05e_scoped_true_render,\n Indexvue_type_template_id_5e81e05e_scoped_true_staticRenderFns,\n false,\n null,\n \"5e81e05e\",\n null\n \n)\n\n/* harmony default export */ var tree_Index = (tree_Index_component.exports);\n;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/checkPrivateRedeclaration.js\nfunction _checkPrivateRedeclaration(obj, privateCollection) {\n if (privateCollection.has(obj)) {\n throw new TypeError(\"Cannot initialize the same private elements twice on an object\");\n }\n}\n;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/classPrivateFieldInitSpec.js\n\nfunction _classPrivateFieldInitSpec(obj, privateMap, value) {\n _checkPrivateRedeclaration(obj, privateMap);\n privateMap.set(obj, value);\n}\n;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/assertClassBrand.js\nfunction _assertClassBrand(e, t, n) {\n if (\"function\" == typeof e ? e === t : e.has(t)) return arguments.length < 3 ? t : n;\n throw new TypeError(\"Private element is not present on this object\");\n}\n;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/classPrivateFieldSet2.js\n\nfunction _classPrivateFieldSet2(s, a, r) {\n return s.set(_assertClassBrand(s, a), r), r;\n}\n;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/classPrivateFieldGet2.js\n\nfunction _classPrivateFieldGet2(s, a) {\n return s.get(_assertClassBrand(s, a));\n}\n// EXTERNAL MODULE: ./node_modules/core-js/modules/web.url-search-params.delete.js\nvar web_url_search_params_delete = __webpack_require__(4603);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/web.url-search-params.has.js\nvar web_url_search_params_has = __webpack_require__(7566);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/web.url-search-params.size.js\nvar web_url_search_params_size = __webpack_require__(8721);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.typed-array.to-reversed.js\nvar es_typed_array_to_reversed = __webpack_require__(7467);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.typed-array.to-sorted.js\nvar es_typed_array_to_sorted = __webpack_require__(4732);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es.typed-array.with.js\nvar es_typed_array_with = __webpack_require__(9577);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/esnext.array-buffer.detached.js\nvar esnext_array_buffer_detached = __webpack_require__(6280);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/esnext.array-buffer.transfer.js\nvar esnext_array_buffer_transfer = __webpack_require__(7913);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/esnext.array-buffer.transfer-to-fixed-length.js\nvar esnext_array_buffer_transfer_to_fixed_length = __webpack_require__(7801);\n;// CONCATENATED MODULE: ./node_modules/axios/lib/helpers/bind.js\n\n\nfunction bind(fn, thisArg) {\n return function wrap() {\n return fn.apply(thisArg, arguments);\n };\n}\n;// CONCATENATED MODULE: ./node_modules/axios/lib/utils.js\n\n\n\n\n\n\n\n\n\n\n\n// utils is a library of generic helper functions non-specific to axios\n\nconst {\n toString: utils_toString\n} = Object.prototype;\nconst {\n getPrototypeOf\n} = Object;\nconst kindOf = (cache => thing => {\n const str = utils_toString.call(thing);\n return cache[str] || (cache[str] = str.slice(8, -1).toLowerCase());\n})(Object.create(null));\nconst kindOfTest = type => {\n type = type.toLowerCase();\n return thing => kindOf(thing) === type;\n};\nconst typeOfTest = type => thing => typeof thing === type;\n\n/**\n * Determine if a value is an Array\n *\n * @param {Object} val The value to test\n *\n * @returns {boolean} True if value is an Array, otherwise false\n */\nconst {\n isArray\n} = Array;\n\n/**\n * Determine if a value is undefined\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if the value is undefined, otherwise false\n */\nconst isUndefined = typeOfTest('undefined');\n\n/**\n * Determine if a value is a Buffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Buffer, otherwise false\n */\nfunction isBuffer(val) {\n return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor) && isFunction(val.constructor.isBuffer) && val.constructor.isBuffer(val);\n}\n\n/**\n * Determine if a value is an ArrayBuffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is an ArrayBuffer, otherwise false\n */\nconst isArrayBuffer = kindOfTest('ArrayBuffer');\n\n/**\n * Determine if a value is a view on an ArrayBuffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false\n */\nfunction isArrayBufferView(val) {\n let result;\n if (typeof ArrayBuffer !== 'undefined' && ArrayBuffer.isView) {\n result = ArrayBuffer.isView(val);\n } else {\n result = val && val.buffer && isArrayBuffer(val.buffer);\n }\n return result;\n}\n\n/**\n * Determine if a value is a String\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a String, otherwise false\n */\nconst isString = typeOfTest('string');\n\n/**\n * Determine if a value is a Function\n *\n * @param {*} val The value to test\n * @returns {boolean} True if value is a Function, otherwise false\n */\nconst isFunction = typeOfTest('function');\n\n/**\n * Determine if a value is a Number\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Number, otherwise false\n */\nconst isNumber = typeOfTest('number');\n\n/**\n * Determine if a value is an Object\n *\n * @param {*} thing The value to test\n *\n * @returns {boolean} True if value is an Object, otherwise false\n */\nconst isObject = thing => thing !== null && typeof thing === 'object';\n\n/**\n * Determine if a value is a Boolean\n *\n * @param {*} thing The value to test\n * @returns {boolean} True if value is a Boolean, otherwise false\n */\nconst isBoolean = thing => thing === true || thing === false;\n\n/**\n * Determine if a value is a plain Object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a plain Object, otherwise false\n */\nconst isPlainObject = val => {\n if (kindOf(val) !== 'object') {\n return false;\n }\n const prototype = getPrototypeOf(val);\n return (prototype === null || prototype === Object.prototype || Object.getPrototypeOf(prototype) === null) && !(Symbol.toStringTag in val) && !(Symbol.iterator in val);\n};\n\n/**\n * Determine if a value is a Date\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Date, otherwise false\n */\nconst isDate = kindOfTest('Date');\n\n/**\n * Determine if a value is a File\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a File, otherwise false\n */\nconst isFile = kindOfTest('File');\n\n/**\n * Determine if a value is a Blob\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Blob, otherwise false\n */\nconst isBlob = kindOfTest('Blob');\n\n/**\n * Determine if a value is a FileList\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a File, otherwise false\n */\nconst isFileList = kindOfTest('FileList');\n\n/**\n * Determine if a value is a Stream\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Stream, otherwise false\n */\nconst isStream = val => isObject(val) && isFunction(val.pipe);\n\n/**\n * Determine if a value is a FormData\n *\n * @param {*} thing The value to test\n *\n * @returns {boolean} True if value is an FormData, otherwise false\n */\nconst isFormData = thing => {\n let kind;\n return thing && (typeof FormData === 'function' && thing instanceof FormData || isFunction(thing.append) && ((kind = kindOf(thing)) === 'formdata' ||\n // detect form-data instance\n kind === 'object' && isFunction(thing.toString) && thing.toString() === '[object FormData]'));\n};\n\n/**\n * Determine if a value is a URLSearchParams object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a URLSearchParams object, otherwise false\n */\nconst isURLSearchParams = kindOfTest('URLSearchParams');\n\n/**\n * Trim excess whitespace off the beginning and end of a string\n *\n * @param {String} str The String to trim\n *\n * @returns {String} The String freed of excess whitespace\n */\nconst trim = str => str.trim ? str.trim() : str.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n\n/**\n * Iterate over an Array or an Object invoking a function for each item.\n *\n * If `obj` is an Array callback will be called passing\n * the value, index, and complete array for each item.\n *\n * If 'obj' is an Object callback will be called passing\n * the value, key, and complete object for each property.\n *\n * @param {Object|Array} obj The object to iterate\n * @param {Function} fn The callback to invoke for each item\n *\n * @param {Boolean} [allOwnKeys = false]\n * @returns {any}\n */\nfunction forEach(obj, fn, {\n allOwnKeys = false\n} = {}) {\n // Don't bother if no value provided\n if (obj === null || typeof obj === 'undefined') {\n return;\n }\n let i;\n let l;\n\n // Force an array if not already something iterable\n if (typeof obj !== 'object') {\n /*eslint no-param-reassign:0*/\n obj = [obj];\n }\n if (isArray(obj)) {\n // Iterate over array values\n for (i = 0, l = obj.length; i < l; i++) {\n fn.call(null, obj[i], i, obj);\n }\n } else {\n // Iterate over object keys\n const keys = allOwnKeys ? Object.getOwnPropertyNames(obj) : Object.keys(obj);\n const len = keys.length;\n let key;\n for (i = 0; i < len; i++) {\n key = keys[i];\n fn.call(null, obj[key], key, obj);\n }\n }\n}\nfunction findKey(obj, key) {\n key = key.toLowerCase();\n const keys = Object.keys(obj);\n let i = keys.length;\n let _key;\n while (i-- > 0) {\n _key = keys[i];\n if (key === _key.toLowerCase()) {\n return _key;\n }\n }\n return null;\n}\nconst _global = (() => {\n /*eslint no-undef:0*/\n if (typeof globalThis !== \"undefined\") return globalThis;\n return typeof self !== \"undefined\" ? self : typeof window !== 'undefined' ? window : global;\n})();\nconst isContextDefined = context => !isUndefined(context) && context !== _global;\n\n/**\n * Accepts varargs expecting each argument to be an object, then\n * immutably merges the properties of each object and returns result.\n *\n * When multiple objects contain the same key the later object in\n * the arguments list will take precedence.\n *\n * Example:\n *\n * ```js\n * var result = merge({foo: 123}, {foo: 456});\n * console.log(result.foo); // outputs 456\n * ```\n *\n * @param {Object} obj1 Object to merge\n *\n * @returns {Object} Result of all merge properties\n */\nfunction merge( /* obj1, obj2, obj3, ... */\n) {\n const {\n caseless\n } = isContextDefined(this) && this || {};\n const result = {};\n const assignValue = (val, key) => {\n const targetKey = caseless && findKey(result, key) || key;\n if (isPlainObject(result[targetKey]) && isPlainObject(val)) {\n result[targetKey] = merge(result[targetKey], val);\n } else if (isPlainObject(val)) {\n result[targetKey] = merge({}, val);\n } else if (isArray(val)) {\n result[targetKey] = val.slice();\n } else {\n result[targetKey] = val;\n }\n };\n for (let i = 0, l = arguments.length; i < l; i++) {\n arguments[i] && forEach(arguments[i], assignValue);\n }\n return result;\n}\n\n/**\n * Extends object a by mutably adding to it the properties of object b.\n *\n * @param {Object} a The object to be extended\n * @param {Object} b The object to copy properties from\n * @param {Object} thisArg The object to bind function to\n *\n * @param {Boolean} [allOwnKeys]\n * @returns {Object} The resulting value of object a\n */\nconst extend = (a, b, thisArg, {\n allOwnKeys\n} = {}) => {\n forEach(b, (val, key) => {\n if (thisArg && isFunction(val)) {\n a[key] = bind(val, thisArg);\n } else {\n a[key] = val;\n }\n }, {\n allOwnKeys\n });\n return a;\n};\n\n/**\n * Remove byte order marker. This catches EF BB BF (the UTF-8 BOM)\n *\n * @param {string} content with BOM\n *\n * @returns {string} content value without BOM\n */\nconst stripBOM = content => {\n if (content.charCodeAt(0) === 0xFEFF) {\n content = content.slice(1);\n }\n return content;\n};\n\n/**\n * Inherit the prototype methods from one constructor into another\n * @param {function} constructor\n * @param {function} superConstructor\n * @param {object} [props]\n * @param {object} [descriptors]\n *\n * @returns {void}\n */\nconst inherits = (constructor, superConstructor, props, descriptors) => {\n constructor.prototype = Object.create(superConstructor.prototype, descriptors);\n constructor.prototype.constructor = constructor;\n Object.defineProperty(constructor, 'super', {\n value: superConstructor.prototype\n });\n props && Object.assign(constructor.prototype, props);\n};\n\n/**\n * Resolve object with deep prototype chain to a flat object\n * @param {Object} sourceObj source object\n * @param {Object} [destObj]\n * @param {Function|Boolean} [filter]\n * @param {Function} [propFilter]\n *\n * @returns {Object}\n */\nconst toFlatObject = (sourceObj, destObj, filter, propFilter) => {\n let props;\n let i;\n let prop;\n const merged = {};\n destObj = destObj || {};\n // eslint-disable-next-line no-eq-null,eqeqeq\n if (sourceObj == null) return destObj;\n do {\n props = Object.getOwnPropertyNames(sourceObj);\n i = props.length;\n while (i-- > 0) {\n prop = props[i];\n if ((!propFilter || propFilter(prop, sourceObj, destObj)) && !merged[prop]) {\n destObj[prop] = sourceObj[prop];\n merged[prop] = true;\n }\n }\n sourceObj = filter !== false && getPrototypeOf(sourceObj);\n } while (sourceObj && (!filter || filter(sourceObj, destObj)) && sourceObj !== Object.prototype);\n return destObj;\n};\n\n/**\n * Determines whether a string ends with the characters of a specified string\n *\n * @param {String} str\n * @param {String} searchString\n * @param {Number} [position= 0]\n *\n * @returns {boolean}\n */\nconst endsWith = (str, searchString, position) => {\n str = String(str);\n if (position === undefined || position > str.length) {\n position = str.length;\n }\n position -= searchString.length;\n const lastIndex = str.indexOf(searchString, position);\n return lastIndex !== -1 && lastIndex === position;\n};\n\n/**\n * Returns new array from array like object or null if failed\n *\n * @param {*} [thing]\n *\n * @returns {?Array}\n */\nconst toArray = thing => {\n if (!thing) return null;\n if (isArray(thing)) return thing;\n let i = thing.length;\n if (!isNumber(i)) return null;\n const arr = new Array(i);\n while (i-- > 0) {\n arr[i] = thing[i];\n }\n return arr;\n};\n\n/**\n * Checking if the Uint8Array exists and if it does, it returns a function that checks if the\n * thing passed in is an instance of Uint8Array\n *\n * @param {TypedArray}\n *\n * @returns {Array}\n */\n// eslint-disable-next-line func-names\nconst isTypedArray = (TypedArray => {\n // eslint-disable-next-line func-names\n return thing => {\n return TypedArray && thing instanceof TypedArray;\n };\n})(typeof Uint8Array !== 'undefined' && getPrototypeOf(Uint8Array));\n\n/**\n * For each entry in the object, call the function with the key and value.\n *\n * @param {Object<any, any>} obj - The object to iterate over.\n * @param {Function} fn - The function to call for each entry.\n *\n * @returns {void}\n */\nconst forEachEntry = (obj, fn) => {\n const generator = obj && obj[Symbol.iterator];\n const iterator = generator.call(obj);\n let result;\n while ((result = iterator.next()) && !result.done) {\n const pair = result.value;\n fn.call(obj, pair[0], pair[1]);\n }\n};\n\n/**\n * It takes a regular expression and a string, and returns an array of all the matches\n *\n * @param {string} regExp - The regular expression to match against.\n * @param {string} str - The string to search.\n *\n * @returns {Array<boolean>}\n */\nconst matchAll = (regExp, str) => {\n let matches;\n const arr = [];\n while ((matches = regExp.exec(str)) !== null) {\n arr.push(matches);\n }\n return arr;\n};\n\n/* Checking if the kindOfTest function returns true when passed an HTMLFormElement. */\nconst isHTMLForm = kindOfTest('HTMLFormElement');\nconst toCamelCase = str => {\n return str.toLowerCase().replace(/[-_\\s]([a-z\\d])(\\w*)/g, function replacer(m, p1, p2) {\n return p1.toUpperCase() + p2;\n });\n};\n\n/* Creating a function that will check if an object has a property. */\nconst utils_hasOwnProperty = (({\n hasOwnProperty\n}) => (obj, prop) => hasOwnProperty.call(obj, prop))(Object.prototype);\n\n/**\n * Determine if a value is a RegExp object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a RegExp object, otherwise false\n */\nconst isRegExp = kindOfTest('RegExp');\nconst reduceDescriptors = (obj, reducer) => {\n const descriptors = Object.getOwnPropertyDescriptors(obj);\n const reducedDescriptors = {};\n forEach(descriptors, (descriptor, name) => {\n let ret;\n if ((ret = reducer(descriptor, name, obj)) !== false) {\n reducedDescriptors[name] = ret || descriptor;\n }\n });\n Object.defineProperties(obj, reducedDescriptors);\n};\n\n/**\n * Makes all methods read-only\n * @param {Object} obj\n */\n\nconst freezeMethods = obj => {\n reduceDescriptors(obj, (descriptor, name) => {\n // skip restricted props in strict mode\n if (isFunction(obj) && ['arguments', 'caller', 'callee'].indexOf(name) !== -1) {\n return false;\n }\n const value = obj[name];\n if (!isFunction(value)) return;\n descriptor.enumerable = false;\n if ('writable' in descriptor) {\n descriptor.writable = false;\n return;\n }\n if (!descriptor.set) {\n descriptor.set = () => {\n throw Error('Can not rewrite read-only method \\'' + name + '\\'');\n };\n }\n });\n};\nconst toObjectSet = (arrayOrString, delimiter) => {\n const obj = {};\n const define = arr => {\n arr.forEach(value => {\n obj[value] = true;\n });\n };\n isArray(arrayOrString) ? define(arrayOrString) : define(String(arrayOrString).split(delimiter));\n return obj;\n};\nconst noop = () => {};\nconst toFiniteNumber = (value, defaultValue) => {\n value = +value;\n return Number.isFinite(value) ? value : defaultValue;\n};\nconst ALPHA = 'abcdefghijklmnopqrstuvwxyz';\nconst DIGIT = '0123456789';\nconst ALPHABET = {\n DIGIT,\n ALPHA,\n ALPHA_DIGIT: ALPHA + ALPHA.toUpperCase() + DIGIT\n};\nconst generateString = (size = 16, alphabet = ALPHABET.ALPHA_DIGIT) => {\n let str = '';\n const {\n length\n } = alphabet;\n while (size--) {\n str += alphabet[Math.random() * length | 0];\n }\n return str;\n};\n\n/**\n * If the thing is a FormData object, return true, otherwise return false.\n *\n * @param {unknown} thing - The thing to check.\n *\n * @returns {boolean}\n */\nfunction isSpecCompliantForm(thing) {\n return !!(thing && isFunction(thing.append) && thing[Symbol.toStringTag] === 'FormData' && thing[Symbol.iterator]);\n}\nconst toJSONObject = obj => {\n const stack = new Array(10);\n const visit = (source, i) => {\n if (isObject(source)) {\n if (stack.indexOf(source) >= 0) {\n return;\n }\n if (!('toJSON' in source)) {\n stack[i] = source;\n const target = isArray(source) ? [] : {};\n forEach(source, (value, key) => {\n const reducedValue = visit(value, i + 1);\n !isUndefined(reducedValue) && (target[key] = reducedValue);\n });\n stack[i] = undefined;\n return target;\n }\n }\n return source;\n };\n return visit(obj, 0);\n};\nconst isAsyncFn = kindOfTest('AsyncFunction');\nconst isThenable = thing => thing && (isObject(thing) || isFunction(thing)) && isFunction(thing.then) && isFunction(thing.catch);\n/* harmony default export */ var utils = ({\n isArray,\n isArrayBuffer,\n isBuffer,\n isFormData,\n isArrayBufferView,\n isString,\n isNumber,\n isBoolean,\n isObject,\n isPlainObject,\n isUndefined,\n isDate,\n isFile,\n isBlob,\n isRegExp,\n isFunction,\n isStream,\n isURLSearchParams,\n isTypedArray,\n isFileList,\n forEach,\n merge,\n extend,\n trim,\n stripBOM,\n inherits,\n toFlatObject,\n kindOf,\n kindOfTest,\n endsWith,\n toArray,\n forEachEntry,\n matchAll,\n isHTMLForm,\n hasOwnProperty: utils_hasOwnProperty,\n hasOwnProp: utils_hasOwnProperty,\n // an alias to avoid ESLint no-prototype-builtins detection\n reduceDescriptors,\n freezeMethods,\n toObjectSet,\n toCamelCase,\n noop,\n toFiniteNumber,\n findKey,\n global: _global,\n isContextDefined,\n ALPHABET,\n generateString,\n isSpecCompliantForm,\n toJSONObject,\n isAsyncFn,\n isThenable\n});\n;// CONCATENATED MODULE: ./node_modules/axios/lib/core/AxiosError.js\n\n\n\n\n/**\n * Create an Error with the specified message, config, error code, request and response.\n *\n * @param {string} message The error message.\n * @param {string} [code] The error code (for example, 'ECONNABORTED').\n * @param {Object} [config] The config.\n * @param {Object} [request] The request.\n * @param {Object} [response] The response.\n *\n * @returns {Error} The created error.\n */\nfunction AxiosError(message, code, config, request, response) {\n Error.call(this);\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n } else {\n this.stack = new Error().stack;\n }\n this.message = message;\n this.name = 'AxiosError';\n code && (this.code = code);\n config && (this.config = config);\n request && (this.request = request);\n response && (this.response = response);\n}\nutils.inherits(AxiosError, Error, {\n toJSON: function toJSON() {\n return {\n // Standard\n message: this.message,\n name: this.name,\n // Microsoft\n description: this.description,\n number: this.number,\n // Mozilla\n fileName: this.fileName,\n lineNumber: this.lineNumber,\n columnNumber: this.columnNumber,\n stack: this.stack,\n // Axios\n config: utils.toJSONObject(this.config),\n code: this.code,\n status: this.response && this.response.status ? this.response.status : null\n };\n }\n});\nconst AxiosError_prototype = AxiosError.prototype;\nconst descriptors = {};\n['ERR_BAD_OPTION_VALUE', 'ERR_BAD_OPTION', 'ECONNABORTED', 'ETIMEDOUT', 'ERR_NETWORK', 'ERR_FR_TOO_MANY_REDIRECTS', 'ERR_DEPRECATED', 'ERR_BAD_RESPONSE', 'ERR_BAD_REQUEST', 'ERR_CANCELED', 'ERR_NOT_SUPPORT', 'ERR_INVALID_URL'\n// eslint-disable-next-line func-names\n].forEach(code => {\n descriptors[code] = {\n value: code\n };\n});\nObject.defineProperties(AxiosError, descriptors);\nObject.defineProperty(AxiosError_prototype, 'isAxiosError', {\n value: true\n});\n\n// eslint-disable-next-line func-names\nAxiosError.from = (error, code, config, request, response, customProps) => {\n const axiosError = Object.create(AxiosError_prototype);\n utils.toFlatObject(error, axiosError, function filter(obj) {\n return obj !== Error.prototype;\n }, prop => {\n return prop !== 'isAxiosError';\n });\n AxiosError.call(axiosError, error.message, code, config, request, response);\n axiosError.cause = error;\n axiosError.name = error.name;\n customProps && Object.assign(axiosError, customProps);\n return axiosError;\n};\n/* harmony default export */ var core_AxiosError = (AxiosError);\n;// CONCATENATED MODULE: ./node_modules/axios/lib/helpers/null.js\n// eslint-disable-next-line strict\n/* harmony default export */ var helpers_null = (null);\n;// CONCATENATED MODULE: ./node_modules/axios/lib/helpers/toFormData.js\n\n\n\n\n\n// temporary hotfix to avoid circular references until AxiosURLSearchParams is refactored\n\n\n/**\n * Determines if the given thing is a array or js object.\n *\n * @param {string} thing - The object or array to be visited.\n *\n * @returns {boolean}\n */\nfunction isVisitable(thing) {\n return utils.isPlainObject(thing) || utils.isArray(thing);\n}\n\n/**\n * It removes the brackets from the end of a string\n *\n * @param {string} key - The key of the parameter.\n *\n * @returns {string} the key without the brackets.\n */\nfunction removeBrackets(key) {\n return utils.endsWith(key, '[]') ? key.slice(0, -2) : key;\n}\n\n/**\n * It takes a path, a key, and a boolean, and returns a string\n *\n * @param {string} path - The path to the current key.\n * @param {string} key - The key of the current object being iterated over.\n * @param {string} dots - If true, the key will be rendered with dots instead of brackets.\n *\n * @returns {string} The path to the current key.\n */\nfunction renderKey(path, key, dots) {\n if (!path) return key;\n return path.concat(key).map(function each(token, i) {\n // eslint-disable-next-line no-param-reassign\n token = removeBrackets(token);\n return !dots && i ? '[' + token + ']' : token;\n }).join(dots ? '.' : '');\n}\n\n/**\n * If the array is an array and none of its elements are visitable, then it's a flat array.\n *\n * @param {Array<any>} arr - The array to check\n *\n * @returns {boolean}\n */\nfunction isFlatArray(arr) {\n return utils.isArray(arr) && !arr.some(isVisitable);\n}\nconst predicates = utils.toFlatObject(utils, {}, null, function filter(prop) {\n return /^is[A-Z]/.test(prop);\n});\n\n/**\n * Convert a data object to FormData\n *\n * @param {Object} obj\n * @param {?Object} [formData]\n * @param {?Object} [options]\n * @param {Function} [options.visitor]\n * @param {Boolean} [options.metaTokens = true]\n * @param {Boolean} [options.dots = false]\n * @param {?Boolean} [options.indexes = false]\n *\n * @returns {Object}\n **/\n\n/**\n * It converts an object into a FormData object\n *\n * @param {Object<any, any>} obj - The object to convert to form data.\n * @param {string} formData - The FormData object to append to.\n * @param {Object<string, any>} options\n *\n * @returns\n */\nfunction toFormData(obj, formData, options) {\n if (!utils.isObject(obj)) {\n throw new TypeError('target must be an object');\n }\n\n // eslint-disable-next-line no-param-reassign\n formData = formData || new (helpers_null || FormData)();\n\n // eslint-disable-next-line no-param-reassign\n options = utils.toFlatObject(options, {\n metaTokens: true,\n dots: false,\n indexes: false\n }, false, function defined(option, source) {\n // eslint-disable-next-line no-eq-null,eqeqeq\n return !utils.isUndefined(source[option]);\n });\n const metaTokens = options.metaTokens;\n // eslint-disable-next-line no-use-before-define\n const visitor = options.visitor || defaultVisitor;\n const dots = options.dots;\n const indexes = options.indexes;\n const _Blob = options.Blob || typeof Blob !== 'undefined' && Blob;\n const useBlob = _Blob && utils.isSpecCompliantForm(formData);\n if (!utils.isFunction(visitor)) {\n throw new TypeError('visitor must be a function');\n }\n function convertValue(value) {\n if (value === null) return '';\n if (utils.isDate(value)) {\n return value.toISOString();\n }\n if (!useBlob && utils.isBlob(value)) {\n throw new core_AxiosError('Blob is not supported. Use a Buffer instead.');\n }\n if (utils.isArrayBuffer(value) || utils.isTypedArray(value)) {\n return useBlob && typeof Blob === 'function' ? new Blob([value]) : Buffer.from(value);\n }\n return value;\n }\n\n /**\n * Default visitor.\n *\n * @param {*} value\n * @param {String|Number} key\n * @param {Array<String|Number>} path\n * @this {FormData}\n *\n * @returns {boolean} return true to visit the each prop of the value recursively\n */\n function defaultVisitor(value, key, path) {\n let arr = value;\n if (value && !path && typeof value === 'object') {\n if (utils.endsWith(key, '{}')) {\n // eslint-disable-next-line no-param-reassign\n key = metaTokens ? key : key.slice(0, -2);\n // eslint-disable-next-line no-param-reassign\n value = JSON.stringify(value);\n } else if (utils.isArray(value) && isFlatArray(value) || (utils.isFileList(value) || utils.endsWith(key, '[]')) && (arr = utils.toArray(value))) {\n // eslint-disable-next-line no-param-reassign\n key = removeBrackets(key);\n arr.forEach(function each(el, index) {\n !(utils.isUndefined(el) || el === null) && formData.append(\n // eslint-disable-next-line no-nested-ternary\n indexes === true ? renderKey([key], index, dots) : indexes === null ? key : key + '[]', convertValue(el));\n });\n return false;\n }\n }\n if (isVisitable(value)) {\n return true;\n }\n formData.append(renderKey(path, key, dots), convertValue(value));\n return false;\n }\n const stack = [];\n const exposedHelpers = Object.assign(predicates, {\n defaultVisitor,\n convertValue,\n isVisitable\n });\n function build(value, path) {\n if (utils.isUndefined(value)) return;\n if (stack.indexOf(value) !== -1) {\n throw Error('Circular reference detected in ' + path.join('.'));\n }\n stack.push(value);\n utils.forEach(value, function each(el, key) {\n const result = !(utils.isUndefined(el) || el === null) && visitor.call(formData, el, utils.isString(key) ? key.trim() : key, path, exposedHelpers);\n if (result === true) {\n build(el, path ? path.concat(key) : [key]);\n }\n });\n stack.pop();\n }\n if (!utils.isObject(obj)) {\n throw new TypeError('data must be an object');\n }\n build(obj);\n return formData;\n}\n/* harmony default export */ var helpers_toFormData = (toFormData);\n;// CONCATENATED MODULE: ./node_modules/axios/lib/helpers/AxiosURLSearchParams.js\n\n\n\n\n\n/**\n * It encodes a string by replacing all characters that are not in the unreserved set with\n * their percent-encoded equivalents\n *\n * @param {string} str - The string to encode.\n *\n * @returns {string} The encoded string.\n */\nfunction encode(str) {\n const charMap = {\n '!': '%21',\n \"'\": '%27',\n '(': '%28',\n ')': '%29',\n '~': '%7E',\n '%20': '+',\n '%00': '\\x00'\n };\n return encodeURIComponent(str).replace(/[!'()~]|%20|%00/g, function replacer(match) {\n return charMap[match];\n });\n}\n\n/**\n * It takes a params object and converts it to a FormData object\n *\n * @param {Object<string, any>} params - The parameters to be converted to a FormData object.\n * @param {Object<string, any>} options - The options object passed to the Axios constructor.\n *\n * @returns {void}\n */\nfunction AxiosURLSearchParams(params, options) {\n this._pairs = [];\n params && helpers_toFormData(params, this, options);\n}\nconst AxiosURLSearchParams_prototype = AxiosURLSearchParams.prototype;\nAxiosURLSearchParams_prototype.append = function append(name, value) {\n this._pairs.push([name, value]);\n};\nAxiosURLSearchParams_prototype.toString = function toString(encoder) {\n const _encode = encoder ? function (value) {\n return encoder.call(this, value, encode);\n } : encode;\n return this._pairs.map(function each(pair) {\n return _encode(pair[0]) + '=' + _encode(pair[1]);\n }, '').join('&');\n};\n/* harmony default export */ var helpers_AxiosURLSearchParams = (AxiosURLSearchParams);\n;// CONCATENATED MODULE: ./node_modules/axios/lib/helpers/buildURL.js\n\n\n\n\n\n/**\n * It replaces all instances of the characters `:`, `$`, `,`, `+`, `[`, and `]` with their\n * URI encoded counterparts\n *\n * @param {string} val The value to be encoded.\n *\n * @returns {string} The encoded value.\n */\nfunction buildURL_encode(val) {\n return encodeURIComponent(val).replace(/%3A/gi, ':').replace(/%24/g, '$').replace(/%2C/gi, ',').replace(/%20/g, '+').replace(/%5B/gi, '[').replace(/%5D/gi, ']');\n}\n\n/**\n * Build a URL by appending params to the end\n *\n * @param {string} url The base of the url (e.g., http://www.google.com)\n * @param {object} [params] The params to be appended\n * @param {?object} options\n *\n * @returns {string} The formatted url\n */\nfunction buildURL(url, params, options) {\n /*eslint no-param-reassign:0*/\n if (!params) {\n return url;\n }\n const _encode = options && options.encode || buildURL_encode;\n const serializeFn = options && options.serialize;\n let serializedParams;\n if (serializeFn) {\n serializedParams = serializeFn(params, options);\n } else {\n serializedParams = utils.isURLSearchParams(params) ? params.toString() : new helpers_AxiosURLSearchParams(params, options).toString(_encode);\n }\n if (serializedParams) {\n const hashmarkIndex = url.indexOf(\"#\");\n if (hashmarkIndex !== -1) {\n url = url.slice(0, hashmarkIndex);\n }\n url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams;\n }\n return url;\n}\n;// CONCATENATED MODULE: ./node_modules/axios/lib/core/InterceptorManager.js\n\n\n\n\nclass InterceptorManager {\n constructor() {\n this.handlers = [];\n }\n\n /**\n * Add a new interceptor to the stack\n *\n * @param {Function} fulfilled The function to handle `then` for a `Promise`\n * @param {Function} rejected The function to handle `reject` for a `Promise`\n *\n * @return {Number} An ID used to remove interceptor later\n */\n use(fulfilled, rejected, options) {\n this.handlers.push({\n fulfilled,\n rejected,\n synchronous: options ? options.synchronous : false,\n runWhen: options ? options.runWhen : null\n });\n return this.handlers.length - 1;\n }\n\n /**\n * Remove an interceptor from the stack\n *\n * @param {Number} id The ID that was returned by `use`\n *\n * @returns {Boolean} `true` if the interceptor was removed, `false` otherwise\n */\n eject(id) {\n if (this.handlers[id]) {\n this.handlers[id] = null;\n }\n }\n\n /**\n * Clear all interceptors from the stack\n *\n * @returns {void}\n */\n clear() {\n if (this.handlers) {\n this.handlers = [];\n }\n }\n\n /**\n * Iterate over all the registered interceptors\n *\n * This method is particularly useful for skipping over any\n * interceptors that may have become `null` calling `eject`.\n *\n * @param {Function} fn The function to call for each interceptor\n *\n * @returns {void}\n */\n forEach(fn) {\n utils.forEach(this.handlers, function forEachHandler(h) {\n if (h !== null) {\n fn(h);\n }\n });\n }\n}\n/* harmony default export */ var core_InterceptorManager = (InterceptorManager);\n;// CONCATENATED MODULE: ./node_modules/axios/lib/defaults/transitional.js\n\n\n/* harmony default export */ var defaults_transitional = ({\n silentJSONParsing: true,\n forcedJSONParsing: true,\n clarifyTimeoutError: false\n});\n;// CONCATENATED MODULE: ./node_modules/axios/lib/platform/browser/classes/URLSearchParams.js\n\n\n\n\n\n\n/* harmony default export */ var classes_URLSearchParams = (typeof URLSearchParams !== 'undefined' ? URLSearchParams : helpers_AxiosURLSearchParams);\n;// CONCATENATED MODULE: ./node_modules/axios/lib/platform/browser/classes/FormData.js\n\n\n/* harmony default export */ var classes_FormData = (typeof FormData !== 'undefined' ? FormData : null);\n;// CONCATENATED MODULE: ./node_modules/axios/lib/platform/browser/classes/Blob.js\n\n\n/* harmony default export */ var classes_Blob = (typeof Blob !== 'undefined' ? Blob : null);\n;// CONCATENATED MODULE: ./node_modules/axios/lib/platform/browser/index.js\n\n\n\n/* harmony default export */ var browser = ({\n isBrowser: true,\n classes: {\n URLSearchParams: classes_URLSearchParams,\n FormData: classes_FormData,\n Blob: classes_Blob\n },\n protocols: ['http', 'https', 'file', 'blob', 'url', 'data']\n});\n;// CONCATENATED MODULE: ./node_modules/axios/lib/platform/common/utils.js\nconst hasBrowserEnv = typeof window !== 'undefined' && typeof document !== 'undefined';\n\n/**\n * Determine if we're running in a standard browser environment\n *\n * This allows axios to run in a web worker, and react-native.\n * Both environments support XMLHttpRequest, but not fully standard globals.\n *\n * web workers:\n * typeof window -> undefined\n * typeof document -> undefined\n *\n * react-native:\n * navigator.product -> 'ReactNative'\n * nativescript\n * navigator.product -> 'NativeScript' or 'NS'\n *\n * @returns {boolean}\n */\nconst hasStandardBrowserEnv = (product => {\n return hasBrowserEnv && ['ReactNative', 'NativeScript', 'NS'].indexOf(product) < 0;\n})(typeof navigator !== 'undefined' && navigator.product);\n\n/**\n * Determine if we're running in a standard browser webWorker environment\n *\n * Although the `isStandardBrowserEnv` method indicates that\n * `allows axios to run in a web worker`, the WebWorker will still be\n * filtered out due to its judgment standard\n * `typeof window !== 'undefined' && typeof document !== 'undefined'`.\n * This leads to a problem when axios post `FormData` in webWorker\n */\nconst hasStandardBrowserWebWorkerEnv = (() => {\n return typeof WorkerGlobalScope !== 'undefined' &&\n // eslint-disable-next-line no-undef\n self instanceof WorkerGlobalScope && typeof self.importScripts === 'function';\n})();\n\n;// CONCATENATED MODULE: ./node_modules/axios/lib/platform/index.js\n\n\n/* harmony default export */ var platform = ({\n ...common_utils_namespaceObject,\n ...browser\n});\n;// CONCATENATED MODULE: ./node_modules/axios/lib/helpers/toURLEncodedForm.js\n\n\n\n\n\nfunction toURLEncodedForm(data, options) {\n return helpers_toFormData(data, new platform.classes.URLSearchParams(), Object.assign({\n visitor: function (value, key, path, helpers) {\n if (platform.isNode && utils.isBuffer(value)) {\n this.append(key, value.toString('base64'));\n return false;\n }\n return helpers.defaultVisitor.apply(this, arguments);\n }\n }, options));\n}\n;// CONCATENATED MODULE: ./node_modules/axios/lib/helpers/formDataToJSON.js\n\n\n\n\n/**\n * It takes a string like `foo[x][y][z]` and returns an array like `['foo', 'x', 'y', 'z']\n *\n * @param {string} name - The name of the property to get.\n *\n * @returns An array of strings.\n */\nfunction parsePropPath(name) {\n // foo[x][y][z]\n // foo.x.y.z\n // foo-x-y-z\n // foo x y z\n return utils.matchAll(/\\w+|\\[(\\w*)]/g, name).map(match => {\n return match[0] === '[]' ? '' : match[1] || match[0];\n });\n}\n\n/**\n * Convert an array to an object.\n *\n * @param {Array<any>} arr - The array to convert to an object.\n *\n * @returns An object with the same keys and values as the array.\n */\nfunction arrayToObject(arr) {\n const obj = {};\n const keys = Object.keys(arr);\n let i;\n const len = keys.length;\n let key;\n for (i = 0; i < len; i++) {\n key = keys[i];\n obj[key] = arr[key];\n }\n return obj;\n}\n\n/**\n * It takes a FormData object and returns a JavaScript object\n *\n * @param {string} formData The FormData object to convert to JSON.\n *\n * @returns {Object<string, any> | null} The converted object.\n */\nfunction formDataToJSON(formData) {\n function buildPath(path, value, target, index) {\n let name = path[index++];\n if (name === '__proto__') return true;\n const isNumericKey = Number.isFinite(+name);\n const isLast = index >= path.length;\n name = !name && utils.isArray(target) ? target.length : name;\n if (isLast) {\n if (utils.hasOwnProp(target, name)) {\n target[name] = [target[name], value];\n } else {\n target[name] = value;\n }\n return !isNumericKey;\n }\n if (!target[name] || !utils.isObject(target[name])) {\n target[name] = [];\n }\n const result = buildPath(path, value, target[name], index);\n if (result && utils.isArray(target[name])) {\n target[name] = arrayToObject(target[name]);\n }\n return !isNumericKey;\n }\n if (utils.isFormData(formData) && utils.isFunction(formData.entries)) {\n const obj = {};\n utils.forEachEntry(formData, (name, value) => {\n buildPath(parsePropPath(name), value, obj, 0);\n });\n return obj;\n }\n return null;\n}\n/* harmony default export */ var helpers_formDataToJSON = (formDataToJSON);\n;// CONCATENATED MODULE: ./node_modules/axios/lib/defaults/index.js\n\n\n\n\n\n\n\n\n\n\n/**\n * It takes a string, tries to parse it, and if it fails, it returns the stringified version\n * of the input\n *\n * @param {any} rawValue - The value to be stringified.\n * @param {Function} parser - A function that parses a string into a JavaScript object.\n * @param {Function} encoder - A function that takes a value and returns a string.\n *\n * @returns {string} A stringified version of the rawValue.\n */\nfunction stringifySafely(rawValue, parser, encoder) {\n if (utils.isString(rawValue)) {\n try {\n (parser || JSON.parse)(rawValue);\n return utils.trim(rawValue);\n } catch (e) {\n if (e.name !== 'SyntaxError') {\n throw e;\n }\n }\n }\n return (encoder || JSON.stringify)(rawValue);\n}\nconst defaults = {\n transitional: defaults_transitional,\n adapter: ['xhr', 'http'],\n transformRequest: [function transformRequest(data, headers) {\n const contentType = headers.getContentType() || '';\n const hasJSONContentType = contentType.indexOf('application/json') > -1;\n const isObjectPayload = utils.isObject(data);\n if (isObjectPayload && utils.isHTMLForm(data)) {\n data = new FormData(data);\n }\n const isFormData = utils.isFormData(data);\n if (isFormData) {\n return hasJSONContentType ? JSON.stringify(helpers_formDataToJSON(data)) : data;\n }\n if (utils.isArrayBuffer(data) || utils.isBuffer(data) || utils.isStream(data) || utils.isFile(data) || utils.isBlob(data)) {\n return data;\n }\n if (utils.isArrayBufferView(data)) {\n return data.buffer;\n }\n if (utils.isURLSearchParams(data)) {\n headers.setContentType('application/x-www-form-urlencoded;charset=utf-8', false);\n return data.toString();\n }\n let isFileList;\n if (isObjectPayload) {\n if (contentType.indexOf('application/x-www-form-urlencoded') > -1) {\n return toURLEncodedForm(data, this.formSerializer).toString();\n }\n if ((isFileList = utils.isFileList(data)) || contentType.indexOf('multipart/form-data') > -1) {\n const _FormData = this.env && this.env.FormData;\n return helpers_toFormData(isFileList ? {\n 'files[]': data\n } : data, _FormData && new _FormData(), this.formSerializer);\n }\n }\n if (isObjectPayload || hasJSONContentType) {\n headers.setContentType('application/json', false);\n return stringifySafely(data);\n }\n return data;\n }],\n transformResponse: [function transformResponse(data) {\n const transitional = this.transitional || defaults.transitional;\n const forcedJSONParsing = transitional && transitional.forcedJSONParsing;\n const JSONRequested = this.responseType === 'json';\n if (data && utils.isString(data) && (forcedJSONParsing && !this.responseType || JSONRequested)) {\n const silentJSONParsing = transitional && transitional.silentJSONParsing;\n const strictJSONParsing = !silentJSONParsing && JSONRequested;\n try {\n return JSON.parse(data);\n } catch (e) {\n if (strictJSONParsing) {\n if (e.name === 'SyntaxError') {\n throw core_AxiosError.from(e, core_AxiosError.ERR_BAD_RESPONSE, this, null, this.response);\n }\n throw e;\n }\n }\n }\n return data;\n }],\n /**\n * A timeout in milliseconds to abort a request. If set to 0 (default) a\n * timeout is not created.\n */\n timeout: 0,\n xsrfCookieName: 'XSRF-TOKEN',\n xsrfHeaderName: 'X-XSRF-TOKEN',\n maxContentLength: -1,\n maxBodyLength: -1,\n env: {\n FormData: platform.classes.FormData,\n Blob: platform.classes.Blob\n },\n validateStatus: function validateStatus(status) {\n return status >= 200 && status < 300;\n },\n headers: {\n common: {\n 'Accept': 'application/json, text/plain, */*',\n 'Content-Type': undefined\n }\n }\n};\nutils.forEach(['delete', 'get', 'head', 'post', 'put', 'patch'], method => {\n defaults.headers[method] = {};\n});\n/* harmony default export */ var lib_defaults = (defaults);\n;// CONCATENATED MODULE: ./node_modules/axios/lib/helpers/parseHeaders.js\n\n\n\n\n\n// RawAxiosHeaders whose duplicates are ignored by node\n// c.f. https://nodejs.org/api/http.html#http_message_headers\nconst ignoreDuplicateOf = utils.toObjectSet(['age', 'authorization', 'content-length', 'content-type', 'etag', 'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since', 'last-modified', 'location', 'max-forwards', 'proxy-authorization', 'referer', 'retry-after', 'user-agent']);\n\n/**\n * Parse headers into an object\n *\n * ```\n * Date: Wed, 27 Aug 2014 08:58:49 GMT\n * Content-Type: application/json\n * Connection: keep-alive\n * Transfer-Encoding: chunked\n * ```\n *\n * @param {String} rawHeaders Headers needing to be parsed\n *\n * @returns {Object} Headers parsed into an object\n */\n/* harmony default export */ var parseHeaders = (rawHeaders => {\n const parsed = {};\n let key;\n let val;\n let i;\n rawHeaders && rawHeaders.split('\\n').forEach(function parser(line) {\n i = line.indexOf(':');\n key = line.substring(0, i).trim().toLowerCase();\n val = line.substring(i + 1).trim();\n if (!key || parsed[key] && ignoreDuplicateOf[key]) {\n return;\n }\n if (key === 'set-cookie') {\n if (parsed[key]) {\n parsed[key].push(val);\n } else {\n parsed[key] = [val];\n }\n } else {\n parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;\n }\n });\n return parsed;\n});\n;// CONCATENATED MODULE: ./node_modules/axios/lib/core/AxiosHeaders.js\n\n\n\n\nconst $internals = Symbol('internals');\nfunction normalizeHeader(header) {\n return header && String(header).trim().toLowerCase();\n}\nfunction normalizeValue(value) {\n if (value === false || value == null) {\n return value;\n }\n return utils.isArray(value) ? value.map(normalizeValue) : String(value);\n}\nfunction parseTokens(str) {\n const tokens = Object.create(null);\n const tokensRE = /([^\\s,;=]+)\\s*(?:=\\s*([^,;]+))?/g;\n let match;\n while (match = tokensRE.exec(str)) {\n tokens[match[1]] = match[2];\n }\n return tokens;\n}\nconst isValidHeaderName = str => /^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(str.trim());\nfunction matchHeaderValue(context, value, header, filter, isHeaderNameFilter) {\n if (utils.isFunction(filter)) {\n return filter.call(this, value, header);\n }\n if (isHeaderNameFilter) {\n value = header;\n }\n if (!utils.isString(value)) return;\n if (utils.isString(filter)) {\n return value.indexOf(filter) !== -1;\n }\n if (utils.isRegExp(filter)) {\n return filter.test(value);\n }\n}\nfunction formatHeader(header) {\n return header.trim().toLowerCase().replace(/([a-z\\d])(\\w*)/g, (w, char, str) => {\n return char.toUpperCase() + str;\n });\n}\nfunction buildAccessors(obj, header) {\n const accessorName = utils.toCamelCase(' ' + header);\n ['get', 'set', 'has'].forEach(methodName => {\n Object.defineProperty(obj, methodName + accessorName, {\n value: function (arg1, arg2, arg3) {\n return this[methodName].call(this, header, arg1, arg2, arg3);\n },\n configurable: true\n });\n });\n}\nclass AxiosHeaders {\n constructor(headers) {\n headers && this.set(headers);\n }\n set(header, valueOrRewrite, rewrite) {\n const self = this;\n function setHeader(_value, _header, _rewrite) {\n const lHeader = normalizeHeader(_header);\n if (!lHeader) {\n throw new Error('header name must be a non-empty string');\n }\n const key = utils.findKey(self, lHeader);\n if (!key || self[key] === undefined || _rewrite === true || _rewrite === undefined && self[key] !== false) {\n self[key || _header] = normalizeValue(_value);\n }\n }\n const setHeaders = (headers, _rewrite) => utils.forEach(headers, (_value, _header) => setHeader(_value, _header, _rewrite));\n if (utils.isPlainObject(header) || header instanceof this.constructor) {\n setHeaders(header, valueOrRewrite);\n } else if (utils.isString(header) && (header = header.trim()) && !isValidHeaderName(header)) {\n setHeaders(parseHeaders(header), valueOrRewrite);\n } else {\n header != null && setHeader(valueOrRewrite, header, rewrite);\n }\n return this;\n }\n get(header, parser) {\n header = normalizeHeader(header);\n if (header) {\n const key = utils.findKey(this, header);\n if (key) {\n const value = this[key];\n if (!parser) {\n return value;\n }\n if (parser === true) {\n return parseTokens(value);\n }\n if (utils.isFunction(parser)) {\n return parser.call(this, value, key);\n }\n if (utils.isRegExp(parser)) {\n return parser.exec(value);\n }\n throw new TypeError('parser must be boolean|regexp|function');\n }\n }\n }\n has(header, matcher) {\n header = normalizeHeader(header);\n if (header) {\n const key = utils.findKey(this, header);\n return !!(key && this[key] !== undefined && (!matcher || matchHeaderValue(this, this[key], key, matcher)));\n }\n return false;\n }\n delete(header, matcher) {\n const self = this;\n let deleted = false;\n function deleteHeader(_header) {\n _header = normalizeHeader(_header);\n if (_header) {\n const key = utils.findKey(self, _header);\n if (key && (!matcher || matchHeaderValue(self, self[key], key, matcher))) {\n delete self[key];\n deleted = true;\n }\n }\n }\n if (utils.isArray(header)) {\n header.forEach(deleteHeader);\n } else {\n deleteHeader(header);\n }\n return deleted;\n }\n clear(matcher) {\n const keys = Object.keys(this);\n let i = keys.length;\n let deleted = false;\n while (i--) {\n const key = keys[i];\n if (!matcher || matchHeaderValue(this, this[key], key, matcher, true)) {\n delete this[key];\n deleted = true;\n }\n }\n return deleted;\n }\n normalize(format) {\n const self = this;\n const headers = {};\n utils.forEach(this, (value, header) => {\n const key = utils.findKey(headers, header);\n if (key) {\n self[key] = normalizeValue(value);\n delete self[header];\n return;\n }\n const normalized = format ? formatHeader(header) : String(header).trim();\n if (normalized !== header) {\n delete self[header];\n }\n self[normalized] = normalizeValue(value);\n headers[normalized] = true;\n });\n return this;\n }\n concat(...targets) {\n return this.constructor.concat(this, ...targets);\n }\n toJSON(asStrings) {\n const obj = Object.create(null);\n utils.forEach(this, (value, header) => {\n value != null && value !== false && (obj[header] = asStrings && utils.isArray(value) ? value.join(', ') : value);\n });\n return obj;\n }\n [Symbol.iterator]() {\n return Object.entries(this.toJSON())[Symbol.iterator]();\n }\n toString() {\n return Object.entries(this.toJSON()).map(([header, value]) => header + ': ' + value).join('\\n');\n }\n get [Symbol.toStringTag]() {\n return 'AxiosHeaders';\n }\n static from(thing) {\n return thing instanceof this ? thing : new this(thing);\n }\n static concat(first, ...targets) {\n const computed = new this(first);\n targets.forEach(target => computed.set(target));\n return computed;\n }\n static accessor(header) {\n const internals = this[$internals] = this[$internals] = {\n accessors: {}\n };\n const accessors = internals.accessors;\n const prototype = this.prototype;\n function defineAccessor(_header) {\n const lHeader = normalizeHeader(_header);\n if (!accessors[lHeader]) {\n buildAccessors(prototype, _header);\n accessors[lHeader] = true;\n }\n }\n utils.isArray(header) ? header.forEach(defineAccessor) : defineAccessor(header);\n return this;\n }\n}\nAxiosHeaders.accessor(['Content-Type', 'Content-Length', 'Accept', 'Accept-Encoding', 'User-Agent', 'Authorization']);\n\n// reserved names hotfix\nutils.reduceDescriptors(AxiosHeaders.prototype, ({\n value\n}, key) => {\n let mapped = key[0].toUpperCase() + key.slice(1); // map `set` => `Set`\n return {\n get: () => value,\n set(headerValue) {\n this[mapped] = headerValue;\n }\n };\n});\nutils.freezeMethods(AxiosHeaders);\n/* harmony default export */ var core_AxiosHeaders = (AxiosHeaders);\n;// CONCATENATED MODULE: ./node_modules/axios/lib/core/transformData.js\n\n\n\n\n\n\n/**\n * Transform the data for a request or a response\n *\n * @param {Array|Function} fns A single function or Array of functions\n * @param {?Object} response The response object\n *\n * @returns {*} The resulting transformed data\n */\nfunction transformData(fns, response) {\n const config = this || lib_defaults;\n const context = response || config;\n const headers = core_AxiosHeaders.from(context.headers);\n let data = context.data;\n utils.forEach(fns, function transform(fn) {\n data = fn.call(config, data, headers.normalize(), response ? response.status : undefined);\n });\n headers.normalize();\n return data;\n}\n;// CONCATENATED MODULE: ./node_modules/axios/lib/cancel/isCancel.js\n\n\nfunction isCancel(value) {\n return !!(value && value.__CANCEL__);\n}\n;// CONCATENATED MODULE: ./node_modules/axios/lib/cancel/CanceledError.js\n\n\n\n\n\n/**\n * A `CanceledError` is an object that is thrown when an operation is canceled.\n *\n * @param {string=} message The message.\n * @param {Object=} config The config.\n * @param {Object=} request The request.\n *\n * @returns {CanceledError} The created error.\n */\nfunction CanceledError(message, config, request) {\n // eslint-disable-next-line no-eq-null,eqeqeq\n core_AxiosError.call(this, message == null ? 'canceled' : message, core_AxiosError.ERR_CANCELED, config, request);\n this.name = 'CanceledError';\n}\nutils.inherits(CanceledError, core_AxiosError, {\n __CANCEL__: true\n});\n/* harmony default export */ var cancel_CanceledError = (CanceledError);\n// EXTERNAL MODULE: ./node_modules/core-js/modules/web.dom-exception.stack.js\nvar web_dom_exception_stack = __webpack_require__(4979);\n;// CONCATENATED MODULE: ./node_modules/axios/lib/core/settle.js\n\n\n\n\n/**\n * Resolve or reject a Promise based on response status.\n *\n * @param {Function} resolve A function that resolves the promise.\n * @param {Function} reject A function that rejects the promise.\n * @param {object} response The response.\n *\n * @returns {object} The response.\n */\nfunction settle(resolve, reject, response) {\n const validateStatus = response.config.validateStatus;\n if (!response.status || !validateStatus || validateStatus(response.status)) {\n resolve(response);\n } else {\n reject(new core_AxiosError('Request failed with status code ' + response.status, [core_AxiosError.ERR_BAD_REQUEST, core_AxiosError.ERR_BAD_RESPONSE][Math.floor(response.status / 100) - 4], response.config, response.request, response));\n }\n}\n;// CONCATENATED MODULE: ./node_modules/axios/lib/helpers/cookies.js\n\n\n\n/* harmony default export */ var cookies = (platform.hasStandardBrowserEnv ?\n// Standard browser envs support document.cookie\n{\n write(name, value, expires, path, domain, secure) {\n const cookie = [name + '=' + encodeURIComponent(value)];\n utils.isNumber(expires) && cookie.push('expires=' + new Date(expires).toGMTString());\n utils.isString(path) && cookie.push('path=' + path);\n utils.isString(domain) && cookie.push('domain=' + domain);\n secure === true && cookie.push('secure');\n document.cookie = cookie.join('; ');\n },\n read(name) {\n const match = document.cookie.match(new RegExp('(^|;\\\\s*)(' + name + ')=([^;]*)'));\n return match ? decodeURIComponent(match[3]) : null;\n },\n remove(name) {\n this.write(name, '', Date.now() - 86400000);\n }\n} :\n// Non-standard browser env (web workers, react-native) lack needed support.\n{\n write() {},\n read() {\n return null;\n },\n remove() {}\n});\n;// CONCATENATED MODULE: ./node_modules/axios/lib/helpers/isAbsoluteURL.js\n\n\n/**\n * Determines whether the specified URL is absolute\n *\n * @param {string} url The URL to test\n *\n * @returns {boolean} True if the specified URL is absolute, otherwise false\n */\nfunction isAbsoluteURL(url) {\n // A URL is considered absolute if it begins with \"<scheme>://\" or \"//\" (protocol-relative URL).\n // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed\n // by any combination of letters, digits, plus, period, or hyphen.\n return /^([a-z][a-z\\d+\\-.]*:)?\\/\\//i.test(url);\n}\n;// CONCATENATED MODULE: ./node_modules/axios/lib/helpers/combineURLs.js\n\n\n/**\n * Creates a new URL by combining the specified URLs\n *\n * @param {string} baseURL The base URL\n * @param {string} relativeURL The relative URL\n *\n * @returns {string} The combined URL\n */\nfunction combineURLs(baseURL, relativeURL) {\n return relativeURL ? baseURL.replace(/\\/?\\/$/, '') + '/' + relativeURL.replace(/^\\/+/, '') : baseURL;\n}\n;// CONCATENATED MODULE: ./node_modules/axios/lib/core/buildFullPath.js\n\n\n\n\n\n/**\n * Creates a new URL by combining the baseURL with the requestedURL,\n * only when the requestedURL is not already an absolute URL.\n * If the requestURL is absolute, this function returns the requestedURL untouched.\n *\n * @param {string} baseURL The base URL\n * @param {string} requestedURL Absolute or relative URL to combine\n *\n * @returns {string} The combined full path\n */\nfunction buildFullPath(baseURL, requestedURL) {\n if (baseURL && !isAbsoluteURL(requestedURL)) {\n return combineURLs(baseURL, requestedURL);\n }\n return requestedURL;\n}\n;// CONCATENATED MODULE: ./node_modules/axios/lib/helpers/isURLSameOrigin.js\n\n\n\n\n/* harmony default export */ var isURLSameOrigin = (platform.hasStandardBrowserEnv ?\n// Standard browser envs have full support of the APIs needed to test\n// whether the request URL is of the same origin as current location.\nfunction standardBrowserEnv() {\n const msie = /(msie|trident)/i.test(navigator.userAgent);\n const urlParsingNode = document.createElement('a');\n let originURL;\n\n /**\n * Parse a URL to discover its components\n *\n * @param {String} url The URL to be parsed\n * @returns {Object}\n */\n function resolveURL(url) {\n let href = url;\n if (msie) {\n // IE needs attribute set twice to normalize properties\n urlParsingNode.setAttribute('href', href);\n href = urlParsingNode.href;\n }\n urlParsingNode.setAttribute('href', href);\n\n // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils\n return {\n href: urlParsingNode.href,\n protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '',\n host: urlParsingNode.host,\n search: urlParsingNode.search ? urlParsingNode.search.replace(/^\\?/, '') : '',\n hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '',\n hostname: urlParsingNode.hostname,\n port: urlParsingNode.port,\n pathname: urlParsingNode.pathname.charAt(0) === '/' ? urlParsingNode.pathname : '/' + urlParsingNode.pathname\n };\n }\n originURL = resolveURL(window.location.href);\n\n /**\n * Determine if a URL shares the same origin as the current location\n *\n * @param {String} requestURL The URL to test\n * @returns {boolean} True if URL shares the same origin, otherwise false\n */\n return function isURLSameOrigin(requestURL) {\n const parsed = utils.isString(requestURL) ? resolveURL(requestURL) : requestURL;\n return parsed.protocol === originURL.protocol && parsed.host === originURL.host;\n };\n}() :\n// Non standard browser envs (web workers, react-native) lack needed support.\nfunction nonStandardBrowserEnv() {\n return function isURLSameOrigin() {\n return true;\n };\n}());\n;// CONCATENATED MODULE: ./node_modules/axios/lib/helpers/parseProtocol.js\n\n\nfunction parseProtocol(url) {\n const match = /^([-+\\w]{1,25})(:?\\/\\/|:)/.exec(url);\n return match && match[1] || '';\n}\n;// CONCATENATED MODULE: ./node_modules/axios/lib/helpers/speedometer.js\n\n\n/**\n * Calculate data maxRate\n * @param {Number} [samplesCount= 10]\n * @param {Number} [min= 1000]\n * @returns {Function}\n */\nfunction speedometer(samplesCount, min) {\n samplesCount = samplesCount || 10;\n const bytes = new Array(samplesCount);\n const timestamps = new Array(samplesCount);\n let head = 0;\n let tail = 0;\n let firstSampleTS;\n min = min !== undefined ? min : 1000;\n return function push(chunkLength) {\n const now = Date.now();\n const startedAt = timestamps[tail];\n if (!firstSampleTS) {\n firstSampleTS = now;\n }\n bytes[head] = chunkLength;\n timestamps[head] = now;\n let i = tail;\n let bytesCount = 0;\n while (i !== head) {\n bytesCount += bytes[i++];\n i = i % samplesCount;\n }\n head = (head + 1) % samplesCount;\n if (head === tail) {\n tail = (tail + 1) % samplesCount;\n }\n if (now - firstSampleTS < min) {\n return;\n }\n const passed = startedAt && now - startedAt;\n return passed ? Math.round(bytesCount * 1000 / passed) : undefined;\n };\n}\n/* harmony default export */ var helpers_speedometer = (speedometer);\n;// CONCATENATED MODULE: ./node_modules/axios/lib/adapters/xhr.js\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nfunction progressEventReducer(listener, isDownloadStream) {\n let bytesNotified = 0;\n const _speedometer = helpers_speedometer(50, 250);\n return e => {\n const loaded = e.loaded;\n const total = e.lengthComputable ? e.total : undefined;\n const progressBytes = loaded - bytesNotified;\n const rate = _speedometer(progressBytes);\n const inRange = loaded <= total;\n bytesNotified = loaded;\n const data = {\n loaded,\n total,\n progress: total ? loaded / total : undefined,\n bytes: progressBytes,\n rate: rate ? rate : undefined,\n estimated: rate && total && inRange ? (total - loaded) / rate : undefined,\n event: e\n };\n data[isDownloadStream ? 'download' : 'upload'] = true;\n listener(data);\n };\n}\nconst isXHRAdapterSupported = typeof XMLHttpRequest !== 'undefined';\n/* harmony default export */ var xhr = (isXHRAdapterSupported && function (config) {\n return new Promise(function dispatchXhrRequest(resolve, reject) {\n let requestData = config.data;\n const requestHeaders = core_AxiosHeaders.from(config.headers).normalize();\n let {\n responseType,\n withXSRFToken\n } = config;\n let onCanceled;\n function done() {\n if (config.cancelToken) {\n config.cancelToken.unsubscribe(onCanceled);\n }\n if (config.signal) {\n config.signal.removeEventListener('abort', onCanceled);\n }\n }\n let contentType;\n if (utils.isFormData(requestData)) {\n if (platform.hasStandardBrowserEnv || platform.hasStandardBrowserWebWorkerEnv) {\n requestHeaders.setContentType(false); // Let the browser set it\n } else if ((contentType = requestHeaders.getContentType()) !== false) {\n // fix semicolon duplication issue for ReactNative FormData implementation\n const [type, ...tokens] = contentType ? contentType.split(';').map(token => token.trim()).filter(Boolean) : [];\n requestHeaders.setContentType([type || 'multipart/form-data', ...tokens].join('; '));\n }\n }\n let request = new XMLHttpRequest();\n\n // HTTP basic authentication\n if (config.auth) {\n const username = config.auth.username || '';\n const password = config.auth.password ? unescape(encodeURIComponent(config.auth.password)) : '';\n requestHeaders.set('Authorization', 'Basic ' + btoa(username + ':' + password));\n }\n const fullPath = buildFullPath(config.baseURL, config.url);\n request.open(config.method.toUpperCase(), buildURL(fullPath, config.params, config.paramsSerializer), true);\n\n // Set the request timeout in MS\n request.timeout = config.timeout;\n function onloadend() {\n if (!request) {\n return;\n }\n // Prepare the response\n const responseHeaders = core_AxiosHeaders.from('getAllResponseHeaders' in request && request.getAllResponseHeaders());\n const responseData = !responseType || responseType === 'text' || responseType === 'json' ? request.responseText : request.response;\n const response = {\n data: responseData,\n status: request.status,\n statusText: request.statusText,\n headers: responseHeaders,\n config,\n request\n };\n settle(function _resolve(value) {\n resolve(value);\n done();\n }, function _reject(err) {\n reject(err);\n done();\n }, response);\n\n // Clean up request\n request = null;\n }\n if ('onloadend' in request) {\n // Use onloadend if available\n request.onloadend = onloadend;\n } else {\n // Listen for ready state to emulate onloadend\n request.onreadystatechange = function handleLoad() {\n if (!request || request.readyState !== 4) {\n return;\n }\n\n // The request errored out and we didn't get a response, this will be\n // handled by onerror instead\n // With one exception: request that using file: protocol, most browsers\n // will return status as 0 even though it's a successful request\n if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) {\n return;\n }\n // readystate handler is calling before onerror or ontimeout handlers,\n // so we should call onloadend on the next 'tick'\n setTimeout(onloadend);\n };\n }\n\n // Handle browser request cancellation (as opposed to a manual cancellation)\n request.onabort = function handleAbort() {\n if (!request) {\n return;\n }\n reject(new core_AxiosError('Request aborted', core_AxiosError.ECONNABORTED, config, request));\n\n // Clean up request\n request = null;\n };\n\n // Handle low level network errors\n request.onerror = function handleError() {\n // Real errors are hidden from us by the browser\n // onerror should only fire if it's a network error\n reject(new core_AxiosError('Network Error', core_AxiosError.ERR_NETWORK, config, request));\n\n // Clean up request\n request = null;\n };\n\n // Handle timeout\n request.ontimeout = function handleTimeout() {\n let timeoutErrorMessage = config.timeout ? 'timeout of ' + config.timeout + 'ms exceeded' : 'timeout exceeded';\n const transitional = config.transitional || defaults_transitional;\n if (config.timeoutErrorMessage) {\n timeoutErrorMessage = config.timeoutErrorMessage;\n }\n reject(new core_AxiosError(timeoutErrorMessage, transitional.clarifyTimeoutError ? core_AxiosError.ETIMEDOUT : core_AxiosError.ECONNABORTED, config, request));\n\n // Clean up request\n request = null;\n };\n\n // Add xsrf header\n // This is only done if running in a standard browser environment.\n // Specifically not if we're in a web worker, or react-native.\n if (platform.hasStandardBrowserEnv) {\n withXSRFToken && utils.isFunction(withXSRFToken) && (withXSRFToken = withXSRFToken(config));\n if (withXSRFToken || withXSRFToken !== false && isURLSameOrigin(fullPath)) {\n // Add xsrf header\n const xsrfValue = config.xsrfHeaderName && config.xsrfCookieName && cookies.read(config.xsrfCookieName);\n if (xsrfValue) {\n requestHeaders.set(config.xsrfHeaderName, xsrfValue);\n }\n }\n }\n\n // Remove Content-Type if data is undefined\n requestData === undefined && requestHeaders.setContentType(null);\n\n // Add headers to the request\n if ('setRequestHeader' in request) {\n utils.forEach(requestHeaders.toJSON(), function setRequestHeader(val, key) {\n request.setRequestHeader(key, val);\n });\n }\n\n // Add withCredentials to request if needed\n if (!utils.isUndefined(config.withCredentials)) {\n request.withCredentials = !!config.withCredentials;\n }\n\n // Add responseType to request if needed\n if (responseType && responseType !== 'json') {\n request.responseType = config.responseType;\n }\n\n // Handle progress if needed\n if (typeof config.onDownloadProgress === 'function') {\n request.addEventListener('progress', progressEventReducer(config.onDownloadProgress, true));\n }\n\n // Not all browsers support upload events\n if (typeof config.onUploadProgress === 'function' && request.upload) {\n request.upload.addEventListener('progress', progressEventReducer(config.onUploadProgress));\n }\n if (config.cancelToken || config.signal) {\n // Handle cancellation\n // eslint-disable-next-line func-names\n onCanceled = cancel => {\n if (!request) {\n return;\n }\n reject(!cancel || cancel.type ? new cancel_CanceledError(null, config, request) : cancel);\n request.abort();\n request = null;\n };\n config.cancelToken && config.cancelToken.subscribe(onCanceled);\n if (config.signal) {\n config.signal.aborted ? onCanceled() : config.signal.addEventListener('abort', onCanceled);\n }\n }\n const protocol = parseProtocol(fullPath);\n if (protocol && platform.protocols.indexOf(protocol) === -1) {\n reject(new core_AxiosError('Unsupported protocol ' + protocol + ':', core_AxiosError.ERR_BAD_REQUEST, config));\n return;\n }\n\n // Send the request\n request.send(requestData || null);\n });\n});\n;// CONCATENATED MODULE: ./node_modules/axios/lib/adapters/adapters.js\n\n\n\n\nconst knownAdapters = {\n http: helpers_null,\n xhr: xhr\n};\nutils.forEach(knownAdapters, (fn, value) => {\n if (fn) {\n try {\n Object.defineProperty(fn, 'name', {\n value\n });\n } catch (e) {\n // eslint-disable-next-line no-empty\n }\n Object.defineProperty(fn, 'adapterName', {\n value\n });\n }\n});\nconst renderReason = reason => `- ${reason}`;\nconst isResolvedHandle = adapter => utils.isFunction(adapter) || adapter === null || adapter === false;\n/* harmony default export */ var adapters = ({\n getAdapter: adapters => {\n adapters = utils.isArray(adapters) ? adapters : [adapters];\n const {\n length\n } = adapters;\n let nameOrAdapter;\n let adapter;\n const rejectedReasons = {};\n for (let i = 0; i < length; i++) {\n nameOrAdapter = adapters[i];\n let id;\n adapter = nameOrAdapter;\n if (!isResolvedHandle(nameOrAdapter)) {\n adapter = knownAdapters[(id = String(nameOrAdapter)).toLowerCase()];\n if (adapter === undefined) {\n throw new core_AxiosError(`Unknown adapter '${id}'`);\n }\n }\n if (adapter) {\n break;\n }\n rejectedReasons[id || '#' + i] = adapter;\n }\n if (!adapter) {\n const reasons = Object.entries(rejectedReasons).map(([id, state]) => `adapter ${id} ` + (state === false ? 'is not supported by the environment' : 'is not available in the build'));\n let s = length ? reasons.length > 1 ? 'since :\\n' + reasons.map(renderReason).join('\\n') : ' ' + renderReason(reasons[0]) : 'as no adapter specified';\n throw new core_AxiosError(`There is no suitable adapter to dispatch the request ` + s, 'ERR_NOT_SUPPORT');\n }\n return adapter;\n },\n adapters: knownAdapters\n});\n;// CONCATENATED MODULE: ./node_modules/axios/lib/core/dispatchRequest.js\n\n\n\n\n\n\n\n\n\n/**\n * Throws a `CanceledError` if cancellation has been requested.\n *\n * @param {Object} config The config that is to be used for the request\n *\n * @returns {void}\n */\nfunction throwIfCancellationRequested(config) {\n if (config.cancelToken) {\n config.cancelToken.throwIfRequested();\n }\n if (config.signal && config.signal.aborted) {\n throw new cancel_CanceledError(null, config);\n }\n}\n\n/**\n * Dispatch a request to the server using the configured adapter.\n *\n * @param {object} config The config that is to be used for the request\n *\n * @returns {Promise} The Promise to be fulfilled\n */\nfunction dispatchRequest(config) {\n throwIfCancellationRequested(config);\n config.headers = core_AxiosHeaders.from(config.headers);\n\n // Transform request data\n config.data = transformData.call(config, config.transformRequest);\n if (['post', 'put', 'patch'].indexOf(config.method) !== -1) {\n config.headers.setContentType('application/x-www-form-urlencoded', false);\n }\n const adapter = adapters.getAdapter(config.adapter || lib_defaults.adapter);\n return adapter(config).then(function onAdapterResolution(response) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n response.data = transformData.call(config, config.transformResponse, response);\n response.headers = core_AxiosHeaders.from(response.headers);\n return response;\n }, function onAdapterRejection(reason) {\n if (!isCancel(reason)) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n if (reason && reason.response) {\n reason.response.data = transformData.call(config, config.transformResponse, reason.response);\n reason.response.headers = core_AxiosHeaders.from(reason.response.headers);\n }\n }\n return Promise.reject(reason);\n });\n}\n;// CONCATENATED MODULE: ./node_modules/axios/lib/core/mergeConfig.js\n\n\n\n\nconst headersToObject = thing => thing instanceof core_AxiosHeaders ? thing.toJSON() : thing;\n\n/**\n * Config-specific merge-function which creates a new config-object\n * by merging two configuration objects together.\n *\n * @param {Object} config1\n * @param {Object} config2\n *\n * @returns {Object} New object resulting from merging config2 to config1\n */\nfunction mergeConfig(config1, config2) {\n // eslint-disable-next-line no-param-reassign\n config2 = config2 || {};\n const config = {};\n function getMergedValue(target, source, caseless) {\n if (utils.isPlainObject(target) && utils.isPlainObject(source)) {\n return utils.merge.call({\n caseless\n }, target, source);\n } else if (utils.isPlainObject(source)) {\n return utils.merge({}, source);\n } else if (utils.isArray(source)) {\n return source.slice();\n }\n return source;\n }\n\n // eslint-disable-next-line consistent-return\n function mergeDeepProperties(a, b, caseless) {\n if (!utils.isUndefined(b)) {\n return getMergedValue(a, b, caseless);\n } else if (!utils.isUndefined(a)) {\n return getMergedValue(undefined, a, caseless);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function valueFromConfig2(a, b) {\n if (!utils.isUndefined(b)) {\n return getMergedValue(undefined, b);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function defaultToConfig2(a, b) {\n if (!utils.isUndefined(b)) {\n return getMergedValue(undefined, b);\n } else if (!utils.isUndefined(a)) {\n return getMergedValue(undefined, a);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function mergeDirectKeys(a, b, prop) {\n if (prop in config2) {\n return getMergedValue(a, b);\n } else if (prop in config1) {\n return getMergedValue(undefined, a);\n }\n }\n const mergeMap = {\n url: valueFromConfig2,\n method: valueFromConfig2,\n data: valueFromConfig2,\n baseURL: defaultToConfig2,\n transformRequest: defaultToConfig2,\n transformResponse: defaultToConfig2,\n paramsSerializer: defaultToConfig2,\n timeout: defaultToConfig2,\n timeoutMessage: defaultToConfig2,\n withCredentials: defaultToConfig2,\n withXSRFToken: defaultToConfig2,\n adapter: defaultToConfig2,\n responseType: defaultToConfig2,\n xsrfCookieName: defaultToConfig2,\n xsrfHeaderName: defaultToConfig2,\n onUploadProgress: defaultToConfig2,\n onDownloadProgress: defaultToConfig2,\n decompress: defaultToConfig2,\n maxContentLength: defaultToConfig2,\n maxBodyLength: defaultToConfig2,\n beforeRedirect: defaultToConfig2,\n transport: defaultToConfig2,\n httpAgent: defaultToConfig2,\n httpsAgent: defaultToConfig2,\n cancelToken: defaultToConfig2,\n socketPath: defaultToConfig2,\n responseEncoding: defaultToConfig2,\n validateStatus: mergeDirectKeys,\n headers: (a, b) => mergeDeepProperties(headersToObject(a), headersToObject(b), true)\n };\n utils.forEach(Object.keys(Object.assign({}, config1, config2)), function computeConfigValue(prop) {\n const merge = mergeMap[prop] || mergeDeepProperties;\n const configValue = merge(config1[prop], config2[prop], prop);\n utils.isUndefined(configValue) && merge !== mergeDirectKeys || (config[prop] = configValue);\n });\n return config;\n}\n;// CONCATENATED MODULE: ./node_modules/axios/lib/env/data.js\nconst VERSION = \"1.6.7\";\n;// CONCATENATED MODULE: ./node_modules/axios/lib/helpers/validator.js\n\n\n\n\nconst validators = {};\n\n// eslint-disable-next-line func-names\n['object', 'boolean', 'number', 'function', 'string', 'symbol'].forEach((type, i) => {\n validators[type] = function validator(thing) {\n return typeof thing === type || 'a' + (i < 1 ? 'n ' : ' ') + type;\n };\n});\nconst deprecatedWarnings = {};\n\n/**\n * Transitional option validator\n *\n * @param {function|boolean?} validator - set to false if the transitional option has been removed\n * @param {string?} version - deprecated version / removed since version\n * @param {string?} message - some message with additional info\n *\n * @returns {function}\n */\nvalidators.transitional = function transitional(validator, version, message) {\n function formatMessage(opt, desc) {\n return '[Axios v' + VERSION + '] Transitional option \\'' + opt + '\\'' + desc + (message ? '. ' + message : '');\n }\n\n // eslint-disable-next-line func-names\n return (value, opt, opts) => {\n if (validator === false) {\n throw new core_AxiosError(formatMessage(opt, ' has been removed' + (version ? ' in ' + version : '')), core_AxiosError.ERR_DEPRECATED);\n }\n if (version && !deprecatedWarnings[opt]) {\n deprecatedWarnings[opt] = true;\n // eslint-disable-next-line no-console\n console.warn(formatMessage(opt, ' has been deprecated since v' + version + ' and will be removed in the near future'));\n }\n return validator ? validator(value, opt, opts) : true;\n };\n};\n\n/**\n * Assert object's properties type\n *\n * @param {object} options\n * @param {object} schema\n * @param {boolean?} allowUnknown\n *\n * @returns {object}\n */\n\nfunction assertOptions(options, schema, allowUnknown) {\n if (typeof options !== 'object') {\n throw new core_AxiosError('options must be an object', core_AxiosError.ERR_BAD_OPTION_VALUE);\n }\n const keys = Object.keys(options);\n let i = keys.length;\n while (i-- > 0) {\n const opt = keys[i];\n const validator = schema[opt];\n if (validator) {\n const value = options[opt];\n const result = value === undefined || validator(value, opt, options);\n if (result !== true) {\n throw new core_AxiosError('option ' + opt + ' must be ' + result, core_AxiosError.ERR_BAD_OPTION_VALUE);\n }\n continue;\n }\n if (allowUnknown !== true) {\n throw new core_AxiosError('Unknown option ' + opt, core_AxiosError.ERR_BAD_OPTION);\n }\n }\n}\n/* harmony default export */ var validator = ({\n assertOptions,\n validators\n});\n;// CONCATENATED MODULE: ./node_modules/axios/lib/core/Axios.js\n\n\n\n\n\n\n\n\n\n\n\nconst Axios_validators = validator.validators;\n\n/**\n * Create a new instance of Axios\n *\n * @param {Object} instanceConfig The default config for the instance\n *\n * @return {Axios} A new instance of Axios\n */\nclass Axios {\n constructor(instanceConfig) {\n this.defaults = instanceConfig;\n this.interceptors = {\n request: new core_InterceptorManager(),\n response: new core_InterceptorManager()\n };\n }\n\n /**\n * Dispatch a request\n *\n * @param {String|Object} configOrUrl The config specific for this request (merged with this.defaults)\n * @param {?Object} config\n *\n * @returns {Promise} The Promise to be fulfilled\n */\n async request(configOrUrl, config) {\n try {\n return await this._request(configOrUrl, config);\n } catch (err) {\n if (err instanceof Error) {\n let dummy;\n Error.captureStackTrace ? Error.captureStackTrace(dummy = {}) : dummy = new Error();\n\n // slice off the Error: ... line\n const stack = dummy.stack ? dummy.stack.replace(/^.+\\n/, '') : '';\n if (!err.stack) {\n err.stack = stack;\n // match without the 2 top stack lines\n } else if (stack && !String(err.stack).endsWith(stack.replace(/^.+\\n.+\\n/, ''))) {\n err.stack += '\\n' + stack;\n }\n }\n throw err;\n }\n }\n _request(configOrUrl, config) {\n /*eslint no-param-reassign:0*/\n // Allow for axios('example/url'[, config]) a la fetch API\n if (typeof configOrUrl === 'string') {\n config = config || {};\n config.url = configOrUrl;\n } else {\n config = configOrUrl || {};\n }\n config = mergeConfig(this.defaults, config);\n const {\n transitional,\n paramsSerializer,\n headers\n } = config;\n if (transitional !== undefined) {\n validator.assertOptions(transitional, {\n silentJSONParsing: Axios_validators.transitional(Axios_validators.boolean),\n forcedJSONParsing: Axios_validators.transitional(Axios_validators.boolean),\n clarifyTimeoutError: Axios_validators.transitional(Axios_validators.boolean)\n }, false);\n }\n if (paramsSerializer != null) {\n if (utils.isFunction(paramsSerializer)) {\n config.paramsSerializer = {\n serialize: paramsSerializer\n };\n } else {\n validator.assertOptions(paramsSerializer, {\n encode: Axios_validators.function,\n serialize: Axios_validators.function\n }, true);\n }\n }\n\n // Set config.method\n config.method = (config.method || this.defaults.method || 'get').toLowerCase();\n\n // Flatten headers\n let contextHeaders = headers && utils.merge(headers.common, headers[config.method]);\n headers && utils.forEach(['delete', 'get', 'head', 'post', 'put', 'patch', 'common'], method => {\n delete headers[method];\n });\n config.headers = core_AxiosHeaders.concat(contextHeaders, headers);\n\n // filter out skipped interceptors\n const requestInterceptorChain = [];\n let synchronousRequestInterceptors = true;\n this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {\n if (typeof interceptor.runWhen === 'function' && interceptor.runWhen(config) === false) {\n return;\n }\n synchronousRequestInterceptors = synchronousRequestInterceptors && interceptor.synchronous;\n requestInterceptorChain.unshift(interceptor.fulfilled, interceptor.rejected);\n });\n const responseInterceptorChain = [];\n this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {\n responseInterceptorChain.push(interceptor.fulfilled, interceptor.rejected);\n });\n let promise;\n let i = 0;\n let len;\n if (!synchronousRequestInterceptors) {\n const chain = [dispatchRequest.bind(this), undefined];\n chain.unshift.apply(chain, requestInterceptorChain);\n chain.push.apply(chain, responseInterceptorChain);\n len = chain.length;\n promise = Promise.resolve(config);\n while (i < len) {\n promise = promise.then(chain[i++], chain[i++]);\n }\n return promise;\n }\n len = requestInterceptorChain.length;\n let newConfig = config;\n i = 0;\n while (i < len) {\n const onFulfilled = requestInterceptorChain[i++];\n const onRejected = requestInterceptorChain[i++];\n try {\n newConfig = onFulfilled(newConfig);\n } catch (error) {\n onRejected.call(this, error);\n break;\n }\n }\n try {\n promise = dispatchRequest.call(this, newConfig);\n } catch (error) {\n return Promise.reject(error);\n }\n i = 0;\n len = responseInterceptorChain.length;\n while (i < len) {\n promise = promise.then(responseInterceptorChain[i++], responseInterceptorChain[i++]);\n }\n return promise;\n }\n getUri(config) {\n config = mergeConfig(this.defaults, config);\n const fullPath = buildFullPath(config.baseURL, config.url);\n return buildURL(fullPath, config.params, config.paramsSerializer);\n }\n}\n\n// Provide aliases for supported request methods\nutils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) {\n /*eslint func-names:0*/\n Axios.prototype[method] = function (url, config) {\n return this.request(mergeConfig(config || {}, {\n method,\n url,\n data: (config || {}).data\n }));\n };\n});\nutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\n /*eslint func-names:0*/\n\n function generateHTTPMethod(isForm) {\n return function httpMethod(url, data, config) {\n return this.request(mergeConfig(config || {}, {\n method,\n headers: isForm ? {\n 'Content-Type': 'multipart/form-data'\n } : {},\n url,\n data\n }));\n };\n }\n Axios.prototype[method] = generateHTTPMethod();\n Axios.prototype[method + 'Form'] = generateHTTPMethod(true);\n});\n/* harmony default export */ var core_Axios = (Axios);\n;// CONCATENATED MODULE: ./node_modules/axios/lib/cancel/CancelToken.js\n\n\n\n\n\n/**\n * A `CancelToken` is an object that can be used to request cancellation of an operation.\n *\n * @param {Function} executor The executor function.\n *\n * @returns {CancelToken}\n */\nclass CancelToken {\n constructor(executor) {\n if (typeof executor !== 'function') {\n throw new TypeError('executor must be a function.');\n }\n let resolvePromise;\n this.promise = new Promise(function promiseExecutor(resolve) {\n resolvePromise = resolve;\n });\n const token = this;\n\n // eslint-disable-next-line func-names\n this.promise.then(cancel => {\n if (!token._listeners) return;\n let i = token._listeners.length;\n while (i-- > 0) {\n token._listeners[i](cancel);\n }\n token._listeners = null;\n });\n\n // eslint-disable-next-line func-names\n this.promise.then = onfulfilled => {\n let _resolve;\n // eslint-disable-next-line func-names\n const promise = new Promise(resolve => {\n token.subscribe(resolve);\n _resolve = resolve;\n }).then(onfulfilled);\n promise.cancel = function reject() {\n token.unsubscribe(_resolve);\n };\n return promise;\n };\n executor(function cancel(message, config, request) {\n if (token.reason) {\n // Cancellation has already been requested\n return;\n }\n token.reason = new cancel_CanceledError(message, config, request);\n resolvePromise(token.reason);\n });\n }\n\n /**\n * Throws a `CanceledError` if cancellation has been requested.\n */\n throwIfRequested() {\n if (this.reason) {\n throw this.reason;\n }\n }\n\n /**\n * Subscribe to the cancel signal\n */\n\n subscribe(listener) {\n if (this.reason) {\n listener(this.reason);\n return;\n }\n if (this._listeners) {\n this._listeners.push(listener);\n } else {\n this._listeners = [listener];\n }\n }\n\n /**\n * Unsubscribe from the cancel signal\n */\n\n unsubscribe(listener) {\n if (!this._listeners) {\n return;\n }\n const index = this._listeners.indexOf(listener);\n if (index !== -1) {\n this._listeners.splice(index, 1);\n }\n }\n\n /**\n * Returns an object that contains a new `CancelToken` and a function that, when called,\n * cancels the `CancelToken`.\n */\n static source() {\n let cancel;\n const token = new CancelToken(function executor(c) {\n cancel = c;\n });\n return {\n token,\n cancel\n };\n }\n}\n/* harmony default export */ var cancel_CancelToken = (CancelToken);\n;// CONCATENATED MODULE: ./node_modules/axios/lib/helpers/spread.js\n\n\n/**\n * Syntactic sugar for invoking a function and expanding an array for arguments.\n *\n * Common use case would be to use `Function.prototype.apply`.\n *\n * ```js\n * function f(x, y, z) {}\n * var args = [1, 2, 3];\n * f.apply(null, args);\n * ```\n *\n * With `spread` this example can be re-written.\n *\n * ```js\n * spread(function(x, y, z) {})([1, 2, 3]);\n * ```\n *\n * @param {Function} callback\n *\n * @returns {Function}\n */\nfunction spread(callback) {\n return function wrap(arr) {\n return callback.apply(null, arr);\n };\n}\n;// CONCATENATED MODULE: ./node_modules/axios/lib/helpers/isAxiosError.js\n\n\n\n\n/**\n * Determines whether the payload is an error thrown by Axios\n *\n * @param {*} payload The value to test\n *\n * @returns {boolean} True if the payload is an error thrown by Axios, otherwise false\n */\nfunction isAxiosError(payload) {\n return utils.isObject(payload) && payload.isAxiosError === true;\n}\n;// CONCATENATED MODULE: ./node_modules/axios/lib/helpers/HttpStatusCode.js\nconst HttpStatusCode = {\n Continue: 100,\n SwitchingProtocols: 101,\n Processing: 102,\n EarlyHints: 103,\n Ok: 200,\n Created: 201,\n Accepted: 202,\n NonAuthoritativeInformation: 203,\n NoContent: 204,\n ResetContent: 205,\n PartialContent: 206,\n MultiStatus: 207,\n AlreadyReported: 208,\n ImUsed: 226,\n MultipleChoices: 300,\n MovedPermanently: 301,\n Found: 302,\n SeeOther: 303,\n NotModified: 304,\n UseProxy: 305,\n Unused: 306,\n TemporaryRedirect: 307,\n PermanentRedirect: 308,\n BadRequest: 400,\n Unauthorized: 401,\n PaymentRequired: 402,\n Forbidden: 403,\n NotFound: 404,\n MethodNotAllowed: 405,\n NotAcceptable: 406,\n ProxyAuthenticationRequired: 407,\n RequestTimeout: 408,\n Conflict: 409,\n Gone: 410,\n LengthRequired: 411,\n PreconditionFailed: 412,\n PayloadTooLarge: 413,\n UriTooLong: 414,\n UnsupportedMediaType: 415,\n RangeNotSatisfiable: 416,\n ExpectationFailed: 417,\n ImATeapot: 418,\n MisdirectedRequest: 421,\n UnprocessableEntity: 422,\n Locked: 423,\n FailedDependency: 424,\n TooEarly: 425,\n UpgradeRequired: 426,\n PreconditionRequired: 428,\n TooManyRequests: 429,\n RequestHeaderFieldsTooLarge: 431,\n UnavailableForLegalReasons: 451,\n InternalServerError: 500,\n NotImplemented: 501,\n BadGateway: 502,\n ServiceUnavailable: 503,\n GatewayTimeout: 504,\n HttpVersionNotSupported: 505,\n VariantAlsoNegotiates: 506,\n InsufficientStorage: 507,\n LoopDetected: 508,\n NotExtended: 510,\n NetworkAuthenticationRequired: 511\n};\nObject.entries(HttpStatusCode).forEach(([key, value]) => {\n HttpStatusCode[value] = key;\n});\n/* harmony default export */ var helpers_HttpStatusCode = (HttpStatusCode);\n;// CONCATENATED MODULE: ./node_modules/axios/lib/axios.js\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/**\n * Create an instance of Axios\n *\n * @param {Object} defaultConfig The default config for the instance\n *\n * @returns {Axios} A new instance of Axios\n */\nfunction createInstance(defaultConfig) {\n const context = new core_Axios(defaultConfig);\n const instance = bind(core_Axios.prototype.request, context);\n\n // Copy axios.prototype to instance\n utils.extend(instance, core_Axios.prototype, context, {\n allOwnKeys: true\n });\n\n // Copy context to instance\n utils.extend(instance, context, null, {\n allOwnKeys: true\n });\n\n // Factory for creating new instances\n instance.create = function create(instanceConfig) {\n return createInstance(mergeConfig(defaultConfig, instanceConfig));\n };\n return instance;\n}\n\n// Create the default instance to be exported\nconst axios = createInstance(lib_defaults);\n\n// Expose Axios class to allow class inheritance\naxios.Axios = core_Axios;\n\n// Expose Cancel & CancelToken\naxios.CanceledError = cancel_CanceledError;\naxios.CancelToken = cancel_CancelToken;\naxios.isCancel = isCancel;\naxios.VERSION = VERSION;\naxios.toFormData = helpers_toFormData;\n\n// Expose AxiosError class\naxios.AxiosError = core_AxiosError;\n\n// alias for CanceledError for backward compatibility\naxios.Cancel = axios.CanceledError;\n\n// Expose all/spread\naxios.all = function all(promises) {\n return Promise.all(promises);\n};\naxios.spread = spread;\n\n// Expose isAxiosError\naxios.isAxiosError = isAxiosError;\n\n// Expose mergeConfig\naxios.mergeConfig = mergeConfig;\naxios.AxiosHeaders = core_AxiosHeaders;\naxios.formToJSON = thing => helpers_formDataToJSON(utils.isHTMLForm(thing) ? new FormData(thing) : thing);\naxios.getAdapter = adapters.getAdapter;\naxios.HttpStatusCode = helpers_HttpStatusCode;\naxios.default = axios;\n\n// this module should only have a default export\n/* harmony default export */ var lib_axios = (axios);\n;// CONCATENATED MODULE: ./src/components/http/index.js\n\n\n\n\n\n\n\n\n\nvar _axios = /*#__PURE__*/new WeakMap();\nvar _requestCount = /*#__PURE__*/new WeakMap();\nvar _loadingInstance = /*#__PURE__*/new WeakMap();\nvar _config = /*#__PURE__*/new WeakMap();\nclass http_Http {\n constructor(options) {\n _classPrivateFieldInitSpec(this, _axios, void 0);\n _classPrivateFieldInitSpec(this, _requestCount, 0);\n // 请求次数\n _classPrivateFieldInitSpec(this, _loadingInstance, null);\n _classPrivateFieldInitSpec(this, _config, {\n baseURL: '',\n timeout: 60 * 1000,\n withCredentials: false,\n successCode: 200,\n errorCode: 500,\n callBackCode: [],\n call: null\n });\n for (const k in _classPrivateFieldGet2(_config, this)) {\n if (options[k]) {\n _classPrivateFieldGet2(_config, this)[k] = options[k];\n }\n }\n lib_axios.defaults.headers['Content-Type'] = 'application/json;charset=UTF-8';\n lib_axios.defaults.headers['Accept'] = 'application/json';\n _classPrivateFieldSet2(_axios, this, lib_axios.create(_classPrivateFieldGet2(_config, this)));\n _classPrivateFieldGet2(_axios, this).interceptors.request.use(config => {\n var _this$requestCount, _this$requestCount2;\n if (!config.params) {\n config.params = {};\n }\n if (_classPrivateFieldGet2(_requestCount, this) == 0) {\n _classPrivateFieldSet2(_loadingInstance, this, loading());\n }\n _classPrivateFieldSet2(_requestCount, this, (_this$requestCount = _classPrivateFieldGet2(_requestCount, this), _this$requestCount2 = _this$requestCount++, _this$requestCount)), _this$requestCount2;\n config.headers.authorization = localStorage.getItem('token');\n return config;\n }, error => {\n return Promise.reject(error);\n });\n _classPrivateFieldGet2(_axios, this).interceptors.response.use(response => {\n var _this$requestCount3, _this$requestCount4;\n _classPrivateFieldSet2(_requestCount, this, (_this$requestCount3 = _classPrivateFieldGet2(_requestCount, this), _this$requestCount4 = _this$requestCount3--, _this$requestCount3)), _this$requestCount4;\n if (_classPrivateFieldGet2(_requestCount, this) === 0) {\n _classPrivateFieldGet2(_loadingInstance, this).close();\n }\n return response.data;\n }, error => {\n var _this$requestCount5, _this$requestCount6;\n _classPrivateFieldSet2(_requestCount, this, (_this$requestCount5 = _classPrivateFieldGet2(_requestCount, this), _this$requestCount6 = _this$requestCount5--, _this$requestCount5)), _this$requestCount6;\n if (_classPrivateFieldGet2(_requestCount, this) === 0) {\n _classPrivateFieldGet2(_loadingInstance, this).close();\n }\n return Promise.reject(error);\n });\n }\n _handleResult(success, err, res) {\n if (!res) {\n return;\n }\n if (res.code === _classPrivateFieldGet2(_config, this).successCode) {\n if (typeof success === 'function') {\n success(res);\n }\n } else if (res.code === _classPrivateFieldGet2(_config, this).errorCode) {\n if (typeof err === 'function') {\n err(res);\n } else {\n error(res.msg);\n }\n } else if (_classPrivateFieldGet2(_config, this).callBackCode.includes(res.code) && typeof _classPrivateFieldGet2(_config, this).call === 'function') {\n _classPrivateFieldGet2(_config, this).call(res);\n }\n }\n post(url, params, success, err) {\n _classPrivateFieldGet2(_axios, this).post(url, params).then(res => {\n this._handleResult(success, err, res);\n });\n }\n update(url, params, success, err) {\n _classPrivateFieldGet2(_axios, this).update(url, params).then(res => {\n this._handleResult(success, err, res);\n });\n }\n get(url, params, success, err) {\n _classPrivateFieldGet2(_axios, this).get(url, {\n params: params\n }).then(res => {\n this._handleResult(success, err, res);\n });\n }\n delete(url, params, success, err) {\n _classPrivateFieldGet2(_axios, this).delete(url, {\n params: params\n }).then(res => {\n this._handleResult(success, err, res);\n });\n }\n downLoad(url, params = {}) {\n _classPrivateFieldGet2(_axios, this).post(url, params, {\n 'responseType': 'blob'\n }).then(res => {\n if (res) {\n let fileName = params.fileName;\n if (!fileName) {\n fileName = res.headers['content-disposition'].split('filename=')[1].replace(/\"/g, '');\n }\n const blob = new Blob([res.data], {\n type: 'application/octet-stream;charset=UTF-8'\n });\n const link = document.createElement('a');\n link.style.display = 'none';\n link.href = window.URL.createObjectURL(blob);\n link.download = decodeURIComponent(fileName);\n link.click();\n window.URL.revokeObjectURL(link.href);\n }\n });\n }\n}\n;// CONCATENATED MODULE: ./src/components/index.js\n__webpack_require__(3472);\n\n\n\n\n\n\nconst coms = [Index, page_table_Index, dialog_Index, card_Index, tree_Index];\nconst install = function (Vue) {\n coms.forEach(com => {\n Vue.component(com.name, com);\n });\n};\n\n// 导出组件\n/* harmony default export */ var components = (install);\nclass Http extends http_Http {\n constructor(options) {\n super(options);\n }\n}\n;// CONCATENATED MODULE: ./node_modules/@vue/cli-service/lib/commands/build/entry-lib.js\n\n\n/* harmony default export */ var entry_lib = (components);\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QzZ1QixHQUFHLENBQUNDLGVBQWUsQ0FBQ0osSUFBSSxDQUFDO1FBQzVDQyxJQUFJLENBQUNJLFFBQVEsR0FBR3ZULGtCQUFrQixDQUFDMUwsUUFBUSxDQUFDO1FBQzVDNmUsSUFBSSxDQUFDbnJCLEtBQUssQ0FBQyxDQUFDO1FBQ1p4RCxNQUFNLENBQUM2dUIsR0FBRyxDQUFDRyxlQUFlLENBQUNMLElBQUksQ0FBQ25TLElBQUksQ0FBQztNQUN0QztJQUNLLENBQUMsQ0FBQztFQUNOO0FBQ0osQzs7QUN2SEF5UyxtQkFBTyxDQUFDLElBQW9CLENBQUM7QUFDbUI7QUFDRDtBQUNQO0FBQ0o7QUFDQTtBQUNBO0FBQ3BDLE1BQU1PLElBQUksR0FBRyxDQUFDTixLQUFVLEVBQUVDLGdCQUFTLEVBQUVDLFlBQU0sRUFBRUMsVUFBSSxFQUFFQyxVQUFJLENBQUM7QUFDeEQsTUFBTUcsT0FBTyxHQUFHLFNBQUFBLENBQVNud0IsR0FBRyxFQUFDO0VBQ3pCa3dCLElBQUksQ0FBQy90QixPQUFPLENBQUNpdUIsR0FBRyxJQUFJO0lBQ2hCcHdCLEdBQUcsQ0FBQ3F3QixTQUFTLENBQUNELEdBQUcsQ0FBQ3gzQixJQUFJLEVBQUV3M0IsR0FBRyxDQUFDO0VBQ2hDLENBQUMsQ0FBQztBQUNOLENBQUM7O0FBRUQ7QUFDQSwrQ0FBZUQsT0FBTyxFQUFDO0FBRWhCLE1BQU1uQyxJQUFJLFNBQVNpQyxTQUFLO0VBQzNCbm9CLFdBQVdBLENBQUNpSyxPQUFPLEVBQUM7SUFDaEIsS0FBSyxDQUFDQSxPQUFPLENBQUM7RUFDbEI7QUFDSixDOztBQ3JCd0I7QUFDQTtBQUN4Qiw4Q0FBZSxVQUFHO0FBQ0kiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly92dWUyLy4vbm9kZV9tb2R1bGVzL0B2dWUvY2xpLXNlcnZpY2UvbGliL2NvbW1hbmRzL2J1aWxkL3NldFB1YmxpY1BhdGguanM/NjljYiIsIndlYnBhY2s6Ly92dWUyLy4vc3JjL2NvbXBvbmVudHMvcGFnaW5hdGlvbi9JbmRleC52dWU/MjczMyIsIndlYnBhY2s6Ly92dWUyL3NyYy9jb21wb25lbnRzL3BhZ2luYXRpb24vSW5kZXgudnVlPzNjNWUiLCJ3ZWJwYWNrOi8vdnVlMi8uL3NyYy9jb21wb25lbnRzL3BhZ2luYXRpb24vSW5kZXgudnVlPzgyYWYiLCJ3ZWJwYWNrOi8vdnVlMi8uL3NyYy9jb21wb25lbnRzL3BhZ2luYXRpb24vSW5kZXgudnVlP2Q0ZDAiLCJ3ZWJwYWNrOi8vdnVlMi8uL3NyYy9jb21wb25lbnRzL3BhZ2luYXRpb24vSW5kZXgudnVlP2U4MjgiLCJ3ZWJwYWNrOi8vdnVlMi8uL25vZGVfbW9kdWxlcy9AdnVlL3Z1ZS1sb2FkZXItdjE1L2xpYi9ydW50aW1lL2NvbXBvbmVudE5vcm1hbGl6ZXIuanM/MmY4NSIsIndlYnBhY2s6Ly92dWUyLy4vc3JjL2NvbXBvbmVudHMvcGFnaW5hdGlvbi9JbmRleC52dWU/ZmIxZCIsIndlYnBhY2s6Ly92dWUyLy4vc3JjL2NvbXBvbmVudHMvcGFnZS10YWJsZS9JbmRleC52dWU/MDhiYSIsIndlYnBhY2s6Ly92dWUyL3NyYy9jb21wb25lbnRzL3BhZ2UtdGFibGUvSW5kZXgudnVlPzVkMDMiLCJ3ZWJwYWNrOi8vdnVlMi8uL3NyYy9jb21wb25lbnRzL3BhZ2UtdGFibGUvSW5kZXgudnVlPzc3NGEiLCJ3ZWJwYWNrOi8vdnVlMi8uL3NyYy9jb21wb25lbnRzL3BhZ2UtdGFibGUvSW5kZXgudnVlPzQ5NmEiLCJ3ZWJwYWNrOi8vdnVlMi8uL3NyYy9jb21wb25lbnRzL3BhZ2UtdGFibGUvSW5kZXgudnVlPzllMmEiLCJ3ZWJwYWNrOi8vdnVlMi8uL3NyYy9jb21wb25lbnRzL3BhZ2UtdGFibGUvSW5kZXgudnVlPzM4YTAiLCJ3ZWJwYWNrOi8vdnVlMi8uL3NyYy9jb21wb25lbnRzL2RpYWxvZy9JbmRleC52dWU/MGU3MSIsIndlYnBhY2s6Ly92dWUyLy4vc3JjL2NvbXBvbmVudHMvZGlhbG9nL2RpYWxvZy1kcmFnLmpzPzVlYmQiLCJ3ZWJwYWNrOi8vdnVlMi9zcmMvY29tcG9uZW50cy9kaWFsb2cvSW5kZXgudnVlPzRkYjYiLCJ3ZWJwYWNrOi8vdnVlMi8uL3NyYy9jb21wb25lbnRzL2RpYWxvZy9JbmRleC52dWU/MjBlNyIsIndlYnBhY2s6Ly92dWUyLy4vc3JjL2NvbXBvbmVudHMvZGlhbG9nL0luZGV4LnZ1ZT84Nzc0Iiwid2VicGFjazovL3Z1ZTIvLi9zcmMvY29tcG9uZW50cy9kaWFsb2cvSW5kZXgudnVlP2IzOWYiLCJ3ZWJwYWNrOi8vdnVlMi8uL3NyYy9jb21wb25lbnRzL2RpYWxvZy9JbmRleC52dWU/NjExOCIsIndlYnBhY2s6Ly92dWUyLy4vc3JjL2NvbXBvbmVudHMvY2FyZC9JbmRleC52dWU/ZTdmYSIsIndlYnBhY2s6Ly92dWUyL3NyYy9jb21wb25lbnRzL2NhcmQvSW5kZXgudnVlP2MxZmIiLCJ3ZWJwYWNrOi8vdnVlMi8uL3NyYy9jb21wb25lbnRzL2NhcmQvSW5kZXgudnVlPzMwYmIiLCJ3ZWJwYWNrOi8vdnVlMi8uL3NyYy9jb21wb25lbnRzL2NhcmQvSW5kZXgudnVlP2U5NTgiLCJ3ZWJwYWNrOi8vdnVlMi8uL3NyYy9jb21wb25lbnRzL2NhcmQvSW5kZXgudnVlP2YxMmQiLCJ3ZWJwYWNrOi8vdnVlMi8uL3NyYy9jb21wb25lbnRzL2NhcmQvSW5kZXgudnVlP2YzMzUiLCJ3ZWJwYWNrOi8vdnVlMi8uL3NyYy9jb21wb25lbnRzL3RyZWUvSW5kZXgudnVlPzkwOWMiLCJ3ZWJwYWNrOi8vdnVlMi8uL3NyYy9jb21wb25lbnRzL3RyZWUvdHJlZS5qcz80MmM2Iiwid2VicGFjazovL3Z1ZTIvc3JjL2NvbXBvbmVudHMvdHJlZS9JbmRleC52dWU/YmY2NiIsIndlYnBhY2s6Ly92dWUyLy4vc3JjL2NvbXBvbmVudHMvdHJlZS9JbmRleC52dWU/MTU0YiIsIndlYnBhY2s6Ly92dWUyLy4vc3JjL2NvbXBvbmVudHMvdHJlZS9JbmRleC52dWU/ZTZiMCIsIndlYnBhY2s6Ly92dWUyLy4vc3JjL2NvbXBvbmVudHMvdHJlZS9JbmRleC52dWU/YThkMiIsIndlYnBhY2s6Ly92dWUyLy4vc3JjL2NvbXBvbmVudHMvdHJlZS9JbmRleC52dWU/N2EwMSIsIndlYnBhY2s6Ly92dWUyLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NoZWNrUHJpdmF0ZVJlZGVjbGFyYXRpb24uanM/Yjg1ZiIsIndlYnBhY2s6Ly92dWUyLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWMuanM/Y2ZkYSIsIndlYnBhY2s6Ly92dWUyLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2Fzc2VydENsYXNzQnJhbmQuanM/MTlmOCIsIndlYnBhY2s6Ly92dWUyLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NsYXNzUHJpdmF0ZUZpZWxkU2V0Mi5qcz80NGJmIiwid2VicGFjazovL3Z1ZTIvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY2xhc3NQcml2YXRlRmllbGRHZXQyLmpzPzkyOWUiLCJ3ZWJwYWNrOi8vdnVlMi8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9iaW5kLmpzPzRiZWEiLCJ3ZWJwYWNrOi8vdnVlMi8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvdXRpbHMuanM/YzllYiIsIndlYnBhY2s6Ly92dWUyLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9jb3JlL0F4aW9zRXJyb3IuanM/MjAyNyIsIndlYnBhY2s6Ly92dWUyLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL251bGwuanM/MWE5NCIsIndlYnBhY2s6Ly92dWUyLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL3RvRm9ybURhdGEuanM/OWJhMyIsIndlYnBhY2s6Ly92dWUyLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL0F4aW9zVVJMU2VhcmNoUGFyYW1zLmpzPzkzZTIiLCJ3ZWJwYWNrOi8vdnVlMi8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9idWlsZFVSTC5qcz9jMTc4Iiwid2VicGFjazovL3Z1ZTIvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvSW50ZXJjZXB0b3JNYW5hZ2VyLmpzP2M3OTIiLCJ3ZWJwYWNrOi8vdnVlMi8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvZGVmYXVsdHMvdHJhbnNpdGlvbmFsLmpzPzI3YTQiLCJ3ZWJwYWNrOi8vdnVlMi8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvcGxhdGZvcm0vYnJvd3Nlci9jbGFzc2VzL1VSTFNlYXJjaFBhcmFtcy5qcz9hMGVkIiwid2VicGFjazovL3Z1ZTIvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL3BsYXRmb3JtL2Jyb3dzZXIvY2xhc3Nlcy9Gb3JtRGF0YS5qcz8xZGI5Iiwid2VicGFjazovL3Z1ZTIvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL3BsYXRmb3JtL2Jyb3dzZXIvY2xhc3Nlcy9CbG9iLmpzPzZkNzgiLCJ3ZWJwYWNrOi8vdnVlMi8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvcGxhdGZvcm0vYnJvd3Nlci9pbmRleC5qcz9iMmU0Iiwid2VicGFjazovL3Z1ZTIvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL3BsYXRmb3JtL2NvbW1vbi91dGlscy5qcz9iZjhjIiwid2VicGFjazovL3Z1ZTIvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL3BsYXRmb3JtL2luZGV4LmpzPzc4ZjEiLCJ3ZWJwYWNrOi8vdnVlMi8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy90b1VSTEVuY29kZWRGb3JtLmpzPzhmZTkiLCJ3ZWJwYWNrOi8vdnVlMi8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9mb3JtRGF0YVRvSlNPTi5qcz9mNDM3Iiwid2VicGFjazovL3Z1ZTIvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2RlZmF1bHRzL2luZGV4LmpzP2ZmMTAiLCJ3ZWJwYWNrOi8vdnVlMi8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9wYXJzZUhlYWRlcnMuanM/NTRlOSIsIndlYnBhY2s6Ly92dWUyLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9jb3JlL0F4aW9zSGVhZGVycy5qcz85NTk3Iiwid2VicGFjazovL3Z1ZTIvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvdHJhbnNmb3JtRGF0YS5qcz83NjYyIiwid2VicGFjazovL3Z1ZTIvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NhbmNlbC9pc0NhbmNlbC5qcz9jMTdhIiwid2VicGFjazovL3Z1ZTIvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NhbmNlbC9DYW5jZWxlZEVycm9yLmpzPzY4YTQiLCJ3ZWJwYWNrOi8vdnVlMi8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvY29yZS9zZXR0bGUuanM/ODc2OCIsIndlYnBhY2s6Ly92dWUyLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL2Nvb2tpZXMuanM/MWQzZiIsIndlYnBhY2s6Ly92dWUyLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL2lzQWJzb2x1dGVVUkwuanM/YTIyNyIsIndlYnBhY2s6Ly92dWUyLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL2NvbWJpbmVVUkxzLmpzPzZiYzYiLCJ3ZWJwYWNrOi8vdnVlMi8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvY29yZS9idWlsZEZ1bGxQYXRoLmpzP2YwMmQiLCJ3ZWJwYWNrOi8vdnVlMi8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9pc1VSTFNhbWVPcmlnaW4uanM/ODc5NSIsIndlYnBhY2s6Ly92dWUyLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL3BhcnNlUHJvdG9jb2wuanM/OWZhYyIsIndlYnBhY2s6Ly92dWUyLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL3NwZWVkb21ldGVyLmpzPzU5YzAiLCJ3ZWJwYWNrOi8vdnVlMi8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvYWRhcHRlcnMveGhyLmpzPzFhNWMiLCJ3ZWJwYWNrOi8vdnVlMi8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvYWRhcHRlcnMvYWRhcHRlcnMuanM/NzgyNSIsIndlYnBhY2s6Ly92dWUyLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9jb3JlL2Rpc3BhdGNoUmVxdWVzdC5qcz80ZGM5Iiwid2VicGFjazovL3Z1ZTIvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvbWVyZ2VDb25maWcuanM/YmQxMyIsIndlYnBhY2s6Ly92dWUyLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9lbnYvZGF0YS5qcz8xMTBmIiwid2VicGFjazovL3Z1ZTIvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvdmFsaWRhdG9yLmpzPzAxMzIiLCJ3ZWJwYWNrOi8vdnVlMi8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvY29yZS9BeGlvcy5qcz8yOWZiIiwid2VicGFjazovL3Z1ZTIvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NhbmNlbC9DYW5jZWxUb2tlbi5qcz83MmM4Iiwid2VicGFjazovL3Z1ZTIvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvc3ByZWFkLmpzPzI3MjkiLCJ3ZWJwYWNrOi8vdnVlMi8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9pc0F4aW9zRXJyb3IuanM/YmQ5ZCIsIndlYnBhY2s6Ly92dWUyLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL0h0dHBTdGF0dXNDb2RlLmpzP2M2ZjMiLCJ3ZWJwYWNrOi8vdnVlMi8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvYXhpb3MuanM/ZmFkNiIsIndlYnBhY2s6Ly92dWUyLy4vc3JjL2NvbXBvbmVudHMvaHR0cC9pbmRleC5qcz9jYzZhIiwid2VicGFjazovL3Z1ZTIvLi9zcmMvY29tcG9uZW50cy9pbmRleC5qcz8xNTY4Iiwid2VicGFjazovL3Z1ZTIvLi9ub2RlX21vZHVsZXMvQHZ1ZS9jbGktc2VydmljZS9saWIvY29tbWFuZHMvYnVpbGQvZW50cnktbGliLmpzPzhhOTciXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tdmFyICovXG4vLyBUaGlzIGZpbGUgaXMgaW1wb3J0ZWQgaW50byBsaWIvd2MgY2xpZW50IGJ1bmRsZXMuXG5cbmlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICB2YXIgY3VycmVudFNjcmlwdCA9IHdpbmRvdy5kb2N1bWVudC5jdXJyZW50U2NyaXB0XG4gIGlmIChwcm9jZXNzLmVudi5ORUVEX0NVUlJFTlRTQ1JJUFRfUE9MWUZJTEwpIHtcbiAgICB2YXIgZ2V0Q3VycmVudFNjcmlwdCA9IHJlcXVpcmUoJ0Bzb2RhL2dldC1jdXJyZW50LXNjcmlwdCcpXG4gICAgY3VycmVudFNjcmlwdCA9IGdldEN1cnJlbnRTY3JpcHQoKVxuXG4gICAgLy8gZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIGJlY2F1c2UgcHJldmlvdXNseSB3ZSBkaXJlY3RseSBpbmNsdWRlZCB0aGUgcG9seWZpbGxcbiAgICBpZiAoISgnY3VycmVudFNjcmlwdCcgaW4gZG9jdW1lbnQpKSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZG9jdW1lbnQsICdjdXJyZW50U2NyaXB0JywgeyBnZXQ6IGdldEN1cnJlbnRTY3JpcHQgfSlcbiAgICB9XG4gIH1cblxuICB2YXIgc3JjID0gY3VycmVudFNjcmlwdCAmJiBjdXJyZW50U2NyaXB0LnNyYy5tYXRjaCgvKC4rXFwvKVteL10rXFwuanMoXFw/LiopPyQvKVxuICBpZiAoc3JjKSB7XG4gICAgX193ZWJwYWNrX3B1YmxpY19wYXRoX18gPSBzcmNbMV0gLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICB9XG59XG5cbi8vIEluZGljYXRlIHRvIHdlYnBhY2sgdGhhdCB0aGlzIGZpbGUgY2FuIGJlIGNvbmNhdGVuYXRlZFxuZXhwb3J0IGRlZmF1bHQgbnVsbFxuIiwidmFyIHJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpe3ZhciBfdm09dGhpcyxfYz1fdm0uX3NlbGYuX2M7cmV0dXJuIChfdm0udG90YWw+MCk/X2MoJ2RpdicsW19jKCdlbC1wYWdpbmF0aW9uJyxfdm0uX2Ioe2F0dHJzOntcImJhY2tncm91bmRcIjpcIlwiLFwiY3VycmVudC1wYWdlXCI6X3ZtLmN1cnJlbnRQYWdlLFwicGFnZS1zaXplXCI6X3ZtLnBhZ2VTaXplLFwicGFnZS1zaXplc1wiOl92bS5wYWdlU2l6ZXMsXCJ0b3RhbFwiOl92bS50b3RhbCxcImxheW91dFwiOlwicHJldiwgcGFnZXIsIG5leHRcIn0sb246e1wic2l6ZS1jaGFuZ2VcIjpfdm0uaGFuZGxlU2l6ZUNoYW5nZSxcImN1cnJlbnQtY2hhbmdlXCI6X3ZtLmhhbmRsZUN1cnJlbnRDaGFuZ2V9fSwnZWwtcGFnaW5hdGlvbicsX3ZtLiRhdHRycyxmYWxzZSkpXSwxKTpfdm0uX2UoKVxufVxudmFyIHN0YXRpY1JlbmRlckZucyA9IFtdXG5cbmV4cG9ydCB7IHJlbmRlciwgc3RhdGljUmVuZGVyRm5zIH0iLCI8dGVtcGxhdGU+XHJcbiAgICA8ZGl2IHYtaWY9XCJ0b3RhbD4wXCI+XHJcbiAgICAgICAgPGVsLXBhZ2luYXRpb25cclxuICAgICAgICAgICAgYmFja2dyb3VuZCBcclxuICAgICAgICAgICAgOmN1cnJlbnQtcGFnZT1cImN1cnJlbnRQYWdlXCJcclxuICAgICAgICAgICAgOnBhZ2Utc2l6ZT1cInBhZ2VTaXplXCJcclxuICAgICAgICAgICAgOnBhZ2Utc2l6ZXM9XCJwYWdlU2l6ZXNcIlxyXG4gICAgICAgICAgICA6dG90YWw9XCJ0b3RhbFwiXHJcbiAgICAgICAgICAgIGxheW91dD1cInByZXYsIHBhZ2VyLCBuZXh0XCJcclxuICAgICAgICAgICAgdi1iaW5kPVwiJGF0dHJzXCJcclxuICAgICAgICAgICAgQHNpemUtY2hhbmdlPVwiaGFuZGxlU2l6ZUNoYW5nZVwiXHJcbiAgICAgICAgICAgIEBjdXJyZW50LWNoYW5nZT1cImhhbmRsZUN1cnJlbnRDaGFuZ2VcIlxyXG4gICAgICAgIC8+XHJcbiAgICA8L2Rpdj5cclxuPC90ZW1wbGF0ZT5cclxuXHJcbjxzY3JpcHQ+XHJcbiAgICBleHBvcnQgZGVmYXVsdCB7XHJcbiAgICAgICAgbmFtZTogJ1BhZ2luYXRpb24nLFxyXG4gICAgICAgIHByb3BzOiB7XHJcbiAgICAgICAgICAgIHRvdGFsOiB7XHJcbiAgICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIHR5cGU6IE51bWJlcixcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IDBcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgcGFnZToge1xyXG4gICAgICAgICAgICAgICAgdHlwZTogTnVtYmVyLFxyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDogMVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBsaW1pdDoge1xyXG4gICAgICAgICAgICAgICAgdHlwZTogTnVtYmVyLFxyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDogMjBcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgcGFnZVNpemVzOiB7XHJcbiAgICAgICAgICAgICAgICB0eXBlOiBBcnJheSxcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsxMCwgMTUsIDIwLCAzMCwgNTBdXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgfSxcclxuICAgICAgICBjb21wdXRlZDoge1xyXG4gICAgICAgICAgICBjdXJyZW50UGFnZToge1xyXG4gICAgICAgICAgICAgICAgZ2V0KCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnBhZ2VcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBzZXQodmFsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kZW1pdCgndXBkYXRlOnBhZ2UnLCB2YWwpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHBhZ2VTaXplOiB7XHJcbiAgICAgICAgICAgICAgICBnZXQoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubGltaXRcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBzZXQodmFsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kZW1pdCgndXBkYXRlOmxpbWl0JywgdmFsKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB0b3RhbENvdW50OiB7XHJcbiAgICAgICAgICAgICAgICBnZXQoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudG90YWxcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBzZXQodmFsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kZW1pdCgndXBkYXRlOnRvdGFsJywgdmFsKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBtZXRob2RzOiB7XHJcbiAgICAgICAgICAgIGhhbmRsZVNpemVDaGFuZ2UodmFsKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLiRlbWl0KCdwYWdpbmF0aW9uJywgeyBwYWdlOiB0aGlzLmN1cnJlbnRQYWdlLCBsaW1pdDogdmFsIH0pXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGhhbmRsZUN1cnJlbnRDaGFuZ2UodmFsKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLiRlbWl0KCdwYWdpbmF0aW9uJywgeyBwYWdlOiB2YWwsIGxpbWl0OiB0aGlzLnBhZ2VTaXplIH0pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbjwvc2NyaXB0PlxyXG5cclxuPHN0eWxlIGxhbmc9XCJzY3NzXCIgc2NvcGVkPlxyXG4uZWwtcGFnaW5hdGlvbntcclxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcclxuICAgIG1hcmdpbi10b3A6IDIwcHg7XHJcbn1cclxuPC9zdHlsZT4iLCJpbXBvcnQgbW9kIGZyb20gXCItIS4uLy4uLy4uL25vZGVfbW9kdWxlcy90aHJlYWQtbG9hZGVyL2Rpc3QvY2pzLmpzIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliL2luZGV4LmpzPz9jbG9uZWRSdWxlU2V0LTQwLnVzZVsxXSEuLi8uLi8uLi9ub2RlX21vZHVsZXMvQHZ1ZS92dWUtbG9hZGVyLXYxNS9saWIvaW5kZXguanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL0luZGV4LnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qc1wiOyBleHBvcnQgZGVmYXVsdCBtb2Q7IGV4cG9ydCAqIGZyb20gXCItIS4uLy4uLy4uL25vZGVfbW9kdWxlcy90aHJlYWQtbG9hZGVyL2Rpc3QvY2pzLmpzIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliL2luZGV4LmpzPz9jbG9uZWRSdWxlU2V0LTQwLnVzZVsxXSEuLi8uLi8uLi9ub2RlX21vZHVsZXMvQHZ1ZS92dWUtbG9hZGVyLXYxNS9saWIvaW5kZXguanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL0luZGV4LnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qc1wiIiwiLy8gZXh0cmFjdGVkIGJ5IG1pbmktY3NzLWV4dHJhY3QtcGx1Z2luXG5leHBvcnQge307IiwiZXhwb3J0ICogZnJvbSBcIi0hLi4vLi4vLi4vbm9kZV9tb2R1bGVzL21pbmktY3NzLWV4dHJhY3QtcGx1Z2luL2Rpc3QvbG9hZGVyLmpzPz9jbG9uZWRSdWxlU2V0LTIyLnVzZVswXSEuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcz8/Y2xvbmVkUnVsZVNldC0yMi51c2VbMV0hLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0B2dWUvdnVlLWxvYWRlci12MTUvbGliL2xvYWRlcnMvc3R5bGVQb3N0TG9hZGVyLmpzIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9wb3N0Y3NzLWxvYWRlci9kaXN0L2Nqcy5qcz8/Y2xvbmVkUnVsZVNldC0yMi51c2VbMl0hLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3Nhc3MtbG9hZGVyL2Rpc3QvY2pzLmpzPz9jbG9uZWRSdWxlU2V0LTIyLnVzZVszXSEuLi8uLi8uLi9ub2RlX21vZHVsZXMvQHZ1ZS92dWUtbG9hZGVyLXYxNS9saWIvaW5kZXguanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL0luZGV4LnZ1ZT92dWUmdHlwZT1zdHlsZSZpbmRleD0wJmlkPTI2YjcwZmI0JnByb2QmbGFuZz1zY3NzJnNjb3BlZD10cnVlXCIiLCIvKiBnbG9iYWxzIF9fVlVFX1NTUl9DT05URVhUX18gKi9cblxuLy8gSU1QT1JUQU5UOiBEbyBOT1QgdXNlIEVTMjAxNSBmZWF0dXJlcyBpbiB0aGlzIGZpbGUgKGV4Y2VwdCBmb3IgbW9kdWxlcykuXG4vLyBUaGlzIG1vZHVsZSBpcyBhIHJ1bnRpbWUgdXRpbGl0eSBmb3IgY2xlYW5lciBjb21wb25lbnQgbW9kdWxlIG91dHB1dCBhbmQgd2lsbFxuLy8gYmUgaW5jbHVkZWQgaW4gdGhlIGZpbmFsIHdlYnBhY2sgdXNlciBidW5kbGUuXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG5vcm1hbGl6ZUNvbXBvbmVudChcbiAgc2NyaXB0RXhwb3J0cyxcbiAgcmVuZGVyLFxuICBzdGF0aWNSZW5kZXJGbnMsXG4gIGZ1bmN0aW9uYWxUZW1wbGF0ZSxcbiAgaW5qZWN0U3R5bGVzLFxuICBzY29wZUlkLFxuICBtb2R1bGVJZGVudGlmaWVyIC8qIHNlcnZlciBvbmx5ICovLFxuICBzaGFkb3dNb2RlIC8qIHZ1ZS1jbGkgb25seSAqL1xuKSB7XG4gIC8vIFZ1ZS5leHRlbmQgY29uc3RydWN0b3IgZXhwb3J0IGludGVyb3BcbiAgdmFyIG9wdGlvbnMgPVxuICAgIHR5cGVvZiBzY3JpcHRFeHBvcnRzID09PSAnZnVuY3Rpb24nID8gc2NyaXB0RXhwb3J0cy5vcHRpb25zIDogc2NyaXB0RXhwb3J0c1xuXG4gIC8vIHJlbmRlciBmdW5jdGlvbnNcbiAgaWYgKHJlbmRlcikge1xuICAgIG9wdGlvbnMucmVuZGVyID0gcmVuZGVyXG4gICAgb3B0aW9ucy5zdGF0aWNSZW5kZXJGbnMgPSBzdGF0aWNSZW5kZXJGbnNcbiAgICBvcHRpb25zLl9jb21waWxlZCA9IHRydWVcbiAgfVxuXG4gIC8vIGZ1bmN0aW9uYWwgdGVtcGxhdGVcbiAgaWYgKGZ1bmN0aW9uYWxUZW1wbGF0ZSkge1xuICAgIG9wdGlvbnMuZnVuY3Rpb25hbCA9IHRydWVcbiAgfVxuXG4gIC8vIHNjb3BlZElkXG4gIGlmIChzY29wZUlkKSB7XG4gICAgb3B0aW9ucy5fc2NvcGVJZCA9ICdkYXRhLXYtJyArIHNjb3BlSWRcbiAgfVxuXG4gIHZhciBob29rXG4gIGlmIChtb2R1bGVJZGVudGlmaWVyKSB7XG4gICAgLy8gc2VydmVyIGJ1aWxkXG4gICAgaG9vayA9IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICAvLyAyLjMgaW5qZWN0aW9uXG4gICAgICBjb250ZXh0ID1cbiAgICAgICAgY29udGV4dCB8fCAvLyBjYWNoZWQgY2FsbFxuICAgICAgICAodGhpcy4kdm5vZGUgJiYgdGhpcy4kdm5vZGUuc3NyQ29udGV4dCkgfHwgLy8gc3RhdGVmdWxcbiAgICAgICAgKHRoaXMucGFyZW50ICYmIHRoaXMucGFyZW50LiR2bm9kZSAmJiB0aGlzLnBhcmVudC4kdm5vZGUuc3NyQ29udGV4dCkgLy8gZnVuY3Rpb25hbFxuICAgICAgLy8gMi4yIHdpdGggcnVuSW5OZXdDb250ZXh0OiB0cnVlXG4gICAgICBpZiAoIWNvbnRleHQgJiYgdHlwZW9mIF9fVlVFX1NTUl9DT05URVhUX18gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGNvbnRleHQgPSBfX1ZVRV9TU1JfQ09OVEVYVF9fXG4gICAgICB9XG4gICAgICAvLyBpbmplY3QgY29tcG9uZW50IHN0eWxlc1xuICAgICAgaWYgKGluamVjdFN0eWxlcykge1xuICAgICAgICBpbmplY3RTdHlsZXMuY2FsbCh0aGlzLCBjb250ZXh0KVxuICAgICAgfVxuICAgICAgLy8gcmVnaXN0ZXIgY29tcG9uZW50IG1vZHVsZSBpZGVudGlmaWVyIGZvciBhc3luYyBjaHVuayBpbmZlcnJlbmNlXG4gICAgICBpZiAoY29udGV4dCAmJiBjb250ZXh0Ll9yZWdpc3RlcmVkQ29tcG9uZW50cykge1xuICAgICAgICBjb250ZXh0Ll9yZWdpc3RlcmVkQ29tcG9uZW50cy5hZGQobW9kdWxlSWRlbnRpZmllcilcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gdXNlZCBieSBzc3IgaW4gY2FzZSBjb21wb25lbnQgaXMgY2FjaGVkIGFuZCBiZWZvcmVDcmVhdGVcbiAgICAvLyBuZXZlciBnZXRzIGNhbGxlZFxuICAgIG9wdGlvbnMuX3NzclJlZ2lzdGVyID0gaG9va1xuICB9IGVsc2UgaWYgKGluamVjdFN0eWxlcykge1xuICAgIGhvb2sgPSBzaGFkb3dNb2RlXG4gICAgICA/IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpbmplY3RTdHlsZXMuY2FsbChcbiAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgICAob3B0aW9ucy5mdW5jdGlvbmFsID8gdGhpcy5wYXJlbnQgOiB0aGlzKS4kcm9vdC4kb3B0aW9ucy5zaGFkb3dSb290XG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICA6IGluamVjdFN0eWxlc1xuICB9XG5cbiAgaWYgKGhvb2spIHtcbiAgICBpZiAob3B0aW9ucy5mdW5jdGlvbmFsKSB7XG4gICAgICAvLyBmb3IgdGVtcGxhdGUtb25seSBob3QtcmVsb2FkIGJlY2F1c2UgaW4gdGhhdCBjYXNlIHRoZSByZW5kZXIgZm4gZG9lc24ndFxuICAgICAgLy8gZ28gdGhyb3VnaCB0aGUgbm9ybWFsaXplclxuICAgICAgb3B0aW9ucy5faW5qZWN0U3R5bGVzID0gaG9va1xuICAgICAgLy8gcmVnaXN0ZXIgZm9yIGZ1bmN0aW9uYWwgY29tcG9uZW50IGluIHZ1ZSBmaWxlXG4gICAgICB2YXIgb3JpZ2luYWxSZW5kZXIgPSBvcHRpb25zLnJlbmRlclxuICAgICAgb3B0aW9ucy5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXJXaXRoU3R5bGVJbmplY3Rpb24oaCwgY29udGV4dCkge1xuICAgICAgICBob29rLmNhbGwoY29udGV4dClcbiAgICAgICAgcmV0dXJuIG9yaWdpbmFsUmVuZGVyKGgsIGNvbnRleHQpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGluamVjdCBjb21wb25lbnQgcmVnaXN0cmF0aW9uIGFzIGJlZm9yZUNyZWF0ZSBob29rXG4gICAgICB2YXIgZXhpc3RpbmcgPSBvcHRpb25zLmJlZm9yZUNyZWF0ZVxuICAgICAgb3B0aW9ucy5iZWZvcmVDcmVhdGUgPSBleGlzdGluZyA/IFtdLmNvbmNhdChleGlzdGluZywgaG9vaykgOiBbaG9va11cbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGV4cG9ydHM6IHNjcmlwdEV4cG9ydHMsXG4gICAgb3B0aW9uczogb3B0aW9uc1xuICB9XG59XG4iLCJpbXBvcnQgeyByZW5kZXIsIHN0YXRpY1JlbmRlckZucyB9IGZyb20gXCIuL0luZGV4LnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD0yNmI3MGZiNCZzY29wZWQ9dHJ1ZVwiXG5pbXBvcnQgc2NyaXB0IGZyb20gXCIuL0luZGV4LnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qc1wiXG5leHBvcnQgKiBmcm9tIFwiLi9JbmRleC52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anNcIlxuaW1wb3J0IHN0eWxlMCBmcm9tIFwiLi9JbmRleC52dWU/dnVlJnR5cGU9c3R5bGUmaW5kZXg9MCZpZD0yNmI3MGZiNCZwcm9kJmxhbmc9c2NzcyZzY29wZWQ9dHJ1ZVwiXG5cblxuLyogbm9ybWFsaXplIGNvbXBvbmVudCAqL1xuaW1wb3J0IG5vcm1hbGl6ZXIgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvQHZ1ZS92dWUtbG9hZGVyLXYxNS9saWIvcnVudGltZS9jb21wb25lbnROb3JtYWxpemVyLmpzXCJcbnZhciBjb21wb25lbnQgPSBub3JtYWxpemVyKFxuICBzY3JpcHQsXG4gIHJlbmRlcixcbiAgc3RhdGljUmVuZGVyRm5zLFxuICBmYWxzZSxcbiAgbnVsbCxcbiAgXCIyNmI3MGZiNFwiLFxuICBudWxsXG4gIFxuKVxuXG5leHBvcnQgZGVmYXVsdCBjb21wb25lbnQuZXhwb3J0cyIsInZhciByZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKXt2YXIgX3ZtPXRoaXMsX2M9X3ZtLl9zZWxmLl9jO3JldHVybiBfYygnZGl2Jyx7c3RhdGljQ2xhc3M6XCJwYWdlLXRhYmxlXCIsYXR0cnM6e1wiaWRcIjp0aGlzLnRhYmxlSWR9fSxbX2MoJ2Rpdicse3N0YXRpY0NsYXNzOlwidGFibGVcIn0sW19jKCdlbC1zY3JvbGxiYXInLHtzdGF0aWNTdHlsZTp7XCJoZWlnaHRcIjpcIjEwMCVcIn19LFtfYygnZWwtdGFibGUnLF92bS5fYih7cmVmOl92bS50YWJsZUlkLGF0dHJzOntcInN0cmlwZVwiOlwiXCIsXCJkYXRhXCI6X3ZtLmxpc3QsXCJyb3cta2V5XCI6X3ZtLnJvd0tleSxcImxvYWRcIjpfdm0ubG9hZCxcImhpZ2hsaWdodC1jdXJyZW50LXJvd1wiOl92bS5obGlnaHRDdXJyZW50Um93LFwiZGVmYXVsdC1leHBhbmQtYWxsXCI6X3ZtLmRlZmF1bHRFeHBhbmRBbGx9LG9uOntcInNlbGVjdFwiOl92bS5oYW5kZWxTZWxlY3Rpb25DaGFuZ2UsXCJzZWxlY3QtYWxsXCI6X3ZtLnNlbGVjdEFsbCxcInJvdy1jbGlja1wiOl92bS5oYW5kbGVSb3dDbGljayxcImV4cGFuZC1jaGFuZ2VcIjp2YWw9Pl92bS4kZW1pdCgnZXhwYW5kLWNoYW5nZScsIHZhbCl9fSwnZWwtdGFibGUnLF92bS4kYXR0cnMsZmFsc2UpLFsoX3ZtLnNob3dDaGVja0JveCk/X2MoJ2VsLXRhYmxlLWNvbHVtbicse2F0dHJzOntcInR5cGVcIjpcInNlbGVjdGlvblwiLFwid2lkdGhcIjpcIjYwcHhcIixcImFsaWduXCI6XCJjZW50ZXJcIn19KTpfdm0uX2UoKSwoX3ZtLnNvcnROdW0pP19jKCdlbC10YWJsZS1jb2x1bW4nLHthdHRyczp7XCJ0eXBlXCI6XCJpbmRleFwiLFwid2lkdGhcIjpcIjYwcHhcIixcImxhYmVsXCI6XCLluo/lj7dcIixcImFsaWduXCI6XCJjZW50ZXJcIn0sc2NvcGVkU2xvdHM6X3ZtLl91KFt7a2V5OlwiZGVmYXVsdFwiLGZuOmZ1bmN0aW9uKHNjb3BlKXtyZXR1cm4gWyhfdm0ucGFnZSk/X2MoJ3NwYW4nLFtfdm0uX3YoX3ZtLl9zKChfdm0ucGFyYW1zLnBhZ2UtMSkqX3ZtLnBhcmFtcy5saW1pdCtzY29wZS4kaW5kZXgrMSkpXSk6X2MoJ3NwYW4nLFtfdm0uX3YoX3ZtLl9zKHNjb3BlLiRpbmRleCsxKSldKV19fV0sbnVsbCxmYWxzZSwyNzg2MDA4MDIxKX0pOl92bS5fZSgpLF92bS5fdChcImRlZmF1bHRcIildLDIpXSwxKV0sMSksKF92bS5wYWdlKT9fYygnUGFnaW5hdGlvbicse2F0dHJzOntcInRvdGFsXCI6X3ZtLnRvdGFsLFwicGFnZVwiOl92bS5wYXJhbXMucGFnZSxcImxpbWl0XCI6X3ZtLnBhcmFtcy5saW1pdH0sb246e1widXBkYXRlOnBhZ2VcIjpmdW5jdGlvbigkZXZlbnQpe3JldHVybiBfdm0uJHNldChfdm0ucGFyYW1zLCBcInBhZ2VcIiwgJGV2ZW50KX0sXCJwYWdpbmF0aW9uXCI6X3ZtLmdldExpc3R9fSk6X3ZtLl9lKCldLDEpXG59XG52YXIgc3RhdGljUmVuZGVyRm5zID0gW11cblxuZXhwb3J0IHsgcmVuZGVyLCBzdGF0aWNSZW5kZXJGbnMgfSIsIjx0ZW1wbGF0ZT5cclxuICAgIDxkaXYgY2xhc3M9XCJwYWdlLXRhYmxlXCIgOmlkPVwidGhpcy50YWJsZUlkXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlXCI+XHJcbiAgICAgICAgICAgIDxlbC1zY3JvbGxiYXIgc3R5bGU9XCJoZWlnaHQ6IDEwMCVcIj5cclxuICAgICAgICAgICAgICAgIDxlbC10YWJsZVxyXG4gICAgICAgICAgICAgICAgICAgIHYtYmluZD1cIiRhdHRyc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgc3RyaXBlXHJcbiAgICAgICAgICAgICAgICAgICAgOnJlZj1cInRhYmxlSWRcIlxyXG4gICAgICAgICAgICAgICAgICAgIDpkYXRhPVwibGlzdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgOnJvdy1rZXk9XCJyb3dLZXlcIlxyXG4gICAgICAgICAgICAgICAgICAgIDpsb2FkPVwibG9hZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgOmhpZ2hsaWdodC1jdXJyZW50LXJvdz1cImhsaWdodEN1cnJlbnRSb3dcIlxyXG4gICAgICAgICAgICAgICAgICAgIEBzZWxlY3Q9XCJoYW5kZWxTZWxlY3Rpb25DaGFuZ2VcIlxyXG4gICAgICAgICAgICAgICAgICAgIEBzZWxlY3QtYWxsPVwic2VsZWN0QWxsXCJcclxuICAgICAgICAgICAgICAgICAgICA6ZGVmYXVsdC1leHBhbmQtYWxsPVwiZGVmYXVsdEV4cGFuZEFsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgQHJvdy1jbGljaz1cImhhbmRsZVJvd0NsaWNrXCJcclxuICAgICAgICAgICAgICAgICAgICBAZXhwYW5kLWNoYW5nZT1cInZhbD0+JGVtaXQoJ2V4cGFuZC1jaGFuZ2UnLCB2YWwpXCJcclxuICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgPGVsLXRhYmxlLWNvbHVtbiB2LWlmPVwic2hvd0NoZWNrQm94XCIgdHlwZT1cInNlbGVjdGlvblwiIHdpZHRoPVwiNjBweFwiIGFsaWduPVwiY2VudGVyXCI+PC9lbC10YWJsZS1jb2x1bW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPGVsLXRhYmxlLWNvbHVtbiB2LWlmPVwic29ydE51bVwiIHR5cGU9XCJpbmRleFwiIHdpZHRoPVwiNjBweFwiIGxhYmVsPVwi5bqP5Y+3XCIgYWxpZ249XCJjZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIHNsb3Qtc2NvcGU9XCJzY29wZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdi1pZj1cInBhZ2VcIj57eyhwYXJhbXMucGFnZS0xKSpwYXJhbXMubGltaXQrc2NvcGUuJGluZGV4KzF9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHYtZWxzZT57e3Njb3BlLiRpbmRleCsxfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9lbC10YWJsZS1jb2x1bW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNsb3Q+PC9zbG90PlxyXG4gICAgICAgICAgICAgICAgPC9lbC10YWJsZT5cclxuICAgICAgICAgICAgPC9lbC1zY3JvbGxiYXI+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPFBhZ2luYXRpb24gdi1pZj1cInBhZ2VcIiA6dG90YWw9XCJ0b3RhbFwiIDpwYWdlLnN5bmM9XCJwYXJhbXMucGFnZVwiIDpsaW1pdD1cInBhcmFtcy5saW1pdFwiIEBwYWdpbmF0aW9uPVwiZ2V0TGlzdFwiIC8+XHJcbiAgICA8L2Rpdj5cclxuPC90ZW1wbGF0ZT5cclxuPHNjcmlwdD5cclxuZXhwb3J0IGRlZmF1bHQge1xyXG4gICAgbmFtZTogJ1BhZ2VUYWJsZScsXHJcbiAgICBwcm9wczoge1xyXG4gICAgICAgIC8vIOiHquWumuS5ieaVsOaNrlxyXG4gICAgICAgIGRhdGE6IHtcclxuICAgICAgICAgICAgdHlwZTogQXJyYXksXHJcbiAgICAgICAgICAgIGRlZmF1bHQ6IG51bGxcclxuICAgICAgICB9LFxyXG4gICAgICAgIC8vIOivt+axguWcsOWdgFxyXG4gICAgICAgIHVybDoge1xyXG4gICAgICAgICAgICB0eXBlOiBTdHJpbmcsXHJcbiAgICAgICAgICAgIGRlZmF1bHQ6ICcnXHJcbiAgICAgICAgfSxcclxuICAgICAgICAvLyDor7fmsYLmlrnlvI9cclxuICAgICAgICBtZXRob2Q6IHtcclxuICAgICAgICAgICAgdHlwZTogU3RyaW5nLFxyXG4gICAgICAgICAgICBkZWZhdWx0OiAnZ2V0J1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgLy8g5piv5ZCm5pi+56S65bqP5Y+3XHJcbiAgICAgICAgc29ydE51bToge1xyXG4gICAgICAgICAgICB0eXBlOiBCb29sZWFuLFxyXG4gICAgICAgICAgICBkZWZhdWx0OiB0cnVlXHJcbiAgICAgICAgfSxcclxuICAgICAgICAvLyDmmK/lkKbliIbpobVcclxuICAgICAgICBwYWdlOiB7XHJcbiAgICAgICAgICAgIHR5cGU6IEJvb2xlYW4sXHJcbiAgICAgICAgICAgIGRlZmF1bHQ6IHRydWVcclxuICAgICAgICB9LFxyXG4gICAgICAgIC8vIOagkeW9ouihqOagvOaXtu+8jOaYr+WQpuWFqOmDqOWxleW8gFxyXG4gICAgICAgIGRlZmF1bHRFeHBhbmRBbGw6IHtcclxuICAgICAgICAgICAgdHlwZTogQm9vbGVhbixcclxuICAgICAgICAgICAgZGVmYXVsdDogZmFsc2VcclxuICAgICAgICB9LFxyXG4gICAgICAgIC8vIOWIneWni+ivt+axguWPguaVsFxyXG4gICAgICAgIGRlZmF1bHRQYXJhbXM6IHtcclxuICAgICAgICAgICAgdHlwZTogT2JqZWN0LFxyXG4gICAgICAgICAgICBkZWZhdWx0OiAoKT0+KHt9KVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgLy8g6buY6K6k6YCJ5Lit5pWw5o2uXHJcbiAgICAgICAgZGVmYXVsdFNlbGVjdDoge1xyXG4gICAgICAgICAgICB0eXBlOiBBcnJheSxcclxuICAgICAgICAgICAgZGVmYXVsdDogKCk9PltdXHJcbiAgICAgICAgfSxcclxuICAgICAgICByb3dLZXk6IHtcclxuICAgICAgICAgICAgdHlwZTogU3RyaW5nLFxyXG4gICAgICAgICAgICBkZWZhdWx0OiAnaWQnXHJcbiAgICAgICAgfSxcclxuICAgICAgICBobGlnaHRDdXJyZW50Um93OiB7XHJcbiAgICAgICAgICAgIHlwZTogQm9vbGVhbixcclxuICAgICAgICAgICAgZGVmYXVsdDogZmFsc2VcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAgd2F0Y2g6IHtcclxuICAgICAgICBkYXRhKG5ld1ZhbCl7XHJcbiAgICAgICAgICAgIHRoaXMubGlzdCA9IG5ld1ZhbDtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGRlZmF1bHRTZWxlY3Q6IHtcclxuICAgICAgICAgICAgaGFuZGxlcigpe1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRDaGVja2VkKCk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGRlZXA6IHRydWVcclxuICAgICAgICB9LFxyXG4gICAgICAgIGRlZmF1bHRQYXJhbXMobmV3VmFsLCBvbGRWYWwpe1xyXG4gICAgICAgICAgICBmb3IoY29uc3Qga2V5IGluIG5ld1ZhbCl7XHJcbiAgICAgICAgICAgICAgICBpZihuZXdWYWxba2V5XSAhPSBvbGRWYWxba2V5XSl7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJhbXMgPSB7cGFnZTogMSwgbGltaXQ6IDE1LCBwYXJhbTogey4uLm5ld1ZhbH19O1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0TGlzdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIGRhdGEoKXtcclxuICAgICAgICByZXR1cm57XHJcbiAgICAgICAgICAgIHNob3dDaGVja0JveDogZmFsc2UsXHJcbiAgICAgICAgICAgIHBhcmFtczoge1xyXG4gICAgICAgICAgICAgICAgcGFnZTogMSxcclxuICAgICAgICAgICAgICAgIGxpbWl0OiAxNSxcclxuICAgICAgICAgICAgICAgIHBhcmFtOiB7Li4udGhpcy5kZWZhdWx0UGFyYW1zfVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB0b3RhbDogMCxcclxuICAgICAgICAgICAgbGlzdDogW10sXHJcbiAgICAgICAgICAgIHRhYmxlSWQ6IGB0YWJsZV8ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cmluZygyLCAxNil9YCxcclxuICAgICAgICAgICAgc2VsZWN0RGF0YToge30sXHJcbiAgICAgICAgICAgIHNlbGVjdElkczogW11cclxuICAgICAgICB9O1xyXG4gICAgfSxcclxuICAgIG1vdW50ZWQoKXtcclxuICAgICAgICBsb2codGhpcyk7XHJcbiAgICAgICAgaWYodGhpcy4kbGlzdGVuZXJzWydzZWxlY3Rpb24tY2hhbmdlJ10pe1xyXG4gICAgICAgICAgICB0aGlzLnNob3dDaGVja0JveCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKHRoaXMuZGF0YSl7XHJcbiAgICAgICAgICAgIHRoaXMubGlzdCA9IHRoaXMuZGF0YTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IoY29uc3QgaXRlbSBvZiB0aGlzLmRlZmF1bHRTZWxlY3Qpe1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdERhdGFbaXRlbVt0aGlzLnJvd0tleV1dID0gaXRlbTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5nZXRMaXN0KCk7XHJcbiAgICB9LFxyXG4gICAgbWV0aG9kczoge1xyXG4gICAgICAgIC8vIOiOt+WPluaVsOaNrlxyXG4gICAgICAgIGdldExpc3QocGFnZU9wdGlvbil7XHJcbiAgICAgICAgICAgIGlmKCF0aGlzLnVybCl7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYocGFnZU9wdGlvbil7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnBhcmFtcy5wYWdlID0gcGFnZU9wdGlvbi5wYWdlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wYXJhbXMubGltaXQgPSBwYWdlT3B0aW9uLmxpbWl0O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmKCF0aGlzLnBhZ2Upe1xyXG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMucGFyYW1zLnBhZ2U7XHJcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5wYXJhbXMubGltaXQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3Qgc3RvcmFnZVBhcmFtcyA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0odGhpcy4kcm91dGUucGF0aCk7XHJcbiAgICAgICAgICAgIGlmKHN0b3JhZ2VQYXJhbXMpe1xyXG4gICAgICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSh0aGlzLiRyb3V0ZS5wYXRoLCBKU09OLnN0cmluZ2lmeSh0aGlzLnBhcmFtcykpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHN3aXRjaCh0aGlzLm1ldGhvZCl7XHJcbiAgICAgICAgICAgICAgICBjYXNlICdnZXQnOlxyXG4gICAgICAgICAgICAgICAgICAgIGh0dHAuZ2V0KHRoaXMudXJsLCB0aGlzLnBhcmFtcywgKHJlcyk9PntcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2V0RGF0YShyZXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAncG9zdCc6XHJcbiAgICAgICAgICAgICAgICAgICAgaHR0cC5wb3N0KHRoaXMudXJsLCB0aGlzLnBhcmFtcywgKHJlcyk9PntcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2V0RGF0YShyZXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgX3NldERhdGEocmVzKXtcclxuICAgICAgICAgICAgaWYodGhpcy5wYWdlKXtcclxuICAgICAgICAgICAgICAgIHRoaXMubGlzdCA9IHJlcy5kYXRhLnJlY29yZHM7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRvdGFsID0gcmVzLmRhdGEudG90YWw7XHJcbiAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgdGhpcy5saXN0ID0gcmVzLmRhdGE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5zZXRDaGVja2VkKCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAvLyDorr7nva7pu5jorqTpgInkuK1cclxuICAgICAgICBzZXRDaGVja2VkKCl7XHJcbiAgICAgICAgICAgIGlmKHRoaXMuZGVmYXVsdFNlbGVjdC5sZW5ndGg+MCl7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdElkcyA9IHRoaXMuZGVmYXVsdFNlbGVjdC5tYXAoKGl0ZW0pPT5pdGVtW3RoaXMucm93S2V5XSk7XHJcbiAgICAgICAgICAgICAgICBpZih0aGlzLnNob3dDaGVja0JveCAmJiB0aGlzLmxpc3Qpe1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJG5leHRUaWNrKCgpPT57XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIOm7mOiupOmAieS4reaVsOaNrlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZih0aGlzLiRyZWZzW3RoaXMudGFibGVJZF0pe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGNvbnN0IGl0ZW0gb2YgdGhpcy5saXN0KXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih0aGlzLnNlbGVjdElkcy5pbmNsdWRlcyhpdGVtW3RoaXMucm93S2V5XSkpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiRyZWZzW3RoaXMudGFibGVJZF0udG9nZ2xlUm93U2VsZWN0aW9uKGl0ZW0sIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdERhdGFbaXRlbVt0aGlzLnJvd0tleV1dID0gaXRlbTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kcmVmc1t0aGlzLnRhYmxlSWRdLnRvZ2dsZVJvd1NlbGVjdGlvbihpdGVtLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnNlbGVjdERhdGFbaXRlbVt0aGlzLnJvd0tleV1dO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0SWRzID0gW107XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdERhdGEgPSB7fTtcclxuICAgICAgICAgICAgICAgIGlmKHRoaXMuJHJlZnNbdGhpcy50YWJsZUlkXSl7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yKGNvbnN0IGl0ZW0gb2YgdGhpcy5saXN0KXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kcmVmc1t0aGlzLnRhYmxlSWRdLnRvZ2dsZVJvd1NlbGVjdGlvbihpdGVtLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICAvLyDmnaHku7bmn6Xor6JcclxuICAgICAgICBxdWVyeShwYXJhbXM9e30pe1xyXG4gICAgICAgICAgICBpZihPYmplY3Qua2V5cyhwYXJhbXMpLmxlbmd0aD4wKXtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmFtID0gey4uLnRoaXMucGFyYW1zLnBhcmFtLCAuLi5wYXJhbXN9O1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wYXJhbXMgPSB7Li4udGhpcy5wYXJhbXMsIHBhcmFtfTtcclxuICAgICAgICAgICAgICAgIHRoaXMucGFyYW1zLnBhZ2UgPSAxO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0TGlzdCgpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgLy8g54K55Ye76KGMXHJcbiAgICAgICAgaGFuZGxlUm93Q2xpY2socm93LCBjb2x1bW4sIGV2ZW50KXtcclxuICAgICAgICAgICAgdGhpcy4kZW1pdCgncm93LWNsaWNrJywgcm93LCBjb2x1bW4sIGV2ZW50KTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGhhbmRlbFNlbGVjdGlvbkNoYW5nZShfLCByb3cpe1xyXG4gICAgICAgICAgICBpZih0aGlzLnNlbGVjdERhdGFbcm93W3RoaXMucm93S2V5XV0pe1xyXG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuc2VsZWN0RGF0YVtyb3dbdGhpcy5yb3dLZXldXTtcclxuICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdERhdGFbcm93W3RoaXMucm93S2V5XV0gPSByb3c7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3Qgc2VsZWN0aW9uTGlzdCA9IE9iamVjdC52YWx1ZXModGhpcy5zZWxlY3REYXRhKTtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RJZHMgPSBzZWxlY3Rpb25MaXN0Lm1hcCgoaXRlbSk9Pml0ZW1bdGhpcy5yb3dLZXldKTtcclxuICAgICAgICAgICAgdGhpcy4kZW1pdCgnc2VsZWN0aW9uLWNoYW5nZScsIHNlbGVjdGlvbkxpc3QpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgLy8g5YWo6YCJL+WFqOS4jemAiVxyXG4gICAgICAgIHNlbGVjdEFsbChzZWxlY3Rpb24pe1xyXG4gICAgICAgICAgICBpZihzZWxlY3Rpb24ubGVuZ3RoPjApe1xyXG4gICAgICAgICAgICAgICAgZm9yKGNvbnN0IGl0ZW0gb2Ygc2VsZWN0aW9uKXtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdERhdGFbaXRlbVt0aGlzLnJvd0tleV1dID0gaXRlbTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICBmb3IoY29uc3QgaXRlbSBvZiB0aGlzLmxpc3Qpe1xyXG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnNlbGVjdERhdGFbaXRlbVt0aGlzLnJvd0tleV1dO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGlvbkxpc3QgPSBPYmplY3QudmFsdWVzKHRoaXMuc2VsZWN0RGF0YSk7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0SWRzID0gc2VsZWN0aW9uTGlzdC5tYXAoKGl0ZW0pPT5pdGVtW3RoaXMucm93S2V5XSk7XHJcbiAgICAgICAgICAgIHRoaXMuJGVtaXQoJ3NlbGVjdGlvbi1jaGFuZ2UnLCBzZWxlY3Rpb25MaXN0KTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIHNldEN1cnJlbnQoaW5kZXgpIHtcclxuICAgICAgICAgICAgdGhpcy4kcmVmc1t0aGlzLnRhYmxlSWRdLnNldEN1cnJlbnRSb3codGhpcy5saXN0W2luZGV4XSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBnZXREYXRhKCl7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxpc3Q7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBsb2FkKHRyZWUsIHRyZWVOb2RlLCByZXNvbHZlKXtcclxuICAgICAgICAgICAgdGhpcy4kZW1pdCgnbG9hZCcsIHRyZWUsIHRyZWVOb2RlLCByZXNvbHZlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn07XHJcbjwvc2NyaXB0PlxyXG48c3R5bGUgbGFuZz1cInNjc3NcIiBzY29wZWQ+XHJcbiAgICAucGFnZS10YWJsZXtcclxuICAgICAgICBoZWlnaHQ6IDEwMCU7XHJcbiAgICAgICAgZmxleDogMSAxIGF1dG87XHJcbiAgICAgICAgb3ZlcmZsb3cteTogYXV0bztcclxuICAgICAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XHJcbiAgICAgICAgLnRhYmxle1xyXG4gICAgICAgICAgICBmbGV4OiBhdXRvIDEgMTtcclxuICAgICAgICAgICAgb3ZlcmZsb3c6IGF1dG87XHJcbiAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgL2RlZXAvLmVsLXRhYmxlIHRoZWFke1xyXG4gICAgICAgIGNvbG9yOiAjMzMzMzMzO1xyXG4gICAgfVxyXG4gICAgL2RlZXAvLmVsLXRhYmxlIHRoLmVsLXRhYmxlX19jZWxse1xyXG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNGNUY3RkE7XHJcbiAgICB9XHJcbiAgICAvZGVlcC8uZWwtdGFibGUtLW1pbmkgLmVsLXRhYmxlX19jZWxse1xyXG4gICAgICAgIHBhZGRpbmc6IDNweCAwO1xyXG4gICAgfVxyXG48L3N0eWxlPiIsImltcG9ydCBtb2QgZnJvbSBcIi0hLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3RocmVhZC1sb2FkZXIvZGlzdC9janMuanMhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLWxvYWRlci9saWIvaW5kZXguanM/P2Nsb25lZFJ1bGVTZXQtNDAudXNlWzFdIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9AdnVlL3Z1ZS1sb2FkZXItdjE1L2xpYi9pbmRleC5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vSW5kZXgudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzXCI7IGV4cG9ydCBkZWZhdWx0IG1vZDsgZXhwb3J0ICogZnJvbSBcIi0hLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3RocmVhZC1sb2FkZXIvZGlzdC9janMuanMhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLWxvYWRlci9saWIvaW5kZXguanM/P2Nsb25lZFJ1bGVTZXQtNDAudXNlWzFdIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9AdnVlL3Z1ZS1sb2FkZXItdjE1L2xpYi9pbmRleC5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vSW5kZXgudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzXCIiLCIvLyBleHRyYWN0ZWQgYnkgbWluaS1jc3MtZXh0cmFjdC1wbHVnaW5cbmV4cG9ydCB7fTsiLCJleHBvcnQgKiBmcm9tIFwiLSEuLi8uLi8uLi9ub2RlX21vZHVsZXMvbWluaS1jc3MtZXh0cmFjdC1wbHVnaW4vZGlzdC9sb2FkZXIuanM/P2Nsb25lZFJ1bGVTZXQtMjIudXNlWzBdIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzPz9jbG9uZWRSdWxlU2V0LTIyLnVzZVsxXSEuLi8uLi8uLi9ub2RlX21vZHVsZXMvQHZ1ZS92dWUtbG9hZGVyLXYxNS9saWIvbG9hZGVycy9zdHlsZVBvc3RMb2FkZXIuanMhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3Bvc3Rjc3MtbG9hZGVyL2Rpc3QvY2pzLmpzPz9jbG9uZWRSdWxlU2V0LTIyLnVzZVsyXSEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc2Fzcy1sb2FkZXIvZGlzdC9janMuanM/P2Nsb25lZFJ1bGVTZXQtMjIudXNlWzNdIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9AdnVlL3Z1ZS1sb2FkZXItdjE1L2xpYi9pbmRleC5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vSW5kZXgudnVlP3Z1ZSZ0eXBlPXN0eWxlJmluZGV4PTAmaWQ9NmFlMjUxMjEmcHJvZCZsYW5nPXNjc3Mmc2NvcGVkPXRydWVcIiIsImltcG9ydCB7IHJlbmRlciwgc3RhdGljUmVuZGVyRm5zIH0gZnJvbSBcIi4vSW5kZXgudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTZhZTI1MTIxJnNjb3BlZD10cnVlXCJcbmltcG9ydCBzY3JpcHQgZnJvbSBcIi4vSW5kZXgudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzXCJcbmV4cG9ydCAqIGZyb20gXCIuL0luZGV4LnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qc1wiXG5pbXBvcnQgc3R5bGUwIGZyb20gXCIuL0luZGV4LnZ1ZT92dWUmdHlwZT1zdHlsZSZpbmRleD0wJmlkPTZhZTI1MTIxJnByb2QmbGFuZz1zY3NzJnNjb3BlZD10cnVlXCJcblxuXG4vKiBub3JtYWxpemUgY29tcG9uZW50ICovXG5pbXBvcnQgbm9ybWFsaXplciBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9AdnVlL3Z1ZS1sb2FkZXItdjE1L2xpYi9ydW50aW1lL2NvbXBvbmVudE5vcm1hbGl6ZXIuanNcIlxudmFyIGNvbXBvbmVudCA9IG5vcm1hbGl6ZXIoXG4gIHNjcmlwdCxcbiAgcmVuZGVyLFxuICBzdGF0aWNSZW5kZXJGbnMsXG4gIGZhbHNlLFxuICBudWxsLFxuICBcIjZhZTI1MTIxXCIsXG4gIG51bGxcbiAgXG4pXG5cbmV4cG9ydCBkZWZhdWx0IGNvbXBvbmVudC5leHBvcnRzIiwidmFyIHJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpe3ZhciBfdm09dGhpcyxfYz1fdm0uX3NlbGYuX2M7cmV0dXJuIF9jKCdlbC1kaWFsb2cnLF92bS5fYih7ZGlyZWN0aXZlczpbe25hbWU6XCJkaWFsb2dEcmFnXCIscmF3TmFtZTpcInYtZGlhbG9nRHJhZ1wifV0sc3RhdGljU3R5bGU6e1wibWFyZ2luLXRvcFwiOlwiMFwifSxhdHRyczp7XCJ0aXRsZVwiOl92bS50aXRsZSxcInZpc2libGVcIjpfdm0uZGlhbG9nVmlzaWJsZSxcImJlZm9yZS1jbG9zZVwiOl92bS5oYW5kbGVDbG9zZSxcImNlbnRlclwiOlwiXCIsXCJjbG9zZS1vbi1jbGljay1tb2RhbFwiOmZhbHNlLFwic2hvdy1jbG9zZVwiOl92bS5zaG93Q2xvc2UsXCJhcHBlbmQtdG8tYm9keVwiOlwiXCJ9fSwnZWwtZGlhbG9nJyxfdm0uJGF0dHJzLGZhbHNlKSxbX2MoJ2Rpdicse3N0YXRpY1N0eWxlOntcIm92ZXJmbG93LXlcIjpcImF1dG9cIixcIm92ZXJmbG93LXhcIjpcImhpZGRlblwiLFwicG9zaXRpb25cIjpcInJlbGF0aXZlXCJ9LHN0eWxlOih7bWF4SGVpZ2h0OiBfdm0ubWF4SGVpZ2h0LCBtaW5IZWlnaHQ6IF92bS5taW5IZWlnaHR9KX0sW192bS5fdChcImRlZmF1bHRcIildLDIpLF9jKCdkaXYnLHtzdGF0aWNTdHlsZTp7XCJ0ZXh0LWFsaWduXCI6XCJjZW50ZXJcIn0sYXR0cnM6e1wic2xvdFwiOlwiZm9vdGVyXCJ9LHNsb3Q6XCJmb290ZXJcIn0sW192bS5fdChcImZvb3RlclwiKV0sMildKVxufVxudmFyIHN0YXRpY1JlbmRlckZucyA9IFtdXG5cbmV4cG9ydCB7IHJlbmRlciwgc3RhdGljUmVuZGVyRm5zIH0iLCIvLyB2LWRpYWxvZ0RyYWc6IOW8ueeql+aLluaLvVxyXG5pbXBvcnQgVnVlIGZyb20gJ3Z1ZSc7XHJcblZ1ZS5kaXJlY3RpdmUoJ2RpYWxvZ0RyYWcnLCB7XHJcbiAgICBiaW5kKGVsKSB7XHJcblx0XHRjb25zdCBkaWFsb2dIZWFkZXJFbCA9IGVsLnF1ZXJ5U2VsZWN0b3IoJy5lbC1kaWFsb2dfX2hlYWRlcicpO1xyXG5cdFx0Y29uc3QgZHJhZ0RvbSA9IGVsLnF1ZXJ5U2VsZWN0b3IoJy5lbC1kaWFsb2cnKTtcclxuXHRcdGRpYWxvZ0hlYWRlckVsLnN0eWxlLmN1cnNvciA9ICdtb3ZlJztcclxuXHJcblx0XHQvLyDojrflj5bljp/mnInlsZ7mgKcgaWUgZG9t5YWD57SgLmN1cnJlbnRTdHlsZSDngavni5DosLfmrYwgd2luZG93LmdldENvbXB1dGVkU3R5bGUoZG9t5YWD57SgLCBudWxsKTtcclxuXHRcdGNvbnN0IHN0eSA9IGRyYWdEb20uY3VycmVudFN0eWxlIHx8IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGRyYWdEb20sIG51bGwpO1xyXG5cclxuXHRcdGRpYWxvZ0hlYWRlckVsLm9ubW91c2Vkb3duID0gKGV2ZW50KT0+e1xyXG5cdFx0XHQvLyDpvKDmoIfmjInkuIvvvIzorqHnrpflvZPliY3lhYPntKDot53nprvlj6/op4bljLrnmoTot53nprtcclxuXHRcdFx0Y29uc3QgZGlzWCA9IGV2ZW50LmNsaWVudFggLSBkaWFsb2dIZWFkZXJFbC5vZmZzZXRMZWZ0O1xyXG5cdFx0XHRjb25zdCBkaXNZID0gZXZlbnQuY2xpZW50WSAtIGRpYWxvZ0hlYWRlckVsLm9mZnNldFRvcDtcclxuXHJcblx0XHRcdC8vIOiOt+WPluWIsOeahOWAvOW4pnB4IOato+WImeWMuemFjeabv+aNolxyXG5cdFx0XHRsZXQgc3R5TD1udWxsO1xyXG5cdFx0XHRsZXQgc3R5VD1udWxsO1xyXG5cclxuXHRcdFx0Ly8g5rOo5oSP5ZyoaWXkuK0g56ys5LiA5qyh6I635Y+W5Yiw55qE5YC85Li657uE5Lu26Ieq5bimNTAlIOenu+WKqOS5i+WQjui1i+WAvOS4unB4XHJcblx0XHRcdGlmIChzdHkubGVmdC5pbmNsdWRlcygnXFwlJykpIHtcclxuXHRcdFx0XHRzdHlMID0gK2RvY3VtZW50LmJvZHkuY2xpZW50V2lkdGggKiAoK3N0eS5sZWZ0LnJlcGxhY2UoL1xcJS9nLCAnJykgLyAxMDApO1xyXG5cdFx0XHRcdHN0eVQgPSArZG9jdW1lbnQuYm9keS5jbGllbnRIZWlnaHQgKiAoK3N0eS50b3AucmVwbGFjZSgvXFwlL2csICcnKSAvIDEwMCk7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0c3R5TCA9ICtzdHkubGVmdC5yZXBsYWNlKC9cXHB4L2csICcnKTtcclxuXHRcdFx0XHRzdHlUID0gK3N0eS50b3AucmVwbGFjZSgvXFxweC9nLCAnJyk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGRvY3VtZW50Lm9ubW91c2Vtb3ZlID0gZnVuY3Rpb24oZSkge1xyXG5cdFx0XHRcdC8vIOmAmui/h+S6i+S7tuWnlOaJmO+8jOiuoeeul+enu+WKqOeahOi3neemu1xyXG5cdFx0XHRcdGNvbnN0IGwgPSBlLmNsaWVudFggLSBkaXNYO1xyXG5cdFx0XHRcdGNvbnN0IHQgPSBlLmNsaWVudFkgLSBkaXNZO1xyXG5cclxuXHRcdFx0XHQvLyDnp7vliqjlvZPliY3lhYPntKBcclxuXHRcdFx0XHRkcmFnRG9tLnN0eWxlLmxlZnQgPSBgJHtsICsgc3R5TH1weGA7XHJcblx0XHRcdFx0ZHJhZ0RvbS5zdHlsZS50b3AgPSBgJHt0ICsgc3R5VH1weGA7XHJcblx0XHRcdH07XHJcblxyXG5cdFx0XHRkb2N1bWVudC5vbm1vdXNldXAgPSBmdW5jdGlvbigpIHtcclxuXHRcdFx0XHRkb2N1bWVudC5vbm1vdXNlbW92ZSA9IG51bGw7XHJcblx0XHRcdFx0ZG9jdW1lbnQub25tb3VzZXVwID0gbnVsbDtcclxuXHRcdFx0fTtcclxuXHRcdH07XHJcblx0fVxyXG59KTtcclxuXHJcblZ1ZS5kaXJlY3RpdmUoJ3JlbW92ZUFyaWFIaWRkZW4nLCB7XHJcblx0YmluZChlbCkge1xyXG5cdFx0bGV0IGFyaWFFbHMgPSBlbC5xdWVyeVNlbGVjdG9yQWxsKCcuZWwtcmFkaW9fX29yaWdpbmFsJyk7XHJcblx0XHRhcmlhRWxzLmZvckVhY2goKGl0ZW0pPT57XHJcblx0XHRcdGl0ZW0ucmVtb3ZlQXR0cmlidXRlKCdhcmlhLWhpZGRlbicpO1xyXG5cdFx0fSk7XHJcblx0fVxyXG59KTsiLCI8dGVtcGxhdGU+XHJcbiAgICA8ZWwtZGlhbG9nIHYtYmluZD1cIiRhdHRyc1wiIDp0aXRsZT1cInRpdGxlXCIgOnZpc2libGU9XCJkaWFsb2dWaXNpYmxlXCIgdi1kaWFsb2dEcmFnIDpiZWZvcmUtY2xvc2U9XCJoYW5kbGVDbG9zZVwiIGNlbnRlciA6Y2xvc2Utb24tY2xpY2stbW9kYWw9XCJmYWxzZVwiIDpzaG93LWNsb3NlPVwic2hvd0Nsb3NlXCIgYXBwZW5kLXRvLWJvZHkgc3R5bGU9XCJtYXJnaW4tdG9wOiAwO1wiPlxyXG4gICAgICAgIDxkaXYgc3R5bGU9XCJvdmVyZmxvdy15OiBhdXRvO292ZXJmbG93LXg6IGhpZGRlbjtwb3NpdGlvbjogcmVsYXRpdmU7XCIgOnN0eWxlPVwie21heEhlaWdodCwgbWluSGVpZ2h0fVwiPlxyXG4gICAgICAgICAgICA8c2xvdD48L3Nsb3Q+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBzbG90PVwiZm9vdGVyXCIgc3R5bGU9XCJ0ZXh0LWFsaWduOiBjZW50ZXI7XCI+XHJcbiAgICAgICAgICAgIDxzbG90IG5hbWU9XCJmb290ZXJcIj48L3Nsb3Q+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2VsLWRpYWxvZz5cclxuPC90ZW1wbGF0ZT5cclxuXHJcbjxzY3JpcHQ+XHJcbmltcG9ydCAnLi9kaWFsb2ctZHJhZyc7XHJcbmV4cG9ydCBkZWZhdWx0IHtcclxuICAgIG5hbWU6ICdEaWFsb2cnLFxyXG4gICAgcHJvcHM6IHtcclxuICAgICAgICB0aXRsZToge1xyXG4gICAgICAgICAgICB0eXBlOiBTdHJpbmcsXHJcbiAgICAgICAgICAgIGRlZmF1bHQ6ICfmj5DnpLonXHJcbiAgICAgICAgfSxcclxuICAgICAgICBtYXhIZWlnaHQ6IHtcclxuICAgICAgICAgICAgdHlwZTogU3RyaW5nLFxyXG4gICAgICAgICAgICBkZWZhdWx0OiAnNjB2aCdcclxuICAgICAgICB9LFxyXG4gICAgICAgIG1pbkhlaWdodDoge1xyXG4gICAgICAgICAgICB0eXBlOiBTdHJpbmcsXHJcbiAgICAgICAgICAgIGRlZmF1bHQ6ICcxNTBweCdcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAgZGF0YSgpe1xyXG4gICAgICAgIHJldHVybntcclxuICAgICAgICAgICAgZGlhbG9nVmlzaWJsZTogdHJ1ZSxcclxuICAgICAgICAgICAgc2hvd0Nsb3NlOiBmYWxzZVxyXG4gICAgICAgIH07XHJcbiAgICB9LFxyXG4gICAgbW91bnRlZCgpe1xyXG4gICAgICAgIGlmKHRoaXMuJGxpc3RlbmVyc1snY2xvc2UnXSl7XHJcbiAgICAgICAgICAgIHRoaXMuc2hvd0Nsb3NlID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAgbWV0aG9kczoge1xyXG4gICAgICAgIGhhbmRsZUNsb3NlKCl7XHJcbiAgICAgICAgICAgIHRoaXMuJGVtaXQoJ2Nsb3NlJyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59O1xyXG48L3NjcmlwdD5cclxuXHJcbjxzdHlsZSBsYW5nPVwic2Nzc1wiIHNjb3BlZD5cclxuL2RlZXAvLmVsLWRpYWxvZ19faGVhZGVye1xyXG4gICAgcGFkZGluZzogMTVweCAyMHB4O1xyXG59XHJcbi9kZWVwLy5lbC1kaWFsb2ctLWNlbnRlciAuZWwtZGlhbG9nX19ib2R5e1xyXG4gICAgcGFkZGluZzogMjBweDtcclxufVxyXG48L3N0eWxlPiIsImltcG9ydCBtb2QgZnJvbSBcIi0hLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3RocmVhZC1sb2FkZXIvZGlzdC9janMuanMhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLWxvYWRlci9saWIvaW5kZXguanM/P2Nsb25lZFJ1bGVTZXQtNDAudXNlWzFdIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9AdnVlL3Z1ZS1sb2FkZXItdjE1L2xpYi9pbmRleC5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vSW5kZXgudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzXCI7IGV4cG9ydCBkZWZhdWx0IG1vZDsgZXhwb3J0ICogZnJvbSBcIi0hLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3RocmVhZC1sb2FkZXIvZGlzdC9janMuanMhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLWxvYWRlci9saWIvaW5kZXguanM/P2Nsb25lZFJ1bGVTZXQtNDAudXNlWzFdIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9AdnVlL3Z1ZS1sb2FkZXItdjE1L2xpYi9pbmRleC5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vSW5kZXgudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzXCIiLCIvLyBleHRyYWN0ZWQgYnkgbWluaS1jc3MtZXh0cmFjdC1wbHVnaW5cbmV4cG9ydCB7fTsiLCJleHBvcnQgKiBmcm9tIFwiLSEuLi8uLi8uLi9ub2RlX21vZHVsZXMvbWluaS1jc3MtZXh0cmFjdC1wbHVnaW4vZGlzdC9sb2FkZXIuanM/P2Nsb25lZFJ1bGVTZXQtMjIudXNlWzBdIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzPz9jbG9uZWRSdWxlU2V0LTIyLnVzZVsxXSEuLi8uLi8uLi9ub2RlX21vZHVsZXMvQHZ1ZS92dWUtbG9hZGVyLXYxNS9saWIvbG9hZGVycy9zdHlsZVBvc3RMb2FkZXIuanMhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3Bvc3Rjc3MtbG9hZGVyL2Rpc3QvY2pzLmpzPz9jbG9uZWRSdWxlU2V0LTIyLnVzZVsyXSEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc2Fzcy1sb2FkZXIvZGlzdC9janMuanM/P2Nsb25lZFJ1bGVTZXQtMjIudXNlWzNdIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9AdnVlL3Z1ZS1sb2FkZXItdjE1L2xpYi9pbmRleC5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vSW5kZXgudnVlP3Z1ZSZ0eXBlPXN0eWxlJmluZGV4PTAmaWQ9NDE0ODc2MmUmcHJvZCZsYW5nPXNjc3Mmc2NvcGVkPXRydWVcIiIsImltcG9ydCB7IHJlbmRlciwgc3RhdGljUmVuZGVyRm5zIH0gZnJvbSBcIi4vSW5kZXgudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTQxNDg3NjJlJnNjb3BlZD10cnVlXCJcbmltcG9ydCBzY3JpcHQgZnJvbSBcIi4vSW5kZXgudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzXCJcbmV4cG9ydCAqIGZyb20gXCIuL0luZGV4LnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qc1wiXG5pbXBvcnQgc3R5bGUwIGZyb20gXCIuL0luZGV4LnZ1ZT92dWUmdHlwZT1zdHlsZSZpbmRleD0wJmlkPTQxNDg3NjJlJnByb2QmbGFuZz1zY3NzJnNjb3BlZD10cnVlXCJcblxuXG4vKiBub3JtYWxpemUgY29tcG9uZW50ICovXG5pbXBvcnQgbm9ybWFsaXplciBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9AdnVlL3Z1ZS1sb2FkZXItdjE1L2xpYi9ydW50aW1lL2NvbXBvbmVudE5vcm1hbGl6ZXIuanNcIlxudmFyIGNvbXBvbmVudCA9IG5vcm1hbGl6ZXIoXG4gIHNjcmlwdCxcbiAgcmVuZGVyLFxuICBzdGF0aWNSZW5kZXJGbnMsXG4gIGZhbHNlLFxuICBudWxsLFxuICBcIjQxNDg3NjJlXCIsXG4gIG51bGxcbiAgXG4pXG5cbmV4cG9ydCBkZWZhdWx0IGNvbXBvbmVudC5leHBvcnRzIiwidmFyIHJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpe3ZhciBfdm09dGhpcyxfYz1fdm0uX3NlbGYuX2M7cmV0dXJuIF9jKCdlbC1jYXJkJyx7c3RhdGljU3R5bGU6e1wiaGVpZ2h0XCI6XCJjYWxjKDEwMCUgLSAycHgpXCIsXCJvdmVyZmxvd1wiOlwiYXV0b1wifSxhdHRyczp7XCJzaGFkb3dcIjpfdm0uc2hhZG93fX0sW19jKCdkaXYnLHtzdGF0aWNDbGFzczpcImNsZWFyZml4XCIsYXR0cnM6e1wic2xvdFwiOlwiaGVhZGVyXCJ9LHNsb3Q6XCJoZWFkZXJcIn0sW19jKCdkaXYnLHtzdGF0aWNTdHlsZTp7XCJmb250LXNpemVcIjpcIjE2cHhcIn19LFsoX3ZtLiRzbG90c1snY2FyZC10aXRsZSddKT9bX3ZtLl90KFwiY2FyZC10aXRsZVwiKV06W192bS5fdihcIiBcIitfdm0uX3MoX3ZtLnRpdGxlKStcIiBcIildXSwyKSxfYygnZGl2Jyx7c3RhdGljU3R5bGU6e1wiZmxleFwiOlwiMVwiLFwicG9zaXRpb25cIjpcInJlbGF0aXZlXCJ9fSxbX2MoJ2Rpdicse3N0YXRpY1N0eWxlOntcInBvc2l0aW9uXCI6XCJhYnNvbHV0ZVwiLFwicmlnaHRcIjpcIjBweFwiLFwidG9wXCI6XCItMTRweFwiLFwid2lkdGhcIjpcIjEwMCVcIixcInRleHQtYWxpZ25cIjpcInJpZ2h0XCJ9fSxbX3ZtLl90KFwiY2FyZC10b29sc1wiKV0sMildKV0pLF92bS5fdChcImRlZmF1bHRcIildLDIpXG59XG52YXIgc3RhdGljUmVuZGVyRm5zID0gW11cblxuZXhwb3J0IHsgcmVuZGVyLCBzdGF0aWNSZW5kZXJGbnMgfSIsIjx0ZW1wbGF0ZT5cclxuICAgIDxlbC1jYXJkIDpzaGFkb3c9XCJzaGFkb3dcIiBzdHlsZT1cImhlaWdodDogY2FsYygxMDAlIC0gMnB4KTtvdmVyZmxvdzogYXV0bztcIj5cclxuICAgICAgICA8ZGl2IHNsb3Q9XCJoZWFkZXJcIiBjbGFzcz1cImNsZWFyZml4XCI+XHJcbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDE2cHg7XCI+XHJcbiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgdi1pZj1cIiRzbG90c1snY2FyZC10aXRsZSddXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNsb3QgbmFtZT1cImNhcmQtdGl0bGVcIj48L3Nsb3Q+XHJcbiAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPHRlbXBsYXRlIHYtZWxzZT5cclxuICAgICAgICAgICAgICAgICAgICB7eyB0aXRsZSB9fVxyXG4gICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmbGV4OiAxO3Bvc2l0aW9uOiByZWxhdGl2ZTtcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJwb3NpdGlvbjogYWJzb2x1dGU7cmlnaHQ6IDBweDt0b3A6IC0xNHB4O3dpZHRoOiAxMDAlO3RleHQtYWxpZ246IHJpZ2h0O1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzbG90IG5hbWU9XCJjYXJkLXRvb2xzXCI+PC9zbG90PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxzbG90Pjwvc2xvdD5cclxuICAgIDwvZWwtY2FyZD5cclxuPC90ZW1wbGF0ZT5cclxuXHJcbjxzY3JpcHQ+XHJcbmV4cG9ydCBkZWZhdWx0IHtcclxuICAgIG5hbWU6ICdDYXJkJyxcclxuICAgIHByb3BzOiB7XHJcbiAgICAgICAgdGl0bGU6IHtcclxuICAgICAgICAgICAgdHlwZTogU3RyaW5nLFxyXG4gICAgICAgICAgICBkZWZhdWx0OiAnJ1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgc2hhZG93OiB7XHJcbiAgICAgICAgICAgIHR5cGU6IFN0cmluZyxcclxuICAgICAgICAgICAgZGVmYXVsdDogJydcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn07XHJcbjwvc2NyaXB0PlxyXG5cclxuPHN0eWxlIGxhbmc9XCJzY3NzXCIgc2NvcGVkPlxyXG4uY2xlYXJmaXh7XHJcbiAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxufVxyXG48L3N0eWxlPiIsImltcG9ydCBtb2QgZnJvbSBcIi0hLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3RocmVhZC1sb2FkZXIvZGlzdC9janMuanMhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLWxvYWRlci9saWIvaW5kZXguanM/P2Nsb25lZFJ1bGVTZXQtNDAudXNlWzFdIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9AdnVlL3Z1ZS1sb2FkZXItdjE1L2xpYi9pbmRleC5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vSW5kZXgudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzXCI7IGV4cG9ydCBkZWZhdWx0IG1vZDsgZXhwb3J0ICogZnJvbSBcIi0hLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3RocmVhZC1sb2FkZXIvZGlzdC9janMuanMhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLWxvYWRlci9saWIvaW5kZXguanM/P2Nsb25lZFJ1bGVTZXQtNDAudXNlWzFdIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9AdnVlL3Z1ZS1sb2FkZXItdjE1L2xpYi9pbmRleC5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vSW5kZXgudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzXCIiLCIvLyBleHRyYWN0ZWQgYnkgbWluaS1jc3MtZXh0cmFjdC1wbHVnaW5cbmV4cG9ydCB7fTsiLCJleHBvcnQgKiBmcm9tIFwiLSEuLi8uLi8uLi9ub2RlX21vZHVsZXMvbWluaS1jc3MtZXh0cmFjdC1wbHVnaW4vZGlzdC9sb2FkZXIuanM/P2Nsb25lZFJ1bGVTZXQtMjIudXNlWzBdIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzPz9jbG9uZWRSdWxlU2V0LTIyLnVzZVsxXSEuLi8uLi8uLi9ub2RlX21vZHVsZXMvQHZ1ZS92dWUtbG9hZGVyLXYxNS9saWIvbG9hZGVycy9zdHlsZVBvc3RMb2FkZXIuanMhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3Bvc3Rjc3MtbG9hZGVyL2Rpc3QvY2pzLmpzPz9jbG9uZWRSdWxlU2V0LTIyLnVzZVsyXSEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc2Fzcy1sb2FkZXIvZGlzdC9janMuanM/P2Nsb25lZFJ1bGVTZXQtMjIudXNlWzNdIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9AdnVlL3Z1ZS1sb2FkZXItdjE1L2xpYi9pbmRleC5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vSW5kZXgudnVlP3Z1ZSZ0eXBlPXN0eWxlJmluZGV4PTAmaWQ9MGM1ZGUwNmUmcHJvZCZsYW5nPXNjc3Mmc2NvcGVkPXRydWVcIiIsImltcG9ydCB7IHJlbmRlciwgc3RhdGljUmVuZGVyRm5zIH0gZnJvbSBcIi4vSW5kZXgudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTBjNWRlMDZlJnNjb3BlZD10cnVlXCJcbmltcG9ydCBzY3JpcHQgZnJvbSBcIi4vSW5kZXgudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzXCJcbmV4cG9ydCAqIGZyb20gXCIuL0luZGV4LnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qc1wiXG5pbXBvcnQgc3R5bGUwIGZyb20gXCIuL0luZGV4LnZ1ZT92dWUmdHlwZT1zdHlsZSZpbmRleD0wJmlkPTBjNWRlMDZlJnByb2QmbGFuZz1zY3NzJnNjb3BlZD10cnVlXCJcblxuXG4vKiBub3JtYWxpemUgY29tcG9uZW50ICovXG5pbXBvcnQgbm9ybWFsaXplciBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9AdnVlL3Z1ZS1sb2FkZXItdjE1L2xpYi9ydW50aW1lL2NvbXBvbmVudE5vcm1hbGl6ZXIuanNcIlxudmFyIGNvbXBvbmVudCA9IG5vcm1hbGl6ZXIoXG4gIHNjcmlwdCxcbiAgcmVuZGVyLFxuICBzdGF0aWNSZW5kZXJGbnMsXG4gIGZhbHNlLFxuICBudWxsLFxuICBcIjBjNWRlMDZlXCIsXG4gIG51bGxcbiAgXG4pXG5cbmV4cG9ydCBkZWZhdWx0IGNvbXBvbmVudC5leHBvcnRzIiwidmFyIHJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpe3ZhciBfdm09dGhpcyxfYz1fdm0uX3NlbGYuX2M7cmV0dXJuIChfdm0uc2hvdyk/X2MoJ2RpdicsWyhfdm0uZGF0YS5sZW5ndGggPiAwKT9fdm0uX2woKF92bS5kYXRhKSxmdW5jdGlvbihpdGVtKXtyZXR1cm4gX2MoJ2F1dGgtdHJlZScse2tleTppdGVtLmlkLGF0dHJzOntcImRhdGFcIjppdGVtLFwicHJvcHNcIjpfdm0ucHJvcHN9LG9uOntcIm9uLW5vZGUtZXhwYW5kXCI6KGRhdGEpPT5fdm0ub25FeHBhbmQoZGF0YSksXCJvbi1ub2RlLWNoZWNrZWRcIjooZGF0YSk9Pl92bS5vbkNoZWNrZWQoZGF0YSl9fSl9KTpfdm0uX2UoKV0sMik6X3ZtLl9lKClcbn1cbnZhciBzdGF0aWNSZW5kZXJGbnMgPSBbXVxuXG5leHBvcnQgeyByZW5kZXIsIHN0YXRpY1JlbmRlckZucyB9IiwiLy8g5piv5ZCm5pyJ5a2Q6IqC54K5XG5jb25zdCBoYXNDaGlsZHJlbiA9IChkYXRhKT0+e1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KGRhdGEuY2hpbGRyZW4pICYmIGRhdGEuY2hpbGRyZW4ubGVuZ3RoID4gMDtcbn07XG5cbi8vIOWIm+W7uuiKgueCuVxuZXhwb3J0IGNvbnN0IHJlbmRlckxhYmVsID0gKGgsIGRhdGEsIGNvbnRleHQpPT57XG4gICAgY29uc3Qge3Byb3BzLCBsaXN0ZW5lcnN9ID0gY29udGV4dDtcbiAgICBjb25zdCBjbGlja0hhbmRsZXIgPSBsaXN0ZW5lcnNbJ29uLW5vZGUtZXhwYW5kJ107XG4gICAgY29uc3QgY2hlY2tlZEhhbmRsZXIgPSBsaXN0ZW5lcnNbJ29uLW5vZGUtY2hlY2tlZCddO1xuICAgIGNvbnN0IGxhYmVsID0gZGF0YVtwcm9wcy5wcm9wcy5sYWJlbF07XG4gICAgY29uc3QgY2hpbGROb2RlcyA9IFtdO1xuICAgIGNoaWxkTm9kZXMucHVzaChsYWJlbCk7XG5cbiAgICBjb25zdCBpY29DbGFzcyA9IFtdO1xuICAgIGlmKGhhc0NoaWxkcmVuKGRhdGEpKXtcbiAgICAgICAgaWYoZGF0YS5leHBhbmQpe1xuICAgICAgICAgICAgaWNvQ2xhc3MucHVzaCgnaWNvbi1pY29uLWR3b24nKTtcbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICBpY29DbGFzcy5wdXNoKCdpY29uLWljb25fcmlnaHQnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaCgnbGknLCB7XG4gICAgfSwgW1xuICAgICAgICBoKCdpJywge1xuICAgICAgICAgICAgZG9tUHJvcHM6IHtcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU6IGBpY29uZm9udCAke2ljb0NsYXNzLmpvaW4oJyAnKX1gXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAgICAgICBtYXJnaW5MZWZ0OiBgJHsxNCpkYXRhLl9sZXZlfXB4YCxcbiAgICAgICAgICAgICAgICBmb250U2l6ZTogJzEycHgnLFxuICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVkoLTJweCknLFxuICAgICAgICAgICAgICAgIGNvbG9yOiAnIzY2NidcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvbjoge1xuICAgICAgICAgICAgICAgIGNsaWNrOiAoKT0+e1xuICAgICAgICAgICAgICAgICAgICBjbGlja0hhbmRsZXIoZGF0YSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9LCAnJyksXG4gICAgICAgIGgoJ2knLCB7XG4gICAgICAgICAgICBkb21Qcm9wczoge1xuICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogZGF0YS5jaGVja2VkPydpY29uZm9udCBpY29uLWZhbmd4aW5neHVhbnpob25nZmlsJzonaWNvbmZvbnQgaWNvbi1mYW5neGluZ3dlaXh1YW56aG9uZydcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzdHlsZToge1xuICAgICAgICAgICAgICAgIGNvbG9yOiAnIzY2NidcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvbjoge1xuICAgICAgICAgICAgICAgIGNsaWNrOiAoKT0+e1xuICAgICAgICAgICAgICAgICAgICBjaGVja2VkSGFuZGxlcihkYXRhKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sICcnKSxcbiAgICAgICAgaCgnc3BhbicsIHtcblxuICAgICAgICB9LCBjaGlsZE5vZGVzKVxuICAgIF0pO1xufTtcblxuLy8g5Yib5bu6IG5vZGUg5a2Q6IqC54K5XG5leHBvcnQgY29uc3QgcmVuZGVyQ2hpbGRyZW4gPSAoaCwgbGlzdCwgZXhwYW5kLCBjb250ZXh0KT0+e1xuICAgIGlmIChBcnJheS5pc0FycmF5KGxpc3QpICYmIGxpc3QubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gbGlzdC5tYXAoaXRlbT0+e1xuICAgICAgICAgICAgcmV0dXJuIHJlbmRlck5vZGUoaCwgaXRlbSwgY29udGV4dCk7XG4gICAgICAgIH0pO1xuICAgICAgICBsZXQgY2xzID0gWyd0cmVlLW5vZGUtY2hpbGRyZW4nXTtcbiAgICAgICAgaWYoIWV4cGFuZCl7XG4gICAgICAgICAgICBjbHMucHVzaCgnZXhwYW5kJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGgoJ2RpdicsIHtcbiAgICAgICAgICAgIGRvbVByb3BzOiB7XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBjbHMuam9pbignICcpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIGNoaWxkcmVuKTtcbiAgICB9XG4gICAgcmV0dXJuICcnO1xufTtcblxuZXhwb3J0IGNvbnN0IHJlbmRlck5vZGUgPSAoaCwgZGF0YSwgY29udGV4dCk9PntcbiAgICBjb25zdCBjaGlsZE5vZGVzID0gW107XG4gICAgY2hpbGROb2Rlcy5wdXNoKHJlbmRlckxhYmVsKGgsIGRhdGEsIGNvbnRleHQpKTtcbiAgICBjb25zdCBjaGlsZHJlbiA9IGRhdGEuY2hpbGRyZW47XG4gICAgaWYoaGFzQ2hpbGRyZW4oZGF0YSkpe1xuICAgICAgICBjaGlsZE5vZGVzLnB1c2gocmVuZGVyQ2hpbGRyZW4oaCwgY2hpbGRyZW4sIGRhdGEuZXhwYW5kLCBjb250ZXh0KSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGgoJ3VsJywge1xuICAgICAgICBkb21Qcm9wczoge1xuICAgICAgICAgICAgY2xhc3NOYW1lOiAnbm9kZSdcbiAgICAgICAgfVxuICAgIH0sIGNoaWxkTm9kZXMpO1xufTtcblxuZXhwb3J0IGNvbnN0IHJlbmRlciA9IChoLCBjb250ZXh0KT0+e1xuICAgIGNvbnN0IHtwcm9wc30gPSBjb250ZXh0O1xuICAgIHJldHVybiByZW5kZXJOb2RlKGgsIHByb3BzLmRhdGEsIGNvbnRleHQpO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgcmVuZGVyOyIsIjx0ZW1wbGF0ZT5cbiAgICA8ZGl2IHYtaWY9XCJzaG93XCI+XG4gICAgICAgIDx0ZW1wbGF0ZSB2LWlmPVwiZGF0YS5sZW5ndGggPiAwXCI+XG4gICAgICAgICAgICA8YXV0aC10cmVlIHYtZm9yPVwiaXRlbSBpbiBkYXRhXCJcbiAgICAgICAgICAgICAgICA6a2V5PVwiaXRlbS5pZFwiXG4gICAgICAgICAgICAgICAgOmRhdGE9XCJpdGVtXCJcbiAgICAgICAgICAgICAgICA6cHJvcHM9XCJwcm9wc1wiXG4gICAgICAgICAgICAgICAgQG9uLW5vZGUtZXhwYW5kPVwiKGRhdGEpPT5vbkV4cGFuZChkYXRhKVwiXG4gICAgICAgICAgICAgICAgQG9uLW5vZGUtY2hlY2tlZD1cIihkYXRhKT0+b25DaGVja2VkKGRhdGEpXCJcbiAgICAgICAgICAgID48L2F1dGgtdHJlZT5cbiAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICA8L2Rpdj5cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgcmVuZGVyIGZyb20gJy4vdHJlZSc7XG5leHBvcnQgZGVmYXVsdCB7XG4gICAgbmFtZTogJ1RyZWUnLFxuICAgIGNvbXBvbmVudHM6IHtcbiAgICAgICAgQXV0aFRyZWU6IHtcbiAgICAgICAgICAgIHJlbmRlcixcbiAgICAgICAgICAgIGZ1bmN0aW9uYWw6IHRydWVcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcHJvcHM6IHtcbiAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgdHlwZTogQXJyYXksXG4gICAgICAgICAgICBkZWZhdWx0OiAoKT0+e1xuICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgcHJvcHM6IHtcbiAgICAgICAgICAgIHR5cGU6IE9iamVjdCxcbiAgICAgICAgICAgIGRlZmF1bHQ6ICgpPT57XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICduYW1lJ1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuICAgIGRhdGEoKXtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6IDEsXG4gICAgICAgICAgICBzaG93OiBmYWxzZSxcbiAgICAgICAgICAgIGxpc3Q6IFtdLFxuICAgICAgICAgICAgY2hlY2tlZDogZmFsc2VcbiAgICAgICAgfTtcbiAgICB9LFxuICAgIG1ldGhvZHM6IHtcbiAgICAgICAgaW5pdChkYXRhLCBsZXZlKXtcbiAgICAgICAgICAgIGRhdGEuX2xldmUgPSBsZXZlO1xuICAgICAgICAgICAgaWYoZGF0YS5jaGlsZHJlbiAmJiBkYXRhLmNoaWxkcmVuLmxlbmd0aCA+IDApe1xuICAgICAgICAgICAgICAgIGxldmUrKztcbiAgICAgICAgICAgICAgICBmb3IoY29uc3QgaSBpbiBkYXRhLmNoaWxkcmVuKXtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0KGRhdGEuY2hpbGRyZW5baV0sIGxldmUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgLy8g5Yi35pawXG4gICAgICAgIHJlZnJlc2goKXtcbiAgICAgICAgICAgIHRoaXMuc2hvdyA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy4kbmV4dFRpY2soKCk9PntcbiAgICAgICAgICAgICAgICB0aGlzLnNob3cgPSB0cnVlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8vIOWxleW8gC/pmpDol49cbiAgICAgICAgb25FeHBhbmQoZGF0YSl7XG4gICAgICAgICAgICBkYXRhLmV4cGFuZCA9ICFkYXRhLmV4cGFuZDtcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaCgpO1xuICAgICAgICB9LFxuICAgICAgICAvLyDpgInkuK0v5Y+W5raI6YCJ5LitXG4gICAgICAgIG9uQ2hlY2tlZChkYXRhKXtcbiAgICAgICAgICAgIGRhdGEuY2hlY2tlZCA9ICFkYXRhLmNoZWNrZWQ7XG4gICAgICAgICAgICB0aGlzLnRvb2xlckNoZWNrZWQodGhpcy5kYXRhLCBkYXRhKTtcbiAgICAgICAgICAgIHRoaXMuc2V0UGFyZW50Q2hlY2tlZCh0aGlzLmRhdGEpO1xuICAgICAgICAgICAgdGhpcy5yZWZyZXNoKCk7XG4gICAgICAgIH0sXG4gICAgICAgIHRvb2xlckNoZWNrZWQobGlzdCwgbm9kZSl7XG4gICAgICAgICAgICBmb3IoY29uc3QgaSBpbiBsaXN0KXtcbiAgICAgICAgICAgICAgICBpZihsaXN0W2ldLmlkID09PSBub2RlLmlkKXtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRDaGlsZENoZWNrZWQobGlzdFtpXS5jaGlsZHJlbiwgbGlzdFtpXS5jaGVja2VkKTtcbiAgICAgICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b29sZXJDaGVja2VkKGxpc3RbaV0uY2hpbGRyZW4sIG5vZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgLy8g6YCJ5Lit6IqC54K55pe277yM6K6+572u5a2Q6IqC54K55YWo6YCJXG4gICAgICAgIHNldENoaWxkQ2hlY2tlZChjaGlsZHJlbiwgY2hlY2tlZCl7XG4gICAgICAgICAgICBmb3IoY29uc3QgaSBpbiBjaGlsZHJlbil7XG4gICAgICAgICAgICAgICAgY2hpbGRyZW5baV0uY2hlY2tlZCA9IGNoZWNrZWQ7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRDaGlsZENoZWNrZWQoY2hpbGRyZW5baV0uY2hpbGRyZW4sIGNoZWNrZWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICAvLyDorr7nva7niLboioLngrnpgInkuK1cbiAgICAgICAgc2V0UGFyZW50Q2hlY2tlZChkYXRhKXtcbiAgICAgICAgICAgIGZvcihjb25zdCBpIGluIGRhdGEpe1xuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGlmKGRhdGFbaV0uY2hpbGRyZW4gJiYgZGF0YVtpXS5jaGlsZHJlbi5sZW5ndGggPiAwKXtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGlsZElzQ2hlY2tlZChkYXRhW2ldLmNoaWxkcmVuKTtcbiAgICAgICAgICAgICAgICAgICAgaWYodGhpcy5jaGVja2VkKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbaV0uY2hlY2tlZCA9IHRoaXMuY2hlY2tlZDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFBhcmVudENoZWNrZWQoZGF0YVtpXS5jaGlsZHJlbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5yZWZyZXNoKCk7XG4gICAgICAgIH0sXG4gICAgICAgIC8vIOWIpOaWreiKgueCueeahOWtkOiKgueCueaYr+WQpuaciemAieS4rVxuICAgICAgICBjaGlsZElzQ2hlY2tlZChjaGlsZHJlbil7XG4gICAgICAgICAgICBmb3IoY29uc3QgaSBpbiBjaGlsZHJlbil7XG4gICAgICAgICAgICAgICAgaWYoY2hpbGRyZW5baV0uY2hlY2tlZCl7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2hpbGRJc0NoZWNrZWQoY2hpbGRyZW5baV0uY2hpbGRyZW4pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgLy8g6K6+572u6buY6K6k6YCJ5LitXG4gICAgICAgIHNldERlZmF1bHRDaGVja2VkKGRlZmF1bHRJZHMpe1xuICAgICAgICAgICAgZm9yKGNvbnN0IGkgaW4gZGVmYXVsdElkcyl7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRDaGVja2VkKHRoaXMuZGF0YSwgZGVmYXVsdElkc1tpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNldFBhcmVudENoZWNrZWQodGhpcy5kYXRhKTtcbiAgICAgICAgfSxcbiAgICAgICAgLy8g5qC55o2u5omA57uZ55qEaWTvvIzorr7nva7mlLnpobnpgInkuK1cbiAgICAgICAgc2V0Q2hlY2tlZChkYXRhLCBpZCl7XG4gICAgICAgICAgICBmb3IoY29uc3QgaSBpbiBkYXRhKXtcbiAgICAgICAgICAgICAgICBpZihkYXRhW2ldLmlkID09PSBpZCl7XG4gICAgICAgICAgICAgICAgICAgIGRhdGFbaV0uY2hlY2tlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgICAgICBpZihkYXRhW2ldLmNoaWxkcmVuICYmIGRhdGFbaV0uY2hpbGRyZW4ubGVuZ3RoID4gMCl7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldENoZWNrZWQoZGF0YVtpXS5jaGlsZHJlbiwgaWQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICAvLyDojrflj5bpgInkuK3pgInnmoRrZXlcbiAgICAgICAgZ2V0Q2hlY2tlZEtleXMoKXtcbiAgICAgICAgICAgIGNvbnN0IGtleXMgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuX2dldENoZWNrZWRLZXlzKHRoaXMuZGF0YSwga2V5cyk7XG4gICAgICAgICAgICByZXR1cm4ga2V5cztcbiAgICAgICAgfSxcbiAgICAgICAgLy8g6YGN5Y6G5Ye66YCJ5Lit6YCJ55qEa2V5XG4gICAgICAgIF9nZXRDaGVja2VkS2V5cyhkYXRhLCBrZXlzKXtcbiAgICAgICAgICAgIGZvcihjb25zdCBpIGluIGRhdGEpe1xuICAgICAgICAgICAgICAgIGlmKGRhdGFbaV0uY2hlY2tlZCl7XG4gICAgICAgICAgICAgICAgICAgIGtleXMucHVzaChkYXRhW2ldLmlkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYoZGF0YVtpXS5jaGlsZHJlbiAmJiBkYXRhW2ldLmNoaWxkcmVuLmxlbmd0aCA+IDApe1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9nZXRDaGVja2VkS2V5cyhkYXRhW2ldLmNoaWxkcmVuLCBrZXlzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIC8vIOiOt+WPlumAieS4remAieeahOiKgueCuVxuICAgICAgICBnZXRDaGVja2VkTm9kZXMoKXtcbiAgICAgICAgICAgIGNvbnN0IG5vZGVzID0gW107XG4gICAgICAgICAgICB0aGlzLl9nZXRDaGVja2VkTm9kZXModGhpcy5kYXRhLCBub2Rlcyk7XG4gICAgICAgICAgICByZXR1cm4gbm9kZXM7XG4gICAgICAgIH0sXG4gICAgICAgIC8vIOmBjeWOhuWHuumAieS4remAieeahOiKgueCuVxuICAgICAgICBfZ2V0Q2hlY2tlZE5vZGVzKGRhdGEsIG5vZGVzKXtcbiAgICAgICAgICAgIGZvcihjb25zdCBpIGluIGRhdGEpe1xuICAgICAgICAgICAgICAgIGlmKGRhdGFbaV0uY2hlY2tlZCl7XG4gICAgICAgICAgICAgICAgICAgIG5vZGVzLnB1c2goZGF0YVtpXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmKGRhdGFbaV0uY2hpbGRyZW4gJiYgZGF0YVtpXS5jaGlsZHJlbi5sZW5ndGggPiAwKXtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZ2V0Q2hlY2tlZE5vZGVzKGRhdGFbaV0uY2hpbGRyZW4sIG5vZGVzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuICAgIHdhdGNoOiB7XG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIGhhbmRsZXIoKSB7XG4gICAgICAgICAgICAgICAgZm9yKGNvbnN0IGkgaW4gdGhpcy5kYXRhKXtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0KHRoaXMuZGF0YVtpXSwgMCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMucmVmcmVzaCgpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGltbWVkaWF0ZTogdHJ1ZSxcbiAgICAgICAgICAgIGRlZXA6IHRydWVcbiAgICAgICAgfVxuICAgIH1cbn07XG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCIgc2NvcGVkPlxuQGltcG9ydCB1cmwoLi9pY29uL2ljb25mb250LmNzcyk7XG51bHtcbiAgICBsaXN0LXN0eWxlOiBub25lO1xuICAgIG1hcmdpbjogMDtcbiAgICBwYWRkaW5nOiAwO1xuICAgIHRleHQtYWxpZ246IGxlZnQ7XG5cbiAgICBsaXtcbiAgICAgICAgcGFkZGluZzogNXB4IDA7XG4gICAgICAgIGN1cnNvcjogcG9pbnRlcjtcblxuICAgICAgICAuY2hlY2staWNve1xuICAgICAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgICAgICAgICAgaGVpZ2h0OiA1cHg7XG4gICAgICAgICAgICB3aWR0aDogNXB4O1xuICAgICAgICAgICAgYm9yZGVyOiAxcHggc29saWQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBsaTpob3ZlcntcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgkY29sb3I6ICMwMDAwMDAsICRhbHBoYTogMC4xKTtcbiAgICB9XG5cbiAgICAuZXhwYW5ke1xuICAgICAgICBkaXNwbGF5OiBub25lO1xuICAgIH1cbn1cbjwvc3R5bGU+IiwiaW1wb3J0IG1vZCBmcm9tIFwiLSEuLi8uLi8uLi9ub2RlX21vZHVsZXMvdGhyZWFkLWxvYWRlci9kaXN0L2Nqcy5qcyEuLi8uLi8uLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYi9pbmRleC5qcz8/Y2xvbmVkUnVsZVNldC00MC51c2VbMV0hLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0B2dWUvdnVlLWxvYWRlci12MTUvbGliL2luZGV4LmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9JbmRleC52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anNcIjsgZXhwb3J0IGRlZmF1bHQgbW9kOyBleHBvcnQgKiBmcm9tIFwiLSEuLi8uLi8uLi9ub2RlX21vZHVsZXMvdGhyZWFkLWxvYWRlci9kaXN0L2Nqcy5qcyEuLi8uLi8uLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYi9pbmRleC5qcz8/Y2xvbmVkUnVsZVNldC00MC51c2VbMV0hLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0B2dWUvdnVlLWxvYWRlci12MTUvbGliL2luZGV4LmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9JbmRleC52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anNcIiIsIi8vIGV4dHJhY3RlZCBieSBtaW5pLWNzcy1leHRyYWN0LXBsdWdpblxuZXhwb3J0IHt9OyIsImV4cG9ydCAqIGZyb20gXCItIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9taW5pLWNzcy1leHRyYWN0LXBsdWdpbi9kaXN0L2xvYWRlci5qcz8/Y2xvbmVkUnVsZVNldC0yMi51c2VbMF0hLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanM/P2Nsb25lZFJ1bGVTZXQtMjIudXNlWzFdIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9AdnVlL3Z1ZS1sb2FkZXItdjE1L2xpYi9sb2FkZXJzL3N0eWxlUG9zdExvYWRlci5qcyEuLi8uLi8uLi9ub2RlX21vZHVsZXMvcG9zdGNzcy1sb2FkZXIvZGlzdC9janMuanM/P2Nsb25lZFJ1bGVTZXQtMjIudXNlWzJdIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zYXNzLWxvYWRlci9kaXN0L2Nqcy5qcz8/Y2xvbmVkUnVsZVNldC0yMi51c2VbM10hLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0B2dWUvdnVlLWxvYWRlci12MTUvbGliL2luZGV4LmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9JbmRleC52dWU/dnVlJnR5cGU9c3R5bGUmaW5kZXg9MCZpZD01ZTgxZTA1ZSZwcm9kJmxhbmc9c2NzcyZzY29wZWQ9dHJ1ZVwiIiwiaW1wb3J0IHsgcmVuZGVyLCBzdGF0aWNSZW5kZXJGbnMgfSBmcm9tIFwiLi9JbmRleC52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9NWU4MWUwNWUmc2NvcGVkPXRydWVcIlxuaW1wb3J0IHNjcmlwdCBmcm9tIFwiLi9JbmRleC52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anNcIlxuZXhwb3J0ICogZnJvbSBcIi4vSW5kZXgudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzXCJcbmltcG9ydCBzdHlsZTAgZnJvbSBcIi4vSW5kZXgudnVlP3Z1ZSZ0eXBlPXN0eWxlJmluZGV4PTAmaWQ9NWU4MWUwNWUmcHJvZCZsYW5nPXNjc3Mmc2NvcGVkPXRydWVcIlxuXG5cbi8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi9cbmltcG9ydCBub3JtYWxpemVyIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0B2dWUvdnVlLWxvYWRlci12MTUvbGliL3J1bnRpbWUvY29tcG9uZW50Tm9ybWFsaXplci5qc1wiXG52YXIgY29tcG9uZW50ID0gbm9ybWFsaXplcihcbiAgc2NyaXB0LFxuICByZW5kZXIsXG4gIHN0YXRpY1JlbmRlckZucyxcbiAgZmFsc2UsXG4gIG51bGwsXG4gIFwiNWU4MWUwNWVcIixcbiAgbnVsbFxuICBcbilcblxuZXhwb3J0IGRlZmF1bHQgY29tcG9uZW50LmV4cG9ydHMiLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfY2hlY2tQcml2YXRlUmVkZWNsYXJhdGlvbihvYmosIHByaXZhdGVDb2xsZWN0aW9uKSB7XG4gIGlmIChwcml2YXRlQ29sbGVjdGlvbi5oYXMob2JqKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgaW5pdGlhbGl6ZSB0aGUgc2FtZSBwcml2YXRlIGVsZW1lbnRzIHR3aWNlIG9uIGFuIG9iamVjdFwiKTtcbiAgfVxufSIsImltcG9ydCBjaGVja1ByaXZhdGVSZWRlY2xhcmF0aW9uIGZyb20gXCIuL2NoZWNrUHJpdmF0ZVJlZGVjbGFyYXRpb24uanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKG9iaiwgcHJpdmF0ZU1hcCwgdmFsdWUpIHtcbiAgY2hlY2tQcml2YXRlUmVkZWNsYXJhdGlvbihvYmosIHByaXZhdGVNYXApO1xuICBwcml2YXRlTWFwLnNldChvYmosIHZhbHVlKTtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfYXNzZXJ0Q2xhc3NCcmFuZChlLCB0LCBuKSB7XG4gIGlmIChcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIGUgPyBlID09PSB0IDogZS5oYXModCkpIHJldHVybiBhcmd1bWVudHMubGVuZ3RoIDwgMyA/IHQgOiBuO1xuICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBlbGVtZW50IGlzIG5vdCBwcmVzZW50IG9uIHRoaXMgb2JqZWN0XCIpO1xufSIsImltcG9ydCBhc3NlcnRDbGFzc0JyYW5kIGZyb20gXCIuL2Fzc2VydENsYXNzQnJhbmQuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9jbGFzc1ByaXZhdGVGaWVsZFNldDIocywgYSwgcikge1xuICByZXR1cm4gcy5zZXQoYXNzZXJ0Q2xhc3NCcmFuZChzLCBhKSwgciksIHI7XG59IiwiaW1wb3J0IGFzc2VydENsYXNzQnJhbmQgZnJvbSBcIi4vYXNzZXJ0Q2xhc3NCcmFuZC5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0MihzLCBhKSB7XG4gIHJldHVybiBzLmdldChhc3NlcnRDbGFzc0JyYW5kKHMsIGEpKTtcbn0iLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGJpbmQoZm4sIHRoaXNBcmcpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHdyYXAoKSB7XG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoaXNBcmcsIGFyZ3VtZW50cyk7XG4gIH07XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCBiaW5kIGZyb20gJy4vaGVscGVycy9iaW5kLmpzJztcblxuLy8gdXRpbHMgaXMgYSBsaWJyYXJ5IG9mIGdlbmVyaWMgaGVscGVyIGZ1bmN0aW9ucyBub24tc3BlY2lmaWMgdG8gYXhpb3NcblxuY29uc3Qge3RvU3RyaW5nfSA9IE9iamVjdC5wcm90b3R5cGU7XG5jb25zdCB7Z2V0UHJvdG90eXBlT2Z9ID0gT2JqZWN0O1xuXG5jb25zdCBraW5kT2YgPSAoY2FjaGUgPT4gdGhpbmcgPT4ge1xuICAgIGNvbnN0IHN0ciA9IHRvU3RyaW5nLmNhbGwodGhpbmcpO1xuICAgIHJldHVybiBjYWNoZVtzdHJdIHx8IChjYWNoZVtzdHJdID0gc3RyLnNsaWNlKDgsIC0xKS50b0xvd2VyQ2FzZSgpKTtcbn0pKE9iamVjdC5jcmVhdGUobnVsbCkpO1xuXG5jb25zdCBraW5kT2ZUZXN0ID0gKHR5cGUpID0+IHtcbiAgdHlwZSA9IHR5cGUudG9Mb3dlckNhc2UoKTtcbiAgcmV0dXJuICh0aGluZykgPT4ga2luZE9mKHRoaW5nKSA9PT0gdHlwZVxufVxuXG5jb25zdCB0eXBlT2ZUZXN0ID0gdHlwZSA9PiB0aGluZyA9PiB0eXBlb2YgdGhpbmcgPT09IHR5cGU7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYW4gQXJyYXlcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYW4gQXJyYXksIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCB7aXNBcnJheX0gPSBBcnJheTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyB1bmRlZmluZWRcbiAqXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSB2YWx1ZSBpcyB1bmRlZmluZWQsIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc1VuZGVmaW5lZCA9IHR5cGVPZlRlc3QoJ3VuZGVmaW5lZCcpO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgQnVmZmVyXG4gKlxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIEJ1ZmZlciwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzQnVmZmVyKHZhbCkge1xuICByZXR1cm4gdmFsICE9PSBudWxsICYmICFpc1VuZGVmaW5lZCh2YWwpICYmIHZhbC5jb25zdHJ1Y3RvciAhPT0gbnVsbCAmJiAhaXNVbmRlZmluZWQodmFsLmNvbnN0cnVjdG9yKVxuICAgICYmIGlzRnVuY3Rpb24odmFsLmNvbnN0cnVjdG9yLmlzQnVmZmVyKSAmJiB2YWwuY29uc3RydWN0b3IuaXNCdWZmZXIodmFsKTtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhbiBBcnJheUJ1ZmZlclxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYW4gQXJyYXlCdWZmZXIsIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc0FycmF5QnVmZmVyID0ga2luZE9mVGVzdCgnQXJyYXlCdWZmZXInKTtcblxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgdmlldyBvbiBhbiBBcnJheUJ1ZmZlclxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSB2aWV3IG9uIGFuIEFycmF5QnVmZmVyLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNBcnJheUJ1ZmZlclZpZXcodmFsKSB7XG4gIGxldCByZXN1bHQ7XG4gIGlmICgodHlwZW9mIEFycmF5QnVmZmVyICE9PSAndW5kZWZpbmVkJykgJiYgKEFycmF5QnVmZmVyLmlzVmlldykpIHtcbiAgICByZXN1bHQgPSBBcnJheUJ1ZmZlci5pc1ZpZXcodmFsKTtcbiAgfSBlbHNlIHtcbiAgICByZXN1bHQgPSAodmFsKSAmJiAodmFsLmJ1ZmZlcikgJiYgKGlzQXJyYXlCdWZmZXIodmFsLmJ1ZmZlcikpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBTdHJpbmdcbiAqXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgU3RyaW5nLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNTdHJpbmcgPSB0eXBlT2ZUZXN0KCdzdHJpbmcnKTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIEZ1bmN0aW9uXG4gKlxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgRnVuY3Rpb24sIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc0Z1bmN0aW9uID0gdHlwZU9mVGVzdCgnZnVuY3Rpb24nKTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIE51bWJlclxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBOdW1iZXIsIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc051bWJlciA9IHR5cGVPZlRlc3QoJ251bWJlcicpO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGFuIE9iamVjdFxuICpcbiAqIEBwYXJhbSB7Kn0gdGhpbmcgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhbiBPYmplY3QsIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc09iamVjdCA9ICh0aGluZykgPT4gdGhpbmcgIT09IG51bGwgJiYgdHlwZW9mIHRoaW5nID09PSAnb2JqZWN0JztcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIEJvb2xlYW5cbiAqXG4gKiBAcGFyYW0geyp9IHRoaW5nIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIEJvb2xlYW4sIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc0Jvb2xlYW4gPSB0aGluZyA9PiB0aGluZyA9PT0gdHJ1ZSB8fCB0aGluZyA9PT0gZmFsc2U7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBwbGFpbiBPYmplY3RcbiAqXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgcGxhaW4gT2JqZWN0LCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNQbGFpbk9iamVjdCA9ICh2YWwpID0+IHtcbiAgaWYgKGtpbmRPZih2YWwpICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IHByb3RvdHlwZSA9IGdldFByb3RvdHlwZU9mKHZhbCk7XG4gIHJldHVybiAocHJvdG90eXBlID09PSBudWxsIHx8IHByb3RvdHlwZSA9PT0gT2JqZWN0LnByb3RvdHlwZSB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG90eXBlKSA9PT0gbnVsbCkgJiYgIShTeW1ib2wudG9TdHJpbmdUYWcgaW4gdmFsKSAmJiAhKFN5bWJvbC5pdGVyYXRvciBpbiB2YWwpO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgRGF0ZVxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBEYXRlLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNEYXRlID0ga2luZE9mVGVzdCgnRGF0ZScpO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgRmlsZVxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBGaWxlLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNGaWxlID0ga2luZE9mVGVzdCgnRmlsZScpO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgQmxvYlxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBCbG9iLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNCbG9iID0ga2luZE9mVGVzdCgnQmxvYicpO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgRmlsZUxpc3RcbiAqXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgRmlsZSwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IGlzRmlsZUxpc3QgPSBraW5kT2ZUZXN0KCdGaWxlTGlzdCcpO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgU3RyZWFtXG4gKlxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIFN0cmVhbSwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IGlzU3RyZWFtID0gKHZhbCkgPT4gaXNPYmplY3QodmFsKSAmJiBpc0Z1bmN0aW9uKHZhbC5waXBlKTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIEZvcm1EYXRhXG4gKlxuICogQHBhcmFtIHsqfSB0aGluZyBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGFuIEZvcm1EYXRhLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNGb3JtRGF0YSA9ICh0aGluZykgPT4ge1xuICBsZXQga2luZDtcbiAgcmV0dXJuIHRoaW5nICYmIChcbiAgICAodHlwZW9mIEZvcm1EYXRhID09PSAnZnVuY3Rpb24nICYmIHRoaW5nIGluc3RhbmNlb2YgRm9ybURhdGEpIHx8IChcbiAgICAgIGlzRnVuY3Rpb24odGhpbmcuYXBwZW5kKSAmJiAoXG4gICAgICAgIChraW5kID0ga2luZE9mKHRoaW5nKSkgPT09ICdmb3JtZGF0YScgfHxcbiAgICAgICAgLy8gZGV0ZWN0IGZvcm0tZGF0YSBpbnN0YW5jZVxuICAgICAgICAoa2luZCA9PT0gJ29iamVjdCcgJiYgaXNGdW5jdGlvbih0aGluZy50b1N0cmluZykgJiYgdGhpbmcudG9TdHJpbmcoKSA9PT0gJ1tvYmplY3QgRm9ybURhdGFdJylcbiAgICAgIClcbiAgICApXG4gIClcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIFVSTFNlYXJjaFBhcmFtcyBvYmplY3RcbiAqXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgVVJMU2VhcmNoUGFyYW1zIG9iamVjdCwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IGlzVVJMU2VhcmNoUGFyYW1zID0ga2luZE9mVGVzdCgnVVJMU2VhcmNoUGFyYW1zJyk7XG5cbi8qKlxuICogVHJpbSBleGNlc3Mgd2hpdGVzcGFjZSBvZmYgdGhlIGJlZ2lubmluZyBhbmQgZW5kIG9mIGEgc3RyaW5nXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0ciBUaGUgU3RyaW5nIHRvIHRyaW1cbiAqXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBUaGUgU3RyaW5nIGZyZWVkIG9mIGV4Y2VzcyB3aGl0ZXNwYWNlXG4gKi9cbmNvbnN0IHRyaW0gPSAoc3RyKSA9PiBzdHIudHJpbSA/XG4gIHN0ci50cmltKCkgOiBzdHIucmVwbGFjZSgvXltcXHNcXHVGRUZGXFx4QTBdK3xbXFxzXFx1RkVGRlxceEEwXSskL2csICcnKTtcblxuLyoqXG4gKiBJdGVyYXRlIG92ZXIgYW4gQXJyYXkgb3IgYW4gT2JqZWN0IGludm9raW5nIGEgZnVuY3Rpb24gZm9yIGVhY2ggaXRlbS5cbiAqXG4gKiBJZiBgb2JqYCBpcyBhbiBBcnJheSBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZCBwYXNzaW5nXG4gKiB0aGUgdmFsdWUsIGluZGV4LCBhbmQgY29tcGxldGUgYXJyYXkgZm9yIGVhY2ggaXRlbS5cbiAqXG4gKiBJZiAnb2JqJyBpcyBhbiBPYmplY3QgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgcGFzc2luZ1xuICogdGhlIHZhbHVlLCBrZXksIGFuZCBjb21wbGV0ZSBvYmplY3QgZm9yIGVhY2ggcHJvcGVydHkuXG4gKlxuICogQHBhcmFtIHtPYmplY3R8QXJyYXl9IG9iaiBUaGUgb2JqZWN0IHRvIGl0ZXJhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBjYWxsYmFjayB0byBpbnZva2UgZm9yIGVhY2ggaXRlbVxuICpcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW2FsbE93bktleXMgPSBmYWxzZV1cbiAqIEByZXR1cm5zIHthbnl9XG4gKi9cbmZ1bmN0aW9uIGZvckVhY2gob2JqLCBmbiwge2FsbE93bktleXMgPSBmYWxzZX0gPSB7fSkge1xuICAvLyBEb24ndCBib3RoZXIgaWYgbm8gdmFsdWUgcHJvdmlkZWRcbiAgaWYgKG9iaiA9PT0gbnVsbCB8fCB0eXBlb2Ygb2JqID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxldCBpO1xuICBsZXQgbDtcblxuICAvLyBGb3JjZSBhbiBhcnJheSBpZiBub3QgYWxyZWFkeSBzb21ldGhpbmcgaXRlcmFibGVcbiAgaWYgKHR5cGVvZiBvYmogIT09ICdvYmplY3QnKSB7XG4gICAgLyplc2xpbnQgbm8tcGFyYW0tcmVhc3NpZ246MCovXG4gICAgb2JqID0gW29ial07XG4gIH1cblxuICBpZiAoaXNBcnJheShvYmopKSB7XG4gICAgLy8gSXRlcmF0ZSBvdmVyIGFycmF5IHZhbHVlc1xuICAgIGZvciAoaSA9IDAsIGwgPSBvYmoubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICBmbi5jYWxsKG51bGwsIG9ialtpXSwgaSwgb2JqKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gSXRlcmF0ZSBvdmVyIG9iamVjdCBrZXlzXG4gICAgY29uc3Qga2V5cyA9IGFsbE93bktleXMgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhvYmopIDogT2JqZWN0LmtleXMob2JqKTtcbiAgICBjb25zdCBsZW4gPSBrZXlzLmxlbmd0aDtcbiAgICBsZXQga2V5O1xuXG4gICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBrZXkgPSBrZXlzW2ldO1xuICAgICAgZm4uY2FsbChudWxsLCBvYmpba2V5XSwga2V5LCBvYmopO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5kS2V5KG9iaiwga2V5KSB7XG4gIGtleSA9IGtleS50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMob2JqKTtcbiAgbGV0IGkgPSBrZXlzLmxlbmd0aDtcbiAgbGV0IF9rZXk7XG4gIHdoaWxlIChpLS0gPiAwKSB7XG4gICAgX2tleSA9IGtleXNbaV07XG4gICAgaWYgKGtleSA9PT0gX2tleS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICByZXR1cm4gX2tleTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbmNvbnN0IF9nbG9iYWwgPSAoKCkgPT4ge1xuICAvKmVzbGludCBuby11bmRlZjowKi9cbiAgaWYgKHR5cGVvZiBnbG9iYWxUaGlzICE9PSBcInVuZGVmaW5lZFwiKSByZXR1cm4gZ2xvYmFsVGhpcztcbiAgcmV0dXJuIHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiID8gc2VsZiA6ICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IHdpbmRvdyA6IGdsb2JhbClcbn0pKCk7XG5cbmNvbnN0IGlzQ29udGV4dERlZmluZWQgPSAoY29udGV4dCkgPT4gIWlzVW5kZWZpbmVkKGNvbnRleHQpICYmIGNvbnRleHQgIT09IF9nbG9iYWw7XG5cbi8qKlxuICogQWNjZXB0cyB2YXJhcmdzIGV4cGVjdGluZyBlYWNoIGFyZ3VtZW50IHRvIGJlIGFuIG9iamVjdCwgdGhlblxuICogaW1tdXRhYmx5IG1lcmdlcyB0aGUgcHJvcGVydGllcyBvZiBlYWNoIG9iamVjdCBhbmQgcmV0dXJucyByZXN1bHQuXG4gKlxuICogV2hlbiBtdWx0aXBsZSBvYmplY3RzIGNvbnRhaW4gdGhlIHNhbWUga2V5IHRoZSBsYXRlciBvYmplY3QgaW5cbiAqIHRoZSBhcmd1bWVudHMgbGlzdCB3aWxsIHRha2UgcHJlY2VkZW5jZS5cbiAqXG4gKiBFeGFtcGxlOlxuICpcbiAqIGBgYGpzXG4gKiB2YXIgcmVzdWx0ID0gbWVyZ2Uoe2ZvbzogMTIzfSwge2ZvbzogNDU2fSk7XG4gKiBjb25zb2xlLmxvZyhyZXN1bHQuZm9vKTsgLy8gb3V0cHV0cyA0NTZcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmoxIE9iamVjdCB0byBtZXJnZVxuICpcbiAqIEByZXR1cm5zIHtPYmplY3R9IFJlc3VsdCBvZiBhbGwgbWVyZ2UgcHJvcGVydGllc1xuICovXG5mdW5jdGlvbiBtZXJnZSgvKiBvYmoxLCBvYmoyLCBvYmozLCAuLi4gKi8pIHtcbiAgY29uc3Qge2Nhc2VsZXNzfSA9IGlzQ29udGV4dERlZmluZWQodGhpcykgJiYgdGhpcyB8fCB7fTtcbiAgY29uc3QgcmVzdWx0ID0ge307XG4gIGNvbnN0IGFzc2lnblZhbHVlID0gKHZhbCwga2V5KSA9PiB7XG4gICAgY29uc3QgdGFyZ2V0S2V5ID0gY2FzZWxlc3MgJiYgZmluZEtleShyZXN1bHQsIGtleSkgfHwga2V5O1xuICAgIGlmIChpc1BsYWluT2JqZWN0KHJlc3VsdFt0YXJnZXRLZXldKSAmJiBpc1BsYWluT2JqZWN0KHZhbCkpIHtcbiAgICAgIHJlc3VsdFt0YXJnZXRLZXldID0gbWVyZ2UocmVzdWx0W3RhcmdldEtleV0sIHZhbCk7XG4gICAgfSBlbHNlIGlmIChpc1BsYWluT2JqZWN0KHZhbCkpIHtcbiAgICAgIHJlc3VsdFt0YXJnZXRLZXldID0gbWVyZ2Uoe30sIHZhbCk7XG4gICAgfSBlbHNlIGlmIChpc0FycmF5KHZhbCkpIHtcbiAgICAgIHJlc3VsdFt0YXJnZXRLZXldID0gdmFsLnNsaWNlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdFt0YXJnZXRLZXldID0gdmFsO1xuICAgIH1cbiAgfVxuXG4gIGZvciAobGV0IGkgPSAwLCBsID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGFyZ3VtZW50c1tpXSAmJiBmb3JFYWNoKGFyZ3VtZW50c1tpXSwgYXNzaWduVmFsdWUpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogRXh0ZW5kcyBvYmplY3QgYSBieSBtdXRhYmx5IGFkZGluZyB0byBpdCB0aGUgcHJvcGVydGllcyBvZiBvYmplY3QgYi5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gYSBUaGUgb2JqZWN0IHRvIGJlIGV4dGVuZGVkXG4gKiBAcGFyYW0ge09iamVjdH0gYiBUaGUgb2JqZWN0IHRvIGNvcHkgcHJvcGVydGllcyBmcm9tXG4gKiBAcGFyYW0ge09iamVjdH0gdGhpc0FyZyBUaGUgb2JqZWN0IHRvIGJpbmQgZnVuY3Rpb24gdG9cbiAqXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFthbGxPd25LZXlzXVxuICogQHJldHVybnMge09iamVjdH0gVGhlIHJlc3VsdGluZyB2YWx1ZSBvZiBvYmplY3QgYVxuICovXG5jb25zdCBleHRlbmQgPSAoYSwgYiwgdGhpc0FyZywge2FsbE93bktleXN9PSB7fSkgPT4ge1xuICBmb3JFYWNoKGIsICh2YWwsIGtleSkgPT4ge1xuICAgIGlmICh0aGlzQXJnICYmIGlzRnVuY3Rpb24odmFsKSkge1xuICAgICAgYVtrZXldID0gYmluZCh2YWwsIHRoaXNBcmcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhW2tleV0gPSB2YWw7XG4gICAgfVxuICB9LCB7YWxsT3duS2V5c30pO1xuICByZXR1cm4gYTtcbn1cblxuLyoqXG4gKiBSZW1vdmUgYnl0ZSBvcmRlciBtYXJrZXIuIFRoaXMgY2F0Y2hlcyBFRiBCQiBCRiAodGhlIFVURi04IEJPTSlcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gY29udGVudCB3aXRoIEJPTVxuICpcbiAqIEByZXR1cm5zIHtzdHJpbmd9IGNvbnRlbnQgdmFsdWUgd2l0aG91dCBCT01cbiAqL1xuY29uc3Qgc3RyaXBCT00gPSAoY29udGVudCkgPT4ge1xuICBpZiAoY29udGVudC5jaGFyQ29kZUF0KDApID09PSAweEZFRkYpIHtcbiAgICBjb250ZW50ID0gY29udGVudC5zbGljZSgxKTtcbiAgfVxuICByZXR1cm4gY29udGVudDtcbn1cblxuLyoqXG4gKiBJbmhlcml0IHRoZSBwcm90b3R5cGUgbWV0aG9kcyBmcm9tIG9uZSBjb25zdHJ1Y3RvciBpbnRvIGFub3RoZXJcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBzdXBlckNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge29iamVjdH0gW3Byb3BzXVxuICogQHBhcmFtIHtvYmplY3R9IFtkZXNjcmlwdG9yc11cbiAqXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuY29uc3QgaW5oZXJpdHMgPSAoY29uc3RydWN0b3IsIHN1cGVyQ29uc3RydWN0b3IsIHByb3BzLCBkZXNjcmlwdG9ycykgPT4ge1xuICBjb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ29uc3RydWN0b3IucHJvdG90eXBlLCBkZXNjcmlwdG9ycyk7XG4gIGNvbnN0cnVjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGNvbnN0cnVjdG9yO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29uc3RydWN0b3IsICdzdXBlcicsIHtcbiAgICB2YWx1ZTogc3VwZXJDb25zdHJ1Y3Rvci5wcm90b3R5cGVcbiAgfSk7XG4gIHByb3BzICYmIE9iamVjdC5hc3NpZ24oY29uc3RydWN0b3IucHJvdG90eXBlLCBwcm9wcyk7XG59XG5cbi8qKlxuICogUmVzb2x2ZSBvYmplY3Qgd2l0aCBkZWVwIHByb3RvdHlwZSBjaGFpbiB0byBhIGZsYXQgb2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gc291cmNlT2JqIHNvdXJjZSBvYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBbZGVzdE9ial1cbiAqIEBwYXJhbSB7RnVuY3Rpb258Qm9vbGVhbn0gW2ZpbHRlcl1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcm9wRmlsdGVyXVxuICpcbiAqIEByZXR1cm5zIHtPYmplY3R9XG4gKi9cbmNvbnN0IHRvRmxhdE9iamVjdCA9IChzb3VyY2VPYmosIGRlc3RPYmosIGZpbHRlciwgcHJvcEZpbHRlcikgPT4ge1xuICBsZXQgcHJvcHM7XG4gIGxldCBpO1xuICBsZXQgcHJvcDtcbiAgY29uc3QgbWVyZ2VkID0ge307XG5cbiAgZGVzdE9iaiA9IGRlc3RPYmogfHwge307XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1lcS1udWxsLGVxZXFlcVxuICBpZiAoc291cmNlT2JqID09IG51bGwpIHJldHVybiBkZXN0T2JqO1xuXG4gIGRvIHtcbiAgICBwcm9wcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHNvdXJjZU9iaik7XG4gICAgaSA9IHByb3BzLmxlbmd0aDtcbiAgICB3aGlsZSAoaS0tID4gMCkge1xuICAgICAgcHJvcCA9IHByb3BzW2ldO1xuICAgICAgaWYgKCghcHJvcEZpbHRlciB8fCBwcm9wRmlsdGVyKHByb3AsIHNvdXJjZU9iaiwgZGVzdE9iaikpICYmICFtZXJnZWRbcHJvcF0pIHtcbiAgICAgICAgZGVzdE9ialtwcm9wXSA9IHNvdXJjZU9ialtwcm9wXTtcbiAgICAgICAgbWVyZ2VkW3Byb3BdID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgc291cmNlT2JqID0gZmlsdGVyICE9PSBmYWxzZSAmJiBnZXRQcm90b3R5cGVPZihzb3VyY2VPYmopO1xuICB9IHdoaWxlIChzb3VyY2VPYmogJiYgKCFmaWx0ZXIgfHwgZmlsdGVyKHNvdXJjZU9iaiwgZGVzdE9iaikpICYmIHNvdXJjZU9iaiAhPT0gT2JqZWN0LnByb3RvdHlwZSk7XG5cbiAgcmV0dXJuIGRlc3RPYmo7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIGEgc3RyaW5nIGVuZHMgd2l0aCB0aGUgY2hhcmFjdGVycyBvZiBhIHNwZWNpZmllZCBzdHJpbmdcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gKiBAcGFyYW0ge1N0cmluZ30gc2VhcmNoU3RyaW5nXG4gKiBAcGFyYW0ge051bWJlcn0gW3Bvc2l0aW9uPSAwXVxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBlbmRzV2l0aCA9IChzdHIsIHNlYXJjaFN0cmluZywgcG9zaXRpb24pID0+IHtcbiAgc3RyID0gU3RyaW5nKHN0cik7XG4gIGlmIChwb3NpdGlvbiA9PT0gdW5kZWZpbmVkIHx8IHBvc2l0aW9uID4gc3RyLmxlbmd0aCkge1xuICAgIHBvc2l0aW9uID0gc3RyLmxlbmd0aDtcbiAgfVxuICBwb3NpdGlvbiAtPSBzZWFyY2hTdHJpbmcubGVuZ3RoO1xuICBjb25zdCBsYXN0SW5kZXggPSBzdHIuaW5kZXhPZihzZWFyY2hTdHJpbmcsIHBvc2l0aW9uKTtcbiAgcmV0dXJuIGxhc3RJbmRleCAhPT0gLTEgJiYgbGFzdEluZGV4ID09PSBwb3NpdGlvbjtcbn1cblxuXG4vKipcbiAqIFJldHVybnMgbmV3IGFycmF5IGZyb20gYXJyYXkgbGlrZSBvYmplY3Qgb3IgbnVsbCBpZiBmYWlsZWRcbiAqXG4gKiBAcGFyYW0geyp9IFt0aGluZ11cbiAqXG4gKiBAcmV0dXJucyB7P0FycmF5fVxuICovXG5jb25zdCB0b0FycmF5ID0gKHRoaW5nKSA9PiB7XG4gIGlmICghdGhpbmcpIHJldHVybiBudWxsO1xuICBpZiAoaXNBcnJheSh0aGluZykpIHJldHVybiB0aGluZztcbiAgbGV0IGkgPSB0aGluZy5sZW5ndGg7XG4gIGlmICghaXNOdW1iZXIoaSkpIHJldHVybiBudWxsO1xuICBjb25zdCBhcnIgPSBuZXcgQXJyYXkoaSk7XG4gIHdoaWxlIChpLS0gPiAwKSB7XG4gICAgYXJyW2ldID0gdGhpbmdbaV07XG4gIH1cbiAgcmV0dXJuIGFycjtcbn1cblxuLyoqXG4gKiBDaGVja2luZyBpZiB0aGUgVWludDhBcnJheSBleGlzdHMgYW5kIGlmIGl0IGRvZXMsIGl0IHJldHVybnMgYSBmdW5jdGlvbiB0aGF0IGNoZWNrcyBpZiB0aGVcbiAqIHRoaW5nIHBhc3NlZCBpbiBpcyBhbiBpbnN0YW5jZSBvZiBVaW50OEFycmF5XG4gKlxuICogQHBhcmFtIHtUeXBlZEFycmF5fVxuICpcbiAqIEByZXR1cm5zIHtBcnJheX1cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGZ1bmMtbmFtZXNcbmNvbnN0IGlzVHlwZWRBcnJheSA9IChUeXBlZEFycmF5ID0+IHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGZ1bmMtbmFtZXNcbiAgcmV0dXJuIHRoaW5nID0+IHtcbiAgICByZXR1cm4gVHlwZWRBcnJheSAmJiB0aGluZyBpbnN0YW5jZW9mIFR5cGVkQXJyYXk7XG4gIH07XG59KSh0eXBlb2YgVWludDhBcnJheSAhPT0gJ3VuZGVmaW5lZCcgJiYgZ2V0UHJvdG90eXBlT2YoVWludDhBcnJheSkpO1xuXG4vKipcbiAqIEZvciBlYWNoIGVudHJ5IGluIHRoZSBvYmplY3QsIGNhbGwgdGhlIGZ1bmN0aW9uIHdpdGggdGhlIGtleSBhbmQgdmFsdWUuXG4gKlxuICogQHBhcmFtIHtPYmplY3Q8YW55LCBhbnk+fSBvYmogLSBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIC0gVGhlIGZ1bmN0aW9uIHRvIGNhbGwgZm9yIGVhY2ggZW50cnkuXG4gKlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmNvbnN0IGZvckVhY2hFbnRyeSA9IChvYmosIGZuKSA9PiB7XG4gIGNvbnN0IGdlbmVyYXRvciA9IG9iaiAmJiBvYmpbU3ltYm9sLml0ZXJhdG9yXTtcblxuICBjb25zdCBpdGVyYXRvciA9IGdlbmVyYXRvci5jYWxsKG9iaik7XG5cbiAgbGV0IHJlc3VsdDtcblxuICB3aGlsZSAoKHJlc3VsdCA9IGl0ZXJhdG9yLm5leHQoKSkgJiYgIXJlc3VsdC5kb25lKSB7XG4gICAgY29uc3QgcGFpciA9IHJlc3VsdC52YWx1ZTtcbiAgICBmbi5jYWxsKG9iaiwgcGFpclswXSwgcGFpclsxXSk7XG4gIH1cbn1cblxuLyoqXG4gKiBJdCB0YWtlcyBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBhbmQgYSBzdHJpbmcsIGFuZCByZXR1cm5zIGFuIGFycmF5IG9mIGFsbCB0aGUgbWF0Y2hlc1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSByZWdFeHAgLSBUaGUgcmVndWxhciBleHByZXNzaW9uIHRvIG1hdGNoIGFnYWluc3QuXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyIC0gVGhlIHN0cmluZyB0byBzZWFyY2guXG4gKlxuICogQHJldHVybnMge0FycmF5PGJvb2xlYW4+fVxuICovXG5jb25zdCBtYXRjaEFsbCA9IChyZWdFeHAsIHN0cikgPT4ge1xuICBsZXQgbWF0Y2hlcztcbiAgY29uc3QgYXJyID0gW107XG5cbiAgd2hpbGUgKChtYXRjaGVzID0gcmVnRXhwLmV4ZWMoc3RyKSkgIT09IG51bGwpIHtcbiAgICBhcnIucHVzaChtYXRjaGVzKTtcbiAgfVxuXG4gIHJldHVybiBhcnI7XG59XG5cbi8qIENoZWNraW5nIGlmIHRoZSBraW5kT2ZUZXN0IGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSB3aGVuIHBhc3NlZCBhbiBIVE1MRm9ybUVsZW1lbnQuICovXG5jb25zdCBpc0hUTUxGb3JtID0ga2luZE9mVGVzdCgnSFRNTEZvcm1FbGVtZW50Jyk7XG5cbmNvbnN0IHRvQ2FtZWxDYXNlID0gc3RyID0+IHtcbiAgcmV0dXJuIHN0ci50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1stX1xcc10oW2EtelxcZF0pKFxcdyopL2csXG4gICAgZnVuY3Rpb24gcmVwbGFjZXIobSwgcDEsIHAyKSB7XG4gICAgICByZXR1cm4gcDEudG9VcHBlckNhc2UoKSArIHAyO1xuICAgIH1cbiAgKTtcbn07XG5cbi8qIENyZWF0aW5nIGEgZnVuY3Rpb24gdGhhdCB3aWxsIGNoZWNrIGlmIGFuIG9iamVjdCBoYXMgYSBwcm9wZXJ0eS4gKi9cbmNvbnN0IGhhc093blByb3BlcnR5ID0gKCh7aGFzT3duUHJvcGVydHl9KSA9PiAob2JqLCBwcm9wKSA9PiBoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCkpKE9iamVjdC5wcm90b3R5cGUpO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgUmVnRXhwIG9iamVjdFxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBSZWdFeHAgb2JqZWN0LCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNSZWdFeHAgPSBraW5kT2ZUZXN0KCdSZWdFeHAnKTtcblxuY29uc3QgcmVkdWNlRGVzY3JpcHRvcnMgPSAob2JqLCByZWR1Y2VyKSA9PiB7XG4gIGNvbnN0IGRlc2NyaXB0b3JzID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMob2JqKTtcbiAgY29uc3QgcmVkdWNlZERlc2NyaXB0b3JzID0ge307XG5cbiAgZm9yRWFjaChkZXNjcmlwdG9ycywgKGRlc2NyaXB0b3IsIG5hbWUpID0+IHtcbiAgICBsZXQgcmV0O1xuICAgIGlmICgocmV0ID0gcmVkdWNlcihkZXNjcmlwdG9yLCBuYW1lLCBvYmopKSAhPT0gZmFsc2UpIHtcbiAgICAgIHJlZHVjZWREZXNjcmlwdG9yc1tuYW1lXSA9IHJldCB8fCBkZXNjcmlwdG9yO1xuICAgIH1cbiAgfSk7XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMob2JqLCByZWR1Y2VkRGVzY3JpcHRvcnMpO1xufVxuXG4vKipcbiAqIE1ha2VzIGFsbCBtZXRob2RzIHJlYWQtb25seVxuICogQHBhcmFtIHtPYmplY3R9IG9ialxuICovXG5cbmNvbnN0IGZyZWV6ZU1ldGhvZHMgPSAob2JqKSA9PiB7XG4gIHJlZHVjZURlc2NyaXB0b3JzKG9iaiwgKGRlc2NyaXB0b3IsIG5hbWUpID0+IHtcbiAgICAvLyBza2lwIHJlc3RyaWN0ZWQgcHJvcHMgaW4gc3RyaWN0IG1vZGVcbiAgICBpZiAoaXNGdW5jdGlvbihvYmopICYmIFsnYXJndW1lbnRzJywgJ2NhbGxlcicsICdjYWxsZWUnXS5pbmRleE9mKG5hbWUpICE9PSAtMSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbHVlID0gb2JqW25hbWVdO1xuXG4gICAgaWYgKCFpc0Z1bmN0aW9uKHZhbHVlKSkgcmV0dXJuO1xuXG4gICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZmFsc2U7XG5cbiAgICBpZiAoJ3dyaXRhYmxlJyBpbiBkZXNjcmlwdG9yKSB7XG4gICAgICBkZXNjcmlwdG9yLndyaXRhYmxlID0gZmFsc2U7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFkZXNjcmlwdG9yLnNldCkge1xuICAgICAgZGVzY3JpcHRvci5zZXQgPSAoKSA9PiB7XG4gICAgICAgIHRocm93IEVycm9yKCdDYW4gbm90IHJld3JpdGUgcmVhZC1vbmx5IG1ldGhvZCBcXCcnICsgbmFtZSArICdcXCcnKTtcbiAgICAgIH07XG4gICAgfVxuICB9KTtcbn1cblxuY29uc3QgdG9PYmplY3RTZXQgPSAoYXJyYXlPclN0cmluZywgZGVsaW1pdGVyKSA9PiB7XG4gIGNvbnN0IG9iaiA9IHt9O1xuXG4gIGNvbnN0IGRlZmluZSA9IChhcnIpID0+IHtcbiAgICBhcnIuZm9yRWFjaCh2YWx1ZSA9PiB7XG4gICAgICBvYmpbdmFsdWVdID0gdHJ1ZTtcbiAgICB9KTtcbiAgfVxuXG4gIGlzQXJyYXkoYXJyYXlPclN0cmluZykgPyBkZWZpbmUoYXJyYXlPclN0cmluZykgOiBkZWZpbmUoU3RyaW5nKGFycmF5T3JTdHJpbmcpLnNwbGl0KGRlbGltaXRlcikpO1xuXG4gIHJldHVybiBvYmo7XG59XG5cbmNvbnN0IG5vb3AgPSAoKSA9PiB7fVxuXG5jb25zdCB0b0Zpbml0ZU51bWJlciA9ICh2YWx1ZSwgZGVmYXVsdFZhbHVlKSA9PiB7XG4gIHZhbHVlID0gK3ZhbHVlO1xuICByZXR1cm4gTnVtYmVyLmlzRmluaXRlKHZhbHVlKSA/IHZhbHVlIDogZGVmYXVsdFZhbHVlO1xufVxuXG5jb25zdCBBTFBIQSA9ICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eidcblxuY29uc3QgRElHSVQgPSAnMDEyMzQ1Njc4OSc7XG5cbmNvbnN0IEFMUEhBQkVUID0ge1xuICBESUdJVCxcbiAgQUxQSEEsXG4gIEFMUEhBX0RJR0lUOiBBTFBIQSArIEFMUEhBLnRvVXBwZXJDYXNlKCkgKyBESUdJVFxufVxuXG5jb25zdCBnZW5lcmF0ZVN0cmluZyA9IChzaXplID0gMTYsIGFscGhhYmV0ID0gQUxQSEFCRVQuQUxQSEFfRElHSVQpID0+IHtcbiAgbGV0IHN0ciA9ICcnO1xuICBjb25zdCB7bGVuZ3RofSA9IGFscGhhYmV0O1xuICB3aGlsZSAoc2l6ZS0tKSB7XG4gICAgc3RyICs9IGFscGhhYmV0W01hdGgucmFuZG9tKCkgKiBsZW5ndGh8MF1cbiAgfVxuXG4gIHJldHVybiBzdHI7XG59XG5cbi8qKlxuICogSWYgdGhlIHRoaW5nIGlzIGEgRm9ybURhdGEgb2JqZWN0LCByZXR1cm4gdHJ1ZSwgb3RoZXJ3aXNlIHJldHVybiBmYWxzZS5cbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IHRoaW5nIC0gVGhlIHRoaW5nIHRvIGNoZWNrLlxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBpc1NwZWNDb21wbGlhbnRGb3JtKHRoaW5nKSB7XG4gIHJldHVybiAhISh0aGluZyAmJiBpc0Z1bmN0aW9uKHRoaW5nLmFwcGVuZCkgJiYgdGhpbmdbU3ltYm9sLnRvU3RyaW5nVGFnXSA9PT0gJ0Zvcm1EYXRhJyAmJiB0aGluZ1tTeW1ib2wuaXRlcmF0b3JdKTtcbn1cblxuY29uc3QgdG9KU09OT2JqZWN0ID0gKG9iaikgPT4ge1xuICBjb25zdCBzdGFjayA9IG5ldyBBcnJheSgxMCk7XG5cbiAgY29uc3QgdmlzaXQgPSAoc291cmNlLCBpKSA9PiB7XG5cbiAgICBpZiAoaXNPYmplY3Qoc291cmNlKSkge1xuICAgICAgaWYgKHN0YWNrLmluZGV4T2Yoc291cmNlKSA+PSAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYoISgndG9KU09OJyBpbiBzb3VyY2UpKSB7XG4gICAgICAgIHN0YWNrW2ldID0gc291cmNlO1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBpc0FycmF5KHNvdXJjZSkgPyBbXSA6IHt9O1xuXG4gICAgICAgIGZvckVhY2goc291cmNlLCAodmFsdWUsIGtleSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHJlZHVjZWRWYWx1ZSA9IHZpc2l0KHZhbHVlLCBpICsgMSk7XG4gICAgICAgICAgIWlzVW5kZWZpbmVkKHJlZHVjZWRWYWx1ZSkgJiYgKHRhcmdldFtrZXldID0gcmVkdWNlZFZhbHVlKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgc3RhY2tbaV0gPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc291cmNlO1xuICB9XG5cbiAgcmV0dXJuIHZpc2l0KG9iaiwgMCk7XG59XG5cbmNvbnN0IGlzQXN5bmNGbiA9IGtpbmRPZlRlc3QoJ0FzeW5jRnVuY3Rpb24nKTtcblxuY29uc3QgaXNUaGVuYWJsZSA9ICh0aGluZykgPT5cbiAgdGhpbmcgJiYgKGlzT2JqZWN0KHRoaW5nKSB8fCBpc0Z1bmN0aW9uKHRoaW5nKSkgJiYgaXNGdW5jdGlvbih0aGluZy50aGVuKSAmJiBpc0Z1bmN0aW9uKHRoaW5nLmNhdGNoKTtcblxuZXhwb3J0IGRlZmF1bHQge1xuICBpc0FycmF5LFxuICBpc0FycmF5QnVmZmVyLFxuICBpc0J1ZmZlcixcbiAgaXNGb3JtRGF0YSxcbiAgaXNBcnJheUJ1ZmZlclZpZXcsXG4gIGlzU3RyaW5nLFxuICBpc051bWJlcixcbiAgaXNCb29sZWFuLFxuICBpc09iamVjdCxcbiAgaXNQbGFpbk9iamVjdCxcbiAgaXNVbmRlZmluZWQsXG4gIGlzRGF0ZSxcbiAgaXNGaWxlLFxuICBpc0Jsb2IsXG4gIGlzUmVnRXhwLFxuICBpc0Z1bmN0aW9uLFxuICBpc1N0cmVhbSxcbiAgaXNVUkxTZWFyY2hQYXJhbXMsXG4gIGlzVHlwZWRBcnJheSxcbiAgaXNGaWxlTGlzdCxcbiAgZm9yRWFjaCxcbiAgbWVyZ2UsXG4gIGV4dGVuZCxcbiAgdHJpbSxcbiAgc3RyaXBCT00sXG4gIGluaGVyaXRzLFxuICB0b0ZsYXRPYmplY3QsXG4gIGtpbmRPZixcbiAga2luZE9mVGVzdCxcbiAgZW5kc1dpdGgsXG4gIHRvQXJyYXksXG4gIGZvckVhY2hFbnRyeSxcbiAgbWF0Y2hBbGwsXG4gIGlzSFRNTEZvcm0sXG4gIGhhc093blByb3BlcnR5LFxuICBoYXNPd25Qcm9wOiBoYXNPd25Qcm9wZXJ0eSwgLy8gYW4gYWxpYXMgdG8gYXZvaWQgRVNMaW50IG5vLXByb3RvdHlwZS1idWlsdGlucyBkZXRlY3Rpb25cbiAgcmVkdWNlRGVzY3JpcHRvcnMsXG4gIGZyZWV6ZU1ldGhvZHMsXG4gIHRvT2JqZWN0U2V0LFxuICB0b0NhbWVsQ2FzZSxcbiAgbm9vcCxcbiAgdG9GaW5pdGVOdW1iZXIsXG4gIGZpbmRLZXksXG4gIGdsb2JhbDogX2dsb2JhbCxcbiAgaXNDb250ZXh0RGVmaW5lZCxcbiAgQUxQSEFCRVQsXG4gIGdlbmVyYXRlU3RyaW5nLFxuICBpc1NwZWNDb21wbGlhbnRGb3JtLFxuICB0b0pTT05PYmplY3QsXG4gIGlzQXN5bmNGbixcbiAgaXNUaGVuYWJsZVxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IHV0aWxzIGZyb20gJy4uL3V0aWxzLmpzJztcblxuLyoqXG4gKiBDcmVhdGUgYW4gRXJyb3Igd2l0aCB0aGUgc3BlY2lmaWVkIG1lc3NhZ2UsIGNvbmZpZywgZXJyb3IgY29kZSwgcmVxdWVzdCBhbmQgcmVzcG9uc2UuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgVGhlIGVycm9yIG1lc3NhZ2UuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2NvZGVdIFRoZSBlcnJvciBjb2RlIChmb3IgZXhhbXBsZSwgJ0VDT05OQUJPUlRFRCcpLlxuICogQHBhcmFtIHtPYmplY3R9IFtjb25maWddIFRoZSBjb25maWcuXG4gKiBAcGFyYW0ge09iamVjdH0gW3JlcXVlc3RdIFRoZSByZXF1ZXN0LlxuICogQHBhcmFtIHtPYmplY3R9IFtyZXNwb25zZV0gVGhlIHJlc3BvbnNlLlxuICpcbiAqIEByZXR1cm5zIHtFcnJvcn0gVGhlIGNyZWF0ZWQgZXJyb3IuXG4gKi9cbmZ1bmN0aW9uIEF4aW9zRXJyb3IobWVzc2FnZSwgY29kZSwgY29uZmlnLCByZXF1ZXN0LCByZXNwb25zZSkge1xuICBFcnJvci5jYWxsKHRoaXMpO1xuXG4gIGlmIChFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSkge1xuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIHRoaXMuY29uc3RydWN0b3IpO1xuICB9IGVsc2Uge1xuICAgIHRoaXMuc3RhY2sgPSAobmV3IEVycm9yKCkpLnN0YWNrO1xuICB9XG5cbiAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTtcbiAgdGhpcy5uYW1lID0gJ0F4aW9zRXJyb3InO1xuICBjb2RlICYmICh0aGlzLmNvZGUgPSBjb2RlKTtcbiAgY29uZmlnICYmICh0aGlzLmNvbmZpZyA9IGNvbmZpZyk7XG4gIHJlcXVlc3QgJiYgKHRoaXMucmVxdWVzdCA9IHJlcXVlc3QpO1xuICByZXNwb25zZSAmJiAodGhpcy5yZXNwb25zZSA9IHJlc3BvbnNlKTtcbn1cblxudXRpbHMuaW5oZXJpdHMoQXhpb3NFcnJvciwgRXJyb3IsIHtcbiAgdG9KU09OOiBmdW5jdGlvbiB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC8vIFN0YW5kYXJkXG4gICAgICBtZXNzYWdlOiB0aGlzLm1lc3NhZ2UsXG4gICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICAvLyBNaWNyb3NvZnRcbiAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLmRlc2NyaXB0aW9uLFxuICAgICAgbnVtYmVyOiB0aGlzLm51bWJlcixcbiAgICAgIC8vIE1vemlsbGFcbiAgICAgIGZpbGVOYW1lOiB0aGlzLmZpbGVOYW1lLFxuICAgICAgbGluZU51bWJlcjogdGhpcy5saW5lTnVtYmVyLFxuICAgICAgY29sdW1uTnVtYmVyOiB0aGlzLmNvbHVtbk51bWJlcixcbiAgICAgIHN0YWNrOiB0aGlzLnN0YWNrLFxuICAgICAgLy8gQXhpb3NcbiAgICAgIGNvbmZpZzogdXRpbHMudG9KU09OT2JqZWN0KHRoaXMuY29uZmlnKSxcbiAgICAgIGNvZGU6IHRoaXMuY29kZSxcbiAgICAgIHN0YXR1czogdGhpcy5yZXNwb25zZSAmJiB0aGlzLnJlc3BvbnNlLnN0YXR1cyA/IHRoaXMucmVzcG9uc2Uuc3RhdHVzIDogbnVsbFxuICAgIH07XG4gIH1cbn0pO1xuXG5jb25zdCBwcm90b3R5cGUgPSBBeGlvc0Vycm9yLnByb3RvdHlwZTtcbmNvbnN0IGRlc2NyaXB0b3JzID0ge307XG5cbltcbiAgJ0VSUl9CQURfT1BUSU9OX1ZBTFVFJyxcbiAgJ0VSUl9CQURfT1BUSU9OJyxcbiAgJ0VDT05OQUJPUlRFRCcsXG4gICdFVElNRURPVVQnLFxuICAnRVJSX05FVFdPUksnLFxuICAnRVJSX0ZSX1RPT19NQU5ZX1JFRElSRUNUUycsXG4gICdFUlJfREVQUkVDQVRFRCcsXG4gICdFUlJfQkFEX1JFU1BPTlNFJyxcbiAgJ0VSUl9CQURfUkVRVUVTVCcsXG4gICdFUlJfQ0FOQ0VMRUQnLFxuICAnRVJSX05PVF9TVVBQT1JUJyxcbiAgJ0VSUl9JTlZBTElEX1VSTCdcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBmdW5jLW5hbWVzXG5dLmZvckVhY2goY29kZSA9PiB7XG4gIGRlc2NyaXB0b3JzW2NvZGVdID0ge3ZhbHVlOiBjb2RlfTtcbn0pO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhBeGlvc0Vycm9yLCBkZXNjcmlwdG9ycyk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkocHJvdG90eXBlLCAnaXNBeGlvc0Vycm9yJywge3ZhbHVlOiB0cnVlfSk7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBmdW5jLW5hbWVzXG5BeGlvc0Vycm9yLmZyb20gPSAoZXJyb3IsIGNvZGUsIGNvbmZpZywgcmVxdWVzdCwgcmVzcG9uc2UsIGN1c3RvbVByb3BzKSA9PiB7XG4gIGNvbnN0IGF4aW9zRXJyb3IgPSBPYmplY3QuY3JlYXRlKHByb3RvdHlwZSk7XG5cbiAgdXRpbHMudG9GbGF0T2JqZWN0KGVycm9yLCBheGlvc0Vycm9yLCBmdW5jdGlvbiBmaWx0ZXIob2JqKSB7XG4gICAgcmV0dXJuIG9iaiAhPT0gRXJyb3IucHJvdG90eXBlO1xuICB9LCBwcm9wID0+IHtcbiAgICByZXR1cm4gcHJvcCAhPT0gJ2lzQXhpb3NFcnJvcic7XG4gIH0pO1xuXG4gIEF4aW9zRXJyb3IuY2FsbChheGlvc0Vycm9yLCBlcnJvci5tZXNzYWdlLCBjb2RlLCBjb25maWcsIHJlcXVlc3QsIHJlc3BvbnNlKTtcblxuICBheGlvc0Vycm9yLmNhdXNlID0gZXJyb3I7XG5cbiAgYXhpb3NFcnJvci5uYW1lID0gZXJyb3IubmFtZTtcblxuICBjdXN0b21Qcm9wcyAmJiBPYmplY3QuYXNzaWduKGF4aW9zRXJyb3IsIGN1c3RvbVByb3BzKTtcblxuICByZXR1cm4gYXhpb3NFcnJvcjtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEF4aW9zRXJyb3I7XG4iLCIvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgc3RyaWN0XG5leHBvcnQgZGVmYXVsdCBudWxsO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgdXRpbHMgZnJvbSAnLi4vdXRpbHMuanMnO1xuaW1wb3J0IEF4aW9zRXJyb3IgZnJvbSAnLi4vY29yZS9BeGlvc0Vycm9yLmpzJztcbi8vIHRlbXBvcmFyeSBob3RmaXggdG8gYXZvaWQgY2lyY3VsYXIgcmVmZXJlbmNlcyB1bnRpbCBBeGlvc1VSTFNlYXJjaFBhcmFtcyBpcyByZWZhY3RvcmVkXG5pbXBvcnQgUGxhdGZvcm1Gb3JtRGF0YSBmcm9tICcuLi9wbGF0Zm9ybS9ub2RlL2NsYXNzZXMvRm9ybURhdGEuanMnO1xuXG4vKipcbiAqIERldGVybWluZXMgaWYgdGhlIGdpdmVuIHRoaW5nIGlzIGEgYXJyYXkgb3IganMgb2JqZWN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0aGluZyAtIFRoZSBvYmplY3Qgb3IgYXJyYXkgdG8gYmUgdmlzaXRlZC5cbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNWaXNpdGFibGUodGhpbmcpIHtcbiAgcmV0dXJuIHV0aWxzLmlzUGxhaW5PYmplY3QodGhpbmcpIHx8IHV0aWxzLmlzQXJyYXkodGhpbmcpO1xufVxuXG4vKipcbiAqIEl0IHJlbW92ZXMgdGhlIGJyYWNrZXRzIGZyb20gdGhlIGVuZCBvZiBhIHN0cmluZ1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUga2V5IG9mIHRoZSBwYXJhbWV0ZXIuXG4gKlxuICogQHJldHVybnMge3N0cmluZ30gdGhlIGtleSB3aXRob3V0IHRoZSBicmFja2V0cy5cbiAqL1xuZnVuY3Rpb24gcmVtb3ZlQnJhY2tldHMoa2V5KSB7XG4gIHJldHVybiB1dGlscy5lbmRzV2l0aChrZXksICdbXScpID8ga2V5LnNsaWNlKDAsIC0yKSA6IGtleTtcbn1cblxuLyoqXG4gKiBJdCB0YWtlcyBhIHBhdGgsIGEga2V5LCBhbmQgYSBib29sZWFuLCBhbmQgcmV0dXJucyBhIHN0cmluZ1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIC0gVGhlIHBhdGggdG8gdGhlIGN1cnJlbnQga2V5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBrZXkgb2YgdGhlIGN1cnJlbnQgb2JqZWN0IGJlaW5nIGl0ZXJhdGVkIG92ZXIuXG4gKiBAcGFyYW0ge3N0cmluZ30gZG90cyAtIElmIHRydWUsIHRoZSBrZXkgd2lsbCBiZSByZW5kZXJlZCB3aXRoIGRvdHMgaW5zdGVhZCBvZiBicmFja2V0cy5cbiAqXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgcGF0aCB0byB0aGUgY3VycmVudCBrZXkuXG4gKi9cbmZ1bmN0aW9uIHJlbmRlcktleShwYXRoLCBrZXksIGRvdHMpIHtcbiAgaWYgKCFwYXRoKSByZXR1cm4ga2V5O1xuICByZXR1cm4gcGF0aC5jb25jYXQoa2V5KS5tYXAoZnVuY3Rpb24gZWFjaCh0b2tlbiwgaSkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgIHRva2VuID0gcmVtb3ZlQnJhY2tldHModG9rZW4pO1xuICAgIHJldHVybiAhZG90cyAmJiBpID8gJ1snICsgdG9rZW4gKyAnXScgOiB0b2tlbjtcbiAgfSkuam9pbihkb3RzID8gJy4nIDogJycpO1xufVxuXG4vKipcbiAqIElmIHRoZSBhcnJheSBpcyBhbiBhcnJheSBhbmQgbm9uZSBvZiBpdHMgZWxlbWVudHMgYXJlIHZpc2l0YWJsZSwgdGhlbiBpdCdzIGEgZmxhdCBhcnJheS5cbiAqXG4gKiBAcGFyYW0ge0FycmF5PGFueT59IGFyciAtIFRoZSBhcnJheSB0byBjaGVja1xuICpcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBpc0ZsYXRBcnJheShhcnIpIHtcbiAgcmV0dXJuIHV0aWxzLmlzQXJyYXkoYXJyKSAmJiAhYXJyLnNvbWUoaXNWaXNpdGFibGUpO1xufVxuXG5jb25zdCBwcmVkaWNhdGVzID0gdXRpbHMudG9GbGF0T2JqZWN0KHV0aWxzLCB7fSwgbnVsbCwgZnVuY3Rpb24gZmlsdGVyKHByb3ApIHtcbiAgcmV0dXJuIC9eaXNbQS1aXS8udGVzdChwcm9wKTtcbn0pO1xuXG4vKipcbiAqIENvbnZlcnQgYSBkYXRhIG9iamVjdCB0byBGb3JtRGF0YVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmpcbiAqIEBwYXJhbSB7P09iamVjdH0gW2Zvcm1EYXRhXVxuICogQHBhcmFtIHs/T2JqZWN0fSBbb3B0aW9uc11cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25zLnZpc2l0b3JdXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLm1ldGFUb2tlbnMgPSB0cnVlXVxuICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5kb3RzID0gZmFsc2VdXG4gKiBAcGFyYW0gez9Cb29sZWFufSBbb3B0aW9ucy5pbmRleGVzID0gZmFsc2VdXG4gKlxuICogQHJldHVybnMge09iamVjdH1cbiAqKi9cblxuLyoqXG4gKiBJdCBjb252ZXJ0cyBhbiBvYmplY3QgaW50byBhIEZvcm1EYXRhIG9iamVjdFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0PGFueSwgYW55Pn0gb2JqIC0gVGhlIG9iamVjdCB0byBjb252ZXJ0IHRvIGZvcm0gZGF0YS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBmb3JtRGF0YSAtIFRoZSBGb3JtRGF0YSBvYmplY3QgdG8gYXBwZW5kIHRvLlxuICogQHBhcmFtIHtPYmplY3Q8c3RyaW5nLCBhbnk+fSBvcHRpb25zXG4gKlxuICogQHJldHVybnNcbiAqL1xuZnVuY3Rpb24gdG9Gb3JtRGF0YShvYmosIGZvcm1EYXRhLCBvcHRpb25zKSB7XG4gIGlmICghdXRpbHMuaXNPYmplY3Qob2JqKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3RhcmdldCBtdXN0IGJlIGFuIG9iamVjdCcpO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gIGZvcm1EYXRhID0gZm9ybURhdGEgfHwgbmV3IChQbGF0Zm9ybUZvcm1EYXRhIHx8IEZvcm1EYXRhKSgpO1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICBvcHRpb25zID0gdXRpbHMudG9GbGF0T2JqZWN0KG9wdGlvbnMsIHtcbiAgICBtZXRhVG9rZW5zOiB0cnVlLFxuICAgIGRvdHM6IGZhbHNlLFxuICAgIGluZGV4ZXM6IGZhbHNlXG4gIH0sIGZhbHNlLCBmdW5jdGlvbiBkZWZpbmVkKG9wdGlvbiwgc291cmNlKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWVxLW51bGwsZXFlcWVxXG4gICAgcmV0dXJuICF1dGlscy5pc1VuZGVmaW5lZChzb3VyY2Vbb3B0aW9uXSk7XG4gIH0pO1xuXG4gIGNvbnN0IG1ldGFUb2tlbnMgPSBvcHRpb25zLm1ldGFUb2tlbnM7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZVxuICBjb25zdCB2aXNpdG9yID0gb3B0aW9ucy52aXNpdG9yIHx8IGRlZmF1bHRWaXNpdG9yO1xuICBjb25zdCBkb3RzID0gb3B0aW9ucy5kb3RzO1xuICBjb25zdCBpbmRleGVzID0gb3B0aW9ucy5pbmRleGVzO1xuICBjb25zdCBfQmxvYiA9IG9wdGlvbnMuQmxvYiB8fCB0eXBlb2YgQmxvYiAhPT0gJ3VuZGVmaW5lZCcgJiYgQmxvYjtcbiAgY29uc3QgdXNlQmxvYiA9IF9CbG9iICYmIHV0aWxzLmlzU3BlY0NvbXBsaWFudEZvcm0oZm9ybURhdGEpO1xuXG4gIGlmICghdXRpbHMuaXNGdW5jdGlvbih2aXNpdG9yKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3Zpc2l0b3IgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG4gIH1cblxuICBmdW5jdGlvbiBjb252ZXJ0VmFsdWUodmFsdWUpIHtcbiAgICBpZiAodmFsdWUgPT09IG51bGwpIHJldHVybiAnJztcblxuICAgIGlmICh1dGlscy5pc0RhdGUodmFsdWUpKSB7XG4gICAgICByZXR1cm4gdmFsdWUudG9JU09TdHJpbmcoKTtcbiAgICB9XG5cbiAgICBpZiAoIXVzZUJsb2IgJiYgdXRpbHMuaXNCbG9iKHZhbHVlKSkge1xuICAgICAgdGhyb3cgbmV3IEF4aW9zRXJyb3IoJ0Jsb2IgaXMgbm90IHN1cHBvcnRlZC4gVXNlIGEgQnVmZmVyIGluc3RlYWQuJyk7XG4gICAgfVxuXG4gICAgaWYgKHV0aWxzLmlzQXJyYXlCdWZmZXIodmFsdWUpIHx8IHV0aWxzLmlzVHlwZWRBcnJheSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB1c2VCbG9iICYmIHR5cGVvZiBCbG9iID09PSAnZnVuY3Rpb24nID8gbmV3IEJsb2IoW3ZhbHVlXSkgOiBCdWZmZXIuZnJvbSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIERlZmF1bHQgdmlzaXRvci5cbiAgICpcbiAgICogQHBhcmFtIHsqfSB2YWx1ZVxuICAgKiBAcGFyYW0ge1N0cmluZ3xOdW1iZXJ9IGtleVxuICAgKiBAcGFyYW0ge0FycmF5PFN0cmluZ3xOdW1iZXI+fSBwYXRoXG4gICAqIEB0aGlzIHtGb3JtRGF0YX1cbiAgICpcbiAgICogQHJldHVybnMge2Jvb2xlYW59IHJldHVybiB0cnVlIHRvIHZpc2l0IHRoZSBlYWNoIHByb3Agb2YgdGhlIHZhbHVlIHJlY3Vyc2l2ZWx5XG4gICAqL1xuICBmdW5jdGlvbiBkZWZhdWx0VmlzaXRvcih2YWx1ZSwga2V5LCBwYXRoKSB7XG4gICAgbGV0IGFyciA9IHZhbHVlO1xuXG4gICAgaWYgKHZhbHVlICYmICFwYXRoICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGlmICh1dGlscy5lbmRzV2l0aChrZXksICd7fScpKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICBrZXkgPSBtZXRhVG9rZW5zID8ga2V5IDoga2V5LnNsaWNlKDAsIC0yKTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgIHZhbHVlID0gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgKHV0aWxzLmlzQXJyYXkodmFsdWUpICYmIGlzRmxhdEFycmF5KHZhbHVlKSkgfHxcbiAgICAgICAgKCh1dGlscy5pc0ZpbGVMaXN0KHZhbHVlKSB8fCB1dGlscy5lbmRzV2l0aChrZXksICdbXScpKSAmJiAoYXJyID0gdXRpbHMudG9BcnJheSh2YWx1ZSkpXG4gICAgICAgICkpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgIGtleSA9IHJlbW92ZUJyYWNrZXRzKGtleSk7XG5cbiAgICAgICAgYXJyLmZvckVhY2goZnVuY3Rpb24gZWFjaChlbCwgaW5kZXgpIHtcbiAgICAgICAgICAhKHV0aWxzLmlzVW5kZWZpbmVkKGVsKSB8fCBlbCA9PT0gbnVsbCkgJiYgZm9ybURhdGEuYXBwZW5kKFxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5lc3RlZC10ZXJuYXJ5XG4gICAgICAgICAgICBpbmRleGVzID09PSB0cnVlID8gcmVuZGVyS2V5KFtrZXldLCBpbmRleCwgZG90cykgOiAoaW5kZXhlcyA9PT0gbnVsbCA/IGtleSA6IGtleSArICdbXScpLFxuICAgICAgICAgICAgY29udmVydFZhbHVlKGVsKVxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGlzVmlzaXRhYmxlKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgZm9ybURhdGEuYXBwZW5kKHJlbmRlcktleShwYXRoLCBrZXksIGRvdHMpLCBjb252ZXJ0VmFsdWUodmFsdWUpKTtcblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IHN0YWNrID0gW107XG5cbiAgY29uc3QgZXhwb3NlZEhlbHBlcnMgPSBPYmplY3QuYXNzaWduKHByZWRpY2F0ZXMsIHtcbiAgICBkZWZhdWx0VmlzaXRvcixcbiAgICBjb252ZXJ0VmFsdWUsXG4gICAgaXNWaXNpdGFibGVcbiAgfSk7XG5cbiAgZnVuY3Rpb24gYnVpbGQodmFsdWUsIHBhdGgpIHtcbiAgICBpZiAodXRpbHMuaXNVbmRlZmluZWQodmFsdWUpKSByZXR1cm47XG5cbiAgICBpZiAoc3RhY2suaW5kZXhPZih2YWx1ZSkgIT09IC0xKSB7XG4gICAgICB0aHJvdyBFcnJvcignQ2lyY3VsYXIgcmVmZXJlbmNlIGRldGVjdGVkIGluICcgKyBwYXRoLmpvaW4oJy4nKSk7XG4gICAgfVxuXG4gICAgc3RhY2sucHVzaCh2YWx1ZSk7XG5cbiAgICB1dGlscy5mb3JFYWNoKHZhbHVlLCBmdW5jdGlvbiBlYWNoKGVsLCBrZXkpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9ICEodXRpbHMuaXNVbmRlZmluZWQoZWwpIHx8IGVsID09PSBudWxsKSAmJiB2aXNpdG9yLmNhbGwoXG4gICAgICAgIGZvcm1EYXRhLCBlbCwgdXRpbHMuaXNTdHJpbmcoa2V5KSA/IGtleS50cmltKCkgOiBrZXksIHBhdGgsIGV4cG9zZWRIZWxwZXJzXG4gICAgICApO1xuXG4gICAgICBpZiAocmVzdWx0ID09PSB0cnVlKSB7XG4gICAgICAgIGJ1aWxkKGVsLCBwYXRoID8gcGF0aC5jb25jYXQoa2V5KSA6IFtrZXldKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHN0YWNrLnBvcCgpO1xuICB9XG5cbiAgaWYgKCF1dGlscy5pc09iamVjdChvYmopKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZGF0YSBtdXN0IGJlIGFuIG9iamVjdCcpO1xuICB9XG5cbiAgYnVpbGQob2JqKTtcblxuICByZXR1cm4gZm9ybURhdGE7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHRvRm9ybURhdGE7XG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCB0b0Zvcm1EYXRhIGZyb20gJy4vdG9Gb3JtRGF0YS5qcyc7XG5cbi8qKlxuICogSXQgZW5jb2RlcyBhIHN0cmluZyBieSByZXBsYWNpbmcgYWxsIGNoYXJhY3RlcnMgdGhhdCBhcmUgbm90IGluIHRoZSB1bnJlc2VydmVkIHNldCB3aXRoXG4gKiB0aGVpciBwZXJjZW50LWVuY29kZWQgZXF1aXZhbGVudHNcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyIC0gVGhlIHN0cmluZyB0byBlbmNvZGUuXG4gKlxuICogQHJldHVybnMge3N0cmluZ30gVGhlIGVuY29kZWQgc3RyaW5nLlxuICovXG5mdW5jdGlvbiBlbmNvZGUoc3RyKSB7XG4gIGNvbnN0IGNoYXJNYXAgPSB7XG4gICAgJyEnOiAnJTIxJyxcbiAgICBcIidcIjogJyUyNycsXG4gICAgJygnOiAnJTI4JyxcbiAgICAnKSc6ICclMjknLFxuICAgICd+JzogJyU3RScsXG4gICAgJyUyMCc6ICcrJyxcbiAgICAnJTAwJzogJ1xceDAwJ1xuICB9O1xuICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KHN0cikucmVwbGFjZSgvWyEnKCl+XXwlMjB8JTAwL2csIGZ1bmN0aW9uIHJlcGxhY2VyKG1hdGNoKSB7XG4gICAgcmV0dXJuIGNoYXJNYXBbbWF0Y2hdO1xuICB9KTtcbn1cblxuLyoqXG4gKiBJdCB0YWtlcyBhIHBhcmFtcyBvYmplY3QgYW5kIGNvbnZlcnRzIGl0IHRvIGEgRm9ybURhdGEgb2JqZWN0XG4gKlxuICogQHBhcmFtIHtPYmplY3Q8c3RyaW5nLCBhbnk+fSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyB0byBiZSBjb252ZXJ0ZWQgdG8gYSBGb3JtRGF0YSBvYmplY3QuXG4gKiBAcGFyYW0ge09iamVjdDxzdHJpbmcsIGFueT59IG9wdGlvbnMgLSBUaGUgb3B0aW9ucyBvYmplY3QgcGFzc2VkIHRvIHRoZSBBeGlvcyBjb25zdHJ1Y3Rvci5cbiAqXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gQXhpb3NVUkxTZWFyY2hQYXJhbXMocGFyYW1zLCBvcHRpb25zKSB7XG4gIHRoaXMuX3BhaXJzID0gW107XG5cbiAgcGFyYW1zICYmIHRvRm9ybURhdGEocGFyYW1zLCB0aGlzLCBvcHRpb25zKTtcbn1cblxuY29uc3QgcHJvdG90eXBlID0gQXhpb3NVUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlO1xuXG5wcm90b3R5cGUuYXBwZW5kID0gZnVuY3Rpb24gYXBwZW5kKG5hbWUsIHZhbHVlKSB7XG4gIHRoaXMuX3BhaXJzLnB1c2goW25hbWUsIHZhbHVlXSk7XG59O1xuXG5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZyhlbmNvZGVyKSB7XG4gIGNvbnN0IF9lbmNvZGUgPSBlbmNvZGVyID8gZnVuY3Rpb24odmFsdWUpIHtcbiAgICByZXR1cm4gZW5jb2Rlci5jYWxsKHRoaXMsIHZhbHVlLCBlbmNvZGUpO1xuICB9IDogZW5jb2RlO1xuXG4gIHJldHVybiB0aGlzLl9wYWlycy5tYXAoZnVuY3Rpb24gZWFjaChwYWlyKSB7XG4gICAgcmV0dXJuIF9lbmNvZGUocGFpclswXSkgKyAnPScgKyBfZW5jb2RlKHBhaXJbMV0pO1xuICB9LCAnJykuam9pbignJicpO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgQXhpb3NVUkxTZWFyY2hQYXJhbXM7XG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCB1dGlscyBmcm9tICcuLi91dGlscy5qcyc7XG5pbXBvcnQgQXhpb3NVUkxTZWFyY2hQYXJhbXMgZnJvbSAnLi4vaGVscGVycy9BeGlvc1VSTFNlYXJjaFBhcmFtcy5qcyc7XG5cbi8qKlxuICogSXQgcmVwbGFjZXMgYWxsIGluc3RhbmNlcyBvZiB0aGUgY2hhcmFjdGVycyBgOmAsIGAkYCwgYCxgLCBgK2AsIGBbYCwgYW5kIGBdYCB3aXRoIHRoZWlyXG4gKiBVUkkgZW5jb2RlZCBjb3VudGVycGFydHNcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsIFRoZSB2YWx1ZSB0byBiZSBlbmNvZGVkLlxuICpcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBlbmNvZGVkIHZhbHVlLlxuICovXG5mdW5jdGlvbiBlbmNvZGUodmFsKSB7XG4gIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQodmFsKS5cbiAgICByZXBsYWNlKC8lM0EvZ2ksICc6JykuXG4gICAgcmVwbGFjZSgvJTI0L2csICckJykuXG4gICAgcmVwbGFjZSgvJTJDL2dpLCAnLCcpLlxuICAgIHJlcGxhY2UoLyUyMC9nLCAnKycpLlxuICAgIHJlcGxhY2UoLyU1Qi9naSwgJ1snKS5cbiAgICByZXBsYWNlKC8lNUQvZ2ksICddJyk7XG59XG5cbi8qKlxuICogQnVpbGQgYSBVUkwgYnkgYXBwZW5kaW5nIHBhcmFtcyB0byB0aGUgZW5kXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHVybCBUaGUgYmFzZSBvZiB0aGUgdXJsIChlLmcuLCBodHRwOi8vd3d3Lmdvb2dsZS5jb20pXG4gKiBAcGFyYW0ge29iamVjdH0gW3BhcmFtc10gVGhlIHBhcmFtcyB0byBiZSBhcHBlbmRlZFxuICogQHBhcmFtIHs/b2JqZWN0fSBvcHRpb25zXG4gKlxuICogQHJldHVybnMge3N0cmluZ30gVGhlIGZvcm1hdHRlZCB1cmxcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYnVpbGRVUkwodXJsLCBwYXJhbXMsIG9wdGlvbnMpIHtcbiAgLyplc2xpbnQgbm8tcGFyYW0tcmVhc3NpZ246MCovXG4gIGlmICghcGFyYW1zKSB7XG4gICAgcmV0dXJuIHVybDtcbiAgfVxuICBcbiAgY29uc3QgX2VuY29kZSA9IG9wdGlvbnMgJiYgb3B0aW9ucy5lbmNvZGUgfHwgZW5jb2RlO1xuXG4gIGNvbnN0IHNlcmlhbGl6ZUZuID0gb3B0aW9ucyAmJiBvcHRpb25zLnNlcmlhbGl6ZTtcblxuICBsZXQgc2VyaWFsaXplZFBhcmFtcztcblxuICBpZiAoc2VyaWFsaXplRm4pIHtcbiAgICBzZXJpYWxpemVkUGFyYW1zID0gc2VyaWFsaXplRm4ocGFyYW1zLCBvcHRpb25zKTtcbiAgfSBlbHNlIHtcbiAgICBzZXJpYWxpemVkUGFyYW1zID0gdXRpbHMuaXNVUkxTZWFyY2hQYXJhbXMocGFyYW1zKSA/XG4gICAgICBwYXJhbXMudG9TdHJpbmcoKSA6XG4gICAgICBuZXcgQXhpb3NVUkxTZWFyY2hQYXJhbXMocGFyYW1zLCBvcHRpb25zKS50b1N0cmluZyhfZW5jb2RlKTtcbiAgfVxuXG4gIGlmIChzZXJpYWxpemVkUGFyYW1zKSB7XG4gICAgY29uc3QgaGFzaG1hcmtJbmRleCA9IHVybC5pbmRleE9mKFwiI1wiKTtcblxuICAgIGlmIChoYXNobWFya0luZGV4ICE9PSAtMSkge1xuICAgICAgdXJsID0gdXJsLnNsaWNlKDAsIGhhc2htYXJrSW5kZXgpO1xuICAgIH1cbiAgICB1cmwgKz0gKHVybC5pbmRleE9mKCc/JykgPT09IC0xID8gJz8nIDogJyYnKSArIHNlcmlhbGl6ZWRQYXJhbXM7XG4gIH1cblxuICByZXR1cm4gdXJsO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgdXRpbHMgZnJvbSAnLi8uLi91dGlscy5qcyc7XG5cbmNsYXNzIEludGVyY2VwdG9yTWFuYWdlciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuaGFuZGxlcnMgPSBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBuZXcgaW50ZXJjZXB0b3IgdG8gdGhlIHN0YWNrXG4gICAqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bGZpbGxlZCBUaGUgZnVuY3Rpb24gdG8gaGFuZGxlIGB0aGVuYCBmb3IgYSBgUHJvbWlzZWBcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gcmVqZWN0ZWQgVGhlIGZ1bmN0aW9uIHRvIGhhbmRsZSBgcmVqZWN0YCBmb3IgYSBgUHJvbWlzZWBcbiAgICpcbiAgICogQHJldHVybiB7TnVtYmVyfSBBbiBJRCB1c2VkIHRvIHJlbW92ZSBpbnRlcmNlcHRvciBsYXRlclxuICAgKi9cbiAgdXNlKGZ1bGZpbGxlZCwgcmVqZWN0ZWQsIG9wdGlvbnMpIHtcbiAgICB0aGlzLmhhbmRsZXJzLnB1c2goe1xuICAgICAgZnVsZmlsbGVkLFxuICAgICAgcmVqZWN0ZWQsXG4gICAgICBzeW5jaHJvbm91czogb3B0aW9ucyA/IG9wdGlvbnMuc3luY2hyb25vdXMgOiBmYWxzZSxcbiAgICAgIHJ1bldoZW46IG9wdGlvbnMgPyBvcHRpb25zLnJ1bldoZW4gOiBudWxsXG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXMuaGFuZGxlcnMubGVuZ3RoIC0gMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgYW4gaW50ZXJjZXB0b3IgZnJvbSB0aGUgc3RhY2tcbiAgICpcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGlkIFRoZSBJRCB0aGF0IHdhcyByZXR1cm5lZCBieSBgdXNlYFxuICAgKlxuICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gYHRydWVgIGlmIHRoZSBpbnRlcmNlcHRvciB3YXMgcmVtb3ZlZCwgYGZhbHNlYCBvdGhlcndpc2VcbiAgICovXG4gIGVqZWN0KGlkKSB7XG4gICAgaWYgKHRoaXMuaGFuZGxlcnNbaWRdKSB7XG4gICAgICB0aGlzLmhhbmRsZXJzW2lkXSA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIGFsbCBpbnRlcmNlcHRvcnMgZnJvbSB0aGUgc3RhY2tcbiAgICpcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBjbGVhcigpIHtcbiAgICBpZiAodGhpcy5oYW5kbGVycykge1xuICAgICAgdGhpcy5oYW5kbGVycyA9IFtdO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJdGVyYXRlIG92ZXIgYWxsIHRoZSByZWdpc3RlcmVkIGludGVyY2VwdG9yc1xuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBpcyBwYXJ0aWN1bGFybHkgdXNlZnVsIGZvciBza2lwcGluZyBvdmVyIGFueVxuICAgKiBpbnRlcmNlcHRvcnMgdGhhdCBtYXkgaGF2ZSBiZWNvbWUgYG51bGxgIGNhbGxpbmcgYGVqZWN0YC5cbiAgICpcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGZ1bmN0aW9uIHRvIGNhbGwgZm9yIGVhY2ggaW50ZXJjZXB0b3JcbiAgICpcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBmb3JFYWNoKGZuKSB7XG4gICAgdXRpbHMuZm9yRWFjaCh0aGlzLmhhbmRsZXJzLCBmdW5jdGlvbiBmb3JFYWNoSGFuZGxlcihoKSB7XG4gICAgICBpZiAoaCAhPT0gbnVsbCkge1xuICAgICAgICBmbihoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBJbnRlcmNlcHRvck1hbmFnZXI7XG4iLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgc2lsZW50SlNPTlBhcnNpbmc6IHRydWUsXG4gIGZvcmNlZEpTT05QYXJzaW5nOiB0cnVlLFxuICBjbGFyaWZ5VGltZW91dEVycm9yOiBmYWxzZVxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IEF4aW9zVVJMU2VhcmNoUGFyYW1zIGZyb20gJy4uLy4uLy4uL2hlbHBlcnMvQXhpb3NVUkxTZWFyY2hQYXJhbXMuanMnO1xuZXhwb3J0IGRlZmF1bHQgdHlwZW9mIFVSTFNlYXJjaFBhcmFtcyAhPT0gJ3VuZGVmaW5lZCcgPyBVUkxTZWFyY2hQYXJhbXMgOiBBeGlvc1VSTFNlYXJjaFBhcmFtcztcbiIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0IGRlZmF1bHQgdHlwZW9mIEZvcm1EYXRhICE9PSAndW5kZWZpbmVkJyA/IEZvcm1EYXRhIDogbnVsbDtcbiIsIid1c2Ugc3RyaWN0J1xuXG5leHBvcnQgZGVmYXVsdCB0eXBlb2YgQmxvYiAhPT0gJ3VuZGVmaW5lZCcgPyBCbG9iIDogbnVsbFxuIiwiaW1wb3J0IFVSTFNlYXJjaFBhcmFtcyBmcm9tICcuL2NsYXNzZXMvVVJMU2VhcmNoUGFyYW1zLmpzJ1xuaW1wb3J0IEZvcm1EYXRhIGZyb20gJy4vY2xhc3Nlcy9Gb3JtRGF0YS5qcydcbmltcG9ydCBCbG9iIGZyb20gJy4vY2xhc3Nlcy9CbG9iLmpzJ1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGlzQnJvd3NlcjogdHJ1ZSxcbiAgY2xhc3Nlczoge1xuICAgIFVSTFNlYXJjaFBhcmFtcyxcbiAgICBGb3JtRGF0YSxcbiAgICBCbG9iXG4gIH0sXG4gIHByb3RvY29sczogWydodHRwJywgJ2h0dHBzJywgJ2ZpbGUnLCAnYmxvYicsICd1cmwnLCAnZGF0YSddXG59O1xuIiwiY29uc3QgaGFzQnJvd3NlckVudiA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCc7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIHdlJ3JlIHJ1bm5pbmcgaW4gYSBzdGFuZGFyZCBicm93c2VyIGVudmlyb25tZW50XG4gKlxuICogVGhpcyBhbGxvd3MgYXhpb3MgdG8gcnVuIGluIGEgd2ViIHdvcmtlciwgYW5kIHJlYWN0LW5hdGl2ZS5cbiAqIEJvdGggZW52aXJvbm1lbnRzIHN1cHBvcnQgWE1MSHR0cFJlcXVlc3QsIGJ1dCBub3QgZnVsbHkgc3RhbmRhcmQgZ2xvYmFscy5cbiAqXG4gKiB3ZWIgd29ya2VyczpcbiAqICB0eXBlb2Ygd2luZG93IC0+IHVuZGVmaW5lZFxuICogIHR5cGVvZiBkb2N1bWVudCAtPiB1bmRlZmluZWRcbiAqXG4gKiByZWFjdC1uYXRpdmU6XG4gKiAgbmF2aWdhdG9yLnByb2R1Y3QgLT4gJ1JlYWN0TmF0aXZlJ1xuICogbmF0aXZlc2NyaXB0XG4gKiAgbmF2aWdhdG9yLnByb2R1Y3QgLT4gJ05hdGl2ZVNjcmlwdCcgb3IgJ05TJ1xuICpcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBoYXNTdGFuZGFyZEJyb3dzZXJFbnYgPSAoXG4gIChwcm9kdWN0KSA9PiB7XG4gICAgcmV0dXJuIGhhc0Jyb3dzZXJFbnYgJiYgWydSZWFjdE5hdGl2ZScsICdOYXRpdmVTY3JpcHQnLCAnTlMnXS5pbmRleE9mKHByb2R1Y3QpIDwgMFxuICB9KSh0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyAmJiBuYXZpZ2F0b3IucHJvZHVjdCk7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIHdlJ3JlIHJ1bm5pbmcgaW4gYSBzdGFuZGFyZCBicm93c2VyIHdlYldvcmtlciBlbnZpcm9ubWVudFxuICpcbiAqIEFsdGhvdWdoIHRoZSBgaXNTdGFuZGFyZEJyb3dzZXJFbnZgIG1ldGhvZCBpbmRpY2F0ZXMgdGhhdFxuICogYGFsbG93cyBheGlvcyB0byBydW4gaW4gYSB3ZWIgd29ya2VyYCwgdGhlIFdlYldvcmtlciB3aWxsIHN0aWxsIGJlXG4gKiBmaWx0ZXJlZCBvdXQgZHVlIHRvIGl0cyBqdWRnbWVudCBzdGFuZGFyZFxuICogYHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCdgLlxuICogVGhpcyBsZWFkcyB0byBhIHByb2JsZW0gd2hlbiBheGlvcyBwb3N0IGBGb3JtRGF0YWAgaW4gd2ViV29ya2VyXG4gKi9cbmNvbnN0IGhhc1N0YW5kYXJkQnJvd3NlcldlYldvcmtlckVudiA9ICgoKSA9PiB7XG4gIHJldHVybiAoXG4gICAgdHlwZW9mIFdvcmtlckdsb2JhbFNjb3BlICE9PSAndW5kZWZpbmVkJyAmJlxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxuICAgIHNlbGYgaW5zdGFuY2VvZiBXb3JrZXJHbG9iYWxTY29wZSAmJlxuICAgIHR5cGVvZiBzZWxmLmltcG9ydFNjcmlwdHMgPT09ICdmdW5jdGlvbidcbiAgKTtcbn0pKCk7XG5cbmV4cG9ydCB7XG4gIGhhc0Jyb3dzZXJFbnYsXG4gIGhhc1N0YW5kYXJkQnJvd3NlcldlYldvcmtlckVudixcbiAgaGFzU3RhbmRhcmRCcm93c2VyRW52XG59XG4iLCJpbXBvcnQgcGxhdGZvcm0gZnJvbSAnLi9ub2RlL2luZGV4LmpzJztcbmltcG9ydCAqIGFzIHV0aWxzIGZyb20gJy4vY29tbW9uL3V0aWxzLmpzJztcblxuZXhwb3J0IGRlZmF1bHQge1xuICAuLi51dGlscyxcbiAgLi4ucGxhdGZvcm1cbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IHV0aWxzIGZyb20gJy4uL3V0aWxzLmpzJztcbmltcG9ydCB0b0Zvcm1EYXRhIGZyb20gJy4vdG9Gb3JtRGF0YS5qcyc7XG5pbXBvcnQgcGxhdGZvcm0gZnJvbSAnLi4vcGxhdGZvcm0vaW5kZXguanMnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB0b1VSTEVuY29kZWRGb3JtKGRhdGEsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIHRvRm9ybURhdGEoZGF0YSwgbmV3IHBsYXRmb3JtLmNsYXNzZXMuVVJMU2VhcmNoUGFyYW1zKCksIE9iamVjdC5hc3NpZ24oe1xuICAgIHZpc2l0b3I6IGZ1bmN0aW9uKHZhbHVlLCBrZXksIHBhdGgsIGhlbHBlcnMpIHtcbiAgICAgIGlmIChwbGF0Zm9ybS5pc05vZGUgJiYgdXRpbHMuaXNCdWZmZXIodmFsdWUpKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kKGtleSwgdmFsdWUudG9TdHJpbmcoJ2Jhc2U2NCcpKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gaGVscGVycy5kZWZhdWx0VmlzaXRvci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH1cbiAgfSwgb3B0aW9ucykpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgdXRpbHMgZnJvbSAnLi4vdXRpbHMuanMnO1xuXG4vKipcbiAqIEl0IHRha2VzIGEgc3RyaW5nIGxpa2UgYGZvb1t4XVt5XVt6XWAgYW5kIHJldHVybnMgYW4gYXJyYXkgbGlrZSBgWydmb28nLCAneCcsICd5JywgJ3onXVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAqXG4gKiBAcmV0dXJucyBBbiBhcnJheSBvZiBzdHJpbmdzLlxuICovXG5mdW5jdGlvbiBwYXJzZVByb3BQYXRoKG5hbWUpIHtcbiAgLy8gZm9vW3hdW3ldW3pdXG4gIC8vIGZvby54LnkuelxuICAvLyBmb28teC15LXpcbiAgLy8gZm9vIHggeSB6XG4gIHJldHVybiB1dGlscy5tYXRjaEFsbCgvXFx3K3xcXFsoXFx3KildL2csIG5hbWUpLm1hcChtYXRjaCA9PiB7XG4gICAgcmV0dXJuIG1hdGNoWzBdID09PSAnW10nID8gJycgOiBtYXRjaFsxXSB8fCBtYXRjaFswXTtcbiAgfSk7XG59XG5cbi8qKlxuICogQ29udmVydCBhbiBhcnJheSB0byBhbiBvYmplY3QuXG4gKlxuICogQHBhcmFtIHtBcnJheTxhbnk+fSBhcnIgLSBUaGUgYXJyYXkgdG8gY29udmVydCB0byBhbiBvYmplY3QuXG4gKlxuICogQHJldHVybnMgQW4gb2JqZWN0IHdpdGggdGhlIHNhbWUga2V5cyBhbmQgdmFsdWVzIGFzIHRoZSBhcnJheS5cbiAqL1xuZnVuY3Rpb24gYXJyYXlUb09iamVjdChhcnIpIHtcbiAgY29uc3Qgb2JqID0ge307XG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhhcnIpO1xuICBsZXQgaTtcbiAgY29uc3QgbGVuID0ga2V5cy5sZW5ndGg7XG4gIGxldCBrZXk7XG4gIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIGtleSA9IGtleXNbaV07XG4gICAgb2JqW2tleV0gPSBhcnJba2V5XTtcbiAgfVxuICByZXR1cm4gb2JqO1xufVxuXG4vKipcbiAqIEl0IHRha2VzIGEgRm9ybURhdGEgb2JqZWN0IGFuZCByZXR1cm5zIGEgSmF2YVNjcmlwdCBvYmplY3RcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZm9ybURhdGEgVGhlIEZvcm1EYXRhIG9iamVjdCB0byBjb252ZXJ0IHRvIEpTT04uXG4gKlxuICogQHJldHVybnMge09iamVjdDxzdHJpbmcsIGFueT4gfCBudWxsfSBUaGUgY29udmVydGVkIG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gZm9ybURhdGFUb0pTT04oZm9ybURhdGEpIHtcbiAgZnVuY3Rpb24gYnVpbGRQYXRoKHBhdGgsIHZhbHVlLCB0YXJnZXQsIGluZGV4KSB7XG4gICAgbGV0IG5hbWUgPSBwYXRoW2luZGV4KytdO1xuXG4gICAgaWYgKG5hbWUgPT09ICdfX3Byb3RvX18nKSByZXR1cm4gdHJ1ZTtcblxuICAgIGNvbnN0IGlzTnVtZXJpY0tleSA9IE51bWJlci5pc0Zpbml0ZSgrbmFtZSk7XG4gICAgY29uc3QgaXNMYXN0ID0gaW5kZXggPj0gcGF0aC5sZW5ndGg7XG4gICAgbmFtZSA9ICFuYW1lICYmIHV0aWxzLmlzQXJyYXkodGFyZ2V0KSA/IHRhcmdldC5sZW5ndGggOiBuYW1lO1xuXG4gICAgaWYgKGlzTGFzdCkge1xuICAgICAgaWYgKHV0aWxzLmhhc093blByb3AodGFyZ2V0LCBuYW1lKSkge1xuICAgICAgICB0YXJnZXRbbmFtZV0gPSBbdGFyZ2V0W25hbWVdLCB2YWx1ZV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0YXJnZXRbbmFtZV0gPSB2YWx1ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuICFpc051bWVyaWNLZXk7XG4gICAgfVxuXG4gICAgaWYgKCF0YXJnZXRbbmFtZV0gfHwgIXV0aWxzLmlzT2JqZWN0KHRhcmdldFtuYW1lXSkpIHtcbiAgICAgIHRhcmdldFtuYW1lXSA9IFtdO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGJ1aWxkUGF0aChwYXRoLCB2YWx1ZSwgdGFyZ2V0W25hbWVdLCBpbmRleCk7XG5cbiAgICBpZiAocmVzdWx0ICYmIHV0aWxzLmlzQXJyYXkodGFyZ2V0W25hbWVdKSkge1xuICAgICAgdGFyZ2V0W25hbWVdID0gYXJyYXlUb09iamVjdCh0YXJnZXRbbmFtZV0pO1xuICAgIH1cblxuICAgIHJldHVybiAhaXNOdW1lcmljS2V5O1xuICB9XG5cbiAgaWYgKHV0aWxzLmlzRm9ybURhdGEoZm9ybURhdGEpICYmIHV0aWxzLmlzRnVuY3Rpb24oZm9ybURhdGEuZW50cmllcykpIHtcbiAgICBjb25zdCBvYmogPSB7fTtcblxuICAgIHV0aWxzLmZvckVhY2hFbnRyeShmb3JtRGF0YSwgKG5hbWUsIHZhbHVlKSA9PiB7XG4gICAgICBidWlsZFBhdGgocGFyc2VQcm9wUGF0aChuYW1lKSwgdmFsdWUsIG9iaiwgMCk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gb2JqO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZvcm1EYXRhVG9KU09OO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgdXRpbHMgZnJvbSAnLi4vdXRpbHMuanMnO1xuaW1wb3J0IEF4aW9zRXJyb3IgZnJvbSAnLi4vY29yZS9BeGlvc0Vycm9yLmpzJztcbmltcG9ydCB0cmFuc2l0aW9uYWxEZWZhdWx0cyBmcm9tICcuL3RyYW5zaXRpb25hbC5qcyc7XG5pbXBvcnQgdG9Gb3JtRGF0YSBmcm9tICcuLi9oZWxwZXJzL3RvRm9ybURhdGEuanMnO1xuaW1wb3J0IHRvVVJMRW5jb2RlZEZvcm0gZnJvbSAnLi4vaGVscGVycy90b1VSTEVuY29kZWRGb3JtLmpzJztcbmltcG9ydCBwbGF0Zm9ybSBmcm9tICcuLi9wbGF0Zm9ybS9pbmRleC5qcyc7XG5pbXBvcnQgZm9ybURhdGFUb0pTT04gZnJvbSAnLi4vaGVscGVycy9mb3JtRGF0YVRvSlNPTi5qcyc7XG5cbi8qKlxuICogSXQgdGFrZXMgYSBzdHJpbmcsIHRyaWVzIHRvIHBhcnNlIGl0LCBhbmQgaWYgaXQgZmFpbHMsIGl0IHJldHVybnMgdGhlIHN0cmluZ2lmaWVkIHZlcnNpb25cbiAqIG9mIHRoZSBpbnB1dFxuICpcbiAqIEBwYXJhbSB7YW55fSByYXdWYWx1ZSAtIFRoZSB2YWx1ZSB0byBiZSBzdHJpbmdpZmllZC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHBhcnNlciAtIEEgZnVuY3Rpb24gdGhhdCBwYXJzZXMgYSBzdHJpbmcgaW50byBhIEphdmFTY3JpcHQgb2JqZWN0LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZW5jb2RlciAtIEEgZnVuY3Rpb24gdGhhdCB0YWtlcyBhIHZhbHVlIGFuZCByZXR1cm5zIGEgc3RyaW5nLlxuICpcbiAqIEByZXR1cm5zIHtzdHJpbmd9IEEgc3RyaW5naWZpZWQgdmVyc2lvbiBvZiB0aGUgcmF3VmFsdWUuXG4gKi9cbmZ1bmN0aW9uIHN0cmluZ2lmeVNhZmVseShyYXdWYWx1ZSwgcGFyc2VyLCBlbmNvZGVyKSB7XG4gIGlmICh1dGlscy5pc1N0cmluZyhyYXdWYWx1ZSkpIHtcbiAgICB0cnkge1xuICAgICAgKHBhcnNlciB8fCBKU09OLnBhcnNlKShyYXdWYWx1ZSk7XG4gICAgICByZXR1cm4gdXRpbHMudHJpbShyYXdWYWx1ZSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKGUubmFtZSAhPT0gJ1N5bnRheEVycm9yJykge1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiAoZW5jb2RlciB8fCBKU09OLnN0cmluZ2lmeSkocmF3VmFsdWUpO1xufVxuXG5jb25zdCBkZWZhdWx0cyA9IHtcblxuICB0cmFuc2l0aW9uYWw6IHRyYW5zaXRpb25hbERlZmF1bHRzLFxuXG4gIGFkYXB0ZXI6IFsneGhyJywgJ2h0dHAnXSxcblxuICB0cmFuc2Zvcm1SZXF1ZXN0OiBbZnVuY3Rpb24gdHJhbnNmb3JtUmVxdWVzdChkYXRhLCBoZWFkZXJzKSB7XG4gICAgY29uc3QgY29udGVudFR5cGUgPSBoZWFkZXJzLmdldENvbnRlbnRUeXBlKCkgfHwgJyc7XG4gICAgY29uc3QgaGFzSlNPTkNvbnRlbnRUeXBlID0gY29udGVudFR5cGUuaW5kZXhPZignYXBwbGljYXRpb24vanNvbicpID4gLTE7XG4gICAgY29uc3QgaXNPYmplY3RQYXlsb2FkID0gdXRpbHMuaXNPYmplY3QoZGF0YSk7XG5cbiAgICBpZiAoaXNPYmplY3RQYXlsb2FkICYmIHV0aWxzLmlzSFRNTEZvcm0oZGF0YSkpIHtcbiAgICAgIGRhdGEgPSBuZXcgRm9ybURhdGEoZGF0YSk7XG4gICAgfVxuXG4gICAgY29uc3QgaXNGb3JtRGF0YSA9IHV0aWxzLmlzRm9ybURhdGEoZGF0YSk7XG5cbiAgICBpZiAoaXNGb3JtRGF0YSkge1xuICAgICAgcmV0dXJuIGhhc0pTT05Db250ZW50VHlwZSA/IEpTT04uc3RyaW5naWZ5KGZvcm1EYXRhVG9KU09OKGRhdGEpKSA6IGRhdGE7XG4gICAgfVxuXG4gICAgaWYgKHV0aWxzLmlzQXJyYXlCdWZmZXIoZGF0YSkgfHxcbiAgICAgIHV0aWxzLmlzQnVmZmVyKGRhdGEpIHx8XG4gICAgICB1dGlscy5pc1N0cmVhbShkYXRhKSB8fFxuICAgICAgdXRpbHMuaXNGaWxlKGRhdGEpIHx8XG4gICAgICB1dGlscy5pc0Jsb2IoZGF0YSlcbiAgICApIHtcbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cbiAgICBpZiAodXRpbHMuaXNBcnJheUJ1ZmZlclZpZXcoZGF0YSkpIHtcbiAgICAgIHJldHVybiBkYXRhLmJ1ZmZlcjtcbiAgICB9XG4gICAgaWYgKHV0aWxzLmlzVVJMU2VhcmNoUGFyYW1zKGRhdGEpKSB7XG4gICAgICBoZWFkZXJzLnNldENvbnRlbnRUeXBlKCdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7Y2hhcnNldD11dGYtOCcsIGZhbHNlKTtcbiAgICAgIHJldHVybiBkYXRhLnRvU3RyaW5nKCk7XG4gICAgfVxuXG4gICAgbGV0IGlzRmlsZUxpc3Q7XG5cbiAgICBpZiAoaXNPYmplY3RQYXlsb2FkKSB7XG4gICAgICBpZiAoY29udGVudFR5cGUuaW5kZXhPZignYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJykgPiAtMSkge1xuICAgICAgICByZXR1cm4gdG9VUkxFbmNvZGVkRm9ybShkYXRhLCB0aGlzLmZvcm1TZXJpYWxpemVyKS50b1N0cmluZygpO1xuICAgICAgfVxuXG4gICAgICBpZiAoKGlzRmlsZUxpc3QgPSB1dGlscy5pc0ZpbGVMaXN0KGRhdGEpKSB8fCBjb250ZW50VHlwZS5pbmRleE9mKCdtdWx0aXBhcnQvZm9ybS1kYXRhJykgPiAtMSkge1xuICAgICAgICBjb25zdCBfRm9ybURhdGEgPSB0aGlzLmVudiAmJiB0aGlzLmVudi5Gb3JtRGF0YTtcblxuICAgICAgICByZXR1cm4gdG9Gb3JtRGF0YShcbiAgICAgICAgICBpc0ZpbGVMaXN0ID8geydmaWxlc1tdJzogZGF0YX0gOiBkYXRhLFxuICAgICAgICAgIF9Gb3JtRGF0YSAmJiBuZXcgX0Zvcm1EYXRhKCksXG4gICAgICAgICAgdGhpcy5mb3JtU2VyaWFsaXplclxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChpc09iamVjdFBheWxvYWQgfHwgaGFzSlNPTkNvbnRlbnRUeXBlICkge1xuICAgICAgaGVhZGVycy5zZXRDb250ZW50VHlwZSgnYXBwbGljYXRpb24vanNvbicsIGZhbHNlKTtcbiAgICAgIHJldHVybiBzdHJpbmdpZnlTYWZlbHkoZGF0YSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRhdGE7XG4gIH1dLFxuXG4gIHRyYW5zZm9ybVJlc3BvbnNlOiBbZnVuY3Rpb24gdHJhbnNmb3JtUmVzcG9uc2UoZGF0YSkge1xuICAgIGNvbnN0IHRyYW5zaXRpb25hbCA9IHRoaXMudHJhbnNpdGlvbmFsIHx8IGRlZmF1bHRzLnRyYW5zaXRpb25hbDtcbiAgICBjb25zdCBmb3JjZWRKU09OUGFyc2luZyA9IHRyYW5zaXRpb25hbCAmJiB0cmFuc2l0aW9uYWwuZm9yY2VkSlNPTlBhcnNpbmc7XG4gICAgY29uc3QgSlNPTlJlcXVlc3RlZCA9IHRoaXMucmVzcG9uc2VUeXBlID09PSAnanNvbic7XG5cbiAgICBpZiAoZGF0YSAmJiB1dGlscy5pc1N0cmluZyhkYXRhKSAmJiAoKGZvcmNlZEpTT05QYXJzaW5nICYmICF0aGlzLnJlc3BvbnNlVHlwZSkgfHwgSlNPTlJlcXVlc3RlZCkpIHtcbiAgICAgIGNvbnN0IHNpbGVudEpTT05QYXJzaW5nID0gdHJhbnNpdGlvbmFsICYmIHRyYW5zaXRpb25hbC5zaWxlbnRKU09OUGFyc2luZztcbiAgICAgIGNvbnN0IHN0cmljdEpTT05QYXJzaW5nID0gIXNpbGVudEpTT05QYXJzaW5nICYmIEpTT05SZXF1ZXN0ZWQ7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKGRhdGEpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoc3RyaWN0SlNPTlBhcnNpbmcpIHtcbiAgICAgICAgICBpZiAoZS5uYW1lID09PSAnU3ludGF4RXJyb3InKSB7XG4gICAgICAgICAgICB0aHJvdyBBeGlvc0Vycm9yLmZyb20oZSwgQXhpb3NFcnJvci5FUlJfQkFEX1JFU1BPTlNFLCB0aGlzLCBudWxsLCB0aGlzLnJlc3BvbnNlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBkYXRhO1xuICB9XSxcblxuICAvKipcbiAgICogQSB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyB0byBhYm9ydCBhIHJlcXVlc3QuIElmIHNldCB0byAwIChkZWZhdWx0KSBhXG4gICAqIHRpbWVvdXQgaXMgbm90IGNyZWF0ZWQuXG4gICAqL1xuICB0aW1lb3V0OiAwLFxuXG4gIHhzcmZDb29raWVOYW1lOiAnWFNSRi1UT0tFTicsXG4gIHhzcmZIZWFkZXJOYW1lOiAnWC1YU1JGLVRPS0VOJyxcblxuICBtYXhDb250ZW50TGVuZ3RoOiAtMSxcbiAgbWF4Qm9keUxlbmd0aDogLTEsXG5cbiAgZW52OiB7XG4gICAgRm9ybURhdGE6IHBsYXRmb3JtLmNsYXNzZXMuRm9ybURhdGEsXG4gICAgQmxvYjogcGxhdGZvcm0uY2xhc3Nlcy5CbG9iXG4gIH0sXG5cbiAgdmFsaWRhdGVTdGF0dXM6IGZ1bmN0aW9uIHZhbGlkYXRlU3RhdHVzKHN0YXR1cykge1xuICAgIHJldHVybiBzdGF0dXMgPj0gMjAwICYmIHN0YXR1cyA8IDMwMDtcbiAgfSxcblxuICBoZWFkZXJzOiB7XG4gICAgY29tbW9uOiB7XG4gICAgICAnQWNjZXB0JzogJ2FwcGxpY2F0aW9uL2pzb24sIHRleHQvcGxhaW4sICovKicsXG4gICAgICAnQ29udGVudC1UeXBlJzogdW5kZWZpbmVkXG4gICAgfVxuICB9XG59O1xuXG51dGlscy5mb3JFYWNoKFsnZGVsZXRlJywgJ2dldCcsICdoZWFkJywgJ3Bvc3QnLCAncHV0JywgJ3BhdGNoJ10sIChtZXRob2QpID0+IHtcbiAgZGVmYXVsdHMuaGVhZGVyc1ttZXRob2RdID0ge307XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgZGVmYXVsdHM7XG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCB1dGlscyBmcm9tICcuLy4uL3V0aWxzLmpzJztcblxuLy8gUmF3QXhpb3NIZWFkZXJzIHdob3NlIGR1cGxpY2F0ZXMgYXJlIGlnbm9yZWQgYnkgbm9kZVxuLy8gYy5mLiBodHRwczovL25vZGVqcy5vcmcvYXBpL2h0dHAuaHRtbCNodHRwX21lc3NhZ2VfaGVhZGVyc1xuY29uc3QgaWdub3JlRHVwbGljYXRlT2YgPSB1dGlscy50b09iamVjdFNldChbXG4gICdhZ2UnLCAnYXV0aG9yaXphdGlvbicsICdjb250ZW50LWxlbmd0aCcsICdjb250ZW50LXR5cGUnLCAnZXRhZycsXG4gICdleHBpcmVzJywgJ2Zyb20nLCAnaG9zdCcsICdpZi1tb2RpZmllZC1zaW5jZScsICdpZi11bm1vZGlmaWVkLXNpbmNlJyxcbiAgJ2xhc3QtbW9kaWZpZWQnLCAnbG9jYXRpb24nLCAnbWF4LWZvcndhcmRzJywgJ3Byb3h5LWF1dGhvcml6YXRpb24nLFxuICAncmVmZXJlcicsICdyZXRyeS1hZnRlcicsICd1c2VyLWFnZW50J1xuXSk7XG5cbi8qKlxuICogUGFyc2UgaGVhZGVycyBpbnRvIGFuIG9iamVjdFxuICpcbiAqIGBgYFxuICogRGF0ZTogV2VkLCAyNyBBdWcgMjAxNCAwODo1ODo0OSBHTVRcbiAqIENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvblxuICogQ29ubmVjdGlvbjoga2VlcC1hbGl2ZVxuICogVHJhbnNmZXItRW5jb2Rpbmc6IGNodW5rZWRcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSByYXdIZWFkZXJzIEhlYWRlcnMgbmVlZGluZyB0byBiZSBwYXJzZWRcbiAqXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBIZWFkZXJzIHBhcnNlZCBpbnRvIGFuIG9iamVjdFxuICovXG5leHBvcnQgZGVmYXVsdCByYXdIZWFkZXJzID0+IHtcbiAgY29uc3QgcGFyc2VkID0ge307XG4gIGxldCBrZXk7XG4gIGxldCB2YWw7XG4gIGxldCBpO1xuXG4gIHJhd0hlYWRlcnMgJiYgcmF3SGVhZGVycy5zcGxpdCgnXFxuJykuZm9yRWFjaChmdW5jdGlvbiBwYXJzZXIobGluZSkge1xuICAgIGkgPSBsaW5lLmluZGV4T2YoJzonKTtcbiAgICBrZXkgPSBsaW5lLnN1YnN0cmluZygwLCBpKS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICB2YWwgPSBsaW5lLnN1YnN0cmluZyhpICsgMSkudHJpbSgpO1xuXG4gICAgaWYgKCFrZXkgfHwgKHBhcnNlZFtrZXldICYmIGlnbm9yZUR1cGxpY2F0ZU9mW2tleV0pKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGtleSA9PT0gJ3NldC1jb29raWUnKSB7XG4gICAgICBpZiAocGFyc2VkW2tleV0pIHtcbiAgICAgICAgcGFyc2VkW2tleV0ucHVzaCh2YWwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGFyc2VkW2tleV0gPSBbdmFsXTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcGFyc2VkW2tleV0gPSBwYXJzZWRba2V5XSA/IHBhcnNlZFtrZXldICsgJywgJyArIHZhbCA6IHZhbDtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBwYXJzZWQ7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgdXRpbHMgZnJvbSAnLi4vdXRpbHMuanMnO1xuaW1wb3J0IHBhcnNlSGVhZGVycyBmcm9tICcuLi9oZWxwZXJzL3BhcnNlSGVhZGVycy5qcyc7XG5cbmNvbnN0ICRpbnRlcm5hbHMgPSBTeW1ib2woJ2ludGVybmFscycpO1xuXG5mdW5jdGlvbiBub3JtYWxpemVIZWFkZXIoaGVhZGVyKSB7XG4gIHJldHVybiBoZWFkZXIgJiYgU3RyaW5nKGhlYWRlcikudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVZhbHVlKHZhbHVlKSB7XG4gIGlmICh2YWx1ZSA9PT0gZmFsc2UgfHwgdmFsdWUgPT0gbnVsbCkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIHJldHVybiB1dGlscy5pc0FycmF5KHZhbHVlKSA/IHZhbHVlLm1hcChub3JtYWxpemVWYWx1ZSkgOiBTdHJpbmcodmFsdWUpO1xufVxuXG5mdW5jdGlvbiBwYXJzZVRva2VucyhzdHIpIHtcbiAgY29uc3QgdG9rZW5zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgY29uc3QgdG9rZW5zUkUgPSAvKFteXFxzLDs9XSspXFxzKig/Oj1cXHMqKFteLDtdKykpPy9nO1xuICBsZXQgbWF0Y2g7XG5cbiAgd2hpbGUgKChtYXRjaCA9IHRva2Vuc1JFLmV4ZWMoc3RyKSkpIHtcbiAgICB0b2tlbnNbbWF0Y2hbMV1dID0gbWF0Y2hbMl07XG4gIH1cblxuICByZXR1cm4gdG9rZW5zO1xufVxuXG5jb25zdCBpc1ZhbGlkSGVhZGVyTmFtZSA9IChzdHIpID0+IC9eWy1fYS16QS1aMC05XmB8fiwhIyQlJicqKy5dKyQvLnRlc3Qoc3RyLnRyaW0oKSk7XG5cbmZ1bmN0aW9uIG1hdGNoSGVhZGVyVmFsdWUoY29udGV4dCwgdmFsdWUsIGhlYWRlciwgZmlsdGVyLCBpc0hlYWRlck5hbWVGaWx0ZXIpIHtcbiAgaWYgKHV0aWxzLmlzRnVuY3Rpb24oZmlsdGVyKSkge1xuICAgIHJldHVybiBmaWx0ZXIuY2FsbCh0aGlzLCB2YWx1ZSwgaGVhZGVyKTtcbiAgfVxuXG4gIGlmIChpc0hlYWRlck5hbWVGaWx0ZXIpIHtcbiAgICB2YWx1ZSA9IGhlYWRlcjtcbiAgfVxuXG4gIGlmICghdXRpbHMuaXNTdHJpbmcodmFsdWUpKSByZXR1cm47XG5cbiAgaWYgKHV0aWxzLmlzU3RyaW5nKGZpbHRlcikpIHtcbiAgICByZXR1cm4gdmFsdWUuaW5kZXhPZihmaWx0ZXIpICE9PSAtMTtcbiAgfVxuXG4gIGlmICh1dGlscy5pc1JlZ0V4cChmaWx0ZXIpKSB7XG4gICAgcmV0dXJuIGZpbHRlci50ZXN0KHZhbHVlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmb3JtYXRIZWFkZXIoaGVhZGVyKSB7XG4gIHJldHVybiBoZWFkZXIudHJpbSgpXG4gICAgLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvKFthLXpcXGRdKShcXHcqKS9nLCAodywgY2hhciwgc3RyKSA9PiB7XG4gICAgICByZXR1cm4gY2hhci50b1VwcGVyQ2FzZSgpICsgc3RyO1xuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBidWlsZEFjY2Vzc29ycyhvYmosIGhlYWRlcikge1xuICBjb25zdCBhY2Nlc3Nvck5hbWUgPSB1dGlscy50b0NhbWVsQ2FzZSgnICcgKyBoZWFkZXIpO1xuXG4gIFsnZ2V0JywgJ3NldCcsICdoYXMnXS5mb3JFYWNoKG1ldGhvZE5hbWUgPT4ge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIG1ldGhvZE5hbWUgKyBhY2Nlc3Nvck5hbWUsIHtcbiAgICAgIHZhbHVlOiBmdW5jdGlvbihhcmcxLCBhcmcyLCBhcmczKSB7XG4gICAgICAgIHJldHVybiB0aGlzW21ldGhvZE5hbWVdLmNhbGwodGhpcywgaGVhZGVyLCBhcmcxLCBhcmcyLCBhcmczKTtcbiAgICAgIH0sXG4gICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgfSk7XG59XG5cbmNsYXNzIEF4aW9zSGVhZGVycyB7XG4gIGNvbnN0cnVjdG9yKGhlYWRlcnMpIHtcbiAgICBoZWFkZXJzICYmIHRoaXMuc2V0KGhlYWRlcnMpO1xuICB9XG5cbiAgc2V0KGhlYWRlciwgdmFsdWVPclJld3JpdGUsIHJld3JpdGUpIHtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcblxuICAgIGZ1bmN0aW9uIHNldEhlYWRlcihfdmFsdWUsIF9oZWFkZXIsIF9yZXdyaXRlKSB7XG4gICAgICBjb25zdCBsSGVhZGVyID0gbm9ybWFsaXplSGVhZGVyKF9oZWFkZXIpO1xuXG4gICAgICBpZiAoIWxIZWFkZXIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdoZWFkZXIgbmFtZSBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZycpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBrZXkgPSB1dGlscy5maW5kS2V5KHNlbGYsIGxIZWFkZXIpO1xuXG4gICAgICBpZigha2V5IHx8IHNlbGZba2V5XSA9PT0gdW5kZWZpbmVkIHx8IF9yZXdyaXRlID09PSB0cnVlIHx8IChfcmV3cml0ZSA9PT0gdW5kZWZpbmVkICYmIHNlbGZba2V5XSAhPT0gZmFsc2UpKSB7XG4gICAgICAgIHNlbGZba2V5IHx8IF9oZWFkZXJdID0gbm9ybWFsaXplVmFsdWUoX3ZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBzZXRIZWFkZXJzID0gKGhlYWRlcnMsIF9yZXdyaXRlKSA9PlxuICAgICAgdXRpbHMuZm9yRWFjaChoZWFkZXJzLCAoX3ZhbHVlLCBfaGVhZGVyKSA9PiBzZXRIZWFkZXIoX3ZhbHVlLCBfaGVhZGVyLCBfcmV3cml0ZSkpO1xuXG4gICAgaWYgKHV0aWxzLmlzUGxhaW5PYmplY3QoaGVhZGVyKSB8fCBoZWFkZXIgaW5zdGFuY2VvZiB0aGlzLmNvbnN0cnVjdG9yKSB7XG4gICAgICBzZXRIZWFkZXJzKGhlYWRlciwgdmFsdWVPclJld3JpdGUpXG4gICAgfSBlbHNlIGlmKHV0aWxzLmlzU3RyaW5nKGhlYWRlcikgJiYgKGhlYWRlciA9IGhlYWRlci50cmltKCkpICYmICFpc1ZhbGlkSGVhZGVyTmFtZShoZWFkZXIpKSB7XG4gICAgICBzZXRIZWFkZXJzKHBhcnNlSGVhZGVycyhoZWFkZXIpLCB2YWx1ZU9yUmV3cml0ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGhlYWRlciAhPSBudWxsICYmIHNldEhlYWRlcih2YWx1ZU9yUmV3cml0ZSwgaGVhZGVyLCByZXdyaXRlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGdldChoZWFkZXIsIHBhcnNlcikge1xuICAgIGhlYWRlciA9IG5vcm1hbGl6ZUhlYWRlcihoZWFkZXIpO1xuXG4gICAgaWYgKGhlYWRlcikge1xuICAgICAgY29uc3Qga2V5ID0gdXRpbHMuZmluZEtleSh0aGlzLCBoZWFkZXIpO1xuXG4gICAgICBpZiAoa2V5KSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpc1trZXldO1xuXG4gICAgICAgIGlmICghcGFyc2VyKSB7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhcnNlciA9PT0gdHJ1ZSkge1xuICAgICAgICAgIHJldHVybiBwYXJzZVRva2Vucyh2YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodXRpbHMuaXNGdW5jdGlvbihwYXJzZXIpKSB7XG4gICAgICAgICAgcmV0dXJuIHBhcnNlci5jYWxsKHRoaXMsIHZhbHVlLCBrZXkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHV0aWxzLmlzUmVnRXhwKHBhcnNlcikpIHtcbiAgICAgICAgICByZXR1cm4gcGFyc2VyLmV4ZWModmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigncGFyc2VyIG11c3QgYmUgYm9vbGVhbnxyZWdleHB8ZnVuY3Rpb24nKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBoYXMoaGVhZGVyLCBtYXRjaGVyKSB7XG4gICAgaGVhZGVyID0gbm9ybWFsaXplSGVhZGVyKGhlYWRlcik7XG5cbiAgICBpZiAoaGVhZGVyKSB7XG4gICAgICBjb25zdCBrZXkgPSB1dGlscy5maW5kS2V5KHRoaXMsIGhlYWRlcik7XG5cbiAgICAgIHJldHVybiAhIShrZXkgJiYgdGhpc1trZXldICE9PSB1bmRlZmluZWQgJiYgKCFtYXRjaGVyIHx8IG1hdGNoSGVhZGVyVmFsdWUodGhpcywgdGhpc1trZXldLCBrZXksIG1hdGNoZXIpKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZGVsZXRlKGhlYWRlciwgbWF0Y2hlcikge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIGxldCBkZWxldGVkID0gZmFsc2U7XG5cbiAgICBmdW5jdGlvbiBkZWxldGVIZWFkZXIoX2hlYWRlcikge1xuICAgICAgX2hlYWRlciA9IG5vcm1hbGl6ZUhlYWRlcihfaGVhZGVyKTtcblxuICAgICAgaWYgKF9oZWFkZXIpIHtcbiAgICAgICAgY29uc3Qga2V5ID0gdXRpbHMuZmluZEtleShzZWxmLCBfaGVhZGVyKTtcblxuICAgICAgICBpZiAoa2V5ICYmICghbWF0Y2hlciB8fCBtYXRjaEhlYWRlclZhbHVlKHNlbGYsIHNlbGZba2V5XSwga2V5LCBtYXRjaGVyKSkpIHtcbiAgICAgICAgICBkZWxldGUgc2VsZltrZXldO1xuXG4gICAgICAgICAgZGVsZXRlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodXRpbHMuaXNBcnJheShoZWFkZXIpKSB7XG4gICAgICBoZWFkZXIuZm9yRWFjaChkZWxldGVIZWFkZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGVIZWFkZXIoaGVhZGVyKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVsZXRlZDtcbiAgfVxuXG4gIGNsZWFyKG1hdGNoZXIpIHtcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXModGhpcyk7XG4gICAgbGV0IGkgPSBrZXlzLmxlbmd0aDtcbiAgICBsZXQgZGVsZXRlZCA9IGZhbHNlO1xuXG4gICAgd2hpbGUgKGktLSkge1xuICAgICAgY29uc3Qga2V5ID0ga2V5c1tpXTtcbiAgICAgIGlmKCFtYXRjaGVyIHx8IG1hdGNoSGVhZGVyVmFsdWUodGhpcywgdGhpc1trZXldLCBrZXksIG1hdGNoZXIsIHRydWUpKSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzW2tleV07XG4gICAgICAgIGRlbGV0ZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBkZWxldGVkO1xuICB9XG5cbiAgbm9ybWFsaXplKGZvcm1hdCkge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcblxuICAgIHV0aWxzLmZvckVhY2godGhpcywgKHZhbHVlLCBoZWFkZXIpID0+IHtcbiAgICAgIGNvbnN0IGtleSA9IHV0aWxzLmZpbmRLZXkoaGVhZGVycywgaGVhZGVyKTtcblxuICAgICAgaWYgKGtleSkge1xuICAgICAgICBzZWxmW2tleV0gPSBub3JtYWxpemVWYWx1ZSh2YWx1ZSk7XG4gICAgICAgIGRlbGV0ZSBzZWxmW2hlYWRlcl07XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IGZvcm1hdCA/IGZvcm1hdEhlYWRlcihoZWFkZXIpIDogU3RyaW5nKGhlYWRlcikudHJpbSgpO1xuXG4gICAgICBpZiAobm9ybWFsaXplZCAhPT0gaGVhZGVyKSB7XG4gICAgICAgIGRlbGV0ZSBzZWxmW2hlYWRlcl07XG4gICAgICB9XG5cbiAgICAgIHNlbGZbbm9ybWFsaXplZF0gPSBub3JtYWxpemVWYWx1ZSh2YWx1ZSk7XG5cbiAgICAgIGhlYWRlcnNbbm9ybWFsaXplZF0gPSB0cnVlO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBjb25jYXQoLi4udGFyZ2V0cykge1xuICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdG9yLmNvbmNhdCh0aGlzLCAuLi50YXJnZXRzKTtcbiAgfVxuXG4gIHRvSlNPTihhc1N0cmluZ3MpIHtcbiAgICBjb25zdCBvYmogPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG4gICAgdXRpbHMuZm9yRWFjaCh0aGlzLCAodmFsdWUsIGhlYWRlcikgPT4ge1xuICAgICAgdmFsdWUgIT0gbnVsbCAmJiB2YWx1ZSAhPT0gZmFsc2UgJiYgKG9ialtoZWFkZXJdID0gYXNTdHJpbmdzICYmIHV0aWxzLmlzQXJyYXkodmFsdWUpID8gdmFsdWUuam9pbignLCAnKSA6IHZhbHVlKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBvYmo7XG4gIH1cblxuICBbU3ltYm9sLml0ZXJhdG9yXSgpIHtcbiAgICByZXR1cm4gT2JqZWN0LmVudHJpZXModGhpcy50b0pTT04oKSlbU3ltYm9sLml0ZXJhdG9yXSgpO1xuICB9XG5cbiAgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHRoaXMudG9KU09OKCkpLm1hcCgoW2hlYWRlciwgdmFsdWVdKSA9PiBoZWFkZXIgKyAnOiAnICsgdmFsdWUpLmpvaW4oJ1xcbicpO1xuICB9XG5cbiAgZ2V0IFtTeW1ib2wudG9TdHJpbmdUYWddKCkge1xuICAgIHJldHVybiAnQXhpb3NIZWFkZXJzJztcbiAgfVxuXG4gIHN0YXRpYyBmcm9tKHRoaW5nKSB7XG4gICAgcmV0dXJuIHRoaW5nIGluc3RhbmNlb2YgdGhpcyA/IHRoaW5nIDogbmV3IHRoaXModGhpbmcpO1xuICB9XG5cbiAgc3RhdGljIGNvbmNhdChmaXJzdCwgLi4udGFyZ2V0cykge1xuICAgIGNvbnN0IGNvbXB1dGVkID0gbmV3IHRoaXMoZmlyc3QpO1xuXG4gICAgdGFyZ2V0cy5mb3JFYWNoKCh0YXJnZXQpID0+IGNvbXB1dGVkLnNldCh0YXJnZXQpKTtcblxuICAgIHJldHVybiBjb21wdXRlZDtcbiAgfVxuXG4gIHN0YXRpYyBhY2Nlc3NvcihoZWFkZXIpIHtcbiAgICBjb25zdCBpbnRlcm5hbHMgPSB0aGlzWyRpbnRlcm5hbHNdID0gKHRoaXNbJGludGVybmFsc10gPSB7XG4gICAgICBhY2Nlc3NvcnM6IHt9XG4gICAgfSk7XG5cbiAgICBjb25zdCBhY2Nlc3NvcnMgPSBpbnRlcm5hbHMuYWNjZXNzb3JzO1xuICAgIGNvbnN0IHByb3RvdHlwZSA9IHRoaXMucHJvdG90eXBlO1xuXG4gICAgZnVuY3Rpb24gZGVmaW5lQWNjZXNzb3IoX2hlYWRlcikge1xuICAgICAgY29uc3QgbEhlYWRlciA9IG5vcm1hbGl6ZUhlYWRlcihfaGVhZGVyKTtcblxuICAgICAgaWYgKCFhY2Nlc3NvcnNbbEhlYWRlcl0pIHtcbiAgICAgICAgYnVpbGRBY2Nlc3NvcnMocHJvdG90eXBlLCBfaGVhZGVyKTtcbiAgICAgICAgYWNjZXNzb3JzW2xIZWFkZXJdID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB1dGlscy5pc0FycmF5KGhlYWRlcikgPyBoZWFkZXIuZm9yRWFjaChkZWZpbmVBY2Nlc3NvcikgOiBkZWZpbmVBY2Nlc3NvcihoZWFkZXIpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn1cblxuQXhpb3NIZWFkZXJzLmFjY2Vzc29yKFsnQ29udGVudC1UeXBlJywgJ0NvbnRlbnQtTGVuZ3RoJywgJ0FjY2VwdCcsICdBY2NlcHQtRW5jb2RpbmcnLCAnVXNlci1BZ2VudCcsICdBdXRob3JpemF0aW9uJ10pO1xuXG4vLyByZXNlcnZlZCBuYW1lcyBob3RmaXhcbnV0aWxzLnJlZHVjZURlc2NyaXB0b3JzKEF4aW9zSGVhZGVycy5wcm90b3R5cGUsICh7dmFsdWV9LCBrZXkpID0+IHtcbiAgbGV0IG1hcHBlZCA9IGtleVswXS50b1VwcGVyQ2FzZSgpICsga2V5LnNsaWNlKDEpOyAvLyBtYXAgYHNldGAgPT4gYFNldGBcbiAgcmV0dXJuIHtcbiAgICBnZXQ6ICgpID0+IHZhbHVlLFxuICAgIHNldChoZWFkZXJWYWx1ZSkge1xuICAgICAgdGhpc1ttYXBwZWRdID0gaGVhZGVyVmFsdWU7XG4gICAgfVxuICB9XG59KTtcblxudXRpbHMuZnJlZXplTWV0aG9kcyhBeGlvc0hlYWRlcnMpO1xuXG5leHBvcnQgZGVmYXVsdCBBeGlvc0hlYWRlcnM7XG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCB1dGlscyBmcm9tICcuLy4uL3V0aWxzLmpzJztcbmltcG9ydCBkZWZhdWx0cyBmcm9tICcuLi9kZWZhdWx0cy9pbmRleC5qcyc7XG5pbXBvcnQgQXhpb3NIZWFkZXJzIGZyb20gJy4uL2NvcmUvQXhpb3NIZWFkZXJzLmpzJztcblxuLyoqXG4gKiBUcmFuc2Zvcm0gdGhlIGRhdGEgZm9yIGEgcmVxdWVzdCBvciBhIHJlc3BvbnNlXG4gKlxuICogQHBhcmFtIHtBcnJheXxGdW5jdGlvbn0gZm5zIEEgc2luZ2xlIGZ1bmN0aW9uIG9yIEFycmF5IG9mIGZ1bmN0aW9uc1xuICogQHBhcmFtIHs/T2JqZWN0fSByZXNwb25zZSBUaGUgcmVzcG9uc2Ugb2JqZWN0XG4gKlxuICogQHJldHVybnMgeyp9IFRoZSByZXN1bHRpbmcgdHJhbnNmb3JtZWQgZGF0YVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB0cmFuc2Zvcm1EYXRhKGZucywgcmVzcG9uc2UpIHtcbiAgY29uc3QgY29uZmlnID0gdGhpcyB8fCBkZWZhdWx0cztcbiAgY29uc3QgY29udGV4dCA9IHJlc3BvbnNlIHx8IGNvbmZpZztcbiAgY29uc3QgaGVhZGVycyA9IEF4aW9zSGVhZGVycy5mcm9tKGNvbnRleHQuaGVhZGVycyk7XG4gIGxldCBkYXRhID0gY29udGV4dC5kYXRhO1xuXG4gIHV0aWxzLmZvckVhY2goZm5zLCBmdW5jdGlvbiB0cmFuc2Zvcm0oZm4pIHtcbiAgICBkYXRhID0gZm4uY2FsbChjb25maWcsIGRhdGEsIGhlYWRlcnMubm9ybWFsaXplKCksIHJlc3BvbnNlID8gcmVzcG9uc2Uuc3RhdHVzIDogdW5kZWZpbmVkKTtcbiAgfSk7XG5cbiAgaGVhZGVycy5ub3JtYWxpemUoKTtcblxuICByZXR1cm4gZGF0YTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNDYW5jZWwodmFsdWUpIHtcbiAgcmV0dXJuICEhKHZhbHVlICYmIHZhbHVlLl9fQ0FOQ0VMX18pO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgQXhpb3NFcnJvciBmcm9tICcuLi9jb3JlL0F4aW9zRXJyb3IuanMnO1xuaW1wb3J0IHV0aWxzIGZyb20gJy4uL3V0aWxzLmpzJztcblxuLyoqXG4gKiBBIGBDYW5jZWxlZEVycm9yYCBpcyBhbiBvYmplY3QgdGhhdCBpcyB0aHJvd24gd2hlbiBhbiBvcGVyYXRpb24gaXMgY2FuY2VsZWQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmc9fSBtZXNzYWdlIFRoZSBtZXNzYWdlLlxuICogQHBhcmFtIHtPYmplY3Q9fSBjb25maWcgVGhlIGNvbmZpZy5cbiAqIEBwYXJhbSB7T2JqZWN0PX0gcmVxdWVzdCBUaGUgcmVxdWVzdC5cbiAqXG4gKiBAcmV0dXJucyB7Q2FuY2VsZWRFcnJvcn0gVGhlIGNyZWF0ZWQgZXJyb3IuXG4gKi9cbmZ1bmN0aW9uIENhbmNlbGVkRXJyb3IobWVzc2FnZSwgY29uZmlnLCByZXF1ZXN0KSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1lcS1udWxsLGVxZXFlcVxuICBBeGlvc0Vycm9yLmNhbGwodGhpcywgbWVzc2FnZSA9PSBudWxsID8gJ2NhbmNlbGVkJyA6IG1lc3NhZ2UsIEF4aW9zRXJyb3IuRVJSX0NBTkNFTEVELCBjb25maWcsIHJlcXVlc3QpO1xuICB0aGlzLm5hbWUgPSAnQ2FuY2VsZWRFcnJvcic7XG59XG5cbnV0aWxzLmluaGVyaXRzKENhbmNlbGVkRXJyb3IsIEF4aW9zRXJyb3IsIHtcbiAgX19DQU5DRUxfXzogdHJ1ZVxufSk7XG5cbmV4cG9ydCBkZWZhdWx0IENhbmNlbGVkRXJyb3I7XG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCBBeGlvc0Vycm9yIGZyb20gJy4vQXhpb3NFcnJvci5qcyc7XG5cbi8qKlxuICogUmVzb2x2ZSBvciByZWplY3QgYSBQcm9taXNlIGJhc2VkIG9uIHJlc3BvbnNlIHN0YXR1cy5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSByZXNvbHZlIEEgZnVuY3Rpb24gdGhhdCByZXNvbHZlcyB0aGUgcHJvbWlzZS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHJlamVjdCBBIGZ1bmN0aW9uIHRoYXQgcmVqZWN0cyB0aGUgcHJvbWlzZS5cbiAqIEBwYXJhbSB7b2JqZWN0fSByZXNwb25zZSBUaGUgcmVzcG9uc2UuXG4gKlxuICogQHJldHVybnMge29iamVjdH0gVGhlIHJlc3BvbnNlLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCByZXNwb25zZSkge1xuICBjb25zdCB2YWxpZGF0ZVN0YXR1cyA9IHJlc3BvbnNlLmNvbmZpZy52YWxpZGF0ZVN0YXR1cztcbiAgaWYgKCFyZXNwb25zZS5zdGF0dXMgfHwgIXZhbGlkYXRlU3RhdHVzIHx8IHZhbGlkYXRlU3RhdHVzKHJlc3BvbnNlLnN0YXR1cykpIHtcbiAgICByZXNvbHZlKHJlc3BvbnNlKTtcbiAgfSBlbHNlIHtcbiAgICByZWplY3QobmV3IEF4aW9zRXJyb3IoXG4gICAgICAnUmVxdWVzdCBmYWlsZWQgd2l0aCBzdGF0dXMgY29kZSAnICsgcmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgW0F4aW9zRXJyb3IuRVJSX0JBRF9SRVFVRVNULCBBeGlvc0Vycm9yLkVSUl9CQURfUkVTUE9OU0VdW01hdGguZmxvb3IocmVzcG9uc2Uuc3RhdHVzIC8gMTAwKSAtIDRdLFxuICAgICAgcmVzcG9uc2UuY29uZmlnLFxuICAgICAgcmVzcG9uc2UucmVxdWVzdCxcbiAgICAgIHJlc3BvbnNlXG4gICAgKSk7XG4gIH1cbn1cbiIsImltcG9ydCB1dGlscyBmcm9tICcuLy4uL3V0aWxzLmpzJztcbmltcG9ydCBwbGF0Zm9ybSBmcm9tICcuLi9wbGF0Zm9ybS9pbmRleC5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IHBsYXRmb3JtLmhhc1N0YW5kYXJkQnJvd3NlckVudiA/XG5cbiAgLy8gU3RhbmRhcmQgYnJvd3NlciBlbnZzIHN1cHBvcnQgZG9jdW1lbnQuY29va2llXG4gIHtcbiAgICB3cml0ZShuYW1lLCB2YWx1ZSwgZXhwaXJlcywgcGF0aCwgZG9tYWluLCBzZWN1cmUpIHtcbiAgICAgIGNvbnN0IGNvb2tpZSA9IFtuYW1lICsgJz0nICsgZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlKV07XG5cbiAgICAgIHV0aWxzLmlzTnVtYmVyKGV4cGlyZXMpICYmIGNvb2tpZS5wdXNoKCdleHBpcmVzPScgKyBuZXcgRGF0ZShleHBpcmVzKS50b0dNVFN0cmluZygpKTtcblxuICAgICAgdXRpbHMuaXNTdHJpbmcocGF0aCkgJiYgY29va2llLnB1c2goJ3BhdGg9JyArIHBhdGgpO1xuXG4gICAgICB1dGlscy5pc1N0cmluZyhkb21haW4pICYmIGNvb2tpZS5wdXNoKCdkb21haW49JyArIGRvbWFpbik7XG5cbiAgICAgIHNlY3VyZSA9PT0gdHJ1ZSAmJiBjb29raWUucHVzaCgnc2VjdXJlJyk7XG5cbiAgICAgIGRvY3VtZW50LmNvb2tpZSA9IGNvb2tpZS5qb2luKCc7ICcpO1xuICAgIH0sXG5cbiAgICByZWFkKG5hbWUpIHtcbiAgICAgIGNvbnN0IG1hdGNoID0gZG9jdW1lbnQuY29va2llLm1hdGNoKG5ldyBSZWdFeHAoJyhefDtcXFxccyopKCcgKyBuYW1lICsgJyk9KFteO10qKScpKTtcbiAgICAgIHJldHVybiAobWF0Y2ggPyBkZWNvZGVVUklDb21wb25lbnQobWF0Y2hbM10pIDogbnVsbCk7XG4gICAgfSxcblxuICAgIHJlbW92ZShuYW1lKSB7XG4gICAgICB0aGlzLndyaXRlKG5hbWUsICcnLCBEYXRlLm5vdygpIC0gODY0MDAwMDApO1xuICAgIH1cbiAgfVxuXG4gIDpcblxuICAvLyBOb24tc3RhbmRhcmQgYnJvd3NlciBlbnYgKHdlYiB3b3JrZXJzLCByZWFjdC1uYXRpdmUpIGxhY2sgbmVlZGVkIHN1cHBvcnQuXG4gIHtcbiAgICB3cml0ZSgpIHt9LFxuICAgIHJlYWQoKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9LFxuICAgIHJlbW92ZSgpIHt9XG4gIH07XG5cbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBVUkwgaXMgYWJzb2x1dGVcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdXJsIFRoZSBVUkwgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSBzcGVjaWZpZWQgVVJMIGlzIGFic29sdXRlLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNBYnNvbHV0ZVVSTCh1cmwpIHtcbiAgLy8gQSBVUkwgaXMgY29uc2lkZXJlZCBhYnNvbHV0ZSBpZiBpdCBiZWdpbnMgd2l0aCBcIjxzY2hlbWU+Oi8vXCIgb3IgXCIvL1wiIChwcm90b2NvbC1yZWxhdGl2ZSBVUkwpLlxuICAvLyBSRkMgMzk4NiBkZWZpbmVzIHNjaGVtZSBuYW1lIGFzIGEgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycyBiZWdpbm5pbmcgd2l0aCBhIGxldHRlciBhbmQgZm9sbG93ZWRcbiAgLy8gYnkgYW55IGNvbWJpbmF0aW9uIG9mIGxldHRlcnMsIGRpZ2l0cywgcGx1cywgcGVyaW9kLCBvciBoeXBoZW4uXG4gIHJldHVybiAvXihbYS16XVthLXpcXGQrXFwtLl0qOik/XFwvXFwvL2kudGVzdCh1cmwpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgVVJMIGJ5IGNvbWJpbmluZyB0aGUgc3BlY2lmaWVkIFVSTHNcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYmFzZVVSTCBUaGUgYmFzZSBVUkxcbiAqIEBwYXJhbSB7c3RyaW5nfSByZWxhdGl2ZVVSTCBUaGUgcmVsYXRpdmUgVVJMXG4gKlxuICogQHJldHVybnMge3N0cmluZ30gVGhlIGNvbWJpbmVkIFVSTFxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjb21iaW5lVVJMcyhiYXNlVVJMLCByZWxhdGl2ZVVSTCkge1xuICByZXR1cm4gcmVsYXRpdmVVUkxcbiAgICA/IGJhc2VVUkwucmVwbGFjZSgvXFwvP1xcLyQvLCAnJykgKyAnLycgKyByZWxhdGl2ZVVSTC5yZXBsYWNlKC9eXFwvKy8sICcnKVxuICAgIDogYmFzZVVSTDtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IGlzQWJzb2x1dGVVUkwgZnJvbSAnLi4vaGVscGVycy9pc0Fic29sdXRlVVJMLmpzJztcbmltcG9ydCBjb21iaW5lVVJMcyBmcm9tICcuLi9oZWxwZXJzL2NvbWJpbmVVUkxzLmpzJztcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IFVSTCBieSBjb21iaW5pbmcgdGhlIGJhc2VVUkwgd2l0aCB0aGUgcmVxdWVzdGVkVVJMLFxuICogb25seSB3aGVuIHRoZSByZXF1ZXN0ZWRVUkwgaXMgbm90IGFscmVhZHkgYW4gYWJzb2x1dGUgVVJMLlxuICogSWYgdGhlIHJlcXVlc3RVUkwgaXMgYWJzb2x1dGUsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgcmVxdWVzdGVkVVJMIHVudG91Y2hlZC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYmFzZVVSTCBUaGUgYmFzZSBVUkxcbiAqIEBwYXJhbSB7c3RyaW5nfSByZXF1ZXN0ZWRVUkwgQWJzb2x1dGUgb3IgcmVsYXRpdmUgVVJMIHRvIGNvbWJpbmVcbiAqXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgY29tYmluZWQgZnVsbCBwYXRoXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGJ1aWxkRnVsbFBhdGgoYmFzZVVSTCwgcmVxdWVzdGVkVVJMKSB7XG4gIGlmIChiYXNlVVJMICYmICFpc0Fic29sdXRlVVJMKHJlcXVlc3RlZFVSTCkpIHtcbiAgICByZXR1cm4gY29tYmluZVVSTHMoYmFzZVVSTCwgcmVxdWVzdGVkVVJMKTtcbiAgfVxuICByZXR1cm4gcmVxdWVzdGVkVVJMO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgdXRpbHMgZnJvbSAnLi8uLi91dGlscy5qcyc7XG5pbXBvcnQgcGxhdGZvcm0gZnJvbSAnLi4vcGxhdGZvcm0vaW5kZXguanMnO1xuXG5leHBvcnQgZGVmYXVsdCBwbGF0Zm9ybS5oYXNTdGFuZGFyZEJyb3dzZXJFbnYgP1xuXG4vLyBTdGFuZGFyZCBicm93c2VyIGVudnMgaGF2ZSBmdWxsIHN1cHBvcnQgb2YgdGhlIEFQSXMgbmVlZGVkIHRvIHRlc3Rcbi8vIHdoZXRoZXIgdGhlIHJlcXVlc3QgVVJMIGlzIG9mIHRoZSBzYW1lIG9yaWdpbiBhcyBjdXJyZW50IGxvY2F0aW9uLlxuICAoZnVuY3Rpb24gc3RhbmRhcmRCcm93c2VyRW52KCkge1xuICAgIGNvbnN0IG1zaWUgPSAvKG1zaWV8dHJpZGVudCkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpO1xuICAgIGNvbnN0IHVybFBhcnNpbmdOb2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgIGxldCBvcmlnaW5VUkw7XG5cbiAgICAvKipcbiAgICAqIFBhcnNlIGEgVVJMIHRvIGRpc2NvdmVyIGl0cyBjb21wb25lbnRzXG4gICAgKlxuICAgICogQHBhcmFtIHtTdHJpbmd9IHVybCBUaGUgVVJMIHRvIGJlIHBhcnNlZFxuICAgICogQHJldHVybnMge09iamVjdH1cbiAgICAqL1xuICAgIGZ1bmN0aW9uIHJlc29sdmVVUkwodXJsKSB7XG4gICAgICBsZXQgaHJlZiA9IHVybDtcblxuICAgICAgaWYgKG1zaWUpIHtcbiAgICAgICAgLy8gSUUgbmVlZHMgYXR0cmlidXRlIHNldCB0d2ljZSB0byBub3JtYWxpemUgcHJvcGVydGllc1xuICAgICAgICB1cmxQYXJzaW5nTm9kZS5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCBocmVmKTtcbiAgICAgICAgaHJlZiA9IHVybFBhcnNpbmdOb2RlLmhyZWY7XG4gICAgICB9XG5cbiAgICAgIHVybFBhcnNpbmdOb2RlLnNldEF0dHJpYnV0ZSgnaHJlZicsIGhyZWYpO1xuXG4gICAgICAvLyB1cmxQYXJzaW5nTm9kZSBwcm92aWRlcyB0aGUgVXJsVXRpbHMgaW50ZXJmYWNlIC0gaHR0cDovL3VybC5zcGVjLndoYXR3Zy5vcmcvI3VybHV0aWxzXG4gICAgICByZXR1cm4ge1xuICAgICAgICBocmVmOiB1cmxQYXJzaW5nTm9kZS5ocmVmLFxuICAgICAgICBwcm90b2NvbDogdXJsUGFyc2luZ05vZGUucHJvdG9jb2wgPyB1cmxQYXJzaW5nTm9kZS5wcm90b2NvbC5yZXBsYWNlKC86JC8sICcnKSA6ICcnLFxuICAgICAgICBob3N0OiB1cmxQYXJzaW5nTm9kZS5ob3N0LFxuICAgICAgICBzZWFyY2g6IHVybFBhcnNpbmdOb2RlLnNlYXJjaCA/IHVybFBhcnNpbmdOb2RlLnNlYXJjaC5yZXBsYWNlKC9eXFw/LywgJycpIDogJycsXG4gICAgICAgIGhhc2g6IHVybFBhcnNpbmdOb2RlLmhhc2ggPyB1cmxQYXJzaW5nTm9kZS5oYXNoLnJlcGxhY2UoL14jLywgJycpIDogJycsXG4gICAgICAgIGhvc3RuYW1lOiB1cmxQYXJzaW5nTm9kZS5ob3N0bmFtZSxcbiAgICAgICAgcG9ydDogdXJsUGFyc2luZ05vZGUucG9ydCxcbiAgICAgICAgcGF0aG5hbWU6ICh1cmxQYXJzaW5nTm9kZS5wYXRobmFtZS5jaGFyQXQoMCkgPT09ICcvJykgP1xuICAgICAgICAgIHVybFBhcnNpbmdOb2RlLnBhdGhuYW1lIDpcbiAgICAgICAgICAnLycgKyB1cmxQYXJzaW5nTm9kZS5wYXRobmFtZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICBvcmlnaW5VUkwgPSByZXNvbHZlVVJMKHdpbmRvdy5sb2NhdGlvbi5ocmVmKTtcblxuICAgIC8qKlxuICAgICogRGV0ZXJtaW5lIGlmIGEgVVJMIHNoYXJlcyB0aGUgc2FtZSBvcmlnaW4gYXMgdGhlIGN1cnJlbnQgbG9jYXRpb25cbiAgICAqXG4gICAgKiBAcGFyYW0ge1N0cmluZ30gcmVxdWVzdFVSTCBUaGUgVVJMIHRvIHRlc3RcbiAgICAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIFVSTCBzaGFyZXMgdGhlIHNhbWUgb3JpZ2luLCBvdGhlcndpc2UgZmFsc2VcbiAgICAqL1xuICAgIHJldHVybiBmdW5jdGlvbiBpc1VSTFNhbWVPcmlnaW4ocmVxdWVzdFVSTCkge1xuICAgICAgY29uc3QgcGFyc2VkID0gKHV0aWxzLmlzU3RyaW5nKHJlcXVlc3RVUkwpKSA/IHJlc29sdmVVUkwocmVxdWVzdFVSTCkgOiByZXF1ZXN0VVJMO1xuICAgICAgcmV0dXJuIChwYXJzZWQucHJvdG9jb2wgPT09IG9yaWdpblVSTC5wcm90b2NvbCAmJlxuICAgICAgICAgIHBhcnNlZC5ob3N0ID09PSBvcmlnaW5VUkwuaG9zdCk7XG4gICAgfTtcbiAgfSkoKSA6XG5cbiAgLy8gTm9uIHN0YW5kYXJkIGJyb3dzZXIgZW52cyAod2ViIHdvcmtlcnMsIHJlYWN0LW5hdGl2ZSkgbGFjayBuZWVkZWQgc3VwcG9ydC5cbiAgKGZ1bmN0aW9uIG5vblN0YW5kYXJkQnJvd3NlckVudigpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gaXNVUkxTYW1lT3JpZ2luKCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcbiAgfSkoKTtcbiIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcGFyc2VQcm90b2NvbCh1cmwpIHtcbiAgY29uc3QgbWF0Y2ggPSAvXihbLStcXHddezEsMjV9KSg6P1xcL1xcL3w6KS8uZXhlYyh1cmwpO1xuICByZXR1cm4gbWF0Y2ggJiYgbWF0Y2hbMV0gfHwgJyc7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQ2FsY3VsYXRlIGRhdGEgbWF4UmF0ZVxuICogQHBhcmFtIHtOdW1iZXJ9IFtzYW1wbGVzQ291bnQ9IDEwXVxuICogQHBhcmFtIHtOdW1iZXJ9IFttaW49IDEwMDBdXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259XG4gKi9cbmZ1bmN0aW9uIHNwZWVkb21ldGVyKHNhbXBsZXNDb3VudCwgbWluKSB7XG4gIHNhbXBsZXNDb3VudCA9IHNhbXBsZXNDb3VudCB8fCAxMDtcbiAgY29uc3QgYnl0ZXMgPSBuZXcgQXJyYXkoc2FtcGxlc0NvdW50KTtcbiAgY29uc3QgdGltZXN0YW1wcyA9IG5ldyBBcnJheShzYW1wbGVzQ291bnQpO1xuICBsZXQgaGVhZCA9IDA7XG4gIGxldCB0YWlsID0gMDtcbiAgbGV0IGZpcnN0U2FtcGxlVFM7XG5cbiAgbWluID0gbWluICE9PSB1bmRlZmluZWQgPyBtaW4gOiAxMDAwO1xuXG4gIHJldHVybiBmdW5jdGlvbiBwdXNoKGNodW5rTGVuZ3RoKSB7XG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcblxuICAgIGNvbnN0IHN0YXJ0ZWRBdCA9IHRpbWVzdGFtcHNbdGFpbF07XG5cbiAgICBpZiAoIWZpcnN0U2FtcGxlVFMpIHtcbiAgICAgIGZpcnN0U2FtcGxlVFMgPSBub3c7XG4gICAgfVxuXG4gICAgYnl0ZXNbaGVhZF0gPSBjaHVua0xlbmd0aDtcbiAgICB0aW1lc3RhbXBzW2hlYWRdID0gbm93O1xuXG4gICAgbGV0IGkgPSB0YWlsO1xuICAgIGxldCBieXRlc0NvdW50ID0gMDtcblxuICAgIHdoaWxlIChpICE9PSBoZWFkKSB7XG4gICAgICBieXRlc0NvdW50ICs9IGJ5dGVzW2krK107XG4gICAgICBpID0gaSAlIHNhbXBsZXNDb3VudDtcbiAgICB9XG5cbiAgICBoZWFkID0gKGhlYWQgKyAxKSAlIHNhbXBsZXNDb3VudDtcblxuICAgIGlmIChoZWFkID09PSB0YWlsKSB7XG4gICAgICB0YWlsID0gKHRhaWwgKyAxKSAlIHNhbXBsZXNDb3VudDtcbiAgICB9XG5cbiAgICBpZiAobm93IC0gZmlyc3RTYW1wbGVUUyA8IG1pbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBhc3NlZCA9IHN0YXJ0ZWRBdCAmJiBub3cgLSBzdGFydGVkQXQ7XG5cbiAgICByZXR1cm4gcGFzc2VkID8gTWF0aC5yb3VuZChieXRlc0NvdW50ICogMTAwMCAvIHBhc3NlZCkgOiB1bmRlZmluZWQ7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IHNwZWVkb21ldGVyO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgdXRpbHMgZnJvbSAnLi8uLi91dGlscy5qcyc7XG5pbXBvcnQgc2V0dGxlIGZyb20gJy4vLi4vY29yZS9zZXR0bGUuanMnO1xuaW1wb3J0IGNvb2tpZXMgZnJvbSAnLi8uLi9oZWxwZXJzL2Nvb2tpZXMuanMnO1xuaW1wb3J0IGJ1aWxkVVJMIGZyb20gJy4vLi4vaGVscGVycy9idWlsZFVSTC5qcyc7XG5pbXBvcnQgYnVpbGRGdWxsUGF0aCBmcm9tICcuLi9jb3JlL2J1aWxkRnVsbFBhdGguanMnO1xuaW1wb3J0IGlzVVJMU2FtZU9yaWdpbiBmcm9tICcuLy4uL2hlbHBlcnMvaXNVUkxTYW1lT3JpZ2luLmpzJztcbmltcG9ydCB0cmFuc2l0aW9uYWxEZWZhdWx0cyBmcm9tICcuLi9kZWZhdWx0cy90cmFuc2l0aW9uYWwuanMnO1xuaW1wb3J0IEF4aW9zRXJyb3IgZnJvbSAnLi4vY29yZS9BeGlvc0Vycm9yLmpzJztcbmltcG9ydCBDYW5jZWxlZEVycm9yIGZyb20gJy4uL2NhbmNlbC9DYW5jZWxlZEVycm9yLmpzJztcbmltcG9ydCBwYXJzZVByb3RvY29sIGZyb20gJy4uL2hlbHBlcnMvcGFyc2VQcm90b2NvbC5qcyc7XG5pbXBvcnQgcGxhdGZvcm0gZnJvbSAnLi4vcGxhdGZvcm0vaW5kZXguanMnO1xuaW1wb3J0IEF4aW9zSGVhZGVycyBmcm9tICcuLi9jb3JlL0F4aW9zSGVhZGVycy5qcyc7XG5pbXBvcnQgc3BlZWRvbWV0ZXIgZnJvbSAnLi4vaGVscGVycy9zcGVlZG9tZXRlci5qcyc7XG5cbmZ1bmN0aW9uIHByb2dyZXNzRXZlbnRSZWR1Y2VyKGxpc3RlbmVyLCBpc0Rvd25sb2FkU3RyZWFtKSB7XG4gIGxldCBieXRlc05vdGlmaWVkID0gMDtcbiAgY29uc3QgX3NwZWVkb21ldGVyID0gc3BlZWRvbWV0ZXIoNTAsIDI1MCk7XG5cbiAgcmV0dXJuIGUgPT4ge1xuICAgIGNvbnN0IGxvYWRlZCA9IGUubG9hZGVkO1xuICAgIGNvbnN0IHRvdGFsID0gZS5sZW5ndGhDb21wdXRhYmxlID8gZS50b3RhbCA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBwcm9ncmVzc0J5dGVzID0gbG9hZGVkIC0gYnl0ZXNOb3RpZmllZDtcbiAgICBjb25zdCByYXRlID0gX3NwZWVkb21ldGVyKHByb2dyZXNzQnl0ZXMpO1xuICAgIGNvbnN0IGluUmFuZ2UgPSBsb2FkZWQgPD0gdG90YWw7XG5cbiAgICBieXRlc05vdGlmaWVkID0gbG9hZGVkO1xuXG4gICAgY29uc3QgZGF0YSA9IHtcbiAgICAgIGxvYWRlZCxcbiAgICAgIHRvdGFsLFxuICAgICAgcHJvZ3Jlc3M6IHRvdGFsID8gKGxvYWRlZCAvIHRvdGFsKSA6IHVuZGVmaW5lZCxcbiAgICAgIGJ5dGVzOiBwcm9ncmVzc0J5dGVzLFxuICAgICAgcmF0ZTogcmF0ZSA/IHJhdGUgOiB1bmRlZmluZWQsXG4gICAgICBlc3RpbWF0ZWQ6IHJhdGUgJiYgdG90YWwgJiYgaW5SYW5nZSA/ICh0b3RhbCAtIGxvYWRlZCkgLyByYXRlIDogdW5kZWZpbmVkLFxuICAgICAgZXZlbnQ6IGVcbiAgICB9O1xuXG4gICAgZGF0YVtpc0Rvd25sb2FkU3RyZWFtID8gJ2Rvd25sb2FkJyA6ICd1cGxvYWQnXSA9IHRydWU7XG5cbiAgICBsaXN0ZW5lcihkYXRhKTtcbiAgfTtcbn1cblxuY29uc3QgaXNYSFJBZGFwdGVyU3VwcG9ydGVkID0gdHlwZW9mIFhNTEh0dHBSZXF1ZXN0ICE9PSAndW5kZWZpbmVkJztcblxuZXhwb3J0IGRlZmF1bHQgaXNYSFJBZGFwdGVyU3VwcG9ydGVkICYmIGZ1bmN0aW9uIChjb25maWcpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIGRpc3BhdGNoWGhyUmVxdWVzdChyZXNvbHZlLCByZWplY3QpIHtcbiAgICBsZXQgcmVxdWVzdERhdGEgPSBjb25maWcuZGF0YTtcbiAgICBjb25zdCByZXF1ZXN0SGVhZGVycyA9IEF4aW9zSGVhZGVycy5mcm9tKGNvbmZpZy5oZWFkZXJzKS5ub3JtYWxpemUoKTtcbiAgICBsZXQge3Jlc3BvbnNlVHlwZSwgd2l0aFhTUkZUb2tlbn0gPSBjb25maWc7XG4gICAgbGV0IG9uQ2FuY2VsZWQ7XG4gICAgZnVuY3Rpb24gZG9uZSgpIHtcbiAgICAgIGlmIChjb25maWcuY2FuY2VsVG9rZW4pIHtcbiAgICAgICAgY29uZmlnLmNhbmNlbFRva2VuLnVuc3Vic2NyaWJlKG9uQ2FuY2VsZWQpO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29uZmlnLnNpZ25hbCkge1xuICAgICAgICBjb25maWcuc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Fib3J0Jywgb25DYW5jZWxlZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IGNvbnRlbnRUeXBlO1xuXG4gICAgaWYgKHV0aWxzLmlzRm9ybURhdGEocmVxdWVzdERhdGEpKSB7XG4gICAgICBpZiAocGxhdGZvcm0uaGFzU3RhbmRhcmRCcm93c2VyRW52IHx8IHBsYXRmb3JtLmhhc1N0YW5kYXJkQnJvd3NlcldlYldvcmtlckVudikge1xuICAgICAgICByZXF1ZXN0SGVhZGVycy5zZXRDb250ZW50VHlwZShmYWxzZSk7IC8vIExldCB0aGUgYnJvd3NlciBzZXQgaXRcbiAgICAgIH0gZWxzZSBpZiAoKGNvbnRlbnRUeXBlID0gcmVxdWVzdEhlYWRlcnMuZ2V0Q29udGVudFR5cGUoKSkgIT09IGZhbHNlKSB7XG4gICAgICAgIC8vIGZpeCBzZW1pY29sb24gZHVwbGljYXRpb24gaXNzdWUgZm9yIFJlYWN0TmF0aXZlIEZvcm1EYXRhIGltcGxlbWVudGF0aW9uXG4gICAgICAgIGNvbnN0IFt0eXBlLCAuLi50b2tlbnNdID0gY29udGVudFR5cGUgPyBjb250ZW50VHlwZS5zcGxpdCgnOycpLm1hcCh0b2tlbiA9PiB0b2tlbi50cmltKCkpLmZpbHRlcihCb29sZWFuKSA6IFtdO1xuICAgICAgICByZXF1ZXN0SGVhZGVycy5zZXRDb250ZW50VHlwZShbdHlwZSB8fCAnbXVsdGlwYXJ0L2Zvcm0tZGF0YScsIC4uLnRva2Vuc10uam9pbignOyAnKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IHJlcXVlc3QgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcblxuICAgIC8vIEhUVFAgYmFzaWMgYXV0aGVudGljYXRpb25cbiAgICBpZiAoY29uZmlnLmF1dGgpIHtcbiAgICAgIGNvbnN0IHVzZXJuYW1lID0gY29uZmlnLmF1dGgudXNlcm5hbWUgfHwgJyc7XG4gICAgICBjb25zdCBwYXNzd29yZCA9IGNvbmZpZy5hdXRoLnBhc3N3b3JkID8gdW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KGNvbmZpZy5hdXRoLnBhc3N3b3JkKSkgOiAnJztcbiAgICAgIHJlcXVlc3RIZWFkZXJzLnNldCgnQXV0aG9yaXphdGlvbicsICdCYXNpYyAnICsgYnRvYSh1c2VybmFtZSArICc6JyArIHBhc3N3b3JkKSk7XG4gICAgfVxuXG4gICAgY29uc3QgZnVsbFBhdGggPSBidWlsZEZ1bGxQYXRoKGNvbmZpZy5iYXNlVVJMLCBjb25maWcudXJsKTtcblxuICAgIHJlcXVlc3Qub3Blbihjb25maWcubWV0aG9kLnRvVXBwZXJDYXNlKCksIGJ1aWxkVVJMKGZ1bGxQYXRoLCBjb25maWcucGFyYW1zLCBjb25maWcucGFyYW1zU2VyaWFsaXplciksIHRydWUpO1xuXG4gICAgLy8gU2V0IHRoZSByZXF1ZXN0IHRpbWVvdXQgaW4gTVNcbiAgICByZXF1ZXN0LnRpbWVvdXQgPSBjb25maWcudGltZW91dDtcblxuICAgIGZ1bmN0aW9uIG9ubG9hZGVuZCgpIHtcbiAgICAgIGlmICghcmVxdWVzdCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBQcmVwYXJlIHRoZSByZXNwb25zZVxuICAgICAgY29uc3QgcmVzcG9uc2VIZWFkZXJzID0gQXhpb3NIZWFkZXJzLmZyb20oXG4gICAgICAgICdnZXRBbGxSZXNwb25zZUhlYWRlcnMnIGluIHJlcXVlc3QgJiYgcmVxdWVzdC5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKVxuICAgICAgKTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlRGF0YSA9ICFyZXNwb25zZVR5cGUgfHwgcmVzcG9uc2VUeXBlID09PSAndGV4dCcgfHwgcmVzcG9uc2VUeXBlID09PSAnanNvbicgP1xuICAgICAgICByZXF1ZXN0LnJlc3BvbnNlVGV4dCA6IHJlcXVlc3QucmVzcG9uc2U7XG4gICAgICBjb25zdCByZXNwb25zZSA9IHtcbiAgICAgICAgZGF0YTogcmVzcG9uc2VEYXRhLFxuICAgICAgICBzdGF0dXM6IHJlcXVlc3Quc3RhdHVzLFxuICAgICAgICBzdGF0dXNUZXh0OiByZXF1ZXN0LnN0YXR1c1RleHQsXG4gICAgICAgIGhlYWRlcnM6IHJlc3BvbnNlSGVhZGVycyxcbiAgICAgICAgY29uZmlnLFxuICAgICAgICByZXF1ZXN0XG4gICAgICB9O1xuXG4gICAgICBzZXR0bGUoZnVuY3Rpb24gX3Jlc29sdmUodmFsdWUpIHtcbiAgICAgICAgcmVzb2x2ZSh2YWx1ZSk7XG4gICAgICAgIGRvbmUoKTtcbiAgICAgIH0sIGZ1bmN0aW9uIF9yZWplY3QoZXJyKSB7XG4gICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICBkb25lKCk7XG4gICAgICB9LCByZXNwb25zZSk7XG5cbiAgICAgIC8vIENsZWFuIHVwIHJlcXVlc3RcbiAgICAgIHJlcXVlc3QgPSBudWxsO1xuICAgIH1cblxuICAgIGlmICgnb25sb2FkZW5kJyBpbiByZXF1ZXN0KSB7XG4gICAgICAvLyBVc2Ugb25sb2FkZW5kIGlmIGF2YWlsYWJsZVxuICAgICAgcmVxdWVzdC5vbmxvYWRlbmQgPSBvbmxvYWRlbmQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIExpc3RlbiBmb3IgcmVhZHkgc3RhdGUgdG8gZW11bGF0ZSBvbmxvYWRlbmRcbiAgICAgIHJlcXVlc3Qub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24gaGFuZGxlTG9hZCgpIHtcbiAgICAgICAgaWYgKCFyZXF1ZXN0IHx8IHJlcXVlc3QucmVhZHlTdGF0ZSAhPT0gNCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRoZSByZXF1ZXN0IGVycm9yZWQgb3V0IGFuZCB3ZSBkaWRuJ3QgZ2V0IGEgcmVzcG9uc2UsIHRoaXMgd2lsbCBiZVxuICAgICAgICAvLyBoYW5kbGVkIGJ5IG9uZXJyb3IgaW5zdGVhZFxuICAgICAgICAvLyBXaXRoIG9uZSBleGNlcHRpb246IHJlcXVlc3QgdGhhdCB1c2luZyBmaWxlOiBwcm90b2NvbCwgbW9zdCBicm93c2Vyc1xuICAgICAgICAvLyB3aWxsIHJldHVybiBzdGF0dXMgYXMgMCBldmVuIHRob3VnaCBpdCdzIGEgc3VjY2Vzc2Z1bCByZXF1ZXN0XG4gICAgICAgIGlmIChyZXF1ZXN0LnN0YXR1cyA9PT0gMCAmJiAhKHJlcXVlc3QucmVzcG9uc2VVUkwgJiYgcmVxdWVzdC5yZXNwb25zZVVSTC5pbmRleE9mKCdmaWxlOicpID09PSAwKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyByZWFkeXN0YXRlIGhhbmRsZXIgaXMgY2FsbGluZyBiZWZvcmUgb25lcnJvciBvciBvbnRpbWVvdXQgaGFuZGxlcnMsXG4gICAgICAgIC8vIHNvIHdlIHNob3VsZCBjYWxsIG9ubG9hZGVuZCBvbiB0aGUgbmV4dCAndGljaydcbiAgICAgICAgc2V0VGltZW91dChvbmxvYWRlbmQpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgYnJvd3NlciByZXF1ZXN0IGNhbmNlbGxhdGlvbiAoYXMgb3Bwb3NlZCB0byBhIG1hbnVhbCBjYW5jZWxsYXRpb24pXG4gICAgcmVxdWVzdC5vbmFib3J0ID0gZnVuY3Rpb24gaGFuZGxlQWJvcnQoKSB7XG4gICAgICBpZiAoIXJlcXVlc3QpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICByZWplY3QobmV3IEF4aW9zRXJyb3IoJ1JlcXVlc3QgYWJvcnRlZCcsIEF4aW9zRXJyb3IuRUNPTk5BQk9SVEVELCBjb25maWcsIHJlcXVlc3QpKTtcblxuICAgICAgLy8gQ2xlYW4gdXAgcmVxdWVzdFxuICAgICAgcmVxdWVzdCA9IG51bGw7XG4gICAgfTtcblxuICAgIC8vIEhhbmRsZSBsb3cgbGV2ZWwgbmV0d29yayBlcnJvcnNcbiAgICByZXF1ZXN0Lm9uZXJyb3IgPSBmdW5jdGlvbiBoYW5kbGVFcnJvcigpIHtcbiAgICAgIC8vIFJlYWwgZXJyb3JzIGFyZSBoaWRkZW4gZnJvbSB1cyBieSB0aGUgYnJvd3NlclxuICAgICAgLy8gb25lcnJvciBzaG91bGQgb25seSBmaXJlIGlmIGl0J3MgYSBuZXR3b3JrIGVycm9yXG4gICAgICByZWplY3QobmV3IEF4aW9zRXJyb3IoJ05ldHdvcmsgRXJyb3InLCBBeGlvc0Vycm9yLkVSUl9ORVRXT1JLLCBjb25maWcsIHJlcXVlc3QpKTtcblxuICAgICAgLy8gQ2xlYW4gdXAgcmVxdWVzdFxuICAgICAgcmVxdWVzdCA9IG51bGw7XG4gICAgfTtcblxuICAgIC8vIEhhbmRsZSB0aW1lb3V0XG4gICAgcmVxdWVzdC5vbnRpbWVvdXQgPSBmdW5jdGlvbiBoYW5kbGVUaW1lb3V0KCkge1xuICAgICAgbGV0IHRpbWVvdXRFcnJvck1lc3NhZ2UgPSBjb25maWcudGltZW91dCA/ICd0aW1lb3V0IG9mICcgKyBjb25maWcudGltZW91dCArICdtcyBleGNlZWRlZCcgOiAndGltZW91dCBleGNlZWRlZCc7XG4gICAgICBjb25zdCB0cmFuc2l0aW9uYWwgPSBjb25maWcudHJhbnNpdGlvbmFsIHx8IHRyYW5zaXRpb25hbERlZmF1bHRzO1xuICAgICAgaWYgKGNvbmZpZy50aW1lb3V0RXJyb3JNZXNzYWdlKSB7XG4gICAgICAgIHRpbWVvdXRFcnJvck1lc3NhZ2UgPSBjb25maWcudGltZW91dEVycm9yTWVzc2FnZTtcbiAgICAgIH1cbiAgICAgIHJlamVjdChuZXcgQXhpb3NFcnJvcihcbiAgICAgICAgdGltZW91dEVycm9yTWVzc2FnZSxcbiAgICAgICAgdHJhbnNpdGlvbmFsLmNsYXJpZnlUaW1lb3V0RXJyb3IgPyBBeGlvc0Vycm9yLkVUSU1FRE9VVCA6IEF4aW9zRXJyb3IuRUNPTk5BQk9SVEVELFxuICAgICAgICBjb25maWcsXG4gICAgICAgIHJlcXVlc3QpKTtcblxuICAgICAgLy8gQ2xlYW4gdXAgcmVxdWVzdFxuICAgICAgcmVxdWVzdCA9IG51bGw7XG4gICAgfTtcblxuICAgIC8vIEFkZCB4c3JmIGhlYWRlclxuICAgIC8vIFRoaXMgaXMgb25seSBkb25lIGlmIHJ1bm5pbmcgaW4gYSBzdGFuZGFyZCBicm93c2VyIGVudmlyb25tZW50LlxuICAgIC8vIFNwZWNpZmljYWxseSBub3QgaWYgd2UncmUgaW4gYSB3ZWIgd29ya2VyLCBvciByZWFjdC1uYXRpdmUuXG4gICAgaWYocGxhdGZvcm0uaGFzU3RhbmRhcmRCcm93c2VyRW52KSB7XG4gICAgICB3aXRoWFNSRlRva2VuICYmIHV0aWxzLmlzRnVuY3Rpb24od2l0aFhTUkZUb2tlbikgJiYgKHdpdGhYU1JGVG9rZW4gPSB3aXRoWFNSRlRva2VuKGNvbmZpZykpO1xuXG4gICAgICBpZiAod2l0aFhTUkZUb2tlbiB8fCAod2l0aFhTUkZUb2tlbiAhPT0gZmFsc2UgJiYgaXNVUkxTYW1lT3JpZ2luKGZ1bGxQYXRoKSkpIHtcbiAgICAgICAgLy8gQWRkIHhzcmYgaGVhZGVyXG4gICAgICAgIGNvbnN0IHhzcmZWYWx1ZSA9IGNvbmZpZy54c3JmSGVhZGVyTmFtZSAmJiBjb25maWcueHNyZkNvb2tpZU5hbWUgJiYgY29va2llcy5yZWFkKGNvbmZpZy54c3JmQ29va2llTmFtZSk7XG5cbiAgICAgICAgaWYgKHhzcmZWYWx1ZSkge1xuICAgICAgICAgIHJlcXVlc3RIZWFkZXJzLnNldChjb25maWcueHNyZkhlYWRlck5hbWUsIHhzcmZWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgQ29udGVudC1UeXBlIGlmIGRhdGEgaXMgdW5kZWZpbmVkXG4gICAgcmVxdWVzdERhdGEgPT09IHVuZGVmaW5lZCAmJiByZXF1ZXN0SGVhZGVycy5zZXRDb250ZW50VHlwZShudWxsKTtcblxuICAgIC8vIEFkZCBoZWFkZXJzIHRvIHRoZSByZXF1ZXN0XG4gICAgaWYgKCdzZXRSZXF1ZXN0SGVhZGVyJyBpbiByZXF1ZXN0KSB7XG4gICAgICB1dGlscy5mb3JFYWNoKHJlcXVlc3RIZWFkZXJzLnRvSlNPTigpLCBmdW5jdGlvbiBzZXRSZXF1ZXN0SGVhZGVyKHZhbCwga2V5KSB7XG4gICAgICAgIHJlcXVlc3Quc2V0UmVxdWVzdEhlYWRlcihrZXksIHZhbCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBBZGQgd2l0aENyZWRlbnRpYWxzIHRvIHJlcXVlc3QgaWYgbmVlZGVkXG4gICAgaWYgKCF1dGlscy5pc1VuZGVmaW5lZChjb25maWcud2l0aENyZWRlbnRpYWxzKSkge1xuICAgICAgcmVxdWVzdC53aXRoQ3JlZGVudGlhbHMgPSAhIWNvbmZpZy53aXRoQ3JlZGVudGlhbHM7XG4gICAgfVxuXG4gICAgLy8gQWRkIHJlc3BvbnNlVHlwZSB0byByZXF1ZXN0IGlmIG5lZWRlZFxuICAgIGlmIChyZXNwb25zZVR5cGUgJiYgcmVzcG9uc2VUeXBlICE9PSAnanNvbicpIHtcbiAgICAgIHJlcXVlc3QucmVzcG9uc2VUeXBlID0gY29uZmlnLnJlc3BvbnNlVHlwZTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgcHJvZ3Jlc3MgaWYgbmVlZGVkXG4gICAgaWYgKHR5cGVvZiBjb25maWcub25Eb3dubG9hZFByb2dyZXNzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXF1ZXN0LmFkZEV2ZW50TGlzdGVuZXIoJ3Byb2dyZXNzJywgcHJvZ3Jlc3NFdmVudFJlZHVjZXIoY29uZmlnLm9uRG93bmxvYWRQcm9ncmVzcywgdHJ1ZSkpO1xuICAgIH1cblxuICAgIC8vIE5vdCBhbGwgYnJvd3NlcnMgc3VwcG9ydCB1cGxvYWQgZXZlbnRzXG4gICAgaWYgKHR5cGVvZiBjb25maWcub25VcGxvYWRQcm9ncmVzcyA9PT0gJ2Z1bmN0aW9uJyAmJiByZXF1ZXN0LnVwbG9hZCkge1xuICAgICAgcmVxdWVzdC51cGxvYWQuYWRkRXZlbnRMaXN0ZW5lcigncHJvZ3Jlc3MnLCBwcm9ncmVzc0V2ZW50UmVkdWNlcihjb25maWcub25VcGxvYWRQcm9ncmVzcykpO1xuICAgIH1cblxuICAgIGlmIChjb25maWcuY2FuY2VsVG9rZW4gfHwgY29uZmlnLnNpZ25hbCkge1xuICAgICAgLy8gSGFuZGxlIGNhbmNlbGxhdGlvblxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGZ1bmMtbmFtZXNcbiAgICAgIG9uQ2FuY2VsZWQgPSBjYW5jZWwgPT4ge1xuICAgICAgICBpZiAoIXJlcXVlc3QpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KCFjYW5jZWwgfHwgY2FuY2VsLnR5cGUgPyBuZXcgQ2FuY2VsZWRFcnJvcihudWxsLCBjb25maWcsIHJlcXVlc3QpIDogY2FuY2VsKTtcbiAgICAgICAgcmVxdWVzdC5hYm9ydCgpO1xuICAgICAgICByZXF1ZXN0ID0gbnVsbDtcbiAgICAgIH07XG5cbiAgICAgIGNvbmZpZy5jYW5jZWxUb2tlbiAmJiBjb25maWcuY2FuY2VsVG9rZW4uc3Vic2NyaWJlKG9uQ2FuY2VsZWQpO1xuICAgICAgaWYgKGNvbmZpZy5zaWduYWwpIHtcbiAgICAgICAgY29uZmlnLnNpZ25hbC5hYm9ydGVkID8gb25DYW5jZWxlZCgpIDogY29uZmlnLnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsIG9uQ2FuY2VsZWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHByb3RvY29sID0gcGFyc2VQcm90b2NvbChmdWxsUGF0aCk7XG5cbiAgICBpZiAocHJvdG9jb2wgJiYgcGxhdGZvcm0ucHJvdG9jb2xzLmluZGV4T2YocHJvdG9jb2wpID09PSAtMSkge1xuICAgICAgcmVqZWN0KG5ldyBBeGlvc0Vycm9yKCdVbnN1cHBvcnRlZCBwcm90b2NvbCAnICsgcHJvdG9jb2wgKyAnOicsIEF4aW9zRXJyb3IuRVJSX0JBRF9SRVFVRVNULCBjb25maWcpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cblxuICAgIC8vIFNlbmQgdGhlIHJlcXVlc3RcbiAgICByZXF1ZXN0LnNlbmQocmVxdWVzdERhdGEgfHwgbnVsbCk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IHV0aWxzIGZyb20gJy4uL3V0aWxzLmpzJztcbmltcG9ydCBodHRwQWRhcHRlciBmcm9tICcuL2h0dHAuanMnO1xuaW1wb3J0IHhockFkYXB0ZXIgZnJvbSAnLi94aHIuanMnO1xuaW1wb3J0IEF4aW9zRXJyb3IgZnJvbSBcIi4uL2NvcmUvQXhpb3NFcnJvci5qc1wiO1xuXG5jb25zdCBrbm93bkFkYXB0ZXJzID0ge1xuICBodHRwOiBodHRwQWRhcHRlcixcbiAgeGhyOiB4aHJBZGFwdGVyXG59XG5cbnV0aWxzLmZvckVhY2goa25vd25BZGFwdGVycywgKGZuLCB2YWx1ZSkgPT4ge1xuICBpZiAoZm4pIHtcbiAgICB0cnkge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGZuLCAnbmFtZScsIHt2YWx1ZX0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1lbXB0eVxuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZm4sICdhZGFwdGVyTmFtZScsIHt2YWx1ZX0pO1xuICB9XG59KTtcblxuY29uc3QgcmVuZGVyUmVhc29uID0gKHJlYXNvbikgPT4gYC0gJHtyZWFzb259YDtcblxuY29uc3QgaXNSZXNvbHZlZEhhbmRsZSA9IChhZGFwdGVyKSA9PiB1dGlscy5pc0Z1bmN0aW9uKGFkYXB0ZXIpIHx8IGFkYXB0ZXIgPT09IG51bGwgfHwgYWRhcHRlciA9PT0gZmFsc2U7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgZ2V0QWRhcHRlcjogKGFkYXB0ZXJzKSA9PiB7XG4gICAgYWRhcHRlcnMgPSB1dGlscy5pc0FycmF5KGFkYXB0ZXJzKSA/IGFkYXB0ZXJzIDogW2FkYXB0ZXJzXTtcblxuICAgIGNvbnN0IHtsZW5ndGh9ID0gYWRhcHRlcnM7XG4gICAgbGV0IG5hbWVPckFkYXB0ZXI7XG4gICAgbGV0IGFkYXB0ZXI7XG5cbiAgICBjb25zdCByZWplY3RlZFJlYXNvbnMgPSB7fTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIG5hbWVPckFkYXB0ZXIgPSBhZGFwdGVyc1tpXTtcbiAgICAgIGxldCBpZDtcblxuICAgICAgYWRhcHRlciA9IG5hbWVPckFkYXB0ZXI7XG5cbiAgICAgIGlmICghaXNSZXNvbHZlZEhhbmRsZShuYW1lT3JBZGFwdGVyKSkge1xuICAgICAgICBhZGFwdGVyID0ga25vd25BZGFwdGVyc1soaWQgPSBTdHJpbmcobmFtZU9yQWRhcHRlcikpLnRvTG93ZXJDYXNlKCldO1xuXG4gICAgICAgIGlmIChhZGFwdGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgQXhpb3NFcnJvcihgVW5rbm93biBhZGFwdGVyICcke2lkfSdgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoYWRhcHRlcikge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgcmVqZWN0ZWRSZWFzb25zW2lkIHx8ICcjJyArIGldID0gYWRhcHRlcjtcbiAgICB9XG5cbiAgICBpZiAoIWFkYXB0ZXIpIHtcblxuICAgICAgY29uc3QgcmVhc29ucyA9IE9iamVjdC5lbnRyaWVzKHJlamVjdGVkUmVhc29ucylcbiAgICAgICAgLm1hcCgoW2lkLCBzdGF0ZV0pID0+IGBhZGFwdGVyICR7aWR9IGAgK1xuICAgICAgICAgIChzdGF0ZSA9PT0gZmFsc2UgPyAnaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgZW52aXJvbm1lbnQnIDogJ2lzIG5vdCBhdmFpbGFibGUgaW4gdGhlIGJ1aWxkJylcbiAgICAgICAgKTtcblxuICAgICAgbGV0IHMgPSBsZW5ndGggP1xuICAgICAgICAocmVhc29ucy5sZW5ndGggPiAxID8gJ3NpbmNlIDpcXG4nICsgcmVhc29ucy5tYXAocmVuZGVyUmVhc29uKS5qb2luKCdcXG4nKSA6ICcgJyArIHJlbmRlclJlYXNvbihyZWFzb25zWzBdKSkgOlxuICAgICAgICAnYXMgbm8gYWRhcHRlciBzcGVjaWZpZWQnO1xuXG4gICAgICB0aHJvdyBuZXcgQXhpb3NFcnJvcihcbiAgICAgICAgYFRoZXJlIGlzIG5vIHN1aXRhYmxlIGFkYXB0ZXIgdG8gZGlzcGF0Y2ggdGhlIHJlcXVlc3QgYCArIHMsXG4gICAgICAgICdFUlJfTk9UX1NVUFBPUlQnXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBhZGFwdGVyO1xuICB9LFxuICBhZGFwdGVyczoga25vd25BZGFwdGVyc1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgdHJhbnNmb3JtRGF0YSBmcm9tICcuL3RyYW5zZm9ybURhdGEuanMnO1xuaW1wb3J0IGlzQ2FuY2VsIGZyb20gJy4uL2NhbmNlbC9pc0NhbmNlbC5qcyc7XG5pbXBvcnQgZGVmYXVsdHMgZnJvbSAnLi4vZGVmYXVsdHMvaW5kZXguanMnO1xuaW1wb3J0IENhbmNlbGVkRXJyb3IgZnJvbSAnLi4vY2FuY2VsL0NhbmNlbGVkRXJyb3IuanMnO1xuaW1wb3J0IEF4aW9zSGVhZGVycyBmcm9tICcuLi9jb3JlL0F4aW9zSGVhZGVycy5qcyc7XG5pbXBvcnQgYWRhcHRlcnMgZnJvbSBcIi4uL2FkYXB0ZXJzL2FkYXB0ZXJzLmpzXCI7XG5cbi8qKlxuICogVGhyb3dzIGEgYENhbmNlbGVkRXJyb3JgIGlmIGNhbmNlbGxhdGlvbiBoYXMgYmVlbiByZXF1ZXN0ZWQuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZyBUaGUgY29uZmlnIHRoYXQgaXMgdG8gYmUgdXNlZCBmb3IgdGhlIHJlcXVlc3RcbiAqXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gdGhyb3dJZkNhbmNlbGxhdGlvblJlcXVlc3RlZChjb25maWcpIHtcbiAgaWYgKGNvbmZpZy5jYW5jZWxUb2tlbikge1xuICAgIGNvbmZpZy5jYW5jZWxUb2tlbi50aHJvd0lmUmVxdWVzdGVkKCk7XG4gIH1cblxuICBpZiAoY29uZmlnLnNpZ25hbCAmJiBjb25maWcuc2lnbmFsLmFib3J0ZWQpIHtcbiAgICB0aHJvdyBuZXcgQ2FuY2VsZWRFcnJvcihudWxsLCBjb25maWcpO1xuICB9XG59XG5cbi8qKlxuICogRGlzcGF0Y2ggYSByZXF1ZXN0IHRvIHRoZSBzZXJ2ZXIgdXNpbmcgdGhlIGNvbmZpZ3VyZWQgYWRhcHRlci5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gY29uZmlnIFRoZSBjb25maWcgdGhhdCBpcyB0byBiZSB1c2VkIGZvciB0aGUgcmVxdWVzdFxuICpcbiAqIEByZXR1cm5zIHtQcm9taXNlfSBUaGUgUHJvbWlzZSB0byBiZSBmdWxmaWxsZWRcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZGlzcGF0Y2hSZXF1ZXN0KGNvbmZpZykge1xuICB0aHJvd0lmQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKGNvbmZpZyk7XG5cbiAgY29uZmlnLmhlYWRlcnMgPSBBeGlvc0hlYWRlcnMuZnJvbShjb25maWcuaGVhZGVycyk7XG5cbiAgLy8gVHJhbnNmb3JtIHJlcXVlc3QgZGF0YVxuICBjb25maWcuZGF0YSA9IHRyYW5zZm9ybURhdGEuY2FsbChcbiAgICBjb25maWcsXG4gICAgY29uZmlnLnRyYW5zZm9ybVJlcXVlc3RcbiAgKTtcblxuICBpZiAoWydwb3N0JywgJ3B1dCcsICdwYXRjaCddLmluZGV4T2YoY29uZmlnLm1ldGhvZCkgIT09IC0xKSB7XG4gICAgY29uZmlnLmhlYWRlcnMuc2V0Q29udGVudFR5cGUoJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcsIGZhbHNlKTtcbiAgfVxuXG4gIGNvbnN0IGFkYXB0ZXIgPSBhZGFwdGVycy5nZXRBZGFwdGVyKGNvbmZpZy5hZGFwdGVyIHx8IGRlZmF1bHRzLmFkYXB0ZXIpO1xuXG4gIHJldHVybiBhZGFwdGVyKGNvbmZpZykudGhlbihmdW5jdGlvbiBvbkFkYXB0ZXJSZXNvbHV0aW9uKHJlc3BvbnNlKSB7XG4gICAgdGhyb3dJZkNhbmNlbGxhdGlvblJlcXVlc3RlZChjb25maWcpO1xuXG4gICAgLy8gVHJhbnNmb3JtIHJlc3BvbnNlIGRhdGFcbiAgICByZXNwb25zZS5kYXRhID0gdHJhbnNmb3JtRGF0YS5jYWxsKFxuICAgICAgY29uZmlnLFxuICAgICAgY29uZmlnLnRyYW5zZm9ybVJlc3BvbnNlLFxuICAgICAgcmVzcG9uc2VcbiAgICApO1xuXG4gICAgcmVzcG9uc2UuaGVhZGVycyA9IEF4aW9zSGVhZGVycy5mcm9tKHJlc3BvbnNlLmhlYWRlcnMpO1xuXG4gICAgcmV0dXJuIHJlc3BvbnNlO1xuICB9LCBmdW5jdGlvbiBvbkFkYXB0ZXJSZWplY3Rpb24ocmVhc29uKSB7XG4gICAgaWYgKCFpc0NhbmNlbChyZWFzb24pKSB7XG4gICAgICB0aHJvd0lmQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKGNvbmZpZyk7XG5cbiAgICAgIC8vIFRyYW5zZm9ybSByZXNwb25zZSBkYXRhXG4gICAgICBpZiAocmVhc29uICYmIHJlYXNvbi5yZXNwb25zZSkge1xuICAgICAgICByZWFzb24ucmVzcG9uc2UuZGF0YSA9IHRyYW5zZm9ybURhdGEuY2FsbChcbiAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgY29uZmlnLnRyYW5zZm9ybVJlc3BvbnNlLFxuICAgICAgICAgIHJlYXNvbi5yZXNwb25zZVxuICAgICAgICApO1xuICAgICAgICByZWFzb24ucmVzcG9uc2UuaGVhZGVycyA9IEF4aW9zSGVhZGVycy5mcm9tKHJlYXNvbi5yZXNwb25zZS5oZWFkZXJzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QocmVhc29uKTtcbiAgfSk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCB1dGlscyBmcm9tICcuLi91dGlscy5qcyc7XG5pbXBvcnQgQXhpb3NIZWFkZXJzIGZyb20gXCIuL0F4aW9zSGVhZGVycy5qc1wiO1xuXG5jb25zdCBoZWFkZXJzVG9PYmplY3QgPSAodGhpbmcpID0+IHRoaW5nIGluc3RhbmNlb2YgQXhpb3NIZWFkZXJzID8gdGhpbmcudG9KU09OKCkgOiB0aGluZztcblxuLyoqXG4gKiBDb25maWctc3BlY2lmaWMgbWVyZ2UtZnVuY3Rpb24gd2hpY2ggY3JlYXRlcyBhIG5ldyBjb25maWctb2JqZWN0XG4gKiBieSBtZXJnaW5nIHR3byBjb25maWd1cmF0aW9uIG9iamVjdHMgdG9nZXRoZXIuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZzFcbiAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcyXG4gKlxuICogQHJldHVybnMge09iamVjdH0gTmV3IG9iamVjdCByZXN1bHRpbmcgZnJvbSBtZXJnaW5nIGNvbmZpZzIgdG8gY29uZmlnMVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBtZXJnZUNvbmZpZyhjb25maWcxLCBjb25maWcyKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICBjb25maWcyID0gY29uZmlnMiB8fCB7fTtcbiAgY29uc3QgY29uZmlnID0ge307XG5cbiAgZnVuY3Rpb24gZ2V0TWVyZ2VkVmFsdWUodGFyZ2V0LCBzb3VyY2UsIGNhc2VsZXNzKSB7XG4gICAgaWYgKHV0aWxzLmlzUGxhaW5PYmplY3QodGFyZ2V0KSAmJiB1dGlscy5pc1BsYWluT2JqZWN0KHNvdXJjZSkpIHtcbiAgICAgIHJldHVybiB1dGlscy5tZXJnZS5jYWxsKHtjYXNlbGVzc30sIHRhcmdldCwgc291cmNlKTtcbiAgICB9IGVsc2UgaWYgKHV0aWxzLmlzUGxhaW5PYmplY3Qoc291cmNlKSkge1xuICAgICAgcmV0dXJuIHV0aWxzLm1lcmdlKHt9LCBzb3VyY2UpO1xuICAgIH0gZWxzZSBpZiAodXRpbHMuaXNBcnJheShzb3VyY2UpKSB7XG4gICAgICByZXR1cm4gc291cmNlLnNsaWNlKCk7XG4gICAgfVxuICAgIHJldHVybiBzb3VyY2U7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29uc2lzdGVudC1yZXR1cm5cbiAgZnVuY3Rpb24gbWVyZ2VEZWVwUHJvcGVydGllcyhhLCBiLCBjYXNlbGVzcykge1xuICAgIGlmICghdXRpbHMuaXNVbmRlZmluZWQoYikpIHtcbiAgICAgIHJldHVybiBnZXRNZXJnZWRWYWx1ZShhLCBiLCBjYXNlbGVzcyk7XG4gICAgfSBlbHNlIGlmICghdXRpbHMuaXNVbmRlZmluZWQoYSkpIHtcbiAgICAgIHJldHVybiBnZXRNZXJnZWRWYWx1ZSh1bmRlZmluZWQsIGEsIGNhc2VsZXNzKTtcbiAgICB9XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29uc2lzdGVudC1yZXR1cm5cbiAgZnVuY3Rpb24gdmFsdWVGcm9tQ29uZmlnMihhLCBiKSB7XG4gICAgaWYgKCF1dGlscy5pc1VuZGVmaW5lZChiKSkge1xuICAgICAgcmV0dXJuIGdldE1lcmdlZFZhbHVlKHVuZGVmaW5lZCwgYik7XG4gICAgfVxuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbnNpc3RlbnQtcmV0dXJuXG4gIGZ1bmN0aW9uIGRlZmF1bHRUb0NvbmZpZzIoYSwgYikge1xuICAgIGlmICghdXRpbHMuaXNVbmRlZmluZWQoYikpIHtcbiAgICAgIHJldHVybiBnZXRNZXJnZWRWYWx1ZSh1bmRlZmluZWQsIGIpO1xuICAgIH0gZWxzZSBpZiAoIXV0aWxzLmlzVW5kZWZpbmVkKGEpKSB7XG4gICAgICByZXR1cm4gZ2V0TWVyZ2VkVmFsdWUodW5kZWZpbmVkLCBhKTtcbiAgICB9XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29uc2lzdGVudC1yZXR1cm5cbiAgZnVuY3Rpb24gbWVyZ2VEaXJlY3RLZXlzKGEsIGIsIHByb3ApIHtcbiAgICBpZiAocHJvcCBpbiBjb25maWcyKSB7XG4gICAgICByZXR1cm4gZ2V0TWVyZ2VkVmFsdWUoYSwgYik7XG4gICAgfSBlbHNlIGlmIChwcm9wIGluIGNvbmZpZzEpIHtcbiAgICAgIHJldHVybiBnZXRNZXJnZWRWYWx1ZSh1bmRlZmluZWQsIGEpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IG1lcmdlTWFwID0ge1xuICAgIHVybDogdmFsdWVGcm9tQ29uZmlnMixcbiAgICBtZXRob2Q6IHZhbHVlRnJvbUNvbmZpZzIsXG4gICAgZGF0YTogdmFsdWVGcm9tQ29uZmlnMixcbiAgICBiYXNlVVJMOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIHRyYW5zZm9ybVJlcXVlc3Q6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgdHJhbnNmb3JtUmVzcG9uc2U6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgcGFyYW1zU2VyaWFsaXplcjogZGVmYXVsdFRvQ29uZmlnMixcbiAgICB0aW1lb3V0OiBkZWZhdWx0VG9Db25maWcyLFxuICAgIHRpbWVvdXRNZXNzYWdlOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIHdpdGhDcmVkZW50aWFsczogZGVmYXVsdFRvQ29uZmlnMixcbiAgICB3aXRoWFNSRlRva2VuOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIGFkYXB0ZXI6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgcmVzcG9uc2VUeXBlOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIHhzcmZDb29raWVOYW1lOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIHhzcmZIZWFkZXJOYW1lOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIG9uVXBsb2FkUHJvZ3Jlc3M6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgb25Eb3dubG9hZFByb2dyZXNzOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIGRlY29tcHJlc3M6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgbWF4Q29udGVudExlbmd0aDogZGVmYXVsdFRvQ29uZmlnMixcbiAgICBtYXhCb2R5TGVuZ3RoOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIGJlZm9yZVJlZGlyZWN0OiBkZWZhdWx0VG9Db25maWcyLFxuICAgIHRyYW5zcG9ydDogZGVmYXVsdFRvQ29uZmlnMixcbiAgICBodHRwQWdlbnQ6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgaHR0cHNBZ2VudDogZGVmYXVsdFRvQ29uZmlnMixcbiAgICBjYW5jZWxUb2tlbjogZGVmYXVsdFRvQ29uZmlnMixcbiAgICBzb2NrZXRQYXRoOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIHJlc3BvbnNlRW5jb2Rpbmc6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgdmFsaWRhdGVTdGF0dXM6IG1lcmdlRGlyZWN0S2V5cyxcbiAgICBoZWFkZXJzOiAoYSwgYikgPT4gbWVyZ2VEZWVwUHJvcGVydGllcyhoZWFkZXJzVG9PYmplY3QoYSksIGhlYWRlcnNUb09iamVjdChiKSwgdHJ1ZSlcbiAgfTtcblxuICB1dGlscy5mb3JFYWNoKE9iamVjdC5rZXlzKE9iamVjdC5hc3NpZ24oe30sIGNvbmZpZzEsIGNvbmZpZzIpKSwgZnVuY3Rpb24gY29tcHV0ZUNvbmZpZ1ZhbHVlKHByb3ApIHtcbiAgICBjb25zdCBtZXJnZSA9IG1lcmdlTWFwW3Byb3BdIHx8IG1lcmdlRGVlcFByb3BlcnRpZXM7XG4gICAgY29uc3QgY29uZmlnVmFsdWUgPSBtZXJnZShjb25maWcxW3Byb3BdLCBjb25maWcyW3Byb3BdLCBwcm9wKTtcbiAgICAodXRpbHMuaXNVbmRlZmluZWQoY29uZmlnVmFsdWUpICYmIG1lcmdlICE9PSBtZXJnZURpcmVjdEtleXMpIHx8IChjb25maWdbcHJvcF0gPSBjb25maWdWYWx1ZSk7XG4gIH0pO1xuXG4gIHJldHVybiBjb25maWc7XG59XG4iLCJleHBvcnQgY29uc3QgVkVSU0lPTiA9IFwiMS42LjdcIjsiLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCB7VkVSU0lPTn0gZnJvbSAnLi4vZW52L2RhdGEuanMnO1xuaW1wb3J0IEF4aW9zRXJyb3IgZnJvbSAnLi4vY29yZS9BeGlvc0Vycm9yLmpzJztcblxuY29uc3QgdmFsaWRhdG9ycyA9IHt9O1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZnVuYy1uYW1lc1xuWydvYmplY3QnLCAnYm9vbGVhbicsICdudW1iZXInLCAnZnVuY3Rpb24nLCAnc3RyaW5nJywgJ3N5bWJvbCddLmZvckVhY2goKHR5cGUsIGkpID0+IHtcbiAgdmFsaWRhdG9yc1t0eXBlXSA9IGZ1bmN0aW9uIHZhbGlkYXRvcih0aGluZykge1xuICAgIHJldHVybiB0eXBlb2YgdGhpbmcgPT09IHR5cGUgfHwgJ2EnICsgKGkgPCAxID8gJ24gJyA6ICcgJykgKyB0eXBlO1xuICB9O1xufSk7XG5cbmNvbnN0IGRlcHJlY2F0ZWRXYXJuaW5ncyA9IHt9O1xuXG4vKipcbiAqIFRyYW5zaXRpb25hbCBvcHRpb24gdmFsaWRhdG9yXG4gKlxuICogQHBhcmFtIHtmdW5jdGlvbnxib29sZWFuP30gdmFsaWRhdG9yIC0gc2V0IHRvIGZhbHNlIGlmIHRoZSB0cmFuc2l0aW9uYWwgb3B0aW9uIGhhcyBiZWVuIHJlbW92ZWRcbiAqIEBwYXJhbSB7c3RyaW5nP30gdmVyc2lvbiAtIGRlcHJlY2F0ZWQgdmVyc2lvbiAvIHJlbW92ZWQgc2luY2UgdmVyc2lvblxuICogQHBhcmFtIHtzdHJpbmc/fSBtZXNzYWdlIC0gc29tZSBtZXNzYWdlIHdpdGggYWRkaXRpb25hbCBpbmZvXG4gKlxuICogQHJldHVybnMge2Z1bmN0aW9ufVxuICovXG52YWxpZGF0b3JzLnRyYW5zaXRpb25hbCA9IGZ1bmN0aW9uIHRyYW5zaXRpb25hbCh2YWxpZGF0b3IsIHZlcnNpb24sIG1lc3NhZ2UpIHtcbiAgZnVuY3Rpb24gZm9ybWF0TWVzc2FnZShvcHQsIGRlc2MpIHtcbiAgICByZXR1cm4gJ1tBeGlvcyB2JyArIFZFUlNJT04gKyAnXSBUcmFuc2l0aW9uYWwgb3B0aW9uIFxcJycgKyBvcHQgKyAnXFwnJyArIGRlc2MgKyAobWVzc2FnZSA/ICcuICcgKyBtZXNzYWdlIDogJycpO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGZ1bmMtbmFtZXNcbiAgcmV0dXJuICh2YWx1ZSwgb3B0LCBvcHRzKSA9PiB7XG4gICAgaWYgKHZhbGlkYXRvciA9PT0gZmFsc2UpIHtcbiAgICAgIHRocm93IG5ldyBBeGlvc0Vycm9yKFxuICAgICAgICBmb3JtYXRNZXNzYWdlKG9wdCwgJyBoYXMgYmVlbiByZW1vdmVkJyArICh2ZXJzaW9uID8gJyBpbiAnICsgdmVyc2lvbiA6ICcnKSksXG4gICAgICAgIEF4aW9zRXJyb3IuRVJSX0RFUFJFQ0FURURcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHZlcnNpb24gJiYgIWRlcHJlY2F0ZWRXYXJuaW5nc1tvcHRdKSB7XG4gICAgICBkZXByZWNhdGVkV2FybmluZ3Nbb3B0XSA9IHRydWU7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBmb3JtYXRNZXNzYWdlKFxuICAgICAgICAgIG9wdCxcbiAgICAgICAgICAnIGhhcyBiZWVuIGRlcHJlY2F0ZWQgc2luY2UgdicgKyB2ZXJzaW9uICsgJyBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZWFyIGZ1dHVyZSdcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsaWRhdG9yID8gdmFsaWRhdG9yKHZhbHVlLCBvcHQsIG9wdHMpIDogdHJ1ZTtcbiAgfTtcbn07XG5cbi8qKlxuICogQXNzZXJ0IG9iamVjdCdzIHByb3BlcnRpZXMgdHlwZVxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gKiBAcGFyYW0ge29iamVjdH0gc2NoZW1hXG4gKiBAcGFyYW0ge2Jvb2xlYW4/fSBhbGxvd1Vua25vd25cbiAqXG4gKiBAcmV0dXJucyB7b2JqZWN0fVxuICovXG5cbmZ1bmN0aW9uIGFzc2VydE9wdGlvbnMob3B0aW9ucywgc2NoZW1hLCBhbGxvd1Vua25vd24pIHtcbiAgaWYgKHR5cGVvZiBvcHRpb25zICE9PSAnb2JqZWN0Jykge1xuICAgIHRocm93IG5ldyBBeGlvc0Vycm9yKCdvcHRpb25zIG11c3QgYmUgYW4gb2JqZWN0JywgQXhpb3NFcnJvci5FUlJfQkFEX09QVElPTl9WQUxVRSk7XG4gIH1cbiAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKG9wdGlvbnMpO1xuICBsZXQgaSA9IGtleXMubGVuZ3RoO1xuICB3aGlsZSAoaS0tID4gMCkge1xuICAgIGNvbnN0IG9wdCA9IGtleXNbaV07XG4gICAgY29uc3QgdmFsaWRhdG9yID0gc2NoZW1hW29wdF07XG4gICAgaWYgKHZhbGlkYXRvcikge1xuICAgICAgY29uc3QgdmFsdWUgPSBvcHRpb25zW29wdF07XG4gICAgICBjb25zdCByZXN1bHQgPSB2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbGlkYXRvcih2YWx1ZSwgb3B0LCBvcHRpb25zKTtcbiAgICAgIGlmIChyZXN1bHQgIT09IHRydWUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEF4aW9zRXJyb3IoJ29wdGlvbiAnICsgb3B0ICsgJyBtdXN0IGJlICcgKyByZXN1bHQsIEF4aW9zRXJyb3IuRVJSX0JBRF9PUFRJT05fVkFMVUUpO1xuICAgICAgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChhbGxvd1Vua25vd24gIT09IHRydWUpIHtcbiAgICAgIHRocm93IG5ldyBBeGlvc0Vycm9yKCdVbmtub3duIG9wdGlvbiAnICsgb3B0LCBBeGlvc0Vycm9yLkVSUl9CQURfT1BUSU9OKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICBhc3NlcnRPcHRpb25zLFxuICB2YWxpZGF0b3JzXG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgdXRpbHMgZnJvbSAnLi8uLi91dGlscy5qcyc7XG5pbXBvcnQgYnVpbGRVUkwgZnJvbSAnLi4vaGVscGVycy9idWlsZFVSTC5qcyc7XG5pbXBvcnQgSW50ZXJjZXB0b3JNYW5hZ2VyIGZyb20gJy4vSW50ZXJjZXB0b3JNYW5hZ2VyLmpzJztcbmltcG9ydCBkaXNwYXRjaFJlcXVlc3QgZnJvbSAnLi9kaXNwYXRjaFJlcXVlc3QuanMnO1xuaW1wb3J0IG1lcmdlQ29uZmlnIGZyb20gJy4vbWVyZ2VDb25maWcuanMnO1xuaW1wb3J0IGJ1aWxkRnVsbFBhdGggZnJvbSAnLi9idWlsZEZ1bGxQYXRoLmpzJztcbmltcG9ydCB2YWxpZGF0b3IgZnJvbSAnLi4vaGVscGVycy92YWxpZGF0b3IuanMnO1xuaW1wb3J0IEF4aW9zSGVhZGVycyBmcm9tICcuL0F4aW9zSGVhZGVycy5qcyc7XG5cbmNvbnN0IHZhbGlkYXRvcnMgPSB2YWxpZGF0b3IudmFsaWRhdG9ycztcblxuLyoqXG4gKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgQXhpb3NcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gaW5zdGFuY2VDb25maWcgVGhlIGRlZmF1bHQgY29uZmlnIGZvciB0aGUgaW5zdGFuY2VcbiAqXG4gKiBAcmV0dXJuIHtBeGlvc30gQSBuZXcgaW5zdGFuY2Ugb2YgQXhpb3NcbiAqL1xuY2xhc3MgQXhpb3Mge1xuICBjb25zdHJ1Y3RvcihpbnN0YW5jZUNvbmZpZykge1xuICAgIHRoaXMuZGVmYXVsdHMgPSBpbnN0YW5jZUNvbmZpZztcbiAgICB0aGlzLmludGVyY2VwdG9ycyA9IHtcbiAgICAgIHJlcXVlc3Q6IG5ldyBJbnRlcmNlcHRvck1hbmFnZXIoKSxcbiAgICAgIHJlc3BvbnNlOiBuZXcgSW50ZXJjZXB0b3JNYW5hZ2VyKClcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3BhdGNoIGEgcmVxdWVzdFxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ3xPYmplY3R9IGNvbmZpZ09yVXJsIFRoZSBjb25maWcgc3BlY2lmaWMgZm9yIHRoaXMgcmVxdWVzdCAobWVyZ2VkIHdpdGggdGhpcy5kZWZhdWx0cylcbiAgICogQHBhcmFtIHs/T2JqZWN0fSBjb25maWdcbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2V9IFRoZSBQcm9taXNlIHRvIGJlIGZ1bGZpbGxlZFxuICAgKi9cbiAgYXN5bmMgcmVxdWVzdChjb25maWdPclVybCwgY29uZmlnKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLl9yZXF1ZXN0KGNvbmZpZ09yVXJsLCBjb25maWcpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIGxldCBkdW1teTtcblxuICAgICAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSA/IEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKGR1bW15ID0ge30pIDogKGR1bW15ID0gbmV3IEVycm9yKCkpO1xuXG4gICAgICAgIC8vIHNsaWNlIG9mZiB0aGUgRXJyb3I6IC4uLiBsaW5lXG4gICAgICAgIGNvbnN0IHN0YWNrID0gZHVtbXkuc3RhY2sgPyBkdW1teS5zdGFjay5yZXBsYWNlKC9eLitcXG4vLCAnJykgOiAnJztcblxuICAgICAgICBpZiAoIWVyci5zdGFjaykge1xuICAgICAgICAgIGVyci5zdGFjayA9IHN0YWNrO1xuICAgICAgICAgIC8vIG1hdGNoIHdpdGhvdXQgdGhlIDIgdG9wIHN0YWNrIGxpbmVzXG4gICAgICAgIH0gZWxzZSBpZiAoc3RhY2sgJiYgIVN0cmluZyhlcnIuc3RhY2spLmVuZHNXaXRoKHN0YWNrLnJlcGxhY2UoL14uK1xcbi4rXFxuLywgJycpKSkge1xuICAgICAgICAgIGVyci5zdGFjayArPSAnXFxuJyArIHN0YWNrXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgfVxuXG4gIF9yZXF1ZXN0KGNvbmZpZ09yVXJsLCBjb25maWcpIHtcbiAgICAvKmVzbGludCBuby1wYXJhbS1yZWFzc2lnbjowKi9cbiAgICAvLyBBbGxvdyBmb3IgYXhpb3MoJ2V4YW1wbGUvdXJsJ1ssIGNvbmZpZ10pIGEgbGEgZmV0Y2ggQVBJXG4gICAgaWYgKHR5cGVvZiBjb25maWdPclVybCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbmZpZyA9IGNvbmZpZyB8fCB7fTtcbiAgICAgIGNvbmZpZy51cmwgPSBjb25maWdPclVybDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uZmlnID0gY29uZmlnT3JVcmwgfHwge307XG4gICAgfVxuXG4gICAgY29uZmlnID0gbWVyZ2VDb25maWcodGhpcy5kZWZhdWx0cywgY29uZmlnKTtcblxuICAgIGNvbnN0IHt0cmFuc2l0aW9uYWwsIHBhcmFtc1NlcmlhbGl6ZXIsIGhlYWRlcnN9ID0gY29uZmlnO1xuXG4gICAgaWYgKHRyYW5zaXRpb25hbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB2YWxpZGF0b3IuYXNzZXJ0T3B0aW9ucyh0cmFuc2l0aW9uYWwsIHtcbiAgICAgICAgc2lsZW50SlNPTlBhcnNpbmc6IHZhbGlkYXRvcnMudHJhbnNpdGlvbmFsKHZhbGlkYXRvcnMuYm9vbGVhbiksXG4gICAgICAgIGZvcmNlZEpTT05QYXJzaW5nOiB2YWxpZGF0b3JzLnRyYW5zaXRpb25hbCh2YWxpZGF0b3JzLmJvb2xlYW4pLFxuICAgICAgICBjbGFyaWZ5VGltZW91dEVycm9yOiB2YWxpZGF0b3JzLnRyYW5zaXRpb25hbCh2YWxpZGF0b3JzLmJvb2xlYW4pXG4gICAgICB9LCBmYWxzZSk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtc1NlcmlhbGl6ZXIgIT0gbnVsbCkge1xuICAgICAgaWYgKHV0aWxzLmlzRnVuY3Rpb24ocGFyYW1zU2VyaWFsaXplcikpIHtcbiAgICAgICAgY29uZmlnLnBhcmFtc1NlcmlhbGl6ZXIgPSB7XG4gICAgICAgICAgc2VyaWFsaXplOiBwYXJhbXNTZXJpYWxpemVyXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbGlkYXRvci5hc3NlcnRPcHRpb25zKHBhcmFtc1NlcmlhbGl6ZXIsIHtcbiAgICAgICAgICBlbmNvZGU6IHZhbGlkYXRvcnMuZnVuY3Rpb24sXG4gICAgICAgICAgc2VyaWFsaXplOiB2YWxpZGF0b3JzLmZ1bmN0aW9uXG4gICAgICAgIH0sIHRydWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNldCBjb25maWcubWV0aG9kXG4gICAgY29uZmlnLm1ldGhvZCA9IChjb25maWcubWV0aG9kIHx8IHRoaXMuZGVmYXVsdHMubWV0aG9kIHx8ICdnZXQnKS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgLy8gRmxhdHRlbiBoZWFkZXJzXG4gICAgbGV0IGNvbnRleHRIZWFkZXJzID0gaGVhZGVycyAmJiB1dGlscy5tZXJnZShcbiAgICAgIGhlYWRlcnMuY29tbW9uLFxuICAgICAgaGVhZGVyc1tjb25maWcubWV0aG9kXVxuICAgICk7XG5cbiAgICBoZWFkZXJzICYmIHV0aWxzLmZvckVhY2goXG4gICAgICBbJ2RlbGV0ZScsICdnZXQnLCAnaGVhZCcsICdwb3N0JywgJ3B1dCcsICdwYXRjaCcsICdjb21tb24nXSxcbiAgICAgIChtZXRob2QpID0+IHtcbiAgICAgICAgZGVsZXRlIGhlYWRlcnNbbWV0aG9kXTtcbiAgICAgIH1cbiAgICApO1xuXG4gICAgY29uZmlnLmhlYWRlcnMgPSBBeGlvc0hlYWRlcnMuY29uY2F0KGNvbnRleHRIZWFkZXJzLCBoZWFkZXJzKTtcblxuICAgIC8vIGZpbHRlciBvdXQgc2tpcHBlZCBpbnRlcmNlcHRvcnNcbiAgICBjb25zdCByZXF1ZXN0SW50ZXJjZXB0b3JDaGFpbiA9IFtdO1xuICAgIGxldCBzeW5jaHJvbm91c1JlcXVlc3RJbnRlcmNlcHRvcnMgPSB0cnVlO1xuICAgIHRoaXMuaW50ZXJjZXB0b3JzLnJlcXVlc3QuZm9yRWFjaChmdW5jdGlvbiB1bnNoaWZ0UmVxdWVzdEludGVyY2VwdG9ycyhpbnRlcmNlcHRvcikge1xuICAgICAgaWYgKHR5cGVvZiBpbnRlcmNlcHRvci5ydW5XaGVuID09PSAnZnVuY3Rpb24nICYmIGludGVyY2VwdG9yLnJ1bldoZW4oY29uZmlnKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBzeW5jaHJvbm91c1JlcXVlc3RJbnRlcmNlcHRvcnMgPSBzeW5jaHJvbm91c1JlcXVlc3RJbnRlcmNlcHRvcnMgJiYgaW50ZXJjZXB0b3Iuc3luY2hyb25vdXM7XG5cbiAgICAgIHJlcXVlc3RJbnRlcmNlcHRvckNoYWluLnVuc2hpZnQoaW50ZXJjZXB0b3IuZnVsZmlsbGVkLCBpbnRlcmNlcHRvci5yZWplY3RlZCk7XG4gICAgfSk7XG5cbiAgICBjb25zdCByZXNwb25zZUludGVyY2VwdG9yQ2hhaW4gPSBbXTtcbiAgICB0aGlzLmludGVyY2VwdG9ycy5yZXNwb25zZS5mb3JFYWNoKGZ1bmN0aW9uIHB1c2hSZXNwb25zZUludGVyY2VwdG9ycyhpbnRlcmNlcHRvcikge1xuICAgICAgcmVzcG9uc2VJbnRlcmNlcHRvckNoYWluLnB1c2goaW50ZXJjZXB0b3IuZnVsZmlsbGVkLCBpbnRlcmNlcHRvci5yZWplY3RlZCk7XG4gICAgfSk7XG5cbiAgICBsZXQgcHJvbWlzZTtcbiAgICBsZXQgaSA9IDA7XG4gICAgbGV0IGxlbjtcblxuICAgIGlmICghc3luY2hyb25vdXNSZXF1ZXN0SW50ZXJjZXB0b3JzKSB7XG4gICAgICBjb25zdCBjaGFpbiA9IFtkaXNwYXRjaFJlcXVlc3QuYmluZCh0aGlzKSwgdW5kZWZpbmVkXTtcbiAgICAgIGNoYWluLnVuc2hpZnQuYXBwbHkoY2hhaW4sIHJlcXVlc3RJbnRlcmNlcHRvckNoYWluKTtcbiAgICAgIGNoYWluLnB1c2guYXBwbHkoY2hhaW4sIHJlc3BvbnNlSW50ZXJjZXB0b3JDaGFpbik7XG4gICAgICBsZW4gPSBjaGFpbi5sZW5ndGg7XG5cbiAgICAgIHByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoY29uZmlnKTtcblxuICAgICAgd2hpbGUgKGkgPCBsZW4pIHtcbiAgICAgICAgcHJvbWlzZSA9IHByb21pc2UudGhlbihjaGFpbltpKytdLCBjaGFpbltpKytdKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgfVxuXG4gICAgbGVuID0gcmVxdWVzdEludGVyY2VwdG9yQ2hhaW4ubGVuZ3RoO1xuXG4gICAgbGV0IG5ld0NvbmZpZyA9IGNvbmZpZztcblxuICAgIGkgPSAwO1xuXG4gICAgd2hpbGUgKGkgPCBsZW4pIHtcbiAgICAgIGNvbnN0IG9uRnVsZmlsbGVkID0gcmVxdWVzdEludGVyY2VwdG9yQ2hhaW5baSsrXTtcbiAgICAgIGNvbnN0IG9uUmVqZWN0ZWQgPSByZXF1ZXN0SW50ZXJjZXB0b3JDaGFpbltpKytdO1xuICAgICAgdHJ5IHtcbiAgICAgICAgbmV3Q29uZmlnID0gb25GdWxmaWxsZWQobmV3Q29uZmlnKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIG9uUmVqZWN0ZWQuY2FsbCh0aGlzLCBlcnJvcik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBwcm9taXNlID0gZGlzcGF0Y2hSZXF1ZXN0LmNhbGwodGhpcywgbmV3Q29uZmlnKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKTtcbiAgICB9XG5cbiAgICBpID0gMDtcbiAgICBsZW4gPSByZXNwb25zZUludGVyY2VwdG9yQ2hhaW4ubGVuZ3RoO1xuXG4gICAgd2hpbGUgKGkgPCBsZW4pIHtcbiAgICAgIHByb21pc2UgPSBwcm9taXNlLnRoZW4ocmVzcG9uc2VJbnRlcmNlcHRvckNoYWluW2krK10sIHJlc3BvbnNlSW50ZXJjZXB0b3JDaGFpbltpKytdKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcHJvbWlzZTtcbiAgfVxuXG4gIGdldFVyaShjb25maWcpIHtcbiAgICBjb25maWcgPSBtZXJnZUNvbmZpZyh0aGlzLmRlZmF1bHRzLCBjb25maWcpO1xuICAgIGNvbnN0IGZ1bGxQYXRoID0gYnVpbGRGdWxsUGF0aChjb25maWcuYmFzZVVSTCwgY29uZmlnLnVybCk7XG4gICAgcmV0dXJuIGJ1aWxkVVJMKGZ1bGxQYXRoLCBjb25maWcucGFyYW1zLCBjb25maWcucGFyYW1zU2VyaWFsaXplcik7XG4gIH1cbn1cblxuLy8gUHJvdmlkZSBhbGlhc2VzIGZvciBzdXBwb3J0ZWQgcmVxdWVzdCBtZXRob2RzXG51dGlscy5mb3JFYWNoKFsnZGVsZXRlJywgJ2dldCcsICdoZWFkJywgJ29wdGlvbnMnXSwgZnVuY3Rpb24gZm9yRWFjaE1ldGhvZE5vRGF0YShtZXRob2QpIHtcbiAgLyplc2xpbnQgZnVuYy1uYW1lczowKi9cbiAgQXhpb3MucHJvdG90eXBlW21ldGhvZF0gPSBmdW5jdGlvbih1cmwsIGNvbmZpZykge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QobWVyZ2VDb25maWcoY29uZmlnIHx8IHt9LCB7XG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICBkYXRhOiAoY29uZmlnIHx8IHt9KS5kYXRhXG4gICAgfSkpO1xuICB9O1xufSk7XG5cbnV0aWxzLmZvckVhY2goWydwb3N0JywgJ3B1dCcsICdwYXRjaCddLCBmdW5jdGlvbiBmb3JFYWNoTWV0aG9kV2l0aERhdGEobWV0aG9kKSB7XG4gIC8qZXNsaW50IGZ1bmMtbmFtZXM6MCovXG5cbiAgZnVuY3Rpb24gZ2VuZXJhdGVIVFRQTWV0aG9kKGlzRm9ybSkge1xuICAgIHJldHVybiBmdW5jdGlvbiBodHRwTWV0aG9kKHVybCwgZGF0YSwgY29uZmlnKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KG1lcmdlQ29uZmlnKGNvbmZpZyB8fCB7fSwge1xuICAgICAgICBtZXRob2QsXG4gICAgICAgIGhlYWRlcnM6IGlzRm9ybSA/IHtcbiAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ211bHRpcGFydC9mb3JtLWRhdGEnXG4gICAgICAgIH0gOiB7fSxcbiAgICAgICAgdXJsLFxuICAgICAgICBkYXRhXG4gICAgICB9KSk7XG4gICAgfTtcbiAgfVxuXG4gIEF4aW9zLnByb3RvdHlwZVttZXRob2RdID0gZ2VuZXJhdGVIVFRQTWV0aG9kKCk7XG5cbiAgQXhpb3MucHJvdG90eXBlW21ldGhvZCArICdGb3JtJ10gPSBnZW5lcmF0ZUhUVFBNZXRob2QodHJ1ZSk7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgQXhpb3M7XG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCBDYW5jZWxlZEVycm9yIGZyb20gJy4vQ2FuY2VsZWRFcnJvci5qcyc7XG5cbi8qKlxuICogQSBgQ2FuY2VsVG9rZW5gIGlzIGFuIG9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIHRvIHJlcXVlc3QgY2FuY2VsbGF0aW9uIG9mIGFuIG9wZXJhdGlvbi5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBleGVjdXRvciBUaGUgZXhlY3V0b3IgZnVuY3Rpb24uXG4gKlxuICogQHJldHVybnMge0NhbmNlbFRva2VufVxuICovXG5jbGFzcyBDYW5jZWxUb2tlbiB7XG4gIGNvbnN0cnVjdG9yKGV4ZWN1dG9yKSB7XG4gICAgaWYgKHR5cGVvZiBleGVjdXRvciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZXhlY3V0b3IgbXVzdCBiZSBhIGZ1bmN0aW9uLicpO1xuICAgIH1cblxuICAgIGxldCByZXNvbHZlUHJvbWlzZTtcblxuICAgIHRoaXMucHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIHByb21pc2VFeGVjdXRvcihyZXNvbHZlKSB7XG4gICAgICByZXNvbHZlUHJvbWlzZSA9IHJlc29sdmU7XG4gICAgfSk7XG5cbiAgICBjb25zdCB0b2tlbiA9IHRoaXM7XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZnVuYy1uYW1lc1xuICAgIHRoaXMucHJvbWlzZS50aGVuKGNhbmNlbCA9PiB7XG4gICAgICBpZiAoIXRva2VuLl9saXN0ZW5lcnMpIHJldHVybjtcblxuICAgICAgbGV0IGkgPSB0b2tlbi5fbGlzdGVuZXJzLmxlbmd0aDtcblxuICAgICAgd2hpbGUgKGktLSA+IDApIHtcbiAgICAgICAgdG9rZW4uX2xpc3RlbmVyc1tpXShjYW5jZWwpO1xuICAgICAgfVxuICAgICAgdG9rZW4uX2xpc3RlbmVycyA9IG51bGw7XG4gICAgfSk7XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZnVuYy1uYW1lc1xuICAgIHRoaXMucHJvbWlzZS50aGVuID0gb25mdWxmaWxsZWQgPT4ge1xuICAgICAgbGV0IF9yZXNvbHZlO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGZ1bmMtbmFtZXNcbiAgICAgIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgdG9rZW4uc3Vic2NyaWJlKHJlc29sdmUpO1xuICAgICAgICBfcmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgICB9KS50aGVuKG9uZnVsZmlsbGVkKTtcblxuICAgICAgcHJvbWlzZS5jYW5jZWwgPSBmdW5jdGlvbiByZWplY3QoKSB7XG4gICAgICAgIHRva2VuLnVuc3Vic2NyaWJlKF9yZXNvbHZlKTtcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH07XG5cbiAgICBleGVjdXRvcihmdW5jdGlvbiBjYW5jZWwobWVzc2FnZSwgY29uZmlnLCByZXF1ZXN0KSB7XG4gICAgICBpZiAodG9rZW4ucmVhc29uKSB7XG4gICAgICAgIC8vIENhbmNlbGxhdGlvbiBoYXMgYWxyZWFkeSBiZWVuIHJlcXVlc3RlZFxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRva2VuLnJlYXNvbiA9IG5ldyBDYW5jZWxlZEVycm9yKG1lc3NhZ2UsIGNvbmZpZywgcmVxdWVzdCk7XG4gICAgICByZXNvbHZlUHJvbWlzZSh0b2tlbi5yZWFzb24pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRocm93cyBhIGBDYW5jZWxlZEVycm9yYCBpZiBjYW5jZWxsYXRpb24gaGFzIGJlZW4gcmVxdWVzdGVkLlxuICAgKi9cbiAgdGhyb3dJZlJlcXVlc3RlZCgpIHtcbiAgICBpZiAodGhpcy5yZWFzb24pIHtcbiAgICAgIHRocm93IHRoaXMucmVhc29uO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJzY3JpYmUgdG8gdGhlIGNhbmNlbCBzaWduYWxcbiAgICovXG5cbiAgc3Vic2NyaWJlKGxpc3RlbmVyKSB7XG4gICAgaWYgKHRoaXMucmVhc29uKSB7XG4gICAgICBsaXN0ZW5lcih0aGlzLnJlYXNvbik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2xpc3RlbmVycykge1xuICAgICAgdGhpcy5fbGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9saXN0ZW5lcnMgPSBbbGlzdGVuZXJdO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVbnN1YnNjcmliZSBmcm9tIHRoZSBjYW5jZWwgc2lnbmFsXG4gICAqL1xuXG4gIHVuc3Vic2NyaWJlKGxpc3RlbmVyKSB7XG4gICAgaWYgKCF0aGlzLl9saXN0ZW5lcnMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLl9saXN0ZW5lcnMuaW5kZXhPZihsaXN0ZW5lcik7XG4gICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgdGhpcy5fbGlzdGVuZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gb2JqZWN0IHRoYXQgY29udGFpbnMgYSBuZXcgYENhbmNlbFRva2VuYCBhbmQgYSBmdW5jdGlvbiB0aGF0LCB3aGVuIGNhbGxlZCxcbiAgICogY2FuY2VscyB0aGUgYENhbmNlbFRva2VuYC5cbiAgICovXG4gIHN0YXRpYyBzb3VyY2UoKSB7XG4gICAgbGV0IGNhbmNlbDtcbiAgICBjb25zdCB0b2tlbiA9IG5ldyBDYW5jZWxUb2tlbihmdW5jdGlvbiBleGVjdXRvcihjKSB7XG4gICAgICBjYW5jZWwgPSBjO1xuICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICB0b2tlbixcbiAgICAgIGNhbmNlbFxuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQ2FuY2VsVG9rZW47XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogU3ludGFjdGljIHN1Z2FyIGZvciBpbnZva2luZyBhIGZ1bmN0aW9uIGFuZCBleHBhbmRpbmcgYW4gYXJyYXkgZm9yIGFyZ3VtZW50cy5cbiAqXG4gKiBDb21tb24gdXNlIGNhc2Ugd291bGQgYmUgdG8gdXNlIGBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHlgLlxuICpcbiAqICBgYGBqc1xuICogIGZ1bmN0aW9uIGYoeCwgeSwgeikge31cbiAqICB2YXIgYXJncyA9IFsxLCAyLCAzXTtcbiAqICBmLmFwcGx5KG51bGwsIGFyZ3MpO1xuICogIGBgYFxuICpcbiAqIFdpdGggYHNwcmVhZGAgdGhpcyBleGFtcGxlIGNhbiBiZSByZS13cml0dGVuLlxuICpcbiAqICBgYGBqc1xuICogIHNwcmVhZChmdW5jdGlvbih4LCB5LCB6KSB7fSkoWzEsIDIsIDNdKTtcbiAqICBgYGBcbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICpcbiAqIEByZXR1cm5zIHtGdW5jdGlvbn1cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc3ByZWFkKGNhbGxiYWNrKSB7XG4gIHJldHVybiBmdW5jdGlvbiB3cmFwKGFycikge1xuICAgIHJldHVybiBjYWxsYmFjay5hcHBseShudWxsLCBhcnIpO1xuICB9O1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgdXRpbHMgZnJvbSAnLi8uLi91dGlscy5qcyc7XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBwYXlsb2FkIGlzIGFuIGVycm9yIHRocm93biBieSBBeGlvc1xuICpcbiAqIEBwYXJhbSB7Kn0gcGF5bG9hZCBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSBwYXlsb2FkIGlzIGFuIGVycm9yIHRocm93biBieSBBeGlvcywgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGlzQXhpb3NFcnJvcihwYXlsb2FkKSB7XG4gIHJldHVybiB1dGlscy5pc09iamVjdChwYXlsb2FkKSAmJiAocGF5bG9hZC5pc0F4aW9zRXJyb3IgPT09IHRydWUpO1xufVxuIiwiY29uc3QgSHR0cFN0YXR1c0NvZGUgPSB7XG4gIENvbnRpbnVlOiAxMDAsXG4gIFN3aXRjaGluZ1Byb3RvY29sczogMTAxLFxuICBQcm9jZXNzaW5nOiAxMDIsXG4gIEVhcmx5SGludHM6IDEwMyxcbiAgT2s6IDIwMCxcbiAgQ3JlYXRlZDogMjAxLFxuICBBY2NlcHRlZDogMjAyLFxuICBOb25BdXRob3JpdGF0aXZlSW5mb3JtYXRpb246IDIwMyxcbiAgTm9Db250ZW50OiAyMDQsXG4gIFJlc2V0Q29udGVudDogMjA1LFxuICBQYXJ0aWFsQ29udGVudDogMjA2LFxuICBNdWx0aVN0YXR1czogMjA3LFxuICBBbHJlYWR5UmVwb3J0ZWQ6IDIwOCxcbiAgSW1Vc2VkOiAyMjYsXG4gIE11bHRpcGxlQ2hvaWNlczogMzAwLFxuICBNb3ZlZFBlcm1hbmVudGx5OiAzMDEsXG4gIEZvdW5kOiAzMDIsXG4gIFNlZU90aGVyOiAzMDMsXG4gIE5vdE1vZGlmaWVkOiAzMDQsXG4gIFVzZVByb3h5OiAzMDUsXG4gIFVudXNlZDogMzA2LFxuICBUZW1wb3JhcnlSZWRpcmVjdDogMzA3LFxuICBQZXJtYW5lbnRSZWRpcmVjdDogMzA4LFxuICBCYWRSZXF1ZXN0OiA0MDAsXG4gIFVuYXV0aG9yaXplZDogNDAxLFxuICBQYXltZW50UmVxdWlyZWQ6IDQwMixcbiAgRm9yYmlkZGVuOiA0MDMsXG4gIE5vdEZvdW5kOiA0MDQsXG4gIE1ldGhvZE5vdEFsbG93ZWQ6IDQwNSxcbiAgTm90QWNjZXB0YWJsZTogNDA2LFxuICBQcm94eUF1dGhlbnRpY2F0aW9uUmVxdWlyZWQ6IDQwNyxcbiAgUmVxdWVzdFRpbWVvdXQ6IDQwOCxcbiAgQ29uZmxpY3Q6IDQwOSxcbiAgR29uZTogNDEwLFxuICBMZW5ndGhSZXF1aXJlZDogNDExLFxuICBQcmVjb25kaXRpb25GYWlsZWQ6IDQxMixcbiAgUGF5bG9hZFRvb0xhcmdlOiA0MTMsXG4gIFVyaVRvb0xvbmc6IDQxNCxcbiAgVW5zdXBwb3J0ZWRNZWRpYVR5cGU6IDQxNSxcbiAgUmFuZ2VOb3RTYXRpc2ZpYWJsZTogNDE2LFxuICBFeHBlY3RhdGlvbkZhaWxlZDogNDE3LFxuICBJbUFUZWFwb3Q6IDQxOCxcbiAgTWlzZGlyZWN0ZWRSZXF1ZXN0OiA0MjEsXG4gIFVucHJvY2Vzc2FibGVFbnRpdHk6IDQyMixcbiAgTG9ja2VkOiA0MjMsXG4gIEZhaWxlZERlcGVuZGVuY3k6IDQyNCxcbiAgVG9vRWFybHk6IDQyNSxcbiAgVXBncmFkZVJlcXVpcmVkOiA0MjYsXG4gIFByZWNvbmRpdGlvblJlcXVpcmVkOiA0MjgsXG4gIFRvb01hbnlSZXF1ZXN0czogNDI5LFxuICBSZXF1ZXN0SGVhZGVyRmllbGRzVG9vTGFyZ2U6IDQzMSxcbiAgVW5hdmFpbGFibGVGb3JMZWdhbFJlYXNvbnM6IDQ1MSxcbiAgSW50ZXJuYWxTZXJ2ZXJFcnJvcjogNTAwLFxuICBOb3RJbXBsZW1lbnRlZDogNTAxLFxuICBCYWRHYXRld2F5OiA1MDIsXG4gIFNlcnZpY2VVbmF2YWlsYWJsZTogNTAzLFxuICBHYXRld2F5VGltZW91dDogNTA0LFxuICBIdHRwVmVyc2lvbk5vdFN1cHBvcnRlZDogNTA1LFxuICBWYXJpYW50QWxzb05lZ290aWF0ZXM6IDUwNixcbiAgSW5zdWZmaWNpZW50U3RvcmFnZTogNTA3LFxuICBMb29wRGV0ZWN0ZWQ6IDUwOCxcbiAgTm90RXh0ZW5kZWQ6IDUxMCxcbiAgTmV0d29ya0F1dGhlbnRpY2F0aW9uUmVxdWlyZWQ6IDUxMSxcbn07XG5cbk9iamVjdC5lbnRyaWVzKEh0dHBTdGF0dXNDb2RlKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgSHR0cFN0YXR1c0NvZGVbdmFsdWVdID0ga2V5O1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IEh0dHBTdGF0dXNDb2RlO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgdXRpbHMgZnJvbSAnLi91dGlscy5qcyc7XG5pbXBvcnQgYmluZCBmcm9tICcuL2hlbHBlcnMvYmluZC5qcyc7XG5pbXBvcnQgQXhpb3MgZnJvbSAnLi9jb3JlL0F4aW9zLmpzJztcbmltcG9ydCBtZXJnZUNvbmZpZyBmcm9tICcuL2NvcmUvbWVyZ2VDb25maWcuanMnO1xuaW1wb3J0IGRlZmF1bHRzIGZyb20gJy4vZGVmYXVsdHMvaW5kZXguanMnO1xuaW1wb3J0IGZvcm1EYXRhVG9KU09OIGZyb20gJy4vaGVscGVycy9mb3JtRGF0YVRvSlNPTi5qcyc7XG5pbXBvcnQgQ2FuY2VsZWRFcnJvciBmcm9tICcuL2NhbmNlbC9DYW5jZWxlZEVycm9yLmpzJztcbmltcG9ydCBDYW5jZWxUb2tlbiBmcm9tICcuL2NhbmNlbC9DYW5jZWxUb2tlbi5qcyc7XG5pbXBvcnQgaXNDYW5jZWwgZnJvbSAnLi9jYW5jZWwvaXNDYW5jZWwuanMnO1xuaW1wb3J0IHtWRVJTSU9OfSBmcm9tICcuL2Vudi9kYXRhLmpzJztcbmltcG9ydCB0b0Zvcm1EYXRhIGZyb20gJy4vaGVscGVycy90b0Zvcm1EYXRhLmpzJztcbmltcG9ydCBBeGlvc0Vycm9yIGZyb20gJy4vY29yZS9BeGlvc0Vycm9yLmpzJztcbmltcG9ydCBzcHJlYWQgZnJvbSAnLi9oZWxwZXJzL3NwcmVhZC5qcyc7XG5pbXBvcnQgaXNBeGlvc0Vycm9yIGZyb20gJy4vaGVscGVycy9pc0F4aW9zRXJyb3IuanMnO1xuaW1wb3J0IEF4aW9zSGVhZGVycyBmcm9tIFwiLi9jb3JlL0F4aW9zSGVhZGVycy5qc1wiO1xuaW1wb3J0IGFkYXB0ZXJzIGZyb20gJy4vYWRhcHRlcnMvYWRhcHRlcnMuanMnO1xuaW1wb3J0IEh0dHBTdGF0dXNDb2RlIGZyb20gJy4vaGVscGVycy9IdHRwU3RhdHVzQ29kZS5qcyc7XG5cbi8qKlxuICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIEF4aW9zXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGRlZmF1bHRDb25maWcgVGhlIGRlZmF1bHQgY29uZmlnIGZvciB0aGUgaW5zdGFuY2VcbiAqXG4gKiBAcmV0dXJucyB7QXhpb3N9IEEgbmV3IGluc3RhbmNlIG9mIEF4aW9zXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUluc3RhbmNlKGRlZmF1bHRDb25maWcpIHtcbiAgY29uc3QgY29udGV4dCA9IG5ldyBBeGlvcyhkZWZhdWx0Q29uZmlnKTtcbiAgY29uc3QgaW5zdGFuY2UgPSBiaW5kKEF4aW9zLnByb3RvdHlwZS5yZXF1ZXN0LCBjb250ZXh0KTtcblxuICAvLyBDb3B5IGF4aW9zLnByb3RvdHlwZSB0byBpbnN0YW5jZVxuICB1dGlscy5leHRlbmQoaW5zdGFuY2UsIEF4aW9zLnByb3RvdHlwZSwgY29udGV4dCwge2FsbE93bktleXM6IHRydWV9KTtcblxuICAvLyBDb3B5IGNvbnRleHQgdG8gaW5zdGFuY2VcbiAgdXRpbHMuZXh0ZW5kKGluc3RhbmNlLCBjb250ZXh0LCBudWxsLCB7YWxsT3duS2V5czogdHJ1ZX0pO1xuXG4gIC8vIEZhY3RvcnkgZm9yIGNyZWF0aW5nIG5ldyBpbnN0YW5jZXNcbiAgaW5zdGFuY2UuY3JlYXRlID0gZnVuY3Rpb24gY3JlYXRlKGluc3RhbmNlQ29uZmlnKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUluc3RhbmNlKG1lcmdlQ29uZmlnKGRlZmF1bHRDb25maWcsIGluc3RhbmNlQ29uZmlnKSk7XG4gIH07XG5cbiAgcmV0dXJuIGluc3RhbmNlO1xufVxuXG4vLyBDcmVhdGUgdGhlIGRlZmF1bHQgaW5zdGFuY2UgdG8gYmUgZXhwb3J0ZWRcbmNvbnN0IGF4aW9zID0gY3JlYXRlSW5zdGFuY2UoZGVmYXVsdHMpO1xuXG4vLyBFeHBvc2UgQXhpb3MgY2xhc3MgdG8gYWxsb3cgY2xhc3MgaW5oZXJpdGFuY2VcbmF4aW9zLkF4aW9zID0gQXhpb3M7XG5cbi8vIEV4cG9zZSBDYW5jZWwgJiBDYW5jZWxUb2tlblxuYXhpb3MuQ2FuY2VsZWRFcnJvciA9IENhbmNlbGVkRXJyb3I7XG5heGlvcy5DYW5jZWxUb2tlbiA9IENhbmNlbFRva2VuO1xuYXhpb3MuaXNDYW5jZWwgPSBpc0NhbmNlbDtcbmF4aW9zLlZFUlNJT04gPSBWRVJTSU9OO1xuYXhpb3MudG9Gb3JtRGF0YSA9IHRvRm9ybURhdGE7XG5cbi8vIEV4cG9zZSBBeGlvc0Vycm9yIGNsYXNzXG5heGlvcy5BeGlvc0Vycm9yID0gQXhpb3NFcnJvcjtcblxuLy8gYWxpYXMgZm9yIENhbmNlbGVkRXJyb3IgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcbmF4aW9zLkNhbmNlbCA9IGF4aW9zLkNhbmNlbGVkRXJyb3I7XG5cbi8vIEV4cG9zZSBhbGwvc3ByZWFkXG5heGlvcy5hbGwgPSBmdW5jdGlvbiBhbGwocHJvbWlzZXMpIHtcbiAgcmV0dXJuIFByb21pc2UuYWxsKHByb21pc2VzKTtcbn07XG5cbmF4aW9zLnNwcmVhZCA9IHNwcmVhZDtcblxuLy8gRXhwb3NlIGlzQXhpb3NFcnJvclxuYXhpb3MuaXNBeGlvc0Vycm9yID0gaXNBeGlvc0Vycm9yO1xuXG4vLyBFeHBvc2UgbWVyZ2VDb25maWdcbmF4aW9zLm1lcmdlQ29uZmlnID0gbWVyZ2VDb25maWc7XG5cbmF4aW9zLkF4aW9zSGVhZGVycyA9IEF4aW9zSGVhZGVycztcblxuYXhpb3MuZm9ybVRvSlNPTiA9IHRoaW5nID0+IGZvcm1EYXRhVG9KU09OKHV0aWxzLmlzSFRNTEZvcm0odGhpbmcpID8gbmV3IEZvcm1EYXRhKHRoaW5nKSA6IHRoaW5nKTtcblxuYXhpb3MuZ2V0QWRhcHRlciA9IGFkYXB0ZXJzLmdldEFkYXB0ZXI7XG5cbmF4aW9zLkh0dHBTdGF0dXNDb2RlID0gSHR0cFN0YXR1c0NvZGU7XG5cbmF4aW9zLmRlZmF1bHQgPSBheGlvcztcblxuLy8gdGhpcyBtb2R1bGUgc2hvdWxkIG9ubHkgaGF2ZSBhIGRlZmF1bHQgZXhwb3J0XG5leHBvcnQgZGVmYXVsdCBheGlvc1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XHJcbmltcG9ydCBheGlvcyBmcm9tIFwiYXhpb3NcIjtcclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSHR0cHtcclxuICAgICNheGlvcztcclxuICAgICNyZXF1ZXN0Q291bnQgPSAwOyAvLyDor7fmsYLmrKHmlbBcclxuICAgICNsb2FkaW5nSW5zdGFuY2UgPSBudWxsO1xyXG4gICAgI2NvbmZpZyA9IHtcclxuICAgICAgICBiYXNlVVJMOiAnJyxcclxuICAgICAgICB0aW1lb3V0OiA2MCAqIDEwMDAsXHJcbiAgICAgICAgd2l0aENyZWRlbnRpYWxzOiBmYWxzZSxcclxuICAgICAgICBzdWNjZXNzQ29kZTogMjAwLFxyXG4gICAgICAgIGVycm9yQ29kZTogNTAwLFxyXG4gICAgICAgIGNhbGxCYWNrQ29kZTogW10sXHJcbiAgICAgICAgY2FsbDogbnVsbFxyXG4gICAgfVxyXG4gICAgY29uc3RydWN0b3Iob3B0aW9ucyl7XHJcbiAgICAgICAgZm9yKGNvbnN0IGsgaW4gdGhpcy4jY29uZmlnKXtcclxuICAgICAgICAgICAgaWYob3B0aW9uc1trXSl7XHJcbiAgICAgICAgICAgICAgICB0aGlzLiNjb25maWdba10gPSBvcHRpb25zW2tdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGF4aW9zLmRlZmF1bHRzLmhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOCc7XHJcbiAgICAgICAgYXhpb3MuZGVmYXVsdHMuaGVhZGVyc1snQWNjZXB0J10gPSAnYXBwbGljYXRpb24vanNvbic7XHJcbiAgICAgICAgdGhpcy4jYXhpb3MgPSBheGlvcy5jcmVhdGUodGhpcy4jY29uZmlnKTtcclxuXHJcbiAgICAgICAgdGhpcy4jYXhpb3MuaW50ZXJjZXB0b3JzLnJlcXVlc3QudXNlKFxyXG4gICAgICAgICAgICBjb25maWc9PntcclxuICAgICAgICAgICAgICAgIGlmKCFjb25maWcucGFyYW1zKXtcclxuICAgICAgICAgICAgICAgICAgICBjb25maWcucGFyYW1zID0ge307XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZih0aGlzLiNyZXF1ZXN0Q291bnQgPT0gMCl7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jbG9hZGluZ0luc3RhbmNlID0gbG9hZGluZygpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy4jcmVxdWVzdENvdW50Kys7XHJcbiAgICAgICAgICAgICAgICBjb25maWcuaGVhZGVycy5hdXRob3JpemF0aW9uID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3Rva2VuJyk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY29uZmlnO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnJvcj0+e1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgdGhpcy4jYXhpb3MuaW50ZXJjZXB0b3JzLnJlc3BvbnNlLnVzZShcclxuICAgICAgICAgICAgcmVzcG9uc2U9PntcclxuICAgICAgICAgICAgICAgIHRoaXMuI3JlcXVlc3RDb3VudC0tO1xyXG4gICAgICAgICAgICAgICAgaWYodGhpcy4jcmVxdWVzdENvdW50ID09PSAwKXtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLiNsb2FkaW5nSW5zdGFuY2UuY2xvc2UoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZS5kYXRhO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnJvcj0+e1xyXG4gICAgICAgICAgICAgICAgdGhpcy4jcmVxdWVzdENvdW50LS07XHJcbiAgICAgICAgICAgICAgICBpZih0aGlzLiNyZXF1ZXN0Q291bnQgPT09IDApe1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI2xvYWRpbmdJbnN0YW5jZS5jbG9zZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgX2hhbmRsZVJlc3VsdChzdWNjZXNzLGVycixyZXMpe1xyXG4gICAgICAgIGlmKCFyZXMpe1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKHJlcy5jb2RlID09PSB0aGlzLiNjb25maWcuc3VjY2Vzc0NvZGUpe1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIHN1Y2Nlc3MgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgICAgIHN1Y2Nlc3MocmVzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1lbHNlIGlmKHJlcy5jb2RlID09PSB0aGlzLiNjb25maWcuZXJyb3JDb2RlKXtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBlcnIgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgICAgIGVycihyZXMpO1xyXG4gICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgIGVycm9yKHJlcy5tc2cpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfWVsc2UgaWYodGhpcy4jY29uZmlnLmNhbGxCYWNrQ29kZS5pbmNsdWRlcyhyZXMuY29kZSkgJiYgdHlwZW9mIHRoaXMuI2NvbmZpZy5jYWxsID09PSAnZnVuY3Rpb24nKXtcclxuICAgICAgICAgICAgdGhpcy4jY29uZmlnLmNhbGwocmVzKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcG9zdCh1cmwscGFyYW1zLHN1Y2Nlc3MsZXJyKXtcclxuICAgICAgICB0aGlzLiNheGlvcy5wb3N0KHVybCxwYXJhbXMpLnRoZW4ocmVzPT57XHJcbiAgICAgICAgICAgIHRoaXMuX2hhbmRsZVJlc3VsdChzdWNjZXNzLGVycixyZXMpO1xyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgdXBkYXRlKHVybCxwYXJhbXMsc3VjY2VzcyxlcnIpe1xyXG4gICAgICAgIHRoaXMuI2F4aW9zLnVwZGF0ZSh1cmwscGFyYW1zKS50aGVuKHJlcz0+e1xyXG4gICAgICAgICAgICB0aGlzLl9oYW5kbGVSZXN1bHQoc3VjY2VzcyxlcnIscmVzKTtcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIGdldCh1cmwsIHBhcmFtcywgc3VjY2VzcywgZXJyKXtcclxuICAgICAgICB0aGlzLiNheGlvcy5nZXQodXJsLCB7IHBhcmFtczogcGFyYW1zfSkudGhlbihyZXMgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLl9oYW5kbGVSZXN1bHQoc3VjY2VzcyxlcnIscmVzKTtcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIGRlbGV0ZSh1cmwsIHBhcmFtcywgc3VjY2VzcywgZXJyKXtcclxuXHRcdHRoaXMuI2F4aW9zLmRlbGV0ZSh1cmwsIHsgcGFyYW1zOiBwYXJhbXN9KS50aGVuKHJlcyA9PiB7XHJcblx0XHRcdHRoaXMuX2hhbmRsZVJlc3VsdChzdWNjZXNzLGVycixyZXMpO1xyXG5cdFx0fSlcclxuXHR9XHJcblxyXG4gICAgZG93bkxvYWQodXJsLCBwYXJhbXM9e30pe1xyXG4gICAgICAgIHRoaXMuI2F4aW9zLnBvc3QodXJsLCBwYXJhbXMsIHsncmVzcG9uc2VUeXBlJzogJ2Jsb2InfSkudGhlbihyZXM9PntcclxuXHRcdFx0aWYocmVzKXtcclxuXHRcdFx0XHRsZXQgZmlsZU5hbWUgPSBwYXJhbXMuZmlsZU5hbWU7XHJcblx0XHRcdFx0aWYoIWZpbGVOYW1lKXtcclxuXHRcdFx0XHRcdGZpbGVOYW1lID0gcmVzLmhlYWRlcnNbJ2NvbnRlbnQtZGlzcG9zaXRpb24nXS5zcGxpdCgnZmlsZW5hbWU9JylbMV0ucmVwbGFjZSgvXCIvZywgJycpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRjb25zdCBibG9iID0gbmV3IEJsb2IoW3Jlcy5kYXRhXSwge3R5cGU6ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW07Y2hhcnNldD1VVEYtOCd9KTtcclxuXHRcdFx0XHRjb25zdCBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xyXG5cdFx0XHRcdGxpbmsuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuXHRcdFx0XHRsaW5rLmhyZWYgPSB3aW5kb3cuVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcclxuXHRcdFx0XHRsaW5rLmRvd25sb2FkID0gZGVjb2RlVVJJQ29tcG9uZW50KGZpbGVOYW1lKTtcclxuXHRcdFx0XHRsaW5rLmNsaWNrKCk7XHJcblx0XHRcdFx0d2luZG93LlVSTC5yZXZva2VPYmplY3RVUkwobGluay5ocmVmKTtcclxuXHRcdFx0fVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59IiwicmVxdWlyZSgnLi9tZXNzYWdlL2luZGV4LmpzJyk7XHJcbmltcG9ydCBQYWdpbmF0aW9uIGZyb20gJy4vcGFnaW5hdGlvbi9JbmRleC52dWUnO1xyXG5pbXBvcnQgUGFnZVRhYmxlIGZyb20gJy4vcGFnZS10YWJsZS9JbmRleC52dWUnO1xyXG5pbXBvcnQgRGlhbG9nIGZyb20gJy4vZGlhbG9nL0luZGV4LnZ1ZSc7XHJcbmltcG9ydCBDYXJkIGZyb20gJy4vY2FyZC9JbmRleC52dWUnO1xyXG5pbXBvcnQgVHJlZSBmcm9tICcuL3RyZWUvSW5kZXgudnVlJztcclxuaW1wb3J0IF9IdHRwIGZyb20gJy4vaHR0cC9pbmRleC5qcyc7XHJcbmNvbnN0IGNvbXMgPSBbUGFnaW5hdGlvbiwgUGFnZVRhYmxlLCBEaWFsb2csIENhcmQsIFRyZWVdO1xyXG5jb25zdCBpbnN0YWxsID0gZnVuY3Rpb24oVnVlKXtcclxuICAgIGNvbXMuZm9yRWFjaChjb20gPT4ge1xyXG4gICAgICAgIFZ1ZS5jb21wb25lbnQoY29tLm5hbWUsIGNvbSk7XHJcbiAgICB9KVxyXG59XHJcblxyXG4vLyDlr7zlh7rnu4Tku7ZcclxuZXhwb3J0IGRlZmF1bHQgaW5zdGFsbDtcclxuXHJcbmV4cG9ydCBjbGFzcyBIdHRwIGV4dGVuZHMgX0h0dHB7XHJcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKXtcclxuICAgICAgICBzdXBlcihvcHRpb25zKTtcclxuICAgIH1cclxufSIsImltcG9ydCAnLi9zZXRQdWJsaWNQYXRoJ1xuaW1wb3J0IG1vZCBmcm9tICd+ZW50cnknXG5leHBvcnQgZGVmYXVsdCBtb2RcbmV4cG9ydCAqIGZyb20gJ35lbnRyeSdcbiJdLCJuYW1lcyI6WyJyZW5kZXIiLCJfdm0iLCJfYyIsIl9zZWxmIiwidG90YWwiLCJfYiIsImF0dHJzIiwiY3VycmVudFBhZ2UiLCJwYWdlU2l6ZSIsInBhZ2VTaXplcyIsIm9uIiwiaGFuZGxlU2l6ZUNoYW5nZSIsImhhbmRsZUN1cnJlbnRDaGFuZ2UiLCIkYXR0cnMiLCJfZSIsInN0YXRpY1JlbmRlckZucyIsIm5hbWUiLCJwcm9wcyIsInJlcXVpcmVkIiwidHlwZSIsIk51bWJlciIsImRlZmF1bHQiLCJwYWdlIiwibGltaXQiLCJBcnJheSIsImNvbXB1dGVkIiwiZ2V0Iiwic2V0IiwidmFsIiwiJGVtaXQiLCJ0b3RhbENvdW50IiwibWV0aG9kcyIsInN0YXRpY0NsYXNzIiwidGFibGVJZCIsInN0YXRpY1N0eWxlIiwicmVmIiwibGlzdCIsInJvd0tleSIsImxvYWQiLCJobGlnaHRDdXJyZW50Um93IiwiZGVmYXVsdEV4cGFuZEFsbCIsImhhbmRlbFNlbGVjdGlvbkNoYW5nZSIsInNlbGVjdEFsbCIsImhhbmRsZVJvd0NsaWNrIiwic2hvd0NoZWNrQm94Iiwic29ydE51bSIsInNjb3BlZFNsb3RzIiwiX3UiLCJrZXkiLCJmbiIsInNjb3BlIiwiX3YiLCJfcyIsInBhcmFtcyIsIiRpbmRleCIsIl90IiwidXBkYXRlOnBhZ2UiLCIkZXZlbnQiLCIkc2V0IiwiZ2V0TGlzdCIsImRhdGEiLCJ1cmwiLCJTdHJpbmciLCJtZXRob2QiLCJCb29sZWFuIiwiZGVmYXVsdFBhcmFtcyIsIk9iamVjdCIsImRlZmF1bHRTZWxlY3QiLCJ5cGUiLCJ3YXRjaCIsIm5ld1ZhbCIsImhhbmRsZXIiLCJzZXRDaGVja2VkIiwiZGVlcCIsIm9sZFZhbCIsInBhcmFtIiwiTWF0aCIsInJhbmRvbSIsInRvU3RyaW5nIiwic3Vic3RyaW5nIiwic2VsZWN0RGF0YSIsInNlbGVjdElkcyIsIm1vdW50ZWQiLCJsb2ciLCIkbGlzdGVuZXJzIiwiaXRlbSIsInBhZ2VPcHRpb24iLCJzdG9yYWdlUGFyYW1zIiwic2Vzc2lvblN0b3JhZ2UiLCJnZXRJdGVtIiwiJHJvdXRlIiwicGF0aCIsInNldEl0ZW0iLCJKU09OIiwic3RyaW5naWZ5IiwiaHR0cCIsInJlcyIsIl9zZXREYXRhIiwicG9zdCIsInJlY29yZHMiLCJsZW5ndGgiLCJtYXAiLCIkbmV4dFRpY2siLCIkcmVmcyIsImluY2x1ZGVzIiwidG9nZ2xlUm93U2VsZWN0aW9uIiwicXVlcnkiLCJrZXlzIiwicm93IiwiY29sdW1uIiwiZXZlbnQiLCJfIiwic2VsZWN0aW9uTGlzdCIsInZhbHVlcyIsInNlbGVjdGlvbiIsInNldEN1cnJlbnQiLCJpbmRleCIsInNldEN1cnJlbnRSb3ciLCJnZXREYXRhIiwidHJlZSIsInRyZWVOb2RlIiwicmVzb2x2ZSIsImRpcmVjdGl2ZXMiLCJyYXdOYW1lIiwidGl0bGUiLCJkaWFsb2dWaXNpYmxlIiwiaGFuZGxlQ2xvc2UiLCJzaG93Q2xvc2UiLCJzdHlsZSIsIm1heEhlaWdodCIsIm1pbkhlaWdodCIsInNsb3QiLCJWdWUiLCJkaXJlY3RpdmUiLCJiaW5kIiwiZWwiLCJkaWFsb2dIZWFkZXJFbCIsInF1ZXJ5U2VsZWN0b3IiLCJkcmFnRG9tIiwiY3Vyc29yIiwic3R5IiwiY3VycmVudFN0eWxlIiwid2luZG93IiwiZ2V0Q29tcHV0ZWRTdHlsZSIsIm9ubW91c2Vkb3duIiwiZGlzWCIsImNsaWVudFgiLCJvZmZzZXRMZWZ0IiwiZGlzWSIsImNsaWVudFkiLCJvZmZzZXRUb3AiLCJzdHlMIiwic3R5VCIsImxlZnQiLCJkb2N1bWVudCIsImJvZHkiLCJjbGllbnRXaWR0aCIsInJlcGxhY2UiLCJjbGllbnRIZWlnaHQiLCJ0b3AiLCJvbm1vdXNlbW92ZSIsImUiLCJsIiwidCIsIm9ubW91c2V1cCIsImFyaWFFbHMiLCJxdWVyeVNlbGVjdG9yQWxsIiwiZm9yRWFjaCIsInJlbW92ZUF0dHJpYnV0ZSIsInNoYWRvdyIsIiRzbG90cyIsInNob3ciLCJfbCIsImlkIiwib25FeHBhbmQiLCJvbkNoZWNrZWQiLCJoYXNDaGlsZHJlbiIsImlzQXJyYXkiLCJjaGlsZHJlbiIsInJlbmRlckxhYmVsIiwiaCIsImNvbnRleHQiLCJsaXN0ZW5lcnMiLCJjbGlja0hhbmRsZXIiLCJjaGVja2VkSGFuZGxlciIsImxhYmVsIiwiY2hpbGROb2RlcyIsInB1c2giLCJpY29DbGFzcyIsImV4cGFuZCIsImRvbVByb3BzIiwiY2xhc3NOYW1lIiwiam9pbiIsIm1hcmdpbkxlZnQiLCJfbGV2ZSIsImZvbnRTaXplIiwidHJhbnNmb3JtIiwiY29sb3IiLCJjbGljayIsImNoZWNrZWQiLCJyZW5kZXJDaGlsZHJlbiIsInJlbmRlck5vZGUiLCJjbHMiLCJjb21wb25lbnRzIiwiQXV0aFRyZWUiLCJmdW5jdGlvbmFsIiwiaW5pdCIsImxldmUiLCJpIiwicmVmcmVzaCIsInRvb2xlckNoZWNrZWQiLCJzZXRQYXJlbnRDaGVja2VkIiwibm9kZSIsInNldENoaWxkQ2hlY2tlZCIsImNoaWxkSXNDaGVja2VkIiwic2V0RGVmYXVsdENoZWNrZWQiLCJkZWZhdWx0SWRzIiwiZ2V0Q2hlY2tlZEtleXMiLCJfZ2V0Q2hlY2tlZEtleXMiLCJnZXRDaGVja2VkTm9kZXMiLCJub2RlcyIsIl9nZXRDaGVja2VkTm9kZXMiLCJpbW1lZGlhdGUiLCJfY2hlY2tQcml2YXRlUmVkZWNsYXJhdGlvbiIsIm9iaiIsInByaXZhdGVDb2xsZWN0aW9uIiwiaGFzIiwiVHlwZUVycm9yIiwiY2hlY2tQcml2YXRlUmVkZWNsYXJhdGlvbiIsIl9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjIiwicHJpdmF0ZU1hcCIsInZhbHVlIiwiX2Fzc2VydENsYXNzQnJhbmQiLCJuIiwiYXJndW1lbnRzIiwiYXNzZXJ0Q2xhc3NCcmFuZCIsIl9jbGFzc1ByaXZhdGVGaWVsZFNldDIiLCJzIiwiYSIsInIiLCJfY2xhc3NQcml2YXRlRmllbGRHZXQyIiwidGhpc0FyZyIsIndyYXAiLCJhcHBseSIsInByb3RvdHlwZSIsImdldFByb3RvdHlwZU9mIiwia2luZE9mIiwiY2FjaGUiLCJ0aGluZyIsInN0ciIsImNhbGwiLCJzbGljZSIsInRvTG93ZXJDYXNlIiwiY3JlYXRlIiwia2luZE9mVGVzdCIsInR5cGVPZlRlc3QiLCJpc1VuZGVmaW5lZCIsImlzQnVmZmVyIiwiY29uc3RydWN0b3IiLCJpc0Z1bmN0aW9uIiwiaXNBcnJheUJ1ZmZlciIsImlzQXJyYXlCdWZmZXJWaWV3IiwicmVzdWx0IiwiQXJyYXlCdWZmZXIiLCJpc1ZpZXciLCJidWZmZXIiLCJpc1N0cmluZyIsImlzTnVtYmVyIiwiaXNPYmplY3QiLCJpc0Jvb2xlYW4iLCJpc1BsYWluT2JqZWN0IiwiU3ltYm9sIiwidG9TdHJpbmdUYWciLCJpdGVyYXRvciIsImlzRGF0ZSIsImlzRmlsZSIsImlzQmxvYiIsImlzRmlsZUxpc3QiLCJpc1N0cmVhbSIsInBpcGUiLCJpc0Zvcm1EYXRhIiwia2luZCIsIkZvcm1EYXRhIiwiYXBwZW5kIiwiaXNVUkxTZWFyY2hQYXJhbXMiLCJ0cmltIiwiYWxsT3duS2V5cyIsImdldE93blByb3BlcnR5TmFtZXMiLCJsZW4iLCJmaW5kS2V5IiwiX2tleSIsIl9nbG9iYWwiLCJnbG9iYWxUaGlzIiwic2VsZiIsImdsb2JhbCIsImlzQ29udGV4dERlZmluZWQiLCJtZXJnZSIsImNhc2VsZXNzIiwiYXNzaWduVmFsdWUiLCJ0YXJnZXRLZXkiLCJleHRlbmQiLCJiIiwic3RyaXBCT00iLCJjb250ZW50IiwiY2hhckNvZGVBdCIsImluaGVyaXRzIiwic3VwZXJDb25zdHJ1Y3RvciIsImRlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydHkiLCJhc3NpZ24iLCJ0b0ZsYXRPYmplY3QiLCJzb3VyY2VPYmoiLCJkZXN0T2JqIiwiZmlsdGVyIiwicHJvcEZpbHRlciIsInByb3AiLCJtZXJnZWQiLCJlbmRzV2l0aCIsInNlYXJjaFN0cmluZyIsInBvc2l0aW9uIiwidW5kZWZpbmVkIiwibGFzdEluZGV4IiwiaW5kZXhPZiIsInRvQXJyYXkiLCJhcnIiLCJpc1R5cGVkQXJyYXkiLCJUeXBlZEFycmF5IiwiVWludDhBcnJheSIsImZvckVhY2hFbnRyeSIsImdlbmVyYXRvciIsIm5leHQiLCJkb25lIiwicGFpciIsIm1hdGNoQWxsIiwicmVnRXhwIiwibWF0Y2hlcyIsImV4ZWMiLCJpc0hUTUxGb3JtIiwidG9DYW1lbENhc2UiLCJyZXBsYWNlciIsIm0iLCJwMSIsInAyIiwidG9VcHBlckNhc2UiLCJoYXNPd25Qcm9wZXJ0eSIsImlzUmVnRXhwIiwicmVkdWNlRGVzY3JpcHRvcnMiLCJyZWR1Y2VyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsInJlZHVjZWREZXNjcmlwdG9ycyIsImRlc2NyaXB0b3IiLCJyZXQiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiZnJlZXplTWV0aG9kcyIsImVudW1lcmFibGUiLCJ3cml0YWJsZSIsIkVycm9yIiwidG9PYmplY3RTZXQiLCJhcnJheU9yU3RyaW5nIiwiZGVsaW1pdGVyIiwiZGVmaW5lIiwic3BsaXQiLCJub29wIiwidG9GaW5pdGVOdW1iZXIiLCJkZWZhdWx0VmFsdWUiLCJpc0Zpbml0ZSIsIkFMUEhBIiwiRElHSVQiLCJBTFBIQUJFVCIsIkFMUEhBX0RJR0lUIiwiZ2VuZXJhdGVTdHJpbmciLCJzaXplIiwiYWxwaGFiZXQiLCJpc1NwZWNDb21wbGlhbnRGb3JtIiwidG9KU09OT2JqZWN0Iiwic3RhY2siLCJ2aXNpdCIsInNvdXJjZSIsInRhcmdldCIsInJlZHVjZWRWYWx1ZSIsImlzQXN5bmNGbiIsImlzVGhlbmFibGUiLCJ0aGVuIiwiY2F0Y2giLCJoYXNPd25Qcm9wIiwidXRpbHMiLCJBeGlvc0Vycm9yIiwibWVzc2FnZSIsImNvZGUiLCJjb25maWciLCJyZXF1ZXN0IiwicmVzcG9uc2UiLCJjYXB0dXJlU3RhY2tUcmFjZSIsInRvSlNPTiIsImRlc2NyaXB0aW9uIiwibnVtYmVyIiwiZmlsZU5hbWUiLCJsaW5lTnVtYmVyIiwiY29sdW1uTnVtYmVyIiwic3RhdHVzIiwiZnJvbSIsImVycm9yIiwiY3VzdG9tUHJvcHMiLCJheGlvc0Vycm9yIiwiY2F1c2UiLCJQbGF0Zm9ybUZvcm1EYXRhIiwiaXNWaXNpdGFibGUiLCJyZW1vdmVCcmFja2V0cyIsInJlbmRlcktleSIsImRvdHMiLCJjb25jYXQiLCJlYWNoIiwidG9rZW4iLCJpc0ZsYXRBcnJheSIsInNvbWUiLCJwcmVkaWNhdGVzIiwidGVzdCIsInRvRm9ybURhdGEiLCJmb3JtRGF0YSIsIm9wdGlvbnMiLCJtZXRhVG9rZW5zIiwiaW5kZXhlcyIsImRlZmluZWQiLCJvcHRpb24iLCJ2aXNpdG9yIiwiZGVmYXVsdFZpc2l0b3IiLCJfQmxvYiIsIkJsb2IiLCJ1c2VCbG9iIiwiY29udmVydFZhbHVlIiwidG9JU09TdHJpbmciLCJCdWZmZXIiLCJleHBvc2VkSGVscGVycyIsImJ1aWxkIiwicG9wIiwiZW5jb2RlIiwiY2hhck1hcCIsImVuY29kZVVSSUNvbXBvbmVudCIsIm1hdGNoIiwiQXhpb3NVUkxTZWFyY2hQYXJhbXMiLCJfcGFpcnMiLCJlbmNvZGVyIiwiX2VuY29kZSIsImJ1aWxkVVJMIiwic2VyaWFsaXplRm4iLCJzZXJpYWxpemUiLCJzZXJpYWxpemVkUGFyYW1zIiwiaGFzaG1hcmtJbmRleCIsIkludGVyY2VwdG9yTWFuYWdlciIsImhhbmRsZXJzIiwidXNlIiwiZnVsZmlsbGVkIiwicmVqZWN0ZWQiLCJzeW5jaHJvbm91cyIsInJ1bldoZW4iLCJlamVjdCIsImNsZWFyIiwiZm9yRWFjaEhhbmRsZXIiLCJzaWxlbnRKU09OUGFyc2luZyIsImZvcmNlZEpTT05QYXJzaW5nIiwiY2xhcmlmeVRpbWVvdXRFcnJvciIsIlVSTFNlYXJjaFBhcmFtcyIsImlzQnJvd3NlciIsImNsYXNzZXMiLCJwcm90b2NvbHMiLCJoYXNCcm93c2VyRW52IiwiaGFzU3RhbmRhcmRCcm93c2VyRW52IiwicHJvZHVjdCIsIm5hdmlnYXRvciIsImhhc1N0YW5kYXJkQnJvd3NlcldlYldvcmtlckVudiIsIldvcmtlckdsb2JhbFNjb3BlIiwiaW1wb3J0U2NyaXB0cyIsInBsYXRmb3JtIiwidG9VUkxFbmNvZGVkRm9ybSIsImhlbHBlcnMiLCJpc05vZGUiLCJwYXJzZVByb3BQYXRoIiwiYXJyYXlUb09iamVjdCIsImZvcm1EYXRhVG9KU09OIiwiYnVpbGRQYXRoIiwiaXNOdW1lcmljS2V5IiwiaXNMYXN0IiwiZW50cmllcyIsInRyYW5zaXRpb25hbERlZmF1bHRzIiwic3RyaW5naWZ5U2FmZWx5IiwicmF3VmFsdWUiLCJwYXJzZXIiLCJwYXJzZSIsImRlZmF1bHRzIiwidHJhbnNpdGlvbmFsIiwiYWRhcHRlciIsInRyYW5zZm9ybVJlcXVlc3QiLCJoZWFkZXJzIiwiY29udGVudFR5cGUiLCJnZXRDb250ZW50VHlwZSIsImhhc0pTT05Db250ZW50VHlwZSIsImlzT2JqZWN0UGF5bG9hZCIsInNldENvbnRlbnRUeXBlIiwiZm9ybVNlcmlhbGl6ZXIiLCJfRm9ybURhdGEiLCJlbnYiLCJ0cmFuc2Zvcm1SZXNwb25zZSIsIkpTT05SZXF1ZXN0ZWQiLCJyZXNwb25zZVR5cGUiLCJzdHJpY3RKU09OUGFyc2luZyIsIkVSUl9CQURfUkVTUE9OU0UiLCJ0aW1lb3V0IiwieHNyZkNvb2tpZU5hbWUiLCJ4c3JmSGVhZGVyTmFtZSIsIm1heENvbnRlbnRMZW5ndGgiLCJtYXhCb2R5TGVuZ3RoIiwidmFsaWRhdGVTdGF0dXMiLCJjb21tb24iLCJpZ25vcmVEdXBsaWNhdGVPZiIsInJhd0hlYWRlcnMiLCJwYXJzZWQiLCJsaW5lIiwicGFyc2VIZWFkZXJzIiwiJGludGVybmFscyIsIm5vcm1hbGl6ZUhlYWRlciIsImhlYWRlciIsIm5vcm1hbGl6ZVZhbHVlIiwicGFyc2VUb2tlbnMiLCJ0b2tlbnMiLCJ0b2tlbnNSRSIsImlzVmFsaWRIZWFkZXJOYW1lIiwibWF0Y2hIZWFkZXJWYWx1ZSIsImlzSGVhZGVyTmFtZUZpbHRlciIsImZvcm1hdEhlYWRlciIsInciLCJjaGFyIiwiYnVpbGRBY2Nlc3NvcnMiLCJhY2Nlc3Nvck5hbWUiLCJtZXRob2ROYW1lIiwiYXJnMSIsImFyZzIiLCJhcmczIiwiY29uZmlndXJhYmxlIiwiQXhpb3NIZWFkZXJzIiwidmFsdWVPclJld3JpdGUiLCJyZXdyaXRlIiwic2V0SGVhZGVyIiwiX3ZhbHVlIiwiX2hlYWRlciIsIl9yZXdyaXRlIiwibEhlYWRlciIsInNldEhlYWRlcnMiLCJtYXRjaGVyIiwiZGVsZXRlIiwiZGVsZXRlZCIsImRlbGV0ZUhlYWRlciIsIm5vcm1hbGl6ZSIsImZvcm1hdCIsIm5vcm1hbGl6ZWQiLCJ0YXJnZXRzIiwiYXNTdHJpbmdzIiwiZmlyc3QiLCJhY2Nlc3NvciIsImludGVybmFscyIsImFjY2Vzc29ycyIsImRlZmluZUFjY2Vzc29yIiwibWFwcGVkIiwiaGVhZGVyVmFsdWUiLCJ0cmFuc2Zvcm1EYXRhIiwiZm5zIiwiaXNDYW5jZWwiLCJfX0NBTkNFTF9fIiwiQ2FuY2VsZWRFcnJvciIsIkVSUl9DQU5DRUxFRCIsInNldHRsZSIsInJlamVjdCIsIkVSUl9CQURfUkVRVUVTVCIsImZsb29yIiwid3JpdGUiLCJleHBpcmVzIiwiZG9tYWluIiwic2VjdXJlIiwiY29va2llIiwiRGF0ZSIsInRvR01UU3RyaW5nIiwicmVhZCIsIlJlZ0V4cCIsImRlY29kZVVSSUNvbXBvbmVudCIsInJlbW92ZSIsIm5vdyIsImlzQWJzb2x1dGVVUkwiLCJjb21iaW5lVVJMcyIsImJhc2VVUkwiLCJyZWxhdGl2ZVVSTCIsImJ1aWxkRnVsbFBhdGgiLCJyZXF1ZXN0ZWRVUkwiLCJzdGFuZGFyZEJyb3dzZXJFbnYiLCJtc2llIiwidXNlckFnZW50IiwidXJsUGFyc2luZ05vZGUiLCJjcmVhdGVFbGVtZW50Iiwib3JpZ2luVVJMIiwicmVzb2x2ZVVSTCIsImhyZWYiLCJzZXRBdHRyaWJ1dGUiLCJwcm90b2NvbCIsImhvc3QiLCJzZWFyY2giLCJoYXNoIiwiaG9zdG5hbWUiLCJwb3J0IiwicGF0aG5hbWUiLCJjaGFyQXQiLCJsb2NhdGlvbiIsImlzVVJMU2FtZU9yaWdpbiIsInJlcXVlc3RVUkwiLCJub25TdGFuZGFyZEJyb3dzZXJFbnYiLCJwYXJzZVByb3RvY29sIiwic3BlZWRvbWV0ZXIiLCJzYW1wbGVzQ291bnQiLCJtaW4iLCJieXRlcyIsInRpbWVzdGFtcHMiLCJoZWFkIiwidGFpbCIsImZpcnN0U2FtcGxlVFMiLCJjaHVua0xlbmd0aCIsInN0YXJ0ZWRBdCIsImJ5dGVzQ291bnQiLCJwYXNzZWQiLCJyb3VuZCIsImNvb2tpZXMiLCJwcm9ncmVzc0V2ZW50UmVkdWNlciIsImxpc3RlbmVyIiwiaXNEb3dubG9hZFN0cmVhbSIsImJ5dGVzTm90aWZpZWQiLCJfc3BlZWRvbWV0ZXIiLCJsb2FkZWQiLCJsZW5ndGhDb21wdXRhYmxlIiwicHJvZ3Jlc3NCeXRlcyIsInJhdGUiLCJpblJhbmdlIiwicHJvZ3Jlc3MiLCJlc3RpbWF0ZWQiLCJpc1hIUkFkYXB0ZXJTdXBwb3J0ZWQiLCJYTUxIdHRwUmVxdWVzdCIsIlByb21pc2UiLCJkaXNwYXRjaFhoclJlcXVlc3QiLCJyZXF1ZXN0RGF0YSIsInJlcXVlc3RIZWFkZXJzIiwid2l0aFhTUkZUb2tlbiIsIm9uQ2FuY2VsZWQiLCJjYW5jZWxUb2tlbiIsInVuc3Vic2NyaWJlIiwic2lnbmFsIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsImF1dGgiLCJ1c2VybmFtZSIsInBhc3N3b3JkIiwidW5lc2NhcGUiLCJidG9hIiwiZnVsbFBhdGgiLCJvcGVuIiwicGFyYW1zU2VyaWFsaXplciIsIm9ubG9hZGVuZCIsInJlc3BvbnNlSGVhZGVycyIsImdldEFsbFJlc3BvbnNlSGVhZGVycyIsInJlc3BvbnNlRGF0YSIsInJlc3BvbnNlVGV4dCIsInN0YXR1c1RleHQiLCJfcmVzb2x2ZSIsIl9yZWplY3QiLCJlcnIiLCJvbnJlYWR5c3RhdGVjaGFuZ2UiLCJoYW5kbGVMb2FkIiwicmVhZHlTdGF0ZSIsInJlc3BvbnNlVVJMIiwic2V0VGltZW91dCIsIm9uYWJvcnQiLCJoYW5kbGVBYm9ydCIsIkVDT05OQUJPUlRFRCIsIm9uZXJyb3IiLCJoYW5kbGVFcnJvciIsIkVSUl9ORVRXT1JLIiwib250aW1lb3V0IiwiaGFuZGxlVGltZW91dCIsInRpbWVvdXRFcnJvck1lc3NhZ2UiLCJFVElNRURPVVQiLCJ4c3JmVmFsdWUiLCJzZXRSZXF1ZXN0SGVhZGVyIiwid2l0aENyZWRlbnRpYWxzIiwib25Eb3dubG9hZFByb2dyZXNzIiwiYWRkRXZlbnRMaXN0ZW5lciIsIm9uVXBsb2FkUHJvZ3Jlc3MiLCJ1cGxvYWQiLCJjYW5jZWwiLCJhYm9ydCIsInN1YnNjcmliZSIsImFib3J0ZWQiLCJzZW5kIiwiaHR0cEFkYXB0ZXIiLCJ4aHJBZGFwdGVyIiwia25vd25BZGFwdGVycyIsInhociIsInJlbmRlclJlYXNvbiIsInJlYXNvbiIsImlzUmVzb2x2ZWRIYW5kbGUiLCJnZXRBZGFwdGVyIiwiYWRhcHRlcnMiLCJuYW1lT3JBZGFwdGVyIiwicmVqZWN0ZWRSZWFzb25zIiwicmVhc29ucyIsInN0YXRlIiwidGhyb3dJZkNhbmNlbGxhdGlvblJlcXVlc3RlZCIsInRocm93SWZSZXF1ZXN0ZWQiLCJkaXNwYXRjaFJlcXVlc3QiLCJvbkFkYXB0ZXJSZXNvbHV0aW9uIiwib25BZGFwdGVyUmVqZWN0aW9uIiwiaGVhZGVyc1RvT2JqZWN0IiwibWVyZ2VDb25maWciLCJjb25maWcxIiwiY29uZmlnMiIsImdldE1lcmdlZFZhbHVlIiwibWVyZ2VEZWVwUHJvcGVydGllcyIsInZhbHVlRnJvbUNvbmZpZzIiLCJkZWZhdWx0VG9Db25maWcyIiwibWVyZ2VEaXJlY3RLZXlzIiwibWVyZ2VNYXAiLCJ0aW1lb3V0TWVzc2FnZSIsImRlY29tcHJlc3MiLCJiZWZvcmVSZWRpcmVjdCIsInRyYW5zcG9ydCIsImh0dHBBZ2VudCIsImh0dHBzQWdlbnQiLCJzb2NrZXRQYXRoIiwicmVzcG9uc2VFbmNvZGluZyIsImNvbXB1dGVDb25maWdWYWx1ZSIsImNvbmZpZ1ZhbHVlIiwiVkVSU0lPTiIsInZhbGlkYXRvcnMiLCJ2YWxpZGF0b3IiLCJkZXByZWNhdGVkV2FybmluZ3MiLCJ2ZXJzaW9uIiwiZm9ybWF0TWVzc2FnZSIsIm9wdCIsImRlc2MiLCJvcHRzIiwiRVJSX0RFUFJFQ0FURUQiLCJjb25zb2xlIiwid2FybiIsImFzc2VydE9wdGlvbnMiLCJzY2hlbWEiLCJhbGxvd1Vua25vd24iLCJFUlJfQkFEX09QVElPTl9WQUxVRSIsIkVSUl9CQURfT1BUSU9OIiwiQXhpb3MiLCJpbnN0YW5jZUNvbmZpZyIsImludGVyY2VwdG9ycyIsImNvbmZpZ09yVXJsIiwiX3JlcXVlc3QiLCJkdW1teSIsImJvb2xlYW4iLCJmdW5jdGlvbiIsImNvbnRleHRIZWFkZXJzIiwicmVxdWVzdEludGVyY2VwdG9yQ2hhaW4iLCJzeW5jaHJvbm91c1JlcXVlc3RJbnRlcmNlcHRvcnMiLCJ1bnNoaWZ0UmVxdWVzdEludGVyY2VwdG9ycyIsImludGVyY2VwdG9yIiwidW5zaGlmdCIsInJlc3BvbnNlSW50ZXJjZXB0b3JDaGFpbiIsInB1c2hSZXNwb25zZUludGVyY2VwdG9ycyIsInByb21pc2UiLCJjaGFpbiIsIm5ld0NvbmZpZyIsIm9uRnVsZmlsbGVkIiwib25SZWplY3RlZCIsImdldFVyaSIsImZvckVhY2hNZXRob2ROb0RhdGEiLCJmb3JFYWNoTWV0aG9kV2l0aERhdGEiLCJnZW5lcmF0ZUhUVFBNZXRob2QiLCJpc0Zvcm0iLCJodHRwTWV0aG9kIiwiQ2FuY2VsVG9rZW4iLCJleGVjdXRvciIsInJlc29sdmVQcm9taXNlIiwicHJvbWlzZUV4ZWN1dG9yIiwiX2xpc3RlbmVycyIsIm9uZnVsZmlsbGVkIiwic3BsaWNlIiwiYyIsInNwcmVhZCIsImNhbGxiYWNrIiwiaXNBeGlvc0Vycm9yIiwicGF5bG9hZCIsIkh0dHBTdGF0dXNDb2RlIiwiQ29udGludWUiLCJTd2l0Y2hpbmdQcm90b2NvbHMiLCJQcm9jZXNzaW5nIiwiRWFybHlIaW50cyIsIk9rIiwiQ3JlYXRlZCIsIkFjY2VwdGVkIiwiTm9uQXV0aG9yaXRhdGl2ZUluZm9ybWF0aW9uIiwiTm9Db250ZW50IiwiUmVzZXRDb250ZW50IiwiUGFydGlhbENvbnRlbnQiLCJNdWx0aVN0YXR1cyIsIkFscmVhZHlSZXBvcnRlZCIsIkltVXNlZCIsIk11bHRpcGxlQ2hvaWNlcyIsIk1vdmVkUGVybWFuZW50bHkiLCJGb3VuZCIsIlNlZU90aGVyIiwiTm90TW9kaWZpZWQiLCJVc2VQcm94eSIsIlVudXNlZCIsIlRlbXBvcmFyeVJlZGlyZWN0IiwiUGVybWFuZW50UmVkaXJlY3QiLCJCYWRSZXF1ZXN0IiwiVW5hdXRob3JpemVkIiwiUGF5bWVudFJlcXVpcmVkIiwiRm9yYmlkZGVuIiwiTm90Rm91bmQiLCJNZXRob2ROb3RBbGxvd2VkIiwiTm90QWNjZXB0YWJsZSIsIlByb3h5QXV0aGVudGljYXRpb25SZXF1aXJlZCIsIlJlcXVlc3RUaW1lb3V0IiwiQ29uZmxpY3QiLCJHb25lIiwiTGVuZ3RoUmVxdWlyZWQiLCJQcmVjb25kaXRpb25GYWlsZWQiLCJQYXlsb2FkVG9vTGFyZ2UiLCJVcmlUb29Mb25nIiwiVW5zdXBwb3J0ZWRNZWRpYVR5cGUiLCJSYW5nZU5vdFNhdGlzZmlhYmxlIiwiRXhwZWN0YXRpb25GYWlsZWQiLCJJbUFUZWFwb3QiLCJNaXNkaXJlY3RlZFJlcXVlc3QiLCJVbnByb2Nlc3NhYmxlRW50aXR5IiwiTG9ja2VkIiwiRmFpbGVkRGVwZW5kZW5jeSIsIlRvb0Vhcmx5IiwiVXBncmFkZVJlcXVpcmVkIiwiUHJlY29uZGl0aW9uUmVxdWlyZWQiLCJUb29NYW55UmVxdWVzdHMiLCJSZXF1ZXN0SGVhZGVyRmllbGRzVG9vTGFyZ2UiLCJVbmF2YWlsYWJsZUZvckxlZ2FsUmVhc29ucyIsIkludGVybmFsU2VydmVyRXJyb3IiLCJOb3RJbXBsZW1lbnRlZCIsIkJhZEdhdGV3YXkiLCJTZXJ2aWNlVW5hdmFpbGFibGUiLCJHYXRld2F5VGltZW91dCIsIkh0dHBWZXJzaW9uTm90U3VwcG9ydGVkIiwiVmFyaWFudEFsc29OZWdvdGlhdGVzIiwiSW5zdWZmaWNpZW50U3RvcmFnZSIsIkxvb3BEZXRlY3RlZCIsIk5vdEV4dGVuZGVkIiwiTmV0d29ya0F1dGhlbnRpY2F0aW9uUmVxdWlyZWQiLCJjcmVhdGVJbnN0YW5jZSIsImRlZmF1bHRDb25maWciLCJpbnN0YW5jZSIsImF4aW9zIiwiQ2FuY2VsIiwiYWxsIiwicHJvbWlzZXMiLCJmb3JtVG9KU09OIiwiX2NsYXNzUHJpdmF0ZUZpZWxkU2V0IiwiX2NsYXNzUHJpdmF0ZUZpZWxkR2V0IiwiX2F4aW9zIiwiV2Vha01hcCIsIl9yZXF1ZXN0Q291bnQiLCJfbG9hZGluZ0luc3RhbmNlIiwiX2NvbmZpZyIsIkh0dHAiLCJzdWNjZXNzQ29kZSIsImVycm9yQ29kZSIsImNhbGxCYWNrQ29kZSIsImsiLCJfdGhpcyRyZXF1ZXN0Q291bnQiLCJfdGhpcyRyZXF1ZXN0Q291bnQyIiwibG9hZGluZyIsImF1dGhvcml6YXRpb24iLCJsb2NhbFN0b3JhZ2UiLCJfdGhpcyRyZXF1ZXN0Q291bnQzIiwiX3RoaXMkcmVxdWVzdENvdW50NCIsImNsb3NlIiwiX3RoaXMkcmVxdWVzdENvdW50NSIsIl90aGlzJHJlcXVlc3RDb3VudDYiLCJfaGFuZGxlUmVzdWx0Iiwic3VjY2VzcyIsIm1zZyIsInVwZGF0ZSIsImRvd25Mb2FkIiwiYmxvYiIsImxpbmsiLCJkaXNwbGF5IiwiVVJMIiwiY3JlYXRlT2JqZWN0VVJMIiwiZG93bmxvYWQiLCJyZXZva2VPYmplY3RVUkwiLCJyZXF1aXJlIiwiUGFnaW5hdGlvbiIsIlBhZ2VUYWJsZSIsIkRpYWxvZyIsIkNhcmQiLCJUcmVlIiwiX0h0dHAiLCJjb21zIiwiaW5zdGFsbCIsImNvbSIsImNvbXBvbmVudCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///2634\n");
|
17
17
|
|
18
18
|
/***/ }),
|
19
19
|
|
@@ -1997,7 +1997,7 @@ eval("\nvar DESCRIPTORS = __webpack_require__(3724);\nvar uncurryThis = __webpac
|
|
1997
1997
|
/******/ // startup
|
1998
1998
|
/******/ // Load entry module and return exports
|
1999
1999
|
/******/ // This entry module can't be inlined because the eval-source-map devtool is used.
|
2000
|
-
/******/ var __webpack_exports__ = __webpack_require__(
|
2000
|
+
/******/ var __webpack_exports__ = __webpack_require__(2634);
|
2001
2001
|
/******/ module.exports = __webpack_exports__;
|
2002
2002
|
/******/
|
2003
2003
|
/******/ })()
|