{"version":3,"sources":["webpack:///./src/views/upload/index.vue?421d","webpack:///./src/components/DeviceIndicator.vue","webpack:///./src/components/DeviceIndicator.vue?59d4","webpack:///./src/components/Spin.vue?5edc","webpack:///./src/components/Spin.vue?ef4c","webpack:///./src/components/Spin.vue","webpack:///./src/components/Spin.vue?71fb","webpack:///./src/assets/img/shortcut.png","webpack:///./src/components/DeviceIndicator.vue?0e62","webpack:///./src/components/PathItem.vue?481c","webpack:///./src/components/PathItem.vue","webpack:///./src/components/PathItem.vue?3d0b","webpack:///./src/components/PathChoicePop.vue?941d","webpack:///./src/components/PathChoicePop.vue","webpack:///./src/components/PathChoicePop.vue?4417","webpack:////var/static/node_modules/.pnpm/@xunlei+bencode-worker@0.1.3/node_modules/@xunlei/bencode-worker/dist/lib/index.es.js","webpack:////var/static/shared/utils/download.ts","webpack:///./src/views/upload/index.vue","webpack:///./src/views/upload/index.vue?34ff","webpack:///./src/components/PathChoicePop.vue?38aa","webpack:///./src/components/PathItem.vue?94f8"],"names":["__name","__props","deviceStore","curDeviceRunner","_deviceStore$currentD","currentDeviceRef","runnerTaskRef","currentStatus","_curDeviceRunner$valu","value","phase","currentName","_curDeviceRunner$valu2","name","heziStore","getHezi","_ctx","_cache","class","__exports__","_hoisted_1","key","render","$props","$setup","$data","$options","showCover","style","top","height","size","width","props","type","Number","default","Boolean","module","exports","path","icon","onClick","$event","title","showClose","href","onClose","emits","computed","_this$path","_this$$store$state$de","_this$$store$state","this","ParentID","aliasMap","$store","state","deviceInfoWatchData","downloads","methods","$emit","index","_withScopeId","n","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_ctx$historyDownloadP","_component_PathItem","_component_Spin","hidden","isInRoot","args","getUpperPath","closeFrame","showTrees","children","length","onHandleGetIn","handleGetIn","onHandleDelete","handleDelete","isLoading","historyDownloadPath","handleToast","shortCurrentDownloadPath","disabled","isWrite","okFrame","components","PathItem","Spin","store","rootNodes","id","count","RealPath","isLoaded","backIndex","deleteDeviceFileId","rootIndex","showPath","pathFolderName","_this$runnerPath","runnerPath","currentDownloadPath","pathArr","split","map","item","substring","showIndex","indexOf","join","slice","watch","val","deleteDevice","console","log","init","commit","_this$runnerPath2","path_split","root","loadFunction","filter","child","dir","pop","i","file","show","tip","okTxt","cancelTxt","cancel","action","dispatch","error","isHistory","push","node","data","v","icon_link","params","is_write","pathFolderId","rootSplitPath","visiblePathChoose","commitFunction","encodedJs","blob","window","Blob","atob","WorkerWrapper","objURL","URL","webkitURL","createObjectURL","Worker","revokeObjectURL","proxyMarker","Symbol","createEndpoint","releaseProxy","throwMarker","isObject","proxyTransferHandler","canHandle","obj","port1","port2","MessageChannel","expose","port","start","wrap","throwTransferHandler","serialized","Error","isError","message","stack","Object","assign","transferHandlers","Map","ep","self","addEventListener","callback","ev","argumentList","fromWireValue","returnValue","parent","reduce","obj2","prop","rawValue","apply","proxy","transfer","Promise","resolve","catch","then","returnValue2","wireValue","transferables","toWireValue","postMessage","removeEventListener","closeEndPoint","isMessagePort","endpoint","constructor","close","target","createProxy","throwIfProxyReleased","isReleased","isProxyReleased","proxy2","Proxy","_target","requestResponseMessage","p","toString","r","bind","_thisArg","rawArgumentList","last","processArguments","myFlat","arr","Array","prototype","concat","processed","transferCache","WeakMap","transfers","set","handler","serializedValue","serialize","get","deserialize","msg","generateUUID","l","fill","Math","floor","random","MAX_SAFE_INTEGER","async","decode","buf","codeType","Worker2","decodeWrap","result","magnetPrefix","trimMagnetValidUrl","url","urlOut","magnetUrlInfo","urlInfos","tag","tagValue","tagEnd","base32InfoHash","reg","test","fixLink","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","uploadUrls","isSupportBEncode","urls","hasTaskLink","uploadInput","envStore","errorHint","LIMIT_EXCEED","INVALID_LINK","OPERATION_FAILED","INVALID_BT","createFrom","getters","isVip","showHeader","downloadsPath","_store$state$deviceIn","_store$state$deviceIn2","realPath","showUploadBT","platform","targetDownloadPathDiskSpace","matchPath","maximumMatchPath","prev","curr","diskLeftSize","_targetDownloadPathDi","_targetDownloadPathDi2","_targetDownloadPathDi3","_targetDownloadPathDi4","limit","usage","onDeviceListClick","stat","canRemoveDevice","actionFrom","is","isBTFileMenuShow","toggle","toggleBTFileMenuShow","defaultIs","BTMenuShowHandler","document","setTimeout","handleUploadBT","click","checkWebWorkerCompatibility","supports","tester","handleBack","router","replace","query","currentRoute","isDownloadAvailable","download","param","taskParams","deviceFetch","method","showVip","error_description","taskType","isReplay","viewDuplicateTasks","taskItem","selects","back","checkDuplicateTask","existedTask","newTasks","_existedTask$tasks","tasks","downloadItem","_taskItem$params","file_name","res","body","button","text","checkDiskSizeAvailable","totalSize","pre","cur","file_size","center","beforeDownload","getAll","ts1","Date","now","isDiskSizeAvailable","ts2","isTaskDuplicate","ts3","ts4","downloadList","onUpload","space","action_from","click_id","allUrls","from","Set","newURLs","afterConfirm","triggerResolveURL","resolveBTFromDevice","_file$","_deviceStore$currentD2","needWritable","withParams","theme","maxChooseCount","trashed","eq","mime_type","prefix","needFileSource","needCreateFolder","checkboxShowCondition","file_extension","fileMapping","confirmCondition","chosenFiles","_i$mime_type","startsWith","fileID","proxyFetch","file_id","warn","resolveBtTask","evt","files","fileName","lastIndexOf","reader","FileReader","readAsArrayBuffer","onload","e","openShortCutPage","supportNavigatorClipboardAPI","navigator","clipboard","writeText","open","addShortcut","URL_ADD_TO_NAS","URL_CLIPBOARD_TO_NAS","options","themeClass","taskLink","isArray","String","isUseIOSHeader","placeholder","onInput","ref_key","ref","onChange","justOne","DeviceIndicator","PathChoicePop","src","alt"],"mappings":"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","file":"js/chunk-68eb960f.js","sourcesContent":["/* unplugin-vue-components disabled */export * from \"-!../../../../../node_modules/.pnpm/unplugin@1.4.0/node_modules/unplugin/dist/webpack/loaders/transform.js?unpluginName=unplugin-vue-components!../../../../../node_modules/.pnpm/mini-css-extract-plugin@0.9.0_webpack@4.46.0/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../../node_modules/.pnpm/css-loader@3.6.0_webpack@4.46.0/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../../node_modules/.pnpm/vue-loader@16.8.3_@vue+compiler-sfc@3.3.4_vue@3.3.4_webpack@4.46.0/node_modules/vue-loader/dist/stylePostLoader.js!../../../../../node_modules/.pnpm/postcss-loader@3.0.0/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../../node_modules/.pnpm/sass-loader@8.0.2_sass@1.65.1/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../../node_modules/.pnpm/cache-loader@4.1.0_webpack@4.46.0/node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../../../node_modules/.pnpm/vue-loader@16.8.3_@vue+compiler-sfc@3.3.4_vue@3.3.4_webpack@4.46.0/node_modules/vue-loader/dist/index.js??ref--1-1!./index.vue?vue&type=style&index=0&id=714ff170&lang=scss\"","import { defineComponent as _defineComponent } from 'vue';\nimport { toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, normalizeClass as _normalizeClass, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\";\nimport { computed, onMounted } from 'vue';\nimport { useHeziStore } from '@remote/store/hezi';\nimport { useDeviceStore } from '@remote/store/device';\nexport default /*#__PURE__*/_defineComponent({\n __name: 'DeviceIndicator',\n setup(__props) {\n const deviceStore = useDeviceStore();\n const curDeviceRunner = computed(() => {\n var _deviceStore$currentD;\n return (_deviceStore$currentD = deviceStore.currentDeviceRef) === null || _deviceStore$currentD === void 0 ? void 0 : _deviceStore$currentD.runnerTaskRef;\n });\n const currentStatus = computed(() => {\n var _curDeviceRunner$valu;\n return ((_curDeviceRunner$valu = curDeviceRunner.value) === null || _curDeviceRunner$valu === void 0 ? void 0 : _curDeviceRunner$valu.phase) === 'PHASE_TYPE_RUNNING';\n });\n const currentName = computed(() => {\n var _curDeviceRunner$valu2;\n return (_curDeviceRunner$valu2 = curDeviceRunner.value) === null || _curDeviceRunner$valu2 === void 0 ? void 0 : _curDeviceRunner$valu2.name;\n });\n const heziStore = useHeziStore();\n onMounted(() => {\n heziStore.getHezi();\n });\n return (_ctx, _cache) => {\n return _openBlock(), _createElementBlock(\"div\", {\n class: _normalizeClass(['current-device', currentStatus.value ? 'active' : ''])\n }, [_createElementVNode(\"span\", null, _toDisplayString(currentName.value ? currentName.value : '获取设备状态中'), 1)], 2);\n };\n }\n});","/* unplugin-vue-components disabled */import script from \"./DeviceIndicator.vue?vue&type=script&lang=ts&setup=true\"\nexport * from \"./DeviceIndicator.vue?vue&type=script&lang=ts&setup=true\"\n\nimport \"./DeviceIndicator.vue?vue&type=style&index=0&id=72a44b12&lang=scss&scoped=true\"\n\nimport exportComponent from \"/var/static/node_modules/.pnpm/vue-loader@16.8.3_@vue+compiler-sfc@3.3.4_vue@3.3.4_webpack@4.46.0/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['__scopeId',\"data-v-72a44b12\"]])\n\nexport default __exports__","/* unplugin-vue-components disabled */export * from \"-!../../../../node_modules/.pnpm/unplugin@1.4.0/node_modules/unplugin/dist/webpack/loaders/transform.js?unpluginName=unplugin-vue-components!../../../../node_modules/.pnpm/mini-css-extract-plugin@0.9.0_webpack@4.46.0/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../node_modules/.pnpm/css-loader@3.6.0_webpack@4.46.0/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../node_modules/.pnpm/vue-loader@16.8.3_@vue+compiler-sfc@3.3.4_vue@3.3.4_webpack@4.46.0/node_modules/vue-loader/dist/stylePostLoader.js!../../../../node_modules/.pnpm/postcss-loader@3.0.0/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../node_modules/.pnpm/sass-loader@8.0.2_sass@1.65.1/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../node_modules/.pnpm/cache-loader@4.1.0_webpack@4.46.0/node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../../node_modules/.pnpm/vue-loader@16.8.3_@vue+compiler-sfc@3.3.4_vue@3.3.4_webpack@4.46.0/node_modules/vue-loader/dist/index.js??ref--1-1!./Spin.vue?vue&type=style&index=0&id=3b9d62ba&lang=scss&scoped=true\"","import { openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, normalizeStyle as _normalizeStyle, createElementVNode as _createElementVNode, Fragment as _Fragment, pushScopeId as _pushScopeId, popScopeId as _popScopeId } from \"vue\";\nconst _withScopeId = n => (_pushScopeId(\"data-v-3b9d62ba\"), n = n(), _popScopeId(), n);\nconst _hoisted_1 = {\n key: 0,\n class: \"cover\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n return _openBlock(), _createElementBlock(_Fragment, null, [_ctx.showCover ? (_openBlock(), _createElementBlock(\"div\", _hoisted_1)) : _createCommentVNode(\"\", true), _createElementVNode(\"div\", {\n class: \"loading\",\n style: _normalizeStyle({\n top: _ctx.top + 'px'\n })\n }, [_createElementVNode(\"div\", {\n class: \"loading__image\",\n style: _normalizeStyle({\n height: _ctx.size + 'px',\n width: _ctx.size + 'px'\n })\n }, null, 4)], 4)], 64);\n}","import { defineComponent } from 'vue';\nexport default defineComponent({\n props: {\n size: {\n type: Number,\n default: 30\n },\n top: {\n type: Number,\n default: 0\n },\n showCover: {\n type: Boolean,\n default: false\n }\n },\n setup() {\n return {};\n }\n});","/* unplugin-vue-components disabled */import { render } from \"./Spin.vue?vue&type=template&id=3b9d62ba&scoped=true&ts=true\"\nimport script from \"./Spin.vue?vue&type=script&lang=ts\"\nexport * from \"./Spin.vue?vue&type=script&lang=ts\"\n\nimport \"./Spin.vue?vue&type=style&index=0&id=3b9d62ba&lang=scss&scoped=true\"\n\nimport exportComponent from \"/var/static/node_modules/.pnpm/vue-loader@16.8.3_@vue+compiler-sfc@3.3.4_vue@3.3.4_webpack@4.46.0/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-3b9d62ba\"]])\n\nexport default __exports__","module.exports = __webpack_public_path__ + \"img/shortcut.png\";","/* unplugin-vue-components disabled */export * from \"-!../../../../node_modules/.pnpm/unplugin@1.4.0/node_modules/unplugin/dist/webpack/loaders/transform.js?unpluginName=unplugin-vue-components!../../../../node_modules/.pnpm/mini-css-extract-plugin@0.9.0_webpack@4.46.0/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../node_modules/.pnpm/css-loader@3.6.0_webpack@4.46.0/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../node_modules/.pnpm/vue-loader@16.8.3_@vue+compiler-sfc@3.3.4_vue@3.3.4_webpack@4.46.0/node_modules/vue-loader/dist/stylePostLoader.js!../../../../node_modules/.pnpm/postcss-loader@3.0.0/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../node_modules/.pnpm/sass-loader@8.0.2_sass@1.65.1/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../node_modules/.pnpm/cache-loader@4.1.0_webpack@4.46.0/node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../../node_modules/.pnpm/vue-loader@16.8.3_@vue+compiler-sfc@3.3.4_vue@3.3.4_webpack@4.46.0/node_modules/vue-loader/dist/index.js??ref--1-1!./DeviceIndicator.vue?vue&type=style&index=0&id=72a44b12&lang=scss&scoped=true\"","import { normalizeStyle as _normalizeStyle, createElementVNode as _createElementVNode, toDisplayString as _toDisplayString, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode } from \"vue\";\nconst _hoisted_1 = {\n class: \"path-node__item\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n return _openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createElementVNode(\"span\", {\n class: \"path-node__icon\",\n style: _normalizeStyle(`background-image: url(${_ctx.path.icon})`),\n onClick: _cache[0] || (_cache[0] = $event => _ctx.onClick())\n }, null, 4), _createElementVNode(\"span\", {\n class: \"path-node__title\",\n onClick: _cache[1] || (_cache[1] = $event => _ctx.onClick())\n }, _toDisplayString(_ctx.title), 1), _ctx.path.showClose ? (_openBlock(), _createElementBlock(\"a\", {\n key: 0,\n href: \"javascript:;\",\n class: \"qh-icon-delete-nav\",\n onClick: _cache[2] || (_cache[2] = $event => _ctx.onClose())\n })) : _createCommentVNode(\"\", true)]);\n}","import { createAliasMapFromDownloads, replaceRootAlias } from '@remote/utils';\nimport { defineComponent } from 'vue';\nexport default defineComponent({\n name: 'PathNode',\n props: ['index', 'path'],\n emits: ['handleGetIn', 'handleDelete'],\n data() {\n return {};\n },\n computed: {\n title() {\n var _this$path;\n if (((_this$path = this.path) === null || _this$path === void 0 ? void 0 : _this$path.ParentID) === '') {\n var _this$$store$state$de, _this$$store$state;\n return replaceRootAlias({\n path: this.path.title,\n aliasMap: createAliasMapFromDownloads((_this$$store$state$de = (_this$$store$state = this.$store.state) === null || _this$$store$state === void 0 || (_this$$store$state = _this$$store$state.deviceInfoWatchData) === null || _this$$store$state === void 0 ? void 0 : _this$$store$state.downloads) !== null && _this$$store$state$de !== void 0 ? _this$$store$state$de : [])\n });\n }\n return this.path.title;\n }\n },\n methods: {\n async onClick() {\n this.$emit('handleGetIn', this.index);\n },\n onClose() {\n this.$emit('handleDelete', this.path);\n }\n }\n});","/* unplugin-vue-components disabled */import { render } from \"./PathItem.vue?vue&type=template&id=0a749f22&ts=true\"\nimport script from \"./PathItem.vue?vue&type=script&lang=ts\"\nexport * from \"./PathItem.vue?vue&type=script&lang=ts\"\n\nimport \"./PathItem.vue?vue&type=style&index=0&id=0a749f22&lang=scss\"\n\nimport exportComponent from \"/var/static/node_modules/.pnpm/vue-loader@16.8.3_@vue+compiler-sfc@3.3.4_vue@3.3.4_webpack@4.46.0/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { createElementVNode as _createElementVNode, createTextVNode as _createTextVNode, normalizeClass as _normalizeClass, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, resolveComponent as _resolveComponent, createVNode as _createVNode, createCommentVNode as _createCommentVNode, toDisplayString as _toDisplayString, withModifiers as _withModifiers, createBlock as _createBlock, pushScopeId as _pushScopeId, popScopeId as _popScopeId } from \"vue\";\nconst _withScopeId = n => (_pushScopeId(\"data-v-0f0b1a86\"), n = n(), _popScopeId(), n);\nconst _hoisted_1 = {\n class: \"path-mask-layer\"\n};\nconst _hoisted_2 = [\"onClick\"];\nconst _hoisted_3 = {\n class: \"navigation-frame\"\n};\nconst _hoisted_4 = /*#__PURE__*/_withScopeId(() => /*#__PURE__*/_createElementVNode(\"span\", {\n class: \"qh-icon-more\"\n}, null, -1));\nconst _hoisted_5 = /*#__PURE__*/_withScopeId(() => /*#__PURE__*/_createElementVNode(\"div\", {\n class: \"current-path\"\n}, [/*#__PURE__*/_createElementVNode(\"span\", {\n class: \"title\"\n}, \"下载路径选择\")], -1));\nconst _hoisted_6 = {\n key: 0,\n class: \"file-frame\"\n};\nconst _hoisted_7 = {\n key: 1,\n class: \"empty\"\n};\nconst _hoisted_8 = /*#__PURE__*/_withScopeId(() => /*#__PURE__*/_createElementVNode(\"h2\", null, \"历史记录\", -1));\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n var _ctx$historyDownloadP;\n const _component_PathItem = _resolveComponent(\"PathItem\");\n const _component_Spin = _resolveComponent(\"Spin\");\n return _openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createElementVNode(\"div\", {\n class: \"footer-frame\",\n onClick: _withModifiers(() => null, [\"stop\"])\n }, [_createElementVNode(\"div\", _hoisted_3, [_createElementVNode(\"span\", {\n class: _normalizeClass([\"back-path\", {\n hidden: _ctx.isInRoot\n }]),\n onClick: _cache[0] || (_cache[0] =\n //@ts-ignore\n (...args) => _ctx.getUpperPath && _ctx.getUpperPath(...args))\n }, [_hoisted_4, _createTextVNode(\"返回\")], 2), _hoisted_5, _createElementVNode(\"a\", {\n href: \"javascript:;\",\n class: \"close-frame qh-icon-close\",\n onClick: _cache[1] || (_cache[1] =\n //@ts-ignore\n (...args) => _ctx.closeFrame && _ctx.closeFrame(...args))\n })]), _ctx.showTrees ? (_openBlock(), _createElementBlock(\"div\", _hoisted_6, [_ctx.showTrees.children.length ? (_openBlock(true), _createElementBlock(_Fragment, {\n key: 0\n }, _renderList(_ctx.showTrees.children, (path, index) => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: index,\n class: \"path-node\"\n }, [_createVNode(_component_PathItem, {\n index: index,\n path: path,\n onHandleGetIn: $event => _ctx.handleGetIn(index),\n onHandleDelete: _ctx.handleDelete\n }, null, 8, [\"index\", \"path\", \"onHandleGetIn\", \"onHandleDelete\"])]);\n }), 128)) : !_ctx.isLoading ? (_openBlock(), _createElementBlock(\"div\", _hoisted_7, \" 该文件夹下无其他目录 \")) : _createCommentVNode(\"\", true), _ctx.isInRoot && (_ctx$historyDownloadP = _ctx.historyDownloadPath) !== null && _ctx$historyDownloadP !== void 0 && _ctx$historyDownloadP.length ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 2\n }, [_hoisted_8, (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.historyDownloadPath, (path, index) => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: index,\n class: \"path-node\"\n }, [_createVNode(_component_PathItem, {\n index: index,\n path: path,\n onHandleGetIn: $event => _ctx.handleGetIn(index, true),\n onHandleDelete: _ctx.handleDelete\n }, null, 8, [\"index\", \"path\", \"onHandleGetIn\", \"onHandleDelete\"])]);\n }), 128))], 64)) : _createCommentVNode(\"\", true)])) : _createCommentVNode(\"\", true), _createElementVNode(\"div\", {\n class: \"other-directory\",\n onClick: _cache[2] || (_cache[2] =\n //@ts-ignore\n (...args) => _ctx.handleToast && _ctx.handleToast(...args))\n }, [_createElementVNode(\"span\", null, \"下载到:\" + _toDisplayString(_ctx.shortCurrentDownloadPath), 1)]), _createElementVNode(\"div\", {\n class: _normalizeClass([\"submit-frame\", {\n disabled: !_ctx.showTrees.isWrite\n }]),\n onClick: _cache[3] || (_cache[3] =\n //@ts-ignore\n (...args) => _ctx.okFrame && _ctx.okFrame(...args))\n }, \" 确定 \", 2)], 8, _hoisted_2), _ctx.isLoading ? (_openBlock(), _createBlock(_component_Spin, {\n key: 0,\n \"show-cover\": \"\",\n top: 300\n })) : _createCommentVNode(\"\", true)]);\n}","import \"core-js/modules/es.array.push.js\";\nimport { defineComponent } from 'vue';\nimport { mapState, mapGetters, useStore } from 'vuex';\nimport PathItem from '@remote/components/PathItem.vue';\nimport Icons from '@remote/utils/static-icons';\nimport Spin from '@remote/components/Spin.vue';\nimport { createAliasMapFromDownloads, replaceRootAlias } from '@remote/utils';\nexport default defineComponent({\n components: {\n PathItem,\n Spin\n },\n setup() {\n return {\n store: useStore()\n };\n },\n data() {\n return {\n rootNodes: {},\n showTrees: {\n id: '',\n title: '',\n count: 0,\n icon: '',\n RealPath: '',\n isLoaded: false,\n isWrite: false,\n children: []\n },\n backIndex: [],\n isInRoot: true,\n isLoading: false,\n deleteDeviceFileId: '',\n rootIndex: 0\n };\n },\n computed: {\n ...mapState(['all', 'pathFolderName', 'pathFolderId', 'paths', 'isSupportProxy', 'action', 'historyDownloadPath']),\n ...mapGetters(['runnerPath', 'showPath']),\n currentDownloadPath() {\n var _this$$store$state$de, _this$$store$state;\n let showPath = '';\n if (this.showTrees.RealPath) {\n // 点击后的路径\n showPath = this.showTrees.RealPath;\n } else if (this.pathFolderName) {\n // 手动选择的路径\n showPath = this.pathFolderName;\n } else {\n var _this$runnerPath;\n // 默认路径\n showPath = (_this$runnerPath = this.runnerPath) === null || _this$runnerPath === void 0 ? void 0 : _this$runnerPath.path;\n }\n showPath = replaceRootAlias({\n path: showPath,\n aliasMap: createAliasMapFromDownloads((_this$$store$state$de = (_this$$store$state = this.$store.state) === null || _this$$store$state === void 0 || (_this$$store$state = _this$$store$state.deviceInfoWatchData) === null || _this$$store$state === void 0 ? void 0 : _this$$store$state.downloads) !== null && _this$$store$state$de !== void 0 ? _this$$store$state$de : [])\n });\n return showPath;\n },\n shortCurrentDownloadPath() {\n let showPath = this.currentDownloadPath;\n let pathArr = showPath.split('/');\n pathArr = pathArr.map(item => {\n return item.length > 5 ? `${item.substring(0, 4)}...` : item;\n });\n const showIndex = pathArr.indexOf('迅雷') === -1 ? pathArr.indexOf('迅雷下载') : pathArr.indexOf('迅雷');\n if (showIndex >= 0) {\n if (pathArr.length > 4) {\n return ['...', pathArr[pathArr.length - 3], pathArr[pathArr.length - 2], pathArr[pathArr.length - 1]].join('/');\n }\n const path = ['...', ...pathArr.slice(showIndex)].join('/');\n return path;\n } else {\n if (pathArr.length > 4) {\n return ['...', pathArr[pathArr.length - 3], pathArr[pathArr.length - 2], pathArr[pathArr.length - 1]].join('/');\n }\n const path = ['...', ...pathArr.slice(1)].join('/');\n return path;\n }\n }\n },\n watch: {\n action(val) {\n if (val === 'delete-device') {\n this.deleteDevice();\n }\n },\n showTrees(val) {\n console.log('showTrees changed', val);\n }\n },\n async mounted() {\n this.init();\n },\n methods: {\n handleToast() {\n this.store.commit('toast', this.currentDownloadPath);\n },\n async init() {\n var _this$runnerPath2;\n console.log('this.runnerPath', this.runnerPath);\n const path_split = (((_this$runnerPath2 = this.runnerPath) === null || _this$runnerPath2 === void 0 ? void 0 : _this$runnerPath2.path) || '').split('/');\n const title = path_split[path_split.length - 2];\n const root = await this.loadFunction({\n id: '0'\n });\n const children = root.filter(child => child.isWrite);\n const rootNodes = {\n id: '0',\n title: title,\n count: 10,\n icon: Icons.dir,\n RealPath: '',\n isWrite: false,\n isLoaded: true,\n children\n };\n this.rootNodes = rootNodes;\n this.isInRoot = true;\n this.showTrees = this.rootNodes;\n },\n getUpperPath() {\n if (this.backIndex.length > 0) {\n this.backIndex.pop();\n let showTrees = this.rootNodes.children[this.rootIndex];\n for (let i = 0; i < this.backIndex.length; i++) {\n showTrees = showTrees.children[this.backIndex[i]];\n }\n this.showTrees = showTrees;\n } else {\n this.init();\n }\n },\n goFileIndex() {\n this.showTrees = this.rootNodes.children[this.rootIndex];\n this.backIndex = [];\n },\n async handleDelete(file) {\n this.deleteDeviceFileId = file.id;\n this.store.commit('dialog', {\n show: true,\n title: '确认删除该目录?',\n tip: '',\n okTxt: '确定',\n cancelTxt: '取消',\n cancel: '',\n action: 'delete-device'\n });\n },\n async deleteDevice() {\n this.store.commit('dialog', {\n show: false\n });\n this.isLoading = true;\n try {\n await this.store.dispatch('deleteDeviceDownloadPath', this.deleteDeviceFileId);\n await this.store.dispatch('getDeviceDownloadPath');\n this.isLoading = false;\n this.init();\n } catch (error) {\n this.isLoading = false;\n }\n },\n async handleGetIn(index, isHistory) {\n const showTrees = isHistory ? this.historyDownloadPath[index] : this.showTrees.children[index];\n if (!showTrees.isLoaded) {\n const children = await this.loadFunction(showTrees);\n if (children) {\n showTrees.children = children;\n showTrees.isLoaded = true;\n }\n }\n this.showTrees = showTrees;\n if (this.isInRoot) {\n this.isInRoot = false;\n this.rootIndex = index;\n } else {\n this.backIndex.push(index);\n }\n console.log('this.showTrees', this.showTrees, this.rootNodes);\n },\n async loadFunction(node) {\n this.isLoading = true;\n const data = await this.store.dispatch('getPaths', node.id);\n this.isLoading = false;\n return data ? data.map(v => ({\n id: v.id,\n title: v.name,\n icon: v.icon_link || Icons.dir,\n isLoaded: false,\n RealPath: v.params.RealPath,\n isWrite: v.params.is_write === 'true',\n children: []\n })) : [];\n },\n commitFunction() {\n console.log('this.showTrees', this.showTrees);\n if (this.showTrees.id !== '0') {\n this.store.commit('update', {\n pathFolderId: this.showTrees.id,\n pathFolderName: this.showTrees.RealPath\n });\n } else {\n this.store.commit('update', {\n pathFolderId: '',\n pathFolderName: ''\n });\n }\n this.store.commit('update', {\n rootSplitPath: this.showTrees.RealPath.slice(0, 8)\n });\n },\n closeFrame() {\n this.store.commit('update', {\n visiblePathChoose: false\n });\n },\n okFrame() {\n if (this.showTrees.isWrite) {\n this.commitFunction();\n this.store.commit('update', {\n visiblePathChoose: false\n });\n }\n }\n }\n});","/* unplugin-vue-components disabled */import { render } from \"./PathChoicePop.vue?vue&type=template&id=0f0b1a86&scoped=true&ts=true\"\nimport script from \"./PathChoicePop.vue?vue&type=script&lang=ts\"\nexport * from \"./PathChoicePop.vue?vue&type=script&lang=ts\"\n\nimport \"./PathChoicePop.vue?vue&type=style&index=0&id=0f0b1a86&lang=scss&scoped=true\"\n\nimport exportComponent from \"/var/static/node_modules/.pnpm/vue-loader@16.8.3_@vue+compiler-sfc@3.3.4_vue@3.3.4_webpack@4.46.0/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-0f0b1a86\"]])\n\nexport default __exports__","const encodedJs = \"KGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO2NvbnN0IG5yPVN5bWJvbCgiQ29tbGluay5wcm94eSIpLHBlPVN5bWJvbCgiQ29tbGluay5lbmRwb2ludCIpLGRlPVN5bWJvbCgiQ29tbGluay5yZWxlYXNlUHJveHkiKSxNMD1TeW1ib2woIkNvbWxpbmsudGhyb3duIiksaXI9dD0+dHlwZW9mIHQ9PSJvYmplY3QiJiZ0IT09bnVsbHx8dHlwZW9mIHQ9PSJmdW5jdGlvbiIsX2U9e2NhbkhhbmRsZTp0PT5pcih0KSYmdFtucl0sc2VyaWFsaXplKHQpe2NvbnN0e3BvcnQxOmUscG9ydDI6cn09bmV3IE1lc3NhZ2VDaGFubmVsO3JldHVybiBPMCh0LGUpLFtyLFtyXV19LGRlc2VyaWFsaXplKHQpe3JldHVybiB0LnN0YXJ0KCksd2UodCl9fSxnZT17Y2FuSGFuZGxlOnQ9PmlyKHQpJiZNMCBpbiB0LHNlcmlhbGl6ZSh7dmFsdWU6dH0pe2xldCBlO3JldHVybiB0IGluc3RhbmNlb2YgRXJyb3I/ZT17aXNFcnJvcjohMCx2YWx1ZTp7bWVzc2FnZTp0Lm1lc3NhZ2UsbmFtZTp0Lm5hbWUsc3RhY2s6dC5zdGFja319OmU9e2lzRXJyb3I6ITEsdmFsdWU6dH0sW2UsW11dfSxkZXNlcmlhbGl6ZSh0KXt0aHJvdyB0LmlzRXJyb3I/T2JqZWN0LmFzc2lnbihuZXcgRXJyb3IodC52YWx1ZS5tZXNzYWdlKSx0LnZhbHVlKTp0LnZhbHVlfX0sb3I9bmV3IE1hcChbWyJwcm94eSIsX2VdLFsidGhyb3ciLGdlXV0pO2Z1bmN0aW9uIE8wKHQsZT1zZWxmKXtlLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uIHIobil7aWYoIW58fCFuLmRhdGEpcmV0dXJuO2NvbnN0e2lkOmksdHlwZTphLHBhdGg6c309T2JqZWN0LmFzc2lnbih7cGF0aDpbXX0sbi5kYXRhKSxmPShuLmRhdGEuYXJndW1lbnRMaXN0fHxbXSkubWFwKHUwKTtsZXQgdTt0cnl7Y29uc3Qgbz1zLnNsaWNlKDAsLTEpLnJlZHVjZSgocCxjKT0+cFtjXSx0KSx4PXMucmVkdWNlKChwLGMpPT5wW2NdLHQpO3N3aXRjaChhKXtjYXNlIkdFVCI6dT14O2JyZWFrO2Nhc2UiU0VUIjpvW3Muc2xpY2UoLTEpWzBdXT11MChuLmRhdGEudmFsdWUpLHU9ITA7YnJlYWs7Y2FzZSJBUFBMWSI6dT14LmFwcGx5KG8sZik7YnJlYWs7Y2FzZSJDT05TVFJVQ1QiOntjb25zdCBwPW5ldyB4KC4uLmYpO3U9bWUocCl9YnJlYWs7Y2FzZSJFTkRQT0lOVCI6e2NvbnN0e3BvcnQxOnAscG9ydDI6Y309bmV3IE1lc3NhZ2VDaGFubmVsO08wKHQsYyksdT1CZShwLFtwXSl9YnJlYWs7Y2FzZSJSRUxFQVNFIjp1PXZvaWQgMDticmVhaztkZWZhdWx0OnJldHVybn19Y2F0Y2gobyl7dT17dmFsdWU6byxbTTBdOjB9fVByb21pc2UucmVzb2x2ZSh1KS5jYXRjaChvPT4oe3ZhbHVlOm8sW00wXTowfSkpLnRoZW4obz0+e2NvbnN0W3gscF09RzAobyk7ZS5wb3N0TWVzc2FnZShPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30seCkse2lkOml9KSxwKSxhPT09IlJFTEVBU0UiJiYoZS5yZW1vdmVFdmVudExpc3RlbmVyKCJtZXNzYWdlIixyKSxhcihlKSl9KX0pLGUuc3RhcnQmJmUuc3RhcnQoKX1mdW5jdGlvbiB5ZSh0KXtyZXR1cm4gdC5jb25zdHJ1Y3Rvci5uYW1lPT09Ik1lc3NhZ2VQb3J0In1mdW5jdGlvbiBhcih0KXt5ZSh0KSYmdC5jbG9zZSgpfWZ1bmN0aW9uIHdlKHQsZSl7cmV0dXJuIEswKHQsW10sZSl9ZnVuY3Rpb24gUjAodCl7aWYodCl0aHJvdyBuZXcgRXJyb3IoIlByb3h5IGhhcyBiZWVuIHJlbGVhc2VkIGFuZCBpcyBub3QgdXNlYWJsZSIpfWZ1bmN0aW9uIEswKHQsZT1bXSxyPWZ1bmN0aW9uKCl7fSl7bGV0IG49ITE7Y29uc3QgaT1uZXcgUHJveHkocix7Z2V0KGEscyl7aWYoUjAobikscz09PWRlKXJldHVybigpPT5wMCh0LHt0eXBlOiJSRUxFQVNFIixwYXRoOmUubWFwKGY9PmYudG9TdHJpbmcoKSl9KS50aGVuKCgpPT57YXIodCksbj0hMH0pO2lmKHM9PT0idGhlbiIpe2lmKGUubGVuZ3RoPT09MClyZXR1cm57dGhlbjooKT0+aX07Y29uc3QgZj1wMCh0LHt0eXBlOiJHRVQiLHBhdGg6ZS5tYXAodT0+dS50b1N0cmluZygpKX0pLnRoZW4odTApO3JldHVybiBmLnRoZW4uYmluZChmKX1yZXR1cm4gSzAodCxbLi4uZSxzXSl9LHNldChhLHMsZil7UjAobik7Y29uc3RbdSxvXT1HMChmKTtyZXR1cm4gcDAodCx7dHlwZToiU0VUIixwYXRoOlsuLi5lLHNdLm1hcCh4PT54LnRvU3RyaW5nKCkpLHZhbHVlOnV9LG8pLnRoZW4odTApfSxhcHBseShhLHMsZil7UjAobik7Y29uc3QgdT1lW2UubGVuZ3RoLTFdO2lmKHU9PT1wZSlyZXR1cm4gcDAodCx7dHlwZToiRU5EUE9JTlQifSkudGhlbih1MCk7aWYodT09PSJiaW5kIilyZXR1cm4gSzAodCxlLnNsaWNlKDAsLTEpKTtjb25zdFtvLHhdPXhyKGYpO3JldHVybiBwMCh0LHt0eXBlOiJBUFBMWSIscGF0aDplLm1hcChwPT5wLnRvU3RyaW5nKCkpLGFyZ3VtZW50TGlzdDpvfSx4KS50aGVuKHUwKX0sY29uc3RydWN0KGEscyl7UjAobik7Y29uc3RbZix1XT14cihzKTtyZXR1cm4gcDAodCx7dHlwZToiQ09OU1RSVUNUIixwYXRoOmUubWFwKG89Pm8udG9TdHJpbmcoKSksYXJndW1lbnRMaXN0OmZ9LHUpLnRoZW4odTApfX0pO3JldHVybiBpfWZ1bmN0aW9uIGJlKHQpe3JldHVybiBBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFtdLHQpfWZ1bmN0aW9uIHhyKHQpe2NvbnN0IGU9dC5tYXAoRzApO3JldHVybltlLm1hcChyPT5yWzBdKSxiZShlLm1hcChyPT5yWzFdKSldfWNvbnN0IHNyPW5ldyBXZWFrTWFwO2Z1bmN0aW9uIEJlKHQsZSl7cmV0dXJuIHNyLnNldCh0LGUpLHR9ZnVuY3Rpb24gbWUodCl7cmV0dXJuIE9iamVjdC5hc3NpZ24odCx7W25yXTohMH0pfWZ1bmN0aW9uIEcwKHQpe2Zvcihjb25zdFtlLHJdb2Ygb3IpaWYoci5jYW5IYW5kbGUodCkpe2NvbnN0W24saV09ci5zZXJpYWxpemUodCk7cmV0dXJuW3t0eXBlOiJIQU5ETEVSIixuYW1lOmUsdmFsdWU6bn0saV19cmV0dXJuW3t0eXBlOiJSQVciLHZhbHVlOnR9LHNyLmdldCh0KXx8W11dfWZ1bmN0aW9uIHUwKHQpe3N3aXRjaCh0LnR5cGUpe2Nhc2UiSEFORExFUiI6cmV0dXJuIG9yLmdldCh0Lm5hbWUpLmRlc2VyaWFsaXplKHQudmFsdWUpO2Nhc2UiUkFXIjpyZXR1cm4gdC52YWx1ZX19ZnVuY3Rpb24gcDAodCxlLHIpe3JldHVybiBuZXcgUHJvbWlzZShuPT57Y29uc3QgaT1BZSgpO3QuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZnVuY3Rpb24gYShzKXshcy5kYXRhfHwhcy5kYXRhLmlkfHxzLmRhdGEuaWQhPT1pfHwodC5yZW1vdmVFdmVudExpc3RlbmVyKCJtZXNzYWdlIixhKSxuKHMuZGF0YSkpfSksdC5zdGFydCYmdC5zdGFydCgpLHQucG9zdE1lc3NhZ2UoT2JqZWN0LmFzc2lnbih7aWQ6aX0sZSkscil9KX1mdW5jdGlvbiBBZSgpe3JldHVybiBuZXcgQXJyYXkoNCkuZmlsbCgwKS5tYXAoKCk9Pk1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpOdW1iZXIuTUFYX1NBRkVfSU5URUdFUikudG9TdHJpbmcoMTYpKS5qb2luKCItIil9ZnVuY3Rpb24gY3IodCxlLHIpe3JldHVybiByPXtwYXRoOmUsZXhwb3J0czp7fSxyZXF1aXJlOmZ1bmN0aW9uKG4saSl7cmV0dXJuIEVlKG4saT09bnVsbD9yLnBhdGg6aSl9fSx0KHIsci5leHBvcnRzKSxyLmV4cG9ydHN9ZnVuY3Rpb24gRWUoKXt0aHJvdyBuZXcgRXJyb3IoIkR5bmFtaWMgcmVxdWlyZXMgYXJlIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkIGJ5IEByb2xsdXAvcGx1Z2luLWNvbW1vbmpzIil9dmFyIGZyPXR5cGVvZiBnbG9iYWwhPSJ1bmRlZmluZWQiP2dsb2JhbDp0eXBlb2Ygc2VsZiE9InVuZGVmaW5lZCI/c2VsZjp0eXBlb2Ygd2luZG93IT0idW5kZWZpbmVkIj93aW5kb3c6e30sbzA9W10sZTA9W10sa2U9dHlwZW9mIFVpbnQ4QXJyYXkhPSJ1bmRlZmluZWQiP1VpbnQ4QXJyYXk6QXJyYXksWDA9ITE7ZnVuY3Rpb24gdXIoKXtYMD0hMDtmb3IodmFyIHQ9IkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8iLGU9MCxyPXQubGVuZ3RoO2U8cjsrK2UpbzBbZV09dFtlXSxlMFt0LmNoYXJDb2RlQXQoZSldPWU7ZTBbIi0iLmNoYXJDb2RlQXQoMCldPTYyLGUwWyJfIi5jaGFyQ29kZUF0KDApXT02M31mdW5jdGlvbiBDZSh0KXtYMHx8dXIoKTt2YXIgZSxyLG4saSxhLHMsZj10Lmxlbmd0aDtpZihmJTQ+MCl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgc3RyaW5nLiBMZW5ndGggbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQiKTthPXRbZi0yXT09PSI9Ij8yOnRbZi0xXT09PSI9Ij8xOjAscz1uZXcga2UoZiozLzQtYSksbj1hPjA/Zi00OmY7dmFyIHU9MDtmb3IoZT0wLHI9MDtlPG47ZSs9NCxyKz0zKWk9ZTBbdC5jaGFyQ29kZUF0KGUpXTw8MTh8ZTBbdC5jaGFyQ29kZUF0KGUrMSldPDwxMnxlMFt0LmNoYXJDb2RlQXQoZSsyKV08PDZ8ZTBbdC5jaGFyQ29kZUF0KGUrMyldLHNbdSsrXT1pPj4xNiYyNTUsc1t1KytdPWk+PjgmMjU1LHNbdSsrXT1pJjI1NTtyZXR1cm4gYT09PTI/KGk9ZTBbdC5jaGFyQ29kZUF0KGUpXTw8MnxlMFt0LmNoYXJDb2RlQXQoZSsxKV0+PjQsc1t1KytdPWkmMjU1KTphPT09MSYmKGk9ZTBbdC5jaGFyQ29kZUF0KGUpXTw8MTB8ZTBbdC5jaGFyQ29kZUF0KGUrMSldPDw0fGUwW3QuY2hhckNvZGVBdChlKzIpXT4+MixzW3UrK109aT4+OCYyNTUsc1t1KytdPWkmMjU1KSxzfWZ1bmN0aW9uIFNlKHQpe3JldHVybiBvMFt0Pj4xOCY2M10rbzBbdD4+MTImNjNdK28wW3Q+PjYmNjNdK28wW3QmNjNdfWZ1bmN0aW9uIFJlKHQsZSxyKXtmb3IodmFyIG4saT1bXSxhPWU7YTxyO2ErPTMpbj0odFthXTw8MTYpKyh0W2ErMV08PDgpK3RbYSsyXSxpLnB1c2goU2UobikpO3JldHVybiBpLmpvaW4oIiIpfWZ1bmN0aW9uIGhyKHQpe1gwfHx1cigpO2Zvcih2YXIgZSxyPXQubGVuZ3RoLG49ciUzLGk9IiIsYT1bXSxzPTE2MzgzLGY9MCx1PXItbjtmPHU7Zis9cylhLnB1c2goUmUodCxmLGYrcz51P3U6ZitzKSk7cmV0dXJuIG49PT0xPyhlPXRbci0xXSxpKz1vMFtlPj4yXSxpKz1vMFtlPDw0JjYzXSxpKz0iPT0iKTpuPT09MiYmKGU9KHRbci0yXTw8OCkrdFtyLTFdLGkrPW8wW2U+PjEwXSxpKz1vMFtlPj40JjYzXSxpKz1vMFtlPDwyJjYzXSxpKz0iPSIpLGEucHVzaChpKSxhLmpvaW4oIiIpfWZ1bmN0aW9uIEgwKHQsZSxyLG4saSl7dmFyIGEscyxmPWkqOC1uLTEsdT0oMTw8ZiktMSxvPXU+PjEseD0tNyxwPXI/aS0xOjAsYz1yPy0xOjEsaD10W2UrcF07Zm9yKHArPWMsYT1oJigxPDwteCktMSxoPj49LXgseCs9Zjt4PjA7YT1hKjI1Nit0W2UrcF0scCs9Yyx4LT04KTtmb3Iocz1hJigxPDwteCktMSxhPj49LXgseCs9bjt4PjA7cz1zKjI1Nit0W2UrcF0scCs9Yyx4LT04KTtpZihhPT09MClhPTEtbztlbHNle2lmKGE9PT11KXJldHVybiBzP05hTjooaD8tMToxKSooMS8wKTtzPXMrTWF0aC5wb3coMixuKSxhPWEtb31yZXR1cm4oaD8tMToxKSpzKk1hdGgucG93KDIsYS1uKX1mdW5jdGlvbiBscih0LGUscixuLGksYSl7dmFyIHMsZix1LG89YSo4LWktMSx4PSgxPDxvKS0xLHA9eD4+MSxjPWk9PT0yMz9NYXRoLnBvdygyLC0yNCktTWF0aC5wb3coMiwtNzcpOjAsaD1uPzA6YS0xLGw9bj8xOi0xLF89ZTwwfHxlPT09MCYmMS9lPDA/MTowO2ZvcihlPU1hdGguYWJzKGUpLGlzTmFOKGUpfHxlPT09MS8wPyhmPWlzTmFOKGUpPzE6MCxzPXgpOihzPU1hdGguZmxvb3IoTWF0aC5sb2coZSkvTWF0aC5MTjIpLGUqKHU9TWF0aC5wb3coMiwtcykpPDEmJihzLS0sdSo9MikscytwPj0xP2UrPWMvdTplKz1jKk1hdGgucG93KDIsMS1wKSxlKnU+PTImJihzKyssdS89MikscytwPj14PyhmPTAscz14KTpzK3A+PTE/KGY9KGUqdS0xKSpNYXRoLnBvdygyLGkpLHM9cytwKTooZj1lKk1hdGgucG93KDIscC0xKSpNYXRoLnBvdygyLGkpLHM9MCkpO2k+PTg7dFtyK2hdPWYmMjU1LGgrPWwsZi89MjU2LGktPTgpO2ZvcihzPXM8PGl8ZixvKz1pO28+MDt0W3IraF09cyYyNTUsaCs9bCxzLz0yNTYsby09OCk7dFtyK2gtbF18PV8qMTI4fXZhciBIZT17fS50b1N0cmluZyx2cj1BcnJheS5pc0FycmF5fHxmdW5jdGlvbih0KXtyZXR1cm4gSGUuY2FsbCh0KT09IltvYmplY3QgQXJyYXldIn07LyohCiAqIFRoZSBidWZmZXIgbW9kdWxlIGZyb20gbm9kZS5qcywgZm9yIHRoZSBicm93c2VyLgogKgogKiBAYXV0aG9yICAgRmVyb3NzIEFib3VraGFkaWplaCA8ZmVyb3NzQGZlcm9zcy5vcmc+IDxodHRwOi8vZmVyb3NzLm9yZz4KICogQGxpY2Vuc2UgIE1JVAogKi92YXIgVGU9NTA7RS5UWVBFRF9BUlJBWV9TVVBQT1JUPWZyLlRZUEVEX0FSUkFZX1NVUFBPUlQhPT12b2lkIDA/ZnIuVFlQRURfQVJSQVlfU1VQUE9SVDohMDtmdW5jdGlvbiBxMCgpe3JldHVybiBFLlRZUEVEX0FSUkFZX1NVUFBPUlQ/MjE0NzQ4MzY0NzoxMDczNzQxODIzfWZ1bmN0aW9uIHgwKHQsZSl7aWYocTAoKTxlKXRocm93IG5ldyBSYW5nZUVycm9yKCJJbnZhbGlkIHR5cGVkIGFycmF5IGxlbmd0aCIpO3JldHVybiBFLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHQ9bmV3IFVpbnQ4QXJyYXkoZSksdC5fX3Byb3RvX189RS5wcm90b3R5cGUpOih0PT09bnVsbCYmKHQ9bmV3IEUoZSkpLHQubGVuZ3RoPWUpLHR9ZnVuY3Rpb24gRSh0LGUscil7aWYoIUUuVFlQRURfQVJSQVlfU1VQUE9SVCYmISh0aGlzIGluc3RhbmNlb2YgRSkpcmV0dXJuIG5ldyBFKHQsZSxyKTtpZih0eXBlb2YgdD09Im51bWJlciIpe2lmKHR5cGVvZiBlPT0ic3RyaW5nIil0aHJvdyBuZXcgRXJyb3IoIklmIGVuY29kaW5nIGlzIHNwZWNpZmllZCB0aGVuIHRoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nIik7cmV0dXJuICQwKHRoaXMsdCl9cmV0dXJuIHByKHRoaXMsdCxlLHIpfUUucG9vbFNpemU9ODE5MixFLl9hdWdtZW50PWZ1bmN0aW9uKHQpe3JldHVybiB0Ll9fcHJvdG9fXz1FLnByb3RvdHlwZSx0fTtmdW5jdGlvbiBwcih0LGUscixuKXtpZih0eXBlb2YgZT09Im51bWJlciIpdGhyb3cgbmV3IFR5cGVFcnJvcignInZhbHVlIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBhIG51bWJlcicpO3JldHVybiB0eXBlb2YgQXJyYXlCdWZmZXIhPSJ1bmRlZmluZWQiJiZlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXI/SWUodCxlLHIsbik6dHlwZW9mIGU9PSJzdHJpbmciP1BlKHQsZSxyKTp6ZSh0LGUpfUUuZnJvbT1mdW5jdGlvbih0LGUscil7cmV0dXJuIHByKG51bGwsdCxlLHIpfSxFLlRZUEVEX0FSUkFZX1NVUFBPUlQmJihFLnByb3RvdHlwZS5fX3Byb3RvX189VWludDhBcnJheS5wcm90b3R5cGUsRS5fX3Byb3RvX189VWludDhBcnJheSk7ZnVuY3Rpb24gZHIodCl7aWYodHlwZW9mIHQhPSJudW1iZXIiKXRocm93IG5ldyBUeXBlRXJyb3IoJyJzaXplIiBhcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyJyk7aWYodDwwKXRocm93IG5ldyBSYW5nZUVycm9yKCcic2l6ZSIgYXJndW1lbnQgbXVzdCBub3QgYmUgbmVnYXRpdmUnKX1mdW5jdGlvbiBEZSh0LGUscixuKXtyZXR1cm4gZHIoZSksZTw9MD94MCh0LGUpOnIhPT12b2lkIDA/dHlwZW9mIG49PSJzdHJpbmciP3gwKHQsZSkuZmlsbChyLG4pOngwKHQsZSkuZmlsbChyKTp4MCh0LGUpfUUuYWxsb2M9ZnVuY3Rpb24odCxlLHIpe3JldHVybiBEZShudWxsLHQsZSxyKX07ZnVuY3Rpb24gJDAodCxlKXtpZihkcihlKSx0PXgwKHQsZTwwPzA6WjAoZSl8MCksIUUuVFlQRURfQVJSQVlfU1VQUE9SVClmb3IodmFyIHI9MDtyPGU7KytyKXRbcl09MDtyZXR1cm4gdH1FLmFsbG9jVW5zYWZlPWZ1bmN0aW9uKHQpe3JldHVybiAkMChudWxsLHQpfSxFLmFsbG9jVW5zYWZlU2xvdz1mdW5jdGlvbih0KXtyZXR1cm4gJDAobnVsbCx0KX07ZnVuY3Rpb24gUGUodCxlLHIpe2lmKCh0eXBlb2YgciE9InN0cmluZyJ8fHI9PT0iIikmJihyPSJ1dGY4IiksIUUuaXNFbmNvZGluZyhyKSl0aHJvdyBuZXcgVHlwZUVycm9yKCciZW5jb2RpbmciIG11c3QgYmUgYSB2YWxpZCBzdHJpbmcgZW5jb2RpbmcnKTt2YXIgbj1fcihlLHIpfDA7dD14MCh0LG4pO3ZhciBpPXQud3JpdGUoZSxyKTtyZXR1cm4gaSE9PW4mJih0PXQuc2xpY2UoMCxpKSksdH1mdW5jdGlvbiBWMCh0LGUpe3ZhciByPWUubGVuZ3RoPDA/MDpaMChlLmxlbmd0aCl8MDt0PXgwKHQscik7Zm9yKHZhciBuPTA7bjxyO24rPTEpdFtuXT1lW25dJjI1NTtyZXR1cm4gdH1mdW5jdGlvbiBJZSh0LGUscixuKXtpZihlLmJ5dGVMZW5ndGgscjwwfHxlLmJ5dGVMZW5ndGg8cil0aHJvdyBuZXcgUmFuZ2VFcnJvcigiJ29mZnNldCcgaXMgb3V0IG9mIGJvdW5kcyIpO2lmKGUuYnl0ZUxlbmd0aDxyKyhufHwwKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiJ2xlbmd0aCcgaXMgb3V0IG9mIGJvdW5kcyIpO3JldHVybiByPT09dm9pZCAwJiZuPT09dm9pZCAwP2U9bmV3IFVpbnQ4QXJyYXkoZSk6bj09PXZvaWQgMD9lPW5ldyBVaW50OEFycmF5KGUscik6ZT1uZXcgVWludDhBcnJheShlLHIsbiksRS5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0PWUsdC5fX3Byb3RvX189RS5wcm90b3R5cGUpOnQ9VjAodCxlKSx0fWZ1bmN0aW9uIHplKHQsZSl7aWYoYTAoZSkpe3ZhciByPVowKGUubGVuZ3RoKXwwO3JldHVybiB0PXgwKHQsciksdC5sZW5ndGg9PT0wfHxlLmNvcHkodCwwLDAsciksdH1pZihlKXtpZih0eXBlb2YgQXJyYXlCdWZmZXIhPSJ1bmRlZmluZWQiJiZlLmJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyfHwibGVuZ3RoImluIGUpcmV0dXJuIHR5cGVvZiBlLmxlbmd0aCE9Im51bWJlciJ8fHJ0KGUubGVuZ3RoKT94MCh0LDApOlYwKHQsZSk7aWYoZS50eXBlPT09IkJ1ZmZlciImJnZyKGUuZGF0YSkpcmV0dXJuIFYwKHQsZS5kYXRhKX10aHJvdyBuZXcgVHlwZUVycm9yKCJGaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nLCBCdWZmZXIsIEFycmF5QnVmZmVyLCBBcnJheSwgb3IgYXJyYXktbGlrZSBvYmplY3QuIil9ZnVuY3Rpb24gWjAodCl7aWYodD49cTAoKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQXR0ZW1wdCB0byBhbGxvY2F0ZSBCdWZmZXIgbGFyZ2VyIHRoYW4gbWF4aW11bSBzaXplOiAweCIrcTAoKS50b1N0cmluZygxNikrIiBieXRlcyIpO3JldHVybiB0fDB9RS5pc0J1ZmZlcj1ldDtmdW5jdGlvbiBhMCh0KXtyZXR1cm4hISh0IT1udWxsJiZ0Ll9pc0J1ZmZlcil9RS5jb21wYXJlPWZ1bmN0aW9uKGUscil7aWYoIWEwKGUpfHwhYTAocikpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnRzIG11c3QgYmUgQnVmZmVycyIpO2lmKGU9PT1yKXJldHVybiAwO2Zvcih2YXIgbj1lLmxlbmd0aCxpPXIubGVuZ3RoLGE9MCxzPU1hdGgubWluKG4saSk7YTxzOysrYSlpZihlW2FdIT09clthXSl7bj1lW2FdLGk9clthXTticmVha31yZXR1cm4gbjxpPy0xOmk8bj8xOjB9LEUuaXNFbmNvZGluZz1mdW5jdGlvbihlKXtzd2l0Y2goU3RyaW5nKGUpLnRvTG93ZXJDYXNlKCkpe2Nhc2UiaGV4IjpjYXNlInV0ZjgiOmNhc2UidXRmLTgiOmNhc2UiYXNjaWkiOmNhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6Y2FzZSJiYXNlNjQiOmNhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4hMDtkZWZhdWx0OnJldHVybiExfX0sRS5jb25jYXQ9ZnVuY3Rpb24oZSxyKXtpZighdnIoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcignImxpc3QiIGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycycpO2lmKGUubGVuZ3RoPT09MClyZXR1cm4gRS5hbGxvYygwKTt2YXIgbjtpZihyPT09dm9pZCAwKWZvcihyPTAsbj0wO248ZS5sZW5ndGg7KytuKXIrPWVbbl0ubGVuZ3RoO3ZhciBpPUUuYWxsb2NVbnNhZmUociksYT0wO2ZvcihuPTA7bjxlLmxlbmd0aDsrK24pe3ZhciBzPWVbbl07aWYoIWEwKHMpKXRocm93IG5ldyBUeXBlRXJyb3IoJyJsaXN0IiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKTtzLmNvcHkoaSxhKSxhKz1zLmxlbmd0aH1yZXR1cm4gaX07ZnVuY3Rpb24gX3IodCxlKXtpZihhMCh0KSlyZXR1cm4gdC5sZW5ndGg7aWYodHlwZW9mIEFycmF5QnVmZmVyIT0idW5kZWZpbmVkIiYmdHlwZW9mIEFycmF5QnVmZmVyLmlzVmlldz09ImZ1bmN0aW9uIiYmKEFycmF5QnVmZmVyLmlzVmlldyh0KXx8dCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSlyZXR1cm4gdC5ieXRlTGVuZ3RoO3R5cGVvZiB0IT0ic3RyaW5nIiYmKHQ9IiIrdCk7dmFyIHI9dC5sZW5ndGg7aWYocj09PTApcmV0dXJuIDA7Zm9yKHZhciBuPSExOzspc3dpdGNoKGUpe2Nhc2UiYXNjaWkiOmNhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6cmV0dXJuIHI7Y2FzZSJ1dGY4IjpjYXNlInV0Zi04IjpjYXNlIHZvaWQgMDpyZXR1cm4gUDAodCkubGVuZ3RoO2Nhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4gcioyO2Nhc2UiaGV4IjpyZXR1cm4gcj4+PjE7Y2FzZSJiYXNlNjQiOnJldHVybiBrcih0KS5sZW5ndGg7ZGVmYXVsdDppZihuKXJldHVybiBQMCh0KS5sZW5ndGg7ZT0oIiIrZSkudG9Mb3dlckNhc2UoKSxuPSEwfX1FLmJ5dGVMZW5ndGg9X3I7ZnVuY3Rpb24gVWUodCxlLHIpe3ZhciBuPSExO2lmKChlPT09dm9pZCAwfHxlPDApJiYoZT0wKSxlPnRoaXMubGVuZ3RofHwoKHI9PT12b2lkIDB8fHI+dGhpcy5sZW5ndGgpJiYocj10aGlzLmxlbmd0aCkscjw9MCl8fChyPj4+PTAsZT4+Pj0wLHI8PWUpKXJldHVybiIiO2Zvcih0fHwodD0idXRmOCIpOzspc3dpdGNoKHQpe2Nhc2UiaGV4IjpyZXR1cm4gWGUodGhpcyxlLHIpO2Nhc2UidXRmOCI6Y2FzZSJ1dGYtOCI6cmV0dXJuIGJyKHRoaXMsZSxyKTtjYXNlImFzY2lpIjpyZXR1cm4gS2UodGhpcyxlLHIpO2Nhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6cmV0dXJuIEdlKHRoaXMsZSxyKTtjYXNlImJhc2U2NCI6cmV0dXJuIE1lKHRoaXMsZSxyKTtjYXNlInVjczIiOmNhc2UidWNzLTIiOmNhc2UidXRmMTZsZSI6Y2FzZSJ1dGYtMTZsZSI6cmV0dXJuIHFlKHRoaXMsZSxyKTtkZWZhdWx0OmlmKG4pdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBlbmNvZGluZzogIit0KTt0PSh0KyIiKS50b0xvd2VyQ2FzZSgpLG49ITB9fUUucHJvdG90eXBlLl9pc0J1ZmZlcj0hMDtmdW5jdGlvbiBoMCh0LGUscil7dmFyIG49dFtlXTt0W2VdPXRbcl0sdFtyXT1ufUUucHJvdG90eXBlLnN3YXAxNj1mdW5jdGlvbigpe3ZhciBlPXRoaXMubGVuZ3RoO2lmKGUlMiE9MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LWJpdHMiKTtmb3IodmFyIHI9MDtyPGU7cis9MiloMCh0aGlzLHIscisxKTtyZXR1cm4gdGhpc30sRS5wcm90b3R5cGUuc3dhcDMyPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5sZW5ndGg7aWYoZSU0IT0wKXRocm93IG5ldyBSYW5nZUVycm9yKCJCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMzItYml0cyIpO2Zvcih2YXIgcj0wO3I8ZTtyKz00KWgwKHRoaXMscixyKzMpLGgwKHRoaXMscisxLHIrMik7cmV0dXJuIHRoaXN9LEUucHJvdG90eXBlLnN3YXA2ND1mdW5jdGlvbigpe3ZhciBlPXRoaXMubGVuZ3RoO2lmKGUlOCE9MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDY0LWJpdHMiKTtmb3IodmFyIHI9MDtyPGU7cis9OCloMCh0aGlzLHIscis3KSxoMCh0aGlzLHIrMSxyKzYpLGgwKHRoaXMscisyLHIrNSksaDAodGhpcyxyKzMscis0KTtyZXR1cm4gdGhpc30sRS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmxlbmd0aHwwO3JldHVybiBlPT09MD8iIjphcmd1bWVudHMubGVuZ3RoPT09MD9icih0aGlzLDAsZSk6VWUuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxFLnByb3RvdHlwZS5lcXVhbHM9ZnVuY3Rpb24oZSl7aWYoIWEwKGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXIiKTtyZXR1cm4gdGhpcz09PWU/ITA6RS5jb21wYXJlKHRoaXMsZSk9PT0wfSxFLnByb3RvdHlwZS5pbnNwZWN0PWZ1bmN0aW9uKCl7dmFyIGU9IiIscj1UZTtyZXR1cm4gdGhpcy5sZW5ndGg+MCYmKGU9dGhpcy50b1N0cmluZygiaGV4IiwwLHIpLm1hdGNoKC8uezJ9L2cpLmpvaW4oIiAiKSx0aGlzLmxlbmd0aD5yJiYoZSs9IiAuLi4gIikpLCI8QnVmZmVyICIrZSsiPiJ9LEUucHJvdG90eXBlLmNvbXBhcmU9ZnVuY3Rpb24oZSxyLG4saSxhKXtpZighYTAoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciIpO2lmKHI9PT12b2lkIDAmJihyPTApLG49PT12b2lkIDAmJihuPWU/ZS5sZW5ndGg6MCksaT09PXZvaWQgMCYmKGk9MCksYT09PXZvaWQgMCYmKGE9dGhpcy5sZW5ndGgpLHI8MHx8bj5lLmxlbmd0aHx8aTwwfHxhPnRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJvdXQgb2YgcmFuZ2UgaW5kZXgiKTtpZihpPj1hJiZyPj1uKXJldHVybiAwO2lmKGk+PWEpcmV0dXJuLTE7aWYocj49bilyZXR1cm4gMTtpZihyPj4+PTAsbj4+Pj0wLGk+Pj49MCxhPj4+PTAsdGhpcz09PWUpcmV0dXJuIDA7Zm9yKHZhciBzPWEtaSxmPW4tcix1PU1hdGgubWluKHMsZiksbz10aGlzLnNsaWNlKGksYSkseD1lLnNsaWNlKHIsbikscD0wO3A8dTsrK3ApaWYob1twXSE9PXhbcF0pe3M9b1twXSxmPXhbcF07YnJlYWt9cmV0dXJuIHM8Zj8tMTpmPHM/MTowfTtmdW5jdGlvbiBncih0LGUscixuLGkpe2lmKHQubGVuZ3RoPT09MClyZXR1cm4tMTtpZih0eXBlb2Ygcj09InN0cmluZyI/KG49cixyPTApOnI+MjE0NzQ4MzY0Nz9yPTIxNDc0ODM2NDc6cjwtMjE0NzQ4MzY0OCYmKHI9LTIxNDc0ODM2NDgpLHI9K3IsaXNOYU4ocikmJihyPWk/MDp0Lmxlbmd0aC0xKSxyPDAmJihyPXQubGVuZ3RoK3IpLHI+PXQubGVuZ3RoKXtpZihpKXJldHVybi0xO3I9dC5sZW5ndGgtMX1lbHNlIGlmKHI8MClpZihpKXI9MDtlbHNlIHJldHVybi0xO2lmKHR5cGVvZiBlPT0ic3RyaW5nIiYmKGU9RS5mcm9tKGUsbikpLGEwKGUpKXJldHVybiBlLmxlbmd0aD09PTA/LTE6eXIodCxlLHIsbixpKTtpZih0eXBlb2YgZT09Im51bWJlciIpcmV0dXJuIGU9ZSYyNTUsRS5UWVBFRF9BUlJBWV9TVVBQT1JUJiZ0eXBlb2YgVWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZj09ImZ1bmN0aW9uIj9pP1VpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbCh0LGUscik6VWludDhBcnJheS5wcm90b3R5cGUubGFzdEluZGV4T2YuY2FsbCh0LGUscik6eXIodCxbZV0scixuLGkpO3Rocm93IG5ldyBUeXBlRXJyb3IoInZhbCBtdXN0IGJlIHN0cmluZywgbnVtYmVyIG9yIEJ1ZmZlciIpfWZ1bmN0aW9uIHlyKHQsZSxyLG4saSl7dmFyIGE9MSxzPXQubGVuZ3RoLGY9ZS5sZW5ndGg7aWYobiE9PXZvaWQgMCYmKG49U3RyaW5nKG4pLnRvTG93ZXJDYXNlKCksbj09PSJ1Y3MyInx8bj09PSJ1Y3MtMiJ8fG49PT0idXRmMTZsZSJ8fG49PT0idXRmLTE2bGUiKSl7aWYodC5sZW5ndGg8Mnx8ZS5sZW5ndGg8MilyZXR1cm4tMTthPTIscy89MixmLz0yLHIvPTJ9ZnVuY3Rpb24gdShoLGwpe3JldHVybiBhPT09MT9oW2xdOmgucmVhZFVJbnQxNkJFKGwqYSl9dmFyIG87aWYoaSl7dmFyIHg9LTE7Zm9yKG89cjtvPHM7bysrKWlmKHUodCxvKT09PXUoZSx4PT09LTE/MDpvLXgpKXtpZih4PT09LTEmJih4PW8pLG8teCsxPT09ZilyZXR1cm4geCphfWVsc2UgeCE9PS0xJiYoby09by14KSx4PS0xfWVsc2UgZm9yKHIrZj5zJiYocj1zLWYpLG89cjtvPj0wO28tLSl7Zm9yKHZhciBwPSEwLGM9MDtjPGY7YysrKWlmKHUodCxvK2MpIT09dShlLGMpKXtwPSExO2JyZWFrfWlmKHApcmV0dXJuIG99cmV0dXJuLTF9RS5wcm90b3R5cGUuaW5jbHVkZXM9ZnVuY3Rpb24oZSxyLG4pe3JldHVybiB0aGlzLmluZGV4T2YoZSxyLG4pIT09LTF9LEUucHJvdG90eXBlLmluZGV4T2Y9ZnVuY3Rpb24oZSxyLG4pe3JldHVybiBncih0aGlzLGUscixuLCEwKX0sRS5wcm90b3R5cGUubGFzdEluZGV4T2Y9ZnVuY3Rpb24oZSxyLG4pe3JldHVybiBncih0aGlzLGUscixuLCExKX07ZnVuY3Rpb24gTGUodCxlLHIsbil7cj1OdW1iZXIocil8fDA7dmFyIGk9dC5sZW5ndGgtcjtuPyhuPU51bWJlcihuKSxuPmkmJihuPWkpKTpuPWk7dmFyIGE9ZS5sZW5ndGg7aWYoYSUyIT0wKXRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgaGV4IHN0cmluZyIpO24+YS8yJiYobj1hLzIpO2Zvcih2YXIgcz0wO3M8bjsrK3Mpe3ZhciBmPXBhcnNlSW50KGUuc3Vic3RyKHMqMiwyKSwxNik7aWYoaXNOYU4oZikpcmV0dXJuIHM7dFtyK3NdPWZ9cmV0dXJuIHN9ZnVuY3Rpb24gRmUodCxlLHIsbil7cmV0dXJuIEkwKFAwKGUsdC5sZW5ndGgtciksdCxyLG4pfWZ1bmN0aW9uIHdyKHQsZSxyLG4pe3JldHVybiBJMChqZShlKSx0LHIsbil9ZnVuY3Rpb24gV2UodCxlLHIsbil7cmV0dXJuIHdyKHQsZSxyLG4pfWZ1bmN0aW9uIE5lKHQsZSxyLG4pe3JldHVybiBJMChrcihlKSx0LHIsbil9ZnVuY3Rpb24gWWUodCxlLHIsbil7cmV0dXJuIEkwKEplKGUsdC5sZW5ndGgtciksdCxyLG4pfUUucHJvdG90eXBlLndyaXRlPWZ1bmN0aW9uKGUscixuLGkpe2lmKHI9PT12b2lkIDApaT0idXRmOCIsbj10aGlzLmxlbmd0aCxyPTA7ZWxzZSBpZihuPT09dm9pZCAwJiZ0eXBlb2Ygcj09InN0cmluZyIpaT1yLG49dGhpcy5sZW5ndGgscj0wO2Vsc2UgaWYoaXNGaW5pdGUocikpcj1yfDAsaXNGaW5pdGUobik/KG49bnwwLGk9PT12b2lkIDAmJihpPSJ1dGY4IikpOihpPW4sbj12b2lkIDApO2Vsc2UgdGhyb3cgbmV3IEVycm9yKCJCdWZmZXIud3JpdGUoc3RyaW5nLCBlbmNvZGluZywgb2Zmc2V0WywgbGVuZ3RoXSkgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCIpO3ZhciBhPXRoaXMubGVuZ3RoLXI7aWYoKG49PT12b2lkIDB8fG4+YSkmJihuPWEpLGUubGVuZ3RoPjAmJihuPDB8fHI8MCl8fHI+dGhpcy5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkF0dGVtcHQgdG8gd3JpdGUgb3V0c2lkZSBidWZmZXIgYm91bmRzIik7aXx8KGk9InV0ZjgiKTtmb3IodmFyIHM9ITE7Oylzd2l0Y2goaSl7Y2FzZSJoZXgiOnJldHVybiBMZSh0aGlzLGUscixuKTtjYXNlInV0ZjgiOmNhc2UidXRmLTgiOnJldHVybiBGZSh0aGlzLGUscixuKTtjYXNlImFzY2lpIjpyZXR1cm4gd3IodGhpcyxlLHIsbik7Y2FzZSJsYXRpbjEiOmNhc2UiYmluYXJ5IjpyZXR1cm4gV2UodGhpcyxlLHIsbik7Y2FzZSJiYXNlNjQiOnJldHVybiBOZSh0aGlzLGUscixuKTtjYXNlInVjczIiOmNhc2UidWNzLTIiOmNhc2UidXRmMTZsZSI6Y2FzZSJ1dGYtMTZsZSI6cmV0dXJuIFllKHRoaXMsZSxyLG4pO2RlZmF1bHQ6aWYocyl0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIGVuY29kaW5nOiAiK2kpO2k9KCIiK2kpLnRvTG93ZXJDYXNlKCkscz0hMH19LEUucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybnt0eXBlOiJCdWZmZXIiLGRhdGE6QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy5fYXJyfHx0aGlzLDApfX07ZnVuY3Rpb24gTWUodCxlLHIpe3JldHVybiBlPT09MCYmcj09PXQubGVuZ3RoP2hyKHQpOmhyKHQuc2xpY2UoZSxyKSl9ZnVuY3Rpb24gYnIodCxlLHIpe3I9TWF0aC5taW4odC5sZW5ndGgscik7Zm9yKHZhciBuPVtdLGk9ZTtpPHI7KXt2YXIgYT10W2ldLHM9bnVsbCxmPWE+MjM5PzQ6YT4yMjM/MzphPjE5MT8yOjE7aWYoaStmPD1yKXt2YXIgdSxvLHgscDtzd2l0Y2goZil7Y2FzZSAxOmE8MTI4JiYocz1hKTticmVhaztjYXNlIDI6dT10W2krMV0sKHUmMTkyKT09MTI4JiYocD0oYSYzMSk8PDZ8dSY2MyxwPjEyNyYmKHM9cCkpO2JyZWFrO2Nhc2UgMzp1PXRbaSsxXSxvPXRbaSsyXSwodSYxOTIpPT0xMjgmJihvJjE5Mik9PTEyOCYmKHA9KGEmMTUpPDwxMnwodSY2Myk8PDZ8byY2MyxwPjIwNDcmJihwPDU1Mjk2fHxwPjU3MzQzKSYmKHM9cCkpO2JyZWFrO2Nhc2UgNDp1PXRbaSsxXSxvPXRbaSsyXSx4PXRbaSszXSwodSYxOTIpPT0xMjgmJihvJjE5Mik9PTEyOCYmKHgmMTkyKT09MTI4JiYocD0oYSYxNSk8PDE4fCh1JjYzKTw8MTJ8KG8mNjMpPDw2fHgmNjMscD42NTUzNSYmcDwxMTE0MTEyJiYocz1wKSl9fXM9PT1udWxsPyhzPTY1NTMzLGY9MSk6cz42NTUzNSYmKHMtPTY1NTM2LG4ucHVzaChzPj4+MTAmMTAyM3w1NTI5Nikscz01NjMyMHxzJjEwMjMpLG4ucHVzaChzKSxpKz1mfXJldHVybiBPZShuKX12YXIgQnI9NDA5NjtmdW5jdGlvbiBPZSh0KXt2YXIgZT10Lmxlbmd0aDtpZihlPD1CcilyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsdCk7Zm9yKHZhciByPSIiLG49MDtuPGU7KXIrPVN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLHQuc2xpY2UobixuKz1CcikpO3JldHVybiByfWZ1bmN0aW9uIEtlKHQsZSxyKXt2YXIgbj0iIjtyPU1hdGgubWluKHQubGVuZ3RoLHIpO2Zvcih2YXIgaT1lO2k8cjsrK2kpbis9U3RyaW5nLmZyb21DaGFyQ29kZSh0W2ldJjEyNyk7cmV0dXJuIG59ZnVuY3Rpb24gR2UodCxlLHIpe3ZhciBuPSIiO3I9TWF0aC5taW4odC5sZW5ndGgscik7Zm9yKHZhciBpPWU7aTxyOysraSluKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHRbaV0pO3JldHVybiBufWZ1bmN0aW9uIFhlKHQsZSxyKXt2YXIgbj10Lmxlbmd0aDsoIWV8fGU8MCkmJihlPTApLCghcnx8cjwwfHxyPm4pJiYocj1uKTtmb3IodmFyIGk9IiIsYT1lO2E8cjsrK2EpaSs9UWUodFthXSk7cmV0dXJuIGl9ZnVuY3Rpb24gcWUodCxlLHIpe2Zvcih2YXIgbj10LnNsaWNlKGUsciksaT0iIixhPTA7YTxuLmxlbmd0aDthKz0yKWkrPVN0cmluZy5mcm9tQ2hhckNvZGUoblthXStuW2ErMV0qMjU2KTtyZXR1cm4gaX1FLnByb3RvdHlwZS5zbGljZT1mdW5jdGlvbihlLHIpe3ZhciBuPXRoaXMubGVuZ3RoO2U9fn5lLHI9cj09PXZvaWQgMD9uOn5+cixlPDA/KGUrPW4sZTwwJiYoZT0wKSk6ZT5uJiYoZT1uKSxyPDA/KHIrPW4scjwwJiYocj0wKSk6cj5uJiYocj1uKSxyPGUmJihyPWUpO3ZhciBpO2lmKEUuVFlQRURfQVJSQVlfU1VQUE9SVClpPXRoaXMuc3ViYXJyYXkoZSxyKSxpLl9fcHJvdG9fXz1FLnByb3RvdHlwZTtlbHNle3ZhciBhPXItZTtpPW5ldyBFKGEsdm9pZCAwKTtmb3IodmFyIHM9MDtzPGE7KytzKWlbc109dGhpc1tzK2VdfXJldHVybiBpfTtmdW5jdGlvbiBWKHQsZSxyKXtpZih0JTEhPTB8fHQ8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigib2Zmc2V0IGlzIG5vdCB1aW50Iik7aWYodCtlPnIpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIlRyeWluZyB0byBhY2Nlc3MgYmV5b25kIGJ1ZmZlciBsZW5ndGgiKX1FLnByb3RvdHlwZS5yZWFkVUludExFPWZ1bmN0aW9uKGUscixuKXtlPWV8MCxyPXJ8MCxufHxWKGUscix0aGlzLmxlbmd0aCk7Zm9yKHZhciBpPXRoaXNbZV0sYT0xLHM9MDsrK3M8ciYmKGEqPTI1Nik7KWkrPXRoaXNbZStzXSphO3JldHVybiBpfSxFLnByb3RvdHlwZS5yZWFkVUludEJFPWZ1bmN0aW9uKGUscixuKXtlPWV8MCxyPXJ8MCxufHxWKGUscix0aGlzLmxlbmd0aCk7Zm9yKHZhciBpPXRoaXNbZSstLXJdLGE9MTtyPjAmJihhKj0yNTYpOylpKz10aGlzW2UrLS1yXSphO3JldHVybiBpfSxFLnByb3RvdHlwZS5yZWFkVUludDg9ZnVuY3Rpb24oZSxyKXtyZXR1cm4gcnx8VihlLDEsdGhpcy5sZW5ndGgpLHRoaXNbZV19LEUucHJvdG90eXBlLnJlYWRVSW50MTZMRT1mdW5jdGlvbihlLHIpe3JldHVybiByfHxWKGUsMix0aGlzLmxlbmd0aCksdGhpc1tlXXx0aGlzW2UrMV08PDh9LEUucHJvdG90eXBlLnJlYWRVSW50MTZCRT1mdW5jdGlvbihlLHIpe3JldHVybiByfHxWKGUsMix0aGlzLmxlbmd0aCksdGhpc1tlXTw8OHx0aGlzW2UrMV19LEUucHJvdG90eXBlLnJlYWRVSW50MzJMRT1mdW5jdGlvbihlLHIpe3JldHVybiByfHxWKGUsNCx0aGlzLmxlbmd0aCksKHRoaXNbZV18dGhpc1tlKzFdPDw4fHRoaXNbZSsyXTw8MTYpK3RoaXNbZSszXSoxNjc3NzIxNn0sRS5wcm90b3R5cGUucmVhZFVJbnQzMkJFPWZ1bmN0aW9uKGUscil7cmV0dXJuIHJ8fFYoZSw0LHRoaXMubGVuZ3RoKSx0aGlzW2VdKjE2Nzc3MjE2Kyh0aGlzW2UrMV08PDE2fHRoaXNbZSsyXTw8OHx0aGlzW2UrM10pfSxFLnByb3RvdHlwZS5yZWFkSW50TEU9ZnVuY3Rpb24oZSxyLG4pe2U9ZXwwLHI9cnwwLG58fFYoZSxyLHRoaXMubGVuZ3RoKTtmb3IodmFyIGk9dGhpc1tlXSxhPTEscz0wOysrczxyJiYoYSo9MjU2KTspaSs9dGhpc1tlK3NdKmE7cmV0dXJuIGEqPTEyOCxpPj1hJiYoaS09TWF0aC5wb3coMiw4KnIpKSxpfSxFLnByb3RvdHlwZS5yZWFkSW50QkU9ZnVuY3Rpb24oZSxyLG4pe2U9ZXwwLHI9cnwwLG58fFYoZSxyLHRoaXMubGVuZ3RoKTtmb3IodmFyIGk9cixhPTEscz10aGlzW2UrLS1pXTtpPjAmJihhKj0yNTYpOylzKz10aGlzW2UrLS1pXSphO3JldHVybiBhKj0xMjgscz49YSYmKHMtPU1hdGgucG93KDIsOCpyKSksc30sRS5wcm90b3R5cGUucmVhZEludDg9ZnVuY3Rpb24oZSxyKXtyZXR1cm4gcnx8VihlLDEsdGhpcy5sZW5ndGgpLHRoaXNbZV0mMTI4PygyNTUtdGhpc1tlXSsxKSotMTp0aGlzW2VdfSxFLnByb3RvdHlwZS5yZWFkSW50MTZMRT1mdW5jdGlvbihlLHIpe3J8fFYoZSwyLHRoaXMubGVuZ3RoKTt2YXIgbj10aGlzW2VdfHRoaXNbZSsxXTw8ODtyZXR1cm4gbiYzMjc2OD9ufDQyOTQ5MDE3NjA6bn0sRS5wcm90b3R5cGUucmVhZEludDE2QkU9ZnVuY3Rpb24oZSxyKXtyfHxWKGUsMix0aGlzLmxlbmd0aCk7dmFyIG49dGhpc1tlKzFdfHRoaXNbZV08PDg7cmV0dXJuIG4mMzI3Njg/bnw0Mjk0OTAxNzYwOm59LEUucHJvdG90eXBlLnJlYWRJbnQzMkxFPWZ1bmN0aW9uKGUscil7cmV0dXJuIHJ8fFYoZSw0LHRoaXMubGVuZ3RoKSx0aGlzW2VdfHRoaXNbZSsxXTw8OHx0aGlzW2UrMl08PDE2fHRoaXNbZSszXTw8MjR9LEUucHJvdG90eXBlLnJlYWRJbnQzMkJFPWZ1bmN0aW9uKGUscil7cmV0dXJuIHJ8fFYoZSw0LHRoaXMubGVuZ3RoKSx0aGlzW2VdPDwyNHx0aGlzW2UrMV08PDE2fHRoaXNbZSsyXTw8OHx0aGlzW2UrM119LEUucHJvdG90eXBlLnJlYWRGbG9hdExFPWZ1bmN0aW9uKGUscil7cmV0dXJuIHJ8fFYoZSw0LHRoaXMubGVuZ3RoKSxIMCh0aGlzLGUsITAsMjMsNCl9LEUucHJvdG90eXBlLnJlYWRGbG9hdEJFPWZ1bmN0aW9uKGUscil7cmV0dXJuIHJ8fFYoZSw0LHRoaXMubGVuZ3RoKSxIMCh0aGlzLGUsITEsMjMsNCl9LEUucHJvdG90eXBlLnJlYWREb3VibGVMRT1mdW5jdGlvbihlLHIpe3JldHVybiByfHxWKGUsOCx0aGlzLmxlbmd0aCksSDAodGhpcyxlLCEwLDUyLDgpfSxFLnByb3RvdHlwZS5yZWFkRG91YmxlQkU9ZnVuY3Rpb24oZSxyKXtyZXR1cm4gcnx8VihlLDgsdGhpcy5sZW5ndGgpLEgwKHRoaXMsZSwhMSw1Miw4KX07ZnVuY3Rpb24gUSh0LGUscixuLGksYSl7aWYoIWEwKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoJyJidWZmZXIiIGFyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXIgaW5zdGFuY2UnKTtpZihlPml8fGU8YSl0aHJvdyBuZXcgUmFuZ2VFcnJvcignInZhbHVlIiBhcmd1bWVudCBpcyBvdXQgb2YgYm91bmRzJyk7aWYocituPnQubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJJbmRleCBvdXQgb2YgcmFuZ2UiKX1FLnByb3RvdHlwZS53cml0ZVVJbnRMRT1mdW5jdGlvbihlLHIsbixpKXtpZihlPStlLHI9cnwwLG49bnwwLCFpKXt2YXIgYT1NYXRoLnBvdygyLDgqbiktMTtRKHRoaXMsZSxyLG4sYSwwKX12YXIgcz0xLGY9MDtmb3IodGhpc1tyXT1lJjI1NTsrK2Y8biYmKHMqPTI1Nik7KXRoaXNbcitmXT1lL3MmMjU1O3JldHVybiByK259LEUucHJvdG90eXBlLndyaXRlVUludEJFPWZ1bmN0aW9uKGUscixuLGkpe2lmKGU9K2Uscj1yfDAsbj1ufDAsIWkpe3ZhciBhPU1hdGgucG93KDIsOCpuKS0xO1EodGhpcyxlLHIsbixhLDApfXZhciBzPW4tMSxmPTE7Zm9yKHRoaXNbcitzXT1lJjI1NTstLXM+PTAmJihmKj0yNTYpOyl0aGlzW3Irc109ZS9mJjI1NTtyZXR1cm4gcitufSxFLnByb3RvdHlwZS53cml0ZVVJbnQ4PWZ1bmN0aW9uKGUscixuKXtyZXR1cm4gZT0rZSxyPXJ8MCxufHxRKHRoaXMsZSxyLDEsMjU1LDApLEUuVFlQRURfQVJSQVlfU1VQUE9SVHx8KGU9TWF0aC5mbG9vcihlKSksdGhpc1tyXT1lJjI1NSxyKzF9O2Z1bmN0aW9uIFQwKHQsZSxyLG4pe2U8MCYmKGU9NjU1MzUrZSsxKTtmb3IodmFyIGk9MCxhPU1hdGgubWluKHQubGVuZ3RoLXIsMik7aTxhOysraSl0W3IraV09KGUmMjU1PDw4KihuP2k6MS1pKSk+Pj4obj9pOjEtaSkqOH1FLnByb3RvdHlwZS53cml0ZVVJbnQxNkxFPWZ1bmN0aW9uKGUscixuKXtyZXR1cm4gZT0rZSxyPXJ8MCxufHxRKHRoaXMsZSxyLDIsNjU1MzUsMCksRS5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW3JdPWUmMjU1LHRoaXNbcisxXT1lPj4+OCk6VDAodGhpcyxlLHIsITApLHIrMn0sRS5wcm90b3R5cGUud3JpdGVVSW50MTZCRT1mdW5jdGlvbihlLHIsbil7cmV0dXJuIGU9K2Uscj1yfDAsbnx8USh0aGlzLGUsciwyLDY1NTM1LDApLEUuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1tyXT1lPj4+OCx0aGlzW3IrMV09ZSYyNTUpOlQwKHRoaXMsZSxyLCExKSxyKzJ9O2Z1bmN0aW9uIEQwKHQsZSxyLG4pe2U8MCYmKGU9NDI5NDk2NzI5NStlKzEpO2Zvcih2YXIgaT0wLGE9TWF0aC5taW4odC5sZW5ndGgtciw0KTtpPGE7KytpKXRbcitpXT1lPj4+KG4/aTozLWkpKjgmMjU1fUUucHJvdG90eXBlLndyaXRlVUludDMyTEU9ZnVuY3Rpb24oZSxyLG4pe3JldHVybiBlPStlLHI9cnwwLG58fFEodGhpcyxlLHIsNCw0Mjk0OTY3Mjk1LDApLEUuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1tyKzNdPWU+Pj4yNCx0aGlzW3IrMl09ZT4+PjE2LHRoaXNbcisxXT1lPj4+OCx0aGlzW3JdPWUmMjU1KTpEMCh0aGlzLGUsciwhMCkscis0fSxFLnByb3RvdHlwZS53cml0ZVVJbnQzMkJFPWZ1bmN0aW9uKGUscixuKXtyZXR1cm4gZT0rZSxyPXJ8MCxufHxRKHRoaXMsZSxyLDQsNDI5NDk2NzI5NSwwKSxFLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbcl09ZT4+PjI0LHRoaXNbcisxXT1lPj4+MTYsdGhpc1tyKzJdPWU+Pj44LHRoaXNbciszXT1lJjI1NSk6RDAodGhpcyxlLHIsITEpLHIrNH0sRS5wcm90b3R5cGUud3JpdGVJbnRMRT1mdW5jdGlvbihlLHIsbixpKXtpZihlPStlLHI9cnwwLCFpKXt2YXIgYT1NYXRoLnBvdygyLDgqbi0xKTtRKHRoaXMsZSxyLG4sYS0xLC1hKX12YXIgcz0wLGY9MSx1PTA7Zm9yKHRoaXNbcl09ZSYyNTU7KytzPG4mJihmKj0yNTYpOyllPDAmJnU9PT0wJiZ0aGlzW3Ircy0xXSE9PTAmJih1PTEpLHRoaXNbcitzXT0oZS9mPj4wKS11JjI1NTtyZXR1cm4gcitufSxFLnByb3RvdHlwZS53cml0ZUludEJFPWZ1bmN0aW9uKGUscixuLGkpe2lmKGU9K2Uscj1yfDAsIWkpe3ZhciBhPU1hdGgucG93KDIsOCpuLTEpO1EodGhpcyxlLHIsbixhLTEsLWEpfXZhciBzPW4tMSxmPTEsdT0wO2Zvcih0aGlzW3Irc109ZSYyNTU7LS1zPj0wJiYoZio9MjU2KTspZTwwJiZ1PT09MCYmdGhpc1tyK3MrMV0hPT0wJiYodT0xKSx0aGlzW3Irc109KGUvZj4+MCktdSYyNTU7cmV0dXJuIHIrbn0sRS5wcm90b3R5cGUud3JpdGVJbnQ4PWZ1bmN0aW9uKGUscixuKXtyZXR1cm4gZT0rZSxyPXJ8MCxufHxRKHRoaXMsZSxyLDEsMTI3LC0xMjgpLEUuVFlQRURfQVJSQVlfU1VQUE9SVHx8KGU9TWF0aC5mbG9vcihlKSksZTwwJiYoZT0yNTUrZSsxKSx0aGlzW3JdPWUmMjU1LHIrMX0sRS5wcm90b3R5cGUud3JpdGVJbnQxNkxFPWZ1bmN0aW9uKGUscixuKXtyZXR1cm4gZT0rZSxyPXJ8MCxufHxRKHRoaXMsZSxyLDIsMzI3NjcsLTMyNzY4KSxFLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbcl09ZSYyNTUsdGhpc1tyKzFdPWU+Pj44KTpUMCh0aGlzLGUsciwhMCkscisyfSxFLnByb3RvdHlwZS53cml0ZUludDE2QkU9ZnVuY3Rpb24oZSxyLG4pe3JldHVybiBlPStlLHI9cnwwLG58fFEodGhpcyxlLHIsMiwzMjc2NywtMzI3NjgpLEUuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1tyXT1lPj4+OCx0aGlzW3IrMV09ZSYyNTUpOlQwKHRoaXMsZSxyLCExKSxyKzJ9LEUucHJvdG90eXBlLndyaXRlSW50MzJMRT1mdW5jdGlvbihlLHIsbil7cmV0dXJuIGU9K2Uscj1yfDAsbnx8USh0aGlzLGUsciw0LDIxNDc0ODM2NDcsLTIxNDc0ODM2NDgpLEUuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1tyXT1lJjI1NSx0aGlzW3IrMV09ZT4+PjgsdGhpc1tyKzJdPWU+Pj4xNix0aGlzW3IrM109ZT4+PjI0KTpEMCh0aGlzLGUsciwhMCkscis0fSxFLnByb3RvdHlwZS53cml0ZUludDMyQkU9ZnVuY3Rpb24oZSxyLG4pe3JldHVybiBlPStlLHI9cnwwLG58fFEodGhpcyxlLHIsNCwyMTQ3NDgzNjQ3LC0yMTQ3NDgzNjQ4KSxlPDAmJihlPTQyOTQ5NjcyOTUrZSsxKSxFLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbcl09ZT4+PjI0LHRoaXNbcisxXT1lPj4+MTYsdGhpc1tyKzJdPWU+Pj44LHRoaXNbciszXT1lJjI1NSk6RDAodGhpcyxlLHIsITEpLHIrNH07ZnVuY3Rpb24gbXIodCxlLHIsbixpLGEpe2lmKHIrbj50Lmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW5kZXggb3V0IG9mIHJhbmdlIik7aWYocjwwKXRocm93IG5ldyBSYW5nZUVycm9yKCJJbmRleCBvdXQgb2YgcmFuZ2UiKX1mdW5jdGlvbiBBcih0LGUscixuLGkpe3JldHVybiBpfHxtcih0LGUsciw0KSxscih0LGUscixuLDIzLDQpLHIrNH1FLnByb3RvdHlwZS53cml0ZUZsb2F0TEU9ZnVuY3Rpb24oZSxyLG4pe3JldHVybiBBcih0aGlzLGUsciwhMCxuKX0sRS5wcm90b3R5cGUud3JpdGVGbG9hdEJFPWZ1bmN0aW9uKGUscixuKXtyZXR1cm4gQXIodGhpcyxlLHIsITEsbil9O2Z1bmN0aW9uIEVyKHQsZSxyLG4saSl7cmV0dXJuIGl8fG1yKHQsZSxyLDgpLGxyKHQsZSxyLG4sNTIsOCkscis4fUUucHJvdG90eXBlLndyaXRlRG91YmxlTEU9ZnVuY3Rpb24oZSxyLG4pe3JldHVybiBFcih0aGlzLGUsciwhMCxuKX0sRS5wcm90b3R5cGUud3JpdGVEb3VibGVCRT1mdW5jdGlvbihlLHIsbil7cmV0dXJuIEVyKHRoaXMsZSxyLCExLG4pfSxFLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGUscixuLGkpe2lmKG58fChuPTApLCFpJiZpIT09MCYmKGk9dGhpcy5sZW5ndGgpLHI+PWUubGVuZ3RoJiYocj1lLmxlbmd0aCkscnx8KHI9MCksaT4wJiZpPG4mJihpPW4pLGk9PT1ufHxlLmxlbmd0aD09PTB8fHRoaXMubGVuZ3RoPT09MClyZXR1cm4gMDtpZihyPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoInRhcmdldFN0YXJ0IG91dCBvZiBib3VuZHMiKTtpZihuPDB8fG4+PXRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJzb3VyY2VTdGFydCBvdXQgb2YgYm91bmRzIik7aWYoaTwwKXRocm93IG5ldyBSYW5nZUVycm9yKCJzb3VyY2VFbmQgb3V0IG9mIGJvdW5kcyIpO2k+dGhpcy5sZW5ndGgmJihpPXRoaXMubGVuZ3RoKSxlLmxlbmd0aC1yPGktbiYmKGk9ZS5sZW5ndGgtcituKTt2YXIgYT1pLW4scztpZih0aGlzPT09ZSYmbjxyJiZyPGkpZm9yKHM9YS0xO3M+PTA7LS1zKWVbcytyXT10aGlzW3Mrbl07ZWxzZSBpZihhPDFlM3x8IUUuVFlQRURfQVJSQVlfU1VQUE9SVClmb3Iocz0wO3M8YTsrK3MpZVtzK3JdPXRoaXNbcytuXTtlbHNlIFVpbnQ4QXJyYXkucHJvdG90eXBlLnNldC5jYWxsKGUsdGhpcy5zdWJhcnJheShuLG4rYSkscik7cmV0dXJuIGF9LEUucHJvdG90eXBlLmZpbGw9ZnVuY3Rpb24oZSxyLG4saSl7aWYodHlwZW9mIGU9PSJzdHJpbmciKXtpZih0eXBlb2Ygcj09InN0cmluZyI/KGk9cixyPTAsbj10aGlzLmxlbmd0aCk6dHlwZW9mIG49PSJzdHJpbmciJiYoaT1uLG49dGhpcy5sZW5ndGgpLGUubGVuZ3RoPT09MSl7dmFyIGE9ZS5jaGFyQ29kZUF0KDApO2E8MjU2JiYoZT1hKX1pZihpIT09dm9pZCAwJiZ0eXBlb2YgaSE9InN0cmluZyIpdGhyb3cgbmV3IFR5cGVFcnJvcigiZW5jb2RpbmcgbXVzdCBiZSBhIHN0cmluZyIpO2lmKHR5cGVvZiBpPT0ic3RyaW5nIiYmIUUuaXNFbmNvZGluZyhpKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIGVuY29kaW5nOiAiK2kpfWVsc2UgdHlwZW9mIGU9PSJudW1iZXIiJiYoZT1lJjI1NSk7aWYocjwwfHx0aGlzLmxlbmd0aDxyfHx0aGlzLmxlbmd0aDxuKXRocm93IG5ldyBSYW5nZUVycm9yKCJPdXQgb2YgcmFuZ2UgaW5kZXgiKTtpZihuPD1yKXJldHVybiB0aGlzO3I9cj4+PjAsbj1uPT09dm9pZCAwP3RoaXMubGVuZ3RoOm4+Pj4wLGV8fChlPTApO3ZhciBzO2lmKHR5cGVvZiBlPT0ibnVtYmVyIilmb3Iocz1yO3M8bjsrK3MpdGhpc1tzXT1lO2Vsc2V7dmFyIGY9YTAoZSk/ZTpQMChuZXcgRShlLGkpLnRvU3RyaW5nKCkpLHU9Zi5sZW5ndGg7Zm9yKHM9MDtzPG4tcjsrK3MpdGhpc1tzK3JdPWZbcyV1XX1yZXR1cm4gdGhpc307dmFyICRlPS9bXitcLzAtOUEtWmEtei1fXS9nO2Z1bmN0aW9uIFZlKHQpe2lmKHQ9WmUodCkucmVwbGFjZSgkZSwiIiksdC5sZW5ndGg8MilyZXR1cm4iIjtmb3IoO3QubGVuZ3RoJTQhPTA7KXQ9dCsiPSI7cmV0dXJuIHR9ZnVuY3Rpb24gWmUodCl7cmV0dXJuIHQudHJpbT90LnRyaW0oKTp0LnJlcGxhY2UoL15ccyt8XHMrJC9nLCIiKX1mdW5jdGlvbiBRZSh0KXtyZXR1cm4gdDwxNj8iMCIrdC50b1N0cmluZygxNik6dC50b1N0cmluZygxNil9ZnVuY3Rpb24gUDAodCxlKXtlPWV8fDEvMDtmb3IodmFyIHIsbj10Lmxlbmd0aCxpPW51bGwsYT1bXSxzPTA7czxuOysrcyl7aWYocj10LmNoYXJDb2RlQXQocykscj41NTI5NSYmcjw1NzM0NCl7aWYoIWkpe2lmKHI+NTYzMTkpeyhlLT0zKT4tMSYmYS5wdXNoKDIzOSwxOTEsMTg5KTtjb250aW51ZX1lbHNlIGlmKHMrMT09PW4peyhlLT0zKT4tMSYmYS5wdXNoKDIzOSwxOTEsMTg5KTtjb250aW51ZX1pPXI7Y29udGludWV9aWYocjw1NjMyMCl7KGUtPTMpPi0xJiZhLnB1c2goMjM5LDE5MSwxODkpLGk9cjtjb250aW51ZX1yPShpLTU1Mjk2PDwxMHxyLTU2MzIwKSs2NTUzNn1lbHNlIGkmJihlLT0zKT4tMSYmYS5wdXNoKDIzOSwxOTEsMTg5KTtpZihpPW51bGwscjwxMjgpe2lmKChlLT0xKTwwKWJyZWFrO2EucHVzaChyKX1lbHNlIGlmKHI8MjA0OCl7aWYoKGUtPTIpPDApYnJlYWs7YS5wdXNoKHI+PjZ8MTkyLHImNjN8MTI4KX1lbHNlIGlmKHI8NjU1MzYpe2lmKChlLT0zKTwwKWJyZWFrO2EucHVzaChyPj4xMnwyMjQscj4+NiY2M3wxMjgsciY2M3wxMjgpfWVsc2UgaWYocjwxMTE0MTEyKXtpZigoZS09NCk8MClicmVhazthLnB1c2gocj4+MTh8MjQwLHI+PjEyJjYzfDEyOCxyPj42JjYzfDEyOCxyJjYzfDEyOCl9ZWxzZSB0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgY29kZSBwb2ludCIpfXJldHVybiBhfWZ1bmN0aW9uIGplKHQpe2Zvcih2YXIgZT1bXSxyPTA7cjx0Lmxlbmd0aDsrK3IpZS5wdXNoKHQuY2hhckNvZGVBdChyKSYyNTUpO3JldHVybiBlfWZ1bmN0aW9uIEplKHQsZSl7Zm9yKHZhciByLG4saSxhPVtdLHM9MDtzPHQubGVuZ3RoJiYhKChlLT0yKTwwKTsrK3Mpcj10LmNoYXJDb2RlQXQocyksbj1yPj44LGk9ciUyNTYsYS5wdXNoKGkpLGEucHVzaChuKTtyZXR1cm4gYX1mdW5jdGlvbiBrcih0KXtyZXR1cm4gQ2UoVmUodCkpfWZ1bmN0aW9uIEkwKHQsZSxyLG4pe2Zvcih2YXIgaT0wO2k8biYmIShpK3I+PWUubGVuZ3RofHxpPj10Lmxlbmd0aCk7KytpKWVbaStyXT10W2ldO3JldHVybiBpfWZ1bmN0aW9uIHJ0KHQpe3JldHVybiB0IT09dH1mdW5jdGlvbiBldCh0KXtyZXR1cm4gdCE9bnVsbCYmKCEhdC5faXNCdWZmZXJ8fENyKHQpfHx0dCh0KSl9ZnVuY3Rpb24gQ3IodCl7cmV0dXJuISF0LmNvbnN0cnVjdG9yJiZ0eXBlb2YgdC5jb25zdHJ1Y3Rvci5pc0J1ZmZlcj09ImZ1bmN0aW9uIiYmdC5jb25zdHJ1Y3Rvci5pc0J1ZmZlcih0KX1mdW5jdGlvbiB0dCh0KXtyZXR1cm4gdHlwZW9mIHQucmVhZEZsb2F0TEU9PSJmdW5jdGlvbiImJnR5cGVvZiB0LnNsaWNlPT0iZnVuY3Rpb24iJiZDcih0LnNsaWNlKDAsMCkpfXZhciBTcj1jcihmdW5jdGlvbih0KXtjb25zdCBlPXQuZXhwb3J0cztlLmRpZ2l0Q291bnQ9ZnVuY3Rpb24obil7Y29uc3QgaT1uPDA/MTowO3JldHVybiBuPU1hdGguYWJzKE51bWJlcihufHwxKSksTWF0aC5mbG9vcihNYXRoLmxvZzEwKG4pKSsxK2l9LGUuZ2V0VHlwZT1mdW5jdGlvbihuKXtyZXR1cm4gRS5pc0J1ZmZlcihuKT8iYnVmZmVyIjpBcnJheUJ1ZmZlci5pc1ZpZXcobik/ImFycmF5YnVmZmVydmlldyI6QXJyYXkuaXNBcnJheShuKT8iYXJyYXkiOm4gaW5zdGFuY2VvZiBOdW1iZXI/Im51bWJlciI6biBpbnN0YW5jZW9mIEJvb2xlYW4/ImJvb2xlYW4iOm4gaW5zdGFuY2VvZiBTZXQ/InNldCI6biBpbnN0YW5jZW9mIE1hcD8ibWFwIjpuIGluc3RhbmNlb2YgU3RyaW5nPyJzdHJpbmciOm4gaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcj8iYXJyYXlidWZmZXIiOnR5cGVvZiBufX0pO2NvbnN0e2dldFR5cGU6bnR9PVNyO2Z1bmN0aW9uIE0odCxlLHIpe2NvbnN0IG49W107bGV0IGk9bnVsbDtyZXR1cm4gTS5fZW5jb2RlKG4sdCksaT1FLmNvbmNhdChuKSxNLmJ5dGVzPWkubGVuZ3RoLEUuaXNCdWZmZXIoZSk/KGkuY29weShlLHIpLGUpOml9TS5ieXRlcz0tMSxNLl9mbG9hdENvbnZlcnNpb25EZXRlY3RlZD0hMSxNLl9lbmNvZGU9ZnVuY3Rpb24odCxlKXtpZihlIT1udWxsKXN3aXRjaChudChlKSl7Y2FzZSJidWZmZXIiOk0uYnVmZmVyKHQsZSk7YnJlYWs7Y2FzZSJvYmplY3QiOk0uZGljdCh0LGUpO2JyZWFrO2Nhc2UibWFwIjpNLmRpY3RNYXAodCxlKTticmVhaztjYXNlImFycmF5IjpNLmxpc3QodCxlKTticmVhaztjYXNlInNldCI6TS5saXN0U2V0KHQsZSk7YnJlYWs7Y2FzZSJzdHJpbmciOk0uc3RyaW5nKHQsZSk7YnJlYWs7Y2FzZSJudW1iZXIiOk0ubnVtYmVyKHQsZSk7YnJlYWs7Y2FzZSJib29sZWFuIjpNLm51bWJlcih0LGUpO2JyZWFrO2Nhc2UiYXJyYXlidWZmZXJ2aWV3IjpNLmJ1ZmZlcih0LEUuZnJvbShlLmJ1ZmZlcixlLmJ5dGVPZmZzZXQsZS5ieXRlTGVuZ3RoKSk7YnJlYWs7Y2FzZSJhcnJheWJ1ZmZlciI6TS5idWZmZXIodCxFLmZyb20oZSkpO2JyZWFrfX07Y29uc3QgejA9RS5mcm9tKCJlIiksUnI9RS5mcm9tKCJkIiksSHI9RS5mcm9tKCJsIik7TS5idWZmZXI9ZnVuY3Rpb24odCxlKXt0LnB1c2goRS5mcm9tKGUubGVuZ3RoKyI6IiksZSl9LE0uc3RyaW5nPWZ1bmN0aW9uKHQsZSl7dC5wdXNoKEUuZnJvbShFLmJ5dGVMZW5ndGgoZSkrIjoiK2UpKX0sTS5udW1iZXI9ZnVuY3Rpb24odCxlKXtjb25zdCByPTIxNDc0ODM2NDgsbj1lL3I8PDAsaT1lJXI8PDAsYT1uKnIraTt0LnB1c2goRS5mcm9tKCJpIithKyJlIikpLGEhPT1lJiYhTS5fZmxvYXRDb252ZXJzaW9uRGV0ZWN0ZWQmJihNLl9mbG9hdENvbnZlcnNpb25EZXRlY3RlZD0hMCxjb25zb2xlLndhcm4oJ1dBUk5JTkc6IFBvc3NpYmxlIGRhdGEgY29ycnVwdGlvbiBkZXRlY3RlZCB3aXRoIHZhbHVlICInK2UrJyI6JywnQmVuY29kaW5nIG9ubHkgZGVmaW5lcyBzdXBwb3J0IGZvciBpbnRlZ2VycywgdmFsdWUgd2FzIGNvbnZlcnRlZCB0byAiJythKyciJyksY29uc29sZS50cmFjZSgpKX0sTS5kaWN0PWZ1bmN0aW9uKHQsZSl7dC5wdXNoKFJyKTtsZXQgcj0wLG47Y29uc3QgaT1PYmplY3Qua2V5cyhlKS5zb3J0KCksYT1pLmxlbmd0aDtmb3IoO3I8YTtyKyspbj1pW3JdLGVbbl0hPW51bGwmJihNLnN0cmluZyh0LG4pLE0uX2VuY29kZSh0LGVbbl0pKTt0LnB1c2goejApfSxNLmRpY3RNYXA9ZnVuY3Rpb24odCxlKXt0LnB1c2goUnIpO2NvbnN0IHI9QXJyYXkuZnJvbShlLmtleXMoKSkuc29ydCgpO2Zvcihjb25zdCBuIG9mIHIpZS5nZXQobikhPW51bGwmJihFLmlzQnVmZmVyKG4pP00uX2VuY29kZSh0LG4pOk0uc3RyaW5nKHQsU3RyaW5nKG4pKSxNLl9lbmNvZGUodCxlLmdldChuKSkpO3QucHVzaCh6MCl9LE0ubGlzdD1mdW5jdGlvbih0LGUpe2xldCByPTA7Y29uc3Qgbj1lLmxlbmd0aDtmb3IodC5wdXNoKEhyKTtyPG47cisrKWVbcl0hPW51bGwmJk0uX2VuY29kZSh0LGVbcl0pO3QucHVzaCh6MCl9LE0ubGlzdFNldD1mdW5jdGlvbih0LGUpe3QucHVzaChIcik7Zm9yKGNvbnN0IHIgb2YgZSlyIT1udWxsJiZNLl9lbmNvZGUodCxyKTt0LnB1c2goejApfTt2YXIgaXQ9TTtjb25zdCBvdD0xMDUsYXQ9NTgseHQ9MTAwLHN0PTEwOCxRMD0xMDE7ZnVuY3Rpb24gVHIodCxlLHIpe2xldCBuPTAsaT0xO2ZvcihsZXQgYT1lO2E8cjthKyspe2NvbnN0IHM9dFthXTtpZihzPDU4JiZzPj00OCl7bj1uKjEwKyhzLTQ4KTtjb250aW51ZX1pZighKGE9PT1lJiZzPT09NDMpKXtpZihhPT09ZSYmcz09PTQ1KXtpPS0xO2NvbnRpbnVlfWlmKHM9PT00NilicmVhazt0aHJvdyBuZXcgRXJyb3IoIm5vdCBhIG51bWJlcjogYnVmZmVyWyIrYSsiXSA9ICIrcyl9fXJldHVybiBuKml9ZnVuY3Rpb24gVSh0LGUscixuKXtyZXR1cm4gdD09bnVsbHx8dC5sZW5ndGg9PT0wP251bGw6KHR5cGVvZiBlIT0ibnVtYmVyIiYmbj09bnVsbCYmKG49ZSxlPXZvaWQgMCksdHlwZW9mIHIhPSJudW1iZXIiJiZuPT1udWxsJiYobj1yLHI9dm9pZCAwKSxVLnBvc2l0aW9uPTAsVS5lbmNvZGluZz1ufHxudWxsLFUuZGF0YT1FLmlzQnVmZmVyKHQpP3Quc2xpY2UoZSxyKTpFLmZyb20odCksVS5ieXRlcz1VLmRhdGEubGVuZ3RoLFUubmV4dCgpKX1VLmJ5dGVzPTAsVS5wb3NpdGlvbj0wLFUuZGF0YT1udWxsLFUuZW5jb2Rpbmc9bnVsbCxVLm5leHQ9ZnVuY3Rpb24oKXtzd2l0Y2goVS5kYXRhW1UucG9zaXRpb25dKXtjYXNlIHh0OnJldHVybiBVLmRpY3Rpb25hcnkoKTtjYXNlIHN0OnJldHVybiBVLmxpc3QoKTtjYXNlIG90OnJldHVybiBVLmludGVnZXIoKTtkZWZhdWx0OnJldHVybiBVLmJ1ZmZlcigpfX0sVS5maW5kPWZ1bmN0aW9uKHQpe2xldCBlPVUucG9zaXRpb247Y29uc3Qgcj1VLmRhdGEubGVuZ3RoLG49VS5kYXRhO2Zvcig7ZTxyOyl7aWYobltlXT09PXQpcmV0dXJuIGU7ZSsrfXRocm93IG5ldyBFcnJvcignSW52YWxpZCBkYXRhOiBNaXNzaW5nIGRlbGltaXRlciAiJytTdHJpbmcuZnJvbUNoYXJDb2RlKHQpKyciIFsweCcrdC50b1N0cmluZygxNikrIl0iKX0sVS5kaWN0aW9uYXJ5PWZ1bmN0aW9uKCl7VS5wb3NpdGlvbisrO2NvbnN0IHQ9e307Zm9yKDtVLmRhdGFbVS5wb3NpdGlvbl0hPT1RMDspdFtVLmJ1ZmZlcigpXT1VLm5leHQoKTtyZXR1cm4gVS5wb3NpdGlvbisrLHR9LFUubGlzdD1mdW5jdGlvbigpe1UucG9zaXRpb24rKztjb25zdCB0PVtdO2Zvcig7VS5kYXRhW1UucG9zaXRpb25dIT09UTA7KXQucHVzaChVLm5leHQoKSk7cmV0dXJuIFUucG9zaXRpb24rKyx0fSxVLmludGVnZXI9ZnVuY3Rpb24oKXtjb25zdCB0PVUuZmluZChRMCksZT1UcihVLmRhdGEsVS5wb3NpdGlvbisxLHQpO3JldHVybiBVLnBvc2l0aW9uKz10KzEtVS5wb3NpdGlvbixlfSxVLmJ1ZmZlcj1mdW5jdGlvbigpe2xldCB0PVUuZmluZChhdCk7Y29uc3QgZT1UcihVLmRhdGEsVS5wb3NpdGlvbix0KSxyPSsrdCtlO3JldHVybiBVLnBvc2l0aW9uPXIsVS5lbmNvZGluZz9VLmRhdGEudG9TdHJpbmcoVS5lbmNvZGluZyx0LHIpOlUuZGF0YS5zbGljZSh0LHIpfTt2YXIgY3Q9VTtjb25zdHtkaWdpdENvdW50OmQwLGdldFR5cGU6ZnR9PVNyO2Z1bmN0aW9uIHV0KHQpe2xldCBlPTErMTtmb3IoY29uc3QgciBvZiB0KWUrPVUwKHIpO3JldHVybiBlfWZ1bmN0aW9uIGh0KHQpe2xldCBlPTErMTtmb3IoY29uc3RbcixuXW9mIHQpe2NvbnN0IGk9RS5ieXRlTGVuZ3RoKHIpO2UrPWQwKGkpKzEraSxlKz1VMChuKX1yZXR1cm4gZX1mdW5jdGlvbiBsdCh0KXtsZXQgZT0xKzE7Y29uc3Qgcj1PYmplY3Qua2V5cyh0KTtmb3IobGV0IG49MDtuPHIubGVuZ3RoO24rKyl7Y29uc3QgaT1FLmJ5dGVMZW5ndGgocltuXSk7ZSs9ZDAoaSkrMStpLGUrPVUwKHRbcltuXV0pfXJldHVybiBlfWZ1bmN0aW9uIHZ0KHQpe2NvbnN0IGU9RS5ieXRlTGVuZ3RoKHQpO3JldHVybiBkMChlKSsxK2V9ZnVuY3Rpb24gcHQodCl7Y29uc3QgZT10LmJ5dGVMZW5ndGgtdC5ieXRlT2Zmc2V0O3JldHVybiBkMChlKSsxK2V9ZnVuY3Rpb24gVTAodCl7Y29uc3QgZT0wO2lmKHQ9PW51bGwpcmV0dXJuIGU7Y29uc3Qgcj1mdCh0KTtzd2l0Y2gocil7Y2FzZSJidWZmZXIiOnJldHVybiBkMCh0Lmxlbmd0aCkrMSt0Lmxlbmd0aDtjYXNlImFycmF5YnVmZmVydmlldyI6cmV0dXJuIHB0KHQpO2Nhc2Uic3RyaW5nIjpyZXR1cm4gdnQodCk7Y2FzZSJhcnJheSI6Y2FzZSJzZXQiOnJldHVybiB1dCh0KTtjYXNlIm51bWJlciI6cmV0dXJuIDErZDAoTWF0aC5mbG9vcih0KSkrMTtjYXNlImJpZ2ludCI6cmV0dXJuIDErdC50b1N0cmluZygpLmxlbmd0aCsxO2Nhc2Uib2JqZWN0IjpyZXR1cm4gbHQodCk7Y2FzZSJtYXAiOnJldHVybiBodCh0KTtkZWZhdWx0OnRocm93IG5ldyBUeXBlRXJyb3IoYFVuc3VwcG9ydGVkIHZhbHVlIG9mIHR5cGUgIiR7cn0iYCl9fXZhciBkdD1VMCxfMD1jcihmdW5jdGlvbih0KXtjb25zdCBlPXQuZXhwb3J0cztlLmVuY29kZT1pdCxlLmRlY29kZT1jdCxlLmJ5dGVMZW5ndGg9ZS5lbmNvZGluZ0xlbmd0aD1kdH0pO18wLmJ5dGVMZW5ndGgsXzAuZGVjb2RlLF8wLmVuY29kZSxfMC5lbmNvZGluZ0xlbmd0aDt2YXIgRj10eXBlb2YgZ2xvYmFsVGhpcyE9InVuZGVmaW5lZCI/Z2xvYmFsVGhpczp0eXBlb2Ygd2luZG93IT0idW5kZWZpbmVkIj93aW5kb3c6dHlwZW9mIGdsb2JhbCE9InVuZGVmaW5lZCI/Z2xvYmFsOnR5cGVvZiBzZWxmIT0idW5kZWZpbmVkIj9zZWxmOnt9O2Z1bmN0aW9uIF90KHQpe3Rocm93IG5ldyBFcnJvcignQ291bGQgbm90IGR5bmFtaWNhbGx5IHJlcXVpcmUgIicrdCsnIi4gUGxlYXNlIGNvbmZpZ3VyZSB0aGUgZHluYW1pY1JlcXVpcmVUYXJnZXRzIG9yL2FuZCBpZ25vcmVEeW5hbWljUmVxdWlyZXMgb3B0aW9uIG9mIEByb2xsdXAvcGx1Z2luLWNvbW1vbmpzIGFwcHJvcHJpYXRlbHkgZm9yIHRoaXMgcmVxdWlyZSBjYWxsIHRvIHdvcmsuJyl9dmFyIERyPXtleHBvcnRzOnt9fSxZPXtleHBvcnRzOnt9fTsoZnVuY3Rpb24odCxlKXsoZnVuY3Rpb24ocixuKXt0LmV4cG9ydHM9bigpfSkoRixmdW5jdGlvbigpe3ZhciByPXJ8fGZ1bmN0aW9uKG4saSl7dmFyIGE7aWYodHlwZW9mIHdpbmRvdyE9InVuZGVmaW5lZCImJndpbmRvdy5jcnlwdG8mJihhPXdpbmRvdy5jcnlwdG8pLHR5cGVvZiBzZWxmIT0idW5kZWZpbmVkIiYmc2VsZi5jcnlwdG8mJihhPXNlbGYuY3J5cHRvKSx0eXBlb2YgZ2xvYmFsVGhpcyE9InVuZGVmaW5lZCImJmdsb2JhbFRoaXMuY3J5cHRvJiYoYT1nbG9iYWxUaGlzLmNyeXB0byksIWEmJnR5cGVvZiB3aW5kb3chPSJ1bmRlZmluZWQiJiZ3aW5kb3cubXNDcnlwdG8mJihhPXdpbmRvdy5tc0NyeXB0byksIWEmJnR5cGVvZiBGIT0idW5kZWZpbmVkIiYmRi5jcnlwdG8mJihhPUYuY3J5cHRvKSwhYSYmdHlwZW9mIF90PT0iZnVuY3Rpb24iKXRyeXthPXJlcXVpcmUoImNyeXB0byIpfWNhdGNoe312YXIgcz1mdW5jdGlvbigpe2lmKGEpe2lmKHR5cGVvZiBhLmdldFJhbmRvbVZhbHVlcz09ImZ1bmN0aW9uIil0cnl7cmV0dXJuIGEuZ2V0UmFuZG9tVmFsdWVzKG5ldyBVaW50MzJBcnJheSgxKSlbMF19Y2F0Y2h7fWlmKHR5cGVvZiBhLnJhbmRvbUJ5dGVzPT0iZnVuY3Rpb24iKXRyeXtyZXR1cm4gYS5yYW5kb21CeXRlcyg0KS5yZWFkSW50MzJMRSgpfWNhdGNoe319dGhyb3cgbmV3IEVycm9yKCJOYXRpdmUgY3J5cHRvIG1vZHVsZSBjb3VsZCBub3QgYmUgdXNlZCB0byBnZXQgc2VjdXJlIHJhbmRvbSBudW1iZXIuIil9LGY9T2JqZWN0LmNyZWF0ZXx8ZnVuY3Rpb24oKXtmdW5jdGlvbiB2KCl7fXJldHVybiBmdW5jdGlvbihkKXt2YXIgZztyZXR1cm4gdi5wcm90b3R5cGU9ZCxnPW5ldyB2LHYucHJvdG90eXBlPW51bGwsZ319KCksdT17fSxvPXUubGliPXt9LHg9by5CYXNlPWZ1bmN0aW9uKCl7cmV0dXJue2V4dGVuZDpmdW5jdGlvbih2KXt2YXIgZD1mKHRoaXMpO3JldHVybiB2JiZkLm1peEluKHYpLCghZC5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpfHx0aGlzLmluaXQ9PT1kLmluaXQpJiYoZC5pbml0PWZ1bmN0aW9uKCl7ZC4kc3VwZXIuaW5pdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9KSxkLmluaXQucHJvdG90eXBlPWQsZC4kc3VwZXI9dGhpcyxkfSxjcmVhdGU6ZnVuY3Rpb24oKXt2YXIgdj10aGlzLmV4dGVuZCgpO3JldHVybiB2LmluaXQuYXBwbHkodixhcmd1bWVudHMpLHZ9LGluaXQ6ZnVuY3Rpb24oKXt9LG1peEluOmZ1bmN0aW9uKHYpe2Zvcih2YXIgZCBpbiB2KXYuaGFzT3duUHJvcGVydHkoZCkmJih0aGlzW2RdPXZbZF0pO3YuaGFzT3duUHJvcGVydHkoInRvU3RyaW5nIikmJih0aGlzLnRvU3RyaW5nPXYudG9TdHJpbmcpfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmluaXQucHJvdG90eXBlLmV4dGVuZCh0aGlzKX19fSgpLHA9by5Xb3JkQXJyYXk9eC5leHRlbmQoe2luaXQ6ZnVuY3Rpb24odixkKXt2PXRoaXMud29yZHM9dnx8W10sZCE9aT90aGlzLnNpZ0J5dGVzPWQ6dGhpcy5zaWdCeXRlcz12Lmxlbmd0aCo0fSx0b1N0cmluZzpmdW5jdGlvbih2KXtyZXR1cm4odnx8aCkuc3RyaW5naWZ5KHRoaXMpfSxjb25jYXQ6ZnVuY3Rpb24odil7dmFyIGQ9dGhpcy53b3JkcyxnPXYud29yZHMsbT10aGlzLnNpZ0J5dGVzLEE9di5zaWdCeXRlcztpZih0aGlzLmNsYW1wKCksbSU0KWZvcih2YXIgaz0wO2s8QTtrKyspe3ZhciBDPWdbaz4+PjJdPj4+MjQtayU0KjgmMjU1O2RbbStrPj4+Ml18PUM8PDI0LShtK2spJTQqOH1lbHNlIGZvcih2YXIgST0wO0k8QTtJKz00KWRbbStJPj4+Ml09Z1tJPj4+Ml07cmV0dXJuIHRoaXMuc2lnQnl0ZXMrPUEsdGhpc30sY2xhbXA6ZnVuY3Rpb24oKXt2YXIgdj10aGlzLndvcmRzLGQ9dGhpcy5zaWdCeXRlczt2W2Q+Pj4yXSY9NDI5NDk2NzI5NTw8MzItZCU0Kjgsdi5sZW5ndGg9bi5jZWlsKGQvNCl9LGNsb25lOmZ1bmN0aW9uKCl7dmFyIHY9eC5jbG9uZS5jYWxsKHRoaXMpO3JldHVybiB2LndvcmRzPXRoaXMud29yZHMuc2xpY2UoMCksdn0scmFuZG9tOmZ1bmN0aW9uKHYpe2Zvcih2YXIgZD1bXSxnPTA7Zzx2O2crPTQpZC5wdXNoKHMoKSk7cmV0dXJuIG5ldyBwLmluaXQoZCx2KX19KSxjPXUuZW5jPXt9LGg9Yy5IZXg9e3N0cmluZ2lmeTpmdW5jdGlvbih2KXtmb3IodmFyIGQ9di53b3JkcyxnPXYuc2lnQnl0ZXMsbT1bXSxBPTA7QTxnO0ErKyl7dmFyIGs9ZFtBPj4+Ml0+Pj4yNC1BJTQqOCYyNTU7bS5wdXNoKChrPj4+NCkudG9TdHJpbmcoMTYpKSxtLnB1c2goKGsmMTUpLnRvU3RyaW5nKDE2KSl9cmV0dXJuIG0uam9pbigiIil9LHBhcnNlOmZ1bmN0aW9uKHYpe2Zvcih2YXIgZD12Lmxlbmd0aCxnPVtdLG09MDttPGQ7bSs9MilnW20+Pj4zXXw9cGFyc2VJbnQodi5zdWJzdHIobSwyKSwxNik8PDI0LW0lOCo0O3JldHVybiBuZXcgcC5pbml0KGcsZC8yKX19LGw9Yy5MYXRpbjE9e3N0cmluZ2lmeTpmdW5jdGlvbih2KXtmb3IodmFyIGQ9di53b3JkcyxnPXYuc2lnQnl0ZXMsbT1bXSxBPTA7QTxnO0ErKyl7dmFyIGs9ZFtBPj4+Ml0+Pj4yNC1BJTQqOCYyNTU7bS5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoaykpfXJldHVybiBtLmpvaW4oIiIpfSxwYXJzZTpmdW5jdGlvbih2KXtmb3IodmFyIGQ9di5sZW5ndGgsZz1bXSxtPTA7bTxkO20rKylnW20+Pj4yXXw9KHYuY2hhckNvZGVBdChtKSYyNTUpPDwyNC1tJTQqODtyZXR1cm4gbmV3IHAuaW5pdChnLGQpfX0sXz1jLlV0Zjg9e3N0cmluZ2lmeTpmdW5jdGlvbih2KXt0cnl7cmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChlc2NhcGUobC5zdHJpbmdpZnkodikpKX1jYXRjaHt0aHJvdyBuZXcgRXJyb3IoIk1hbGZvcm1lZCBVVEYtOCBkYXRhIil9fSxwYXJzZTpmdW5jdGlvbih2KXtyZXR1cm4gbC5wYXJzZSh1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQodikpKX19LHk9by5CdWZmZXJlZEJsb2NrQWxnb3JpdGhtPXguZXh0ZW5kKHtyZXNldDpmdW5jdGlvbigpe3RoaXMuX2RhdGE9bmV3IHAuaW5pdCx0aGlzLl9uRGF0YUJ5dGVzPTB9LF9hcHBlbmQ6ZnVuY3Rpb24odil7dHlwZW9mIHY9PSJzdHJpbmciJiYodj1fLnBhcnNlKHYpKSx0aGlzLl9kYXRhLmNvbmNhdCh2KSx0aGlzLl9uRGF0YUJ5dGVzKz12LnNpZ0J5dGVzfSxfcHJvY2VzczpmdW5jdGlvbih2KXt2YXIgZCxnPXRoaXMuX2RhdGEsbT1nLndvcmRzLEE9Zy5zaWdCeXRlcyxrPXRoaXMuYmxvY2tTaXplLEM9ayo0LEk9QS9DO3Y/ST1uLmNlaWwoSSk6ST1uLm1heCgoSXwwKS10aGlzLl9taW5CdWZmZXJTaXplLDApO3ZhciB3PUkqayxiPW4ubWluKHcqNCxBKTtpZih3KXtmb3IodmFyIFI9MDtSPHc7Uis9ayl0aGlzLl9kb1Byb2Nlc3NCbG9jayhtLFIpO2Q9bS5zcGxpY2UoMCx3KSxnLnNpZ0J5dGVzLT1ifXJldHVybiBuZXcgcC5pbml0KGQsYil9LGNsb25lOmZ1bmN0aW9uKCl7dmFyIHY9eC5jbG9uZS5jYWxsKHRoaXMpO3JldHVybiB2Ll9kYXRhPXRoaXMuX2RhdGEuY2xvbmUoKSx2fSxfbWluQnVmZmVyU2l6ZTowfSk7by5IYXNoZXI9eS5leHRlbmQoe2NmZzp4LmV4dGVuZCgpLGluaXQ6ZnVuY3Rpb24odil7dGhpcy5jZmc9dGhpcy5jZmcuZXh0ZW5kKHYpLHRoaXMucmVzZXQoKX0scmVzZXQ6ZnVuY3Rpb24oKXt5LnJlc2V0LmNhbGwodGhpcyksdGhpcy5fZG9SZXNldCgpfSx1cGRhdGU6ZnVuY3Rpb24odil7cmV0dXJuIHRoaXMuX2FwcGVuZCh2KSx0aGlzLl9wcm9jZXNzKCksdGhpc30sZmluYWxpemU6ZnVuY3Rpb24odil7diYmdGhpcy5fYXBwZW5kKHYpO3ZhciBkPXRoaXMuX2RvRmluYWxpemUoKTtyZXR1cm4gZH0sYmxvY2tTaXplOjUxMi8zMixfY3JlYXRlSGVscGVyOmZ1bmN0aW9uKHYpe3JldHVybiBmdW5jdGlvbihkLGcpe3JldHVybiBuZXcgdi5pbml0KGcpLmZpbmFsaXplKGQpfX0sX2NyZWF0ZUhtYWNIZWxwZXI6ZnVuY3Rpb24odil7cmV0dXJuIGZ1bmN0aW9uKGQsZyl7cmV0dXJuIG5ldyBCLkhNQUMuaW5pdCh2LGcpLmZpbmFsaXplKGQpfX19KTt2YXIgQj11LmFsZ289e307cmV0dXJuIHV9KE1hdGgpO3JldHVybiByfSl9KShZKTt2YXIgYjA9e2V4cG9ydHM6e319OyhmdW5jdGlvbih0LGUpeyhmdW5jdGlvbihyLG4pe3QuZXhwb3J0cz1uKFkuZXhwb3J0cyl9KShGLGZ1bmN0aW9uKHIpe3JldHVybiBmdW5jdGlvbihuKXt2YXIgaT1yLGE9aS5saWIscz1hLkJhc2UsZj1hLldvcmRBcnJheSx1PWkueDY0PXt9O3UuV29yZD1zLmV4dGVuZCh7aW5pdDpmdW5jdGlvbihvLHgpe3RoaXMuaGlnaD1vLHRoaXMubG93PXh9fSksdS5Xb3JkQXJyYXk9cy5leHRlbmQoe2luaXQ6ZnVuY3Rpb24obyx4KXtvPXRoaXMud29yZHM9b3x8W10seCE9bj90aGlzLnNpZ0J5dGVzPXg6dGhpcy5zaWdCeXRlcz1vLmxlbmd0aCo4fSx0b1gzMjpmdW5jdGlvbigpe2Zvcih2YXIgbz10aGlzLndvcmRzLHg9by5sZW5ndGgscD1bXSxjPTA7Yzx4O2MrKyl7dmFyIGg9b1tjXTtwLnB1c2goaC5oaWdoKSxwLnB1c2goaC5sb3cpfXJldHVybiBmLmNyZWF0ZShwLHRoaXMuc2lnQnl0ZXMpfSxjbG9uZTpmdW5jdGlvbigpe2Zvcih2YXIgbz1zLmNsb25lLmNhbGwodGhpcykseD1vLndvcmRzPXRoaXMud29yZHMuc2xpY2UoMCkscD14Lmxlbmd0aCxjPTA7YzxwO2MrKyl4W2NdPXhbY10uY2xvbmUoKTtyZXR1cm4gb319KX0oKSxyfSl9KShiMCk7dmFyIFByPXtleHBvcnRzOnt9fTsoZnVuY3Rpb24odCxlKXsoZnVuY3Rpb24ocixuKXt0LmV4cG9ydHM9bihZLmV4cG9ydHMpfSkoRixmdW5jdGlvbihyKXtyZXR1cm4gZnVuY3Rpb24oKXtpZih0eXBlb2YgQXJyYXlCdWZmZXI9PSJmdW5jdGlvbiIpe3ZhciBuPXIsaT1uLmxpYixhPWkuV29yZEFycmF5LHM9YS5pbml0LGY9YS5pbml0PWZ1bmN0aW9uKHUpe2lmKHUgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlciYmKHU9bmV3IFVpbnQ4QXJyYXkodSkpLCh1IGluc3RhbmNlb2YgSW50OEFycmF5fHx0eXBlb2YgVWludDhDbGFtcGVkQXJyYXkhPSJ1bmRlZmluZWQiJiZ1IGluc3RhbmNlb2YgVWludDhDbGFtcGVkQXJyYXl8fHUgaW5zdGFuY2VvZiBJbnQxNkFycmF5fHx1IGluc3RhbmNlb2YgVWludDE2QXJyYXl8fHUgaW5zdGFuY2VvZiBJbnQzMkFycmF5fHx1IGluc3RhbmNlb2YgVWludDMyQXJyYXl8fHUgaW5zdGFuY2VvZiBGbG9hdDMyQXJyYXl8fHUgaW5zdGFuY2VvZiBGbG9hdDY0QXJyYXkpJiYodT1uZXcgVWludDhBcnJheSh1LmJ1ZmZlcix1LmJ5dGVPZmZzZXQsdS5ieXRlTGVuZ3RoKSksdSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpe2Zvcih2YXIgbz11LmJ5dGVMZW5ndGgseD1bXSxwPTA7cDxvO3ArKyl4W3A+Pj4yXXw9dVtwXTw8MjQtcCU0Kjg7cy5jYWxsKHRoaXMseCxvKX1lbHNlIHMuYXBwbHkodGhpcyxhcmd1bWVudHMpfTtmLnByb3RvdHlwZT1hfX0oKSxyLmxpYi5Xb3JkQXJyYXl9KX0pKFByKTt2YXIgSXI9e2V4cG9ydHM6e319OyhmdW5jdGlvbih0LGUpeyhmdW5jdGlvbihyLG4pe3QuZXhwb3J0cz1uKFkuZXhwb3J0cyl9KShGLGZ1bmN0aW9uKHIpe3JldHVybiBmdW5jdGlvbigpe3ZhciBuPXIsaT1uLmxpYixhPWkuV29yZEFycmF5LHM9bi5lbmM7cy5VdGYxNj1zLlV0ZjE2QkU9e3N0cmluZ2lmeTpmdW5jdGlvbih1KXtmb3IodmFyIG89dS53b3Jkcyx4PXUuc2lnQnl0ZXMscD1bXSxjPTA7Yzx4O2MrPTIpe3ZhciBoPW9bYz4+PjJdPj4+MTYtYyU0KjgmNjU1MzU7cC5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoaCkpfXJldHVybiBwLmpvaW4oIiIpfSxwYXJzZTpmdW5jdGlvbih1KXtmb3IodmFyIG89dS5sZW5ndGgseD1bXSxwPTA7cDxvO3ArKyl4W3A+Pj4xXXw9dS5jaGFyQ29kZUF0KHApPDwxNi1wJTIqMTY7cmV0dXJuIGEuY3JlYXRlKHgsbyoyKX19LHMuVXRmMTZMRT17c3RyaW5naWZ5OmZ1bmN0aW9uKHUpe2Zvcih2YXIgbz11LndvcmRzLHg9dS5zaWdCeXRlcyxwPVtdLGM9MDtjPHg7Yys9Mil7dmFyIGg9ZihvW2M+Pj4yXT4+PjE2LWMlNCo4JjY1NTM1KTtwLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShoKSl9cmV0dXJuIHAuam9pbigiIil9LHBhcnNlOmZ1bmN0aW9uKHUpe2Zvcih2YXIgbz11Lmxlbmd0aCx4PVtdLHA9MDtwPG87cCsrKXhbcD4+PjFdfD1mKHUuY2hhckNvZGVBdChwKTw8MTYtcCUyKjE2KTtyZXR1cm4gYS5jcmVhdGUoeCxvKjIpfX07ZnVuY3Rpb24gZih1KXtyZXR1cm4gdTw8OCY0Mjc4MjU1MzYwfHU+Pj44JjE2NzExOTM1fX0oKSxyLmVuYy5VdGYxNn0pfSkoSXIpO3ZhciBsMD17ZXhwb3J0czp7fX07KGZ1bmN0aW9uKHQsZSl7KGZ1bmN0aW9uKHIsbil7dC5leHBvcnRzPW4oWS5leHBvcnRzKX0pKEYsZnVuY3Rpb24ocil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG49cixpPW4ubGliLGE9aS5Xb3JkQXJyYXkscz1uLmVuYztzLkJhc2U2ND17c3RyaW5naWZ5OmZ1bmN0aW9uKHUpe3ZhciBvPXUud29yZHMseD11LnNpZ0J5dGVzLHA9dGhpcy5fbWFwO3UuY2xhbXAoKTtmb3IodmFyIGM9W10saD0wO2g8eDtoKz0zKWZvcih2YXIgbD1vW2g+Pj4yXT4+PjI0LWglNCo4JjI1NSxfPW9baCsxPj4+Ml0+Pj4yNC0oaCsxKSU0KjgmMjU1LHk9b1toKzI+Pj4yXT4+PjI0LShoKzIpJTQqOCYyNTUsQj1sPDwxNnxfPDw4fHksdj0wO3Y8NCYmaCt2Ki43NTx4O3YrKyljLnB1c2gocC5jaGFyQXQoQj4+PjYqKDMtdikmNjMpKTt2YXIgZD1wLmNoYXJBdCg2NCk7aWYoZClmb3IoO2MubGVuZ3RoJTQ7KWMucHVzaChkKTtyZXR1cm4gYy5qb2luKCIiKX0scGFyc2U6ZnVuY3Rpb24odSl7dmFyIG89dS5sZW5ndGgseD10aGlzLl9tYXAscD10aGlzLl9yZXZlcnNlTWFwO2lmKCFwKXtwPXRoaXMuX3JldmVyc2VNYXA9W107Zm9yKHZhciBjPTA7Yzx4Lmxlbmd0aDtjKyspcFt4LmNoYXJDb2RlQXQoYyldPWN9dmFyIGg9eC5jaGFyQXQoNjQpO2lmKGgpe3ZhciBsPXUuaW5kZXhPZihoKTtsIT09LTEmJihvPWwpfXJldHVybiBmKHUsbyxwKX0sX21hcDoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0ifTtmdW5jdGlvbiBmKHUsbyx4KXtmb3IodmFyIHA9W10sYz0wLGg9MDtoPG87aCsrKWlmKGglNCl7dmFyIGw9eFt1LmNoYXJDb2RlQXQoaC0xKV08PGglNCoyLF89eFt1LmNoYXJDb2RlQXQoaCldPj4+Ni1oJTQqMix5PWx8XztwW2M+Pj4yXXw9eTw8MjQtYyU0KjgsYysrfXJldHVybiBhLmNyZWF0ZShwLGMpfX0oKSxyLmVuYy5CYXNlNjR9KX0pKGwwKTt2YXIgenI9e2V4cG9ydHM6e319OyhmdW5jdGlvbih0LGUpeyhmdW5jdGlvbihyLG4pe3QuZXhwb3J0cz1uKFkuZXhwb3J0cyl9KShGLGZ1bmN0aW9uKHIpe3JldHVybiBmdW5jdGlvbigpe3ZhciBuPXIsaT1uLmxpYixhPWkuV29yZEFycmF5LHM9bi5lbmM7cy5CYXNlNjR1cmw9e3N0cmluZ2lmeTpmdW5jdGlvbih1LG89ITApe3ZhciB4PXUud29yZHMscD11LnNpZ0J5dGVzLGM9bz90aGlzLl9zYWZlX21hcDp0aGlzLl9tYXA7dS5jbGFtcCgpO2Zvcih2YXIgaD1bXSxsPTA7bDxwO2wrPTMpZm9yKHZhciBfPXhbbD4+PjJdPj4+MjQtbCU0KjgmMjU1LHk9eFtsKzE+Pj4yXT4+PjI0LShsKzEpJTQqOCYyNTUsQj14W2wrMj4+PjJdPj4+MjQtKGwrMiklNCo4JjI1NSx2PV88PDE2fHk8PDh8QixkPTA7ZDw0JiZsK2QqLjc1PHA7ZCsrKWgucHVzaChjLmNoYXJBdCh2Pj4+NiooMy1kKSY2MykpO3ZhciBnPWMuY2hhckF0KDY0KTtpZihnKWZvcig7aC5sZW5ndGglNDspaC5wdXNoKGcpO3JldHVybiBoLmpvaW4oIiIpfSxwYXJzZTpmdW5jdGlvbih1LG89ITApe3ZhciB4PXUubGVuZ3RoLHA9bz90aGlzLl9zYWZlX21hcDp0aGlzLl9tYXAsYz10aGlzLl9yZXZlcnNlTWFwO2lmKCFjKXtjPXRoaXMuX3JldmVyc2VNYXA9W107Zm9yKHZhciBoPTA7aDxwLmxlbmd0aDtoKyspY1twLmNoYXJDb2RlQXQoaCldPWh9dmFyIGw9cC5jaGFyQXQoNjQpO2lmKGwpe3ZhciBfPXUuaW5kZXhPZihsKTtfIT09LTEmJih4PV8pfXJldHVybiBmKHUseCxjKX0sX21hcDoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLF9zYWZlX21hcDoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODktXyJ9O2Z1bmN0aW9uIGYodSxvLHgpe2Zvcih2YXIgcD1bXSxjPTAsaD0wO2g8bztoKyspaWYoaCU0KXt2YXIgbD14W3UuY2hhckNvZGVBdChoLTEpXTw8aCU0KjIsXz14W3UuY2hhckNvZGVBdChoKV0+Pj42LWglNCoyLHk9bHxfO3BbYz4+PjJdfD15PDwyNC1jJTQqOCxjKyt9cmV0dXJuIGEuY3JlYXRlKHAsYyl9fSgpLHIuZW5jLkJhc2U2NHVybH0pfSkoenIpO3ZhciB2MD17ZXhwb3J0czp7fX07KGZ1bmN0aW9uKHQsZSl7KGZ1bmN0aW9uKHIsbil7dC5leHBvcnRzPW4oWS5leHBvcnRzKX0pKEYsZnVuY3Rpb24ocil7cmV0dXJuIGZ1bmN0aW9uKG4pe3ZhciBpPXIsYT1pLmxpYixzPWEuV29yZEFycmF5LGY9YS5IYXNoZXIsdT1pLmFsZ28sbz1bXTsoZnVuY3Rpb24oKXtmb3IodmFyIF89MDtfPDY0O18rKylvW19dPW4uYWJzKG4uc2luKF8rMSkpKjQyOTQ5NjcyOTZ8MH0pKCk7dmFyIHg9dS5NRDU9Zi5leHRlbmQoe19kb1Jlc2V0OmZ1bmN0aW9uKCl7dGhpcy5faGFzaD1uZXcgcy5pbml0KFsxNzMyNTg0MTkzLDQwMjMyMzM0MTcsMjU2MjM4MzEwMiwyNzE3MzM4NzhdKX0sX2RvUHJvY2Vzc0Jsb2NrOmZ1bmN0aW9uKF8seSl7Zm9yKHZhciBCPTA7QjwxNjtCKyspe3ZhciB2PXkrQixkPV9bdl07X1t2XT0oZDw8OHxkPj4+MjQpJjE2NzExOTM1fChkPDwyNHxkPj4+OCkmNDI3ODI1NTM2MH12YXIgZz10aGlzLl9oYXNoLndvcmRzLG09X1t5KzBdLEE9X1t5KzFdLGs9X1t5KzJdLEM9X1t5KzNdLEk9X1t5KzRdLHc9X1t5KzVdLGI9X1t5KzZdLFI9X1t5KzddLFQ9X1t5KzhdLHo9X1t5KzldLEw9X1t5KzEwXSxOPV9beSsxMV0scT1fW3krMTJdLE89X1t5KzEzXSxHPV9beSsxNF0sSz1fW3krMTVdLFM9Z1swXSxEPWdbMV0sUD1nWzJdLEg9Z1szXTtTPXAoUyxELFAsSCxtLDcsb1swXSksSD1wKEgsUyxELFAsQSwxMixvWzFdKSxQPXAoUCxILFMsRCxrLDE3LG9bMl0pLEQ9cChELFAsSCxTLEMsMjIsb1szXSksUz1wKFMsRCxQLEgsSSw3LG9bNF0pLEg9cChILFMsRCxQLHcsMTIsb1s1XSksUD1wKFAsSCxTLEQsYiwxNyxvWzZdKSxEPXAoRCxQLEgsUyxSLDIyLG9bN10pLFM9cChTLEQsUCxILFQsNyxvWzhdKSxIPXAoSCxTLEQsUCx6LDEyLG9bOV0pLFA9cChQLEgsUyxELEwsMTcsb1sxMF0pLEQ9cChELFAsSCxTLE4sMjIsb1sxMV0pLFM9cChTLEQsUCxILHEsNyxvWzEyXSksSD1wKEgsUyxELFAsTywxMixvWzEzXSksUD1wKFAsSCxTLEQsRywxNyxvWzE0XSksRD1wKEQsUCxILFMsSywyMixvWzE1XSksUz1jKFMsRCxQLEgsQSw1LG9bMTZdKSxIPWMoSCxTLEQsUCxiLDksb1sxN10pLFA9YyhQLEgsUyxELE4sMTQsb1sxOF0pLEQ9YyhELFAsSCxTLG0sMjAsb1sxOV0pLFM9YyhTLEQsUCxILHcsNSxvWzIwXSksSD1jKEgsUyxELFAsTCw5LG9bMjFdKSxQPWMoUCxILFMsRCxLLDE0LG9bMjJdKSxEPWMoRCxQLEgsUyxJLDIwLG9bMjNdKSxTPWMoUyxELFAsSCx6LDUsb1syNF0pLEg9YyhILFMsRCxQLEcsOSxvWzI1XSksUD1jKFAsSCxTLEQsQywxNCxvWzI2XSksRD1jKEQsUCxILFMsVCwyMCxvWzI3XSksUz1jKFMsRCxQLEgsTyw1LG9bMjhdKSxIPWMoSCxTLEQsUCxrLDksb1syOV0pLFA9YyhQLEgsUyxELFIsMTQsb1szMF0pLEQ9YyhELFAsSCxTLHEsMjAsb1szMV0pLFM9aChTLEQsUCxILHcsNCxvWzMyXSksSD1oKEgsUyxELFAsVCwxMSxvWzMzXSksUD1oKFAsSCxTLEQsTiwxNixvWzM0XSksRD1oKEQsUCxILFMsRywyMyxvWzM1XSksUz1oKFMsRCxQLEgsQSw0LG9bMzZdKSxIPWgoSCxTLEQsUCxJLDExLG9bMzddKSxQPWgoUCxILFMsRCxSLDE2LG9bMzhdKSxEPWgoRCxQLEgsUyxMLDIzLG9bMzldKSxTPWgoUyxELFAsSCxPLDQsb1s0MF0pLEg9aChILFMsRCxQLG0sMTEsb1s0MV0pLFA9aChQLEgsUyxELEMsMTYsb1s0Ml0pLEQ9aChELFAsSCxTLGIsMjMsb1s0M10pLFM9aChTLEQsUCxILHosNCxvWzQ0XSksSD1oKEgsUyxELFAscSwxMSxvWzQ1XSksUD1oKFAsSCxTLEQsSywxNixvWzQ2XSksRD1oKEQsUCxILFMsaywyMyxvWzQ3XSksUz1sKFMsRCxQLEgsbSw2LG9bNDhdKSxIPWwoSCxTLEQsUCxSLDEwLG9bNDldKSxQPWwoUCxILFMsRCxHLDE1LG9bNTBdKSxEPWwoRCxQLEgsUyx3LDIxLG9bNTFdKSxTPWwoUyxELFAsSCxxLDYsb1s1Ml0pLEg9bChILFMsRCxQLEMsMTAsb1s1M10pLFA9bChQLEgsUyxELEwsMTUsb1s1NF0pLEQ9bChELFAsSCxTLEEsMjEsb1s1NV0pLFM9bChTLEQsUCxILFQsNixvWzU2XSksSD1sKEgsUyxELFAsSywxMCxvWzU3XSksUD1sKFAsSCxTLEQsYiwxNSxvWzU4XSksRD1sKEQsUCxILFMsTywyMSxvWzU5XSksUz1sKFMsRCxQLEgsSSw2LG9bNjBdKSxIPWwoSCxTLEQsUCxOLDEwLG9bNjFdKSxQPWwoUCxILFMsRCxrLDE1LG9bNjJdKSxEPWwoRCxQLEgsUyx6LDIxLG9bNjNdKSxnWzBdPWdbMF0rU3wwLGdbMV09Z1sxXStEfDAsZ1syXT1nWzJdK1B8MCxnWzNdPWdbM10rSHwwfSxfZG9GaW5hbGl6ZTpmdW5jdGlvbigpe3ZhciBfPXRoaXMuX2RhdGEseT1fLndvcmRzLEI9dGhpcy5fbkRhdGFCeXRlcyo4LHY9Xy5zaWdCeXRlcyo4O3lbdj4+PjVdfD0xMjg8PDI0LXYlMzI7dmFyIGQ9bi5mbG9vcihCLzQyOTQ5NjcyOTYpLGc9Qjt5Wyh2KzY0Pj4+OTw8NCkrMTVdPShkPDw4fGQ+Pj4yNCkmMTY3MTE5MzV8KGQ8PDI0fGQ+Pj44KSY0Mjc4MjU1MzYwLHlbKHYrNjQ+Pj45PDw0KSsxNF09KGc8PDh8Zz4+PjI0KSYxNjcxMTkzNXwoZzw8MjR8Zz4+PjgpJjQyNzgyNTUzNjAsXy5zaWdCeXRlcz0oeS5sZW5ndGgrMSkqNCx0aGlzLl9wcm9jZXNzKCk7Zm9yKHZhciBtPXRoaXMuX2hhc2gsQT1tLndvcmRzLGs9MDtrPDQ7aysrKXt2YXIgQz1BW2tdO0Fba109KEM8PDh8Qz4+PjI0KSYxNjcxMTkzNXwoQzw8MjR8Qz4+PjgpJjQyNzgyNTUzNjB9cmV0dXJuIG19LGNsb25lOmZ1bmN0aW9uKCl7dmFyIF89Zi5jbG9uZS5jYWxsKHRoaXMpO3JldHVybiBfLl9oYXNoPXRoaXMuX2hhc2guY2xvbmUoKSxffX0pO2Z1bmN0aW9uIHAoXyx5LEIsdixkLGcsbSl7dmFyIEE9XysoeSZCfH55JnYpK2QrbTtyZXR1cm4oQTw8Z3xBPj4+MzItZykreX1mdW5jdGlvbiBjKF8seSxCLHYsZCxnLG0pe3ZhciBBPV8rKHkmdnxCJn52KStkK207cmV0dXJuKEE8PGd8QT4+PjMyLWcpK3l9ZnVuY3Rpb24gaChfLHksQix2LGQsZyxtKXt2YXIgQT1fKyh5XkJedikrZCttO3JldHVybihBPDxnfEE+Pj4zMi1nKSt5fWZ1bmN0aW9uIGwoXyx5LEIsdixkLGcsbSl7dmFyIEE9XysoQl4oeXx+dikpK2QrbTtyZXR1cm4oQTw8Z3xBPj4+MzItZykreX1pLk1ENT1mLl9jcmVhdGVIZWxwZXIoeCksaS5IbWFjTUQ1PWYuX2NyZWF0ZUhtYWNIZWxwZXIoeCl9KE1hdGgpLHIuTUQ1fSl9KSh2MCk7dmFyIEwwPXtleHBvcnRzOnt9fTsoZnVuY3Rpb24odCxlKXsoZnVuY3Rpb24ocixuKXt0LmV4cG9ydHM9bihZLmV4cG9ydHMpfSkoRixmdW5jdGlvbihyKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbj1yLGk9bi5saWIsYT1pLldvcmRBcnJheSxzPWkuSGFzaGVyLGY9bi5hbGdvLHU9W10sbz1mLlNIQTE9cy5leHRlbmQoe19kb1Jlc2V0OmZ1bmN0aW9uKCl7dGhpcy5faGFzaD1uZXcgYS5pbml0KFsxNzMyNTg0MTkzLDQwMjMyMzM0MTcsMjU2MjM4MzEwMiwyNzE3MzM4NzgsMzI4NTM3NzUyMF0pfSxfZG9Qcm9jZXNzQmxvY2s6ZnVuY3Rpb24oeCxwKXtmb3IodmFyIGM9dGhpcy5faGFzaC53b3JkcyxoPWNbMF0sbD1jWzFdLF89Y1syXSx5PWNbM10sQj1jWzRdLHY9MDt2PDgwO3YrKyl7aWYodjwxNil1W3ZdPXhbcCt2XXwwO2Vsc2V7dmFyIGQ9dVt2LTNdXnVbdi04XV51W3YtMTRdXnVbdi0xNl07dVt2XT1kPDwxfGQ+Pj4zMX12YXIgZz0oaDw8NXxoPj4+MjcpK0IrdVt2XTt2PDIwP2crPShsJl98fmwmeSkrMTUxODUwMDI0OTp2PDQwP2crPShsXl9eeSkrMTg1OTc3NTM5Mzp2PDYwP2crPShsJl98bCZ5fF8meSktMTg5NDAwNzU4ODpnKz0obF5fXnkpLTg5OTQ5NzUxNCxCPXkseT1fLF89bDw8MzB8bD4+PjIsbD1oLGg9Z31jWzBdPWNbMF0raHwwLGNbMV09Y1sxXStsfDAsY1syXT1jWzJdK198MCxjWzNdPWNbM10reXwwLGNbNF09Y1s0XStCfDB9LF9kb0ZpbmFsaXplOmZ1bmN0aW9uKCl7dmFyIHg9dGhpcy5fZGF0YSxwPXgud29yZHMsYz10aGlzLl9uRGF0YUJ5dGVzKjgsaD14LnNpZ0J5dGVzKjg7cmV0dXJuIHBbaD4+PjVdfD0xMjg8PDI0LWglMzIscFsoaCs2ND4+Pjk8PDQpKzE0XT1NYXRoLmZsb29yKGMvNDI5NDk2NzI5NikscFsoaCs2ND4+Pjk8PDQpKzE1XT1jLHguc2lnQnl0ZXM9cC5sZW5ndGgqNCx0aGlzLl9wcm9jZXNzKCksdGhpcy5faGFzaH0sY2xvbmU6ZnVuY3Rpb24oKXt2YXIgeD1zLmNsb25lLmNhbGwodGhpcyk7cmV0dXJuIHguX2hhc2g9dGhpcy5faGFzaC5jbG9uZSgpLHh9fSk7bi5TSEExPXMuX2NyZWF0ZUhlbHBlcihvKSxuLkhtYWNTSEExPXMuX2NyZWF0ZUhtYWNIZWxwZXIobyl9KCksci5TSEExfSl9KShMMCk7dmFyIGowPXtleHBvcnRzOnt9fTsoZnVuY3Rpb24odCxlKXsoZnVuY3Rpb24ocixuKXt0LmV4cG9ydHM9bihZLmV4cG9ydHMpfSkoRixmdW5jdGlvbihyKXtyZXR1cm4gZnVuY3Rpb24obil7dmFyIGk9cixhPWkubGliLHM9YS5Xb3JkQXJyYXksZj1hLkhhc2hlcix1PWkuYWxnbyxvPVtdLHg9W107KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gaChCKXtmb3IodmFyIHY9bi5zcXJ0KEIpLGQ9MjtkPD12O2QrKylpZighKEIlZCkpcmV0dXJuITE7cmV0dXJuITB9ZnVuY3Rpb24gbChCKXtyZXR1cm4oQi0oQnwwKSkqNDI5NDk2NzI5NnwwfWZvcih2YXIgXz0yLHk9MDt5PDY0OyloKF8pJiYoeTw4JiYob1t5XT1sKG4ucG93KF8sMS8yKSkpLHhbeV09bChuLnBvdyhfLDEvMykpLHkrKyksXysrfSkoKTt2YXIgcD1bXSxjPXUuU0hBMjU2PWYuZXh0ZW5kKHtfZG9SZXNldDpmdW5jdGlvbigpe3RoaXMuX2hhc2g9bmV3IHMuaW5pdChvLnNsaWNlKDApKX0sX2RvUHJvY2Vzc0Jsb2NrOmZ1bmN0aW9uKGgsbCl7Zm9yKHZhciBfPXRoaXMuX2hhc2gud29yZHMseT1fWzBdLEI9X1sxXSx2PV9bMl0sZD1fWzNdLGc9X1s0XSxtPV9bNV0sQT1fWzZdLGs9X1s3XSxDPTA7Qzw2NDtDKyspe2lmKEM8MTYpcFtDXT1oW2wrQ118MDtlbHNle3ZhciBJPXBbQy0xNV0sdz0oSTw8MjV8ST4+PjcpXihJPDwxNHxJPj4+MTgpXkk+Pj4zLGI9cFtDLTJdLFI9KGI8PDE1fGI+Pj4xNyleKGI8PDEzfGI+Pj4xOSleYj4+PjEwO3BbQ109dytwW0MtN10rUitwW0MtMTZdfXZhciBUPWcmbV5+ZyZBLHo9eSZCXnkmdl5CJnYsTD0oeTw8MzB8eT4+PjIpXih5PDwxOXx5Pj4+MTMpXih5PDwxMHx5Pj4+MjIpLE49KGc8PDI2fGc+Pj42KV4oZzw8MjF8Zz4+PjExKV4oZzw8N3xnPj4+MjUpLHE9aytOK1QreFtDXStwW0NdLE89TCt6O2s9QSxBPW0sbT1nLGc9ZCtxfDAsZD12LHY9QixCPXkseT1xK098MH1fWzBdPV9bMF0reXwwLF9bMV09X1sxXStCfDAsX1syXT1fWzJdK3Z8MCxfWzNdPV9bM10rZHwwLF9bNF09X1s0XStnfDAsX1s1XT1fWzVdK218MCxfWzZdPV9bNl0rQXwwLF9bN109X1s3XStrfDB9LF9kb0ZpbmFsaXplOmZ1bmN0aW9uKCl7dmFyIGg9dGhpcy5fZGF0YSxsPWgud29yZHMsXz10aGlzLl9uRGF0YUJ5dGVzKjgseT1oLnNpZ0J5dGVzKjg7cmV0dXJuIGxbeT4+PjVdfD0xMjg8PDI0LXklMzIsbFsoeSs2ND4+Pjk8PDQpKzE0XT1uLmZsb29yKF8vNDI5NDk2NzI5NiksbFsoeSs2ND4+Pjk8PDQpKzE1XT1fLGguc2lnQnl0ZXM9bC5sZW5ndGgqNCx0aGlzLl9wcm9jZXNzKCksdGhpcy5faGFzaH0sY2xvbmU6ZnVuY3Rpb24oKXt2YXIgaD1mLmNsb25lLmNhbGwodGhpcyk7cmV0dXJuIGguX2hhc2g9dGhpcy5faGFzaC5jbG9uZSgpLGh9fSk7aS5TSEEyNTY9Zi5fY3JlYXRlSGVscGVyKGMpLGkuSG1hY1NIQTI1Nj1mLl9jcmVhdGVIbWFjSGVscGVyKGMpfShNYXRoKSxyLlNIQTI1Nn0pfSkoajApO3ZhciBVcj17ZXhwb3J0czp7fX07KGZ1bmN0aW9uKHQsZSl7KGZ1bmN0aW9uKHIsbixpKXt0LmV4cG9ydHM9bihZLmV4cG9ydHMsajAuZXhwb3J0cyl9KShGLGZ1bmN0aW9uKHIpe3JldHVybiBmdW5jdGlvbigpe3ZhciBuPXIsaT1uLmxpYixhPWkuV29yZEFycmF5LHM9bi5hbGdvLGY9cy5TSEEyNTYsdT1zLlNIQTIyND1mLmV4dGVuZCh7X2RvUmVzZXQ6ZnVuY3Rpb24oKXt0aGlzLl9oYXNoPW5ldyBhLmluaXQoWzMyMzgzNzEwMzIsOTE0MTUwNjYzLDgxMjcwMjk5OSw0MTQ0OTEyNjk3LDQyOTA3NzU4NTcsMTc1MDYwMzAyNSwxNjk0MDc2ODM5LDMyMDQwNzU0MjhdKX0sX2RvRmluYWxpemU6ZnVuY3Rpb24oKXt2YXIgbz1mLl9kb0ZpbmFsaXplLmNhbGwodGhpcyk7cmV0dXJuIG8uc2lnQnl0ZXMtPTQsb319KTtuLlNIQTIyND1mLl9jcmVhdGVIZWxwZXIodSksbi5IbWFjU0hBMjI0PWYuX2NyZWF0ZUhtYWNIZWxwZXIodSl9KCksci5TSEEyMjR9KX0pKFVyKTt2YXIgSjA9e2V4cG9ydHM6e319OyhmdW5jdGlvbih0LGUpeyhmdW5jdGlvbihyLG4saSl7dC5leHBvcnRzPW4oWS5leHBvcnRzLGIwLmV4cG9ydHMpfSkoRixmdW5jdGlvbihyKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbj1yLGk9bi5saWIsYT1pLkhhc2hlcixzPW4ueDY0LGY9cy5Xb3JkLHU9cy5Xb3JkQXJyYXksbz1uLmFsZ287ZnVuY3Rpb24geCgpe3JldHVybiBmLmNyZWF0ZS5hcHBseShmLGFyZ3VtZW50cyl9dmFyIHA9W3goMTExNjM1MjQwOCwzNjA5NzY3NDU4KSx4KDE4OTk0NDc0NDEsNjAyODkxNzI1KSx4KDMwNDkzMjM0NzEsMzk2NDQ4NDM5OSkseCgzOTIxMDA5NTczLDIxNzMyOTU1NDgpLHgoOTYxOTg3MTYzLDQwODE2Mjg0NzIpLHgoMTUwODk3MDk5MywzMDUzODM0MjY1KSx4KDI0NTM2MzU3NDgsMjkzNzY3MTU3OSkseCgyODcwNzYzMjIxLDM2NjQ2MDk1NjApLHgoMzYyNDM4MTA4MCwyNzM0ODgzMzk0KSx4KDMxMDU5ODQwMSwxMTY0OTk2NTQyKSx4KDYwNzIyNTI3OCwxMzIzNjEwNzY0KSx4KDE0MjY4ODE5ODcsMzU5MDMwNDk5NCkseCgxOTI1MDc4Mzg4LDQwNjgxODIzODMpLHgoMjE2MjA3ODIwNiw5OTEzMzYxMTMpLHgoMjYxNDg4ODEwMyw2MzM4MDMzMTcpLHgoMzI0ODIyMjU4MCwzNDc5Nzc0ODY4KSx4KDM4MzUzOTA0MDEsMjY2NjYxMzQ1OCkseCg0MDIyMjI0Nzc0LDk0NDcxMTEzOSkseCgyNjQzNDcwNzgsMjM0MTI2Mjc3MykseCg2MDQ4MDc2MjgsMjAwNzgwMDkzMykseCg3NzAyNTU5ODMsMTQ5NTk5MDkwMSkseCgxMjQ5MTUwMTIyLDE4NTY0MzEyMzUpLHgoMTU1NTA4MTY5MiwzMTc1MjE4MTMyKSx4KDE5OTYwNjQ5ODYsMjE5ODk1MDgzNykseCgyNTU0MjIwODgyLDM5OTk3MTkzMzkpLHgoMjgyMTgzNDM0OSw3NjY3ODQwMTYpLHgoMjk1Mjk5NjgwOCwyNTY2NTk0ODc5KSx4KDMyMTAzMTM2NzEsMzIwMzMzNzk1NikseCgzMzM2NTcxODkxLDEwMzQ0NTcwMjYpLHgoMzU4NDUyODcxMSwyNDY2OTQ4OTAxKSx4KDExMzkyNjk5MywzNzU4MzI2MzgzKSx4KDMzODI0MTg5NSwxNjg3MTc5MzYpLHgoNjY2MzA3MjA1LDExODgxNzk5NjQpLHgoNzczNTI5OTEyLDE1NDYwNDU3MzQpLHgoMTI5NDc1NzM3MiwxNTIyODA1NDg1KSx4KDEzOTYxODIyOTEsMjY0MzgzMzgyMykseCgxNjk1MTgzNzAwLDIzNDM1MjczOTApLHgoMTk4NjY2MTA1MSwxMDE0NDc3NDgwKSx4KDIxNzcwMjYzNTAsMTIwNjc1OTE0MikseCgyNDU2OTU2MDM3LDM0NDA3NzYyNykseCgyNzMwNDg1OTIxLDEyOTA4NjM0NjApLHgoMjgyMDMwMjQxMSwzMTU4NDU0MjczKSx4KDMyNTk3MzA4MDAsMzUwNTk1MjY1NykseCgzMzQ1NzY0NzcxLDEwNjIxNzAwOCkseCgzNTE2MDY1ODE3LDM2MDYwMDgzNDQpLHgoMzYwMDM1MjgwNCwxNDMyNzI1Nzc2KSx4KDQwOTQ1NzE5MDksMTQ2NzAzMTU5NCkseCgyNzU0MjMzNDQsODUxMTY5NzIwKSx4KDQzMDIyNzczNCwzMTAwODIzNzUyKSx4KDUwNjk0ODYxNiwxMzYzMjU4MTk1KSx4KDY1OTA2MDU1NiwzNzUwNjg1NTkzKSx4KDg4Mzk5Nzg3NywzNzg1MDUwMjgwKSx4KDk1ODEzOTU3MSwzMzE4MzA3NDI3KSx4KDEzMjI4MjIyMTgsMzgxMjcyMzQwMykseCgxNTM3MDAyMDYzLDIwMDMwMzQ5OTUpLHgoMTc0Nzg3Mzc3OSwzNjAyMDM2ODk5KSx4KDE5NTU1NjIyMjIsMTU3NTk5MDAxMikseCgyMDI0MTA0ODE1LDExMjU1OTI5MjgpLHgoMjIyNzczMDQ1MiwyNzE2OTA0MzA2KSx4KDIzNjE4NTI0MjQsNDQyNzc2MDQ0KSx4KDI0Mjg0MzY0NzQsNTkzNjk4MzQ0KSx4KDI3NTY3MzQxODcsMzczMzExMDI0OSkseCgzMjA0MDMxNDc5LDI5OTkzNTE1NzMpLHgoMzMyOTMyNTI5OCwzODE1OTIwNDI3KSx4KDMzOTE1Njk2MTQsMzkyODM4MzkwMCkseCgzNTE1MjY3MjcxLDU2NjI4MDcxMSkseCgzOTQwMTg3NjA2LDM0NTQwNjk1MzQpLHgoNDExODYzMDI3MSw0MDAwMjM5OTkyKSx4KDExNjQxODQ3NCwxOTE0MTM4NTU0KSx4KDE3NDI5MjQyMSwyNzMxMDU1MjcwKSx4KDI4OTM4MDM1NiwzMjAzOTkzMDA2KSx4KDQ2MDM5MzI2OSwzMjA2MjAzMTUpLHgoNjg1NDcxNzMzLDU4NzQ5NjgzNikseCg4NTIxNDI5NzEsMTA4Njc5Mjg1MSkseCgxMDE3MDM2Mjk4LDM2NTU0MzEwMCkseCgxMTI2MDAwNTgwLDI2MTgyOTc2NzYpLHgoMTI4ODAzMzQ3MCwzNDA5ODU1MTU4KSx4KDE1MDE1MDU5NDgsNDIzNDUwOTg2NikseCgxNjA3MTY3OTE1LDk4NzE2NzQ2OCkseCgxODE2NDAyMzE2LDEyNDYxODk1OTEpXSxjPVtdOyhmdW5jdGlvbigpe2Zvcih2YXIgbD0wO2w8ODA7bCsrKWNbbF09eCgpfSkoKTt2YXIgaD1vLlNIQTUxMj1hLmV4dGVuZCh7X2RvUmVzZXQ6ZnVuY3Rpb24oKXt0aGlzLl9oYXNoPW5ldyB1LmluaXQoW25ldyBmLmluaXQoMTc3OTAzMzcwMyw0MDg5MjM1NzIwKSxuZXcgZi5pbml0KDMxNDQxMzQyNzcsMjIyNzg3MzU5NSksbmV3IGYuaW5pdCgxMDEzOTA0MjQyLDQyNzExNzU3MjMpLG5ldyBmLmluaXQoMjc3MzQ4MDc2MiwxNTk1NzUwMTI5KSxuZXcgZi5pbml0KDEzNTk4OTMxMTksMjkxNzU2NTEzNyksbmV3IGYuaW5pdCgyNjAwODIyOTI0LDcyNTUxMTE5OSksbmV3IGYuaW5pdCg1Mjg3MzQ2MzUsNDIxNTM4OTU0NyksbmV3IGYuaW5pdCgxNTQxNDU5MjI1LDMyNzAzMzIwOSldKX0sX2RvUHJvY2Vzc0Jsb2NrOmZ1bmN0aW9uKGwsXyl7Zm9yKHZhciB5PXRoaXMuX2hhc2gud29yZHMsQj15WzBdLHY9eVsxXSxkPXlbMl0sZz15WzNdLG09eVs0XSxBPXlbNV0saz15WzZdLEM9eVs3XSxJPUIuaGlnaCx3PUIubG93LGI9di5oaWdoLFI9di5sb3csVD1kLmhpZ2gsej1kLmxvdyxMPWcuaGlnaCxOPWcubG93LHE9bS5oaWdoLE89bS5sb3csRz1BLmhpZ2gsSz1BLmxvdyxTPWsuaGlnaCxEPWsubG93LFA9Qy5oaWdoLEg9Qy5sb3csJD1JLFg9dyxqPWIsVz1SLEIwPVQsZzA9eixlcj1MLG0wPU4sbjA9cSxKPU8sVzA9RyxBMD1LLE4wPVMsRTA9RCx0cj1QLGswPUgsaTA9MDtpMDw4MDtpMCsrKXt2YXIgdDAsYzAsWTA9Y1tpMF07aWYoaTA8MTYpYzA9WTAuaGlnaD1sW18raTAqMl18MCx0MD1ZMC5sb3c9bFtfK2kwKjIrMV18MDtlbHNle3ZhciBuZT1jW2kwLTE1XSx5MD1uZS5oaWdoLEMwPW5lLmxvdyxtdD0oeTA+Pj4xfEMwPDwzMSleKHkwPj4+OHxDMDw8MjQpXnkwPj4+NyxpZT0oQzA+Pj4xfHkwPDwzMSleKEMwPj4+OHx5MDw8MjQpXihDMD4+Pjd8eTA8PDI1KSxvZT1jW2kwLTJdLHcwPW9lLmhpZ2gsUzA9b2UubG93LEF0PSh3MD4+PjE5fFMwPDwxMyleKHcwPDwzfFMwPj4+MjkpXncwPj4+NixhZT0oUzA+Pj4xOXx3MDw8MTMpXihTMDw8M3x3MD4+PjI5KV4oUzA+Pj42fHcwPDwyNikseGU9Y1tpMC03XSxFdD14ZS5oaWdoLGt0PXhlLmxvdyxzZT1jW2kwLTE2XSxDdD1zZS5oaWdoLGNlPXNlLmxvdzt0MD1pZStrdCxjMD1tdCtFdCsodDA+Pj4wPGllPj4+MD8xOjApLHQwPXQwK2FlLGMwPWMwK0F0Kyh0MD4+PjA8YWU+Pj4wPzE6MCksdDA9dDArY2UsYzA9YzArQ3QrKHQwPj4+MDxjZT4+PjA/MTowKSxZMC5oaWdoPWMwLFkwLmxvdz10MH12YXIgU3Q9bjAmVzBefm4wJk4wLGZlPUomQTBefkomRTAsUnQ9JCZqXiQmQjBeaiZCMCxIdD1YJldeWCZnMF5XJmcwLFR0PSgkPj4+Mjh8WDw8NCleKCQ8PDMwfFg+Pj4yKV4oJDw8MjV8WD4+PjcpLHVlPShYPj4+Mjh8JDw8NCleKFg8PDMwfCQ+Pj4yKV4oWDw8MjV8JD4+PjcpLER0PShuMD4+PjE0fEo8PDE4KV4objA+Pj4xOHxKPDwxNCleKG4wPDwyM3xKPj4+OSksUHQ9KEo+Pj4xNHxuMDw8MTgpXihKPj4+MTh8bjA8PDE0KV4oSjw8MjN8bjA+Pj45KSxoZT1wW2kwXSxJdD1oZS5oaWdoLGxlPWhlLmxvdyxyMD1rMCtQdCxmMD10citEdCsocjA+Pj4wPGswPj4+MD8xOjApLHIwPXIwK2ZlLGYwPWYwK1N0KyhyMD4+PjA8ZmU+Pj4wPzE6MCkscjA9cjArbGUsZjA9ZjArSXQrKHIwPj4+MDxsZT4+PjA/MTowKSxyMD1yMCt0MCxmMD1mMCtjMCsocjA+Pj4wPHQwPj4+MD8xOjApLHZlPXVlK0h0LHp0PVR0K1J0Kyh2ZT4+PjA8dWU+Pj4wPzE6MCk7dHI9TjAsazA9RTAsTjA9VzAsRTA9QTAsVzA9bjAsQTA9SixKPW0wK3IwfDAsbjA9ZXIrZjArKEo+Pj4wPG0wPj4+MD8xOjApfDAsZXI9QjAsbTA9ZzAsQjA9aixnMD1XLGo9JCxXPVgsWD1yMCt2ZXwwLCQ9ZjArenQrKFg+Pj4wPHIwPj4+MD8xOjApfDB9dz1CLmxvdz13K1gsQi5oaWdoPUkrJCsodz4+PjA8WD4+PjA/MTowKSxSPXYubG93PVIrVyx2LmhpZ2g9YitqKyhSPj4+MDxXPj4+MD8xOjApLHo9ZC5sb3c9eitnMCxkLmhpZ2g9VCtCMCsoej4+PjA8ZzA+Pj4wPzE6MCksTj1nLmxvdz1OK20wLGcuaGlnaD1MK2VyKyhOPj4+MDxtMD4+PjA/MTowKSxPPW0ubG93PU8rSixtLmhpZ2g9cStuMCsoTz4+PjA8Sj4+PjA/MTowKSxLPUEubG93PUsrQTAsQS5oaWdoPUcrVzArKEs+Pj4wPEEwPj4+MD8xOjApLEQ9ay5sb3c9RCtFMCxrLmhpZ2g9UytOMCsoRD4+PjA8RTA+Pj4wPzE6MCksSD1DLmxvdz1IK2swLEMuaGlnaD1QK3RyKyhIPj4+MDxrMD4+PjA/MTowKX0sX2RvRmluYWxpemU6ZnVuY3Rpb24oKXt2YXIgbD10aGlzLl9kYXRhLF89bC53b3Jkcyx5PXRoaXMuX25EYXRhQnl0ZXMqOCxCPWwuc2lnQnl0ZXMqODtfW0I+Pj41XXw9MTI4PDwyNC1CJTMyLF9bKEIrMTI4Pj4+MTA8PDUpKzMwXT1NYXRoLmZsb29yKHkvNDI5NDk2NzI5NiksX1soQisxMjg+Pj4xMDw8NSkrMzFdPXksbC5zaWdCeXRlcz1fLmxlbmd0aCo0LHRoaXMuX3Byb2Nlc3MoKTt2YXIgdj10aGlzLl9oYXNoLnRvWDMyKCk7cmV0dXJuIHZ9LGNsb25lOmZ1bmN0aW9uKCl7dmFyIGw9YS5jbG9uZS5jYWxsKHRoaXMpO3JldHVybiBsLl9oYXNoPXRoaXMuX2hhc2guY2xvbmUoKSxsfSxibG9ja1NpemU6MTAyNC8zMn0pO24uU0hBNTEyPWEuX2NyZWF0ZUhlbHBlcihoKSxuLkhtYWNTSEE1MTI9YS5fY3JlYXRlSG1hY0hlbHBlcihoKX0oKSxyLlNIQTUxMn0pfSkoSjApO3ZhciBMcj17ZXhwb3J0czp7fX07KGZ1bmN0aW9uKHQsZSl7KGZ1bmN0aW9uKHIsbixpKXt0LmV4cG9ydHM9bihZLmV4cG9ydHMsYjAuZXhwb3J0cyxKMC5leHBvcnRzKX0pKEYsZnVuY3Rpb24ocil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG49cixpPW4ueDY0LGE9aS5Xb3JkLHM9aS5Xb3JkQXJyYXksZj1uLmFsZ28sdT1mLlNIQTUxMixvPWYuU0hBMzg0PXUuZXh0ZW5kKHtfZG9SZXNldDpmdW5jdGlvbigpe3RoaXMuX2hhc2g9bmV3IHMuaW5pdChbbmV3IGEuaW5pdCgzNDE4MDcwMzY1LDMyMzgzNzEwMzIpLG5ldyBhLmluaXQoMTY1NDI3MDI1MCw5MTQxNTA2NjMpLG5ldyBhLmluaXQoMjQzODUyOTM3MCw4MTI3MDI5OTkpLG5ldyBhLmluaXQoMzU1NDYyMzYwLDQxNDQ5MTI2OTcpLG5ldyBhLmluaXQoMTczMTQwNTQxNSw0MjkwNzc1ODU3KSxuZXcgYS5pbml0KDIzOTQxODAyMzEsMTc1MDYwMzAyNSksbmV3IGEuaW5pdCgzNjc1MDA4NTI1LDE2OTQwNzY4MzkpLG5ldyBhLmluaXQoMTIwMzA2MjgxMywzMjA0MDc1NDI4KV0pfSxfZG9GaW5hbGl6ZTpmdW5jdGlvbigpe3ZhciB4PXUuX2RvRmluYWxpemUuY2FsbCh0aGlzKTtyZXR1cm4geC5zaWdCeXRlcy09MTYseH19KTtuLlNIQTM4ND11Ll9jcmVhdGVIZWxwZXIobyksbi5IbWFjU0hBMzg0PXUuX2NyZWF0ZUhtYWNIZWxwZXIobyl9KCksci5TSEEzODR9KX0pKExyKTt2YXIgRnI9e2V4cG9ydHM6e319OyhmdW5jdGlvbih0LGUpeyhmdW5jdGlvbihyLG4saSl7dC5leHBvcnRzPW4oWS5leHBvcnRzLGIwLmV4cG9ydHMpfSkoRixmdW5jdGlvbihyKXtyZXR1cm4gZnVuY3Rpb24obil7dmFyIGk9cixhPWkubGliLHM9YS5Xb3JkQXJyYXksZj1hLkhhc2hlcix1PWkueDY0LG89dS5Xb3JkLHg9aS5hbGdvLHA9W10sYz1bXSxoPVtdOyhmdW5jdGlvbigpe2Zvcih2YXIgeT0xLEI9MCx2PTA7djwyNDt2Kyspe3BbeSs1KkJdPSh2KzEpKih2KzIpLzIlNjQ7dmFyIGQ9QiU1LGc9KDIqeSszKkIpJTU7eT1kLEI9Z31mb3IodmFyIHk9MDt5PDU7eSsrKWZvcih2YXIgQj0wO0I8NTtCKyspY1t5KzUqQl09QisoMip5KzMqQiklNSo1O2Zvcih2YXIgbT0xLEE9MDtBPDI0O0ErKyl7Zm9yKHZhciBrPTAsQz0wLEk9MDtJPDc7SSsrKXtpZihtJjEpe3ZhciB3PSgxPDxJKS0xO3c8MzI/Q149MTw8dzprXj0xPDx3LTMyfW0mMTI4P209bTw8MV4xMTM6bTw8PTF9aFtBXT1vLmNyZWF0ZShrLEMpfX0pKCk7dmFyIGw9W107KGZ1bmN0aW9uKCl7Zm9yKHZhciB5PTA7eTwyNTt5KyspbFt5XT1vLmNyZWF0ZSgpfSkoKTt2YXIgXz14LlNIQTM9Zi5leHRlbmQoe2NmZzpmLmNmZy5leHRlbmQoe291dHB1dExlbmd0aDo1MTJ9KSxfZG9SZXNldDpmdW5jdGlvbigpe2Zvcih2YXIgeT10aGlzLl9zdGF0ZT1bXSxCPTA7QjwyNTtCKyspeVtCXT1uZXcgby5pbml0O3RoaXMuYmxvY2tTaXplPSgxNjAwLTIqdGhpcy5jZmcub3V0cHV0TGVuZ3RoKS8zMn0sX2RvUHJvY2Vzc0Jsb2NrOmZ1bmN0aW9uKHksQil7Zm9yKHZhciB2PXRoaXMuX3N0YXRlLGQ9dGhpcy5ibG9ja1NpemUvMixnPTA7ZzxkO2crKyl7dmFyIG09eVtCKzIqZ10sQT15W0IrMipnKzFdO209KG08PDh8bT4+PjI0KSYxNjcxMTkzNXwobTw8MjR8bT4+PjgpJjQyNzgyNTUzNjAsQT0oQTw8OHxBPj4+MjQpJjE2NzExOTM1fChBPDwyNHxBPj4+OCkmNDI3ODI1NTM2MDt2YXIgaz12W2ddO2suaGlnaF49QSxrLmxvd149bX1mb3IodmFyIEM9MDtDPDI0O0MrKyl7Zm9yKHZhciBJPTA7STw1O0krKyl7Zm9yKHZhciB3PTAsYj0wLFI9MDtSPDU7UisrKXt2YXIgaz12W0krNSpSXTt3Xj1rLmhpZ2gsYl49ay5sb3d9dmFyIFQ9bFtJXTtULmhpZ2g9dyxULmxvdz1ifWZvcih2YXIgST0wO0k8NTtJKyspZm9yKHZhciB6PWxbKEkrNCklNV0sTD1sWyhJKzEpJTVdLE49TC5oaWdoLHE9TC5sb3csdz16LmhpZ2heKE48PDF8cT4+PjMxKSxiPXoubG93XihxPDwxfE4+Pj4zMSksUj0wO1I8NTtSKyspe3ZhciBrPXZbSSs1KlJdO2suaGlnaF49dyxrLmxvd149Yn1mb3IodmFyIE89MTtPPDI1O08rKyl7dmFyIHcsYixrPXZbT10sRz1rLmhpZ2gsSz1rLmxvdyxTPXBbT107UzwzMj8odz1HPDxTfEs+Pj4zMi1TLGI9Szw8U3xHPj4+MzItUyk6KHc9Szw8Uy0zMnxHPj4+NjQtUyxiPUc8PFMtMzJ8Sz4+PjY0LVMpO3ZhciBEPWxbY1tPXV07RC5oaWdoPXcsRC5sb3c9Yn12YXIgUD1sWzBdLEg9dlswXTtQLmhpZ2g9SC5oaWdoLFAubG93PUgubG93O2Zvcih2YXIgST0wO0k8NTtJKyspZm9yKHZhciBSPTA7Ujw1O1IrKyl7dmFyIE89SSs1KlIsaz12W09dLCQ9bFtPXSxYPWxbKEkrMSklNSs1KlJdLGo9bFsoSSsyKSU1KzUqUl07ay5oaWdoPSQuaGlnaF5+WC5oaWdoJmouaGlnaCxrLmxvdz0kLmxvd15+WC5sb3cmai5sb3d9dmFyIGs9dlswXSxXPWhbQ107ay5oaWdoXj1XLmhpZ2gsay5sb3dePVcubG93fX0sX2RvRmluYWxpemU6ZnVuY3Rpb24oKXt2YXIgeT10aGlzLl9kYXRhLEI9eS53b3Jkczt0aGlzLl9uRGF0YUJ5dGVzKjg7dmFyIHY9eS5zaWdCeXRlcyo4LGQ9dGhpcy5ibG9ja1NpemUqMzI7Qlt2Pj4+NV18PTE8PDI0LXYlMzIsQlsobi5jZWlsKCh2KzEpL2QpKmQ+Pj41KS0xXXw9MTI4LHkuc2lnQnl0ZXM9Qi5sZW5ndGgqNCx0aGlzLl9wcm9jZXNzKCk7Zm9yKHZhciBnPXRoaXMuX3N0YXRlLG09dGhpcy5jZmcub3V0cHV0TGVuZ3RoLzgsQT1tLzgsaz1bXSxDPTA7QzxBO0MrKyl7dmFyIEk9Z1tDXSx3PUkuaGlnaCxiPUkubG93O3c9KHc8PDh8dz4+PjI0KSYxNjcxMTkzNXwodzw8MjR8dz4+PjgpJjQyNzgyNTUzNjAsYj0oYjw8OHxiPj4+MjQpJjE2NzExOTM1fChiPDwyNHxiPj4+OCkmNDI3ODI1NTM2MCxrLnB1c2goYiksay5wdXNoKHcpfXJldHVybiBuZXcgcy5pbml0KGssbSl9LGNsb25lOmZ1bmN0aW9uKCl7Zm9yKHZhciB5PWYuY2xvbmUuY2FsbCh0aGlzKSxCPXkuX3N0YXRlPXRoaXMuX3N0YXRlLnNsaWNlKDApLHY9MDt2PDI1O3YrKylCW3ZdPUJbdl0uY2xvbmUoKTtyZXR1cm4geX19KTtpLlNIQTM9Zi5fY3JlYXRlSGVscGVyKF8pLGkuSG1hY1NIQTM9Zi5fY3JlYXRlSG1hY0hlbHBlcihfKX0oTWF0aCksci5TSEEzfSl9KShGcik7dmFyIFdyPXtleHBvcnRzOnt9fTsoZnVuY3Rpb24odCxlKXsoZnVuY3Rpb24ocixuKXt0LmV4cG9ydHM9bihZLmV4cG9ydHMpfSkoRixmdW5jdGlvbihyKXsvKiogQHByZXNlcnZlCiAgICAJKGMpIDIwMTIgYnkgQ8OpZHJpYyBNZXNuaWwuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgCVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKCiAgICAJICAgIC0gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgogICAgCSAgICAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KCiAgICAJVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KICAgIAkqL3JldHVybiBmdW5jdGlvbihuKXt2YXIgaT1yLGE9aS5saWIscz1hLldvcmRBcnJheSxmPWEuSGFzaGVyLHU9aS5hbGdvLG89cy5jcmVhdGUoWzAsMSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMTQsMTUsNyw0LDEzLDEsMTAsNiwxNSwzLDEyLDAsOSw1LDIsMTQsMTEsOCwzLDEwLDE0LDQsOSwxNSw4LDEsMiw3LDAsNiwxMywxMSw1LDEyLDEsOSwxMSwxMCwwLDgsMTIsNCwxMywzLDcsMTUsMTQsNSw2LDIsNCwwLDUsOSw3LDEyLDIsMTAsMTQsMSwzLDgsMTEsNiwxNSwxM10pLHg9cy5jcmVhdGUoWzUsMTQsNywwLDksMiwxMSw0LDEzLDYsMTUsOCwxLDEwLDMsMTIsNiwxMSwzLDcsMCwxMyw1LDEwLDE0LDE1LDgsMTIsNCw5LDEsMiwxNSw1LDEsMyw3LDE0LDYsOSwxMSw4LDEyLDIsMTAsMCw0LDEzLDgsNiw0LDEsMywxMSwxNSwwLDUsMTIsMiwxMyw5LDcsMTAsMTQsMTIsMTUsMTAsNCwxLDUsOCw3LDYsMiwxMywxNCwwLDMsOSwxMV0pLHA9cy5jcmVhdGUoWzExLDE0LDE1LDEyLDUsOCw3LDksMTEsMTMsMTQsMTUsNiw3LDksOCw3LDYsOCwxMywxMSw5LDcsMTUsNywxMiwxNSw5LDExLDcsMTMsMTIsMTEsMTMsNiw3LDE0LDksMTMsMTUsMTQsOCwxMyw2LDUsMTIsNyw1LDExLDEyLDE0LDE1LDE0LDE1LDksOCw5LDE0LDUsNiw4LDYsNSwxMiw5LDE1LDUsMTEsNiw4LDEzLDEyLDUsMTIsMTMsMTQsMTEsOCw1LDZdKSxjPXMuY3JlYXRlKFs4LDksOSwxMSwxMywxNSwxNSw1LDcsNyw4LDExLDE0LDE0LDEyLDYsOSwxMywxNSw3LDEyLDgsOSwxMSw3LDcsMTIsNyw2LDE1LDEzLDExLDksNywxNSwxMSw4LDYsNiwxNCwxMiwxMyw1LDE0LDEzLDEzLDcsNSwxNSw1LDgsMTEsMTQsMTQsNiwxNCw2LDksMTIsOSwxMiw1LDE1LDgsOCw1LDEyLDksMTIsNSwxNCw2LDgsMTMsNiw1LDE1LDEzLDExLDExXSksaD1zLmNyZWF0ZShbMCwxNTE4NTAwMjQ5LDE4NTk3NzUzOTMsMjQwMDk1OTcwOCwyODQwODUzODM4XSksbD1zLmNyZWF0ZShbMTM1MjgyOTkyNiwxNTQ4NjAzNjg0LDE4MzYwNzI2OTEsMjA1Mzk5NDIxNywwXSksXz11LlJJUEVNRDE2MD1mLmV4dGVuZCh7X2RvUmVzZXQ6ZnVuY3Rpb24oKXt0aGlzLl9oYXNoPXMuY3JlYXRlKFsxNzMyNTg0MTkzLDQwMjMyMzM0MTcsMjU2MjM4MzEwMiwyNzE3MzM4NzgsMzI4NTM3NzUyMF0pfSxfZG9Qcm9jZXNzQmxvY2s6ZnVuY3Rpb24oQSxrKXtmb3IodmFyIEM9MDtDPDE2O0MrKyl7dmFyIEk9aytDLHc9QVtJXTtBW0ldPSh3PDw4fHc+Pj4yNCkmMTY3MTE5MzV8KHc8PDI0fHc+Pj44KSY0Mjc4MjU1MzYwfXZhciBiPXRoaXMuX2hhc2gud29yZHMsUj1oLndvcmRzLFQ9bC53b3Jkcyx6PW8ud29yZHMsTD14LndvcmRzLE49cC53b3JkcyxxPWMud29yZHMsTyxHLEssUyxELFAsSCwkLFgsajtQPU89YlswXSxIPUc9YlsxXSwkPUs9YlsyXSxYPVM9YlszXSxqPUQ9Yls0XTtmb3IodmFyIFcsQz0wO0M8ODA7Qys9MSlXPU8rQVtrK3pbQ11dfDAsQzwxNj9XKz15KEcsSyxTKStSWzBdOkM8MzI/Vys9QihHLEssUykrUlsxXTpDPDQ4P1crPXYoRyxLLFMpK1JbMl06Qzw2ND9XKz1kKEcsSyxTKStSWzNdOlcrPWcoRyxLLFMpK1JbNF0sVz1XfDAsVz1tKFcsTltDXSksVz1XK0R8MCxPPUQsRD1TLFM9bShLLDEwKSxLPUcsRz1XLFc9UCtBW2srTFtDXV18MCxDPDE2P1crPWcoSCwkLFgpK1RbMF06QzwzMj9XKz1kKEgsJCxYKStUWzFdOkM8NDg/Vys9dihILCQsWCkrVFsyXTpDPDY0P1crPUIoSCwkLFgpK1RbM106Vys9eShILCQsWCkrVFs0XSxXPVd8MCxXPW0oVyxxW0NdKSxXPVcranwwLFA9aixqPVgsWD1tKCQsMTApLCQ9SCxIPVc7Vz1iWzFdK0srWHwwLGJbMV09YlsyXStTK2p8MCxiWzJdPWJbM10rRCtQfDAsYlszXT1iWzRdK08rSHwwLGJbNF09YlswXStHKyR8MCxiWzBdPVd9LF9kb0ZpbmFsaXplOmZ1bmN0aW9uKCl7dmFyIEE9dGhpcy5fZGF0YSxrPUEud29yZHMsQz10aGlzLl9uRGF0YUJ5dGVzKjgsST1BLnNpZ0J5dGVzKjg7a1tJPj4+NV18PTEyODw8MjQtSSUzMixrWyhJKzY0Pj4+OTw8NCkrMTRdPShDPDw4fEM+Pj4yNCkmMTY3MTE5MzV8KEM8PDI0fEM+Pj44KSY0Mjc4MjU1MzYwLEEuc2lnQnl0ZXM9KGsubGVuZ3RoKzEpKjQsdGhpcy5fcHJvY2VzcygpO2Zvcih2YXIgdz10aGlzLl9oYXNoLGI9dy53b3JkcyxSPTA7Ujw1O1IrKyl7dmFyIFQ9YltSXTtiW1JdPShUPDw4fFQ+Pj4yNCkmMTY3MTE5MzV8KFQ8PDI0fFQ+Pj44KSY0Mjc4MjU1MzYwfXJldHVybiB3fSxjbG9uZTpmdW5jdGlvbigpe3ZhciBBPWYuY2xvbmUuY2FsbCh0aGlzKTtyZXR1cm4gQS5faGFzaD10aGlzLl9oYXNoLmNsb25lKCksQX19KTtmdW5jdGlvbiB5KEEsayxDKXtyZXR1cm4gQV5rXkN9ZnVuY3Rpb24gQihBLGssQyl7cmV0dXJuIEEma3x+QSZDfWZ1bmN0aW9uIHYoQSxrLEMpe3JldHVybihBfH5rKV5DfWZ1bmN0aW9uIGQoQSxrLEMpe3JldHVybiBBJkN8ayZ+Q31mdW5jdGlvbiBnKEEsayxDKXtyZXR1cm4gQV4oa3x+Qyl9ZnVuY3Rpb24gbShBLGspe3JldHVybiBBPDxrfEE+Pj4zMi1rfWkuUklQRU1EMTYwPWYuX2NyZWF0ZUhlbHBlcihfKSxpLkhtYWNSSVBFTUQxNjA9Zi5fY3JlYXRlSG1hY0hlbHBlcihfKX0oKSxyLlJJUEVNRDE2MH0pfSkoV3IpO3ZhciBGMD17ZXhwb3J0czp7fX07KGZ1bmN0aW9uKHQsZSl7KGZ1bmN0aW9uKHIsbil7dC5leHBvcnRzPW4oWS5leHBvcnRzKX0pKEYsZnVuY3Rpb24ocil7KGZ1bmN0aW9uKCl7dmFyIG49cixpPW4ubGliLGE9aS5CYXNlLHM9bi5lbmMsZj1zLlV0ZjgsdT1uLmFsZ287dS5ITUFDPWEuZXh0ZW5kKHtpbml0OmZ1bmN0aW9uKG8seCl7bz10aGlzLl9oYXNoZXI9bmV3IG8uaW5pdCx0eXBlb2YgeD09InN0cmluZyImJih4PWYucGFyc2UoeCkpO3ZhciBwPW8uYmxvY2tTaXplLGM9cCo0O3guc2lnQnl0ZXM+YyYmKHg9by5maW5hbGl6ZSh4KSkseC5jbGFtcCgpO2Zvcih2YXIgaD10aGlzLl9vS2V5PXguY2xvbmUoKSxsPXRoaXMuX2lLZXk9eC5jbG9uZSgpLF89aC53b3Jkcyx5PWwud29yZHMsQj0wO0I8cDtCKyspX1tCXV49MTU0OTU1NjgyOCx5W0JdXj05MDk1MjI0ODY7aC5zaWdCeXRlcz1sLnNpZ0J5dGVzPWMsdGhpcy5yZXNldCgpfSxyZXNldDpmdW5jdGlvbigpe3ZhciBvPXRoaXMuX2hhc2hlcjtvLnJlc2V0KCksby51cGRhdGUodGhpcy5faUtleSl9LHVwZGF0ZTpmdW5jdGlvbihvKXtyZXR1cm4gdGhpcy5faGFzaGVyLnVwZGF0ZShvKSx0aGlzfSxmaW5hbGl6ZTpmdW5jdGlvbihvKXt2YXIgeD10aGlzLl9oYXNoZXIscD14LmZpbmFsaXplKG8pO3gucmVzZXQoKTt2YXIgYz14LmZpbmFsaXplKHRoaXMuX29LZXkuY2xvbmUoKS5jb25jYXQocCkpO3JldHVybiBjfX0pfSkoKX0pfSkoRjApO3ZhciBOcj17ZXhwb3J0czp7fX07KGZ1bmN0aW9uKHQsZSl7KGZ1bmN0aW9uKHIsbixpKXt0LmV4cG9ydHM9bihZLmV4cG9ydHMsTDAuZXhwb3J0cyxGMC5leHBvcnRzKX0pKEYsZnVuY3Rpb24ocil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG49cixpPW4ubGliLGE9aS5CYXNlLHM9aS5Xb3JkQXJyYXksZj1uLmFsZ28sdT1mLlNIQTEsbz1mLkhNQUMseD1mLlBCS0RGMj1hLmV4dGVuZCh7Y2ZnOmEuZXh0ZW5kKHtrZXlTaXplOjEyOC8zMixoYXNoZXI6dSxpdGVyYXRpb25zOjF9KSxpbml0OmZ1bmN0aW9uKHApe3RoaXMuY2ZnPXRoaXMuY2ZnLmV4dGVuZChwKX0sY29tcHV0ZTpmdW5jdGlvbihwLGMpe2Zvcih2YXIgaD10aGlzLmNmZyxsPW8uY3JlYXRlKGguaGFzaGVyLHApLF89cy5jcmVhdGUoKSx5PXMuY3JlYXRlKFsxXSksQj1fLndvcmRzLHY9eS53b3JkcyxkPWgua2V5U2l6ZSxnPWguaXRlcmF0aW9ucztCLmxlbmd0aDxkOyl7dmFyIG09bC51cGRhdGUoYykuZmluYWxpemUoeSk7bC5yZXNldCgpO2Zvcih2YXIgQT1tLndvcmRzLGs9QS5sZW5ndGgsQz1tLEk9MTtJPGc7SSsrKXtDPWwuZmluYWxpemUoQyksbC5yZXNldCgpO2Zvcih2YXIgdz1DLndvcmRzLGI9MDtiPGs7YisrKUFbYl1ePXdbYl19Xy5jb25jYXQobSksdlswXSsrfXJldHVybiBfLnNpZ0J5dGVzPWQqNCxffX0pO24uUEJLREYyPWZ1bmN0aW9uKHAsYyxoKXtyZXR1cm4geC5jcmVhdGUoaCkuY29tcHV0ZShwLGMpfX0oKSxyLlBCS0RGMn0pfSkoTnIpO3ZhciBzMD17ZXhwb3J0czp7fX07KGZ1bmN0aW9uKHQsZSl7KGZ1bmN0aW9uKHIsbixpKXt0LmV4cG9ydHM9bihZLmV4cG9ydHMsTDAuZXhwb3J0cyxGMC5leHBvcnRzKX0pKEYsZnVuY3Rpb24ocil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG49cixpPW4ubGliLGE9aS5CYXNlLHM9aS5Xb3JkQXJyYXksZj1uLmFsZ28sdT1mLk1ENSxvPWYuRXZwS0RGPWEuZXh0ZW5kKHtjZmc6YS5leHRlbmQoe2tleVNpemU6MTI4LzMyLGhhc2hlcjp1LGl0ZXJhdGlvbnM6MX0pLGluaXQ6ZnVuY3Rpb24oeCl7dGhpcy5jZmc9dGhpcy5jZmcuZXh0ZW5kKHgpfSxjb21wdXRlOmZ1bmN0aW9uKHgscCl7Zm9yKHZhciBjLGg9dGhpcy5jZmcsbD1oLmhhc2hlci5jcmVhdGUoKSxfPXMuY3JlYXRlKCkseT1fLndvcmRzLEI9aC5rZXlTaXplLHY9aC5pdGVyYXRpb25zO3kubGVuZ3RoPEI7KXtjJiZsLnVwZGF0ZShjKSxjPWwudXBkYXRlKHgpLmZpbmFsaXplKHApLGwucmVzZXQoKTtmb3IodmFyIGQ9MTtkPHY7ZCsrKWM9bC5maW5hbGl6ZShjKSxsLnJlc2V0KCk7Xy5jb25jYXQoYyl9cmV0dXJuIF8uc2lnQnl0ZXM9Qio0LF99fSk7bi5FdnBLREY9ZnVuY3Rpb24oeCxwLGMpe3JldHVybiBvLmNyZWF0ZShjKS5jb21wdXRlKHgscCl9fSgpLHIuRXZwS0RGfSl9KShzMCk7dmFyIFo9e2V4cG9ydHM6e319OyhmdW5jdGlvbih0LGUpeyhmdW5jdGlvbihyLG4saSl7dC5leHBvcnRzPW4oWS5leHBvcnRzLHMwLmV4cG9ydHMpfSkoRixmdW5jdGlvbihyKXtyLmxpYi5DaXBoZXJ8fGZ1bmN0aW9uKG4pe3ZhciBpPXIsYT1pLmxpYixzPWEuQmFzZSxmPWEuV29yZEFycmF5LHU9YS5CdWZmZXJlZEJsb2NrQWxnb3JpdGhtLG89aS5lbmM7by5VdGY4O3ZhciB4PW8uQmFzZTY0LHA9aS5hbGdvLGM9cC5FdnBLREYsaD1hLkNpcGhlcj11LmV4dGVuZCh7Y2ZnOnMuZXh0ZW5kKCksY3JlYXRlRW5jcnlwdG9yOmZ1bmN0aW9uKHcsYil7cmV0dXJuIHRoaXMuY3JlYXRlKHRoaXMuX0VOQ19YRk9STV9NT0RFLHcsYil9LGNyZWF0ZURlY3J5cHRvcjpmdW5jdGlvbih3LGIpe3JldHVybiB0aGlzLmNyZWF0ZSh0aGlzLl9ERUNfWEZPUk1fTU9ERSx3LGIpfSxpbml0OmZ1bmN0aW9uKHcsYixSKXt0aGlzLmNmZz10aGlzLmNmZy5leHRlbmQoUiksdGhpcy5feGZvcm1Nb2RlPXcsdGhpcy5fa2V5PWIsdGhpcy5yZXNldCgpfSxyZXNldDpmdW5jdGlvbigpe3UucmVzZXQuY2FsbCh0aGlzKSx0aGlzLl9kb1Jlc2V0KCl9LHByb2Nlc3M6ZnVuY3Rpb24odyl7cmV0dXJuIHRoaXMuX2FwcGVuZCh3KSx0aGlzLl9wcm9jZXNzKCl9LGZpbmFsaXplOmZ1bmN0aW9uKHcpe3cmJnRoaXMuX2FwcGVuZCh3KTt2YXIgYj10aGlzLl9kb0ZpbmFsaXplKCk7cmV0dXJuIGJ9LGtleVNpemU6MTI4LzMyLGl2U2l6ZToxMjgvMzIsX0VOQ19YRk9STV9NT0RFOjEsX0RFQ19YRk9STV9NT0RFOjIsX2NyZWF0ZUhlbHBlcjpmdW5jdGlvbigpe2Z1bmN0aW9uIHcoYil7cmV0dXJuIHR5cGVvZiBiPT0ic3RyaW5nIj9JOkF9cmV0dXJuIGZ1bmN0aW9uKGIpe3JldHVybntlbmNyeXB0OmZ1bmN0aW9uKFIsVCx6KXtyZXR1cm4gdyhUKS5lbmNyeXB0KGIsUixULHopfSxkZWNyeXB0OmZ1bmN0aW9uKFIsVCx6KXtyZXR1cm4gdyhUKS5kZWNyeXB0KGIsUixULHopfX19fSgpfSk7YS5TdHJlYW1DaXBoZXI9aC5leHRlbmQoe19kb0ZpbmFsaXplOmZ1bmN0aW9uKCl7dmFyIHc9dGhpcy5fcHJvY2VzcyghMCk7cmV0dXJuIHd9LGJsb2NrU2l6ZToxfSk7dmFyIGw9aS5tb2RlPXt9LF89YS5CbG9ja0NpcGhlck1vZGU9cy5leHRlbmQoe2NyZWF0ZUVuY3J5cHRvcjpmdW5jdGlvbih3LGIpe3JldHVybiB0aGlzLkVuY3J5cHRvci5jcmVhdGUodyxiKX0sY3JlYXRlRGVjcnlwdG9yOmZ1bmN0aW9uKHcsYil7cmV0dXJuIHRoaXMuRGVjcnlwdG9yLmNyZWF0ZSh3LGIpfSxpbml0OmZ1bmN0aW9uKHcsYil7dGhpcy5fY2lwaGVyPXcsdGhpcy5faXY9Yn19KSx5PWwuQ0JDPWZ1bmN0aW9uKCl7dmFyIHc9Xy5leHRlbmQoKTt3LkVuY3J5cHRvcj13LmV4dGVuZCh7cHJvY2Vzc0Jsb2NrOmZ1bmN0aW9uKFIsVCl7dmFyIHo9dGhpcy5fY2lwaGVyLEw9ei5ibG9ja1NpemU7Yi5jYWxsKHRoaXMsUixULEwpLHouZW5jcnlwdEJsb2NrKFIsVCksdGhpcy5fcHJldkJsb2NrPVIuc2xpY2UoVCxUK0wpfX0pLHcuRGVjcnlwdG9yPXcuZXh0ZW5kKHtwcm9jZXNzQmxvY2s6ZnVuY3Rpb24oUixUKXt2YXIgej10aGlzLl9jaXBoZXIsTD16LmJsb2NrU2l6ZSxOPVIuc2xpY2UoVCxUK0wpO3ouZGVjcnlwdEJsb2NrKFIsVCksYi5jYWxsKHRoaXMsUixULEwpLHRoaXMuX3ByZXZCbG9jaz1OfX0pO2Z1bmN0aW9uIGIoUixULHope3ZhciBMLE49dGhpcy5faXY7Tj8oTD1OLHRoaXMuX2l2PW4pOkw9dGhpcy5fcHJldkJsb2NrO2Zvcih2YXIgcT0wO3E8ejtxKyspUltUK3FdXj1MW3FdfXJldHVybiB3fSgpLEI9aS5wYWQ9e30sdj1CLlBrY3M3PXtwYWQ6ZnVuY3Rpb24odyxiKXtmb3IodmFyIFI9Yio0LFQ9Ui13LnNpZ0J5dGVzJVIsej1UPDwyNHxUPDwxNnxUPDw4fFQsTD1bXSxOPTA7TjxUO04rPTQpTC5wdXNoKHopO3ZhciBxPWYuY3JlYXRlKEwsVCk7dy5jb25jYXQocSl9LHVucGFkOmZ1bmN0aW9uKHcpe3ZhciBiPXcud29yZHNbdy5zaWdCeXRlcy0xPj4+Ml0mMjU1O3cuc2lnQnl0ZXMtPWJ9fTthLkJsb2NrQ2lwaGVyPWguZXh0ZW5kKHtjZmc6aC5jZmcuZXh0ZW5kKHttb2RlOnkscGFkZGluZzp2fSkscmVzZXQ6ZnVuY3Rpb24oKXt2YXIgdztoLnJlc2V0LmNhbGwodGhpcyk7dmFyIGI9dGhpcy5jZmcsUj1iLml2LFQ9Yi5tb2RlO3RoaXMuX3hmb3JtTW9kZT09dGhpcy5fRU5DX1hGT1JNX01PREU/dz1ULmNyZWF0ZUVuY3J5cHRvcjoodz1ULmNyZWF0ZURlY3J5cHRvcix0aGlzLl9taW5CdWZmZXJTaXplPTEpLHRoaXMuX21vZGUmJnRoaXMuX21vZGUuX19jcmVhdG9yPT13P3RoaXMuX21vZGUuaW5pdCh0aGlzLFImJlIud29yZHMpOih0aGlzLl9tb2RlPXcuY2FsbChULHRoaXMsUiYmUi53b3JkcyksdGhpcy5fbW9kZS5fX2NyZWF0b3I9dyl9LF9kb1Byb2Nlc3NCbG9jazpmdW5jdGlvbih3LGIpe3RoaXMuX21vZGUucHJvY2Vzc0Jsb2NrKHcsYil9LF9kb0ZpbmFsaXplOmZ1bmN0aW9uKCl7dmFyIHcsYj10aGlzLmNmZy5wYWRkaW5nO3JldHVybiB0aGlzLl94Zm9ybU1vZGU9PXRoaXMuX0VOQ19YRk9STV9NT0RFPyhiLnBhZCh0aGlzLl9kYXRhLHRoaXMuYmxvY2tTaXplKSx3PXRoaXMuX3Byb2Nlc3MoITApKToodz10aGlzLl9wcm9jZXNzKCEwKSxiLnVucGFkKHcpKSx3fSxibG9ja1NpemU6MTI4LzMyfSk7dmFyIGQ9YS5DaXBoZXJQYXJhbXM9cy5leHRlbmQoe2luaXQ6ZnVuY3Rpb24odyl7dGhpcy5taXhJbih3KX0sdG9TdHJpbmc6ZnVuY3Rpb24odyl7cmV0dXJuKHd8fHRoaXMuZm9ybWF0dGVyKS5zdHJpbmdpZnkodGhpcyl9fSksZz1pLmZvcm1hdD17fSxtPWcuT3BlblNTTD17c3RyaW5naWZ5OmZ1bmN0aW9uKHcpe3ZhciBiLFI9dy5jaXBoZXJ0ZXh0LFQ9dy5zYWx0O3JldHVybiBUP2I9Zi5jcmVhdGUoWzEzOTg4OTM2ODQsMTcwMTA3NjgzMV0pLmNvbmNhdChUKS5jb25jYXQoUik6Yj1SLGIudG9TdHJpbmcoeCl9LHBhcnNlOmZ1bmN0aW9uKHcpe3ZhciBiLFI9eC5wYXJzZSh3KSxUPVIud29yZHM7cmV0dXJuIFRbMF09PTEzOTg4OTM2ODQmJlRbMV09PTE3MDEwNzY4MzEmJihiPWYuY3JlYXRlKFQuc2xpY2UoMiw0KSksVC5zcGxpY2UoMCw0KSxSLnNpZ0J5dGVzLT0xNiksZC5jcmVhdGUoe2NpcGhlcnRleHQ6UixzYWx0OmJ9KX19LEE9YS5TZXJpYWxpemFibGVDaXBoZXI9cy5leHRlbmQoe2NmZzpzLmV4dGVuZCh7Zm9ybWF0Om19KSxlbmNyeXB0OmZ1bmN0aW9uKHcsYixSLFQpe1Q9dGhpcy5jZmcuZXh0ZW5kKFQpO3ZhciB6PXcuY3JlYXRlRW5jcnlwdG9yKFIsVCksTD16LmZpbmFsaXplKGIpLE49ei5jZmc7cmV0dXJuIGQuY3JlYXRlKHtjaXBoZXJ0ZXh0Okwsa2V5OlIsaXY6Ti5pdixhbGdvcml0aG06dyxtb2RlOk4ubW9kZSxwYWRkaW5nOk4ucGFkZGluZyxibG9ja1NpemU6dy5ibG9ja1NpemUsZm9ybWF0dGVyOlQuZm9ybWF0fSl9LGRlY3J5cHQ6ZnVuY3Rpb24odyxiLFIsVCl7VD10aGlzLmNmZy5leHRlbmQoVCksYj10aGlzLl9wYXJzZShiLFQuZm9ybWF0KTt2YXIgej13LmNyZWF0ZURlY3J5cHRvcihSLFQpLmZpbmFsaXplKGIuY2lwaGVydGV4dCk7cmV0dXJuIHp9LF9wYXJzZTpmdW5jdGlvbih3LGIpe3JldHVybiB0eXBlb2Ygdz09InN0cmluZyI/Yi5wYXJzZSh3LHRoaXMpOnd9fSksaz1pLmtkZj17fSxDPWsuT3BlblNTTD17ZXhlY3V0ZTpmdW5jdGlvbih3LGIsUixUKXtUfHwoVD1mLnJhbmRvbSg2NC84KSk7dmFyIHo9Yy5jcmVhdGUoe2tleVNpemU6YitSfSkuY29tcHV0ZSh3LFQpLEw9Zi5jcmVhdGUoei53b3Jkcy5zbGljZShiKSxSKjQpO3JldHVybiB6LnNpZ0J5dGVzPWIqNCxkLmNyZWF0ZSh7a2V5OnosaXY6TCxzYWx0OlR9KX19LEk9YS5QYXNzd29yZEJhc2VkQ2lwaGVyPUEuZXh0ZW5kKHtjZmc6QS5jZmcuZXh0ZW5kKHtrZGY6Q30pLGVuY3J5cHQ6ZnVuY3Rpb24odyxiLFIsVCl7VD10aGlzLmNmZy5leHRlbmQoVCk7dmFyIHo9VC5rZGYuZXhlY3V0ZShSLHcua2V5U2l6ZSx3Lml2U2l6ZSk7VC5pdj16Lml2O3ZhciBMPUEuZW5jcnlwdC5jYWxsKHRoaXMsdyxiLHoua2V5LFQpO3JldHVybiBMLm1peEluKHopLEx9LGRlY3J5cHQ6ZnVuY3Rpb24odyxiLFIsVCl7VD10aGlzLmNmZy5leHRlbmQoVCksYj10aGlzLl9wYXJzZShiLFQuZm9ybWF0KTt2YXIgej1ULmtkZi5leGVjdXRlKFIsdy5rZXlTaXplLHcuaXZTaXplLGIuc2FsdCk7VC5pdj16Lml2O3ZhciBMPUEuZGVjcnlwdC5jYWxsKHRoaXMsdyxiLHoua2V5LFQpO3JldHVybiBMfX0pfSgpfSl9KShaKTt2YXIgWXI9e2V4cG9ydHM6e319OyhmdW5jdGlvbih0LGUpeyhmdW5jdGlvbihyLG4saSl7dC5leHBvcnRzPW4oWS5leHBvcnRzLFouZXhwb3J0cyl9KShGLGZ1bmN0aW9uKHIpe3JldHVybiByLm1vZGUuQ0ZCPWZ1bmN0aW9uKCl7dmFyIG49ci5saWIuQmxvY2tDaXBoZXJNb2RlLmV4dGVuZCgpO24uRW5jcnlwdG9yPW4uZXh0ZW5kKHtwcm9jZXNzQmxvY2s6ZnVuY3Rpb24oYSxzKXt2YXIgZj10aGlzLl9jaXBoZXIsdT1mLmJsb2NrU2l6ZTtpLmNhbGwodGhpcyxhLHMsdSxmKSx0aGlzLl9wcmV2QmxvY2s9YS5zbGljZShzLHMrdSl9fSksbi5EZWNyeXB0b3I9bi5leHRlbmQoe3Byb2Nlc3NCbG9jazpmdW5jdGlvbihhLHMpe3ZhciBmPXRoaXMuX2NpcGhlcix1PWYuYmxvY2tTaXplLG89YS5zbGljZShzLHMrdSk7aS5jYWxsKHRoaXMsYSxzLHUsZiksdGhpcy5fcHJldkJsb2NrPW99fSk7ZnVuY3Rpb24gaShhLHMsZix1KXt2YXIgbyx4PXRoaXMuX2l2O3g/KG89eC5zbGljZSgwKSx0aGlzLl9pdj12b2lkIDApOm89dGhpcy5fcHJldkJsb2NrLHUuZW5jcnlwdEJsb2NrKG8sMCk7Zm9yKHZhciBwPTA7cDxmO3ArKylhW3MrcF1ePW9bcF19cmV0dXJuIG59KCksci5tb2RlLkNGQn0pfSkoWXIpO3ZhciBNcj17ZXhwb3J0czp7fX07KGZ1bmN0aW9uKHQsZSl7KGZ1bmN0aW9uKHIsbixpKXt0LmV4cG9ydHM9bihZLmV4cG9ydHMsWi5leHBvcnRzKX0pKEYsZnVuY3Rpb24ocil7cmV0dXJuIHIubW9kZS5DVFI9ZnVuY3Rpb24oKXt2YXIgbj1yLmxpYi5CbG9ja0NpcGhlck1vZGUuZXh0ZW5kKCksaT1uLkVuY3J5cHRvcj1uLmV4dGVuZCh7cHJvY2Vzc0Jsb2NrOmZ1bmN0aW9uKGEscyl7dmFyIGY9dGhpcy5fY2lwaGVyLHU9Zi5ibG9ja1NpemUsbz10aGlzLl9pdix4PXRoaXMuX2NvdW50ZXI7byYmKHg9dGhpcy5fY291bnRlcj1vLnNsaWNlKDApLHRoaXMuX2l2PXZvaWQgMCk7dmFyIHA9eC5zbGljZSgwKTtmLmVuY3J5cHRCbG9jayhwLDApLHhbdS0xXT14W3UtMV0rMXwwO2Zvcih2YXIgYz0wO2M8dTtjKyspYVtzK2NdXj1wW2NdfX0pO3JldHVybiBuLkRlY3J5cHRvcj1pLG59KCksci5tb2RlLkNUUn0pfSkoTXIpO3ZhciBPcj17ZXhwb3J0czp7fX07KGZ1bmN0aW9uKHQsZSl7KGZ1bmN0aW9uKHIsbixpKXt0LmV4cG9ydHM9bihZLmV4cG9ydHMsWi5leHBvcnRzKX0pKEYsZnVuY3Rpb24ocil7LyoqIEBwcmVzZXJ2ZQogKiBDb3VudGVyIGJsb2NrIG1vZGUgY29tcGF0aWJsZSB3aXRoICBEciBCcmlhbiBHbGFkbWFuIGZpbGVlbmMuYwogKiBkZXJpdmVkIGZyb20gQ3J5cHRvSlMubW9kZS5DVFIKICogSmFuIEhydWJ5IGpocnVieS53ZWJAZ21haWwuY29tCiAqL3JldHVybiByLm1vZGUuQ1RSR2xhZG1hbj1mdW5jdGlvbigpe3ZhciBuPXIubGliLkJsb2NrQ2lwaGVyTW9kZS5leHRlbmQoKTtmdW5jdGlvbiBpKGYpe2lmKChmPj4yNCYyNTUpPT0yNTUpe3ZhciB1PWY+PjE2JjI1NSxvPWY+PjgmMjU1LHg9ZiYyNTU7dT09PTI1NT8odT0wLG89PT0yNTU/KG89MCx4PT09MjU1P3g9MDorK3gpOisrbyk6Kyt1LGY9MCxmKz11PDwxNixmKz1vPDw4LGYrPXh9ZWxzZSBmKz0xPDwyNDtyZXR1cm4gZn1mdW5jdGlvbiBhKGYpe3JldHVybihmWzBdPWkoZlswXSkpPT09MCYmKGZbMV09aShmWzFdKSksZn12YXIgcz1uLkVuY3J5cHRvcj1uLmV4dGVuZCh7cHJvY2Vzc0Jsb2NrOmZ1bmN0aW9uKGYsdSl7dmFyIG89dGhpcy5fY2lwaGVyLHg9by5ibG9ja1NpemUscD10aGlzLl9pdixjPXRoaXMuX2NvdW50ZXI7cCYmKGM9dGhpcy5fY291bnRlcj1wLnNsaWNlKDApLHRoaXMuX2l2PXZvaWQgMCksYShjKTt2YXIgaD1jLnNsaWNlKDApO28uZW5jcnlwdEJsb2NrKGgsMCk7Zm9yKHZhciBsPTA7bDx4O2wrKylmW3UrbF1ePWhbbF19fSk7cmV0dXJuIG4uRGVjcnlwdG9yPXMsbn0oKSxyLm1vZGUuQ1RSR2xhZG1hbn0pfSkoT3IpO3ZhciBLcj17ZXhwb3J0czp7fX07KGZ1bmN0aW9uKHQsZSl7KGZ1bmN0aW9uKHIsbixpKXt0LmV4cG9ydHM9bihZLmV4cG9ydHMsWi5leHBvcnRzKX0pKEYsZnVuY3Rpb24ocil7cmV0dXJuIHIubW9kZS5PRkI9ZnVuY3Rpb24oKXt2YXIgbj1yLmxpYi5CbG9ja0NpcGhlck1vZGUuZXh0ZW5kKCksaT1uLkVuY3J5cHRvcj1uLmV4dGVuZCh7cHJvY2Vzc0Jsb2NrOmZ1bmN0aW9uKGEscyl7dmFyIGY9dGhpcy5fY2lwaGVyLHU9Zi5ibG9ja1NpemUsbz10aGlzLl9pdix4PXRoaXMuX2tleXN0cmVhbTtvJiYoeD10aGlzLl9rZXlzdHJlYW09by5zbGljZSgwKSx0aGlzLl9pdj12b2lkIDApLGYuZW5jcnlwdEJsb2NrKHgsMCk7Zm9yKHZhciBwPTA7cDx1O3ArKylhW3MrcF1ePXhbcF19fSk7cmV0dXJuIG4uRGVjcnlwdG9yPWksbn0oKSxyLm1vZGUuT0ZCfSl9KShLcik7dmFyIEdyPXtleHBvcnRzOnt9fTsoZnVuY3Rpb24odCxlKXsoZnVuY3Rpb24ocixuLGkpe3QuZXhwb3J0cz1uKFkuZXhwb3J0cyxaLmV4cG9ydHMpfSkoRixmdW5jdGlvbihyKXtyZXR1cm4gci5tb2RlLkVDQj1mdW5jdGlvbigpe3ZhciBuPXIubGliLkJsb2NrQ2lwaGVyTW9kZS5leHRlbmQoKTtyZXR1cm4gbi5FbmNyeXB0b3I9bi5leHRlbmQoe3Byb2Nlc3NCbG9jazpmdW5jdGlvbihpLGEpe3RoaXMuX2NpcGhlci5lbmNyeXB0QmxvY2soaSxhKX19KSxuLkRlY3J5cHRvcj1uLmV4dGVuZCh7cHJvY2Vzc0Jsb2NrOmZ1bmN0aW9uKGksYSl7dGhpcy5fY2lwaGVyLmRlY3J5cHRCbG9jayhpLGEpfX0pLG59KCksci5tb2RlLkVDQn0pfSkoR3IpO3ZhciBYcj17ZXhwb3J0czp7fX07KGZ1bmN0aW9uKHQsZSl7KGZ1bmN0aW9uKHIsbixpKXt0LmV4cG9ydHM9bihZLmV4cG9ydHMsWi5leHBvcnRzKX0pKEYsZnVuY3Rpb24ocil7cmV0dXJuIHIucGFkLkFuc2lYOTIzPXtwYWQ6ZnVuY3Rpb24obixpKXt2YXIgYT1uLnNpZ0J5dGVzLHM9aSo0LGY9cy1hJXMsdT1hK2YtMTtuLmNsYW1wKCksbi53b3Jkc1t1Pj4+Ml18PWY8PDI0LXUlNCo4LG4uc2lnQnl0ZXMrPWZ9LHVucGFkOmZ1bmN0aW9uKG4pe3ZhciBpPW4ud29yZHNbbi5zaWdCeXRlcy0xPj4+Ml0mMjU1O24uc2lnQnl0ZXMtPWl9fSxyLnBhZC5BbnNpeDkyM30pfSkoWHIpO3ZhciBxcj17ZXhwb3J0czp7fX07KGZ1bmN0aW9uKHQsZSl7KGZ1bmN0aW9uKHIsbixpKXt0LmV4cG9ydHM9bihZLmV4cG9ydHMsWi5leHBvcnRzKX0pKEYsZnVuY3Rpb24ocil7cmV0dXJuIHIucGFkLklzbzEwMTI2PXtwYWQ6ZnVuY3Rpb24obixpKXt2YXIgYT1pKjQscz1hLW4uc2lnQnl0ZXMlYTtuLmNvbmNhdChyLmxpYi5Xb3JkQXJyYXkucmFuZG9tKHMtMSkpLmNvbmNhdChyLmxpYi5Xb3JkQXJyYXkuY3JlYXRlKFtzPDwyNF0sMSkpfSx1bnBhZDpmdW5jdGlvbihuKXt2YXIgaT1uLndvcmRzW24uc2lnQnl0ZXMtMT4+PjJdJjI1NTtuLnNpZ0J5dGVzLT1pfX0sci5wYWQuSXNvMTAxMjZ9KX0pKHFyKTt2YXIgJHI9e2V4cG9ydHM6e319OyhmdW5jdGlvbih0LGUpeyhmdW5jdGlvbihyLG4saSl7dC5leHBvcnRzPW4oWS5leHBvcnRzLFouZXhwb3J0cyl9KShGLGZ1bmN0aW9uKHIpe3JldHVybiByLnBhZC5Jc285Nzk3MT17cGFkOmZ1bmN0aW9uKG4saSl7bi5jb25jYXQoci5saWIuV29yZEFycmF5LmNyZWF0ZShbMjE0NzQ4MzY0OF0sMSkpLHIucGFkLlplcm9QYWRkaW5nLnBhZChuLGkpfSx1bnBhZDpmdW5jdGlvbihuKXtyLnBhZC5aZXJvUGFkZGluZy51bnBhZChuKSxuLnNpZ0J5dGVzLS19fSxyLnBhZC5Jc285Nzk3MX0pfSkoJHIpO3ZhciBWcj17ZXhwb3J0czp7fX07KGZ1bmN0aW9uKHQsZSl7KGZ1bmN0aW9uKHIsbixpKXt0LmV4cG9ydHM9bihZLmV4cG9ydHMsWi5leHBvcnRzKX0pKEYsZnVuY3Rpb24ocil7cmV0dXJuIHIucGFkLlplcm9QYWRkaW5nPXtwYWQ6ZnVuY3Rpb24obixpKXt2YXIgYT1pKjQ7bi5jbGFtcCgpLG4uc2lnQnl0ZXMrPWEtKG4uc2lnQnl0ZXMlYXx8YSl9LHVucGFkOmZ1bmN0aW9uKG4pe2Zvcih2YXIgaT1uLndvcmRzLGE9bi5zaWdCeXRlcy0xLGE9bi5zaWdCeXRlcy0xO2E+PTA7YS0tKWlmKGlbYT4+PjJdPj4+MjQtYSU0KjgmMjU1KXtuLnNpZ0J5dGVzPWErMTticmVha319fSxyLnBhZC5aZXJvUGFkZGluZ30pfSkoVnIpO3ZhciBacj17ZXhwb3J0czp7fX07KGZ1bmN0aW9uKHQsZSl7KGZ1bmN0aW9uKHIsbixpKXt0LmV4cG9ydHM9bihZLmV4cG9ydHMsWi5leHBvcnRzKX0pKEYsZnVuY3Rpb24ocil7cmV0dXJuIHIucGFkLk5vUGFkZGluZz17cGFkOmZ1bmN0aW9uKCl7fSx1bnBhZDpmdW5jdGlvbigpe319LHIucGFkLk5vUGFkZGluZ30pfSkoWnIpO3ZhciBRcj17ZXhwb3J0czp7fX07KGZ1bmN0aW9uKHQsZSl7KGZ1bmN0aW9uKHIsbixpKXt0LmV4cG9ydHM9bihZLmV4cG9ydHMsWi5leHBvcnRzKX0pKEYsZnVuY3Rpb24ocil7cmV0dXJuIGZ1bmN0aW9uKG4pe3ZhciBpPXIsYT1pLmxpYixzPWEuQ2lwaGVyUGFyYW1zLGY9aS5lbmMsdT1mLkhleCxvPWkuZm9ybWF0O28uSGV4PXtzdHJpbmdpZnk6ZnVuY3Rpb24oeCl7cmV0dXJuIHguY2lwaGVydGV4dC50b1N0cmluZyh1KX0scGFyc2U6ZnVuY3Rpb24oeCl7dmFyIHA9dS5wYXJzZSh4KTtyZXR1cm4gcy5jcmVhdGUoe2NpcGhlcnRleHQ6cH0pfX19KCksci5mb3JtYXQuSGV4fSl9KShRcik7dmFyIGpyPXtleHBvcnRzOnt9fTsoZnVuY3Rpb24odCxlKXsoZnVuY3Rpb24ocixuLGkpe3QuZXhwb3J0cz1uKFkuZXhwb3J0cyxsMC5leHBvcnRzLHYwLmV4cG9ydHMsczAuZXhwb3J0cyxaLmV4cG9ydHMpfSkoRixmdW5jdGlvbihyKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbj1yLGk9bi5saWIsYT1pLkJsb2NrQ2lwaGVyLHM9bi5hbGdvLGY9W10sdT1bXSxvPVtdLHg9W10scD1bXSxjPVtdLGg9W10sbD1bXSxfPVtdLHk9W107KGZ1bmN0aW9uKCl7Zm9yKHZhciBkPVtdLGc9MDtnPDI1NjtnKyspZzwxMjg/ZFtnXT1nPDwxOmRbZ109Zzw8MV4yODM7Zm9yKHZhciBtPTAsQT0wLGc9MDtnPDI1NjtnKyspe3ZhciBrPUFeQTw8MV5BPDwyXkE8PDNeQTw8NDtrPWs+Pj44XmsmMjU1Xjk5LGZbbV09ayx1W2tdPW07dmFyIEM9ZFttXSxJPWRbQ10sdz1kW0ldLGI9ZFtrXSoyNTdeayoxNjg0MzAwODtvW21dPWI8PDI0fGI+Pj44LHhbbV09Yjw8MTZ8Yj4+PjE2LHBbbV09Yjw8OHxiPj4+MjQsY1ttXT1iO3ZhciBiPXcqMTY4NDMwMDleSSo2NTUzN15DKjI1N15tKjE2ODQzMDA4O2hba109Yjw8MjR8Yj4+PjgsbFtrXT1iPDwxNnxiPj4+MTYsX1trXT1iPDw4fGI+Pj4yNCx5W2tdPWIsbT8obT1DXmRbZFtkW3deQ11dXSxBXj1kW2RbQV1dKTptPUE9MX19KSgpO3ZhciBCPVswLDEsMiw0LDgsMTYsMzIsNjQsMTI4LDI3LDU0XSx2PXMuQUVTPWEuZXh0ZW5kKHtfZG9SZXNldDpmdW5jdGlvbigpe3ZhciBkO2lmKCEodGhpcy5fblJvdW5kcyYmdGhpcy5fa2V5UHJpb3JSZXNldD09PXRoaXMuX2tleSkpe2Zvcih2YXIgZz10aGlzLl9rZXlQcmlvclJlc2V0PXRoaXMuX2tleSxtPWcud29yZHMsQT1nLnNpZ0J5dGVzLzQsaz10aGlzLl9uUm91bmRzPUErNixDPShrKzEpKjQsST10aGlzLl9rZXlTY2hlZHVsZT1bXSx3PTA7dzxDO3crKyl3PEE/SVt3XT1tW3ddOihkPUlbdy0xXSx3JUE/QT42JiZ3JUE9PTQmJihkPWZbZD4+PjI0XTw8MjR8ZltkPj4+MTYmMjU1XTw8MTZ8ZltkPj4+OCYyNTVdPDw4fGZbZCYyNTVdKTooZD1kPDw4fGQ+Pj4yNCxkPWZbZD4+PjI0XTw8MjR8ZltkPj4+MTYmMjU1XTw8MTZ8ZltkPj4+OCYyNTVdPDw4fGZbZCYyNTVdLGRePUJbdy9BfDBdPDwyNCksSVt3XT1JW3ctQV1eZCk7Zm9yKHZhciBiPXRoaXMuX2ludktleVNjaGVkdWxlPVtdLFI9MDtSPEM7UisrKXt2YXIgdz1DLVI7aWYoUiU0KXZhciBkPUlbd107ZWxzZSB2YXIgZD1JW3ctNF07Ujw0fHx3PD00P2JbUl09ZDpiW1JdPWhbZltkPj4+MjRdXV5sW2ZbZD4+PjE2JjI1NV1dXl9bZltkPj4+OCYyNTVdXV55W2ZbZCYyNTVdXX19fSxlbmNyeXB0QmxvY2s6ZnVuY3Rpb24oZCxnKXt0aGlzLl9kb0NyeXB0QmxvY2soZCxnLHRoaXMuX2tleVNjaGVkdWxlLG8seCxwLGMsZil9LGRlY3J5cHRCbG9jazpmdW5jdGlvbihkLGcpe3ZhciBtPWRbZysxXTtkW2crMV09ZFtnKzNdLGRbZyszXT1tLHRoaXMuX2RvQ3J5cHRCbG9jayhkLGcsdGhpcy5faW52S2V5U2NoZWR1bGUsaCxsLF8seSx1KTt2YXIgbT1kW2crMV07ZFtnKzFdPWRbZyszXSxkW2crM109bX0sX2RvQ3J5cHRCbG9jazpmdW5jdGlvbihkLGcsbSxBLGssQyxJLHcpe2Zvcih2YXIgYj10aGlzLl9uUm91bmRzLFI9ZFtnXV5tWzBdLFQ9ZFtnKzFdXm1bMV0sej1kW2crMl1ebVsyXSxMPWRbZyszXV5tWzNdLE49NCxxPTE7cTxiO3ErKyl7dmFyIE89QVtSPj4+MjRdXmtbVD4+PjE2JjI1NV1eQ1t6Pj4+OCYyNTVdXklbTCYyNTVdXm1bTisrXSxHPUFbVD4+PjI0XV5rW3o+Pj4xNiYyNTVdXkNbTD4+PjgmMjU1XV5JW1ImMjU1XV5tW04rK10sSz1BW3o+Pj4yNF1ea1tMPj4+MTYmMjU1XV5DW1I+Pj44JjI1NV1eSVtUJjI1NV1ebVtOKytdLFM9QVtMPj4+MjRdXmtbUj4+PjE2JjI1NV1eQ1tUPj4+OCYyNTVdXklbeiYyNTVdXm1bTisrXTtSPU8sVD1HLHo9SyxMPVN9dmFyIE89KHdbUj4+PjI0XTw8MjR8d1tUPj4+MTYmMjU1XTw8MTZ8d1t6Pj4+OCYyNTVdPDw4fHdbTCYyNTVdKV5tW04rK10sRz0od1tUPj4+MjRdPDwyNHx3W3o+Pj4xNiYyNTVdPDwxNnx3W0w+Pj44JjI1NV08PDh8d1tSJjI1NV0pXm1bTisrXSxLPSh3W3o+Pj4yNF08PDI0fHdbTD4+PjE2JjI1NV08PDE2fHdbUj4+PjgmMjU1XTw8OHx3W1QmMjU1XSlebVtOKytdLFM9KHdbTD4+PjI0XTw8MjR8d1tSPj4+MTYmMjU1XTw8MTZ8d1tUPj4+OCYyNTVdPDw4fHdbeiYyNTVdKV5tW04rK107ZFtnXT1PLGRbZysxXT1HLGRbZysyXT1LLGRbZyszXT1TfSxrZXlTaXplOjI1Ni8zMn0pO24uQUVTPWEuX2NyZWF0ZUhlbHBlcih2KX0oKSxyLkFFU30pfSkoanIpO3ZhciBKcj17ZXhwb3J0czp7fX07KGZ1bmN0aW9uKHQsZSl7KGZ1bmN0aW9uKHIsbixpKXt0LmV4cG9ydHM9bihZLmV4cG9ydHMsbDAuZXhwb3J0cyx2MC5leHBvcnRzLHMwLmV4cG9ydHMsWi5leHBvcnRzKX0pKEYsZnVuY3Rpb24ocil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG49cixpPW4ubGliLGE9aS5Xb3JkQXJyYXkscz1pLkJsb2NrQ2lwaGVyLGY9bi5hbGdvLHU9WzU3LDQ5LDQxLDMzLDI1LDE3LDksMSw1OCw1MCw0MiwzNCwyNiwxOCwxMCwyLDU5LDUxLDQzLDM1LDI3LDE5LDExLDMsNjAsNTIsNDQsMzYsNjMsNTUsNDcsMzksMzEsMjMsMTUsNyw2Miw1NCw0NiwzOCwzMCwyMiwxNCw2LDYxLDUzLDQ1LDM3LDI5LDIxLDEzLDUsMjgsMjAsMTIsNF0sbz1bMTQsMTcsMTEsMjQsMSw1LDMsMjgsMTUsNiwyMSwxMCwyMywxOSwxMiw0LDI2LDgsMTYsNywyNywyMCwxMywyLDQxLDUyLDMxLDM3LDQ3LDU1LDMwLDQwLDUxLDQ1LDMzLDQ4LDQ0LDQ5LDM5LDU2LDM0LDUzLDQ2LDQyLDUwLDM2LDI5LDMyXSx4PVsxLDIsNCw2LDgsMTAsMTIsMTQsMTUsMTcsMTksMjEsMjMsMjUsMjcsMjhdLHA9W3swOjg0MjE4ODgsMjY4NDM1NDU2OjMyNzY4LDUzNjg3MDkxMjo4NDIxMzc4LDgwNTMwNjM2ODoyLDEwNzM3NDE4MjQ6NTEyLDEzNDIxNzcyODA6ODQyMTg5MCwxNjEwNjEyNzM2OjgzODkxMjIsMTg3OTA0ODE5Mjo4Mzg4NjA4LDIxNDc0ODM2NDg6NTE0LDI0MTU5MTkxMDQ6ODM4OTEyMCwyNjg0MzU0NTYwOjMzMjgwLDI5NTI3OTAwMTY6ODQyMTM3NiwzMjIxMjI1NDcyOjMyNzcwLDM0ODk2NjA5Mjg6ODM4ODYxMCwzNzU4MDk2Mzg0OjAsNDAyNjUzMTg0MDozMzI4MiwxMzQyMTc3Mjg6MCw0MDI2NTMxODQ6ODQyMTg5MCw2NzEwODg2NDA6MzMyODIsOTM5NTI0MDk2OjMyNzY4LDEyMDc5NTk1NTI6ODQyMTg4OCwxNDc2Mzk1MDA4OjUxMiwxNzQ0ODMwNDY0Ojg0MjEzNzgsMjAxMzI2NTkyMDoyLDIyODE3MDEzNzY6ODM4OTEyMCwyNTUwMTM2ODMyOjMzMjgwLDI4MTg1NzIyODg6ODQyMTM3NiwzMDg3MDA3NzQ0OjgzODkxMjIsMzM1NTQ0MzIwMDo4Mzg4NjEwLDM2MjM4Nzg2NTY6MzI3NzAsMzg5MjMxNDExMjo1MTQsNDE2MDc0OTU2ODo4Mzg4NjA4LDE6MzI3NjgsMjY4NDM1NDU3OjIsNTM2ODcwOTEzOjg0MjE4ODgsODA1MzA2MzY5OjgzODg2MDgsMTA3Mzc0MTgyNTo4NDIxMzc4LDEzNDIxNzcyODE6MzMyODAsMTYxMDYxMjczNzo1MTIsMTg3OTA0ODE5Mzo4Mzg5MTIyLDIxNDc0ODM2NDk6ODQyMTg5MCwyNDE1OTE5MTA1Ojg0MjEzNzYsMjY4NDM1NDU2MTo4Mzg4NjEwLDI5NTI3OTAwMTc6MzMyODIsMzIyMTIyNTQ3Mzo1MTQsMzQ4OTY2MDkyOTo4Mzg5MTIwLDM3NTgwOTYzODU6MzI3NzAsNDAyNjUzMTg0MTowLDEzNDIxNzcyOTo4NDIxODkwLDQwMjY1MzE4NTo4NDIxMzc2LDY3MTA4ODY0MTo4Mzg4NjA4LDkzOTUyNDA5Nzo1MTIsMTIwNzk1OTU1MzozMjc2OCwxNDc2Mzk1MDA5OjgzODg2MTAsMTc0NDgzMDQ2NToyLDIwMTMyNjU5MjE6MzMyODIsMjI4MTcwMTM3NzozMjc3MCwyNTUwMTM2ODMzOjgzODkxMjIsMjgxODU3MjI4OTo1MTQsMzA4NzAwNzc0NTo4NDIxODg4LDMzNTU0NDMyMDE6ODM4OTEyMCwzNjIzODc4NjU3OjAsMzg5MjMxNDExMzozMzI4MCw0MTYwNzQ5NTY5Ojg0MjEzNzh9LHswOjEwNzQyODI1MTIsMTY3NzcyMTY6MTYzODQsMzM1NTQ0MzI6NTI0Mjg4LDUwMzMxNjQ4OjEwNzQyNjYxMjgsNjcxMDg4NjQ6MTA3Mzc0MTg0MCw4Mzg4NjA4MDoxMDc0MjgyNDk2LDEwMDY2MzI5NjoxMDczNzU4MjA4LDExNzQ0MDUxMjoxNiwxMzQyMTc3Mjg6NTQwNjcyLDE1MDk5NDk0NDoxMDczNzU4MjI0LDE2Nzc3MjE2MDoxMDczNzQxODI0LDE4NDU0OTM3Njo1NDA2ODgsMjAxMzI2NTkyOjUyNDMwNCwyMTgxMDM4MDg6MCwyMzQ4ODEwMjQ6MTY0MDAsMjUxNjU4MjQwOjEwNzQyNjYxMTIsODM4ODYwODoxMDczNzU4MjA4LDI1MTY1ODI0OjU0MDY4OCw0MTk0MzA0MDoxNiw1ODcyMDI1NjoxMDczNzU4MjI0LDc1NDk3NDcyOjEwNzQyODI1MTIsOTIyNzQ2ODg6MTA3Mzc0MTgyNCwxMDkwNTE5MDQ6NTI0Mjg4LDEyNTgyOTEyMDoxMDc0MjY2MTI4LDE0MjYwNjMzNjo1MjQzMDQsMTU5MzgzNTUyOjAsMTc2MTYwNzY4OjE2Mzg0LDE5MjkzNzk4NDoxMDc0MjY2MTEyLDIwOTcxNTIwMDoxMDczNzQxODQwLDIyNjQ5MjQxNjo1NDA2NzIsMjQzMjY5NjMyOjEwNzQyODI0OTYsMjYwMDQ2ODQ4OjE2NDAwLDI2ODQzNTQ1NjowLDI4NTIxMjY3MjoxMDc0MjY2MTI4LDMwMTk4OTg4ODoxMDczNzU4MjI0LDMxODc2NzEwNDoxMDc0MjgyNDk2LDMzNTU0NDMyMDoxMDc0MjY2MTEyLDM1MjMyMTUzNjoxNiwzNjkwOTg3NTI6NTQwNjg4LDM4NTg3NTk2ODoxNjM4NCw0MDI2NTMxODQ6MTY0MDAsNDE5NDMwNDAwOjUyNDI4OCw0MzYyMDc2MTY6NTI0MzA0LDQ1Mjk4NDgzMjoxMDczNzQxODQwLDQ2OTc2MjA0ODo1NDA2NzIsNDg2NTM5MjY0OjEwNzM3NTgyMDgsNTAzMzE2NDgwOjEwNzM3NDE4MjQsNTIwMDkzNjk2OjEwNzQyODI1MTIsMjc2ODI0MDY0OjU0MDY4OCwyOTM2MDEyODA6NTI0Mjg4LDMxMDM3ODQ5NjoxMDc0MjY2MTEyLDMyNzE1NTcxMjoxNjM4NCwzNDM5MzI5Mjg6MTA3Mzc1ODIwOCwzNjA3MTAxNDQ6MTA3NDI4MjUxMiwzNzc0ODczNjA6MTYsMzk0MjY0NTc2OjEwNzM3NDE4MjQsNDExMDQxNzkyOjEwNzQyODI0OTYsNDI3ODE5MDA4OjEwNzM3NDE4NDAsNDQ0NTk2MjI0OjEwNzM3NTgyMjQsNDYxMzczNDQwOjUyNDMwNCw0NzgxNTA2NTY6MCw0OTQ5Mjc4NzI6MTY0MDAsNTExNzA1MDg4OjEwNzQyNjYxMjgsNTI4NDgyMzA0OjU0MDY3Mn0sezA6MjYwLDEwNDg1NzY6MCwyMDk3MTUyOjY3MTA5MTIwLDMxNDU3Mjg6NjU3OTYsNDE5NDMwNDo2NTU0MCw1MjQyODgwOjY3MTA4ODY4LDYyOTE0NTY6NjcxNzQ2NjAsNzM0MDAzMjo2NzE3NDQwMCw4Mzg4NjA4OjY3MTA4ODY0LDk0MzcxODQ6NjcxNzQ2NTYsMTA0ODU3NjA6NjU3OTIsMTE1MzQzMzY6NjcxNzQ0MDQsMTI1ODI5MTI6NjcxMDkxMjQsMTM2MzE0ODg6NjU1MzYsMTQ2ODAwNjQ6NCwxNTcyODY0MDoyNTYsNTI0Mjg4OjY3MTc0NjU2LDE1NzI4NjQ6NjcxNzQ0MDQsMjYyMTQ0MDowLDM2NzAwMTY6NjcxMDkxMjAsNDcxODU5Mjo2NzEwODg2OCw1NzY3MTY4OjY1NTM2LDY4MTU3NDQ6NjU1NDAsNzg2NDMyMDoyNjAsODkxMjg5Njo0LDk5NjE0NzI6MjU2LDExMDEwMDQ4OjY3MTc0NDAwLDEyMDU4NjI0OjY1Nzk2LDEzMTA3MjAwOjY1NzkyLDE0MTU1Nzc2OjY3MTA5MTI0LDE1MjA0MzUyOjY3MTc0NjYwLDE2MjUyOTI4OjY3MTA4ODY0LDE2Nzc3MjE2OjY3MTc0NjU2LDE3ODI1NzkyOjY1NTQwLDE4ODc0MzY4OjY1NTM2LDE5OTIyOTQ0OjY3MTA5MTIwLDIwOTcxNTIwOjI1NiwyMjAyMDA5Njo2NzE3NDY2MCwyMzA2ODY3Mjo2NzEwODg2OCwyNDExNzI0ODowLDI1MTY1ODI0OjY3MTA5MTI0LDI2MjE0NDAwOjY3MTA4ODY0LDI3MjYyOTc2OjQsMjgzMTE1NTI6NjU3OTIsMjkzNjAxMjg6NjcxNzQ0MDAsMzA0MDg3MDQ6MjYwLDMxNDU3MjgwOjY1Nzk2LDMyNTA1ODU2OjY3MTc0NDA0LDE3MzAxNTA0OjY3MTA4ODY0LDE4MzUwMDgwOjI2MCwxOTM5ODY1Njo2NzE3NDY1NiwyMDQ0NzIzMjowLDIxNDk1ODA4OjY1NTQwLDIyNTQ0Mzg0OjY3MTA5MTIwLDIzNTkyOTYwOjI1NiwyNDY0MTUzNjo2NzE3NDQwNCwyNTY5MDExMjo2NTUzNiwyNjczODY4ODo2NzE3NDY2MCwyNzc4NzI2NDo2NTc5NiwyODgzNTg0MDo2NzEwODg2OCwyOTg4NDQxNjo2NzEwOTEyNCwzMDkzMjk5Mjo2NzE3NDQwMCwzMTk4MTU2ODo0LDMzMDMwMTQ0OjY1NzkyfSx7MDoyMTUxNjgyMDQ4LDY1NTM2OjIxNDc0ODc4MDgsMTMxMDcyOjQxOTg0NjQsMTk2NjA4OjIxNTE2Nzc5NTIsMjYyMTQ0OjAsMzI3NjgwOjQxOTg0MDAsMzkzMjE2OjIxNDc0ODM3MTIsNDU4NzUyOjQxOTQzNjgsNTI0Mjg4OjIxNDc0ODM2NDgsNTg5ODI0OjQxOTQzMDQsNjU1MzYwOjY0LDcyMDg5NjoyMTQ3NDg3NzQ0LDc4NjQzMjoyMTUxNjc4MDE2LDg1MTk2ODo0MTYwLDkxNzUwNDo0MDk2LDk4MzA0MDoyMTUxNjgyMTEyLDMyNzY4OjIxNDc0ODc4MDgsOTgzMDQ6NjQsMTYzODQwOjIxNTE2NzgwMTYsMjI5Mzc2OjIxNDc0ODc3NDQsMjk0OTEyOjQxOTg0MDAsMzYwNDQ4OjIxNTE2ODIxMTIsNDI1OTg0OjAsNDkxNTIwOjIxNTE2Nzc5NTIsNTU3MDU2OjQwOTYsNjIyNTkyOjIxNTE2ODIwNDgsNjg4MTI4OjQxOTQzMDQsNzUzNjY0OjQxNjAsODE5MjAwOjIxNDc0ODM2NDgsODg0NzM2OjQxOTQzNjgsOTUwMjcyOjQxOTg0NjQsMTAxNTgwODoyMTQ3NDgzNzEyLDEwNDg1NzY6NDE5NDM2OCwxMTE0MTEyOjQxOTg0MDAsMTE3OTY0ODoyMTQ3NDgzNzEyLDEyNDUxODQ6MCwxMzEwNzIwOjQxNjAsMTM3NjI1NjoyMTUxNjc4MDE2LDE0NDE3OTI6MjE1MTY4MjA0OCwxNTA3MzI4OjIxNDc0ODc4MDgsMTU3Mjg2NDoyMTUxNjgyMTEyLDE2Mzg0MDA6MjE0NzQ4MzY0OCwxNzAzOTM2OjIxNTE2Nzc5NTIsMTc2OTQ3Mjo0MTk4NDY0LDE4MzUwMDg6MjE0NzQ4Nzc0NCwxOTAwNTQ0OjQxOTQzMDQsMTk2NjA4MDo2NCwyMDMxNjE2OjQwOTYsMTA4MTM0NDoyMTUxNjc3OTUyLDExNDY4ODA6MjE1MTY4MjExMiwxMjEyNDE2OjAsMTI3Nzk1Mjo0MTk4NDAwLDEzNDM0ODg6NDE5NDM2OCwxNDA5MDI0OjIxNDc0ODM2NDgsMTQ3NDU2MDoyMTQ3NDg3ODA4LDE1NDAwOTY6NjQsMTYwNTYzMjoyMTQ3NDgzNzEyLDE2NzExNjg6NDA5NiwxNzM2NzA0OjIxNDc0ODc3NDQsMTgwMjI0MDoyMTUxNjc4MDE2LDE4Njc3NzY6NDE2MCwxOTMzMzEyOjIxNTE2ODIwNDgsMTk5ODg0ODo0MTk0MzA0LDIwNjQzODQ6NDE5ODQ2NH0sezA6MTI4LDQwOTY6MTcwMzkzNjAsODE5MjoyNjIxNDQsMTIyODg6NTM2ODcwOTEyLDE2Mzg0OjUzNzEzMzE4NCwyMDQ4MDoxNjc3NzM0NCwyNDU3Njo1NTM2NDgyNTYsMjg2NzI6MjYyMjcyLDMyNzY4OjE2Nzc3MjE2LDM2ODY0OjUzNzEzMzA1Niw0MDk2MDo1MzY4NzEwNDAsNDUwNTY6NTUzOTEwNDAwLDQ5MTUyOjU1MzkxMDI3Miw1MzI0ODowLDU3MzQ0OjE3MDM5NDg4LDYxNDQwOjU1MzY0ODEyOCwyMDQ4OjE3MDM5NDg4LDYxNDQ6NTUzNjQ4MjU2LDEwMjQwOjEyOCwxNDMzNjoxNzAzOTM2MCwxODQzMjoyNjIxNDQsMjI1Mjg6NTM3MTMzMTg0LDI2NjI0OjU1MzkxMDI3MiwzMDcyMDo1MzY4NzA5MTIsMzQ4MTY6NTM3MTMzMDU2LDM4OTEyOjAsNDMwMDg6NTUzOTEwNDAwLDQ3MTA0OjE2Nzc3MzQ0LDUxMjAwOjUzNjg3MTA0MCw1NTI5Njo1NTM2NDgxMjgsNTkzOTI6MTY3NzcyMTYsNjM0ODg6MjYyMjcyLDY1NTM2OjI2MjE0NCw2OTYzMjoxMjgsNzM3Mjg6NTM2ODcwOTEyLDc3ODI0OjU1MzY0ODI1Niw4MTkyMDoxNjc3NzM0NCw4NjAxNjo1NTM5MTAyNzIsOTAxMTI6NTM3MTMzMTg0LDk0MjA4OjE2Nzc3MjE2LDk4MzA0OjU1MzkxMDQwMCwxMDI0MDA6NTUzNjQ4MTI4LDEwNjQ5NjoxNzAzOTM2MCwxMTA1OTI6NTM3MTMzMDU2LDExNDY4ODoyNjIyNzIsMTE4Nzg0OjUzNjg3MTA0MCwxMjI4ODA6MCwxMjY5NzY6MTcwMzk0ODgsNjc1ODQ6NTUzNjQ4MjU2LDcxNjgwOjE2Nzc3MjE2LDc1Nzc2OjE3MDM5MzYwLDc5ODcyOjUzNzEzMzE4NCw4Mzk2ODo1MzY4NzA5MTIsODgwNjQ6MTcwMzk0ODgsOTIxNjA6MTI4LDk2MjU2OjU1MzkxMDI3MiwxMDAzNTI6MjYyMjcyLDEwNDQ0ODo1NTM5MTA0MDAsMTA4NTQ0OjAsMTEyNjQwOjU1MzY0ODEyOCwxMTY3MzY6MTY3NzczNDQsMTIwODMyOjI2MjE0NCwxMjQ5Mjg6NTM3MTMzMDU2LDEyOTAyNDo1MzY4NzEwNDB9LHswOjI2ODQzNTQ2NCwyNTY6ODE5Miw1MTI6MjcwNTMyNjA4LDc2ODoyNzA1NDA4MDgsMTAyNDoyNjg0NDM2NDgsMTI4MDoyMDk3MTUyLDE1MzY6MjA5NzE2MCwxNzkyOjI2ODQzNTQ1NiwyMDQ4OjAsMjMwNDoyNjg0NDM2NTYsMjU2MDoyMTA1MzQ0LDI4MTY6OCwzMDcyOjI3MDUzMjYxNiwzMzI4OjIxMDUzNTIsMzU4NDo4MjAwLDM4NDA6MjcwNTQwODAwLDEyODoyNzA1MzI2MDgsMzg0OjI3MDU0MDgwOCw2NDA6OCw4OTY6MjA5NzE1MiwxMTUyOjIxMDUzNTIsMTQwODoyNjg0MzU0NjQsMTY2NDoyNjg0NDM2NDgsMTkyMDo4MjAwLDIxNzY6MjA5NzE2MCwyNDMyOjgxOTIsMjY4ODoyNjg0NDM2NTYsMjk0NDoyNzA1MzI2MTYsMzIwMDowLDM0NTY6MjcwNTQwODAwLDM3MTI6MjEwNTM0NCwzOTY4OjI2ODQzNTQ1Niw0MDk2OjI2ODQ0MzY0OCw0MzUyOjI3MDUzMjYxNiw0NjA4OjI3MDU0MDgwOCw0ODY0OjgyMDAsNTEyMDoyMDk3MTUyLDUzNzY6MjY4NDM1NDU2LDU2MzI6MjY4NDM1NDY0LDU4ODg6MjEwNTM0NCw2MTQ0OjIxMDUzNTIsNjQwMDowLDY2NTY6OCw2OTEyOjI3MDUzMjYwOCw3MTY4OjgxOTIsNzQyNDoyNjg0NDM2NTYsNzY4MDoyNzA1NDA4MDAsNzkzNjoyMDk3MTYwLDQyMjQ6OCw0NDgwOjIxMDUzNDQsNDczNjoyMDk3MTUyLDQ5OTI6MjY4NDM1NDY0LDUyNDg6MjY4NDQzNjQ4LDU1MDQ6ODIwMCw1NzYwOjI3MDU0MDgwOCw2MDE2OjI3MDUzMjYwOCw2MjcyOjI3MDU0MDgwMCw2NTI4OjI3MDUzMjYxNiw2Nzg0OjgxOTIsNzA0MDoyMTA1MzUyLDcyOTY6MjA5NzE2MCw3NTUyOjAsNzgwODoyNjg0MzU0NTYsODA2NDoyNjg0NDM2NTZ9LHswOjEwNDg1NzYsMTY6MzM1NTU0NTcsMzI6MTAyNCw0ODoxMDQ5NjAxLDY0OjM0NjA0MDMzLDgwOjAsOTY6MSwxMTI6MzQ2MDMwMDksMTI4OjMzNTU1NDU2LDE0NDoxMDQ4NTc3LDE2MDozMzU1NDQzMywxNzY6MzQ2MDQwMzIsMTkyOjM0NjAzMDA4LDIwODoxMDI1LDIyNDoxMDQ5NjAwLDI0MDozMzU1NDQzMiw4OjM0NjAzMDA5LDI0OjAsNDA6MzM1NTU0NTcsNTY6MzQ2MDQwMzIsNzI6MTA0ODU3Niw4ODozMzU1NDQzMywxMDQ6MzM1NTQ0MzIsMTIwOjEwMjUsMTM2OjEwNDk2MDEsMTUyOjMzNTU1NDU2LDE2ODozNDYwMzAwOCwxODQ6MTA0ODU3NywyMDA6MTAyNCwyMTY6MzQ2MDQwMzMsMjMyOjEsMjQ4OjEwNDk2MDAsMjU2OjMzNTU0NDMyLDI3MjoxMDQ4NTc2LDI4ODozMzU1NTQ1NywzMDQ6MzQ2MDMwMDksMzIwOjEwNDg1NzcsMzM2OjMzNTU1NDU2LDM1MjozNDYwNDAzMiwzNjg6MTA0OTYwMSwzODQ6MTAyNSw0MDA6MzQ2MDQwMzMsNDE2OjEwNDk2MDAsNDMyOjEsNDQ4OjAsNDY0OjM0NjAzMDA4LDQ4MDozMzU1NDQzMyw0OTY6MTAyNCwyNjQ6MTA0OTYwMCwyODA6MzM1NTU0NTcsMjk2OjM0NjAzMDA5LDMxMjoxLDMyODozMzU1NDQzMiwzNDQ6MTA0ODU3NiwzNjA6MTAyNSwzNzY6MzQ2MDQwMzIsMzkyOjMzNTU0NDMzLDQwODozNDYwMzAwOCw0MjQ6MCw0NDA6MzQ2MDQwMzMsNDU2OjEwNDk2MDEsNDcyOjEwMjQsNDg4OjMzNTU1NDU2LDUwNDoxMDQ4NTc3fSx7MDoxMzQyMTk4MDgsMToxMzEwNzIsMjoxMzQyMTc3MjgsMzozMiw0OjEzMTEwNCw1OjEzNDM1MDg4MCw2OjEzNDM1MDg0OCw3OjIwNDgsODoxMzQzNDg4MDAsOToxMzQyMTk3NzYsMTA6MTMzMTIwLDExOjEzNDM0ODgzMiwxMjoyMDgwLDEzOjAsMTQ6MTM0MjE3NzYwLDE1OjEzMzE1MiwyMTQ3NDgzNjQ4OjIwNDgsMjE0NzQ4MzY0OToxMzQzNTA4ODAsMjE0NzQ4MzY1MDoxMzQyMTk4MDgsMjE0NzQ4MzY1MToxMzQyMTc3MjgsMjE0NzQ4MzY1MjoxMzQzNDg4MDAsMjE0NzQ4MzY1MzoxMzMxMjAsMjE0NzQ4MzY1NDoxMzMxNTIsMjE0NzQ4MzY1NTozMiwyMTQ3NDgzNjU2OjEzNDIxNzc2MCwyMTQ3NDgzNjU3OjIwODAsMjE0NzQ4MzY1ODoxMzExMDQsMjE0NzQ4MzY1OToxMzQzNTA4NDgsMjE0NzQ4MzY2MDowLDIxNDc0ODM2NjE6MTM0MzQ4ODMyLDIxNDc0ODM2NjI6MTM0MjE5Nzc2LDIxNDc0ODM2NjM6MTMxMDcyLDE2OjEzMzE1MiwxNzoxMzQzNTA4NDgsMTg6MzIsMTk6MjA0OCwyMDoxMzQyMTk3NzYsMjE6MTM0MjE3NzYwLDIyOjEzNDM0ODgzMiwyMzoxMzEwNzIsMjQ6MCwyNToxMzExMDQsMjY6MTM0MzQ4ODAwLDI3OjEzNDIxOTgwOCwyODoxMzQzNTA4ODAsMjk6MTMzMTIwLDMwOjIwODAsMzE6MTM0MjE3NzI4LDIxNDc0ODM2NjQ6MTMxMDcyLDIxNDc0ODM2NjU6MjA0OCwyMTQ3NDgzNjY2OjEzNDM0ODgzMiwyMTQ3NDgzNjY3OjEzMzE1MiwyMTQ3NDgzNjY4OjMyLDIxNDc0ODM2Njk6MTM0MzQ4ODAwLDIxNDc0ODM2NzA6MTM0MjE3NzI4LDIxNDc0ODM2NzE6MTM0MjE5ODA4LDIxNDc0ODM2NzI6MTM0MzUwODgwLDIxNDc0ODM2NzM6MTM0MjE3NzYwLDIxNDc0ODM2NzQ6MTM0MjE5Nzc2LDIxNDc0ODM2NzU6MCwyMTQ3NDgzNjc2OjEzMzEyMCwyMTQ3NDgzNjc3OjIwODAsMjE0NzQ4MzY3ODoxMzExMDQsMjE0NzQ4MzY3OToxMzQzNTA4NDh9XSxjPVs0MTYwNzQ5NTY5LDUyODQ4MjMwNCwzMzAzMDE0NCwyMDY0Mzg0LDEyOTAyNCw4MDY0LDUwNCwyMTQ3NDgzNjc5XSxoPWYuREVTPXMuZXh0ZW5kKHtfZG9SZXNldDpmdW5jdGlvbigpe2Zvcih2YXIgQj10aGlzLl9rZXksdj1CLndvcmRzLGQ9W10sZz0wO2c8NTY7ZysrKXt2YXIgbT11W2ddLTE7ZFtnXT12W20+Pj41XT4+PjMxLW0lMzImMX1mb3IodmFyIEE9dGhpcy5fc3ViS2V5cz1bXSxrPTA7azwxNjtrKyspe2Zvcih2YXIgQz1BW2tdPVtdLEk9eFtrXSxnPTA7ZzwyNDtnKyspQ1tnLzZ8MF18PWRbKG9bZ10tMStJKSUyOF08PDMxLWclNixDWzQrKGcvNnwwKV18PWRbMjgrKG9bZysyNF0tMStJKSUyOF08PDMxLWclNjtDWzBdPUNbMF08PDF8Q1swXT4+PjMxO2Zvcih2YXIgZz0xO2c8NztnKyspQ1tnXT1DW2ddPj4+KGctMSkqNCszO0NbN109Q1s3XTw8NXxDWzddPj4+Mjd9Zm9yKHZhciB3PXRoaXMuX2ludlN1YktleXM9W10sZz0wO2c8MTY7ZysrKXdbZ109QVsxNS1nXX0sZW5jcnlwdEJsb2NrOmZ1bmN0aW9uKEIsdil7dGhpcy5fZG9DcnlwdEJsb2NrKEIsdix0aGlzLl9zdWJLZXlzKX0sZGVjcnlwdEJsb2NrOmZ1bmN0aW9uKEIsdil7dGhpcy5fZG9DcnlwdEJsb2NrKEIsdix0aGlzLl9pbnZTdWJLZXlzKX0sX2RvQ3J5cHRCbG9jazpmdW5jdGlvbihCLHYsZCl7dGhpcy5fbEJsb2NrPUJbdl0sdGhpcy5fckJsb2NrPUJbdisxXSxsLmNhbGwodGhpcyw0LDI1MjY0NTEzNSksbC5jYWxsKHRoaXMsMTYsNjU1MzUpLF8uY2FsbCh0aGlzLDIsODU4OTkzNDU5KSxfLmNhbGwodGhpcyw4LDE2NzExOTM1KSxsLmNhbGwodGhpcywxLDE0MzE2NTU3NjUpO2Zvcih2YXIgZz0wO2c8MTY7ZysrKXtmb3IodmFyIG09ZFtnXSxBPXRoaXMuX2xCbG9jayxrPXRoaXMuX3JCbG9jayxDPTAsST0wO0k8ODtJKyspQ3w9cFtJXVsoKGtebVtJXSkmY1tJXSk+Pj4wXTt0aGlzLl9sQmxvY2s9ayx0aGlzLl9yQmxvY2s9QV5DfXZhciB3PXRoaXMuX2xCbG9jazt0aGlzLl9sQmxvY2s9dGhpcy5fckJsb2NrLHRoaXMuX3JCbG9jaz13LGwuY2FsbCh0aGlzLDEsMTQzMTY1NTc2NSksXy5jYWxsKHRoaXMsOCwxNjcxMTkzNSksXy5jYWxsKHRoaXMsMiw4NTg5OTM0NTkpLGwuY2FsbCh0aGlzLDE2LDY1NTM1KSxsLmNhbGwodGhpcyw0LDI1MjY0NTEzNSksQlt2XT10aGlzLl9sQmxvY2ssQlt2KzFdPXRoaXMuX3JCbG9ja30sa2V5U2l6ZTo2NC8zMixpdlNpemU6NjQvMzIsYmxvY2tTaXplOjY0LzMyfSk7ZnVuY3Rpb24gbChCLHYpe3ZhciBkPSh0aGlzLl9sQmxvY2s+Pj5CXnRoaXMuX3JCbG9jaykmdjt0aGlzLl9yQmxvY2tePWQsdGhpcy5fbEJsb2NrXj1kPDxCfWZ1bmN0aW9uIF8oQix2KXt2YXIgZD0odGhpcy5fckJsb2NrPj4+Ql50aGlzLl9sQmxvY2spJnY7dGhpcy5fbEJsb2NrXj1kLHRoaXMuX3JCbG9ja149ZDw8Qn1uLkRFUz1zLl9jcmVhdGVIZWxwZXIoaCk7dmFyIHk9Zi5UcmlwbGVERVM9cy5leHRlbmQoe19kb1Jlc2V0OmZ1bmN0aW9uKCl7dmFyIEI9dGhpcy5fa2V5LHY9Qi53b3JkcztpZih2Lmxlbmd0aCE9PTImJnYubGVuZ3RoIT09NCYmdi5sZW5ndGg8Nil0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQga2V5IGxlbmd0aCAtIDNERVMgcmVxdWlyZXMgdGhlIGtleSBsZW5ndGggdG8gYmUgNjQsIDEyOCwgMTkyIG9yID4xOTIuIik7dmFyIGQ9di5zbGljZSgwLDIpLGc9di5sZW5ndGg8ND92LnNsaWNlKDAsMik6di5zbGljZSgyLDQpLG09di5sZW5ndGg8Nj92LnNsaWNlKDAsMik6di5zbGljZSg0LDYpO3RoaXMuX2RlczE9aC5jcmVhdGVFbmNyeXB0b3IoYS5jcmVhdGUoZCkpLHRoaXMuX2RlczI9aC5jcmVhdGVFbmNyeXB0b3IoYS5jcmVhdGUoZykpLHRoaXMuX2RlczM9aC5jcmVhdGVFbmNyeXB0b3IoYS5jcmVhdGUobSkpfSxlbmNyeXB0QmxvY2s6ZnVuY3Rpb24oQix2KXt0aGlzLl9kZXMxLmVuY3J5cHRCbG9jayhCLHYpLHRoaXMuX2RlczIuZGVjcnlwdEJsb2NrKEIsdiksdGhpcy5fZGVzMy5lbmNyeXB0QmxvY2soQix2KX0sZGVjcnlwdEJsb2NrOmZ1bmN0aW9uKEIsdil7dGhpcy5fZGVzMy5kZWNyeXB0QmxvY2soQix2KSx0aGlzLl9kZXMyLmVuY3J5cHRCbG9jayhCLHYpLHRoaXMuX2RlczEuZGVjcnlwdEJsb2NrKEIsdil9LGtleVNpemU6MTkyLzMyLGl2U2l6ZTo2NC8zMixibG9ja1NpemU6NjQvMzJ9KTtuLlRyaXBsZURFUz1zLl9jcmVhdGVIZWxwZXIoeSl9KCksci5UcmlwbGVERVN9KX0pKEpyKTt2YXIgcmU9e2V4cG9ydHM6e319OyhmdW5jdGlvbih0LGUpeyhmdW5jdGlvbihyLG4saSl7dC5leHBvcnRzPW4oWS5leHBvcnRzLGwwLmV4cG9ydHMsdjAuZXhwb3J0cyxzMC5leHBvcnRzLFouZXhwb3J0cyl9KShGLGZ1bmN0aW9uKHIpe3JldHVybiBmdW5jdGlvbigpe3ZhciBuPXIsaT1uLmxpYixhPWkuU3RyZWFtQ2lwaGVyLHM9bi5hbGdvLGY9cy5SQzQ9YS5leHRlbmQoe19kb1Jlc2V0OmZ1bmN0aW9uKCl7Zm9yKHZhciB4PXRoaXMuX2tleSxwPXgud29yZHMsYz14LnNpZ0J5dGVzLGg9dGhpcy5fUz1bXSxsPTA7bDwyNTY7bCsrKWhbbF09bDtmb3IodmFyIGw9MCxfPTA7bDwyNTY7bCsrKXt2YXIgeT1sJWMsQj1wW3k+Pj4yXT4+PjI0LXklNCo4JjI1NTtfPShfK2hbbF0rQiklMjU2O3ZhciB2PWhbbF07aFtsXT1oW19dLGhbX109dn10aGlzLl9pPXRoaXMuX2o9MH0sX2RvUHJvY2Vzc0Jsb2NrOmZ1bmN0aW9uKHgscCl7eFtwXV49dS5jYWxsKHRoaXMpfSxrZXlTaXplOjI1Ni8zMixpdlNpemU6MH0pO2Z1bmN0aW9uIHUoKXtmb3IodmFyIHg9dGhpcy5fUyxwPXRoaXMuX2ksYz10aGlzLl9qLGg9MCxsPTA7bDw0O2wrKyl7cD0ocCsxKSUyNTYsYz0oYyt4W3BdKSUyNTY7dmFyIF89eFtwXTt4W3BdPXhbY10seFtjXT1fLGh8PXhbKHhbcF0reFtjXSklMjU2XTw8MjQtbCo4fXJldHVybiB0aGlzLl9pPXAsdGhpcy5faj1jLGh9bi5SQzQ9YS5fY3JlYXRlSGVscGVyKGYpO3ZhciBvPXMuUkM0RHJvcD1mLmV4dGVuZCh7Y2ZnOmYuY2ZnLmV4dGVuZCh7ZHJvcDoxOTJ9KSxfZG9SZXNldDpmdW5jdGlvbigpe2YuX2RvUmVzZXQuY2FsbCh0aGlzKTtmb3IodmFyIHg9dGhpcy5jZmcuZHJvcDt4PjA7eC0tKXUuY2FsbCh0aGlzKX19KTtuLlJDNERyb3A9YS5fY3JlYXRlSGVscGVyKG8pfSgpLHIuUkM0fSl9KShyZSk7dmFyIGVlPXtleHBvcnRzOnt9fTsoZnVuY3Rpb24odCxlKXsoZnVuY3Rpb24ocixuLGkpe3QuZXhwb3J0cz1uKFkuZXhwb3J0cyxsMC5leHBvcnRzLHYwLmV4cG9ydHMsczAuZXhwb3J0cyxaLmV4cG9ydHMpfSkoRixmdW5jdGlvbihyKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbj1yLGk9bi5saWIsYT1pLlN0cmVhbUNpcGhlcixzPW4uYWxnbyxmPVtdLHU9W10sbz1bXSx4PXMuUmFiYml0PWEuZXh0ZW5kKHtfZG9SZXNldDpmdW5jdGlvbigpe2Zvcih2YXIgYz10aGlzLl9rZXkud29yZHMsaD10aGlzLmNmZy5pdixsPTA7bDw0O2wrKyljW2xdPShjW2xdPDw4fGNbbF0+Pj4yNCkmMTY3MTE5MzV8KGNbbF08PDI0fGNbbF0+Pj44KSY0Mjc4MjU1MzYwO3ZhciBfPXRoaXMuX1g9W2NbMF0sY1szXTw8MTZ8Y1syXT4+PjE2LGNbMV0sY1swXTw8MTZ8Y1szXT4+PjE2LGNbMl0sY1sxXTw8MTZ8Y1swXT4+PjE2LGNbM10sY1syXTw8MTZ8Y1sxXT4+PjE2XSx5PXRoaXMuX0M9W2NbMl08PDE2fGNbMl0+Pj4xNixjWzBdJjQyOTQ5MDE3NjB8Y1sxXSY2NTUzNSxjWzNdPDwxNnxjWzNdPj4+MTYsY1sxXSY0Mjk0OTAxNzYwfGNbMl0mNjU1MzUsY1swXTw8MTZ8Y1swXT4+PjE2LGNbMl0mNDI5NDkwMTc2MHxjWzNdJjY1NTM1LGNbMV08PDE2fGNbMV0+Pj4xNixjWzNdJjQyOTQ5MDE3NjB8Y1swXSY2NTUzNV07dGhpcy5fYj0wO2Zvcih2YXIgbD0wO2w8NDtsKyspcC5jYWxsKHRoaXMpO2Zvcih2YXIgbD0wO2w8ODtsKyspeVtsXV49X1tsKzQmN107aWYoaCl7dmFyIEI9aC53b3Jkcyx2PUJbMF0sZD1CWzFdLGc9KHY8PDh8dj4+PjI0KSYxNjcxMTkzNXwodjw8MjR8dj4+PjgpJjQyNzgyNTUzNjAsbT0oZDw8OHxkPj4+MjQpJjE2NzExOTM1fChkPDwyNHxkPj4+OCkmNDI3ODI1NTM2MCxBPWc+Pj4xNnxtJjQyOTQ5MDE3NjAsaz1tPDwxNnxnJjY1NTM1O3lbMF1ePWcseVsxXV49QSx5WzJdXj1tLHlbM11ePWsseVs0XV49Zyx5WzVdXj1BLHlbNl1ePW0seVs3XV49aztmb3IodmFyIGw9MDtsPDQ7bCsrKXAuY2FsbCh0aGlzKX19LF9kb1Byb2Nlc3NCbG9jazpmdW5jdGlvbihjLGgpe3ZhciBsPXRoaXMuX1g7cC5jYWxsKHRoaXMpLGZbMF09bFswXV5sWzVdPj4+MTZebFszXTw8MTYsZlsxXT1sWzJdXmxbN10+Pj4xNl5sWzVdPDwxNixmWzJdPWxbNF1ebFsxXT4+PjE2XmxbN108PDE2LGZbM109bFs2XV5sWzNdPj4+MTZebFsxXTw8MTY7Zm9yKHZhciBfPTA7Xzw0O18rKylmW19dPShmW19dPDw4fGZbX10+Pj4yNCkmMTY3MTE5MzV8KGZbX108PDI0fGZbX10+Pj44KSY0Mjc4MjU1MzYwLGNbaCtfXV49ZltfXX0sYmxvY2tTaXplOjEyOC8zMixpdlNpemU6NjQvMzJ9KTtmdW5jdGlvbiBwKCl7Zm9yKHZhciBjPXRoaXMuX1gsaD10aGlzLl9DLGw9MDtsPDg7bCsrKXVbbF09aFtsXTtoWzBdPWhbMF0rMTI5NTMwNzU5Nyt0aGlzLl9ifDAsaFsxXT1oWzFdKzM1NDUwNTIzNzErKGhbMF0+Pj4wPHVbMF0+Pj4wPzE6MCl8MCxoWzJdPWhbMl0rODg2MjYzMDkyKyhoWzFdPj4+MDx1WzFdPj4+MD8xOjApfDAsaFszXT1oWzNdKzEyOTUzMDc1OTcrKGhbMl0+Pj4wPHVbMl0+Pj4wPzE6MCl8MCxoWzRdPWhbNF0rMzU0NTA1MjM3MSsoaFszXT4+PjA8dVszXT4+PjA/MTowKXwwLGhbNV09aFs1XSs4ODYyNjMwOTIrKGhbNF0+Pj4wPHVbNF0+Pj4wPzE6MCl8MCxoWzZdPWhbNl0rMTI5NTMwNzU5NysoaFs1XT4+PjA8dVs1XT4+PjA/MTowKXwwLGhbN109aFs3XSszNTQ1MDUyMzcxKyhoWzZdPj4+MDx1WzZdPj4+MD8xOjApfDAsdGhpcy5fYj1oWzddPj4+MDx1WzddPj4+MD8xOjA7Zm9yKHZhciBsPTA7bDw4O2wrKyl7dmFyIF89Y1tsXStoW2xdLHk9XyY2NTUzNSxCPV8+Pj4xNix2PSgoeSp5Pj4+MTcpK3kqQj4+PjE1KStCKkIsZD0oKF8mNDI5NDkwMTc2MCkqX3wwKSsoKF8mNjU1MzUpKl98MCk7b1tsXT12XmR9Y1swXT1vWzBdKyhvWzddPDwxNnxvWzddPj4+MTYpKyhvWzZdPDwxNnxvWzZdPj4+MTYpfDAsY1sxXT1vWzFdKyhvWzBdPDw4fG9bMF0+Pj4yNCkrb1s3XXwwLGNbMl09b1syXSsob1sxXTw8MTZ8b1sxXT4+PjE2KSsob1swXTw8MTZ8b1swXT4+PjE2KXwwLGNbM109b1szXSsob1syXTw8OHxvWzJdPj4+MjQpK29bMV18MCxjWzRdPW9bNF0rKG9bM108PDE2fG9bM10+Pj4xNikrKG9bMl08PDE2fG9bMl0+Pj4xNil8MCxjWzVdPW9bNV0rKG9bNF08PDh8b1s0XT4+PjI0KStvWzNdfDAsY1s2XT1vWzZdKyhvWzVdPDwxNnxvWzVdPj4+MTYpKyhvWzRdPDwxNnxvWzRdPj4+MTYpfDAsY1s3XT1vWzddKyhvWzZdPDw4fG9bNl0+Pj4yNCkrb1s1XXwwfW4uUmFiYml0PWEuX2NyZWF0ZUhlbHBlcih4KX0oKSxyLlJhYmJpdH0pfSkoZWUpO3ZhciB0ZT17ZXhwb3J0czp7fX07KGZ1bmN0aW9uKHQsZSl7KGZ1bmN0aW9uKHIsbixpKXt0LmV4cG9ydHM9bihZLmV4cG9ydHMsbDAuZXhwb3J0cyx2MC5leHBvcnRzLHMwLmV4cG9ydHMsWi5leHBvcnRzKX0pKEYsZnVuY3Rpb24ocil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG49cixpPW4ubGliLGE9aS5TdHJlYW1DaXBoZXIscz1uLmFsZ28sZj1bXSx1PVtdLG89W10seD1zLlJhYmJpdExlZ2FjeT1hLmV4dGVuZCh7X2RvUmVzZXQ6ZnVuY3Rpb24oKXt2YXIgYz10aGlzLl9rZXkud29yZHMsaD10aGlzLmNmZy5pdixsPXRoaXMuX1g9W2NbMF0sY1szXTw8MTZ8Y1syXT4+PjE2LGNbMV0sY1swXTw8MTZ8Y1szXT4+PjE2LGNbMl0sY1sxXTw8MTZ8Y1swXT4+PjE2LGNbM10sY1syXTw8MTZ8Y1sxXT4+PjE2XSxfPXRoaXMuX0M9W2NbMl08PDE2fGNbMl0+Pj4xNixjWzBdJjQyOTQ5MDE3NjB8Y1sxXSY2NTUzNSxjWzNdPDwxNnxjWzNdPj4+MTYsY1sxXSY0Mjk0OTAxNzYwfGNbMl0mNjU1MzUsY1swXTw8MTZ8Y1swXT4+PjE2LGNbMl0mNDI5NDkwMTc2MHxjWzNdJjY1NTM1LGNbMV08PDE2fGNbMV0+Pj4xNixjWzNdJjQyOTQ5MDE3NjB8Y1swXSY2NTUzNV07dGhpcy5fYj0wO2Zvcih2YXIgeT0wO3k8NDt5KyspcC5jYWxsKHRoaXMpO2Zvcih2YXIgeT0wO3k8ODt5KyspX1t5XV49bFt5KzQmN107aWYoaCl7dmFyIEI9aC53b3Jkcyx2PUJbMF0sZD1CWzFdLGc9KHY8PDh8dj4+PjI0KSYxNjcxMTkzNXwodjw8MjR8dj4+PjgpJjQyNzgyNTUzNjAsbT0oZDw8OHxkPj4+MjQpJjE2NzExOTM1fChkPDwyNHxkPj4+OCkmNDI3ODI1NTM2MCxBPWc+Pj4xNnxtJjQyOTQ5MDE3NjAsaz1tPDwxNnxnJjY1NTM1O19bMF1ePWcsX1sxXV49QSxfWzJdXj1tLF9bM11ePWssX1s0XV49ZyxfWzVdXj1BLF9bNl1ePW0sX1s3XV49aztmb3IodmFyIHk9MDt5PDQ7eSsrKXAuY2FsbCh0aGlzKX19LF9kb1Byb2Nlc3NCbG9jazpmdW5jdGlvbihjLGgpe3ZhciBsPXRoaXMuX1g7cC5jYWxsKHRoaXMpLGZbMF09bFswXV5sWzVdPj4+MTZebFszXTw8MTYsZlsxXT1sWzJdXmxbN10+Pj4xNl5sWzVdPDwxNixmWzJdPWxbNF1ebFsxXT4+PjE2XmxbN108PDE2LGZbM109bFs2XV5sWzNdPj4+MTZebFsxXTw8MTY7Zm9yKHZhciBfPTA7Xzw0O18rKylmW19dPShmW19dPDw4fGZbX10+Pj4yNCkmMTY3MTE5MzV8KGZbX108PDI0fGZbX10+Pj44KSY0Mjc4MjU1MzYwLGNbaCtfXV49ZltfXX0sYmxvY2tTaXplOjEyOC8zMixpdlNpemU6NjQvMzJ9KTtmdW5jdGlvbiBwKCl7Zm9yKHZhciBjPXRoaXMuX1gsaD10aGlzLl9DLGw9MDtsPDg7bCsrKXVbbF09aFtsXTtoWzBdPWhbMF0rMTI5NTMwNzU5Nyt0aGlzLl9ifDAsaFsxXT1oWzFdKzM1NDUwNTIzNzErKGhbMF0+Pj4wPHVbMF0+Pj4wPzE6MCl8MCxoWzJdPWhbMl0rODg2MjYzMDkyKyhoWzFdPj4+MDx1WzFdPj4+MD8xOjApfDAsaFszXT1oWzNdKzEyOTUzMDc1OTcrKGhbMl0+Pj4wPHVbMl0+Pj4wPzE6MCl8MCxoWzRdPWhbNF0rMzU0NTA1MjM3MSsoaFszXT4+PjA8dVszXT4+PjA/MTowKXwwLGhbNV09aFs1XSs4ODYyNjMwOTIrKGhbNF0+Pj4wPHVbNF0+Pj4wPzE6MCl8MCxoWzZdPWhbNl0rMTI5NTMwNzU5NysoaFs1XT4+PjA8dVs1XT4+PjA/MTowKXwwLGhbN109aFs3XSszNTQ1MDUyMzcxKyhoWzZdPj4+MDx1WzZdPj4+MD8xOjApfDAsdGhpcy5fYj1oWzddPj4+MDx1WzddPj4+MD8xOjA7Zm9yKHZhciBsPTA7bDw4O2wrKyl7dmFyIF89Y1tsXStoW2xdLHk9XyY2NTUzNSxCPV8+Pj4xNix2PSgoeSp5Pj4+MTcpK3kqQj4+PjE1KStCKkIsZD0oKF8mNDI5NDkwMTc2MCkqX3wwKSsoKF8mNjU1MzUpKl98MCk7b1tsXT12XmR9Y1swXT1vWzBdKyhvWzddPDwxNnxvWzddPj4+MTYpKyhvWzZdPDwxNnxvWzZdPj4+MTYpfDAsY1sxXT1vWzFdKyhvWzBdPDw4fG9bMF0+Pj4yNCkrb1s3XXwwLGNbMl09b1syXSsob1sxXTw8MTZ8b1sxXT4+PjE2KSsob1swXTw8MTZ8b1swXT4+PjE2KXwwLGNbM109b1szXSsob1syXTw8OHxvWzJdPj4+MjQpK29bMV18MCxjWzRdPW9bNF0rKG9bM108PDE2fG9bM10+Pj4xNikrKG9bMl08PDE2fG9bMl0+Pj4xNil8MCxjWzVdPW9bNV0rKG9bNF08PDh8b1s0XT4+PjI0KStvWzNdfDAsY1s2XT1vWzZdKyhvWzVdPDwxNnxvWzVdPj4+MTYpKyhvWzRdPDwxNnxvWzRdPj4+MTYpfDAsY1s3XT1vWzddKyhvWzZdPDw4fG9bNl0+Pj4yNCkrb1s1XXwwfW4uUmFiYml0TGVnYWN5PWEuX2NyZWF0ZUhlbHBlcih4KX0oKSxyLlJhYmJpdExlZ2FjeX0pfSkodGUpLGZ1bmN0aW9uKHQsZSl7KGZ1bmN0aW9uKHIsbixpKXt0LmV4cG9ydHM9bihZLmV4cG9ydHMsYjAuZXhwb3J0cyxQci5leHBvcnRzLElyLmV4cG9ydHMsbDAuZXhwb3J0cyx6ci5leHBvcnRzLHYwLmV4cG9ydHMsTDAuZXhwb3J0cyxqMC5leHBvcnRzLFVyLmV4cG9ydHMsSjAuZXhwb3J0cyxMci5leHBvcnRzLEZyLmV4cG9ydHMsV3IuZXhwb3J0cyxGMC5leHBvcnRzLE5yLmV4cG9ydHMsczAuZXhwb3J0cyxaLmV4cG9ydHMsWXIuZXhwb3J0cyxNci5leHBvcnRzLE9yLmV4cG9ydHMsS3IuZXhwb3J0cyxHci5leHBvcnRzLFhyLmV4cG9ydHMscXIuZXhwb3J0cywkci5leHBvcnRzLFZyLmV4cG9ydHMsWnIuZXhwb3J0cyxRci5leHBvcnRzLGpyLmV4cG9ydHMsSnIuZXhwb3J0cyxyZS5leHBvcnRzLGVlLmV4cG9ydHMsdGUuZXhwb3J0cyl9KShGLGZ1bmN0aW9uKHIpe3JldHVybiByfSl9KERyKTt2YXIgcnI9RHIuZXhwb3J0cztjb25zdCBndD0iQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoyMzQ1NjciLHl0PXQ9PntpZih0IGluc3RhbmNlb2YgSW50OEFycmF5fHx0IGluc3RhbmNlb2YgVWludDhBcnJheXx8dCBpbnN0YW5jZW9mIFVpbnQ4Q2xhbXBlZEFycmF5KXJldHVybiBuZXcgRGF0YVZpZXcodC5idWZmZXIsdC5ieXRlT2Zmc2V0LHQuYnl0ZUxlbmd0aCk7aWYodCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKXJldHVybiBuZXcgRGF0YVZpZXcodCk7dGhyb3cgbmV3IFR5cGVFcnJvcigiRXhwZWN0ZWQgYGRhdGFgIHRvIGJlIGFuIEFycmF5QnVmZmVyLCBCdWZmZXIsIEludDhBcnJheSwgVWludDhBcnJheSBvciBVaW50OENsYW1wZWRBcnJheSIpfSx3dD0odCxlKT0+e2NvbnN0IHI9eXQodCk7bGV0IG49MCxpPTAsYT0iIjtmb3IobGV0IHM9MDtzPHIuYnl0ZUxlbmd0aDtzKyspZm9yKGk9aTw8OHxyLmdldFVpbnQ4KHMpLG4rPTg7bj49NTspYSs9ZVtpPj4+bi01JjMxXSxuLT01O3JldHVybiBuPjAmJihhKz1lW2k8PDUtbiYzMV0pLGF9LGJ0PSh0LGU9Z3QpPT57Y29uc3Qgcj1uZXcgQXJyYXksbj10LnNwbGl0KCIiKTtmb3IobGV0IGk9MDtpPHQubGVuZ3RoO2krPTIpci5wdXNoKHBhcnNlSW50KGAke25baV19JHtuW2krMV19YCwxNikpO3JldHVybiB3dChuZXcgVWludDhBcnJheShyKSxlKX07ZnVuY3Rpb24gQnQodCxlPSI0MCIpe2NvbnN0IHI9bmV3IFVpbnQ4QXJyYXkodCkse2luZm86bn09XzAuZGVjb2RlKHIpLGk9XzAuZW5jb2RlKG4pLGE9cnIubGliLldvcmRBcnJheS5jcmVhdGUoaSk7bGV0IHM9cnIuU0hBMShhKS50b1N0cmluZyhyci5lbmMuSGV4KTtyZXR1cm4gZT09PSIzMiImJihzPWJ0KHMpKSxzfU8wKHtkZWNvZGU6QnR9KX0pKCk7Cg==\";\nconst blob = typeof window !== \"undefined\" && window.Blob && new Blob([atob(encodedJs)], { type: \"text/javascript;charset=utf-8\" });\nfunction WorkerWrapper() {\n const objURL = blob && (window.URL || window.webkitURL).createObjectURL(blob);\n try {\n return objURL ? new Worker(objURL) : new Worker(\"data:application/javascript;base64,\" + encodedJs, { type: \"module\" });\n } finally {\n objURL && (window.URL || window.webkitURL).revokeObjectURL(objURL);\n }\n}\nconst proxyMarker = Symbol(\"Comlink.proxy\");\nconst createEndpoint = Symbol(\"Comlink.endpoint\");\nconst releaseProxy = Symbol(\"Comlink.releaseProxy\");\nconst throwMarker = Symbol(\"Comlink.thrown\");\nconst isObject = (val) => typeof val === \"object\" && val !== null || typeof val === \"function\";\nconst proxyTransferHandler = {\n canHandle: (val) => isObject(val) && val[proxyMarker],\n serialize(obj) {\n const { port1, port2 } = new MessageChannel();\n expose(obj, port1);\n return [port2, [port2]];\n },\n deserialize(port) {\n port.start();\n return wrap(port);\n }\n};\nconst throwTransferHandler = {\n canHandle: (value) => isObject(value) && throwMarker in value,\n serialize({ value }) {\n let serialized;\n if (value instanceof Error) {\n serialized = {\n isError: true,\n value: {\n message: value.message,\n name: value.name,\n stack: value.stack\n }\n };\n } else {\n serialized = { isError: false, value };\n }\n return [serialized, []];\n },\n deserialize(serialized) {\n if (serialized.isError) {\n throw Object.assign(new Error(serialized.value.message), serialized.value);\n }\n throw serialized.value;\n }\n};\nconst transferHandlers = new Map([\n [\"proxy\", proxyTransferHandler],\n [\"throw\", throwTransferHandler]\n]);\nfunction expose(obj, ep = self) {\n ep.addEventListener(\"message\", function callback(ev) {\n if (!ev || !ev.data) {\n return;\n }\n const { id, type, path } = Object.assign({ path: [] }, ev.data);\n const argumentList = (ev.data.argumentList || []).map(fromWireValue);\n let returnValue;\n try {\n const parent = path.slice(0, -1).reduce((obj2, prop) => obj2[prop], obj);\n const rawValue = path.reduce((obj2, prop) => obj2[prop], obj);\n switch (type) {\n case \"GET\":\n {\n returnValue = rawValue;\n }\n break;\n case \"SET\":\n {\n parent[path.slice(-1)[0]] = fromWireValue(ev.data.value);\n returnValue = true;\n }\n break;\n case \"APPLY\":\n {\n returnValue = rawValue.apply(parent, argumentList);\n }\n break;\n case \"CONSTRUCT\":\n {\n const value = new rawValue(...argumentList);\n returnValue = proxy(value);\n }\n break;\n case \"ENDPOINT\":\n {\n const { port1, port2 } = new MessageChannel();\n expose(obj, port2);\n returnValue = transfer(port1, [port1]);\n }\n break;\n case \"RELEASE\":\n {\n returnValue = void 0;\n }\n break;\n default:\n return;\n }\n } catch (value) {\n returnValue = { value, [throwMarker]: 0 };\n }\n Promise.resolve(returnValue).catch((value) => {\n return { value, [throwMarker]: 0 };\n }).then((returnValue2) => {\n const [wireValue, transferables] = toWireValue(returnValue2);\n ep.postMessage(Object.assign(Object.assign({}, wireValue), { id }), transferables);\n if (type === \"RELEASE\") {\n ep.removeEventListener(\"message\", callback);\n closeEndPoint(ep);\n }\n });\n });\n if (ep.start) {\n ep.start();\n }\n}\nfunction isMessagePort(endpoint) {\n return endpoint.constructor.name === \"MessagePort\";\n}\nfunction closeEndPoint(endpoint) {\n if (isMessagePort(endpoint))\n endpoint.close();\n}\nfunction wrap(ep, target) {\n return createProxy(ep, [], target);\n}\nfunction throwIfProxyReleased(isReleased) {\n if (isReleased) {\n throw new Error(\"Proxy has been released and is not useable\");\n }\n}\nfunction createProxy(ep, path = [], target = function() {\n}) {\n let isProxyReleased = false;\n const proxy2 = new Proxy(target, {\n get(_target, prop) {\n throwIfProxyReleased(isProxyReleased);\n if (prop === releaseProxy) {\n return () => {\n return requestResponseMessage(ep, {\n type: \"RELEASE\",\n path: path.map((p) => p.toString())\n }).then(() => {\n closeEndPoint(ep);\n isProxyReleased = true;\n });\n };\n }\n if (prop === \"then\") {\n if (path.length === 0) {\n return { then: () => proxy2 };\n }\n const r = requestResponseMessage(ep, {\n type: \"GET\",\n path: path.map((p) => p.toString())\n }).then(fromWireValue);\n return r.then.bind(r);\n }\n return createProxy(ep, [...path, prop]);\n },\n set(_target, prop, rawValue) {\n throwIfProxyReleased(isProxyReleased);\n const [value, transferables] = toWireValue(rawValue);\n return requestResponseMessage(ep, {\n type: \"SET\",\n path: [...path, prop].map((p) => p.toString()),\n value\n }, transferables).then(fromWireValue);\n },\n apply(_target, _thisArg, rawArgumentList) {\n throwIfProxyReleased(isProxyReleased);\n const last = path[path.length - 1];\n if (last === createEndpoint) {\n return requestResponseMessage(ep, {\n type: \"ENDPOINT\"\n }).then(fromWireValue);\n }\n if (last === \"bind\") {\n return createProxy(ep, path.slice(0, -1));\n }\n const [argumentList, transferables] = processArguments(rawArgumentList);\n return requestResponseMessage(ep, {\n type: \"APPLY\",\n path: path.map((p) => p.toString()),\n argumentList\n }, transferables).then(fromWireValue);\n },\n construct(_target, rawArgumentList) {\n throwIfProxyReleased(isProxyReleased);\n const [argumentList, transferables] = processArguments(rawArgumentList);\n return requestResponseMessage(ep, {\n type: \"CONSTRUCT\",\n path: path.map((p) => p.toString()),\n argumentList\n }, transferables).then(fromWireValue);\n }\n });\n return proxy2;\n}\nfunction myFlat(arr) {\n return Array.prototype.concat.apply([], arr);\n}\nfunction processArguments(argumentList) {\n const processed = argumentList.map(toWireValue);\n return [processed.map((v) => v[0]), myFlat(processed.map((v) => v[1]))];\n}\nconst transferCache = new WeakMap();\nfunction transfer(obj, transfers) {\n transferCache.set(obj, transfers);\n return obj;\n}\nfunction proxy(obj) {\n return Object.assign(obj, { [proxyMarker]: true });\n}\nfunction toWireValue(value) {\n for (const [name, handler] of transferHandlers) {\n if (handler.canHandle(value)) {\n const [serializedValue, transferables] = handler.serialize(value);\n return [\n {\n type: \"HANDLER\",\n name,\n value: serializedValue\n },\n transferables\n ];\n }\n }\n return [\n {\n type: \"RAW\",\n value\n },\n transferCache.get(value) || []\n ];\n}\nfunction fromWireValue(value) {\n switch (value.type) {\n case \"HANDLER\":\n return transferHandlers.get(value.name).deserialize(value.value);\n case \"RAW\":\n return value.value;\n }\n}\nfunction requestResponseMessage(ep, msg, transfers) {\n return new Promise((resolve) => {\n const id = generateUUID();\n ep.addEventListener(\"message\", function l(ev) {\n if (!ev.data || !ev.data.id || ev.data.id !== id) {\n return;\n }\n ep.removeEventListener(\"message\", l);\n resolve(ev.data);\n });\n if (ep.start) {\n ep.start();\n }\n ep.postMessage(Object.assign({ id }, msg), transfers);\n });\n}\nfunction generateUUID() {\n return new Array(4).fill(0).map(() => Math.floor(Math.random() * Number.MAX_SAFE_INTEGER).toString(16)).join(\"-\");\n}\nasync function decode(buf, codeType = \"40\") {\n const Worker2 = new WorkerWrapper();\n const decodeWrap = wrap(Worker2);\n let result = await decodeWrap.decode(buf, codeType);\n return `magnet:?xt=urn:btih:${result}`;\n}\nexport { decode as default };\n","// const ed2kPrefix = 'ed2k://'\nconst magnetPrefix = 'magnet:?'\n\n// 定义一个函数,输入一个字符串类型的url,返回一个字符串类型的结果\n/**\n * Trims the magnet valid URL by removing unnecessary information.\n * \n * @param url - The magnet URL to be trimmed.\n * @returns The trimmed magnet URL.\n */\nfunction trimMagnetValidUrl (url: string): string {\n let urlOut: string = url\n const magnetUrlInfo: string = url.substring(magnetPrefix.length)\n const urlInfos: string[] = magnetUrlInfo.split('&')\n for (let i = 0; i < urlInfos.length; ++i) {\n let index: number = urlInfos[i].indexOf('=')\n if (index < 0) {\n continue\n }\n const tag: string = urlInfos[i].substring(0, index)\n if (tag === 'xt' || tag.indexOf('xt.') === 0) {\n const tagValue = 'urn:btih:'\n const tagEnd: string = urlInfos[i].substring(index + 1, index + 1 + tagValue.length)\n if (tagEnd !== tagValue) {\n break\n }\n let base32InfoHash: string = urlInfos[i].substring(index + tagValue.length + 1)\n if (base32InfoHash.length <= 32) {\n break\n }\n let reg = /[0-9,A-Z,a-z]{40}/\n if (reg.test(base32InfoHash)) {\n if (base32InfoHash.length > 40 && base32InfoHash[40] !== '&') {\n base32InfoHash = base32InfoHash.substring(0, 40)\n index = url.indexOf(base32InfoHash)\n if (index >= 0) {\n urlOut = url.substring(0, index + base32InfoHash.length)\n }\n }\n break\n } else {\n reg = /[0-9,A-Z,a-z]{32}/\n if (reg.test(base32InfoHash)) {\n if (base32InfoHash[32] !== '&') {\n base32InfoHash = base32InfoHash.substring(0, 32)\n index = url.indexOf(base32InfoHash)\n if (index >= 0) {\n urlOut = url.substring(0, index + base32InfoHash.length)\n }\n }\n break\n }\n }\n }\n }\n return urlOut\n}\n\n/**\n * 对下载链接进行修复,去除可能的多余部分\n * @param url \n * @returns \n */\nexport const fixLink = (url: string) => {\n if (url.indexOf(magnetPrefix) === 0) {\n return trimMagnetValidUrl(url)\n }\n return url\n}","import \"core-js/modules/es.array.reduce.js\";\nimport { defineComponent as _defineComponent } from 'vue';\nimport { unref as _unref, createElementVNode as _createElementVNode, normalizeClass as _normalizeClass, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, vModelText as _vModelText, withDirectives as _withDirectives, withModifiers as _withModifiers, vShow as _vShow, createTextVNode as _createTextVNode, toDisplayString as _toDisplayString, createVNode as _createVNode, createBlock as _createBlock } from \"vue\";\nconst _hoisted_1 = {\n class: \"file-upload is-light\"\n};\nconst _hoisted_2 = /*#__PURE__*/_createElementVNode(\"h1\", null, \"添加下载链接\", -1);\nconst _hoisted_3 = {\n class: \"file-upload__body\"\n};\nconst _hoisted_4 = {\n class: \"textarea\"\n};\nconst _hoisted_5 = /*#__PURE__*/_createElementVNode(\"a\", {\n href: \"javascript:;\",\n class: \"qh-icon-add\"\n}, null, -1);\nconst _hoisted_6 = {\n class: \"bt-file-menu\"\n};\nconst _hoisted_7 = {\n key: 1,\n class: \"textarea__tips\"\n};\nconst _hoisted_8 = {\n key: 1,\n class: \"detect-compatibility\"\n};\nconst _hoisted_9 = /*#__PURE__*/_createElementVNode(\"span\", null, \"当前设备\", -1);\nconst _hoisted_10 = {\n class: \"cover\"\n};\nconst _hoisted_11 = {\n class: \"pop-loading\"\n};\nconst _hoisted_12 = /*#__PURE__*/_createElementVNode(\"i\", {\n class: \"qh-icon-loading\"\n}, null, -1);\nconst _hoisted_13 = /*#__PURE__*/_createElementVNode(\"p\", null, \"正在解析中\", -1);\nconst _hoisted_14 = [\"src\"];\nimport { ref, computed, onMounted, watch } from 'vue';\nimport { checkValidLink, bytesToSize, getThunderLink, newToast } from '@remote/utils';\nimport { isIOS, MAX_URL_ADD_NUM } from '@remote/constant';\n// import { TaskFileTree } from '@remote/type'\nimport PathChoicePop from '@remote/components/PathChoicePop.vue';\nimport '@remote/assets/css/upload.scss';\nimport copy from 'clipboard-copy';\nimport BTDecode from '@xunlei/bencode-worker';\nimport { IconPageLeft } from '@xunlei/thunder-icon-vue';\nimport DeviceIndicator from '@remote/components/DeviceIndicator.vue';\nimport { openDeviceList, openDialogCommon, openPopBTChoiceNew, openPopMenu, openPopSelectFile } from '@remote/utils/dialog';\nimport { store } from '@remote/store';\nimport router from '@remote/router';\nimport { stat } from '@remote/utils/stat';\nimport { useEnvStore } from '@remote/store/env';\nimport { useDeviceStore } from '@remote/store/device';\nimport { fixLink } from '@shared/utils/download';\nimport { isAndroidNative, isIOSNative, sleep } from '@xunlei/universal-native-api';\nimport { useToggle } from '@shared/composable/base';\nimport Shortcut from '@remote/assets/img/shortcut.png';\nimport { platformPath } from '@remote/platform';\n// data\nexport default /*#__PURE__*/_defineComponent({\n __name: 'index',\n setup(__props) {\n const uploadUrls = ref('');\n const error = ref('');\n const isLoading = ref(false);\n const isSupportBEncode = ref(true);\n const urls = ref([]);\n const hasTaskLink = ref(false);\n const uploadInput = ref(null);\n const envStore = useEnvStore();\n const errorHint = {\n LIMIT_EXCEED: `最多支持同时添加${MAX_URL_ADD_NUM}个链接`,\n INVALID_LINK: '请输入正确的链接地址',\n OPERATION_FAILED: '操作未成功,请稍后重试',\n INVALID_BT: '请选择正确的bt文件'\n };\n // computed\n const createFrom = computed(() => {\n return store.state.createFrom;\n });\n const visiblePathChoose = computed(() => {\n return store.state.visiblePathChoose;\n });\n const curDeviceRunner = computed(() => {\n return store.state.curDeviceRunner;\n });\n const pathFolderName = computed(() => {\n return store.state.pathFolderName;\n });\n const runnerPath = computed(() => {\n return store.getters.runnerPath;\n });\n const isVip = computed(() => {\n return store.getters.isVip;\n });\n const showHeader = computed(() => {\n return store.getters.showHeader;\n });\n // watch接口返回的downloads字段\n const downloadsPath = computed(() => {\n var _store$state$deviceIn, _store$state$deviceIn2;\n return (_store$state$deviceIn = (_store$state$deviceIn2 = store.state.deviceInfoWatchData) === null || _store$state$deviceIn2 === void 0 ? void 0 : _store$state$deviceIn2.downloads) !== null && _store$state$deviceIn !== void 0 ? _store$state$deviceIn : [];\n });\n const currentDownloadPath = computed(() => {\n let realPath = '';\n if (pathFolderName.value) {\n // 手动选择的路径\n realPath = pathFolderName.value;\n } else {\n // 默认路径\n realPath = runnerPath.value.path;\n }\n return realPath;\n });\n const showUploadBT = computed(() => {\n var _curDeviceRunner$valu;\n if (!((_curDeviceRunner$valu = curDeviceRunner.value) !== null && _curDeviceRunner$valu !== void 0 && (_curDeviceRunner$valu = _curDeviceRunner$valu.params) !== null && _curDeviceRunner$valu !== void 0 && _curDeviceRunner$valu.platform)) {\n return false;\n }\n return true;\n // return UploadBTPlatforms.includes(curDeviceRunner.value?.params?.platform)\n });\n /**\n * 目标下载路径,对diskList中的path进行匹配\n */\n const targetDownloadPathDiskSpace = computed(() => {\n const path = currentDownloadPath.value;\n const matchPath = downloadsPath.value.filter(i => typeof i.path === 'string') // for robust\n .filter(i => path.indexOf(i.path) > -1);\n if (matchPath.length === 0) {\n return downloadsPath.value[0]; // 兜底\n }\n\n const maximumMatchPath = matchPath.reduce((prev, curr) => {\n return prev.path.length > curr.path.length ? prev : curr; // 上面matchPath的逻辑保证了这里的值一定不会是undefined\n });\n\n return maximumMatchPath;\n });\n const diskLeftSize = computed(() => {\n var _targetDownloadPathDi, _targetDownloadPathDi2, _targetDownloadPathDi3, _targetDownloadPathDi4;\n return ((_targetDownloadPathDi = (_targetDownloadPathDi2 = targetDownloadPathDiskSpace.value) === null || _targetDownloadPathDi2 === void 0 ? void 0 : _targetDownloadPathDi2.limit) !== null && _targetDownloadPathDi !== void 0 ? _targetDownloadPathDi : 0) - ((_targetDownloadPathDi3 = (_targetDownloadPathDi4 = targetDownloadPathDiskSpace.value) === null || _targetDownloadPathDi4 === void 0 ? void 0 : _targetDownloadPathDi4.usage) !== null && _targetDownloadPathDi3 !== void 0 ? _targetDownloadPathDi3 : 0);\n });\n // methods\n const onDeviceListClick = async () => {\n stat({\n action: 'addurl_change_device_button_click'\n });\n await openDeviceList({\n canRemoveDevice: false,\n actionFrom: 'addurl_panel'\n });\n };\n const {\n is: isBTFileMenuShow,\n toggle: toggleBTFileMenuShow\n } = useToggle({\n defaultIs: false\n });\n const BTMenuShowHandler = () => {\n toggleBTFileMenuShow(false);\n document.removeEventListener('click', BTMenuShowHandler);\n };\n watch(isBTFileMenuShow, val => {\n if (val) {\n setTimeout(() => {\n document.addEventListener('click', BTMenuShowHandler);\n }, 0);\n }\n });\n const deviceStore = useDeviceStore();\n const handleUploadBT = () => {\n if (!isSupportBEncode.value) {\n newToast({\n type: 'error',\n message: '当前浏览器版本过低,无法使用本地BT文件解析功能'\n });\n return;\n }\n if (uploadInput.value) {\n uploadInput.value.click();\n }\n };\n /**\n * Taken from\n * https://stackoverflow.com/questions/62954570/javascript-feature-detect-module-support-for-web-workers\n * The WorkerType enum can only be one of \"classic\" or \"module\".\n * If an implementation checks this param it's because they support module.\n */\n const checkWebWorkerCompatibility = () => {\n let supports = false;\n const tester = {\n // @ts-ignore\n get type() {\n supports = true;\n }\n };\n try {\n // We use \"blob://\" as url to avoid an useless network request.\n // This will either throw in Chrome\n // either fire an error event in Firefox\n // which is perfect since\n // we don't need the worker to actually start,\n // checking for the type of the script is done before trying to load it.\n // @ts-ignore\n const worker = new Worker('blob://', tester);\n } finally {\n // eslint-disable-next-line no-unsafe-finally\n return supports;\n }\n };\n const handleBack = () => {\n // console.log('====== handleBack')\n // 因为有参数删除,back又会把参数带上\n router.replace({\n path: '/home/',\n query: router.currentRoute.value.query\n });\n uploadUrls.value = '';\n };\n const isDownloadAvailable = computed(() => {\n return store.getters.isDownloadAvailable;\n });\n const download = async taskParams => {\n try {\n for (const param of taskParams !== null && taskParams !== void 0 ? taskParams : []) {\n var _deviceStore$currentD;\n (_deviceStore$currentD = deviceStore.currentDeviceRef) === null || _deviceStore$currentD === void 0 ? void 0 : _deviceStore$currentD.deviceFetch('drive/v1/task', {\n method: 'POST',\n data: {\n ...param\n }\n });\n }\n } catch (error) {\n if (error.error === 'task_daily_create_limit' && store.getters.showVip) {\n store.commit('pop', {\n show: true,\n title: '今日下载额度已用完',\n tip: '非会员每日可免费创建3个下载任务,会员不限任务数(白金/超会均可)',\n okTxt: '开通会员',\n type: 'vip'\n });\n } else {\n store.commit('toast', error.error_description || '创建任务失败');\n }\n return;\n }\n store.commit('update', {\n taskType: 'ing'\n });\n newToast({\n type: 'success',\n message: '任务创建成功'\n });\n setTimeout(() => store.dispatch('getTasks', {\n isReplay: true\n }), 2000);\n if ((taskParams !== null && taskParams !== void 0 ? taskParams : []).length >= 1) {\n // console.log('handleBack')\n setTimeout(() => {\n handleBack();\n }, 500);\n }\n };\n const viewDuplicateTasks = async taskItem => {\n const taskType = taskItem.phase === 'PHASE_TYPE_COMPLETE' ? 'done' : 'ing';\n // 切换到对应的tab和选中对应任务\n store.commit('update', {\n selects: [],\n taskType\n });\n // 拉取新的任务列表\n store.dispatch('getTasks');\n // 回到home\n // console.log('====== viewDuplicateTasks back')\n await sleep(500);\n router.back();\n setTimeout(() => {\n // console.log('====== viewDuplicateTasks replace')\n router.replace({\n name: 'home',\n query: {\n ...router.currentRoute.value.query\n }\n });\n }, 500);\n };\n /**\n * 检查是否为重复任务\n * @param existedTask 已存在的任务\n * @param newTasks 新任务\n * @returns {boolean} false为不重复/继续创建下载任务; true为中断流程\n */\n const checkDuplicateTask = async (existedTask, newTasks) => {\n for (const taskItem of (_existedTask$tasks = existedTask.tasks) !== null && _existedTask$tasks !== void 0 ? _existedTask$tasks : []) {\n var _existedTask$tasks;\n for (const downloadItem of newTasks !== null && newTasks !== void 0 ? newTasks : []) {\n var _taskItem$params;\n // console.log(taskItem, downloadItem, existedTask, newTasks)\n if (taskItem.name === downloadItem.file_name || ((_taskItem$params = taskItem.params) === null || _taskItem$params === void 0 ? void 0 : _taskItem$params.url) === downloadItem.params.url) {\n const res = await openDialogCommon({\n title: '任务已存在',\n body: '当前任务已存在,继续下载将创建一个新任务',\n button: [{\n text: '下载',\n value: 'download'\n }, {\n text: '查看',\n value: 'check'\n }]\n });\n // console.log('任务已存在', res)\n if ((res === null || res === void 0 ? void 0 : res.result) === 'check') {\n viewDuplicateTasks(taskItem);\n return true;\n }\n return false;\n }\n }\n }\n return false;\n };\n const checkDiskSizeAvailable = async newTasks => {\n console.log('检查磁盘空间, 新任务:', newTasks);\n const totalSize = (newTasks !== null && newTasks !== void 0 ? newTasks : []).reduce((pre, cur) => {\n return pre + cur.file_size;\n }, 0);\n // console.log('totalSize', totalSize, 'diskLeftSize', diskLeftSize.value)\n if (totalSize > diskLeftSize.value) {\n isLoading.value = false;\n await openDialogCommon({\n title: '剩余空间不足',\n body: `文件大小${bytesToSize(totalSize)},剩余空间${bytesToSize(diskLeftSize.value)}`,\n center: true,\n button: [{\n text: '我知道了',\n value: 'ok'\n }]\n });\n return false;\n }\n return true;\n };\n const beforeDownload = async taskParams => {\n let res = await store.dispatch('getTasks', {\n getAll: true\n });\n if (!res) return false;\n const ts1 = Date.now();\n console.log(`====== 点击后确认流程开始 ${ts1}`);\n const isDiskSizeAvailable = await checkDiskSizeAvailable(taskParams);\n const ts2 = Date.now();\n console.log(`====== 点击后确认流程,检查磁盘空间完成 耗时${ts2 - ts1}ms`);\n if (!isDiskSizeAvailable) return false;\n const isTaskDuplicate = await checkDuplicateTask(res, taskParams);\n const ts3 = Date.now();\n console.log(`====== 点击后确认流程,检查重复完成 耗时${ts3 - ts2}ms`);\n if (isTaskDuplicate) return false;\n download(taskParams).then(() => {\n const ts4 = Date.now();\n console.log(`====== 点击后确认流程,创建任务完成 耗时${ts4 - ts3}ms`);\n });\n return true;\n };\n const downloadList = async params => {\n return await beforeDownload(params);\n };\n const onUpload = async () => {\n if (uploadUrls.value === '') return;\n // 这里其实不该判断是否为PC,但是产品给的这个文案太过specific,所以还是判断下\n if (curDeviceRunner.value.space === 'platform#pcxllite' && !isDownloadAvailable.value) {\n await openDialogCommon({\n title: '当前设备未开启远程下载功能',\n body: '当前设备未开启远程下载功能,无法创建下载任务,请切换设备。
若需要下载至此设备,请在此设备上打开迅雷11(版本号大于11.4.1),在右上角的主菜单中找到远程下载功能并打开。',\n button: [{\n text: '我知道了',\n value: 'ok'\n }]\n });\n return;\n }\n if (hasTaskLink.value) {\n hasTaskLink.value = false;\n copy('');\n }\n stat({\n action: 'new_create_panel_click',\n data: {\n action_from: createFrom.value,\n click_id: 'download'\n }\n });\n let allUrls = uploadUrls.value.split('\\n').filter(v => v && v.length > 0);\n allUrls = Array.from(new Set(allUrls)).map(url => fixLink(url));\n let newURLs = allUrls.map(v => v && getThunderLink(v));\n newURLs = newURLs.filter(v => v && checkValidLink(v));\n // console.log('uploadUrls.value', uploadUrls.value, 'newURLs', newURLs)\n if (newURLs.length === 0) {\n return error.value = errorHint.INVALID_LINK;\n }\n if (newURLs.length > 1 && !isVip.value) {\n return store.commit('toast', '非会员暂不支持批量添加下载链接');\n }\n if (newURLs.length > MAX_URL_ADD_NUM) {\n return error.value = errorHint.LIMIT_EXCEED;\n }\n if (isLoading.value) return;\n // isLoading.value = true\n // resolveResourceTree(newURLs)\n // const res: IResourceRes = await store.dispatch('getResource', newURLs.join('\\n'))\n // // const res: IResourceRes = await getResource(newURLs.join('\\n'))\n // console.log('IResourceRes', res)\n // const tree = res.list && resolveTaskTree(res.list.resources)\n // console.log('tree, ', tree)\n // if (res && res.list) {\n // // v2.13 忽略meta中返回的错误\n // // 这个服务会查中台有没有资源索引,在下载没有索引的资源的时候会直接报错。\n // // @刘景超:应该忽略查不到索引应该也可以从源地址下载。\n // // if (res.list.resources && res.list.resources.length === 1) {\n // // const metaInfo = res.list.resources[0].meta\n // // const IGNORE_ERROR_LIST = ['407:E_SHUB_INDEX_REQ_FAIL']\n // // const IGNORE_ERROR_LIST = ['408:E_SHUB_INDEX_REQ_FAIL']\n // // if (metaInfo.error && !IGNORE_ERROR_LIST.includes(metaInfo.error)) {\n // // isLoading.value = false\n // // return (error.value = errorHint.INVALID_LINK)\n // // }\n // // }\n // const newResources = res.list.resources\n // linkStatus.value.err = allUrls.length - newResources.length\n // linkStatus.value.invalid = newResources.reduce((pre, cur) => {\n // return pre + (cur.meta.error ? 1 : 0)\n // }, 0)\n // linkStatus.value.ok = newResources.length - linkStatus.value.invalid\n // console.log('newResources', newResources)\n // console.log('linkStatus.value', linkStatus.value)\n // resources.value = newResources\n // urls.value = newURLs\n // btTree.value = tree\n urls.value = newURLs;\n const params = await openPopBTChoiceNew({\n urls: urls.value,\n afterConfirm: downloadList\n });\n };\n const triggerResolveURL = url => {\n uploadUrls.value = url;\n if (uploadInput.value) {\n uploadInput.value.value = '';\n }\n onUpload();\n };\n // TODO: 旧版本设备兼容\n const resolveBTFromDevice = async () => {\n var _file$, _deviceStore$currentD2;\n const file = await openPopSelectFile({\n title: '选择BT文件',\n needWritable: false,\n withParams: ['withCategoryDiskMountPath', 'withCategoryHistoryDownloadPath'],\n theme: 'light',\n type: 'radio',\n maxChooseCount: 1,\n filter: {\n trashed: {\n eq: false\n },\n phase: {\n eq: 'PHASE_TYPE_COMPLETE'\n },\n mime_type: {\n prefix: ['folder', 'application/x-bittorrent']\n }\n },\n needFileSource: false,\n needCreateFolder: false,\n checkboxShowCondition: file => {\n return (file === null || file === void 0 ? void 0 : file.mime_type) === 'application/x-bittorrent' || (file === null || file === void 0 ? void 0 : file.file_extension) === '.torrent';\n },\n fileMapping: file => file,\n confirmCondition: chosenFiles => {\n return chosenFiles.filter(i => {\n var _i$mime_type;\n return (_i$mime_type = i.mime_type) === null || _i$mime_type === void 0 ? void 0 : _i$mime_type.startsWith('application/x-bittorrent');\n }).length > 0;\n }\n });\n const fileID = (_file$ = file[0]) === null || _file$ === void 0 ? void 0 : _file$.id;\n if (!fileID) {\n console.log('用户取消选择,或未获取到fileID', file);\n return;\n }\n // message({\n // type: 'info',\n // message: '解析中...',\n // })\n const result = await ((_deviceStore$currentD2 = deviceStore.currentDeviceRef) === null || _deviceStore$currentD2 === void 0 ? void 0 : _deviceStore$currentD2.proxyFetch('device/btinfo', {\n method: 'POST',\n params: {\n file_id: fileID\n }\n }));\n if (!(result !== null && result !== void 0 && result.url)) {\n console.warn('解析后未获取到url', result);\n newToast({\n type: 'error',\n message: '解析失败'\n });\n return;\n }\n triggerResolveURL(result.url);\n };\n // 解析磁力链接\n const resolveBtTask = async evt => {\n console.log('收到本地BT解析事件', evt.target.files);\n let file = evt.target.files[0];\n const fileName = file.name;\n if (fileName.substring(fileName.lastIndexOf('.')) !== '.torrent') return error.value = errorHint.INVALID_BT;\n const reader = new FileReader();\n reader.readAsArrayBuffer(file);\n reader.onload = async e => {\n console.log('开始解析BT', e.target.result);\n try {\n const result = await BTDecode(e.target.result);\n console.log('BT解析结果', result);\n triggerResolveURL(result);\n } catch (error) {\n error.value = errorHint.INVALID_BT;\n }\n };\n };\n const openShortCutPage = (url = '') => {\n if (url) {\n if (isIOSNative) {\n const supportNavigatorClipboardAPI = navigator.clipboard && typeof navigator.clipboard.writeText === 'function';\n openDialogCommon({\n title: '请复制下面链接后,于浏览器中打开',\n body: url,\n center: true,\n button: [{\n text: supportNavigatorClipboardAPI ? '复制并关闭' : '关闭',\n value: 'close'\n }]\n });\n if (supportNavigatorClipboardAPI) {\n navigator.clipboard.writeText(url);\n }\n return;\n }\n window.open(url, '_blank');\n }\n };\n const addShortcut = async () => {\n const URL_ADD_TO_NAS = 'https://www.icloud.com/shortcuts/f252a33c0e384d2b9383b9fee6a117a2';\n const URL_CLIPBOARD_TO_NAS = 'https://www.icloud.com/shortcuts/23887e1de924464f8ba0696103bcacd8';\n const result = await openPopMenu({\n options: ['从链接快速添加到NAS', '从剪切板添加到NAS', '取消'],\n themeClass: 'is-light'\n });\n if (result === '从链接快速添加到NAS') {\n openShortCutPage(URL_ADD_TO_NAS);\n }\n if (result === '从剪切板添加到NAS') {\n openShortCutPage(URL_CLIPBOARD_TO_NAS);\n }\n };\n onMounted(async () => {\n document.title = '添加下载链接';\n const query = Object.assign({}, router.currentRoute.value.query);\n // console.log('routequery', query)\n if (query.taskLink) {\n if (Array.isArray(query.taskLink)) {\n uploadUrls.value = query.taskLink.join('\\n');\n } else {\n uploadUrls.value = String(query.taskLink);\n }\n delete query.taskLink;\n hasTaskLink.value = true;\n router.replace({\n query\n });\n }\n try {\n isSupportBEncode.value = checkWebWorkerCompatibility();\n } catch (error) {\n console.log(error);\n }\n stat({\n action: 'new_create_panel_show',\n data: {\n action_from: createFrom.value\n }\n });\n });\n return (_ctx, _cache) => {\n return _openBlock(), _createElementBlock(\"div\", _hoisted_1, [showHeader.value ? (_openBlock(), _createElementBlock(\"div\", {\n key: 0,\n class: _normalizeClass([\"file-upload__header page-header\", {\n 'android-padding': _unref(isAndroidNative),\n 'ios-padding': _unref(envStore).isUseIOSHeader\n }])\n }, [_createElementVNode(\"a\", {\n href: \"javascript:;\",\n class: \"qh-icon-back\",\n title: \"返回\",\n onClick: handleBack\n }), _hoisted_2], 2)) : _createCommentVNode(\"\", true), _createElementVNode(\"div\", _hoisted_3, [_createElementVNode(\"div\", _hoisted_4, [_withDirectives(_createElementVNode(\"textarea\", {\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => uploadUrls.value = $event),\n class: \"textarea__inner\",\n placeholder: \"请添加下载链接,批量链接请换行,最多支持一次添加50个链接。暂不支持本地BT文件和下载链接一起添加\",\n onInput: _cache[1] || (_cache[1] = $event => error.value = '')\n }, null, 544), [[_vModelText, uploadUrls.value]]), showUploadBT.value ? (_openBlock(), _createElementBlock(\"div\", {\n key: 0,\n class: \"textarea__upload\",\n onClick: _cache[4] || (_cache[4] = $event => _unref(toggleBTFileMenuShow)(true))\n }, [_hoisted_5, _createTextVNode(\"添加BT文件 \"), _withDirectives(_createElementVNode(\"div\", _hoisted_6, [_createElementVNode(\"ul\", null, [_createElementVNode(\"li\", {\n onClick: _cache[2] || (_cache[2] = _withModifiers($event => {\n handleUploadBT();\n _unref(toggleBTFileMenuShow)(false);\n }, [\"stop\"]))\n }, \" 从本地选择 \"), _createElementVNode(\"li\", {\n onClick: _cache[3] || (_cache[3] = _withModifiers($event => {\n resolveBTFromDevice();\n _unref(toggleBTFileMenuShow)(false);\n }, [\"stop\"]))\n }, \" 从NAS设备选择 \")])], 512), [[_vShow, _unref(isBTFileMenuShow)]])])) : _createCommentVNode(\"\", true), _createElementVNode(\"input\", {\n id: \"upload\",\n ref_key: \"uploadInput\",\n ref: uploadInput,\n class: \"textarea__input\",\n type: \"file\",\n onChange: resolveBtTask\n }, null, 544), error.value ? (_openBlock(), _createElementBlock(\"p\", _hoisted_7, _toDisplayString(error.value), 1)) : _createCommentVNode(\"\", true)])]), !isSupportBEncode.value ? (_openBlock(), _createElementBlock(\"p\", _hoisted_8, \" 检测到浏览器版本过低,添加本地BT文件功能可能无法正常使用 \")) : _createCommentVNode(\"\", true), _unref(envStore).justOne !== '1' ? (_openBlock(), _createElementBlock(\"div\", {\n key: 2,\n class: \"device-confirm\",\n onClick: onDeviceListClick\n }, [_hoisted_9, _createVNode(DeviceIndicator), _createVNode(_unref(IconPageLeft), {\n width: \"16\",\n height: \"16\"\n })])) : _createCommentVNode(\"\", true), _createElementVNode(\"a\", {\n class: _normalizeClass([\"file-upload__button\", {\n disabled: uploadUrls.value.length < 5\n }]),\n href: \"javascript:;\",\n onClick: onUpload\n }, \"确定\", 2), _withDirectives(_createElementVNode(\"div\", _hoisted_10, [_createElementVNode(\"div\", _hoisted_11, [_createElementVNode(\"i\", {\n class: \"qh-icon-close\",\n onClick: _cache[5] || (_cache[5] = $event => isLoading.value = false)\n }), _hoisted_12, _hoisted_13])], 512), [[_vShow, isLoading.value]]), visiblePathChoose.value ? (_openBlock(), _createBlock(PathChoicePop, {\n key: 3\n })) : _createCommentVNode(\"\", true), _unref(platformPath) === '' && _unref(isIOS) ? (_openBlock(), _createElementBlock(\"div\", {\n key: 4,\n class: \"add-shortcut\",\n onClick: addShortcut\n }, [_createElementVNode(\"img\", {\n src: _unref(Shortcut),\n alt: \"添加捷径\"\n }, null, 8, _hoisted_14), _createTextVNode(\" 添加快捷指令 \")])) : _createCommentVNode(\"\", true)]);\n };\n }\n});","/* unplugin-vue-components disabled */import script from \"./index.vue?vue&type=script&lang=ts&setup=true\"\nexport * from \"./index.vue?vue&type=script&lang=ts&setup=true\"\n\nimport \"./index.vue?vue&type=style&index=0&id=714ff170&lang=scss\"\n\nconst __exports__ = script;\n\nexport default __exports__","/* unplugin-vue-components disabled */export * from \"-!../../../../node_modules/.pnpm/unplugin@1.4.0/node_modules/unplugin/dist/webpack/loaders/transform.js?unpluginName=unplugin-vue-components!../../../../node_modules/.pnpm/mini-css-extract-plugin@0.9.0_webpack@4.46.0/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../node_modules/.pnpm/css-loader@3.6.0_webpack@4.46.0/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../node_modules/.pnpm/vue-loader@16.8.3_@vue+compiler-sfc@3.3.4_vue@3.3.4_webpack@4.46.0/node_modules/vue-loader/dist/stylePostLoader.js!../../../../node_modules/.pnpm/postcss-loader@3.0.0/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../node_modules/.pnpm/sass-loader@8.0.2_sass@1.65.1/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../node_modules/.pnpm/cache-loader@4.1.0_webpack@4.46.0/node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../../node_modules/.pnpm/vue-loader@16.8.3_@vue+compiler-sfc@3.3.4_vue@3.3.4_webpack@4.46.0/node_modules/vue-loader/dist/index.js??ref--1-1!./PathChoicePop.vue?vue&type=style&index=0&id=0f0b1a86&lang=scss&scoped=true\"","/* unplugin-vue-components disabled */export * from \"-!../../../../node_modules/.pnpm/unplugin@1.4.0/node_modules/unplugin/dist/webpack/loaders/transform.js?unpluginName=unplugin-vue-components!../../../../node_modules/.pnpm/mini-css-extract-plugin@0.9.0_webpack@4.46.0/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../node_modules/.pnpm/css-loader@3.6.0_webpack@4.46.0/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../node_modules/.pnpm/vue-loader@16.8.3_@vue+compiler-sfc@3.3.4_vue@3.3.4_webpack@4.46.0/node_modules/vue-loader/dist/stylePostLoader.js!../../../../node_modules/.pnpm/postcss-loader@3.0.0/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../node_modules/.pnpm/sass-loader@8.0.2_sass@1.65.1/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../node_modules/.pnpm/cache-loader@4.1.0_webpack@4.46.0/node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../../node_modules/.pnpm/vue-loader@16.8.3_@vue+compiler-sfc@3.3.4_vue@3.3.4_webpack@4.46.0/node_modules/vue-loader/dist/index.js??ref--1-1!./PathItem.vue?vue&type=style&index=0&id=0a749f22&lang=scss\""],"sourceRoot":""}