From 4b0473b928026b8ce53bdc803a2ef98f9f3a7f59 Mon Sep 17 00:00:00 2001 From: zh <972939975@qq.com> Date: Fri, 5 Sep 2025 18:41:33 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E9=9D=A2=E3=80=81=E9=9B=86?= =?UTF-8?q?=E7=BB=93=E5=9C=B0=E3=80=81=E7=AE=AD=E5=A4=B4=E3=80=81=E5=8F=8C?= =?UTF-8?q?=E7=AE=AD=E5=A4=B4=E7=BB=98=E5=88=B6=E5=92=8C=E7=BC=96=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/preload/index.d.ts | 2 + src/preload/index.ts | 4 + src/renderer/components.d.ts | 3 - src/renderer/public/sdk/YJEarth.min.js | 22 +- src/renderer/src/api/tree/index.ts | 9 +- .../src/components/dialog/baseDialog.vue | 4 +- .../src/components/dialog/directory.vue | 3 +- src/renderer/src/main.ts | 2 +- .../components/bottomSide/bottomSide.vue | 188 ++++++++- .../components/propertyBox/addGroundText.vue | 9 +- .../components/propertyBox/addStandText.vue | 9 +- .../components/propertyBox/attackArrow.vue | 368 ++++++++++++++++++ .../components/propertyBox/attribute.vue | 6 +- .../propertyBox/billboardObject.vue | 58 +-- .../propertyBox/curvelineObject.vue | 15 +- .../components/propertyBox/fontSelect.ts | 7 +- .../components/propertyBox/groundText.vue | 164 ++++++++ .../components/propertyBox/labelStyle.vue | 2 +- .../components/propertyBox/polygonObject.vue | 305 ++++++++++----- .../components/propertyBox/polylineObject.vue | 48 +-- .../views/components/propertyBox/richText.vue | 8 +- .../components/propertyBox/standText.vue | 111 +++++- .../tree/components/hooks/rightOperate.ts | 1 - .../src/views/components/tree/hooks/tree.ts | 30 +- .../src/views/components/tree/initMapData.ts | 23 +- src/renderer/src/views/home/index.vue | 33 +- 26 files changed, 1205 insertions(+), 229 deletions(-) create mode 100644 src/renderer/src/views/components/propertyBox/attackArrow.vue create mode 100644 src/renderer/src/views/components/propertyBox/groundText.vue diff --git a/src/preload/index.d.ts b/src/preload/index.d.ts index a153669..1f7b69f 100644 --- a/src/preload/index.d.ts +++ b/src/preload/index.d.ts @@ -4,5 +4,7 @@ declare global { interface Window { electron: ElectronAPI api: unknown + Cesium: any + YJColorPicker: any } } diff --git a/src/preload/index.ts b/src/preload/index.ts index 313728a..556c4d8 100644 --- a/src/preload/index.ts +++ b/src/preload/index.ts @@ -18,4 +18,8 @@ if (process.contextIsolated) { window.electron = electronAPI // @ts-ignore (define in dts) window.electronAPI = api + // @ts-ignore (define in dts) + window.Cesium = Cesium + // @ts-ignore (define in dts) + window.YJColorPicker = YJColorPicker } diff --git a/src/renderer/components.d.ts b/src/renderer/components.d.ts index 76878ff..550a35d 100644 --- a/src/renderer/components.d.ts +++ b/src/renderer/components.d.ts @@ -9,14 +9,12 @@ export {} declare module 'vue' { export interface GlobalComponents { BaseDialog: typeof import('./src/components/dialog/baseDialog.vue')['default'] - Dialog: typeof import('./src/components/dialog/index.vue')['default'] Directory: typeof import('./src/components/dialog/directory.vue')['default'] ElButton: typeof import('element-plus/es')['ElButton'] ElCheckbox: typeof import('element-plus/es')['ElCheckbox'] ElDialog: typeof import('element-plus/es')['ElDialog'] ElForm: typeof import('element-plus/es')['ElForm'] ElFormItem: typeof import('element-plus/es')['ElFormItem'] - ElIcon: typeof import('element-plus/es')['ElIcon'] ElInput: typeof import('element-plus/es')['ElInput'] ElOption: typeof import('element-plus/es')['ElOption'] ElPagination: typeof import('element-plus/es')['ElPagination'] @@ -26,7 +24,6 @@ declare module 'vue' { ElTableColumn: typeof import('element-plus/es')['ElTableColumn'] ElTabPane: typeof import('element-plus/es')['ElTabPane'] ElTabs: typeof import('element-plus/es')['ElTabs'] - ElTag: typeof import('element-plus/es')['ElTag'] ElUpload: typeof import('element-plus/es')['ElUpload'] Index_b: typeof import('./src/components/SvgIcon/index_b.vue')['default'] Pagination: typeof import('./src/components/Pagination/index.vue')['default'] diff --git a/src/renderer/public/sdk/YJEarth.min.js b/src/renderer/public/sdk/YJEarth.min.js index d210731..a0cc741 100644 --- a/src/renderer/public/sdk/YJEarth.min.js +++ b/src/renderer/public/sdk/YJEarth.min.js @@ -1,4 +1,4 @@ -/*! update time: 2025/9/4 21:13:53*/ +/*! update time: 2025/9/5 18:26:33*/ /******/ (function(modules) { // webpackBootstrap /******/ // The module cache /******/ var installedModules = {}; @@ -1523,7 +1523,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) * /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ \"./node_modules/@babel/runtime/helpers/defineProperty.js\");\n/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ \"./node_modules/@babel/runtime/helpers/asyncToGenerator.js\");\n/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/toConsumableArray */ \"./node_modules/@babel/runtime/helpers/toConsumableArray.js\");\n/* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ \"./node_modules/@babel/runtime/helpers/classCallCheck.js\");\n/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ \"./node_modules/@babel/runtime/helpers/createClass.js\");\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ \"./node_modules/@babel/runtime/helpers/possibleConstructorReturn.js\");\n/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ \"./node_modules/@babel/runtime/helpers/getPrototypeOf.js\");\n/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ \"./node_modules/@babel/runtime/helpers/inherits.js\");\n/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @babel/runtime/regenerator */ \"./node_modules/@babel/runtime/regenerator/index.js\");\n/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8__);\n/* harmony import */ var _Element_Dialog__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../Element/Dialog */ \"./src/Obj/Element/Dialog/index.js\");\n/* harmony import */ var _Element_cy_html_tabs__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../Element/cy_html_tabs */ \"./src/Obj/Element/cy_html_tabs.js\");\n/* harmony import */ var _Element_richText__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../Element/richText */ \"./src/Obj/Element/richText.js\");\n/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./_element */ \"./src/Obj/Base/AssembleObject/_element.js\");\n/* harmony import */ var _index__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../index */ \"./src/Obj/Base/index.js\");\n/* harmony import */ var _LabelObject__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../LabelObject */ \"./src/Obj/Base/LabelObject/index.js\");\n/* harmony import */ var _Event_index__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../../../Event/index */ \"./src/Event/index.js\");\n/* harmony import */ var _MouseTip__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../../../MouseTip */ \"./src/MouseTip/index.js\");\n/* harmony import */ var _Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../../../Global/MultiViewportMode */ \"./src/Global/MultiViewportMode/index.js\");\n/* harmony import */ var _Element_datalist__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../../Element/datalist */ \"./src/Obj/Element/datalist.js\");\n/* harmony import */ var _Element_fontSelect__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../../Element/fontSelect */ \"./src/Obj/Element/fontSelect.js\");\n/* harmony import */ var _Global_SplitScreen__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../../../Global/SplitScreen */ \"./src/Global/SplitScreen/index.js\");\n/* harmony import */ var _Global_global__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../../../Global/global */ \"./src/Global/global.js\");\n\n\n\n\n\n\n\n\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default()(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\n\nfunction _createForOfIteratorHelper(r, e) { var t = \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && \"number\" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t.return || t.return(); } finally { if (u) throw o; } } }; }\nfunction _unsupportedIterableToArray(r, a) { if (r) { if (\"string\" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }\nfunction _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }\nfunction _callSuper(t, o, e) { return o = _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6___default()(o), _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_5___default()(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6___default()(t).constructor) : o.apply(t, e)); }\nfunction _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }\n/**\r\n * 集结地\r\n */\n\n\n\n\n\n\n\n\n\n\n\n\n\n// import EditParticle from \"../../ModelController/EditParticle\";\nvar AssembleObject = /*#__PURE__*/function (_Base) {\n /**\r\n * @constructor\r\n * @param sdk\r\n * @description 集结地\r\n * @param options {object} 属性\r\n * @param options.id {string} 唯一标识\r\n * @param options.show=true {boolean} 显示/隐藏\r\n * @param options.name {string} 名称\r\n * @param options.color='rgba(255, 0, 0, 0.5)' {string} 颜色\r\n * @param options.height {number} 高度\r\n * @param options.heightMode=2{number} 高度模式(0:海拔高度;1:相对地表;2:依附模式)\r\n * @param options.areaUnit='平方米' {string} 面积单位\r\n * @param options.line {object} 边框\r\n * @param options.line.width=2 {string} 边框宽\r\n * @param options.line.color=\"rgba(155, 155, 124, 0.89)\" {string} 边框颜色\r\n * @param {Array.} options.positions 必填,经纬度和高度的列表,值交替 [{lon,lat,alt},...]\r\n * @param options.positions[].lng {number} 经度\r\n * @param options.positions[].lat {number} 纬度\r\n * @param options.positions[].alt {number} 高度\r\n * @param options.label {object} 标签对象\r\n * @param options.label.text {string} 标签文本\r\n * @param options.label.show {string} 标签显隐\r\n * @param options.label.position {string} 标签位置\r\n * @param options.label.position {object} 标签位置\r\n * @param options.label.position.lng {number} 经度\r\n * @param options.label.position.lat {number} 纬度\r\n * @param options.label.position.alt {number} 高度\r\n * @param options.label.fontSize=20 {number} 字体大小\r\n * @param options.label.fontFamily=0 {number} 字体项 0:黑体;1:思源黑体;2:庞门正道标题体;3:数黑体\r\n * @param options.label.color=#ffffff {string} 字体颜色\r\n * @param options.label.lineWidth=4 {number} 引线宽\r\n * @param options.label.lineColor=#00ffff80 {string} 引线颜色\r\n * @param options.label.pixelOffset=20 {number} 字体偏移(引线长度)\r\n * @param options.label.backgroundColor=['#00ffff80', '#00ffff80'] {array} 背景颜色\r\n * @param options.label.scaleByDistance {boolean} 距离缩放\r\n * @param options.label.near=2000 {number} 视野缩放最近距离\r\n * @param options.label.far=100000 {number} 视野缩放最远距离\r\n * @param options.attribute {object} 属性内容\r\n * @param options.attribute.link={} {object} 链接\r\n * @param options.attribute.link.content=[]] {array} 链接内容\r\n * @param options.attribute.link.content[].name {string} 链接名称\r\n * @param options.attribute.link.content[].url {string} 链接地址\r\n * @param options.richTextContent {string} 富文本内容\r\n * @param options.customView {object} 默认视角\r\n * @param options.customView.orientation {object} 默认视角方位\r\n * @param options.customView.orientation.heading {number} 航向角\r\n * @param options.customView.orientation.pitch {number} 俯仰角\r\n * @param options.customView.orientation.roll {number} 翻滚角\r\n * @param options.customView.relativePosition {object} 视角相对位置\r\n * @param options.customView.relativePosition.lng {number} 经度\r\n * @param options.customView.relativePosition.lat {number} 纬度\r\n * @param options.customView.relativePosition.alt {number} 高度\r\n * */\n function AssembleObject(sdk) {\n var _this2;\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var _Dialog = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3___default()(this, AssembleObject);\n _this2 = _callSuper(this, AssembleObject, [sdk, options]);\n _this2.options.name = options.name || '未命名对象';\n _this2.options.color = options.color || \"#ff000080\";\n _this2.options.show = options.show || options.show === false ? options.show : true;\n _this2.options.heightMode = options.heightMode || options.heightMode == 0 ? options.heightMode : 2;\n _this2.options.positions = options.positions || [];\n _this2.options.line = options.line || {};\n _this2.options.line.width = _this2.options.line.width || _this2.options.line.width === 0 ? _this2.options.line.width : 3;\n _this2.options.line.color = _this2.options.line.color || 'rgba(255, 0, 0, 1)';\n _this2.options['area-unit'] = options['area-unit'] || '平方米';\n _this2.entity;\n _this2.event = new _Event_index__WEBPACK_IMPORTED_MODULE_15__[\"default\"](_this2.sdk);\n _this2.operate = {};\n _this2._elms = {};\n _this2.Dialog = _Dialog;\n options.label = options.label || {};\n _this2.options.label = {\n text: _this2.options.name,\n show: options.label.show || false,\n position: options.label.position,\n fontSize: options.label.fontSize || options.label.fontSize === 0 ? options.label.fontSize : 20,\n fontFamily: options.label.fontFamily ? options.label.fontFamily : 0,\n color: options.label.color || '#ffffff',\n lineWidth: options.label.lineWidth || options.label.lineWidth === 0 ? options.label.lineWidth : 4,\n pixelOffset: options.label.pixelOffset || options.label.pixelOffset === 0 ? options.label.pixelOffset : 20,\n backgroundColor: options.label.backgroundColor || ['#00ffff80', '#00ffff80'],\n lineColor: options.label.lineColor || '#00ffff80',\n scaleByDistance: options.label.scaleByDistance || false,\n near: options.label.near || options.label.near === 0 ? options.label.near : 2000,\n far: options.label.far || options.label.far === 0 ? options.label.far : 100000\n };\n _this2.options.attribute = options.attribute || {};\n _this2.options.attribute.link = _this2.options.attribute.link || {};\n _this2.options.attribute.link.content = _this2.options.attribute.link.content || [];\n _this2.options.attribute.camera = _this2.options.attribute.camera || {};\n _this2.options.attribute.camera.content = _this2.options.attribute.camera.content || [];\n _this2.options.attribute.vr = _this2.options.attribute.vr || {};\n _this2.options.attribute.vr.content = _this2.options.attribute.vr.content || [];\n _this2.options.attribute.goods = _this2.options.attribute.goods || {};\n _this2.options.attribute.goods.content = _this2.options.attribute.goods.content || [];\n _this2.options.attributeType = options.attributeType || 'richText';\n _this2.nodePoints = [];\n if (!_this2.options.positions || _this2.options.positions.length < 3) {\n _this2._error = '集结地最少需要三个坐标!';\n console.warn(_this2._error);\n window.ELEMENT && window.ELEMENT.Message({\n message: _this2._error,\n type: 'warning',\n duration: 1500\n });\n } else {\n if (!_this2.options.height && _this2.options.height !== 0) {\n var height = _this2.options.positions[0].alt;\n for (var i = 1; i < _this2.options.positions.length; i++) {\n if (height < _this2.options.positions[i].alt) {\n height = _this2.options.positions[i].alt;\n }\n }\n _this2.options.height = height;\n }\n _this2.sdk.addIncetance(_this2.options.id, _this2);\n AssembleObject.create(_this2);\n }\n return _this2;\n }\n _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_7___default()(AssembleObject, _Base);\n return _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4___default()(AssembleObject, [{\n key: \"type\",\n get: function get() {\n return 'AssembleObject';\n }\n }, {\n key: \"color\",\n get: function get() {\n return this.options.color;\n },\n set: function set(v) {\n var _this3 = this;\n this.options.color = v || 'rgba(255, 0, 0, 0.5)';\n if (!this.sdk || !this.sdk.viewer || !this.entity || !this.entity.polygon) {\n return;\n }\n var material = Cesium.Color.fromCssColorString(this.options.color);\n if (this.sdk.viewer.scene.mode === 2) {\n material = new Cesium.CustomColorMaterialSource({\n color: this.options.color\n });\n }\n this.entity.polygon.material = material;\n if (this._elms.color) {\n this._elms.color.forEach(function (item, i) {\n var colorPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: _this3.options.color,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(c) {\n _this3.color = c;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this3.color = 'rgba(255,0,0,0.5)';\n } //点击清空按钮事件回调\n });\n _this3._elms.color[i] = colorPicker;\n });\n }\n }\n }, {\n key: \"heightMode\",\n get: function get() {\n return this.options.heightMode ? this.options.heightMode : 0;\n },\n set: function set(v) {\n var _this4 = this;\n this.entity.polygon.hierarchy = [];\n setTimeout(function () {\n _this4.options.heightMode = v || v == 0 ? v : 2;\n _this4.positionEditing = false;\n if (!_this4.entity) {\n return;\n }\n var heightModeName = '';\n AssembleObject.closeNodeEdit(_this4);\n var ground = false;\n var disabled = false;\n _this4.renewPositions();\n _this4.entity.polyline.positions = [].concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(_this4.positionsH), [_this4.positionsH[0], _this4.positionsH[1]]);\n _this4.entity.polygon.hierarchy = new Cesium.PolygonHierarchy(_this4.positionsH);\n switch (_this4.options.heightMode) {\n case '0':\n case 0:\n heightModeName = '海拔高度';\n break;\n case '1':\n case 1:\n heightModeName = '相对地表';\n break;\n case '2':\n case 2:\n ground = true;\n disabled = true;\n heightModeName = '依附模型';\n break;\n }\n _this4.previous = null;\n _this4.label.ground = ground;\n _this4.entity.polyline.clampToGround = ground;\n _this4.entity.polyline.arcType = !ground ? Cesium.ArcType.NONE : Cesium.ArcType.GEODESIC, _this4.entity.polygon.perPositionHeight = !ground ? true : false;\n _this4._elms.heightMode && (_this4._elms.heightMode.value = heightModeName);\n _this4._elms.heightModeObject && _this4._elms.heightModeObject.legp_searchActive(heightModeName);\n if (disabled) {\n _this4._elms.heightBox && (_this4._elms.heightBox.className = 'input-number input-number-unit-1 height-box disabled');\n _this4._elms.heightConfirm && _this4._elms.heightConfirm.setAttribute('disabled', 'disabled');\n } else {\n _this4._elms.heightBox && (_this4._elms.heightBox.className = 'input-number input-number-unit-1 height-box');\n _this4._elms.heightConfirm && _this4._elms.heightConfirm.removeAttribute('disabled');\n }\n }, 50);\n }\n }, {\n key: \"height\",\n get: function get() {\n return this.options.height;\n },\n set: function set(v) {\n var _this5 = this;\n if (!v || isNaN(Number(v))) {\n this.options.height = 0;\n } else {\n this.options.height = Number(Number(v).toFixed(2));\n }\n var ground;\n if (this.heightMode == 2) {\n ground = true;\n } else {\n ground = false;\n }\n this.renewPositions();\n setTimeout(function () {\n _this5.entity.polygon.hierarchy = new Cesium.PolygonHierarchy(_this5.positionsH);\n _this5.entity.polygon.perPositionHeight = !ground ? true : false;\n _this5.entity.polyline.positions = [].concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(_this5.positionsH), [_this5.positionsH[0], _this5.positionsH[1]]);\n _this5.entity.polyline.clampToGround = !ground ? false : true;\n _this5.entity.polyline.arcType = !ground ? Cesium.ArcType.NONE : Cesium.ArcType.GEODESIC;\n }, 0);\n this._elms.alt && this._elms.alt.forEach(function (item) {\n item.innerHTML = _this5.options.height;\n });\n }\n }, {\n key: \"lineColor\",\n get: function get() {\n return this.options.line.color;\n },\n set: function set(v) {\n var _this6 = this;\n this.options.line.color = v || 'rgba(255, 0, 0, 0.5)';\n if (!this.sdk || !this.sdk.viewer || !this.entity || !this.entity.polyline) {\n return;\n }\n this.entity.polyline.material = Cesium.Color.fromCssColorString(this.options.line.color);\n if (this._elms.lineColor) {\n this._elms.lineColor.forEach(function (item, i) {\n var lineColorPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: _this6.options.line.color,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(c) {\n _this6.lineColor = c;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this6.lineColor = 'rgba(255,0,0,0.5)';\n } //点击清空按钮事件回调\n });\n _this6._elms.lineColor[i] = lineColorPicker;\n });\n }\n }\n }, {\n key: \"lineWidth\",\n get: function get() {\n return this.options.line.width;\n },\n set: function set(v) {\n var _this7 = this;\n this.options.line.width = v || v === 0 ? v : 3;\n this.entity.polyline.width = this.options.line.width;\n this._elms.lineColor && this._elms.lineColor.forEach(function (item) {\n item.value = _this7.options.line.width;\n });\n }\n }, {\n key: \"area\",\n get: function get() {\n return this.options.area;\n },\n set: function set(v) {\n this.options.area = v;\n this._elms.area && this._elms.area.forEach(function (item) {\n item.value = v;\n });\n }\n }, {\n key: \"areaUnit\",\n get: function get() {\n return this.options['area-unit'];\n },\n set: function set(v) {\n this.options['area-unit'] = v;\n this._elms.areaUnit && this._elms.areaUnit.forEach(function (item) {\n item.value = v;\n });\n if (this.options.areaByMeter) {\n switch (v) {\n case '平方米':\n this.area = this.options.areaByMeter;\n break;\n case '平方千米':\n this.area = Number((this.options.areaByMeter / 1000000).toFixed(8));\n break;\n case '亩':\n this.area = Number((this.options.areaByMeter / 666.6666667).toFixed(4));\n break;\n case '公顷':\n this.area = Number((this.options.areaByMeter / 10000).toFixed(6));\n break;\n default:\n this.area = this.options.areaByMeter;\n }\n }\n }\n }, {\n key: \"labelShow\",\n get: function get() {\n return this.options.label.show;\n },\n set: function set(v) {\n this.options.label.show = v;\n if (this.show && !this.showView || this.showView == 3) {\n this.label.show = v;\n } else {\n this.label.show = false;\n }\n this._elms.labelShow && this._elms.labelShow.forEach(function (item) {\n item.checked = v;\n });\n }\n }, {\n key: \"labelFontFamily\",\n get: function get() {\n return this.options.label.fontFamily;\n },\n set: function set(v) {\n this.options.label.fontFamily = v || 0;\n this.label && (this.label.fontFamily = this.options.label.fontFamily);\n var name = Object(_Element_fontSelect__WEBPACK_IMPORTED_MODULE_19__[\"getFontFamilyName\"])(this.labelFontFamily) || '';\n this._elms.labelFontFamily && this._elms.labelFontFamily.forEach(function (item) {\n item.value = name;\n });\n }\n }, {\n key: \"labelColor\",\n get: function get() {\n return this.options.label.color;\n },\n set: function set(v) {\n var _this8 = this;\n this.options.label.color = v;\n this.label.color = v;\n if (this._elms.labelColor) {\n this._elms.labelColor.forEach(function (item, i) {\n var labelColorPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: _this8.labelColor,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this8.labelColor = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this8.labelColor = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n _this8._elms.labelColor[i] = labelColorPicker;\n });\n }\n }\n }, {\n key: \"labelFontSize\",\n get: function get() {\n return this.options.label.fontSize;\n },\n set: function set(v) {\n this.options.label.fontSize = v;\n this.label.fontSize = v;\n this._elms.labelFontSize && this._elms.labelFontSize.forEach(function (item) {\n item.value = v;\n });\n }\n }, {\n key: \"labelScaleByDistance\",\n get: function get() {\n return this.options.label.scaleByDistance;\n },\n set: function set(v) {\n this.options.label.scaleByDistance = v;\n this.label.scaleByDistance = v;\n this._elms.labelScaleByDistance && this._elms.labelScaleByDistance.forEach(function (item) {\n item.checked = v;\n });\n }\n }, {\n key: \"labelNear\",\n get: function get() {\n return this.options.label.near;\n },\n set: function set(v) {\n var near = v;\n if (near > this.labelFar) {\n near = this.labelFar;\n }\n this.options.label.near = near;\n this.label.near = near;\n this._elms.labelNear && this._elms.labelNear.forEach(function (item) {\n item.value = near;\n });\n }\n }, {\n key: \"labelFar\",\n get: function get() {\n return this.options.label.far;\n },\n set: function set(v) {\n var far = v;\n if (far < this.labelNear) {\n far = this.labelNear;\n }\n this.options.label.far = far;\n this.label.far = far;\n this._elms.labelFar && this._elms.labelFar.forEach(function (item) {\n item.value = far;\n });\n }\n }, {\n key: \"labelLineWidth\",\n get: function get() {\n return this.options.label.lineWidth;\n },\n set: function set(v) {\n this.options.label.lineWidth = v;\n this.label.lineWidth = v;\n this._elms.labelLineWidth && this._elms.labelLineWidth.forEach(function (item) {\n item.value = v;\n });\n }\n }, {\n key: \"labelPixelOffset\",\n get: function get() {\n return this.options.label.pixelOffset;\n },\n set: function set(v) {\n this.options.label.pixelOffset = v;\n this.label.pixelOffset = v;\n this._elms.labelPixelOffset && this._elms.labelPixelOffset.forEach(function (item) {\n item.value = v;\n });\n }\n }, {\n key: \"labelLineColor\",\n get: function get() {\n return this.options.label.lineColor;\n },\n set: function set(v) {\n var _this9 = this;\n this.options.label.lineColor = v;\n this.label.lineColor = v;\n if (this._elms.labelLineColor) {\n this._elms.labelLineColor.forEach(function (item, i) {\n var lineColorPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: _this9.labelLineColor,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this9.labelLineColor = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this9.labelLineColor = 'rgba(0,255,255,0.5)';\n } //点击清空按钮事件回调\n });\n _this9._elms.labelLineColor[i] = lineColorPicker;\n });\n }\n }\n }, {\n key: \"labelBackgroundColorStart\",\n get: function get() {\n return this.options.label.backgroundColor[0];\n },\n set: function set(v) {\n var _this10 = this;\n this.options.label.backgroundColor[0] = v;\n this.label.backgroundColor = [v, this.label.backgroundColor[1]];\n if (this._elms.labelBackgroundColorStart) {\n this._elms.labelBackgroundColorStart.forEach(function (item, i) {\n var labelBackgroundColorStartPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: _this10.labelBackgroundColorStart,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this10.labelBackgroundColorStart = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this10.labelBackgroundColorStart = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n _this10._elms.labelBackgroundColorStart[i] = labelBackgroundColorStartPicker;\n });\n }\n }\n }, {\n key: \"labelBackgroundColorEnd\",\n get: function get() {\n return this.options.label.backgroundColor[1];\n },\n set: function set(v) {\n var _this11 = this;\n this.options.label.backgroundColor[1] = v;\n this.label.backgroundColor = [this.label.backgroundColor[0], v];\n if (this._elms.labelBackgroundColorEnd) {\n this._elms.labelBackgroundColorEnd.forEach(function (item, i) {\n var labelBackgroundColorEndPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: _this11.labelBackgroundColorEnd,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this11.labelBackgroundColorEnd = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this11.labelBackgroundColorEnd = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n _this11._elms.labelBackgroundColorEnd[i] = labelBackgroundColorEndPicker;\n });\n }\n }\n }, {\n key: \"attributeType\",\n get: function get() {\n return this.options.attributeType;\n },\n set: function set(v) {\n this.options.attributeType = v;\n this._elms.attributeType && this._elms.attributeType.forEach(function (item) {\n item.value = v;\n });\n var attributeContent = this._DialogObject._element.content.getElementsByClassName('attribute-content');\n for (var i = 0; i < attributeContent.length; i++) {\n if (attributeContent[i].className.indexOf('attribute-content-' + v) > -1) {\n attributeContent[i].style.display = 'block';\n } else {\n attributeContent[i].style.display = 'none';\n }\n }\n }\n }, {\n key: \"attributeLink\",\n get: function get() {\n return this.options.attribute.link.content;\n },\n set: function set(v) {\n var _this12 = this;\n this.options.attribute.link.content = v;\n if (!this._DialogObject || !this._DialogObject._element || !this._DialogObject._element.content || this._DialogObject._element.content.getElementsByClassName('attribute-content-link').length == 0) {\n return;\n }\n var table = this._DialogObject._element.content.getElementsByClassName('attribute-content-link')[1].getElementsByClassName('table')[0];\n var tableContent = table.getElementsByClassName('table-body')[0];\n tableContent.innerHTML = '';\n if (this.options.attribute.link.content.length > 0) {\n table.getElementsByClassName('table-empty')[0].style.display = 'none';\n } else {\n table.getElementsByClassName('table-empty')[0].style.display = 'flex';\n }\n for (var i = 0; i < this.options.attribute.link.content.length; i++) {\n var tr = \"\\n
\\n
\" + this.options.attribute.link.content[i].name + \"
\\n
\" + this.options.attribute.link.content[i].url + \"
\\n
\\n \\n \\n
\\n
\";\n var trElm = document.createRange().createContextualFragment(tr);\n tableContent.appendChild(trElm);\n }\n var item = tableContent.getElementsByClassName('tr');\n var fun = {\n linkEdit: function () {\n var _linkEdit = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee(index) {\n var table, tableContent, item, _loop, _i;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee$(_context3) {\n while (1) switch (_context3.prev = _context3.next) {\n case 0:\n _context3.next = 2;\n return _this12.options.attribute.link.content;\n case 2:\n _this12.attributeLink = _context3.sent;\n table = _this12._DialogObject._element.content.getElementsByClassName('attribute-content-link')[1].getElementsByClassName('table')[0];\n tableContent = table.getElementsByClassName('table-body')[0];\n item = tableContent.getElementsByClassName('tr');\n _loop = /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _loop(_i) {\n var height, _html, textareaElm, td, btn, n, _iterator, _step, _loop2;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _loop$(_context2) {\n while (1) switch (_context2.prev = _context2.next) {\n case 0:\n if (!(index === _i)) {\n _context2.next = 36;\n break;\n }\n height = item[_i].offsetHeight;\n _html = \"\\n
\\n \\n
\\n
\\n \\n
\\n
\\n \\n \\n
\";\n item[_i].innerHTML = _html;\n textareaElm = item[_i].getElementsByClassName('link-edit')[0];\n textareaElm.style.height = height - 10 + 'px';\n td = item[_i].getElementsByClassName('td');\n td[0].getElementsByClassName('input')[0].value = _this12.options.attribute.link.content[index].name;\n td[1].getElementsByClassName('input')[0].value = _this12.options.attribute.link.content[index].url;\n btn = item[_i].getElementsByTagName('button');\n n = 0;\n case 11:\n if (!(n < btn.length)) {\n _context2.next = 35;\n break;\n }\n if (!(!btn[n] || !btn[n].attributes)) {\n _context2.next = 14;\n break;\n }\n return _context2.abrupt(\"continue\", 32);\n case 14:\n _iterator = _createForOfIteratorHelper(btn[n].attributes);\n _context2.prev = 15;\n _loop2 = /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _loop2() {\n var m;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _loop2$(_context) {\n while (1) switch (_context.prev = _context.next) {\n case 0:\n m = _step.value;\n if (!(m.name === '@click')) {\n _context.next = 5;\n break;\n }\n btn[n].addEventListener('click', function (e) {\n if (typeof fun[m.value] === 'function') {\n fun[m.value]({\n name: td[0].getElementsByClassName('input')[0].value,\n url: td[1].getElementsByClassName('input')[0].value\n }, _i);\n }\n });\n btn[n].attributes.removeNamedItem(m.name);\n return _context.abrupt(\"return\", 1);\n case 5:\n case \"end\":\n return _context.stop();\n }\n }, _loop2);\n });\n _iterator.s();\n case 18:\n if ((_step = _iterator.n()).done) {\n _context2.next = 24;\n break;\n }\n return _context2.delegateYield(_loop2(), \"t0\", 20);\n case 20:\n if (!_context2.t0) {\n _context2.next = 22;\n break;\n }\n return _context2.abrupt(\"break\", 24);\n case 22:\n _context2.next = 18;\n break;\n case 24:\n _context2.next = 29;\n break;\n case 26:\n _context2.prev = 26;\n _context2.t1 = _context2[\"catch\"](15);\n _iterator.e(_context2.t1);\n case 29:\n _context2.prev = 29;\n _iterator.f();\n return _context2.finish(29);\n case 32:\n n++;\n _context2.next = 11;\n break;\n case 35:\n return _context2.abrupt(\"return\", 1);\n case 36:\n case \"end\":\n return _context2.stop();\n }\n }, _loop, null, [[15, 26, 29, 32]]);\n });\n _i = 0;\n case 8:\n if (!(_i < item.length)) {\n _context3.next = 15;\n break;\n }\n return _context3.delegateYield(_loop(_i), \"t0\", 10);\n case 10:\n if (!_context3.t0) {\n _context3.next = 12;\n break;\n }\n return _context3.abrupt(\"break\", 15);\n case 12:\n _i++;\n _context3.next = 8;\n break;\n case 15:\n case \"end\":\n return _context3.stop();\n }\n }, _callee);\n }));\n function linkEdit(_x) {\n return _linkEdit.apply(this, arguments);\n }\n return linkEdit;\n }(),\n linkDelete: function linkDelete(i) {\n _this12.options.attribute.link.content.splice(i, 1);\n _this12.attributeLink = _this12.options.attribute.link.content;\n },\n confirmEdit: function confirmEdit(value, i) {\n var name = value.name && value.name.replace(/\\s/g, \"\");\n var url = value.url && value.url.replace(/\\s/g, \"\");\n if (name && url) {\n _this12.options.attribute.link.content[i] = value;\n } else {\n window.ELEMENT && window.ELEMENT.Message({\n message: '名称或链接不能为空!',\n type: 'warning',\n duration: 1500\n });\n }\n _this12.attributeLink = _this12.options.attribute.link.content;\n },\n cancelEdit: function cancelEdit() {\n _this12.attributeLink = _this12.options.attribute.link.content;\n },\n fileSelect: function fileSelect(value, i) {\n var fileElm = item[i].getElementsByClassName('file-select')[0];\n fileElm.click();\n fileElm.removeEventListener('change', _fileSelect);\n fileElm.addEventListener('change', _fileSelect);\n }\n };\n var _fileSelect = function _fileSelect(event) {\n if (event.target.value) {\n var td = item[event.target.getAttribute('index')].getElementsByClassName('td');\n td[1].getElementsByClassName('input')[0].value = event.target.value;\n event.target.value = null;\n }\n };\n var _loop3 = function _loop3(_i2) {\n var btn = item[_i2].getElementsByTagName('button');\n for (var n = 0; n < btn.length; n++) {\n if (!btn[n] || !btn[n].attributes) {\n continue;\n }\n var _iterator2 = _createForOfIteratorHelper(btn[n].attributes),\n _step2;\n try {\n var _loop4 = function _loop4() {\n var m = _step2.value;\n if (m.name === '@click') {\n btn[n].addEventListener('click', function (e) {\n if (typeof fun[m.value] === 'function') {\n fun[m.value](_i2);\n }\n });\n btn[n].attributes.removeNamedItem(m.name);\n return 1; // break\n }\n };\n for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {\n if (_loop4()) break;\n }\n } catch (err) {\n _iterator2.e(err);\n } finally {\n _iterator2.f();\n }\n }\n };\n for (var _i2 = 0; _i2 < item.length; _i2++) {\n _loop3(_i2);\n }\n }\n }, {\n key: \"attributeCamera\",\n get: function get() {\n return this.options.attribute.camera.content;\n },\n set: function set(v) {\n this.options.attribute.camera.content = v;\n }\n }, {\n key: \"attributeVr\",\n get: function get() {\n return this.options.attribute.vr.content;\n },\n set: function set(v) {\n var _this13 = this;\n this.options.attribute.vr.content = v;\n if (!this._DialogObject || !this._DialogObject._element || !this._DialogObject._element.content || this._DialogObject._element.content.getElementsByClassName('attribute-content-vr').length == 0) {\n return;\n }\n var table = this._DialogObject._element.content.getElementsByClassName('attribute-content-vr')[1].getElementsByClassName('table')[0];\n var tableContent = table.getElementsByClassName('table-body')[0];\n tableContent.innerHTML = '';\n if (this.options.attribute.vr.content.length > 0) {\n table.getElementsByClassName('table-empty')[0].style.display = 'none';\n } else {\n table.getElementsByClassName('table-empty')[0].style.display = 'flex';\n }\n for (var i = 0; i < this.options.attribute.vr.content.length; i++) {\n var tr = \"\\n
\\n
\" + this.options.attribute.vr.content[i].name + \"
\\n
\" + this.options.attribute.vr.content[i].url + \"
\\n
\\n \\n \\n
\\n
\";\n var trElm = document.createRange().createContextualFragment(tr);\n tableContent.appendChild(trElm);\n }\n var item = tableContent.getElementsByClassName('tr');\n var fun = {\n vrEdit: function () {\n var _vrEdit = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee2(index) {\n var table, tableContent, item, _loop5, _i3;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee2$(_context6) {\n while (1) switch (_context6.prev = _context6.next) {\n case 0:\n _context6.next = 2;\n return _this13.options.attribute.vr.content;\n case 2:\n _this13.attributeVr = _context6.sent;\n table = _this13._DialogObject._element.content.getElementsByClassName('attribute-content-vr')[1].getElementsByClassName('table')[0];\n tableContent = table.getElementsByClassName('table-body')[0];\n item = tableContent.getElementsByClassName('tr');\n _loop5 = /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _loop5(_i3) {\n var height, _html2, textareaElm, td, btn, n, _iterator3, _step3, _loop6;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _loop5$(_context5) {\n while (1) switch (_context5.prev = _context5.next) {\n case 0:\n if (!(index === _i3)) {\n _context5.next = 36;\n break;\n }\n height = item[_i3].offsetHeight;\n _html2 = \"\\n
\\n \\n
\\n
\\n \\n
\\n
\\n \\n \\n
\";\n item[_i3].innerHTML = _html2;\n textareaElm = item[_i3].getElementsByClassName('link-edit')[0];\n textareaElm.style.height = height - 10 + 'px';\n td = item[_i3].getElementsByClassName('td');\n td[0].getElementsByClassName('input')[0].value = _this13.options.attribute.vr.content[index].name;\n td[1].getElementsByClassName('input')[0].value = _this13.options.attribute.vr.content[index].url;\n btn = item[_i3].getElementsByTagName('button');\n n = 0;\n case 11:\n if (!(n < btn.length)) {\n _context5.next = 35;\n break;\n }\n if (!(!btn[n] || !btn[n].attributes)) {\n _context5.next = 14;\n break;\n }\n return _context5.abrupt(\"continue\", 32);\n case 14:\n _iterator3 = _createForOfIteratorHelper(btn[n].attributes);\n _context5.prev = 15;\n _loop6 = /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _loop6() {\n var m;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _loop6$(_context4) {\n while (1) switch (_context4.prev = _context4.next) {\n case 0:\n m = _step3.value;\n if (!(m.name === '@click')) {\n _context4.next = 5;\n break;\n }\n btn[n].addEventListener('click', function (e) {\n if (typeof fun[m.value] === 'function') {\n fun[m.value]({\n name: td[0].getElementsByClassName('input')[0].value,\n url: td[1].getElementsByClassName('input')[0].value\n }, _i3);\n }\n });\n btn[n].attributes.removeNamedItem(m.name);\n return _context4.abrupt(\"return\", 1);\n case 5:\n case \"end\":\n return _context4.stop();\n }\n }, _loop6);\n });\n _iterator3.s();\n case 18:\n if ((_step3 = _iterator3.n()).done) {\n _context5.next = 24;\n break;\n }\n return _context5.delegateYield(_loop6(), \"t0\", 20);\n case 20:\n if (!_context5.t0) {\n _context5.next = 22;\n break;\n }\n return _context5.abrupt(\"break\", 24);\n case 22:\n _context5.next = 18;\n break;\n case 24:\n _context5.next = 29;\n break;\n case 26:\n _context5.prev = 26;\n _context5.t1 = _context5[\"catch\"](15);\n _iterator3.e(_context5.t1);\n case 29:\n _context5.prev = 29;\n _iterator3.f();\n return _context5.finish(29);\n case 32:\n n++;\n _context5.next = 11;\n break;\n case 35:\n return _context5.abrupt(\"return\", 1);\n case 36:\n case \"end\":\n return _context5.stop();\n }\n }, _loop5, null, [[15, 26, 29, 32]]);\n });\n _i3 = 0;\n case 8:\n if (!(_i3 < item.length)) {\n _context6.next = 15;\n break;\n }\n return _context6.delegateYield(_loop5(_i3), \"t0\", 10);\n case 10:\n if (!_context6.t0) {\n _context6.next = 12;\n break;\n }\n return _context6.abrupt(\"break\", 15);\n case 12:\n _i3++;\n _context6.next = 8;\n break;\n case 15:\n case \"end\":\n return _context6.stop();\n }\n }, _callee2);\n }));\n function vrEdit(_x2) {\n return _vrEdit.apply(this, arguments);\n }\n return vrEdit;\n }(),\n vrDelete: function vrDelete(i) {\n _this13.options.attribute.vr.content.splice(i, 1);\n _this13.attributeVr = _this13.options.attribute.vr.content;\n },\n confirmEdit: function confirmEdit(value, i) {\n var name = value.name && value.name.replace(/\\s/g, \"\");\n var url = value.url && value.url.replace(/\\s/g, \"\");\n if (name && url) {\n _this13.options.attribute.vr.content[i] = value;\n } else {\n window.ELEMENT && window.ELEMENT.Message({\n message: '名称或链接不能为空!',\n type: 'warning',\n duration: 1500\n });\n }\n _this13.attributeVr = _this13.options.attribute.vr.content;\n },\n cancelEdit: function cancelEdit() {\n _this13.attributeVr = _this13.options.attribute.vr.content;\n },\n fileSelect: function fileSelect(value, i) {\n var fileElm = item[i].getElementsByClassName('file-select')[0];\n fileElm.click();\n fileElm.removeEventListener('change', _fileSelect2);\n fileElm.addEventListener('change', _fileSelect2);\n }\n };\n var _fileSelect2 = function _fileSelect2(event) {\n if (event.target.value) {\n var td = item[event.target.getAttribute('index')].getElementsByClassName('td');\n td[1].getElementsByClassName('input')[0].value = event.target.value;\n event.target.value = null;\n }\n };\n var _loop7 = function _loop7(_i4) {\n var btn = item[_i4].getElementsByTagName('button');\n for (var n = 0; n < btn.length; n++) {\n if (!btn[n] || !btn[n].attributes) {\n continue;\n }\n var _iterator4 = _createForOfIteratorHelper(btn[n].attributes),\n _step4;\n try {\n var _loop8 = function _loop8() {\n var m = _step4.value;\n if (m.name === '@click') {\n btn[n].addEventListener('click', function (e) {\n if (typeof fun[m.value] === 'function') {\n fun[m.value](_i4);\n }\n });\n btn[n].attributes.removeNamedItem(m.name);\n return 1; // break\n }\n };\n for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {\n if (_loop8()) break;\n }\n } catch (err) {\n _iterator4.e(err);\n } finally {\n _iterator4.f();\n }\n }\n };\n for (var _i4 = 0; _i4 < item.length; _i4++) {\n _loop7(_i4);\n }\n }\n }, {\n key: \"attributeGoods\",\n get: function get() {\n return this.options.attribute.goods.content;\n },\n set: function set(v) {\n this.options.attribute.goods.content = v;\n }\n }, {\n key: \"edit\",\n value: // 编辑框\n function () {\n var _edit = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee3(state) {\n var _this14 = this;\n var _this, createSpatialInfoTableContent, contentElm, tabsElm, colorPicker, linecolorPicker, labelColorPicker, labellineColorPicker, labelBackgroundColorStartPicker, labelBackgroundColorEndPicker, all_elm, heightBoxElm, heightElm, heightConfirmElm, heightModeData, heightModeObject, heightModeDataLegpElm, i;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee3$(_context7) {\n while (1) switch (_context7.prev = _context7.next) {\n case 0:\n if (!this._error) {\n _context7.next = 2;\n break;\n }\n return _context7.abrupt(\"return\");\n case 2:\n _this = this;\n this.originalOptions = this.deepCopyObj(this.options);\n if (this._DialogObject && this._DialogObject.close) {\n this._DialogObject.close();\n this._DialogObject = null;\n }\n if (!state) {\n _context7.next = 61;\n break;\n }\n createSpatialInfoTableContent = function createSpatialInfoTableContent() {\n var tableElm = contentElm.getElementsByClassName('spatial-info-table')[0];\n var tBodyElm = tableElm.getElementsByClassName('table-body')[0];\n tBodyElm.innerHTML = '';\n _this._elms.lng = [];\n _this._elms.lngInput = [];\n _this._elms.lat = [];\n _this._elms.latInput = [];\n _this._elms.alt = [];\n _this._elms.altInput = [];\n var _loop9 = function _loop9(i) {\n var tr = document.createElement('div');\n tr.className = 'tr';\n tr.innerHTML = \"\\n
\".concat(i + 1, \"
\\n
\\n
\\n
\\n \");\n var lngBox = tr.getElementsByClassName('lng')[0];\n var lng = document.createElement('span');\n lng.innerHTML = _this.options.positions[i].lng.toFixed(8);\n lngBox.appendChild(lng);\n var lngInput = document.createElement('input');\n lngInput.className = 'input';\n lngInput.type = 'number';\n lngInput.title = '';\n lngInput.min = -180;\n lngInput.max = 180;\n lngInput.value = _this.options.positions[i].lng.toFixed(8);\n var latBox = tr.getElementsByClassName('lat')[0];\n var lat = document.createElement('span');\n lat.innerHTML = _this.options.positions[i].lat.toFixed(8);\n latBox.appendChild(lat);\n var latInput = document.createElement('input');\n latInput.className = 'input';\n latInput.type = 'number';\n latInput.title = '';\n latInput.min = -90;\n latInput.max = 90;\n latInput.value = _this.options.positions[i].lat.toFixed(8);\n var altBox = tr.getElementsByClassName('alt')[0];\n var alt = document.createElement('span');\n alt.innerHTML = _this.height.toFixed(2);\n altBox.appendChild(alt);\n var altInput = document.createElement('input');\n altInput.className = 'input';\n altInput.type = 'number';\n altInput.title = '';\n altInput.min = -9999999;\n altInput.max = 999999999;\n altInput.value = _this.height.toFixed(2);\n lngBox.addEventListener('dblclick', function () {\n lngBox.innerHTML = '';\n lngInput.value = Number(_this.options.positions[i].lng.toFixed(8));\n lngBox.appendChild(lngInput);\n lngInput.focus();\n if (_this.operate.positionEditing) {\n _this.positionEditing = false;\n }\n AssembleObject.closeNodeEdit(_this);\n _this.heightMode = _this.heightMode;\n });\n lngInput.addEventListener('blur', function () {\n lngInput.value = Number(_this.options.positions[i].lng.toFixed(8));\n lngBox.innerHTML = '';\n lngBox.appendChild(lng);\n });\n lngInput.addEventListener('input', function () {\n _this.options.positions[i].lng = Number(Number(lngInput.value).toFixed(8));\n lng.innerHTML = _this.options.positions[i].lng.toFixed(8);\n _this.height = _this.height;\n });\n latBox.addEventListener('dblclick', function () {\n latBox.innerHTML = '';\n latInput.value = Number(_this.options.positions[i].lat.toFixed(8));\n latBox.appendChild(latInput);\n latInput.focus();\n if (_this.operate.positionEditing) {\n _this.positionEditing = false;\n }\n AssembleObject.closeNodeEdit(_this);\n _this.heightMode = _this.heightMode;\n });\n latInput.addEventListener('blur', function () {\n latInput.value = Number(_this.options.positions[i].lat.toFixed(8));\n latBox.innerHTML = '';\n latBox.appendChild(lat);\n });\n latInput.addEventListener('input', function () {\n _this.options.positions[i].lat = Number(Number(latInput.value).toFixed(8));\n lat.innerHTML = _this.options.positions[i].lat.toFixed(8);\n _this.height = _this.height;\n });\n altBox.addEventListener('dblclick', function () {\n if (_this.heightMode == 2) {\n return;\n }\n altBox.innerHTML = '';\n altInput.value = Number(_this.height.toFixed(2));\n altBox.appendChild(altInput);\n altInput.focus();\n if (_this.operate.positionEditing) {\n _this.positionEditing = false;\n }\n AssembleObject.closeNodeEdit(_this);\n _this.heightMode = _this.heightMode;\n });\n altInput.addEventListener('blur', function () {\n altInput.value = Number(_this.height.toFixed(2));\n altBox.innerHTML = '';\n altBox.appendChild(alt);\n });\n altInput.addEventListener('input', function () {\n _this.height = Number(Number(altInput.value).toFixed(2));\n alt.innerHTML = Number(_this.height.toFixed(2));\n });\n _this._elms.lng.push(lng);\n _this._elms.lngInput.push(lngInput);\n _this._elms.lat.push(lat);\n _this._elms.latInput.push(latInput);\n _this._elms.alt.push(alt);\n _this._elms.altInput.push(altInput);\n tBodyElm.appendChild(tr);\n };\n for (var i = 0; i < _this.options.positions.length; i++) {\n _loop9(i);\n }\n };\n _context7.next = 9;\n return new _Element_Dialog__WEBPACK_IMPORTED_MODULE_9__[\"default\"](this.sdk, this.options, {\n title: '集结地属性',\n left: '180px',\n top: '100px',\n confirmCallBack: function confirmCallBack(options) {\n _this14.name = _this14.name.trim();\n if (!_this14.name) {\n _this14.name = '未命名对象';\n }\n _this14.options.label.position = {\n lng: _this14.label.position[0],\n lat: _this14.label.position[1],\n alt: _this14.label.position[2]\n };\n _this14.originalOptions = _this14.deepCopyObj(_this14.options);\n _this14._DialogObject.close();\n _this14.Dialog.confirmCallBack && _this14.Dialog.confirmCallBack(_this14.originalOptions);\n Object(_Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_17__[\"syncData\"])(_this14.sdk, _this14.options.id);\n Object(_Global_SplitScreen__WEBPACK_IMPORTED_MODULE_20__[\"syncSplitData\"])(_this14.sdk, _this14.options.id);\n },\n resetCallBack: function resetCallBack() {\n _this14.reset();\n _this14.Dialog.resetCallBack && _this14.Dialog.resetCallBack();\n },\n removeCallBack: function removeCallBack() {\n _this14.Dialog.removeCallBack && _this14.Dialog.removeCallBack();\n },\n closeCallBack: function closeCallBack() {\n _this14.reset();\n _this14.positionEditing = false;\n _this14.Dialog.closeCallBack && _this14.Dialog.closeCallBack();\n },\n showCallBack: function showCallBack(show) {\n _this14.options.show = show;\n _this14.originalOptions.show = show;\n _this14.show = show;\n _this14.Dialog.showCallBack && _this14.Dialog.showCallBack();\n },\n translationalCallBack: function translationalCallBack() {\n _this14.positionEditing = !_this14.positionEditing;\n },\n // 二次编辑回调\n secondaryEditCallBack: function secondaryEditCallBack() {\n AssembleObject.nodeEdit(_this14, function () {\n createSpatialInfoTableContent();\n });\n }\n });\n case 9:\n this._DialogObject = _context7.sent;\n this._DialogObject._element.body.className = this._DialogObject._element.body.className + ' assemble';\n contentElm = document.createElement('div');\n contentElm.innerHTML = Object(_element__WEBPACK_IMPORTED_MODULE_12__[\"html\"])(this);\n this._DialogObject.contentAppChild(contentElm);\n this.attributeType = this.options.attributeType;\n this.attributeCamera = this.options.attribute.camera.content;\n\n // 创建标签页\n tabsElm = new _Element_cy_html_tabs__WEBPACK_IMPORTED_MODULE_10__[\"default\"]('assemble-object-edit-tabs', undefined, this.sdk); // 颜色组件\n colorPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName(\"color\")[0],\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: this.color,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this14.color = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this14.color = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n linecolorPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName(\"lineColor\")[0],\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: this.lineColor,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this14.lineColor = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this14.lineColor = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n labelColorPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName(\"labelColor\")[0],\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: this.labelColor,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this14.labelColor = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this14.labelColor = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n labellineColorPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName(\"labelLineColor\")[0],\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: this.labelLineColor,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this14.labelLineColor = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this14.labelLineColor = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n labelBackgroundColorStartPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName(\"labelBackgroundColorStart\")[0],\n size: 'mini',\n alpha: true,\n defaultColor: this.labelBackgroundColorStart,\n disabled: false,\n openPickerAni: 'opacity',\n sure: function sure(color) {\n _this14.labelBackgroundColorStart = color;\n },\n clear: function clear() {\n _this14.labelBackgroundColorStart = 'rgba(255,255,255,1)';\n }\n });\n labelBackgroundColorEndPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName(\"labelBackgroundColorEnd\")[0],\n size: 'mini',\n alpha: true,\n defaultColor: this.labelBackgroundColorEnd,\n disabled: false,\n openPickerAni: 'opacity',\n sure: function sure(color) {\n _this14.labelBackgroundColorEnd = color;\n },\n clear: function clear() {\n _this14.labelBackgroundColorEnd = 'rgba(255,255,255,1)';\n }\n });\n all_elm = contentElm.getElementsByTagName(\"*\");\n AssembleObject.EventBinding(this, all_elm);\n this._elms.color = [colorPicker];\n this._elms.lineColor = [linecolorPicker];\n this._elms.labelColor = [labelColorPicker];\n this._elms.labelLineColor = [labellineColorPicker];\n this._elms.labelBackgroundColorStart = [labelBackgroundColorStartPicker];\n this._elms.labelBackgroundColorEnd = [labelBackgroundColorEndPicker];\n heightBoxElm = this._DialogObject._element.content.getElementsByClassName('height-box')[0];\n heightElm = heightBoxElm.getElementsByClassName('height')[0];\n heightConfirmElm = this._DialogObject._element.content.getElementsByClassName('height-confirm')[0];\n heightElm.value = 10;\n if (this.heightMode == 2) {\n heightBoxElm && (heightBoxElm.className = 'input-number input-number-unit-1 height-box disabled');\n heightConfirmElm && heightConfirmElm.setAttribute('disabled', 'disabled');\n } else {\n heightBoxElm && (heightBoxElm.className = 'input-number input-number-unit-1 height-box');\n heightConfirmElm && heightConfirmElm.removeAttribute('disabled');\n }\n heightModeData = [{\n name: '海拔高度',\n value: '海拔高度',\n key: '0'\n }, {\n name: '相对地表',\n value: '相对地表',\n key: '1'\n }, {\n name: '依附模型',\n value: '依附模型',\n key: '2'\n }];\n heightModeObject = Object(_Element_datalist__WEBPACK_IMPORTED_MODULE_18__[\"legp\"])(this._DialogObject._element.content.getElementsByClassName('height-mode-box')[0], '.height-mode');\n if (!heightModeObject) {\n _context7.next = 58;\n break;\n }\n heightModeObject.legp_search(heightModeData);\n heightModeDataLegpElm = this._DialogObject._element.content.getElementsByClassName('height-mode')[0].getElementsByTagName('input')[0];\n i = 0;\n case 42:\n if (!(i < heightModeData.length)) {\n _context7.next = 50;\n break;\n }\n if (!(heightModeData[i].key == this.heightMode)) {\n _context7.next = 47;\n break;\n }\n heightModeDataLegpElm.value = heightModeData[i].value;\n heightModeObject.legp_searchActive(heightModeData[i].value);\n return _context7.abrupt(\"break\", 50);\n case 47:\n i++;\n _context7.next = 42;\n break;\n case 50:\n heightModeDataLegpElm.addEventListener('input', function () {\n for (var _i5 = 0; _i5 < heightModeData.length; _i5++) {\n if (heightModeData[_i5].value === heightModeDataLegpElm.value) {\n _this14.heightMode = heightModeData[_i5].key;\n break;\n }\n }\n });\n heightElm.addEventListener('input', function () {\n switch (_this14.heightMode) {\n case 0:\n case '0':\n break;\n case 1:\n case '1':\n break;\n case 2:\n case '2':\n break;\n }\n });\n this._elms.height = heightElm;\n this._elms.heightBox = heightBoxElm;\n this._elms.heightMode = heightModeDataLegpElm;\n this._elms.heightConfirm = heightConfirmElm;\n this._elms.heightModeObject = heightModeObject;\n heightConfirmElm.addEventListener('click', function () {\n if (_this14.operate.positionEditing) {\n _this14.positionEditing = false;\n _this14.height = _this14.height + Number(heightElm.value);\n } else {\n AssembleObject.closeNodeEdit(_this14);\n _this14.heightMode = _this14.heightMode;\n setTimeout(function () {\n _this14.height = _this14.height + Number(heightElm.value);\n }, 100);\n }\n });\n case 58:\n setTimeout(function () {\n _this14.attributeLink = _this14.options.attribute.link.content;\n _this14.attributeVr = _this14.options.attribute.vr.content;\n _this14.cameraSelect && _this14.cameraSelect();\n _this14.goodsSelect && _this14.goodsSelect();\n var tagData = _this14.attributeSelect;\n var attributeElm = _this14._DialogObject._element.content.getElementsByClassName('attribute-select-box')[0];\n if (attributeElm) {\n var legpObject = Object(_Element_datalist__WEBPACK_IMPORTED_MODULE_18__[\"legp\"])(attributeElm, \".attribute-select\");\n legpObject.legp_search(tagData);\n var attributeSelectElm = _this14._DialogObject._element.content.getElementsByClassName('attribute-select')[0].getElementsByTagName('input')[0];\n for (var _i6 = 0; _i6 < tagData.length; _i6++) {\n if (tagData[_i6].key === _this14.options.attributeType) {\n attributeSelectElm.value = tagData[_i6].value;\n legpObject.legp_searchActive(tagData[_i6].value);\n break;\n }\n }\n attributeSelectElm.addEventListener('input', function () {\n for (var _i7 = 0; _i7 < tagData.length; _i7++) {\n if (tagData[_i7].value === attributeSelectElm.value) {\n _this14.attributeType = tagData[_i7].key;\n break;\n }\n }\n });\n }\n createSpatialInfoTableContent();\n var unitData = [{\n name: '平方米',\n value: '平方米'\n }, {\n name: '平方千米',\n value: '平方千米'\n }, {\n name: '亩',\n value: '亩'\n }, {\n name: '公顷',\n value: '公顷'\n }];\n var unitDataLegpObject = Object(_Element_datalist__WEBPACK_IMPORTED_MODULE_18__[\"legp\"])(_this14._DialogObject._element.content.getElementsByClassName('input-select-unit-box')[0], \".input-select-unit\");\n if (unitDataLegpObject) {\n unitDataLegpObject.legp_search(unitData);\n var unitDataLegpElm = _this14._DialogObject._element.content.getElementsByClassName('input-select-unit')[0].getElementsByTagName('input')[0];\n unitDataLegpElm.value = _this14.options['area-unit'];\n for (var _i8 = 0; _i8 < unitData.length; _i8++) {\n if (unitData[_i8].value === unitDataLegpElm.value) {\n unitDataLegpObject.legp_searchActive(unitData[_i8].value);\n break;\n }\n }\n unitDataLegpElm.addEventListener('input', function () {\n for (var _i9 = 0; _i9 < unitData.length; _i9++) {\n if (unitData[_i9].value === unitDataLegpElm.value) {\n _this14.areaUnit = unitData[_i9].value;\n break;\n }\n }\n });\n }\n var fontData = Object(_Element_fontSelect__WEBPACK_IMPORTED_MODULE_19__[\"getFontList\"])();\n var fontObject = Object(_Element_datalist__WEBPACK_IMPORTED_MODULE_18__[\"legp\"])(_this14._DialogObject._element.content.getElementsByClassName('font-select-box')[0], '.font-select');\n if (fontObject) {\n fontObject.legp_search(fontData);\n var fontDataLegpElm = _this14._DialogObject._element.content.getElementsByClassName('font-select')[0].getElementsByTagName('input')[0];\n fontDataLegpElm.value = fontData[_this14.labelFontFamily].value;\n for (var _i10 = 0; _i10 < fontData.length; _i10++) {\n if (fontData[_i10].value == fontDataLegpElm.value) {\n fontObject.legp_searchActive(fontData[_i10].value);\n break;\n }\n }\n fontDataLegpElm.addEventListener('input', function () {\n for (var _i11 = 0; _i11 < fontData.length; _i11++) {\n if (fontData[_i11].value === fontDataLegpElm.value) {\n _this14.labelFontFamily = fontData[_i11].key;\n break;\n }\n }\n });\n _this14._elms.labelFontFamily = [fontDataLegpElm];\n }\n }, 0);\n _context7.next = 62;\n break;\n case 61:\n if (this._DialogObject && this._DialogObject.close) {\n this._DialogObject.close();\n this._DialogObject = null;\n }\n case 62:\n case \"end\":\n return _context7.stop();\n }\n }, _callee3, this);\n }));\n function edit(_x3) {\n return _edit.apply(this, arguments);\n }\n return edit;\n }()\n }, {\n key: \"reset\",\n value: function reset() {\n if (!this.entity) {\n return;\n }\n this.options = this.deepCopyObj(this.originalOptions);\n this.name = this.originalOptions.name;\n this.color = this.originalOptions.color;\n this.lineColor = this.originalOptions.line.color;\n this.lineWidth = this.originalOptions.line.width;\n this.area = this.originalOptions.area;\n this.areaUnit = this.originalOptions['area-unit'];\n this.labelShow = this.originalOptions.label.show;\n this.labelColor = this.originalOptions.label.color;\n this.labelFontSize = this.originalOptions.label.fontSize;\n this.labelFontFamily = this.originalOptions.label.fontFamily;\n this.labelScaleByDistance = this.originalOptions.label.scaleByDistance;\n this.labelNear = this.originalOptions.label.near;\n this.labelFar = this.originalOptions.label.far;\n this.labelLineWidth = this.originalOptions.label.lineWidth;\n this.labelPixelOffset = this.originalOptions.label.pixelOffset;\n this.labelLineColor = this.originalOptions.label.lineColor;\n this.labelBackgroundColorStart = this.originalOptions.label.backgroundColor[0];\n this.labelBackgroundColorEnd = this.originalOptions.label.backgroundColor[1];\n this.attributeLink = this.options.attribute.link.content;\n this.attributeCamera = this.options.attribute.camera.content;\n this.attributeVr = this.options.attribute.vr.content;\n this.attributeGoods = this.options.attribute.goods.content;\n this.cameraSelect && this.cameraSelect();\n this.goodsSelect && this.goodsSelect();\n for (var i = 0; i < this.options.positions.length; i++) {\n if (this._elms.lng && this._elms.lng[i]) {\n this._elms.lng[i].innerHTML = this.options.positions[i].lng.toFixed(8);\n }\n if (this._elms.lat && this._elms.lat[i]) {\n this._elms.lat[i].innerHTML = this.options.positions[i].lat.toFixed(8);\n }\n if (this._elms.alt && this._elms.alt[i]) {\n this._elms.alt[i].innerHTML = Number(this.options.height.toFixed(2));\n }\n }\n this.heightMode = this.heightMode;\n for (var _i12 = 0; _i12 < this.nodePoints.length; _i12++) {\n this.sdk.viewer.entities.remove(this.nodePoints[_i12]);\n }\n this.previous = null;\n this.nodePoints = [];\n YJ.Measure.SetMeasureStatus(false);\n this.event && this.event.destroy();\n this.tip && this.tip.destroy();\n }\n }, {\n key: \"remove\",\n value: function () {\n var _remove = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee4() {\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee4$(_context8) {\n while (1) switch (_context8.prev = _context8.next) {\n case 0:\n this.sdk.viewer.entities.remove(this.entity);\n this.label && this.label.remove();\n this.event && this.event.destroy();\n this.tip && this.tip.destroy();\n this.entity = null;\n if (this._DialogObject && !this._DialogObject.isDestroy) {\n this._DialogObject.close();\n this._DialogObject = null;\n }\n _context8.next = 8;\n return this.sdk.removeIncetance(this.options.id);\n case 8:\n _context8.next = 10;\n return Object(_Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_17__[\"syncData\"])(this.sdk, this.options.id);\n case 10:\n case \"end\":\n return _context8.stop();\n }\n }, _callee4, this);\n }));\n function remove() {\n return _remove.apply(this, arguments);\n }\n return remove;\n }()\n }, {\n key: \"_addLink\",\n value: function _addLink() {\n // document.getElementsByClassName\n if (this._DialogObject._element.content.getElementsByClassName('link_add')[0] && this._DialogObject._element.content.getElementsByClassName('link_add')[0].value) {\n this.options.attribute.link.content.push({\n name: '链接',\n url: this._DialogObject._element.content.getElementsByClassName('link_add')[0].value\n });\n this._DialogObject._element.content.getElementsByClassName('link_add')[0].value = '';\n this.attributeLink = this.options.attribute.link.content;\n } else {\n this.Dialog.clickAddLink && this.Dialog.clickAddLink();\n }\n }\n }, {\n key: \"addAttributeLink\",\n value: function addAttributeLink(link) {\n this.options.attribute.link.content.push({\n name: '链接',\n url: link\n });\n this.attributeLink = this.options.attribute.link.content;\n }\n }, {\n key: \"_addRr\",\n value: function _addRr() {\n if (this._DialogObject._element.content.getElementsByClassName('vr_add')[0].value) {\n this.options.attribute.vr.content.push({\n name: '全景图',\n url: this._DialogObject._element.content.getElementsByClassName('vr_add')[0].value\n });\n this._DialogObject._element.content.getElementsByClassName('vr_add')[0].value = '';\n this.attributeVr = this.options.attribute.vr.content;\n } else {\n this.Dialog.clickAddVr && this.Dialog.clickAddVr();\n }\n }\n }, {\n key: \"addAttributeRr\",\n value: function addAttributeRr(vr) {\n this.options.attribute.vr.content.push({\n name: '全景图',\n url: vr\n });\n this.attributeVr = this.options.attribute.vr.content;\n }\n\n /**\r\n * 飞到\r\n */\n }, {\n key: \"flyTo\",\n value: (function () {\n var _flyTo = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee5() {\n var options,\n orientation,\n lng,\n lat,\n alt,\n destination,\n position,\n positionArray,\n ground,\n i,\n height,\n a,\n _i13,\n BoundingSphere,\n _args9 = arguments;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee5$(_context9) {\n while (1) switch (_context9.prev = _context9.next) {\n case 0:\n options = _args9.length > 0 && _args9[0] !== undefined ? _args9[0] : {};\n if (!this._error) {\n _context9.next = 3;\n break;\n }\n return _context9.abrupt(\"return\");\n case 3:\n Object(_Global_global__WEBPACK_IMPORTED_MODULE_21__[\"setActiveViewer\"])(0);\n Object(_Global_global__WEBPACK_IMPORTED_MODULE_21__[\"closeRotateAround\"])(this.sdk);\n Object(_Global_global__WEBPACK_IMPORTED_MODULE_21__[\"closeViewFollow\"])(this.sdk);\n if (!(this.options.customView && this.options.customView.relativePosition && this.options.customView.orientation)) {\n _context9.next = 25;\n break;\n }\n orientation = {\n heading: Cesium.Math.toRadians(this.options.customView.orientation.heading || 0.0),\n pitch: Cesium.Math.toRadians(this.options.customView.orientation.pitch || -60.0),\n roll: Cesium.Math.toRadians(this.options.customView.orientation.roll || 0.0)\n };\n lng = this.options.customView.relativePosition.lng;\n lat = this.options.customView.relativePosition.lat;\n alt = this.options.customView.relativePosition.alt;\n destination = Cesium.Cartesian3.fromDegrees(lng, lat, alt);\n position = {\n lng: 0,\n lat: 0\n };\n if (this.options.position) {\n position = _objectSpread({}, this.options.position);\n } else if (this.options.positions) {\n position = _objectSpread({}, this.options.positions[0]);\n } else if (this.options.center) {\n position = _objectSpread({}, this.options.center);\n } else if (this.options.start) {\n position = _objectSpread({}, this.options.start);\n } else {\n if (this.options.hasOwnProperty('lng')) {\n position.lng = this.options.lng;\n }\n if (this.options.hasOwnProperty('lat')) {\n position.lat = this.options.lat;\n }\n if (this.options.hasOwnProperty('alt')) {\n position.alt = this.options.alt;\n }\n }\n // 如果没有高度值,则获取紧贴高度计算\n if (position.hasOwnProperty('alt')) {\n _context9.next = 18;\n break;\n }\n _context9.next = 17;\n return this.getClampToHeight(position);\n case 17:\n position.alt = _context9.sent;\n case 18:\n lng = this.options.customView.relativePosition.lng + position.lng;\n lat = this.options.customView.relativePosition.lat + position.lat;\n alt = this.options.customView.relativePosition.alt + position.alt;\n destination = Cesium.Cartesian3.fromDegrees(lng, lat, alt);\n this.sdk.viewer.camera.flyTo({\n destination: destination,\n orientation: orientation\n });\n _context9.next = 51;\n break;\n case 25:\n positionArray = [];\n _context9.t0 = this.heightMode;\n _context9.next = _context9.t0 === 0 ? 29 : _context9.t0 === '0' ? 29 : _context9.t0 === 1 ? 31 : _context9.t0 === '1' ? 31 : _context9.t0 === 2 ? 33 : _context9.t0 === '2' ? 33 : 35;\n break;\n case 29:\n ground = false;\n return _context9.abrupt(\"break\", 35);\n case 31:\n ground = false;\n return _context9.abrupt(\"break\", 35);\n case 33:\n ground = true;\n return _context9.abrupt(\"break\", 35);\n case 35:\n if (!ground) {\n _context9.next = 48;\n break;\n }\n i = 0;\n case 37:\n if (!(i < this.options.positions.length)) {\n _context9.next = 46;\n break;\n }\n _context9.next = 40;\n return this.getClampToHeight(this.options.positions[i]);\n case 40:\n height = _context9.sent;\n a = Cesium.Cartesian3.fromDegrees(this.options.positions[i].lng, this.options.positions[i].lat, height);\n positionArray.push(a.x, a.y, a.z);\n case 43:\n i++;\n _context9.next = 37;\n break;\n case 46:\n _context9.next = 49;\n break;\n case 48:\n if (this.positionsH) {\n for (_i13 = 0; _i13 < this.positionsH.length; _i13++) {\n positionArray.push(this.positionsH[_i13].x, this.positionsH[_i13].y, this.positionsH[_i13].z);\n }\n }\n case 49:\n BoundingSphere = Cesium.BoundingSphere.fromVertices(positionArray);\n this.sdk.viewer.camera.flyToBoundingSphere(BoundingSphere, {\n offset: options.orientation || {\n heading: Cesium.Math.toRadians(0.0),\n pitch: Cesium.Math.toRadians(-90.0),\n roll: Cesium.Math.toRadians(0.0)\n }\n });\n case 51:\n case \"end\":\n return _context9.stop();\n }\n }, _callee5, this);\n }));\n function flyTo() {\n return _flyTo.apply(this, arguments);\n }\n return flyTo;\n }()\n /**\r\n * 打开富文本框\r\n */\n )\n }, {\n key: \"openRichTextEditor\",\n value: function openRichTextEditor(e) {\n var _this15 = this;\n // var ue = UE.getEditor('app');\n _Element_richText__WEBPACK_IMPORTED_MODULE_11__[\"default\"].open(this.options.id, this.options.name, this.options.richTextContent);\n _Element_richText__WEBPACK_IMPORTED_MODULE_11__[\"default\"].primaryCallBack = function (content) {\n _this15.options.richTextContent = content;\n };\n }\n\n /**@desc 打开平移功能\r\n *\r\n * @memberOf Source\r\n * @param status {boolean}\r\n *\r\n * */\n }, {\n key: \"positionEditing\",\n get: function get() {\n return this.operate.positionEditing;\n },\n set: function set(status) {\n var _this16 = this;\n if (YJ.Measure.GetMeasureStatus() || !this.sdk || !this.sdk.viewer || !this.entity || !this.entity.polygon) {\n return;\n }\n var _this = this;\n this.event && this.event.destroy();\n this.event = new _Event_index__WEBPACK_IMPORTED_MODULE_15__[\"default\"](this.sdk);\n this.operate.positionEditing = status;\n if (status === true) {\n var _Cesium$Cartesian;\n this.previous = {\n positions: _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(this.positions)\n };\n this.tip && this.tip.destroy();\n this.tip = new _MouseTip__WEBPACK_IMPORTED_MODULE_16__[\"default\"]('点击鼠标左键确认,右键取消', this.sdk);\n this.label && (this.label.entity.billboard.color = Cesium.Color.fromCssColorString(\"rgba(255,255,255,0.9)\"));\n this.picking = false;\n var array = [];\n var positions = _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(this.positions);\n var disparity = [];\n for (var i = 0; i < positions.length; i++) {\n var position = this.cartesian3Towgs84(positions[i], this.sdk.viewer);\n array.push([position.lng, position.lat]);\n }\n var firstposition = this.cartesian3Towgs84(positions[0], this.sdk.viewer);\n array.push([firstposition.lng, firstposition.lat]);\n var polygon = turf.polygon([array]);\n var centroid = turf.centroid(polygon);\n var center = (_Cesium$Cartesian = Cesium.Cartesian3).fromDegrees.apply(_Cesium$Cartesian, _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(centroid.geometry.coordinates));\n for (var _i14 = 0; _i14 < positions.length; _i14++) {\n center.x - positions[_i14].x;\n disparity.push({\n x: center.x - positions[_i14].x,\n y: center.y - positions[_i14].y,\n z: center.z - positions[_i14].z\n });\n }\n var newpositions = [];\n this.event.mouse_move(function (movement, cartesian) {\n var position84 = _this16.cartesian3Towgs84(cartesian, _this16.sdk.viewer);\n newpositions = [];\n for (var _i15 = 0; _i15 < disparity.length; _i15++) {\n newpositions.push({\n x: cartesian.x - disparity[_i15].x,\n y: cartesian.y - disparity[_i15].y,\n z: cartesian.z - disparity[_i15].z\n });\n }\n // this.label.position = [position84.lng, position84.lat, position84.alt]\n _this16.tip.setPosition(cartesian, movement.endPosition.x, movement.endPosition.y);\n });\n this.event.mouse_left(function (movement, cartesian) {\n _this16.event.mouse_move(function () {});\n _this16.event.mouse_left(function () {});\n _this16.event.mouse_right(function () {});\n _this16.event.gesture_pinck_start(function () {});\n newpositions = [];\n for (var _i16 = 0; _i16 < disparity.length; _i16++) {\n var pos3 = {\n x: cartesian.x - disparity[_i16].x,\n y: cartesian.y - disparity[_i16].y,\n z: cartesian.z - disparity[_i16].z\n };\n newpositions.push(pos3);\n _this16.options.positions[_i16] = _this16.cartesian3Towgs84(pos3, _this16.sdk.viewer);\n if (_this16._elms.lng && _this16._elms.lng[_i16]) {\n _this16._elms.lng[_i16].innerHTML = _this16.options.positions[_i16].lng.toFixed(8);\n }\n if (_this16._elms.lat && _this16._elms.lat[_i16]) {\n _this16._elms.lat[_i16].innerHTML = _this16.options.positions[_i16].lat.toFixed(8);\n }\n }\n _this16.positions = newpositions;\n _this16.previous = null;\n _this16.positionEditing = false;\n });\n this.event.mouse_right(function (movement, cartesian) {\n _this16.positionEditing = false;\n });\n this.event.gesture_pinck_start(function (movement, cartesian) {\n var startTime = new Date();\n _this16.event.gesture_pinck_end(function () {\n var endTime = new Date();\n if (endTime - startTime >= 500) {\n // 长按取消\n _this16.positionEditing = false;\n } else {\n _this16.event.mouse_move(function () {});\n _this16.event.mouse_left(function () {});\n _this16.event.mouse_right(function () {});\n _this16.event.gesture_pinck_start(function () {});\n newpositions = [];\n for (var _i17 = 0; _i17 < disparity.length; _i17++) {\n var pos3 = {\n x: cartesian.x - disparity[_i17].x,\n y: cartesian.y - disparity[_i17].y,\n z: cartesian.z - disparity[_i17].z\n };\n newpositions.push(pos3);\n _this16.options.positions[_i17] = _this16.cartesian3Towgs84(pos3, _this16.sdk.viewer);\n if (_this16._elms.lng && _this16._elms.lng[_i17]) {\n _this16._elms.lng[_i17].innerHTML = _this16.options.positions[_i17].lng.toFixed(8);\n }\n if (_this16._elms.lat && _this16._elms.lat[_i17]) {\n _this16._elms.lat[_i17].innerHTML = _this16.options.positions[_i17].lat.toFixed(8);\n }\n }\n _this16.positions = newpositions;\n _this16.previous = {\n positions: _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(_this16.positions)\n };\n _this16.positionEditing = false;\n }\n });\n });\n this.entity.polygon.hierarchy = new Cesium.CallbackProperty(function () {\n var position84 = [];\n if (newpositions.length > 0) {\n for (var _i18 = 0; _i18 < newpositions.length; _i18++) {\n position84.push(_this.cartesian3Towgs84(newpositions[_i18], _this.sdk.viewer));\n }\n } else {\n for (var _i19 = 0; _i19 < positions.length; _i19++) {\n position84.push(_this.cartesian3Towgs84(positions[_i19], _this.sdk.viewer));\n }\n }\n _this.renewPositions(position84);\n return new Cesium.PolygonHierarchy(_this.positionsH);\n }, false);\n this.entity.polyline.positions = new Cesium.CallbackProperty(function () {\n return [].concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(_this.positionsH), [_this.positionsH[0], _this.positionsH[1]]);\n }, false);\n } else {\n if (this.label && this.label.entity && this.label.entity.billboard) {\n this.label.entity.billboard.color = Cesium.Color.fromCssColorString(\"rgba(255,255,255,1)\");\n }\n this.picking = true;\n if (this.event) {\n this.event.mouse_move(function () {});\n this.event.mouse_left(function () {});\n this.event.mouse_right(function () {});\n this.event.gesture_pinck_start(function () {});\n this.event.destroy();\n }\n this.tip && this.tip.destroy();\n if (!this.previous) {\n this.previous = {\n positions: _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(this.positions)\n };\n } else {\n this.positions = _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(this.previous.positions);\n }\n var position84 = [];\n for (var _i20 = 0; _i20 < this.positions.length; _i20++) {\n position84.push(_this.cartesian3Towgs84(this.positions[_i20], _this.sdk.viewer));\n }\n this.renewPositions(position84);\n this.entity.polygon.hierarchy = new Cesium.CallbackProperty(function () {\n return new Cesium.PolygonHierarchy(_this.positionsH);\n }, true);\n this.entity.polyline.positions = new Cesium.CallbackProperty(function () {\n return [].concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(_this.positionsH), [_this.positionsH[0], _this.positionsH[1]]);\n }, true);\n }\n }\n }, {\n key: \"setPosition\",\n value: function setPosition(v) {\n var _Cesium$Cartesian2;\n var cartesian = Cesium.Cartesian3.fromDegrees(v.position.lng, v.position.lat, v.position.alt);\n var positions = _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(this.positions);\n var array = [];\n var disparity = [];\n for (var i = 0; i < positions.length; i++) {\n var position = this.cartesian3Towgs84(positions[i], this.sdk.viewer);\n array.push([position.lng, position.lat]);\n }\n var firstposition = this.cartesian3Towgs84(positions[0], this.sdk.viewer);\n array.push([firstposition.lng, firstposition.lat]);\n var polygon = turf.polygon([array]);\n var centroid = turf.centroid(polygon);\n var center = (_Cesium$Cartesian2 = Cesium.Cartesian3).fromDegrees.apply(_Cesium$Cartesian2, _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(centroid.geometry.coordinates));\n for (var _i21 = 0; _i21 < positions.length; _i21++) {\n disparity.push({\n x: center.x - positions[_i21].x,\n y: center.y - positions[_i21].y,\n z: center.z - positions[_i21].z\n });\n }\n var newpositions = [];\n for (var _i22 = 0; _i22 < disparity.length; _i22++) {\n newpositions.push({\n x: cartesian.x - disparity[_i22].x,\n y: cartesian.y - disparity[_i22].y,\n z: cartesian.z - disparity[_i22].z\n });\n }\n this.label.position = [v.position.lng, v.position.lat, v.position.alt];\n var positions84 = [];\n if (newpositions.length > 0) {\n for (var _i23 = 0; _i23 < newpositions.length; _i23++) {\n positions84.push(this.cartesian3Towgs84(newpositions[_i23], this.sdk.viewer));\n }\n }\n var arr = this.computeAssemble(positions84);\n if (arr.length == 0) {\n return;\n }\n this.entity.polygon.hierarchy = new Cesium.CallbackProperty(function () {\n return new Cesium.PolygonHierarchy(arr);\n }, false);\n this.entity.polyline.positions = new Cesium.CallbackProperty(function () {\n if (arr.length >= 3) {\n return [].concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(arr), [arr[0], arr[1]]);\n } else {\n return _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(arr);\n }\n }, false);\n }\n }, {\n key: \"setDIV\",\n value: function setDIV() {\n var _this17 = this;\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {\n domid: \"\",\n x: 10,\n y: 10\n };\n options.x = options.x || options.x === 0 ? options.x : 10;\n options.y = options.y || options.y === 0 ? options.y : 10;\n var positions = this.computeAssemble(this.options.positions);\n if (positions.length == 0) {\n return;\n }\n var points = [[]];\n for (var i = 0; i < positions.length; i++) {\n var _position = this.cartesian3Towgs84(positions[i], this.sdk.viewer);\n points[0].push([_position.lng, _position.lat]);\n }\n var position = this.cartesian3Towgs84(positions[0], this.sdk.viewer);\n points[0].push([position.lng, position.lat]);\n var polygon = turf.polygon(points);\n // let centroid = turf.centroid(polygon);\n var centroid = turf.pointOnFeature(polygon);\n var siteInfoDom = document.getElementById(options.domid);\n var siteInfoPosition = Cesium.Cartesian3.fromDegrees(centroid.geometry.coordinates[0], centroid.geometry.coordinates[1]);\n this.sdk.viewer.scene.postRender.addEventListener(function (percentage) {\n //转换到屏幕坐标\n if (siteInfoDom.style.display === 'block' || siteInfoDom.style.display === '') {\n var winpos = _this17.sdk.viewer.scene.cartesianToCanvasCoordinates(siteInfoPosition);\n if (winpos) {\n siteInfoDom.style.left = (winpos.x + options.x).toFixed(0) + 'px';\n siteInfoDom.style.top = (winpos.y + options.y).toFixed(0) + 'px';\n }\n }\n });\n }\n\n // 更新坐标\n }, {\n key: \"renewPositions\",\n value: function renewPositions(position84) {\n var _this18 = this;\n if (this._error || !this.sdk.viewer) {\n return;\n }\n var ground = false;\n var array = [];\n var positions = this.options.positions;\n if (position84) {\n positions = position84;\n }\n var fromDegreesArray = [];\n for (var i = 0; i < positions.length; i++) {\n fromDegreesArray.push(positions[i].lng, positions[i].lat);\n }\n this.positions = Cesium.Cartesian3.fromDegreesArray(fromDegreesArray);\n var positionsA = this.computeAssemble(positions);\n if (positionsA.length == 0) {\n return;\n }\n var points = [[]];\n var pos84 = [];\n for (var _i24 = 0; _i24 < positionsA.length; _i24++) {\n var _position2 = this.cartesian3Towgs84(positionsA[_i24], this.sdk.viewer);\n pos84.push(_position2);\n points[0].push([_position2.lng, _position2.lat]);\n }\n var position = this.cartesian3Towgs84(positionsA[0], this.sdk.viewer);\n points[0].push([position.lng, position.lat]);\n var height = 0;\n var polygon = turf.polygon(points);\n var centroid = turf.pointOnFeature(polygon);\n switch (this.options.heightMode) {\n case '0':\n case 0:\n ground = false;\n break;\n case '1':\n case 1:\n height = this.sdk.viewer.scene.globe.getHeight(Cesium.Cartographic.fromDegrees(centroid.geometry.coordinates[0], centroid.geometry.coordinates[1])) || 0;\n ground = false;\n break;\n case '2':\n case 2:\n ground = true;\n break;\n }\n var fromDegreesArray2 = [];\n if (!ground && this.nodePoints.length == 0) {\n for (var _i25 = 0; _i25 < points[0].length; _i25++) {\n fromDegreesArray2.push(points[0][_i25][0], points[0][_i25][1], this.height + height);\n }\n this.positionsH = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray2);\n this.label && (this.label.position = [centroid.geometry.coordinates[0], centroid.geometry.coordinates[1], this.height + height]);\n } else {\n this.positionsH = positionsA;\n setTimeout(function () {\n if (!_this18.sdk.viewer) {\n return;\n }\n var objectsToExclude = _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(_this18.sdk.viewer.entities.values);\n _this18.getClampToHeight({\n lng: centroid.geometry.coordinates[0],\n lat: centroid.geometry.coordinates[1]\n }, objectsToExclude).then(function (height) {\n _this18.label && (_this18.label.position = [centroid.geometry.coordinates[0], centroid.geometry.coordinates[1], height]);\n });\n }, 100);\n }\n\n // 计算投影面积\n this.options.areaByMeter = this.computeArea(pos84);\n this.areaUnit = this.areaUnit;\n return fromDegreesArray;\n }\n }], [{\n key: \"create\",\n value: function create(that) {\n var positions = that.options.positions;\n var fromDegreesArray = [];\n for (var i = 0; i < positions.length; i++) {\n fromDegreesArray.push(positions[i].lng, positions[i].lat);\n }\n that.positions = Cesium.Cartesian3.fromDegreesArray(fromDegreesArray);\n var positionsA = that.computeAssemble(that.options.positions);\n if (positionsA.length == 0) {\n return;\n }\n var points = [[]];\n for (var _i26 = 0; _i26 < positionsA.length; _i26++) {\n var _position3 = that.cartesian3Towgs84(positionsA[_i26], that.sdk.viewer);\n points[0].push([_position3.lng, _position3.lat]);\n }\n var position = that.cartesian3Towgs84(positionsA[0], that.sdk.viewer);\n points[0].push([position.lng, position.lat]);\n var polygon = turf.polygon(points);\n // let centroid = turf.centroid(polygon);\n var centroid = turf.pointOnFeature(polygon);\n var ground;\n var height = 0;\n switch (that.options.heightMode) {\n case '0':\n case 0:\n ground = false;\n break;\n case '1':\n case 1:\n height = that.sdk.viewer.scene.globe.getHeight(Cesium.Cartographic.fromDegrees(centroid.geometry.coordinates[0], centroid.geometry.coordinates[1])) || 0;\n ground = false;\n break;\n case '2':\n case 2:\n ground = true;\n break;\n }\n if (!that.options.label.position) {\n that.options.label.position = {\n lng: centroid.geometry.coordinates[0],\n lat: centroid.geometry.coordinates[1],\n alt: that.height + height\n };\n }\n var fromDegreesArray2 = [];\n for (var _i27 = 0; _i27 < points[0].length; _i27++) {\n fromDegreesArray2.push(points[0][_i27][0], points[0][_i27][1], that.height + height);\n }\n var material = Cesium.Color.fromCssColorString(that.options.color);\n if (that.sdk.viewer.scene.mode === 2) {\n ground = false;\n material = new Cesium.CustomColorMaterialSource({\n color: that.options.color\n });\n }\n that.options.label.ground = ground;\n that.positionsH = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray2);\n that.entity = that.sdk.viewer.entities.add({\n show: that.options.show,\n id: that.options.id,\n polygon: {\n hierarchy: !ground ? new Cesium.PolygonHierarchy(that.positionsH) : new Cesium.PolygonHierarchy(positionsA),\n perPositionHeight: !ground ? true : false,\n material: material,\n zIndex: that.sdk._entityZIndex\n },\n polyline: {\n positions: [].concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(that.positionsH), [that.positionsH[0], that.positionsH[1]]),\n width: that.options.line.width,\n material: Cesium.Color.fromCssColorString(that.options.line.color),\n clampToGround: !ground ? false : true,\n arcType: !ground ? Cesium.ArcType.NONE : Cesium.ArcType.GEODESIC,\n zIndex: that.sdk._entityZIndex\n }\n });\n that.sdk._entityZIndex++;\n AssembleObject.createLabel(that);\n var pos84 = [];\n for (var _i28 = 0; _i28 < positionsA.length; _i28++) {\n pos84.push(that.cartesian3Towgs84(positionsA[_i28], that.sdk.viewer));\n }\n that.options.areaByMeter = that.computeArea(pos84);\n switch (that.options['area-unit']) {\n case '平方米':\n that.options.area = that.options.areaByMeter;\n break;\n case '平方千米':\n that.options.area = Number((that.options.areaByMeter / 1000000).toFixed(8));\n break;\n case '亩':\n that.options.area = Number((that.options.areaByMeter / 666.6666667).toFixed(4));\n break;\n case '公顷':\n that.options.area = Number((that.options.areaByMeter / 10000).toFixed(6));\n break;\n default:\n that.options.area = that.options.areaByMeter;\n }\n Object(_Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_17__[\"syncData\"])(that.sdk, that.options.id);\n if (that.options.show) {\n Object(_Global_SplitScreen__WEBPACK_IMPORTED_MODULE_20__[\"setSplitDirection\"])(0, that.options.id);\n }\n }\n }, {\n key: \"createLabel\",\n value: function () {\n var _createLabel = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee6(that) {\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee6$(_context10) {\n while (1) switch (_context10.prev = _context10.next) {\n case 0:\n // 标签\n that.label = new _LabelObject__WEBPACK_IMPORTED_MODULE_14__[\"default\"](that.sdk, {\n id: that.options.id,\n show: that.options.show ? that.options.label.show : false,\n position: [that.options.label.position.lng, that.options.label.position.lat, that.options.label.position.alt],\n text: that.options.name,\n fontSize: that.options.label.fontSize,\n fontFamily: that.options.label.fontFamily,\n color: that.options.label.color,\n pixelOffset: that.options.label.pixelOffset,\n backgroundColor: that.options.label.backgroundColor,\n lineWidth: that.options.label.lineWidth,\n lineColor: that.options.label.lineColor,\n scaleByDistance: that.options.label.scaleByDistance,\n near: that.options.label.near,\n far: that.options.label.far,\n ground: that.options.label.ground\n });\n case 1:\n case \"end\":\n return _context10.stop();\n }\n }, _callee6);\n }));\n function createLabel(_x4) {\n return _createLabel.apply(this, arguments);\n }\n return createLabel;\n }()\n }, {\n key: \"EventBinding\",\n value: function EventBinding(that, elements) {\n var _loop10 = function _loop10() {\n var Event = [];\n var isEvent = false;\n var removeName = [];\n if (!elements[i] || !elements[i].attributes) {\n return 1; // continue\n }\n var _iterator5 = _createForOfIteratorHelper(elements[i].attributes),\n _step5;\n try {\n var _loop11 = function _loop11() {\n var m = _step5.value;\n switch (m.name) {\n case '@model':\n {\n isEvent = true;\n if (elements[i].type == 'checkbox') {\n Event.push(function (e) {\n that[m.value] = e.target.checked;\n });\n elements[i].checked = that[m.value];\n } else {\n Event.push(function (e) {\n var value = e.target.value;\n if (e.target.type == 'number') {\n if (e.data != '.' && (e.data != '-' || e.target.value)) {\n value = Number(value);\n if (e.target.max && value > Number(e.target.max)) {\n value = Number(e.target.max);\n }\n if (e.target.min && value < Number(e.target.min)) {\n value = Number(e.target.min);\n }\n that[m.value] = value;\n }\n } else {\n that[m.value] = value;\n }\n });\n if (elements[i].nodeName == 'IMG') {\n elements[i].src = that[m.value];\n } else {\n elements[i].value = that[m.value];\n }\n }\n if (that._elms[m.value]) {\n that._elms[m.value].push(elements[i]);\n } else {\n that._elms[m.value] = [elements[i]];\n }\n removeName.push(m.name);\n break;\n }\n case '@click':\n {\n elements[i].addEventListener('click', function (e) {\n if (typeof that[m.value] === 'function') {\n that[m.value](e);\n }\n });\n removeName.push(m.name);\n // elements[i].attributes.removeNamedItem(m.name)\n break;\n }\n case '@change':\n {\n isEvent = true;\n Event.push(function (e) {\n var value = e.target.value;\n if (e.target.type == 'number' && value != '') {\n value = Number(value);\n e.target.value = value;\n }\n if (typeof that[m.value] === 'function') {\n that[m.value](e, value);\n }\n });\n break;\n }\n }\n // elements[i].attributes[m] = undefined\n };\n for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {\n _loop11();\n }\n } catch (err) {\n _iterator5.e(err);\n } finally {\n _iterator5.f();\n }\n for (var n = 0; n < removeName.length; n++) {\n elements[i].attributes.removeNamedItem(removeName[n]);\n }\n if (isEvent) {\n var ventType = 'input';\n if (elements[i].tagName != 'INPUT' || elements[i].type == 'checkbox') {\n ventType = 'change';\n }\n elements[i].addEventListener(ventType, function (e) {\n for (var t = 0; t < Event.length; t++) {\n Event[t](e);\n }\n });\n }\n };\n for (var i = 0; i < elements.length; i++) {\n if (_loop10()) continue;\n }\n }\n }, {\n key: \"nodeEdit\",\n value: function nodeEdit(that) {\n var cb = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};\n that.positionEditing = false;\n if (YJ.Measure.GetMeasureStatus()) {\n cb('上一次测量未结束');\n } else {\n var createNodePoints = /*#__PURE__*/function () {\n var _ref = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee7() {\n var objectsToExclude, _i30, height, entity;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee7$(_context11) {\n while (1) switch (_context11.prev = _context11.next) {\n case 0:\n objectsToExclude = _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(that.sdk.viewer.entities.values);\n _i30 = 0;\n case 2:\n if (!(_i30 < that.options.positions.length)) {\n _context11.next = 11;\n break;\n }\n _context11.next = 5;\n return that.getClampToHeight(that.options.positions[_i30], objectsToExclude);\n case 5:\n height = _context11.sent;\n entity = that.sdk.viewer.entities.add({\n name: 'node-secondary-edit-point',\n index: _i30,\n position: Cesium.Cartesian3.fromDegrees(that.options.positions[_i30].lng, that.options.positions[_i30].lat, height),\n billboard: {\n image: that.getSourceRootPath() + '/img/point.png',\n width: 15,\n height: 15,\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\n color: Cesium.Color.WHITE.withAlpha(0.99)\n }\n });\n that.nodePoints.push(entity);\n case 8:\n _i30++;\n _context11.next = 2;\n break;\n case 11:\n case \"end\":\n return _context11.stop();\n }\n }, _callee7);\n }));\n return function createNodePoints() {\n return _ref.apply(this, arguments);\n };\n }(); // for (let i = 0; i < that.options.positions.length; i++) {\n // let entity = that.sdk.viewer.entities.add({\n // name: 'node-secondary-edit-point',\n // index: i,\n // position: Cesium.Cartesian3.fromDegrees(that.options.positions[i].lng, that.options.positions[i].lat),\n // billboard: {\n // image: that.getSourceRootPath() + '/img/point.png',\n // width: 15,\n // height: 15,\n // disableDepthTestDistance: Number.POSITIVE_INFINITY,\n // },\n // })\n // nodePoints.push(entity)\n // }\n YJ.Measure.SetMeasureStatus(true);\n that.tip = new _MouseTip__WEBPACK_IMPORTED_MODULE_16__[\"default\"]('请选择一个顶点,右键取消', that.sdk);\n that.event = new _Event_index__WEBPACK_IMPORTED_MODULE_15__[\"default\"](that.sdk);\n that.nodePoints = [];\n var selectPoint;\n var originalPosition;\n var fromDegreesArray = [];\n for (var i = 0; i < that.options.positions.length; i++) {\n fromDegreesArray.push(that.options.positions[i].lng, that.options.positions[i].lat);\n }\n var moveEvent = function moveEvent(movement, cartesian) {\n if (selectPoint) {\n that.options.positions[selectPoint.index] = that.cartesian3Towgs84(cartesian, that.sdk.viewer);\n if (that._elms.lng && that._elms.lng[selectPoint.index]) {\n that._elms.lng[selectPoint.index].innerHTML = that.options.positions[selectPoint.index].lng.toFixed(8);\n }\n if (that._elms.lat && that._elms.lat[selectPoint.index]) {\n that._elms.lat[selectPoint.index].innerHTML = that.options.positions[selectPoint.index].lat.toFixed(8);\n }\n that.renewPositions();\n }\n that.tip.setPosition(cartesian, movement.position ? movement.position.x : movement.endPosition.x, movement.position ? movement.position.y : movement.endPosition.y);\n };\n var leftEvent = function leftEvent(movement, cartesian) {\n moveEvent(movement, cartesian);\n var position84 = that.cartesian3Towgs84(cartesian, that.sdk.viewer);\n if (selectPoint) {\n var index = selectPoint.index;\n var entity = that.sdk.viewer.entities.add({\n name: 'node-secondary-edit-point',\n index: index,\n position: Cesium.Cartesian3.fromDegrees(that.options.positions[selectPoint.index].lng, that.options.positions[selectPoint.index].lat, position84.alt),\n billboard: {\n image: that.getSourceRootPath() + '/img/point.png',\n width: 15,\n height: 15,\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\n color: Cesium.Color.WHITE.withAlpha(0.99)\n }\n });\n that.nodePoints.splice(selectPoint.index, 0, entity);\n selectPoint = null;\n that.tip.set_text('请选择一个顶点,右键取消');\n } else {\n var _position4 = movement.position;\n if (!_position4) {\n _position4 = {\n x: (movement.position1.x + movement.position2.x) / 2,\n y: (movement.position1.y + movement.position2.y) / 2\n };\n }\n var pick = that.sdk.viewer.scene.pick(_position4);\n if (pick && pick.id && pick.id.name && pick.id.name === 'node-secondary-edit-point') {\n selectPoint = pick.id;\n originalPosition = that.cartesian3Towgs84(pick.id.position.getValue(), that.sdk.viewer);\n that.nodePoints.splice(pick.id.index, 1);\n that.sdk.viewer.entities.remove(pick.id);\n that.tip.set_text('左键确认,右键取消');\n }\n }\n that.renewPositions();\n };\n var rightEvent = function rightEvent() {\n that.event.mouse_move(function () {});\n that.event.mouse_left(function () {});\n that.event.mouse_right(function () {});\n that.event.gesture_pinck_start(function () {});\n if (selectPoint) {\n if (!originalPosition) {\n that.options.positions.pop();\n } else {\n that.options.positions[selectPoint.index] = originalPosition;\n }\n if (that._elms.lng && that._elms.lng[selectPoint.index]) {\n that._elms.lng[selectPoint.index].innerHTML = that.options.positions[selectPoint.index].lng.toFixed(8);\n }\n if (that._elms.lat && that._elms.lat[selectPoint.index]) {\n that._elms.lat[selectPoint.index].innerHTML = that.options.positions[selectPoint.index].lat.toFixed(8);\n }\n }\n that.heightMode = that.heightMode;\n that.previous = null;\n };\n that.entity.polyline.clampToGround = true;\n that.entity.polyline.arcType = Cesium.ArcType.GEODESIC;\n that.entity.polygon.perPositionHeight = false;\n that.entity.polygon.hierarchy = new Cesium.CallbackProperty(function () {\n var arr = that.computeAssemble(that.options.positions);\n return new Cesium.PolygonHierarchy(arr);\n }, false);\n that.entity.polyline.positions = new Cesium.CallbackProperty(function () {\n var arr = that.computeAssemble(that.options.positions);\n if (arr.length >= 3) {\n return [].concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(arr), [arr[0], arr[1]]);\n } else {\n return _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(arr);\n }\n }, false);\n var points = [[]];\n var pos84 = [];\n for (var _i29 = 0; _i29 < that.positionsH.length; _i29++) {\n var _position5 = that.cartesian3Towgs84(that.positionsH[_i29], that.sdk.viewer);\n pos84.push(_position5);\n points[0].push([_position5.lng, _position5.lat]);\n }\n var position = that.cartesian3Towgs84(that.positionsH[0], that.sdk.viewer);\n points[0].push([position.lng, position.lat]);\n var polygon = turf.polygon(points);\n var centroid = turf.pointOnFeature(polygon);\n var objectsToExclude = _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(that.sdk.viewer.entities.values);\n that.getClampToHeight({\n lng: centroid.geometry.coordinates[0],\n lat: centroid.geometry.coordinates[1]\n }, objectsToExclude).then(function (height) {\n that.label.position = [centroid.geometry.coordinates[0], centroid.geometry.coordinates[1], height];\n });\n setTimeout(function () {\n that.event.mouse_left(leftEvent);\n that.event.mouse_right(rightEvent);\n that.event.mouse_move(moveEvent);\n that.event.gesture_pinck_start(function (movement, cartesian) {\n var startTime = new Date();\n that.event.gesture_pinck_end(function () {\n var endTime = new Date();\n var pos = {\n position: {\n x: (movement.position1.x + movement.position2.x) / 2,\n y: (movement.position1.y + movement.position2.y) / 2\n }\n };\n if (endTime - startTime >= 500) {\n rightEvent();\n } else {\n leftEvent(pos, cartesian);\n }\n });\n });\n createNodePoints();\n }, 200);\n }\n }\n }, {\n key: \"closeNodeEdit\",\n value: function closeNodeEdit(that) {\n YJ.Measure.SetMeasureStatus(false);\n that.event && that.event.destroy();\n that.tip && that.tip.destroy();\n that.tip = null;\n for (var i = 0; i < that.nodePoints.length; i++) {\n that.sdk.viewer.entities.remove(that.nodePoints[i]);\n }\n that.nodePoints = [];\n that.picking = true;\n }\n }]);\n}(_index__WEBPACK_IMPORTED_MODULE_13__[\"default\"]);\n/* harmony default export */ __webpack_exports__[\"default\"] = (AssembleObject);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvT2JqL0Jhc2UvQXNzZW1ibGVPYmplY3QvaW5kZXguanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvT2JqL0Jhc2UvQXNzZW1ibGVPYmplY3QvaW5kZXguanM/MTRmYiJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICog6ZuG57uT5ZywXHJcbiAqL1xyXG5pbXBvcnQgRGlhbG9nIGZyb20gJy4uLy4uL0VsZW1lbnQvRGlhbG9nJztcclxuaW1wb3J0IGN5X3RhYnMgZnJvbSBcIi4uLy4uL0VsZW1lbnQvY3lfaHRtbF90YWJzXCI7XHJcbmltcG9ydCByaWNoVGV4dCBmcm9tIFwiLi4vLi4vRWxlbWVudC9yaWNoVGV4dFwiO1xyXG5pbXBvcnQgeyBodG1sIH0gZnJvbSBcIi4vX2VsZW1lbnRcIjtcclxuaW1wb3J0IEJhc2UgZnJvbSBcIi4uL2luZGV4XCI7XHJcbmltcG9ydCBMYWJlbE9iamVjdCBmcm9tICcuLi9MYWJlbE9iamVjdCdcclxuaW1wb3J0IE1vdXNlRXZlbnQgZnJvbSAnLi4vLi4vLi4vRXZlbnQvaW5kZXgnXHJcbmltcG9ydCBNb3VzZVRpcCBmcm9tICcuLi8uLi8uLi9Nb3VzZVRpcCdcclxuaW1wb3J0IHsgc3luY0RhdGEgfSBmcm9tICcuLi8uLi8uLi9HbG9iYWwvTXVsdGlWaWV3cG9ydE1vZGUnXHJcbmltcG9ydCB7IGxlZ3AgfSBmcm9tICcuLi8uLi9FbGVtZW50L2RhdGFsaXN0JztcclxuaW1wb3J0IHsgZ2V0Rm9udExpc3QsIGdldEZvbnRGYW1pbHlOYW1lIH0gZnJvbSAnLi4vLi4vRWxlbWVudC9mb250U2VsZWN0J1xyXG5pbXBvcnQgeyBzZXRTcGxpdERpcmVjdGlvbiwgc3luY1NwbGl0RGF0YSwgc2V0QWN0aXZlSWQgfSBmcm9tICcuLi8uLi8uLi9HbG9iYWwvU3BsaXRTY3JlZW4nXHJcbmltcG9ydCB7IHNldEFjdGl2ZVZpZXdlciwgY2xvc2VSb3RhdGVBcm91bmQsIGNsb3NlVmlld0ZvbGxvdyB9IGZyb20gJy4uLy4uLy4uL0dsb2JhbC9nbG9iYWwnXHJcbi8vIGltcG9ydCBFZGl0UGFydGljbGUgZnJvbSBcIi4uLy4uL01vZGVsQ29udHJvbGxlci9FZGl0UGFydGljbGVcIjtcclxuXHJcbmNsYXNzIEFzc2VtYmxlT2JqZWN0IGV4dGVuZHMgQmFzZSB7XHJcbiAgLyoqXHJcbiAgICogQGNvbnN0cnVjdG9yXHJcbiAgICogQHBhcmFtIHNka1xyXG4gICAqIEBkZXNjcmlwdGlvbiDpm4bnu5PlnLBcclxuICAgKiBAcGFyYW0gb3B0aW9ucyB7b2JqZWN0fSDlsZ7mgKdcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5pZCB7c3RyaW5nfSDllK/kuIDmoIfor4ZcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5zaG93PXRydWUge2Jvb2xlYW59IOaYvuekui/pmpDol49cclxuICAgKiBAcGFyYW0gb3B0aW9ucy5uYW1lIHtzdHJpbmd9IOWQjeensFxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmNvbG9yPSdyZ2JhKDI1NSwgMCwgMCwgMC41KScge3N0cmluZ30g6aKc6ImyXHJcbiAgICogQHBhcmFtIG9wdGlvbnMuaGVpZ2h0IHtudW1iZXJ9IOmrmOW6plxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmhlaWdodE1vZGU9MntudW1iZXJ9IOmrmOW6puaooeW8j++8iDDvvJrmtbfmi5Tpq5jluqbvvJsx77ya55u45a+55Zyw6KGo77ybMu+8muS+nemZhOaooeW8j++8iVxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmFyZWFVbml0PSflubPmlrnnsbMnIHtzdHJpbmd9IOmdouenr+WNleS9jVxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxpbmUge29iamVjdH0g6L655qGGXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGluZS53aWR0aD0yIHtzdHJpbmd9IOi+ueahhuWuvVxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxpbmUuY29sb3I9XCJyZ2JhKDE1NSwgMTU1LCAxMjQsIDAuODkpXCIge3N0cmluZ30g6L655qGG6aKc6ImyXHJcbiAgICogQHBhcmFtIHtBcnJheS48b2JqZWN0Pn0gb3B0aW9ucy5wb3NpdGlvbnMg5b+F5aGr77yM57uP57qs5bqm5ZKM6auY5bqm55qE5YiX6KGo77yM5YC85Lqk5pu/IFt7bG9uLGxhdCxhbHR9LC4uLl1cclxuICAgKiBAcGFyYW0gb3B0aW9ucy5wb3NpdGlvbnNbXS5sbmcge251bWJlcn0g57uP5bqmXHJcbiAgICogQHBhcmFtIG9wdGlvbnMucG9zaXRpb25zW10ubGF0IHtudW1iZXJ9IOe6rOW6plxyXG4gICAqIEBwYXJhbSBvcHRpb25zLnBvc2l0aW9uc1tdLmFsdCB7bnVtYmVyfSDpq5jluqZcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5sYWJlbCB7b2JqZWN0fSDmoIfnrb7lr7nosaFcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5sYWJlbC50ZXh0IHtzdHJpbmd9IOagh+etvuaWh+acrFxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLnNob3cge3N0cmluZ30g5qCH562+5pi+6ZqQXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwucG9zaXRpb24ge3N0cmluZ30g5qCH562+5L2N572uXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwucG9zaXRpb24ge29iamVjdH0g5qCH562+5L2N572uXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwucG9zaXRpb24ubG5nIHtudW1iZXJ9IOe7j+W6plxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLnBvc2l0aW9uLmxhdCB7bnVtYmVyfSDnuqzluqZcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5sYWJlbC5wb3NpdGlvbi5hbHQge251bWJlcn0g6auY5bqmXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwuZm9udFNpemU9MjAge251bWJlcn0g5a2X5L2T5aSn5bCPXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwuZm9udEZhbWlseT0wIHtudW1iZXJ9IOWtl+S9k+mhuSAw77ya6buR5L2T77ybMe+8muaAnea6kOm7keS9k++8mzLvvJrlup7pl6jmraPpgZPmoIfpopjkvZPvvJsz77ya5pWw6buR5L2TXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwuY29sb3I9I2ZmZmZmZiB7c3RyaW5nfSDlrZfkvZPpopzoibJcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5sYWJlbC5saW5lV2lkdGg9NCB7bnVtYmVyfSDlvJXnur/lrr1cclxuICAgKiBAcGFyYW0gb3B0aW9ucy5sYWJlbC5saW5lQ29sb3I9IzAwZmZmZjgwIHtzdHJpbmd9IOW8lee6v+minOiJslxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLnBpeGVsT2Zmc2V0PTIwIHtudW1iZXJ9IOWtl+S9k+WBj+enuyjlvJXnur/plb/luqYpXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwuYmFja2dyb3VuZENvbG9yPVsnIzAwZmZmZjgwJywgJyMwMGZmZmY4MCddIHthcnJheX0g6IOM5pmv6aKc6ImyXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwuc2NhbGVCeURpc3RhbmNlIHtib29sZWFufSDot53nprvnvKnmlL5cclxuICAgKiBAcGFyYW0gb3B0aW9ucy5sYWJlbC5uZWFyPTIwMDAge251bWJlcn0g6KeG6YeO57yp5pS+5pyA6L+R6Led56a7XHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwuZmFyPTEwMDAwMCB7bnVtYmVyfSDop4bph47nvKnmlL7mnIDov5zot53nprtcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5hdHRyaWJ1dGUge29iamVjdH0g5bGe5oCn5YaF5a65XHJcbiAgICogQHBhcmFtIG9wdGlvbnMuYXR0cmlidXRlLmxpbms9e30ge29iamVjdH0g6ZO+5o6lXHJcbiAgICogQHBhcmFtIG9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudD1bXV0ge2FycmF5fSDpk77mjqXlhoXlrrlcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50W10ubmFtZSB7c3RyaW5nfSDpk77mjqXlkI3np7BcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50W10udXJsIHtzdHJpbmd9IOmTvuaOpeWcsOWdgFxyXG4gICAqIEBwYXJhbSBvcHRpb25zLnJpY2hUZXh0Q29udGVudCB7c3RyaW5nfSDlr4zmlofmnKzlhoXlrrlcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5jdXN0b21WaWV3IHtvYmplY3R9IOm7mOiupOinhuinklxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmN1c3RvbVZpZXcub3JpZW50YXRpb24ge29iamVjdH0g6buY6K6k6KeG6KeS5pa55L2NXHJcbiAgICogQHBhcmFtIG9wdGlvbnMuY3VzdG9tVmlldy5vcmllbnRhdGlvbi5oZWFkaW5nIHtudW1iZXJ9IOiIquWQkeinklxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmN1c3RvbVZpZXcub3JpZW50YXRpb24ucGl0Y2gge251bWJlcn0g5L+v5Luw6KeSXHJcbiAgICogQHBhcmFtIG9wdGlvbnMuY3VzdG9tVmlldy5vcmllbnRhdGlvbi5yb2xsIHtudW1iZXJ9IOe/u+a7muinklxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmN1c3RvbVZpZXcucmVsYXRpdmVQb3NpdGlvbiB7b2JqZWN0fSDop4bop5Lnm7jlr7nkvY3nva5cclxuICAgKiBAcGFyYW0gb3B0aW9ucy5jdXN0b21WaWV3LnJlbGF0aXZlUG9zaXRpb24ubG5nIHtudW1iZXJ9IOe7j+W6plxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmN1c3RvbVZpZXcucmVsYXRpdmVQb3NpdGlvbi5sYXQge251bWJlcn0g57qs5bqmXHJcbiAgICogQHBhcmFtIG9wdGlvbnMuY3VzdG9tVmlldy5yZWxhdGl2ZVBvc2l0aW9uLmFsdCB7bnVtYmVyfSDpq5jluqZcclxuICAgKiAqL1xyXG4gIGNvbnN0cnVjdG9yKHNkaywgb3B0aW9ucyA9IHt9LCBfRGlhbG9nID0ge30pIHtcclxuICAgIHN1cGVyKHNkaywgb3B0aW9ucyk7XHJcbiAgICB0aGlzLm9wdGlvbnMubmFtZSA9IG9wdGlvbnMubmFtZSB8fCAn5pyq5ZG95ZCN5a+56LGhJ1xyXG4gICAgdGhpcy5vcHRpb25zLmNvbG9yID0gb3B0aW9ucy5jb2xvciB8fCBcIiNmZjAwMDA4MFwiXHJcbiAgICB0aGlzLm9wdGlvbnMuc2hvdyA9IChvcHRpb25zLnNob3cgfHwgb3B0aW9ucy5zaG93ID09PSBmYWxzZSkgPyBvcHRpb25zLnNob3cgOiB0cnVlXHJcbiAgICB0aGlzLm9wdGlvbnMuaGVpZ2h0TW9kZSA9IChvcHRpb25zLmhlaWdodE1vZGUgfHwgb3B0aW9ucy5oZWlnaHRNb2RlID09IDApID8gb3B0aW9ucy5oZWlnaHRNb2RlIDogMlxyXG4gICAgdGhpcy5vcHRpb25zLnBvc2l0aW9ucyA9IG9wdGlvbnMucG9zaXRpb25zIHx8IFtdXHJcbiAgICB0aGlzLm9wdGlvbnMubGluZSA9IG9wdGlvbnMubGluZSB8fCB7fVxyXG4gICAgdGhpcy5vcHRpb25zLmxpbmUud2lkdGggPSAoKHRoaXMub3B0aW9ucy5saW5lLndpZHRoIHx8IHRoaXMub3B0aW9ucy5saW5lLndpZHRoID09PSAwKSA/IHRoaXMub3B0aW9ucy5saW5lLndpZHRoIDogMylcclxuICAgIHRoaXMub3B0aW9ucy5saW5lLmNvbG9yID0gdGhpcy5vcHRpb25zLmxpbmUuY29sb3IgfHwgJ3JnYmEoMjU1LCAwLCAwLCAxKSdcclxuICAgIHRoaXMub3B0aW9uc1snYXJlYS11bml0J10gPSBvcHRpb25zWydhcmVhLXVuaXQnXSB8fCAn5bmz5pa557GzJ1xyXG4gICAgdGhpcy5lbnRpdHlcclxuICAgIHRoaXMuZXZlbnQgPSBuZXcgTW91c2VFdmVudCh0aGlzLnNkaylcclxuICAgIHRoaXMub3BlcmF0ZSA9IHt9XHJcbiAgICB0aGlzLl9lbG1zID0ge307XHJcbiAgICB0aGlzLkRpYWxvZyA9IF9EaWFsb2dcclxuICAgIG9wdGlvbnMubGFiZWwgPSBvcHRpb25zLmxhYmVsIHx8IHt9XHJcbiAgICB0aGlzLm9wdGlvbnMubGFiZWwgPSB7XHJcbiAgICAgIHRleHQ6IHRoaXMub3B0aW9ucy5uYW1lLFxyXG4gICAgICBzaG93OiBvcHRpb25zLmxhYmVsLnNob3cgfHwgZmFsc2UsXHJcbiAgICAgIHBvc2l0aW9uOiBvcHRpb25zLmxhYmVsLnBvc2l0aW9uLFxyXG4gICAgICBmb250U2l6ZTogKG9wdGlvbnMubGFiZWwuZm9udFNpemUgfHwgb3B0aW9ucy5sYWJlbC5mb250U2l6ZSA9PT0gMCkgPyBvcHRpb25zLmxhYmVsLmZvbnRTaXplIDogMjAsXHJcbiAgICAgIGZvbnRGYW1pbHk6IG9wdGlvbnMubGFiZWwuZm9udEZhbWlseSA/IG9wdGlvbnMubGFiZWwuZm9udEZhbWlseSA6IDAsXHJcbiAgICAgIGNvbG9yOiBvcHRpb25zLmxhYmVsLmNvbG9yIHx8ICcjZmZmZmZmJyxcclxuICAgICAgbGluZVdpZHRoOiAob3B0aW9ucy5sYWJlbC5saW5lV2lkdGggfHwgb3B0aW9ucy5sYWJlbC5saW5lV2lkdGggPT09IDApID8gb3B0aW9ucy5sYWJlbC5saW5lV2lkdGggOiA0LFxyXG4gICAgICBwaXhlbE9mZnNldDogKG9wdGlvbnMubGFiZWwucGl4ZWxPZmZzZXQgfHwgb3B0aW9ucy5sYWJlbC5waXhlbE9mZnNldCA9PT0gMCkgPyBvcHRpb25zLmxhYmVsLnBpeGVsT2Zmc2V0IDogMjAsXHJcbiAgICAgIGJhY2tncm91bmRDb2xvcjogb3B0aW9ucy5sYWJlbC5iYWNrZ3JvdW5kQ29sb3IgfHwgWycjMDBmZmZmODAnLCAnIzAwZmZmZjgwJ10sXHJcbiAgICAgIGxpbmVDb2xvcjogb3B0aW9ucy5sYWJlbC5saW5lQ29sb3IgfHwgJyMwMGZmZmY4MCcsXHJcbiAgICAgIHNjYWxlQnlEaXN0YW5jZTogb3B0aW9ucy5sYWJlbC5zY2FsZUJ5RGlzdGFuY2UgfHwgZmFsc2UsXHJcbiAgICAgIG5lYXI6IChvcHRpb25zLmxhYmVsLm5lYXIgfHwgb3B0aW9ucy5sYWJlbC5uZWFyID09PSAwKSA/IG9wdGlvbnMubGFiZWwubmVhciA6IDIwMDAsXHJcbiAgICAgIGZhcjogKG9wdGlvbnMubGFiZWwuZmFyIHx8IG9wdGlvbnMubGFiZWwuZmFyID09PSAwKSA/IG9wdGlvbnMubGFiZWwuZmFyIDogMTAwMDAwLFxyXG4gICAgfVxyXG4gICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZSA9IG9wdGlvbnMuYXR0cmlidXRlIHx8IHt9XHJcbiAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsgfHwge31cclxuICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50ID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnQgfHwgW11cclxuICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUuY2FtZXJhID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5jYW1lcmEgfHwge31cclxuICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUuY2FtZXJhLmNvbnRlbnQgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmNhbWVyYS5jb250ZW50IHx8IFtdXHJcbiAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52ciB8fCB7fVxyXG4gICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52ci5jb250ZW50ID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52ci5jb250ZW50IHx8IFtdXHJcbiAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmdvb2RzID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5nb29kcyB8fCB7fVxyXG4gICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5nb29kcy5jb250ZW50ID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5nb29kcy5jb250ZW50IHx8IFtdXHJcbiAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlVHlwZSA9IG9wdGlvbnMuYXR0cmlidXRlVHlwZSB8fCAncmljaFRleHQnXHJcbiAgICB0aGlzLm5vZGVQb2ludHMgPSBbXVxyXG4gICAgaWYgKCF0aGlzLm9wdGlvbnMucG9zaXRpb25zIHx8IHRoaXMub3B0aW9ucy5wb3NpdGlvbnMubGVuZ3RoIDwgMykge1xyXG4gICAgICB0aGlzLl9lcnJvciA9ICfpm4bnu5PlnLDmnIDlsJHpnIDopoHkuInkuKrlnZDmoIfvvIEnXHJcbiAgICAgIGNvbnNvbGUud2Fybih0aGlzLl9lcnJvcilcclxuICAgICAgd2luZG93LkVMRU1FTlQgJiYgd2luZG93LkVMRU1FTlQuTWVzc2FnZSh7XHJcbiAgICAgICAgbWVzc2FnZTogdGhpcy5fZXJyb3IsXHJcbiAgICAgICAgdHlwZTogJ3dhcm5pbmcnLFxyXG4gICAgICAgIGR1cmF0aW9uOiAxNTAwXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmICghdGhpcy5vcHRpb25zLmhlaWdodCAmJiB0aGlzLm9wdGlvbnMuaGVpZ2h0ICE9PSAwKSB7XHJcbiAgICAgICAgbGV0IGhlaWdodCA9IHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0uYWx0XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCB0aGlzLm9wdGlvbnMucG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBpZiAoaGVpZ2h0IDwgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5hbHQpIHtcclxuICAgICAgICAgICAgaGVpZ2h0ID0gdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5hbHRcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5vcHRpb25zLmhlaWdodCA9IGhlaWdodFxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuc2RrLmFkZEluY2V0YW5jZSh0aGlzLm9wdGlvbnMuaWQsIHRoaXMpXHJcbiAgICAgIEFzc2VtYmxlT2JqZWN0LmNyZWF0ZSh0aGlzKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IHR5cGUoKSB7XHJcbiAgICByZXR1cm4gJ0Fzc2VtYmxlT2JqZWN0J1xyXG4gIH1cclxuXHJcbiAgZ2V0IGNvbG9yKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5jb2xvclxyXG4gIH1cclxuICBzZXQgY29sb3Iodikge1xyXG4gICAgdGhpcy5vcHRpb25zLmNvbG9yID0gdiB8fCAncmdiYSgyNTUsIDAsIDAsIDAuNSknXHJcbiAgICBpZiAoIXRoaXMuc2RrIHx8ICF0aGlzLnNkay52aWV3ZXIgfHwgIXRoaXMuZW50aXR5IHx8ICF0aGlzLmVudGl0eS5wb2x5Z29uKSB7XHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG4gICAgbGV0IG1hdGVyaWFsID0gQ2VzaXVtLkNvbG9yLmZyb21Dc3NDb2xvclN0cmluZyh0aGlzLm9wdGlvbnMuY29sb3IpXHJcbiAgICBpZiAodGhpcy5zZGsudmlld2VyLnNjZW5lLm1vZGUgPT09IDIpIHtcclxuICAgICAgbWF0ZXJpYWwgPSBuZXcgQ2VzaXVtLkN1c3RvbUNvbG9yTWF0ZXJpYWxTb3VyY2Uoe1xyXG4gICAgICAgIGNvbG9yOiB0aGlzLm9wdGlvbnMuY29sb3JcclxuICAgICAgfSlcclxuICAgIH1cclxuICAgIHRoaXMuZW50aXR5LnBvbHlnb24ubWF0ZXJpYWwgPSBtYXRlcmlhbFxyXG4gICAgaWYgKHRoaXMuX2VsbXMuY29sb3IpIHtcclxuICAgICAgdGhpcy5fZWxtcy5jb2xvci5mb3JFYWNoKChpdGVtLCBpKSA9PiB7XHJcbiAgICAgICAgbGV0IGNvbG9yUGlja2VyID0gbmV3IFlKQ29sb3JQaWNrZXIoe1xyXG4gICAgICAgICAgZWw6IGl0ZW0uZWwsXHJcbiAgICAgICAgICBzaXplOiAnbWluaScsLy/popzoibJib3jnsbvlnotcclxuICAgICAgICAgIGFscGhhOiB0cnVlLC8v5piv5ZCm5byA5ZCv6YCP5piO5bqmXHJcbiAgICAgICAgICBkZWZhdWx0Q29sb3I6IHRoaXMub3B0aW9ucy5jb2xvcixcclxuICAgICAgICAgIGRpc2FibGVkOiBmYWxzZSwvL+aYr+WQpuemgeatouaJk+W8gOminOiJsumAieaLqeWZqFxyXG4gICAgICAgICAgb3BlblBpY2tlckFuaTogJ29wYWNpdHknLC8v5omT5byA6aKc6Imy6YCJ5oup5Zmo5Yqo55S7XHJcbiAgICAgICAgICBzdXJlOiAoYykgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmNvbG9yID0gY1xyXG4gICAgICAgICAgfSwvL+eCueWHu+ehruiupOaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICAgICAgY2xlYXI6ICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5jb2xvciA9ICdyZ2JhKDI1NSwwLDAsMC41KSdcclxuICAgICAgICAgIH0sLy/ngrnlh7vmuIXnqbrmjInpkq7kuovku7blm57osINcclxuICAgICAgICB9KVxyXG4gICAgICAgIHRoaXMuX2VsbXMuY29sb3JbaV0gPSBjb2xvclBpY2tlclxyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IGhlaWdodE1vZGUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmhlaWdodE1vZGUgPyB0aGlzLm9wdGlvbnMuaGVpZ2h0TW9kZSA6IDBcclxuICB9XHJcbiAgc2V0IGhlaWdodE1vZGUodikge1xyXG4gICAgdGhpcy5lbnRpdHkucG9seWdvbi5oaWVyYXJjaHkgPSBbXVxyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMub3B0aW9ucy5oZWlnaHRNb2RlID0gKHYgfHwgdiA9PSAwKSA/IHYgOiAyXHJcbiAgICAgIHRoaXMucG9zaXRpb25FZGl0aW5nID0gZmFsc2VcclxuICAgICAgaWYgKCF0aGlzLmVudGl0eSkge1xyXG4gICAgICAgIHJldHVyblxyXG4gICAgICB9XHJcbiAgICAgIGxldCBoZWlnaHRNb2RlTmFtZSA9ICcnXHJcbiAgICAgIEFzc2VtYmxlT2JqZWN0LmNsb3NlTm9kZUVkaXQodGhpcylcclxuICAgICAgbGV0IGdyb3VuZCA9IGZhbHNlXHJcbiAgICAgIGxldCBkaXNhYmxlZCA9IGZhbHNlXHJcbiAgICAgIHRoaXMucmVuZXdQb3NpdGlvbnMoKVxyXG4gICAgICB0aGlzLmVudGl0eS5wb2x5bGluZS5wb3NpdGlvbnMgPSBbXHJcbiAgICAgICAgLi4udGhpcy5wb3NpdGlvbnNILFxyXG4gICAgICAgIHRoaXMucG9zaXRpb25zSFswXSxcclxuICAgICAgICB0aGlzLnBvc2l0aW9uc0hbMV1cclxuICAgICAgXVxyXG4gICAgICB0aGlzLmVudGl0eS5wb2x5Z29uLmhpZXJhcmNoeSA9IG5ldyBDZXNpdW0uUG9seWdvbkhpZXJhcmNoeShcclxuICAgICAgICB0aGlzLnBvc2l0aW9uc0hcclxuICAgICAgKVxyXG4gICAgICBzd2l0Y2ggKHRoaXMub3B0aW9ucy5oZWlnaHRNb2RlKSB7XHJcbiAgICAgICAgY2FzZSAnMCc6XHJcbiAgICAgICAgY2FzZSAwOlxyXG4gICAgICAgICAgaGVpZ2h0TW9kZU5hbWUgPSAn5rW35ouU6auY5bqmJ1xyXG4gICAgICAgICAgYnJlYWtcclxuICAgICAgICBjYXNlICcxJzpcclxuICAgICAgICBjYXNlIDE6XHJcbiAgICAgICAgICBoZWlnaHRNb2RlTmFtZSA9ICfnm7jlr7nlnLDooagnXHJcbiAgICAgICAgICBicmVha1xyXG4gICAgICAgIGNhc2UgJzInOlxyXG4gICAgICAgIGNhc2UgMjpcclxuICAgICAgICAgIGdyb3VuZCA9IHRydWVcclxuICAgICAgICAgIGRpc2FibGVkID0gdHJ1ZVxyXG4gICAgICAgICAgaGVpZ2h0TW9kZU5hbWUgPSAn5L6d6ZmE5qih5Z6LJ1xyXG4gICAgICAgICAgYnJlYWtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnByZXZpb3VzID0gbnVsbFxyXG4gICAgICB0aGlzLmxhYmVsLmdyb3VuZCA9IGdyb3VuZFxyXG4gICAgICB0aGlzLmVudGl0eS5wb2x5bGluZS5jbGFtcFRvR3JvdW5kID0gZ3JvdW5kXHJcbiAgICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLmFyY1R5cGUgPSAhZ3JvdW5kID8gQ2VzaXVtLkFyY1R5cGUuTk9ORSA6IENlc2l1bS5BcmNUeXBlLkdFT0RFU0lDLFxyXG4gICAgICAgIHRoaXMuZW50aXR5LnBvbHlnb24ucGVyUG9zaXRpb25IZWlnaHQgPSAhZ3JvdW5kID8gdHJ1ZSA6IGZhbHNlXHJcbiAgICAgIHRoaXMuX2VsbXMuaGVpZ2h0TW9kZSAmJiAodGhpcy5fZWxtcy5oZWlnaHRNb2RlLnZhbHVlID0gaGVpZ2h0TW9kZU5hbWUpXHJcbiAgICAgIHRoaXMuX2VsbXMuaGVpZ2h0TW9kZU9iamVjdCAmJiAodGhpcy5fZWxtcy5oZWlnaHRNb2RlT2JqZWN0LmxlZ3Bfc2VhcmNoQWN0aXZlKFxyXG4gICAgICAgIGhlaWdodE1vZGVOYW1lXHJcbiAgICAgICkpXHJcbiAgICAgIGlmIChkaXNhYmxlZCkge1xyXG4gICAgICAgIHRoaXMuX2VsbXMuaGVpZ2h0Qm94ICYmICh0aGlzLl9lbG1zLmhlaWdodEJveC5jbGFzc05hbWUgPSAnaW5wdXQtbnVtYmVyIGlucHV0LW51bWJlci11bml0LTEgaGVpZ2h0LWJveCBkaXNhYmxlZCcpO1xyXG4gICAgICAgIHRoaXMuX2VsbXMuaGVpZ2h0Q29uZmlybSAmJiB0aGlzLl9lbG1zLmhlaWdodENvbmZpcm0uc2V0QXR0cmlidXRlKCdkaXNhYmxlZCcsICdkaXNhYmxlZCcpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRoaXMuX2VsbXMuaGVpZ2h0Qm94ICYmICh0aGlzLl9lbG1zLmhlaWdodEJveC5jbGFzc05hbWUgPSAnaW5wdXQtbnVtYmVyIGlucHV0LW51bWJlci11bml0LTEgaGVpZ2h0LWJveCcpO1xyXG4gICAgICAgIHRoaXMuX2VsbXMuaGVpZ2h0Q29uZmlybSAmJiB0aGlzLl9lbG1zLmhlaWdodENvbmZpcm0ucmVtb3ZlQXR0cmlidXRlKCdkaXNhYmxlZCcpO1xyXG4gICAgICB9XHJcbiAgICB9LCA1MCk7XHJcbiAgfVxyXG5cclxuICBnZXQgaGVpZ2h0KCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5oZWlnaHRcclxuICB9XHJcblxyXG4gIHNldCBoZWlnaHQodikge1xyXG4gICAgaWYgKCF2IHx8IGlzTmFOKE51bWJlcih2KSkpIHtcclxuICAgICAgdGhpcy5vcHRpb25zLmhlaWdodCA9IDBcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLm9wdGlvbnMuaGVpZ2h0ID0gTnVtYmVyKE51bWJlcih2KS50b0ZpeGVkKDIpKVxyXG4gICAgfVxyXG4gICAgbGV0IGdyb3VuZFxyXG4gICAgaWYgKHRoaXMuaGVpZ2h0TW9kZSA9PSAyKSB7XHJcbiAgICAgIGdyb3VuZCA9IHRydWVcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGdyb3VuZCA9IGZhbHNlXHJcbiAgICB9XHJcbiAgICB0aGlzLnJlbmV3UG9zaXRpb25zKClcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLmVudGl0eS5wb2x5Z29uLmhpZXJhcmNoeSA9IG5ldyBDZXNpdW0uUG9seWdvbkhpZXJhcmNoeSh0aGlzLnBvc2l0aW9uc0gpXHJcbiAgICAgIHRoaXMuZW50aXR5LnBvbHlnb24ucGVyUG9zaXRpb25IZWlnaHQgPSAhZ3JvdW5kID8gdHJ1ZSA6IGZhbHNlXHJcbiAgICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLnBvc2l0aW9ucyA9IFtcclxuICAgICAgICAuLi50aGlzLnBvc2l0aW9uc0gsXHJcbiAgICAgICAgdGhpcy5wb3NpdGlvbnNIWzBdLFxyXG4gICAgICAgIHRoaXMucG9zaXRpb25zSFsxXVxyXG4gICAgICBdXHJcbiAgICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLmNsYW1wVG9Hcm91bmQgPSAhZ3JvdW5kID8gZmFsc2UgOiB0cnVlXHJcbiAgICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLmFyY1R5cGUgPSAhZ3JvdW5kID8gQ2VzaXVtLkFyY1R5cGUuTk9ORSA6IENlc2l1bS5BcmNUeXBlLkdFT0RFU0lDXHJcbiAgICB9LCAwKTtcclxuXHJcbiAgICB0aGlzLl9lbG1zLmFsdCAmJlxyXG4gICAgICB0aGlzLl9lbG1zLmFsdC5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgIGl0ZW0uaW5uZXJIVE1MID0gdGhpcy5vcHRpb25zLmhlaWdodFxyXG4gICAgICB9KVxyXG4gIH1cclxuXHJcbiAgZ2V0IGxpbmVDb2xvcigpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubGluZS5jb2xvclxyXG4gIH1cclxuICBzZXQgbGluZUNvbG9yKHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5saW5lLmNvbG9yID0gdiB8fCAncmdiYSgyNTUsIDAsIDAsIDAuNSknXHJcbiAgICBpZiAoIXRoaXMuc2RrIHx8ICF0aGlzLnNkay52aWV3ZXIgfHwgIXRoaXMuZW50aXR5IHx8ICF0aGlzLmVudGl0eS5wb2x5bGluZSkge1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLm1hdGVyaWFsID0gQ2VzaXVtLkNvbG9yLmZyb21Dc3NDb2xvclN0cmluZyh0aGlzLm9wdGlvbnMubGluZS5jb2xvcilcclxuICAgIGlmICh0aGlzLl9lbG1zLmxpbmVDb2xvcikge1xyXG4gICAgICB0aGlzLl9lbG1zLmxpbmVDb2xvci5mb3JFYWNoKChpdGVtLCBpKSA9PiB7XHJcbiAgICAgICAgbGV0IGxpbmVDb2xvclBpY2tlciA9IG5ldyBZSkNvbG9yUGlja2VyKHtcclxuICAgICAgICAgIGVsOiBpdGVtLmVsLFxyXG4gICAgICAgICAgc2l6ZTogJ21pbmknLC8v6aKc6ImyYm9457G75Z6LXHJcbiAgICAgICAgICBhbHBoYTogdHJ1ZSwvL+aYr+WQpuW8gOWQr+mAj+aYjuW6plxyXG4gICAgICAgICAgZGVmYXVsdENvbG9yOiB0aGlzLm9wdGlvbnMubGluZS5jb2xvcixcclxuICAgICAgICAgIGRpc2FibGVkOiBmYWxzZSwvL+aYr+WQpuemgeatouaJk+W8gOminOiJsumAieaLqeWZqFxyXG4gICAgICAgICAgb3BlblBpY2tlckFuaTogJ29wYWNpdHknLC8v5omT5byA6aKc6Imy6YCJ5oup5Zmo5Yqo55S7XHJcbiAgICAgICAgICBzdXJlOiAoYykgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxpbmVDb2xvciA9IGNcclxuICAgICAgICAgIH0sLy/ngrnlh7vnoa7orqTmjInpkq7kuovku7blm57osINcclxuICAgICAgICAgIGNsZWFyOiAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubGluZUNvbG9yID0gJ3JnYmEoMjU1LDAsMCwwLjUpJ1xyXG4gICAgICAgICAgfSwvL+eCueWHu+a4heepuuaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgdGhpcy5fZWxtcy5saW5lQ29sb3JbaV0gPSBsaW5lQ29sb3JQaWNrZXJcclxuICAgICAgfSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCBsaW5lV2lkdGgoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmxpbmUud2lkdGhcclxuICB9XHJcbiAgc2V0IGxpbmVXaWR0aCh2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMubGluZS53aWR0aCA9ICgodiB8fCB2ID09PSAwKSA/IHYgOiAzKVxyXG4gICAgdGhpcy5lbnRpdHkucG9seWxpbmUud2lkdGggPSB0aGlzLm9wdGlvbnMubGluZS53aWR0aFxyXG4gICAgdGhpcy5fZWxtcy5saW5lQ29sb3IgJiYgdGhpcy5fZWxtcy5saW5lQ29sb3IuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICBpdGVtLnZhbHVlID0gdGhpcy5vcHRpb25zLmxpbmUud2lkdGhcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBnZXQgYXJlYSgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuYXJlYVxyXG4gIH1cclxuXHJcbiAgc2V0IGFyZWEodikge1xyXG4gICAgdGhpcy5vcHRpb25zLmFyZWEgPSB2XHJcbiAgICB0aGlzLl9lbG1zLmFyZWEgJiYgdGhpcy5fZWxtcy5hcmVhLmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgaXRlbS52YWx1ZSA9IHZcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBnZXQgYXJlYVVuaXQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zWydhcmVhLXVuaXQnXVxyXG4gIH1cclxuICBzZXQgYXJlYVVuaXQodikge1xyXG4gICAgdGhpcy5vcHRpb25zWydhcmVhLXVuaXQnXSA9IHZcclxuICAgIHRoaXMuX2VsbXMuYXJlYVVuaXQgJiYgdGhpcy5fZWxtcy5hcmVhVW5pdC5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgIGl0ZW0udmFsdWUgPSB2XHJcbiAgICB9KVxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5hcmVhQnlNZXRlcikge1xyXG4gICAgICBzd2l0Y2ggKHYpIHtcclxuICAgICAgICBjYXNlICflubPmlrnnsbMnOlxyXG4gICAgICAgICAgdGhpcy5hcmVhID0gdGhpcy5vcHRpb25zLmFyZWFCeU1ldGVyXHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlICflubPmlrnljYPnsbMnOlxyXG4gICAgICAgICAgdGhpcy5hcmVhID0gTnVtYmVyKCh0aGlzLm9wdGlvbnMuYXJlYUJ5TWV0ZXIgLyAxMDAwMDAwKS50b0ZpeGVkKDgpKVxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSAn5LqpJzpcclxuICAgICAgICAgIHRoaXMuYXJlYSA9IE51bWJlcigodGhpcy5vcHRpb25zLmFyZWFCeU1ldGVyIC8gNjY2LjY2NjY2NjcpLnRvRml4ZWQoNCkpXHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlICflhazpobcnOlxyXG4gICAgICAgICAgdGhpcy5hcmVhID0gTnVtYmVyKCh0aGlzLm9wdGlvbnMuYXJlYUJ5TWV0ZXIgLyAxMDAwMCkudG9GaXhlZCg2KSlcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICB0aGlzLmFyZWEgPSB0aGlzLm9wdGlvbnMuYXJlYUJ5TWV0ZXJcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IGxhYmVsU2hvdygpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubGFiZWwuc2hvd1xyXG4gIH1cclxuICBzZXQgbGFiZWxTaG93KHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5sYWJlbC5zaG93ID0gdlxyXG4gICAgaWYgKHRoaXMuc2hvdyAmJiAhdGhpcy5zaG93VmlldyB8fCB0aGlzLnNob3dWaWV3ID09IDMpIHtcclxuICAgICAgdGhpcy5sYWJlbC5zaG93ID0gdlxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMubGFiZWwuc2hvdyA9IGZhbHNlXHJcbiAgICB9XHJcbiAgICB0aGlzLl9lbG1zLmxhYmVsU2hvdyAmJiB0aGlzLl9lbG1zLmxhYmVsU2hvdy5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgIGl0ZW0uY2hlY2tlZCA9IHZcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBnZXQgbGFiZWxGb250RmFtaWx5KCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5sYWJlbC5mb250RmFtaWx5XHJcbiAgfVxyXG5cclxuICBzZXQgbGFiZWxGb250RmFtaWx5KHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5sYWJlbC5mb250RmFtaWx5ID0gdiB8fCAwXHJcbiAgICB0aGlzLmxhYmVsICYmICh0aGlzLmxhYmVsLmZvbnRGYW1pbHkgPSB0aGlzLm9wdGlvbnMubGFiZWwuZm9udEZhbWlseSlcclxuXHJcbiAgICBsZXQgbmFtZSA9IGdldEZvbnRGYW1pbHlOYW1lKHRoaXMubGFiZWxGb250RmFtaWx5KSB8fCAnJ1xyXG4gICAgdGhpcy5fZWxtcy5sYWJlbEZvbnRGYW1pbHkgJiZcclxuICAgICAgdGhpcy5fZWxtcy5sYWJlbEZvbnRGYW1pbHkuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICBpdGVtLnZhbHVlID0gbmFtZVxyXG4gICAgICB9KVxyXG4gIH1cclxuXHJcbiAgZ2V0IGxhYmVsQ29sb3IoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmxhYmVsLmNvbG9yXHJcbiAgfVxyXG4gIHNldCBsYWJlbENvbG9yKHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5sYWJlbC5jb2xvciA9IHZcclxuICAgIHRoaXMubGFiZWwuY29sb3IgPSB2XHJcbiAgICBpZiAodGhpcy5fZWxtcy5sYWJlbENvbG9yKSB7XHJcbiAgICAgIHRoaXMuX2VsbXMubGFiZWxDb2xvci5mb3JFYWNoKChpdGVtLCBpKSA9PiB7XHJcbiAgICAgICAgbGV0IGxhYmVsQ29sb3JQaWNrZXIgPSBuZXcgWUpDb2xvclBpY2tlcih7XHJcbiAgICAgICAgICBlbDogaXRlbS5lbCxcclxuICAgICAgICAgIHNpemU6ICdtaW5pJywvL+minOiJsmJveOexu+Wei1xyXG4gICAgICAgICAgYWxwaGE6IHRydWUsLy/mmK/lkKblvIDlkK/pgI/mmI7luqZcclxuICAgICAgICAgIGRlZmF1bHRDb2xvcjogdGhpcy5sYWJlbENvbG9yLFxyXG4gICAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLC8v5piv5ZCm56aB5q2i5omT5byA6aKc6Imy6YCJ5oup5ZmoXHJcbiAgICAgICAgICBvcGVuUGlja2VyQW5pOiAnb3BhY2l0eScsLy/miZPlvIDpopzoibLpgInmi6nlmajliqjnlLtcclxuICAgICAgICAgIHN1cmU6IChjb2xvcikgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxhYmVsQ29sb3IgPSBjb2xvclxyXG4gICAgICAgICAgfSwvL+eCueWHu+ehruiupOaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICAgICAgY2xlYXI6ICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5sYWJlbENvbG9yID0gJ3JnYmEoMjU1LDI1NSwyNTUsMSknXHJcbiAgICAgICAgICB9LC8v54K55Ye75riF56m65oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgICAgfSlcclxuICAgICAgICB0aGlzLl9lbG1zLmxhYmVsQ29sb3JbaV0gPSBsYWJlbENvbG9yUGlja2VyXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgbGFiZWxGb250U2l6ZSgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubGFiZWwuZm9udFNpemVcclxuICB9XHJcbiAgc2V0IGxhYmVsRm9udFNpemUodikge1xyXG4gICAgdGhpcy5vcHRpb25zLmxhYmVsLmZvbnRTaXplID0gdlxyXG4gICAgdGhpcy5sYWJlbC5mb250U2l6ZSA9IHZcclxuICAgIHRoaXMuX2VsbXMubGFiZWxGb250U2l6ZSAmJiB0aGlzLl9lbG1zLmxhYmVsRm9udFNpemUuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICBpdGVtLnZhbHVlID0gdlxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGdldCBsYWJlbFNjYWxlQnlEaXN0YW5jZSgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubGFiZWwuc2NhbGVCeURpc3RhbmNlXHJcbiAgfVxyXG4gIHNldCBsYWJlbFNjYWxlQnlEaXN0YW5jZSh2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMubGFiZWwuc2NhbGVCeURpc3RhbmNlID0gdlxyXG4gICAgdGhpcy5sYWJlbC5zY2FsZUJ5RGlzdGFuY2UgPSB2XHJcbiAgICB0aGlzLl9lbG1zLmxhYmVsU2NhbGVCeURpc3RhbmNlICYmIHRoaXMuX2VsbXMubGFiZWxTY2FsZUJ5RGlzdGFuY2UuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICBpdGVtLmNoZWNrZWQgPSB2XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgZ2V0IGxhYmVsTmVhcigpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubGFiZWwubmVhclxyXG4gIH1cclxuICBzZXQgbGFiZWxOZWFyKHYpIHtcclxuICAgIGxldCBuZWFyID0gdlxyXG4gICAgaWYgKG5lYXIgPiB0aGlzLmxhYmVsRmFyKSB7XHJcbiAgICAgIG5lYXIgPSB0aGlzLmxhYmVsRmFyXHJcbiAgICB9XHJcbiAgICB0aGlzLm9wdGlvbnMubGFiZWwubmVhciA9IG5lYXJcclxuICAgIHRoaXMubGFiZWwubmVhciA9IG5lYXJcclxuICAgIHRoaXMuX2VsbXMubGFiZWxOZWFyICYmIHRoaXMuX2VsbXMubGFiZWxOZWFyLmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgaXRlbS52YWx1ZSA9IG5lYXJcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBnZXQgbGFiZWxGYXIoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmxhYmVsLmZhclxyXG4gIH1cclxuICBzZXQgbGFiZWxGYXIodikge1xyXG4gICAgbGV0IGZhciA9IHZcclxuICAgIGlmIChmYXIgPCB0aGlzLmxhYmVsTmVhcikge1xyXG4gICAgICBmYXIgPSB0aGlzLmxhYmVsTmVhclxyXG4gICAgfVxyXG4gICAgdGhpcy5vcHRpb25zLmxhYmVsLmZhciA9IGZhclxyXG4gICAgdGhpcy5sYWJlbC5mYXIgPSBmYXJcclxuICAgIHRoaXMuX2VsbXMubGFiZWxGYXIgJiYgdGhpcy5fZWxtcy5sYWJlbEZhci5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgIGl0ZW0udmFsdWUgPSBmYXJcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBnZXQgbGFiZWxMaW5lV2lkdGgoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmxhYmVsLmxpbmVXaWR0aFxyXG4gIH1cclxuICBzZXQgbGFiZWxMaW5lV2lkdGgodikge1xyXG4gICAgdGhpcy5vcHRpb25zLmxhYmVsLmxpbmVXaWR0aCA9IHZcclxuICAgIHRoaXMubGFiZWwubGluZVdpZHRoID0gdlxyXG4gICAgdGhpcy5fZWxtcy5sYWJlbExpbmVXaWR0aCAmJiB0aGlzLl9lbG1zLmxhYmVsTGluZVdpZHRoLmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgaXRlbS52YWx1ZSA9IHZcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBnZXQgbGFiZWxQaXhlbE9mZnNldCgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubGFiZWwucGl4ZWxPZmZzZXRcclxuICB9XHJcbiAgc2V0IGxhYmVsUGl4ZWxPZmZzZXQodikge1xyXG4gICAgdGhpcy5vcHRpb25zLmxhYmVsLnBpeGVsT2Zmc2V0ID0gdlxyXG4gICAgdGhpcy5sYWJlbC5waXhlbE9mZnNldCA9IHZcclxuICAgIHRoaXMuX2VsbXMubGFiZWxQaXhlbE9mZnNldCAmJiB0aGlzLl9lbG1zLmxhYmVsUGl4ZWxPZmZzZXQuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICBpdGVtLnZhbHVlID0gdlxyXG4gICAgfSlcclxuICB9XHJcbiAgZ2V0IGxhYmVsTGluZUNvbG9yKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5sYWJlbC5saW5lQ29sb3JcclxuICB9XHJcbiAgc2V0IGxhYmVsTGluZUNvbG9yKHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5sYWJlbC5saW5lQ29sb3IgPSB2XHJcbiAgICB0aGlzLmxhYmVsLmxpbmVDb2xvciA9IHZcclxuICAgIGlmICh0aGlzLl9lbG1zLmxhYmVsTGluZUNvbG9yKSB7XHJcbiAgICAgIHRoaXMuX2VsbXMubGFiZWxMaW5lQ29sb3IuZm9yRWFjaCgoaXRlbSwgaSkgPT4ge1xyXG4gICAgICAgIGxldCBsaW5lQ29sb3JQaWNrZXIgPSBuZXcgWUpDb2xvclBpY2tlcih7XHJcbiAgICAgICAgICBlbDogaXRlbS5lbCxcclxuICAgICAgICAgIHNpemU6ICdtaW5pJywvL+minOiJsmJveOexu+Wei1xyXG4gICAgICAgICAgYWxwaGE6IHRydWUsLy/mmK/lkKblvIDlkK/pgI/mmI7luqZcclxuICAgICAgICAgIGRlZmF1bHRDb2xvcjogdGhpcy5sYWJlbExpbmVDb2xvcixcclxuICAgICAgICAgIGRpc2FibGVkOiBmYWxzZSwvL+aYr+WQpuemgeatouaJk+W8gOminOiJsumAieaLqeWZqFxyXG4gICAgICAgICAgb3BlblBpY2tlckFuaTogJ29wYWNpdHknLC8v5omT5byA6aKc6Imy6YCJ5oup5Zmo5Yqo55S7XHJcbiAgICAgICAgICBzdXJlOiAoY29sb3IpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5sYWJlbExpbmVDb2xvciA9IGNvbG9yXHJcbiAgICAgICAgICB9LC8v54K55Ye756Gu6K6k5oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgICAgICBjbGVhcjogKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxhYmVsTGluZUNvbG9yID0gJ3JnYmEoMCwyNTUsMjU1LDAuNSknXHJcbiAgICAgICAgICB9LC8v54K55Ye75riF56m65oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgICAgfSlcclxuICAgICAgICB0aGlzLl9lbG1zLmxhYmVsTGluZUNvbG9yW2ldID0gbGluZUNvbG9yUGlja2VyXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgbGFiZWxCYWNrZ3JvdW5kQ29sb3JTdGFydCgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubGFiZWwuYmFja2dyb3VuZENvbG9yWzBdXHJcbiAgfVxyXG4gIHNldCBsYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0KHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5sYWJlbC5iYWNrZ3JvdW5kQ29sb3JbMF0gPSB2XHJcbiAgICB0aGlzLmxhYmVsLmJhY2tncm91bmRDb2xvciA9IFt2LCB0aGlzLmxhYmVsLmJhY2tncm91bmRDb2xvclsxXV1cclxuICAgIGlmICh0aGlzLl9lbG1zLmxhYmVsQmFja2dyb3VuZENvbG9yU3RhcnQpIHtcclxuICAgICAgdGhpcy5fZWxtcy5sYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0LmZvckVhY2goKGl0ZW0sIGkpID0+IHtcclxuICAgICAgICBsZXQgbGFiZWxCYWNrZ3JvdW5kQ29sb3JTdGFydFBpY2tlciA9IG5ldyBZSkNvbG9yUGlja2VyKHtcclxuICAgICAgICAgIGVsOiBpdGVtLmVsLFxyXG4gICAgICAgICAgc2l6ZTogJ21pbmknLC8v6aKc6ImyYm9457G75Z6LXHJcbiAgICAgICAgICBhbHBoYTogdHJ1ZSwvL+aYr+WQpuW8gOWQr+mAj+aYjuW6plxyXG4gICAgICAgICAgZGVmYXVsdENvbG9yOiB0aGlzLmxhYmVsQmFja2dyb3VuZENvbG9yU3RhcnQsXHJcbiAgICAgICAgICBkaXNhYmxlZDogZmFsc2UsLy/mmK/lkKbnpoHmraLmiZPlvIDpopzoibLpgInmi6nlmahcclxuICAgICAgICAgIG9wZW5QaWNrZXJBbmk6ICdvcGFjaXR5JywvL+aJk+W8gOminOiJsumAieaLqeWZqOWKqOeUu1xyXG4gICAgICAgICAgc3VyZTogKGNvbG9yKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JTdGFydCA9IGNvbG9yXHJcbiAgICAgICAgICB9LC8v54K55Ye756Gu6K6k5oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgICAgICBjbGVhcjogKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxhYmVsQmFja2dyb3VuZENvbG9yU3RhcnQgPSAncmdiYSgyNTUsMjU1LDI1NSwxKSdcclxuICAgICAgICAgIH0sLy/ngrnlh7vmuIXnqbrmjInpkq7kuovku7blm57osINcclxuICAgICAgICB9KVxyXG4gICAgICAgIHRoaXMuX2VsbXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JTdGFydFtpXSA9IGxhYmVsQmFja2dyb3VuZENvbG9yU3RhcnRQaWNrZXJcclxuICAgICAgfSlcclxuICAgIH1cclxuICB9XHJcbiAgZ2V0IGxhYmVsQmFja2dyb3VuZENvbG9yRW5kKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5sYWJlbC5iYWNrZ3JvdW5kQ29sb3JbMV1cclxuICB9XHJcbiAgc2V0IGxhYmVsQmFja2dyb3VuZENvbG9yRW5kKHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5sYWJlbC5iYWNrZ3JvdW5kQ29sb3JbMV0gPSB2XHJcbiAgICB0aGlzLmxhYmVsLmJhY2tncm91bmRDb2xvciA9IFt0aGlzLmxhYmVsLmJhY2tncm91bmRDb2xvclswXSwgdl1cclxuICAgIGlmICh0aGlzLl9lbG1zLmxhYmVsQmFja2dyb3VuZENvbG9yRW5kKSB7XHJcbiAgICAgIHRoaXMuX2VsbXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmQuZm9yRWFjaCgoaXRlbSwgaSkgPT4ge1xyXG4gICAgICAgIGxldCBsYWJlbEJhY2tncm91bmRDb2xvckVuZFBpY2tlciA9IG5ldyBZSkNvbG9yUGlja2VyKHtcclxuICAgICAgICAgIGVsOiBpdGVtLmVsLFxyXG4gICAgICAgICAgc2l6ZTogJ21pbmknLC8v6aKc6ImyYm9457G75Z6LXHJcbiAgICAgICAgICBhbHBoYTogdHJ1ZSwvL+aYr+WQpuW8gOWQr+mAj+aYjuW6plxyXG4gICAgICAgICAgZGVmYXVsdENvbG9yOiB0aGlzLmxhYmVsQmFja2dyb3VuZENvbG9yRW5kLFxyXG4gICAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLC8v5piv5ZCm56aB5q2i5omT5byA6aKc6Imy6YCJ5oup5ZmoXHJcbiAgICAgICAgICBvcGVuUGlja2VyQW5pOiAnb3BhY2l0eScsLy/miZPlvIDpopzoibLpgInmi6nlmajliqjnlLtcclxuICAgICAgICAgIHN1cmU6IChjb2xvcikgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxhYmVsQmFja2dyb3VuZENvbG9yRW5kID0gY29sb3JcclxuICAgICAgICAgIH0sLy/ngrnlh7vnoa7orqTmjInpkq7kuovku7blm57osINcclxuICAgICAgICAgIGNsZWFyOiAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmQgPSAncmdiYSgyNTUsMjU1LDI1NSwxKSdcclxuICAgICAgICAgIH0sLy/ngrnlh7vmuIXnqbrmjInpkq7kuovku7blm57osINcclxuICAgICAgICB9KVxyXG4gICAgICAgIHRoaXMuX2VsbXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmRbaV0gPSBsYWJlbEJhY2tncm91bmRDb2xvckVuZFBpY2tlclxyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IGF0dHJpYnV0ZVR5cGUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZVR5cGVcclxuICB9XHJcblxyXG4gIHNldCBhdHRyaWJ1dGVUeXBlKHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGVUeXBlID0gdlxyXG4gICAgdGhpcy5fZWxtcy5hdHRyaWJ1dGVUeXBlICYmIHRoaXMuX2VsbXMuYXR0cmlidXRlVHlwZS5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgIGl0ZW0udmFsdWUgPSB2XHJcbiAgICB9KVxyXG4gICAgbGV0IGF0dHJpYnV0ZUNvbnRlbnQgPSB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdhdHRyaWJ1dGUtY29udGVudCcpXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGF0dHJpYnV0ZUNvbnRlbnQubGVuZ3RoOyBpKyspIHtcclxuICAgICAgaWYgKGF0dHJpYnV0ZUNvbnRlbnRbaV0uY2xhc3NOYW1lLmluZGV4T2YoJ2F0dHJpYnV0ZS1jb250ZW50LScgKyB2KSA+IC0xKSB7XHJcbiAgICAgICAgYXR0cmlidXRlQ29udGVudFtpXS5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBhdHRyaWJ1dGVDb250ZW50W2ldLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCBhdHRyaWJ1dGVMaW5rKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50XHJcbiAgfVxyXG5cclxuICBzZXQgYXR0cmlidXRlTGluayh2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudCA9IHZcclxuICAgIGlmICghdGhpcy5fRGlhbG9nT2JqZWN0IHx8ICF0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQgfHwgIXRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50IHx8IHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2F0dHJpYnV0ZS1jb250ZW50LWxpbmsnKS5sZW5ndGggPT0gMCkge1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuICAgIGxldCB0YWJsZSA9IHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2F0dHJpYnV0ZS1jb250ZW50LWxpbmsnKVsxXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0YWJsZScpWzBdXHJcbiAgICBsZXQgdGFibGVDb250ZW50ID0gdGFibGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndGFibGUtYm9keScpWzBdXHJcbiAgICB0YWJsZUNvbnRlbnQuaW5uZXJIVE1MID0gJydcclxuICAgIGlmICh0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudC5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRhYmxlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RhYmxlLWVtcHR5JylbMF0uc3R5bGUuZGlzcGxheSA9ICdub25lJ1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRhYmxlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RhYmxlLWVtcHR5JylbMF0uc3R5bGUuZGlzcGxheSA9ICdmbGV4J1xyXG4gICAgfVxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudC5sZW5ndGg7IGkrKykge1xyXG4gICAgICBsZXQgdHIgPSBgXHJcbiAgICAgIDxkaXYgY2xhc3M9XCJ0clwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRkXCI+YCArIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50W2ldLm5hbWUgKyBgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidGRcIj5gICsgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnRbaV0udXJsICsgYDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRkXCI+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvbiBAY2xpY2s9XCJsaW5rRWRpdFwiPue8lui+kTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gQGNsaWNrPVwibGlua0RlbGV0ZVwiPuWIoOmZpDwvYnV0dG9uPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PmBcclxuICAgICAgbGV0IHRyRWxtID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKS5jcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQodHIpXHJcbiAgICAgIHRhYmxlQ29udGVudC5hcHBlbmRDaGlsZCh0ckVsbSlcclxuICAgIH1cclxuICAgIGxldCBpdGVtID0gdGFibGVDb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RyJylcclxuICAgIGxldCBmdW4gPSB7XHJcbiAgICAgIGxpbmtFZGl0OiBhc3luYyAoaW5kZXgpID0+IHtcclxuICAgICAgICB0aGlzLmF0dHJpYnV0ZUxpbmsgPSBhd2FpdCB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudFxyXG4gICAgICAgIGxldCB0YWJsZSA9IHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2F0dHJpYnV0ZS1jb250ZW50LWxpbmsnKVsxXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0YWJsZScpWzBdXHJcbiAgICAgICAgbGV0IHRhYmxlQ29udGVudCA9IHRhYmxlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RhYmxlLWJvZHknKVswXVxyXG4gICAgICAgIGxldCBpdGVtID0gdGFibGVDb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RyJylcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW0ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGlmIChpbmRleCA9PT0gaSkge1xyXG4gICAgICAgICAgICBsZXQgaGVpZ2h0ID0gaXRlbVtpXS5vZmZzZXRIZWlnaHRcclxuICAgICAgICAgICAgbGV0IGh0bWwgPSBgXHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRkXCI+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJpbnB1dFwiIHR5cGU9XCJ0ZXh0XCI+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRkXCI+XHJcbiAgICAgICAgICAgICAgICA8dGV4dGFyZWEgY2xhc3M9XCJpbnB1dCBsaW5rLWVkaXRcIiB0eXBlPVwidGV4dFwiPjwvdGV4dGFyZWE+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRkXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxidXR0b24gQGNsaWNrPVwiY29uZmlybUVkaXRcIj7noa7orqQ8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBAY2xpY2s9XCJjYW5jZWxFZGl0XCI+5Y+W5raIPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgPC9kaXY+YFxyXG4gICAgICAgICAgICBpdGVtW2ldLmlubmVySFRNTCA9IGh0bWxcclxuICAgICAgICAgICAgbGV0IHRleHRhcmVhRWxtID0gaXRlbVtpXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdsaW5rLWVkaXQnKVswXVxyXG4gICAgICAgICAgICB0ZXh0YXJlYUVsbS5zdHlsZS5oZWlnaHQgPSAoaGVpZ2h0IC0gMTApICsgJ3B4J1xyXG4gICAgICAgICAgICBsZXQgdGQgPSBpdGVtW2ldLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RkJylcclxuICAgICAgICAgICAgdGRbMF0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaW5wdXQnKVswXS52YWx1ZSA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50W2luZGV4XS5uYW1lXHJcbiAgICAgICAgICAgIHRkWzFdLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2lucHV0JylbMF0udmFsdWUgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudFtpbmRleF0udXJsXHJcbiAgICAgICAgICAgIGxldCBidG4gPSBpdGVtW2ldLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdidXR0b24nKVxyXG4gICAgICAgICAgICBmb3IgKGxldCBuID0gMDsgbiA8IGJ0bi5sZW5ndGg7IG4rKykge1xyXG4gICAgICAgICAgICAgIGlmICghYnRuW25dIHx8ICFidG5bbl0uYXR0cmlidXRlcykge1xyXG4gICAgICAgICAgICAgICAgY29udGludWVcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgZm9yIChsZXQgbSBvZiBidG5bbl0uYXR0cmlidXRlcykge1xyXG4gICAgICAgICAgICAgICAgaWYgKG0ubmFtZSA9PT0gJ0BjbGljaycpIHtcclxuICAgICAgICAgICAgICAgICAgYnRuW25dLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIChmdW5bbS52YWx1ZV0pID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBmdW5bbS52YWx1ZV0oeyBuYW1lOiB0ZFswXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdpbnB1dCcpWzBdLnZhbHVlLCB1cmw6IHRkWzFdLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2lucHV0JylbMF0udmFsdWUgfSwgaSlcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICBidG5bbl0uYXR0cmlidXRlcy5yZW1vdmVOYW1lZEl0ZW0obS5uYW1lKVxyXG4gICAgICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgbGlua0RlbGV0ZTogKGkpID0+IHtcclxuICAgICAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudC5zcGxpY2UoaSwgMSlcclxuICAgICAgICB0aGlzLmF0dHJpYnV0ZUxpbmsgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudFxyXG4gICAgICB9LFxyXG5cclxuICAgICAgY29uZmlybUVkaXQ6ICh2YWx1ZSwgaSkgPT4ge1xyXG4gICAgICAgIGxldCBuYW1lID0gdmFsdWUubmFtZSAmJiB2YWx1ZS5uYW1lLnJlcGxhY2UoL1xccy9nLCBcIlwiKVxyXG4gICAgICAgIGxldCB1cmwgPSB2YWx1ZS51cmwgJiYgdmFsdWUudXJsLnJlcGxhY2UoL1xccy9nLCBcIlwiKVxyXG4gICAgICAgIGlmIChuYW1lICYmIHVybCkge1xyXG4gICAgICAgICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnRbaV0gPSB2YWx1ZVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIHdpbmRvdy5FTEVNRU5UICYmIHdpbmRvdy5FTEVNRU5ULk1lc3NhZ2Uoe1xyXG4gICAgICAgICAgICBtZXNzYWdlOiAn5ZCN56ew5oiW6ZO+5o6l5LiN6IO95Li656m677yBJyxcclxuICAgICAgICAgICAgdHlwZTogJ3dhcm5pbmcnLFxyXG4gICAgICAgICAgICBkdXJhdGlvbjogMTUwMFxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuYXR0cmlidXRlTGluayA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50XHJcbiAgICAgIH0sXHJcbiAgICAgIGNhbmNlbEVkaXQ6ICgpID0+IHtcclxuICAgICAgICB0aGlzLmF0dHJpYnV0ZUxpbmsgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudFxyXG4gICAgICB9LFxyXG4gICAgICBmaWxlU2VsZWN0OiAodmFsdWUsIGkpID0+IHtcclxuICAgICAgICBsZXQgZmlsZUVsbSA9IGl0ZW1baV0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnZmlsZS1zZWxlY3QnKVswXVxyXG4gICAgICAgIGZpbGVFbG0uY2xpY2soKVxyXG4gICAgICAgIGZpbGVFbG0ucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgZmlsZVNlbGVjdClcclxuICAgICAgICBmaWxlRWxtLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGZpbGVTZWxlY3QpXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGxldCBmaWxlU2VsZWN0ID0gKGV2ZW50KSA9PiB7XHJcbiAgICAgIGlmIChldmVudC50YXJnZXQudmFsdWUpIHtcclxuICAgICAgICBsZXQgdGQgPSBpdGVtW2V2ZW50LnRhcmdldC5nZXRBdHRyaWJ1dGUoJ2luZGV4JyldLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RkJylcclxuICAgICAgICB0ZFsxXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdpbnB1dCcpWzBdLnZhbHVlID0gZXZlbnQudGFyZ2V0LnZhbHVlXHJcbiAgICAgICAgZXZlbnQudGFyZ2V0LnZhbHVlID0gbnVsbFxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW0ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgbGV0IGJ0biA9IGl0ZW1baV0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2J1dHRvbicpXHJcbiAgICAgIGZvciAobGV0IG4gPSAwOyBuIDwgYnRuLmxlbmd0aDsgbisrKSB7XHJcbiAgICAgICAgaWYgKCFidG5bbl0gfHwgIWJ0bltuXS5hdHRyaWJ1dGVzKSB7XHJcbiAgICAgICAgICBjb250aW51ZVxyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKGxldCBtIG9mIGJ0bltuXS5hdHRyaWJ1dGVzKSB7XHJcbiAgICAgICAgICBpZiAobS5uYW1lID09PSAnQGNsaWNrJykge1xyXG4gICAgICAgICAgICBidG5bbl0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgKGZ1blttLnZhbHVlXSkgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgICAgIGZ1blttLnZhbHVlXShpKVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGJ0bltuXS5hdHRyaWJ1dGVzLnJlbW92ZU5hbWVkSXRlbShtLm5hbWUpXHJcbiAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuXHJcblxyXG4gIH1cclxuXHJcbiAgZ2V0IGF0dHJpYnV0ZUNhbWVyYSgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmNhbWVyYS5jb250ZW50XHJcbiAgfVxyXG4gIHNldCBhdHRyaWJ1dGVDYW1lcmEodikge1xyXG4gICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5jYW1lcmEuY29udGVudCA9IHZcclxuICB9XHJcblxyXG4gIGdldCBhdHRyaWJ1dGVWcigpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnRcclxuICB9XHJcblxyXG4gIHNldCBhdHRyaWJ1dGVWcih2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnQgPSB2XHJcbiAgICBpZiAoIXRoaXMuX0RpYWxvZ09iamVjdCB8fCAhdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50IHx8ICF0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudCB8fCB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdhdHRyaWJ1dGUtY29udGVudC12cicpLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG4gICAgbGV0IHRhYmxlID0gdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnYXR0cmlidXRlLWNvbnRlbnQtdnInKVsxXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0YWJsZScpWzBdXHJcbiAgICBsZXQgdGFibGVDb250ZW50ID0gdGFibGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndGFibGUtYm9keScpWzBdXHJcbiAgICB0YWJsZUNvbnRlbnQuaW5uZXJIVE1MID0gJydcclxuICAgIGlmICh0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnQubGVuZ3RoID4gMCkge1xyXG4gICAgICB0YWJsZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0YWJsZS1lbXB0eScpWzBdLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSdcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0YWJsZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0YWJsZS1lbXB0eScpWzBdLnN0eWxlLmRpc3BsYXkgPSAnZmxleCdcclxuICAgIH1cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52ci5jb250ZW50Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGxldCB0ciA9IGBcclxuICAgICAgPGRpdiBjbGFzcz1cInRyXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidGRcIj5gICsgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52ci5jb250ZW50W2ldLm5hbWUgKyBgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidGRcIj5gICsgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52ci5jb250ZW50W2ldLnVybCArIGA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZFwiPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gQGNsaWNrPVwidnJFZGl0XCI+57yW6L6RPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvbiBAY2xpY2s9XCJ2ckRlbGV0ZVwiPuWIoOmZpDwvYnV0dG9uPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PmBcclxuICAgICAgbGV0IHRyRWxtID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKS5jcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQodHIpXHJcbiAgICAgIHRhYmxlQ29udGVudC5hcHBlbmRDaGlsZCh0ckVsbSlcclxuICAgIH1cclxuICAgIGxldCBpdGVtID0gdGFibGVDb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RyJylcclxuICAgIGxldCBmdW4gPSB7XHJcbiAgICAgIHZyRWRpdDogYXN5bmMgKGluZGV4KSA9PiB7XHJcbiAgICAgICAgdGhpcy5hdHRyaWJ1dGVWciA9IGF3YWl0IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudFxyXG4gICAgICAgIGxldCB0YWJsZSA9IHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2F0dHJpYnV0ZS1jb250ZW50LXZyJylbMV0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndGFibGUnKVswXVxyXG4gICAgICAgIGxldCB0YWJsZUNvbnRlbnQgPSB0YWJsZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0YWJsZS1ib2R5JylbMF1cclxuICAgICAgICBsZXQgaXRlbSA9IHRhYmxlQ29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0cicpXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpdGVtLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBpZiAoaW5kZXggPT09IGkpIHtcclxuICAgICAgICAgICAgbGV0IGhlaWdodCA9IGl0ZW1baV0ub2Zmc2V0SGVpZ2h0XHJcbiAgICAgICAgICAgIGxldCBodG1sID0gYFxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZFwiPlxyXG4gICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiaW5wdXRcIiB0eXBlPVwidGV4dFwiPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZFwiPlxyXG4gICAgICAgICAgICAgICAgPHRleHRhcmVhIGNsYXNzPVwiaW5wdXQgbGluay1lZGl0XCIgdHlwZT1cInRleHRcIj48L3RleHRhcmVhPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZFwiPlxyXG4gICAgICAgICAgICAgICAgICA8YnV0dG9uIEBjbGljaz1cImNvbmZpcm1FZGl0XCI+56Gu6K6kPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgIDxidXR0b24gQGNsaWNrPVwiY2FuY2VsRWRpdFwiPuWPlua2iDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDwvZGl2PmBcclxuICAgICAgICAgICAgaXRlbVtpXS5pbm5lckhUTUwgPSBodG1sXHJcbiAgICAgICAgICAgIGxldCB0ZXh0YXJlYUVsbSA9IGl0ZW1baV0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbGluay1lZGl0JylbMF1cclxuICAgICAgICAgICAgdGV4dGFyZWFFbG0uc3R5bGUuaGVpZ2h0ID0gKGhlaWdodCAtIDEwKSArICdweCdcclxuICAgICAgICAgICAgbGV0IHRkID0gaXRlbVtpXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0ZCcpXHJcbiAgICAgICAgICAgIHRkWzBdLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2lucHV0JylbMF0udmFsdWUgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnRbaW5kZXhdLm5hbWVcclxuICAgICAgICAgICAgdGRbMV0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaW5wdXQnKVswXS52YWx1ZSA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudFtpbmRleF0udXJsXHJcbiAgICAgICAgICAgIGxldCBidG4gPSBpdGVtW2ldLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdidXR0b24nKVxyXG4gICAgICAgICAgICBmb3IgKGxldCBuID0gMDsgbiA8IGJ0bi5sZW5ndGg7IG4rKykge1xyXG4gICAgICAgICAgICAgIGlmICghYnRuW25dIHx8ICFidG5bbl0uYXR0cmlidXRlcykge1xyXG4gICAgICAgICAgICAgICAgY29udGludWVcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgZm9yIChsZXQgbSBvZiBidG5bbl0uYXR0cmlidXRlcykge1xyXG4gICAgICAgICAgICAgICAgaWYgKG0ubmFtZSA9PT0gJ0BjbGljaycpIHtcclxuICAgICAgICAgICAgICAgICAgYnRuW25dLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIChmdW5bbS52YWx1ZV0pID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBmdW5bbS52YWx1ZV0oeyBuYW1lOiB0ZFswXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdpbnB1dCcpWzBdLnZhbHVlLCB1cmw6IHRkWzFdLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2lucHV0JylbMF0udmFsdWUgfSwgaSlcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICBidG5bbl0uYXR0cmlidXRlcy5yZW1vdmVOYW1lZEl0ZW0obS5uYW1lKVxyXG4gICAgICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgdnJEZWxldGU6IChpKSA9PiB7XHJcbiAgICAgICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52ci5jb250ZW50LnNwbGljZShpLCAxKVxyXG4gICAgICAgIHRoaXMuYXR0cmlidXRlVnIgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnRcclxuICAgICAgfSxcclxuXHJcbiAgICAgIGNvbmZpcm1FZGl0OiAodmFsdWUsIGkpID0+IHtcclxuICAgICAgICBsZXQgbmFtZSA9IHZhbHVlLm5hbWUgJiYgdmFsdWUubmFtZS5yZXBsYWNlKC9cXHMvZywgXCJcIilcclxuICAgICAgICBsZXQgdXJsID0gdmFsdWUudXJsICYmIHZhbHVlLnVybC5yZXBsYWNlKC9cXHMvZywgXCJcIilcclxuICAgICAgICBpZiAobmFtZSAmJiB1cmwpIHtcclxuICAgICAgICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudFtpXSA9IHZhbHVlXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgd2luZG93LkVMRU1FTlQgJiYgd2luZG93LkVMRU1FTlQuTWVzc2FnZSh7XHJcbiAgICAgICAgICAgIG1lc3NhZ2U6ICflkI3np7DmiJbpk77mjqXkuI3og73kuLrnqbrvvIEnLFxyXG4gICAgICAgICAgICB0eXBlOiAnd2FybmluZycsXHJcbiAgICAgICAgICAgIGR1cmF0aW9uOiAxNTAwXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5hdHRyaWJ1dGVWciA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudFxyXG4gICAgICB9LFxyXG4gICAgICBjYW5jZWxFZGl0OiAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5hdHRyaWJ1dGVWciA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudFxyXG4gICAgICB9LFxyXG4gICAgICBmaWxlU2VsZWN0OiAodmFsdWUsIGkpID0+IHtcclxuICAgICAgICBsZXQgZmlsZUVsbSA9IGl0ZW1baV0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnZmlsZS1zZWxlY3QnKVswXVxyXG4gICAgICAgIGZpbGVFbG0uY2xpY2soKVxyXG4gICAgICAgIGZpbGVFbG0ucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgZmlsZVNlbGVjdClcclxuICAgICAgICBmaWxlRWxtLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGZpbGVTZWxlY3QpXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGxldCBmaWxlU2VsZWN0ID0gKGV2ZW50KSA9PiB7XHJcbiAgICAgIGlmIChldmVudC50YXJnZXQudmFsdWUpIHtcclxuICAgICAgICBsZXQgdGQgPSBpdGVtW2V2ZW50LnRhcmdldC5nZXRBdHRyaWJ1dGUoJ2luZGV4JyldLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RkJylcclxuICAgICAgICB0ZFsxXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdpbnB1dCcpWzBdLnZhbHVlID0gZXZlbnQudGFyZ2V0LnZhbHVlXHJcbiAgICAgICAgZXZlbnQudGFyZ2V0LnZhbHVlID0gbnVsbFxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW0ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgbGV0IGJ0biA9IGl0ZW1baV0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2J1dHRvbicpXHJcbiAgICAgIGZvciAobGV0IG4gPSAwOyBuIDwgYnRuLmxlbmd0aDsgbisrKSB7XHJcbiAgICAgICAgaWYgKCFidG5bbl0gfHwgIWJ0bltuXS5hdHRyaWJ1dGVzKSB7XHJcbiAgICAgICAgICBjb250aW51ZVxyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKGxldCBtIG9mIGJ0bltuXS5hdHRyaWJ1dGVzKSB7XHJcbiAgICAgICAgICBpZiAobS5uYW1lID09PSAnQGNsaWNrJykge1xyXG4gICAgICAgICAgICBidG5bbl0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgKGZ1blttLnZhbHVlXSkgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgICAgIGZ1blttLnZhbHVlXShpKVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGJ0bltuXS5hdHRyaWJ1dGVzLnJlbW92ZU5hbWVkSXRlbShtLm5hbWUpXHJcbiAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgYXR0cmlidXRlR29vZHMoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5nb29kcy5jb250ZW50XHJcbiAgfVxyXG5cclxuICBzZXQgYXR0cmlidXRlR29vZHModikge1xyXG4gICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5nb29kcy5jb250ZW50ID0gdlxyXG4gIH1cclxuXHJcbiAgc3RhdGljIGNyZWF0ZSh0aGF0KSB7XHJcbiAgICBsZXQgcG9zaXRpb25zID0gdGhhdC5vcHRpb25zLnBvc2l0aW9uc1xyXG4gICAgbGV0IGZyb21EZWdyZWVzQXJyYXkgPSBbXVxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgZnJvbURlZ3JlZXNBcnJheS5wdXNoKHBvc2l0aW9uc1tpXS5sbmcsIHBvc2l0aW9uc1tpXS5sYXQpXHJcbiAgICB9XHJcbiAgICB0aGF0LnBvc2l0aW9ucyA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzQXJyYXkoZnJvbURlZ3JlZXNBcnJheSlcclxuICAgIGxldCBwb3NpdGlvbnNBID0gdGhhdC5jb21wdXRlQXNzZW1ibGUodGhhdC5vcHRpb25zLnBvc2l0aW9ucylcclxuICAgIGlmIChwb3NpdGlvbnNBLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG4gICAgbGV0IHBvaW50cyA9IFtbXV1cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9zaXRpb25zQS5sZW5ndGg7IGkrKykge1xyXG4gICAgICBsZXQgcG9zaXRpb24gPSB0aGF0LmNhcnRlc2lhbjNUb3dnczg0KHBvc2l0aW9uc0FbaV0sIHRoYXQuc2RrLnZpZXdlcilcclxuICAgICAgcG9pbnRzWzBdLnB1c2goW3Bvc2l0aW9uLmxuZywgcG9zaXRpb24ubGF0XSlcclxuICAgIH1cclxuICAgIGxldCBwb3NpdGlvbiA9IHRoYXQuY2FydGVzaWFuM1Rvd2dzODQocG9zaXRpb25zQVswXSwgdGhhdC5zZGsudmlld2VyKVxyXG4gICAgcG9pbnRzWzBdLnB1c2goW3Bvc2l0aW9uLmxuZywgcG9zaXRpb24ubGF0XSlcclxuICAgIGxldCBwb2x5Z29uID0gdHVyZi5wb2x5Z29uKHBvaW50cyk7XHJcbiAgICAvLyBsZXQgY2VudHJvaWQgPSB0dXJmLmNlbnRyb2lkKHBvbHlnb24pO1xyXG4gICAgbGV0IGNlbnRyb2lkID0gdHVyZi5wb2ludE9uRmVhdHVyZShwb2x5Z29uKTtcclxuXHJcblxyXG4gICAgbGV0IGdyb3VuZFxyXG4gICAgbGV0IGhlaWdodCA9IDBcclxuXHJcbiAgICBzd2l0Y2ggKHRoYXQub3B0aW9ucy5oZWlnaHRNb2RlKSB7XHJcbiAgICAgIGNhc2UgJzAnOlxyXG4gICAgICBjYXNlIDA6XHJcbiAgICAgICAgZ3JvdW5kID0gZmFsc2VcclxuICAgICAgICBicmVha1xyXG4gICAgICBjYXNlICcxJzpcclxuICAgICAgY2FzZSAxOlxyXG4gICAgICAgIGhlaWdodCA9IHRoYXQuc2RrLnZpZXdlci5zY2VuZS5nbG9iZS5nZXRIZWlnaHQoQ2VzaXVtLkNhcnRvZ3JhcGhpYy5mcm9tRGVncmVlcyhjZW50cm9pZC5nZW9tZXRyeS5jb29yZGluYXRlc1swXSwgY2VudHJvaWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMV0pKSB8fCAwXHJcbiAgICAgICAgZ3JvdW5kID0gZmFsc2VcclxuICAgICAgICBicmVha1xyXG4gICAgICBjYXNlICcyJzpcclxuICAgICAgY2FzZSAyOlxyXG4gICAgICAgIGdyb3VuZCA9IHRydWVcclxuICAgICAgICBicmVha1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghdGhhdC5vcHRpb25zLmxhYmVsLnBvc2l0aW9uKSB7XHJcbiAgICAgIHRoYXQub3B0aW9ucy5sYWJlbC5wb3NpdGlvbiA9IHsgbG5nOiBjZW50cm9pZC5nZW9tZXRyeS5jb29yZGluYXRlc1swXSwgbGF0OiBjZW50cm9pZC5nZW9tZXRyeS5jb29yZGluYXRlc1sxXSwgYWx0OiB0aGF0LmhlaWdodCArIGhlaWdodCB9XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGZyb21EZWdyZWVzQXJyYXkyID0gW11cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9pbnRzWzBdLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGZyb21EZWdyZWVzQXJyYXkyLnB1c2goXHJcbiAgICAgICAgcG9pbnRzWzBdW2ldWzBdLFxyXG4gICAgICAgIHBvaW50c1swXVtpXVsxXSxcclxuICAgICAgICB0aGF0LmhlaWdodCArIGhlaWdodFxyXG4gICAgICApXHJcbiAgICB9XHJcblxyXG4gICAgbGV0IG1hdGVyaWFsID0gQ2VzaXVtLkNvbG9yLmZyb21Dc3NDb2xvclN0cmluZyh0aGF0Lm9wdGlvbnMuY29sb3IpXHJcbiAgICBpZiAodGhhdC5zZGsudmlld2VyLnNjZW5lLm1vZGUgPT09IDIpIHtcclxuICAgICAgZ3JvdW5kID0gZmFsc2VcclxuICAgICAgbWF0ZXJpYWwgPSBuZXcgQ2VzaXVtLkN1c3RvbUNvbG9yTWF0ZXJpYWxTb3VyY2Uoe1xyXG4gICAgICAgIGNvbG9yOiB0aGF0Lm9wdGlvbnMuY29sb3JcclxuICAgICAgfSlcclxuICAgIH1cclxuICAgIHRoYXQub3B0aW9ucy5sYWJlbC5ncm91bmQgPSBncm91bmRcclxuICAgIHRoYXQucG9zaXRpb25zSCA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzQXJyYXlIZWlnaHRzKGZyb21EZWdyZWVzQXJyYXkyKVxyXG5cclxuICAgIHRoYXQuZW50aXR5ID0gdGhhdC5zZGsudmlld2VyLmVudGl0aWVzLmFkZCh7XHJcbiAgICAgIHNob3c6IHRoYXQub3B0aW9ucy5zaG93LFxyXG4gICAgICBpZDogdGhhdC5vcHRpb25zLmlkLFxyXG4gICAgICBwb2x5Z29uOiB7XHJcbiAgICAgICAgaGllcmFyY2h5OiAhZ3JvdW5kID8gbmV3IENlc2l1bS5Qb2x5Z29uSGllcmFyY2h5KHRoYXQucG9zaXRpb25zSCkgOiBuZXcgQ2VzaXVtLlBvbHlnb25IaWVyYXJjaHkocG9zaXRpb25zQSksXHJcbiAgICAgICAgcGVyUG9zaXRpb25IZWlnaHQ6ICFncm91bmQgPyB0cnVlIDogZmFsc2UsXHJcbiAgICAgICAgbWF0ZXJpYWw6IG1hdGVyaWFsLFxyXG4gICAgICAgIHpJbmRleDogdGhhdC5zZGsuX2VudGl0eVpJbmRleFxyXG4gICAgICB9LFxyXG4gICAgICBwb2x5bGluZToge1xyXG4gICAgICAgIHBvc2l0aW9uczogWy4uLnRoYXQucG9zaXRpb25zSCwgdGhhdC5wb3NpdGlvbnNIWzBdLCB0aGF0LnBvc2l0aW9uc0hbMV1dLFxyXG4gICAgICAgIHdpZHRoOiB0aGF0Lm9wdGlvbnMubGluZS53aWR0aCxcclxuICAgICAgICBtYXRlcmlhbDogQ2VzaXVtLkNvbG9yLmZyb21Dc3NDb2xvclN0cmluZyh0aGF0Lm9wdGlvbnMubGluZS5jb2xvciksXHJcbiAgICAgICAgY2xhbXBUb0dyb3VuZDogIWdyb3VuZCA/IGZhbHNlIDogdHJ1ZSxcclxuICAgICAgICBhcmNUeXBlOiAhZ3JvdW5kID8gQ2VzaXVtLkFyY1R5cGUuTk9ORSA6IENlc2l1bS5BcmNUeXBlLkdFT0RFU0lDLFxyXG4gICAgICAgIHpJbmRleDogdGhhdC5zZGsuX2VudGl0eVpJbmRleFxyXG4gICAgICB9LFxyXG4gICAgfSlcclxuICAgIHRoYXQuc2RrLl9lbnRpdHlaSW5kZXgrK1xyXG4gICAgQXNzZW1ibGVPYmplY3QuY3JlYXRlTGFiZWwodGhhdClcclxuXHJcbiAgICBsZXQgcG9zODQgPSBbXVxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb3NpdGlvbnNBLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIHBvczg0LnB1c2godGhhdC5jYXJ0ZXNpYW4zVG93Z3M4NChwb3NpdGlvbnNBW2ldLCB0aGF0LnNkay52aWV3ZXIpKVxyXG4gICAgfVxyXG4gICAgdGhhdC5vcHRpb25zLmFyZWFCeU1ldGVyID0gdGhhdC5jb21wdXRlQXJlYShwb3M4NCk7XHJcbiAgICBzd2l0Y2ggKHRoYXQub3B0aW9uc1snYXJlYS11bml0J10pIHtcclxuICAgICAgY2FzZSAn5bmz5pa557GzJzpcclxuICAgICAgICB0aGF0Lm9wdGlvbnMuYXJlYSA9IHRoYXQub3B0aW9ucy5hcmVhQnlNZXRlclxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICflubPmlrnljYPnsbMnOlxyXG4gICAgICAgIHRoYXQub3B0aW9ucy5hcmVhID0gTnVtYmVyKCh0aGF0Lm9wdGlvbnMuYXJlYUJ5TWV0ZXIgLyAxMDAwMDAwKS50b0ZpeGVkKDgpKVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICfkuqknOlxyXG4gICAgICAgIHRoYXQub3B0aW9ucy5hcmVhID0gTnVtYmVyKCh0aGF0Lm9wdGlvbnMuYXJlYUJ5TWV0ZXIgLyA2NjYuNjY2NjY2NykudG9GaXhlZCg0KSlcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAn5YWs6aG3JzpcclxuICAgICAgICB0aGF0Lm9wdGlvbnMuYXJlYSA9IE51bWJlcigodGhhdC5vcHRpb25zLmFyZWFCeU1ldGVyIC8gMTAwMDApLnRvRml4ZWQoNikpXHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgdGhhdC5vcHRpb25zLmFyZWEgPSB0aGF0Lm9wdGlvbnMuYXJlYUJ5TWV0ZXJcclxuICAgIH1cclxuICAgIHN5bmNEYXRhKHRoYXQuc2RrLCB0aGF0Lm9wdGlvbnMuaWQpXHJcbiAgICBpZiAodGhhdC5vcHRpb25zLnNob3cpIHtcclxuICAgICAgc2V0U3BsaXREaXJlY3Rpb24oMCwgdGhhdC5vcHRpb25zLmlkKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc3RhdGljIGFzeW5jIGNyZWF0ZUxhYmVsKHRoYXQpIHtcclxuICAgIC8vIOagh+etvlxyXG4gICAgdGhhdC5sYWJlbCA9IG5ldyBMYWJlbE9iamVjdCh0aGF0LnNkaywge1xyXG4gICAgICBpZDogdGhhdC5vcHRpb25zLmlkLFxyXG4gICAgICBzaG93OiB0aGF0Lm9wdGlvbnMuc2hvdyA/IHRoYXQub3B0aW9ucy5sYWJlbC5zaG93IDogZmFsc2UsXHJcbiAgICAgIHBvc2l0aW9uOiBbdGhhdC5vcHRpb25zLmxhYmVsLnBvc2l0aW9uLmxuZywgdGhhdC5vcHRpb25zLmxhYmVsLnBvc2l0aW9uLmxhdCwgdGhhdC5vcHRpb25zLmxhYmVsLnBvc2l0aW9uLmFsdF0sXHJcbiAgICAgIHRleHQ6IHRoYXQub3B0aW9ucy5uYW1lLFxyXG4gICAgICBmb250U2l6ZTogdGhhdC5vcHRpb25zLmxhYmVsLmZvbnRTaXplLFxyXG4gICAgICBmb250RmFtaWx5OiB0aGF0Lm9wdGlvbnMubGFiZWwuZm9udEZhbWlseSxcclxuICAgICAgY29sb3I6IHRoYXQub3B0aW9ucy5sYWJlbC5jb2xvcixcclxuICAgICAgcGl4ZWxPZmZzZXQ6IHRoYXQub3B0aW9ucy5sYWJlbC5waXhlbE9mZnNldCxcclxuICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGF0Lm9wdGlvbnMubGFiZWwuYmFja2dyb3VuZENvbG9yLFxyXG4gICAgICBsaW5lV2lkdGg6IHRoYXQub3B0aW9ucy5sYWJlbC5saW5lV2lkdGgsXHJcbiAgICAgIGxpbmVDb2xvcjogdGhhdC5vcHRpb25zLmxhYmVsLmxpbmVDb2xvcixcclxuICAgICAgc2NhbGVCeURpc3RhbmNlOiB0aGF0Lm9wdGlvbnMubGFiZWwuc2NhbGVCeURpc3RhbmNlLFxyXG4gICAgICBuZWFyOiB0aGF0Lm9wdGlvbnMubGFiZWwubmVhcixcclxuICAgICAgZmFyOiB0aGF0Lm9wdGlvbnMubGFiZWwuZmFyLFxyXG4gICAgICBncm91bmQ6IHRoYXQub3B0aW9ucy5sYWJlbC5ncm91bmQsXHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgLy8g57yW6L6R5qGGXHJcbiAgYXN5bmMgZWRpdChzdGF0ZSkge1xyXG4gICAgaWYgKHRoaXMuX2Vycm9yKSB7XHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG4gICAgbGV0IF90aGlzID0gdGhpc1xyXG4gICAgdGhpcy5vcmlnaW5hbE9wdGlvbnMgPSB0aGlzLmRlZXBDb3B5T2JqKHRoaXMub3B0aW9ucylcclxuXHJcbiAgICBpZiAodGhpcy5fRGlhbG9nT2JqZWN0ICYmIHRoaXMuX0RpYWxvZ09iamVjdC5jbG9zZSkge1xyXG4gICAgICB0aGlzLl9EaWFsb2dPYmplY3QuY2xvc2UoKVxyXG4gICAgICB0aGlzLl9EaWFsb2dPYmplY3QgPSBudWxsXHJcbiAgICB9XHJcbiAgICBpZiAoc3RhdGUpIHtcclxuICAgICAgZnVuY3Rpb24gY3JlYXRlU3BhdGlhbEluZm9UYWJsZUNvbnRlbnQoKSB7XHJcbiAgICAgICAgbGV0IHRhYmxlRWxtID0gY29udGVudEVsbS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdzcGF0aWFsLWluZm8tdGFibGUnKVswXVxyXG4gICAgICAgIGxldCB0Qm9keUVsbSA9IHRhYmxlRWxtLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RhYmxlLWJvZHknKVswXVxyXG4gICAgICAgIHRCb2R5RWxtLmlubmVySFRNTCA9ICcnXHJcbiAgICAgICAgX3RoaXMuX2VsbXMubG5nID0gW11cclxuICAgICAgICBfdGhpcy5fZWxtcy5sbmdJbnB1dCA9IFtdXHJcbiAgICAgICAgX3RoaXMuX2VsbXMubGF0ID0gW11cclxuICAgICAgICBfdGhpcy5fZWxtcy5sYXRJbnB1dCA9IFtdXHJcbiAgICAgICAgX3RoaXMuX2VsbXMuYWx0ID0gW11cclxuICAgICAgICBfdGhpcy5fZWxtcy5hbHRJbnB1dCA9IFtdXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBfdGhpcy5vcHRpb25zLnBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgbGV0IHRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcclxuICAgICAgICAgIHRyLmNsYXNzTmFtZSA9ICd0cidcclxuICAgICAgICAgIHRyLmlubmVySFRNTCA9IGBcclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZFwiPiR7aSArIDF9PC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidGQgbG5nIGFsaWduLWNlbnRlclwiPjwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRkIGxhdCBhbGlnbi1jZW50ZXJcIj48L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZCBhbHQgYWxpZ24tY2VudGVyXCI+PC9kaXY+XHJcbiAgICAgICAgYFxyXG4gICAgICAgICAgbGV0IGxuZ0JveCA9IHRyLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xuZycpWzBdXHJcbiAgICAgICAgICBsZXQgbG5nID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpXHJcbiAgICAgICAgICBsbmcuaW5uZXJIVE1MID0gKF90aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxuZykudG9GaXhlZCg4KVxyXG4gICAgICAgICAgbG5nQm94LmFwcGVuZENoaWxkKGxuZylcclxuICAgICAgICAgIGxldCBsbmdJbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0JylcclxuICAgICAgICAgIGxuZ0lucHV0LmNsYXNzTmFtZSA9ICdpbnB1dCdcclxuICAgICAgICAgIGxuZ0lucHV0LnR5cGUgPSAnbnVtYmVyJ1xyXG4gICAgICAgICAgbG5nSW5wdXQudGl0bGUgPSAnJ1xyXG4gICAgICAgICAgbG5nSW5wdXQubWluID0gLTE4MFxyXG4gICAgICAgICAgbG5nSW5wdXQubWF4ID0gMTgwXHJcbiAgICAgICAgICBsbmdJbnB1dC52YWx1ZSA9IChfdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sbmcpLnRvRml4ZWQoOClcclxuXHJcbiAgICAgICAgICBsZXQgbGF0Qm94ID0gdHIuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbGF0JylbMF1cclxuICAgICAgICAgIGxldCBsYXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJylcclxuICAgICAgICAgIGxhdC5pbm5lckhUTUwgPSAoX3RoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubGF0KS50b0ZpeGVkKDgpXHJcbiAgICAgICAgICBsYXRCb3guYXBwZW5kQ2hpbGQobGF0KVxyXG4gICAgICAgICAgbGV0IGxhdElucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKVxyXG4gICAgICAgICAgbGF0SW5wdXQuY2xhc3NOYW1lID0gJ2lucHV0J1xyXG4gICAgICAgICAgbGF0SW5wdXQudHlwZSA9ICdudW1iZXInXHJcbiAgICAgICAgICBsYXRJbnB1dC50aXRsZSA9ICcnXHJcbiAgICAgICAgICBsYXRJbnB1dC5taW4gPSAtOTBcclxuICAgICAgICAgIGxhdElucHV0Lm1heCA9IDkwXHJcbiAgICAgICAgICBsYXRJbnB1dC52YWx1ZSA9IChfdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sYXQpLnRvRml4ZWQoOClcclxuXHJcbiAgICAgICAgICBsZXQgYWx0Qm94ID0gdHIuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnYWx0JylbMF1cclxuICAgICAgICAgIGxldCBhbHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJylcclxuICAgICAgICAgIGFsdC5pbm5lckhUTUwgPSAoX3RoaXMuaGVpZ2h0KS50b0ZpeGVkKDIpXHJcbiAgICAgICAgICBhbHRCb3guYXBwZW5kQ2hpbGQoYWx0KVxyXG4gICAgICAgICAgbGV0IGFsdElucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKVxyXG4gICAgICAgICAgYWx0SW5wdXQuY2xhc3NOYW1lID0gJ2lucHV0J1xyXG4gICAgICAgICAgYWx0SW5wdXQudHlwZSA9ICdudW1iZXInXHJcbiAgICAgICAgICBhbHRJbnB1dC50aXRsZSA9ICcnXHJcbiAgICAgICAgICBhbHRJbnB1dC5taW4gPSAtOTk5OTk5OVxyXG4gICAgICAgICAgYWx0SW5wdXQubWF4ID0gOTk5OTk5OTk5XHJcbiAgICAgICAgICBhbHRJbnB1dC52YWx1ZSA9IChfdGhpcy5oZWlnaHQpLnRvRml4ZWQoMilcclxuXHJcbiAgICAgICAgICBsbmdCb3guYWRkRXZlbnRMaXN0ZW5lcignZGJsY2xpY2snLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGxuZ0JveC5pbm5lckhUTUwgPSAnJ1xyXG4gICAgICAgICAgICBsbmdJbnB1dC52YWx1ZSA9IE51bWJlcigoX3RoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubG5nKS50b0ZpeGVkKDgpKVxyXG4gICAgICAgICAgICBsbmdCb3guYXBwZW5kQ2hpbGQobG5nSW5wdXQpXHJcbiAgICAgICAgICAgIGxuZ0lucHV0LmZvY3VzKClcclxuICAgICAgICAgICAgaWYgKF90aGlzLm9wZXJhdGUucG9zaXRpb25FZGl0aW5nKSB7XHJcbiAgICAgICAgICAgICAgX3RoaXMucG9zaXRpb25FZGl0aW5nID0gZmFsc2VcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBBc3NlbWJsZU9iamVjdC5jbG9zZU5vZGVFZGl0KF90aGlzKVxyXG4gICAgICAgICAgICBfdGhpcy5oZWlnaHRNb2RlID0gX3RoaXMuaGVpZ2h0TW9kZVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIGxuZ0lucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2JsdXInLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGxuZ0lucHV0LnZhbHVlID0gTnVtYmVyKChfdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sbmcpLnRvRml4ZWQoOCkpXHJcbiAgICAgICAgICAgIGxuZ0JveC5pbm5lckhUTUwgPSAnJ1xyXG4gICAgICAgICAgICBsbmdCb3guYXBwZW5kQ2hpbGQobG5nKVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIGxuZ0lucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKCkgPT4ge1xyXG4gICAgICAgICAgICBfdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sbmcgPSBOdW1iZXIoTnVtYmVyKGxuZ0lucHV0LnZhbHVlKS50b0ZpeGVkKDgpKVxyXG4gICAgICAgICAgICBsbmcuaW5uZXJIVE1MID0gX3RoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubG5nLnRvRml4ZWQoOClcclxuICAgICAgICAgICAgX3RoaXMuaGVpZ2h0ID0gX3RoaXMuaGVpZ2h0XHJcbiAgICAgICAgICB9KVxyXG5cclxuICAgICAgICAgIGxhdEJveC5hZGRFdmVudExpc3RlbmVyKCdkYmxjbGljaycsICgpID0+IHtcclxuICAgICAgICAgICAgbGF0Qm94LmlubmVySFRNTCA9ICcnXHJcbiAgICAgICAgICAgIGxhdElucHV0LnZhbHVlID0gTnVtYmVyKChfdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sYXQpLnRvRml4ZWQoOCkpXHJcbiAgICAgICAgICAgIGxhdEJveC5hcHBlbmRDaGlsZChsYXRJbnB1dClcclxuICAgICAgICAgICAgbGF0SW5wdXQuZm9jdXMoKVxyXG4gICAgICAgICAgICBpZiAoX3RoaXMub3BlcmF0ZS5wb3NpdGlvbkVkaXRpbmcpIHtcclxuICAgICAgICAgICAgICBfdGhpcy5wb3NpdGlvbkVkaXRpbmcgPSBmYWxzZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIEFzc2VtYmxlT2JqZWN0LmNsb3NlTm9kZUVkaXQoX3RoaXMpXHJcbiAgICAgICAgICAgIF90aGlzLmhlaWdodE1vZGUgPSBfdGhpcy5oZWlnaHRNb2RlXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgbGF0SW5wdXQuYWRkRXZlbnRMaXN0ZW5lcignYmx1cicsICgpID0+IHtcclxuICAgICAgICAgICAgbGF0SW5wdXQudmFsdWUgPSBOdW1iZXIoKF90aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxhdCkudG9GaXhlZCg4KSlcclxuICAgICAgICAgICAgbGF0Qm94LmlubmVySFRNTCA9ICcnXHJcbiAgICAgICAgICAgIGxhdEJveC5hcHBlbmRDaGlsZChsYXQpXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgbGF0SW5wdXQuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIF90aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxhdCA9IE51bWJlcihOdW1iZXIobGF0SW5wdXQudmFsdWUpLnRvRml4ZWQoOCkpXHJcbiAgICAgICAgICAgIGxhdC5pbm5lckhUTUwgPSBfdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sYXQudG9GaXhlZCg4KVxyXG4gICAgICAgICAgICBfdGhpcy5oZWlnaHQgPSBfdGhpcy5oZWlnaHRcclxuICAgICAgICAgIH0pXHJcblxyXG4gICAgICAgICAgYWx0Qm94LmFkZEV2ZW50TGlzdGVuZXIoJ2RibGNsaWNrJywgKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoX3RoaXMuaGVpZ2h0TW9kZSA9PSAyKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGFsdEJveC5pbm5lckhUTUwgPSAnJ1xyXG4gICAgICAgICAgICBhbHRJbnB1dC52YWx1ZSA9IE51bWJlcigoX3RoaXMuaGVpZ2h0KS50b0ZpeGVkKDIpKVxyXG4gICAgICAgICAgICBhbHRCb3guYXBwZW5kQ2hpbGQoYWx0SW5wdXQpXHJcbiAgICAgICAgICAgIGFsdElucHV0LmZvY3VzKClcclxuICAgICAgICAgICAgaWYgKF90aGlzLm9wZXJhdGUucG9zaXRpb25FZGl0aW5nKSB7XHJcbiAgICAgICAgICAgICAgX3RoaXMucG9zaXRpb25FZGl0aW5nID0gZmFsc2VcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBBc3NlbWJsZU9iamVjdC5jbG9zZU5vZGVFZGl0KF90aGlzKVxyXG4gICAgICAgICAgICBfdGhpcy5oZWlnaHRNb2RlID0gX3RoaXMuaGVpZ2h0TW9kZVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIGFsdElucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2JsdXInLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGFsdElucHV0LnZhbHVlID0gTnVtYmVyKChfdGhpcy5oZWlnaHQpLnRvRml4ZWQoMikpXHJcbiAgICAgICAgICAgIGFsdEJveC5pbm5lckhUTUwgPSAnJ1xyXG4gICAgICAgICAgICBhbHRCb3guYXBwZW5kQ2hpbGQoYWx0KVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIGFsdElucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKCkgPT4ge1xyXG4gICAgICAgICAgICBfdGhpcy5oZWlnaHQgPSBOdW1iZXIoTnVtYmVyKGFsdElucHV0LnZhbHVlKS50b0ZpeGVkKDIpKVxyXG4gICAgICAgICAgICBhbHQuaW5uZXJIVE1MID0gTnVtYmVyKF90aGlzLmhlaWdodC50b0ZpeGVkKDIpKVxyXG4gICAgICAgICAgfSlcclxuXHJcblxyXG4gICAgICAgICAgX3RoaXMuX2VsbXMubG5nLnB1c2gobG5nKVxyXG4gICAgICAgICAgX3RoaXMuX2VsbXMubG5nSW5wdXQucHVzaChsbmdJbnB1dClcclxuICAgICAgICAgIF90aGlzLl9lbG1zLmxhdC5wdXNoKGxhdClcclxuICAgICAgICAgIF90aGlzLl9lbG1zLmxhdElucHV0LnB1c2gobGF0SW5wdXQpXHJcbiAgICAgICAgICBfdGhpcy5fZWxtcy5hbHQucHVzaChhbHQpXHJcbiAgICAgICAgICBfdGhpcy5fZWxtcy5hbHRJbnB1dC5wdXNoKGFsdElucHV0KVxyXG4gICAgICAgICAgdEJvZHlFbG0uYXBwZW5kQ2hpbGQodHIpXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLl9EaWFsb2dPYmplY3QgPSBhd2FpdCBuZXcgRGlhbG9nKHRoaXMuc2RrLCB0aGlzLm9wdGlvbnMsIHtcclxuICAgICAgICB0aXRsZTogJ+mbhue7k+WcsOWxnuaApycsIGxlZnQ6ICcxODBweCcsIHRvcDogJzEwMHB4JyxcclxuICAgICAgICBjb25maXJtQ2FsbEJhY2s6IChvcHRpb25zKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLm5hbWUgPSB0aGlzLm5hbWUudHJpbSgpXHJcbiAgICAgICAgICBpZiAoIXRoaXMubmFtZSkge1xyXG4gICAgICAgICAgICB0aGlzLm5hbWUgPSAn5pyq5ZG95ZCN5a+56LGhJ1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5vcHRpb25zLmxhYmVsLnBvc2l0aW9uID0geyBsbmc6IHRoaXMubGFiZWwucG9zaXRpb25bMF0sIGxhdDogdGhpcy5sYWJlbC5wb3NpdGlvblsxXSwgYWx0OiB0aGlzLmxhYmVsLnBvc2l0aW9uWzJdIH1cclxuICAgICAgICAgIHRoaXMub3JpZ2luYWxPcHRpb25zID0gdGhpcy5kZWVwQ29weU9iaih0aGlzLm9wdGlvbnMpXHJcbiAgICAgICAgICB0aGlzLl9EaWFsb2dPYmplY3QuY2xvc2UoKVxyXG4gICAgICAgICAgdGhpcy5EaWFsb2cuY29uZmlybUNhbGxCYWNrICYmIHRoaXMuRGlhbG9nLmNvbmZpcm1DYWxsQmFjayh0aGlzLm9yaWdpbmFsT3B0aW9ucylcclxuICAgICAgICAgIHN5bmNEYXRhKHRoaXMuc2RrLCB0aGlzLm9wdGlvbnMuaWQpXHJcbiAgICAgICAgICBzeW5jU3BsaXREYXRhKHRoaXMuc2RrLCB0aGlzLm9wdGlvbnMuaWQpXHJcbiAgICAgICAgfSxcclxuICAgICAgICByZXNldENhbGxCYWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnJlc2V0KClcclxuICAgICAgICAgIHRoaXMuRGlhbG9nLnJlc2V0Q2FsbEJhY2sgJiYgdGhpcy5EaWFsb2cucmVzZXRDYWxsQmFjaygpXHJcbiAgICAgICAgfSxcclxuICAgICAgICByZW1vdmVDYWxsQmFjazogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5EaWFsb2cucmVtb3ZlQ2FsbEJhY2sgJiYgdGhpcy5EaWFsb2cucmVtb3ZlQ2FsbEJhY2soKVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgY2xvc2VDYWxsQmFjazogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5yZXNldCgpXHJcbiAgICAgICAgICB0aGlzLnBvc2l0aW9uRWRpdGluZyA9IGZhbHNlXHJcbiAgICAgICAgICB0aGlzLkRpYWxvZy5jbG9zZUNhbGxCYWNrICYmIHRoaXMuRGlhbG9nLmNsb3NlQ2FsbEJhY2soKVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgc2hvd0NhbGxCYWNrOiAoc2hvdykgPT4ge1xyXG4gICAgICAgICAgdGhpcy5vcHRpb25zLnNob3cgPSBzaG93XHJcbiAgICAgICAgICB0aGlzLm9yaWdpbmFsT3B0aW9ucy5zaG93ID0gc2hvd1xyXG4gICAgICAgICAgdGhpcy5zaG93ID0gc2hvd1xyXG4gICAgICAgICAgdGhpcy5EaWFsb2cuc2hvd0NhbGxCYWNrICYmIHRoaXMuRGlhbG9nLnNob3dDYWxsQmFjaygpXHJcbiAgICAgICAgfSxcclxuICAgICAgICB0cmFuc2xhdGlvbmFsQ2FsbEJhY2s6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMucG9zaXRpb25FZGl0aW5nID0gIXRoaXMucG9zaXRpb25FZGl0aW5nXHJcbiAgICAgICAgfSxcclxuICAgICAgICAvLyDkuozmrKHnvJbovpHlm57osINcclxuICAgICAgICBzZWNvbmRhcnlFZGl0Q2FsbEJhY2s6ICgpID0+IHtcclxuICAgICAgICAgIEFzc2VtYmxlT2JqZWN0Lm5vZGVFZGl0KHRoaXMsICgpID0+IHtcclxuICAgICAgICAgICAgY3JlYXRlU3BhdGlhbEluZm9UYWJsZUNvbnRlbnQoKVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICAgIHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5ib2R5LmNsYXNzTmFtZSA9IHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5ib2R5LmNsYXNzTmFtZSArICcgYXNzZW1ibGUnXHJcbiAgICAgIGxldCBjb250ZW50RWxtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgIGNvbnRlbnRFbG0uaW5uZXJIVE1MID0gaHRtbCh0aGlzKVxyXG4gICAgICB0aGlzLl9EaWFsb2dPYmplY3QuY29udGVudEFwcENoaWxkKGNvbnRlbnRFbG0pXHJcbiAgICAgIHRoaXMuYXR0cmlidXRlVHlwZSA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGVUeXBlXHJcbiAgICAgIHRoaXMuYXR0cmlidXRlQ2FtZXJhID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5jYW1lcmEuY29udGVudFxyXG5cclxuICAgICAgLy8g5Yib5bu65qCH562+6aG1XHJcbiAgICAgIGxldCB0YWJzRWxtID0gbmV3IGN5X3RhYnMoJ2Fzc2VtYmxlLW9iamVjdC1lZGl0LXRhYnMnLCB1bmRlZmluZWQsIHRoaXMuc2RrKVxyXG4gICAgICAvLyDpopzoibLnu4Tku7ZcclxuICAgICAgbGV0IGNvbG9yUGlja2VyID0gbmV3IFlKQ29sb3JQaWNrZXIoe1xyXG4gICAgICAgIGVsOiBjb250ZW50RWxtLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXCJjb2xvclwiKVswXSxcclxuICAgICAgICBzaXplOiAnbWluaScsLy/popzoibJib3jnsbvlnotcclxuICAgICAgICBhbHBoYTogdHJ1ZSwvL+aYr+WQpuW8gOWQr+mAj+aYjuW6plxyXG4gICAgICAgIGRlZmF1bHRDb2xvcjogdGhpcy5jb2xvcixcclxuICAgICAgICBkaXNhYmxlZDogZmFsc2UsLy/mmK/lkKbnpoHmraLmiZPlvIDpopzoibLpgInmi6nlmahcclxuICAgICAgICBvcGVuUGlja2VyQW5pOiAnb3BhY2l0eScsLy/miZPlvIDpopzoibLpgInmi6nlmajliqjnlLtcclxuICAgICAgICBzdXJlOiAoY29sb3IpID0+IHtcclxuICAgICAgICAgIHRoaXMuY29sb3IgPSBjb2xvclxyXG4gICAgICAgIH0sLy/ngrnlh7vnoa7orqTmjInpkq7kuovku7blm57osINcclxuICAgICAgICBjbGVhcjogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5jb2xvciA9ICdyZ2JhKDI1NSwyNTUsMjU1LDEpJ1xyXG4gICAgICAgIH0sLy/ngrnlh7vmuIXnqbrmjInpkq7kuovku7blm57osINcclxuICAgICAgfSlcclxuICAgICAgbGV0IGxpbmVjb2xvclBpY2tlciA9IG5ldyBZSkNvbG9yUGlja2VyKHtcclxuICAgICAgICBlbDogY29udGVudEVsbS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFwibGluZUNvbG9yXCIpWzBdLFxyXG4gICAgICAgIHNpemU6ICdtaW5pJywvL+minOiJsmJveOexu+Wei1xyXG4gICAgICAgIGFscGhhOiB0cnVlLC8v5piv5ZCm5byA5ZCv6YCP5piO5bqmXHJcbiAgICAgICAgZGVmYXVsdENvbG9yOiB0aGlzLmxpbmVDb2xvcixcclxuICAgICAgICBkaXNhYmxlZDogZmFsc2UsLy/mmK/lkKbnpoHmraLmiZPlvIDpopzoibLpgInmi6nlmahcclxuICAgICAgICBvcGVuUGlja2VyQW5pOiAnb3BhY2l0eScsLy/miZPlvIDpopzoibLpgInmi6nlmajliqjnlLtcclxuICAgICAgICBzdXJlOiAoY29sb3IpID0+IHtcclxuICAgICAgICAgIHRoaXMubGluZUNvbG9yID0gY29sb3JcclxuICAgICAgICB9LC8v54K55Ye756Gu6K6k5oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgICAgY2xlYXI6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMubGluZUNvbG9yID0gJ3JnYmEoMjU1LDI1NSwyNTUsMSknXHJcbiAgICAgICAgfSwvL+eCueWHu+a4heepuuaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICB9KVxyXG4gICAgICBsZXQgbGFiZWxDb2xvclBpY2tlciA9IG5ldyBZSkNvbG9yUGlja2VyKHtcclxuICAgICAgICBlbDogY29udGVudEVsbS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFwibGFiZWxDb2xvclwiKVswXSxcclxuICAgICAgICBzaXplOiAnbWluaScsLy/popzoibJib3jnsbvlnotcclxuICAgICAgICBhbHBoYTogdHJ1ZSwvL+aYr+WQpuW8gOWQr+mAj+aYjuW6plxyXG4gICAgICAgIGRlZmF1bHRDb2xvcjogdGhpcy5sYWJlbENvbG9yLFxyXG4gICAgICAgIGRpc2FibGVkOiBmYWxzZSwvL+aYr+WQpuemgeatouaJk+W8gOminOiJsumAieaLqeWZqFxyXG4gICAgICAgIG9wZW5QaWNrZXJBbmk6ICdvcGFjaXR5JywvL+aJk+W8gOminOiJsumAieaLqeWZqOWKqOeUu1xyXG4gICAgICAgIHN1cmU6IChjb2xvcikgPT4ge1xyXG4gICAgICAgICAgdGhpcy5sYWJlbENvbG9yID0gY29sb3JcclxuICAgICAgICB9LC8v54K55Ye756Gu6K6k5oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgICAgY2xlYXI6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMubGFiZWxDb2xvciA9ICdyZ2JhKDI1NSwyNTUsMjU1LDEpJ1xyXG4gICAgICAgIH0sLy/ngrnlh7vmuIXnqbrmjInpkq7kuovku7blm57osINcclxuICAgICAgfSlcclxuICAgICAgbGV0IGxhYmVsbGluZUNvbG9yUGlja2VyID0gbmV3IFlKQ29sb3JQaWNrZXIoe1xyXG4gICAgICAgIGVsOiBjb250ZW50RWxtLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXCJsYWJlbExpbmVDb2xvclwiKVswXSxcclxuICAgICAgICBzaXplOiAnbWluaScsLy/popzoibJib3jnsbvlnotcclxuICAgICAgICBhbHBoYTogdHJ1ZSwvL+aYr+WQpuW8gOWQr+mAj+aYjuW6plxyXG4gICAgICAgIGRlZmF1bHRDb2xvcjogdGhpcy5sYWJlbExpbmVDb2xvcixcclxuICAgICAgICBkaXNhYmxlZDogZmFsc2UsLy/mmK/lkKbnpoHmraLmiZPlvIDpopzoibLpgInmi6nlmahcclxuICAgICAgICBvcGVuUGlja2VyQW5pOiAnb3BhY2l0eScsLy/miZPlvIDpopzoibLpgInmi6nlmajliqjnlLtcclxuICAgICAgICBzdXJlOiAoY29sb3IpID0+IHtcclxuICAgICAgICAgIHRoaXMubGFiZWxMaW5lQ29sb3IgPSBjb2xvclxyXG4gICAgICAgIH0sLy/ngrnlh7vnoa7orqTmjInpkq7kuovku7blm57osINcclxuICAgICAgICBjbGVhcjogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5sYWJlbExpbmVDb2xvciA9ICdyZ2JhKDI1NSwyNTUsMjU1LDEpJ1xyXG4gICAgICAgIH0sLy/ngrnlh7vmuIXnqbrmjInpkq7kuovku7blm57osINcclxuICAgICAgfSlcclxuICAgICAgbGV0IGxhYmVsQmFja2dyb3VuZENvbG9yU3RhcnRQaWNrZXIgPSBuZXcgWUpDb2xvclBpY2tlcih7XHJcbiAgICAgICAgZWw6IGNvbnRlbnRFbG0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcImxhYmVsQmFja2dyb3VuZENvbG9yU3RhcnRcIilbMF0sXHJcbiAgICAgICAgc2l6ZTogJ21pbmknLFxyXG4gICAgICAgIGFscGhhOiB0cnVlLFxyXG4gICAgICAgIGRlZmF1bHRDb2xvcjogdGhpcy5sYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0LFxyXG4gICAgICAgIGRpc2FibGVkOiBmYWxzZSxcclxuICAgICAgICBvcGVuUGlja2VyQW5pOiAnb3BhY2l0eScsXHJcbiAgICAgICAgc3VyZTogKGNvbG9yKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmxhYmVsQmFja2dyb3VuZENvbG9yU3RhcnQgPSBjb2xvclxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgY2xlYXI6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JTdGFydCA9ICdyZ2JhKDI1NSwyNTUsMjU1LDEpJ1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pXHJcbiAgICAgIGxldCBsYWJlbEJhY2tncm91bmRDb2xvckVuZFBpY2tlciA9IG5ldyBZSkNvbG9yUGlja2VyKHtcclxuICAgICAgICBlbDogY29udGVudEVsbS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFwibGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmRcIilbMF0sXHJcbiAgICAgICAgc2l6ZTogJ21pbmknLFxyXG4gICAgICAgIGFscGhhOiB0cnVlLFxyXG4gICAgICAgIGRlZmF1bHRDb2xvcjogdGhpcy5sYWJlbEJhY2tncm91bmRDb2xvckVuZCxcclxuICAgICAgICBkaXNhYmxlZDogZmFsc2UsXHJcbiAgICAgICAgb3BlblBpY2tlckFuaTogJ29wYWNpdHknLFxyXG4gICAgICAgIHN1cmU6IChjb2xvcikgPT4ge1xyXG4gICAgICAgICAgdGhpcy5sYWJlbEJhY2tncm91bmRDb2xvckVuZCA9IGNvbG9yXHJcbiAgICAgICAgfSxcclxuICAgICAgICBjbGVhcjogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5sYWJlbEJhY2tncm91bmRDb2xvckVuZCA9ICdyZ2JhKDI1NSwyNTUsMjU1LDEpJ1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pXHJcbiAgICAgIGxldCBhbGxfZWxtID0gY29udGVudEVsbS5nZXRFbGVtZW50c0J5VGFnTmFtZShcIipcIilcclxuICAgICAgQXNzZW1ibGVPYmplY3QuRXZlbnRCaW5kaW5nKHRoaXMsIGFsbF9lbG0pXHJcbiAgICAgIHRoaXMuX2VsbXMuY29sb3IgPSBbY29sb3JQaWNrZXJdXHJcbiAgICAgIHRoaXMuX2VsbXMubGluZUNvbG9yID0gW2xpbmVjb2xvclBpY2tlcl1cclxuICAgICAgdGhpcy5fZWxtcy5sYWJlbENvbG9yID0gW2xhYmVsQ29sb3JQaWNrZXJdXHJcbiAgICAgIHRoaXMuX2VsbXMubGFiZWxMaW5lQ29sb3IgPSBbbGFiZWxsaW5lQ29sb3JQaWNrZXJdXHJcbiAgICAgIHRoaXMuX2VsbXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JTdGFydCA9IFtsYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0UGlja2VyXVxyXG4gICAgICB0aGlzLl9lbG1zLmxhYmVsQmFja2dyb3VuZENvbG9yRW5kID0gW2xhYmVsQmFja2dyb3VuZENvbG9yRW5kUGlja2VyXVxyXG5cclxuICAgICAgbGV0IGhlaWdodEJveEVsbSA9IHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2hlaWdodC1ib3gnKVswXVxyXG4gICAgICBsZXQgaGVpZ2h0RWxtID0gaGVpZ2h0Qm94RWxtLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2hlaWdodCcpWzBdXHJcbiAgICAgIGxldCBoZWlnaHRDb25maXJtRWxtID0gdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaGVpZ2h0LWNvbmZpcm0nKVswXVxyXG4gICAgICBoZWlnaHRFbG0udmFsdWUgPSAxMFxyXG4gICAgICBpZiAodGhpcy5oZWlnaHRNb2RlID09IDIpIHtcclxuICAgICAgICBoZWlnaHRCb3hFbG0gJiYgKGhlaWdodEJveEVsbS5jbGFzc05hbWUgPSAnaW5wdXQtbnVtYmVyIGlucHV0LW51bWJlci11bml0LTEgaGVpZ2h0LWJveCBkaXNhYmxlZCcpO1xyXG4gICAgICAgIGhlaWdodENvbmZpcm1FbG0gJiYgaGVpZ2h0Q29uZmlybUVsbS5zZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJywgJ2Rpc2FibGVkJyk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgaGVpZ2h0Qm94RWxtICYmIChoZWlnaHRCb3hFbG0uY2xhc3NOYW1lID0gJ2lucHV0LW51bWJlciBpbnB1dC1udW1iZXItdW5pdC0xIGhlaWdodC1ib3gnKTtcclxuICAgICAgICBoZWlnaHRDb25maXJtRWxtICYmIGhlaWdodENvbmZpcm1FbG0ucmVtb3ZlQXR0cmlidXRlKCdkaXNhYmxlZCcpO1xyXG4gICAgICB9XHJcbiAgICAgIGxldCBoZWlnaHRNb2RlRGF0YSA9IFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICBuYW1lOiAn5rW35ouU6auY5bqmJyxcclxuICAgICAgICAgIHZhbHVlOiAn5rW35ouU6auY5bqmJyxcclxuICAgICAgICAgIGtleTogJzAnLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgbmFtZTogJ+ebuOWvueWcsOihqCcsXHJcbiAgICAgICAgICB2YWx1ZTogJ+ebuOWvueWcsOihqCcsXHJcbiAgICAgICAgICBrZXk6ICcxJyxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIG5hbWU6ICfkvp3pmYTmqKHlnosnLFxyXG4gICAgICAgICAgdmFsdWU6ICfkvp3pmYTmqKHlnosnLFxyXG4gICAgICAgICAga2V5OiAnMicsXHJcbiAgICAgICAgfVxyXG4gICAgICBdXHJcbiAgICAgIGxldCBoZWlnaHRNb2RlT2JqZWN0ID0gbGVncChcclxuICAgICAgICB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFxyXG4gICAgICAgICAgJ2hlaWdodC1tb2RlLWJveCdcclxuICAgICAgICApWzBdLFxyXG4gICAgICAgICcuaGVpZ2h0LW1vZGUnXHJcbiAgICAgIClcclxuICAgICAgaWYgKGhlaWdodE1vZGVPYmplY3QpIHtcclxuICAgICAgICBoZWlnaHRNb2RlT2JqZWN0LmxlZ3Bfc2VhcmNoKGhlaWdodE1vZGVEYXRhKVxyXG4gICAgICAgIGxldCBoZWlnaHRNb2RlRGF0YUxlZ3BFbG0gPSB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudFxyXG4gICAgICAgICAgLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2hlaWdodC1tb2RlJylbMF1cclxuICAgICAgICAgIC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaW5wdXQnKVswXVxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaGVpZ2h0TW9kZURhdGEubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGlmIChoZWlnaHRNb2RlRGF0YVtpXS5rZXkgPT0gdGhpcy5oZWlnaHRNb2RlKSB7XHJcbiAgICAgICAgICAgIGhlaWdodE1vZGVEYXRhTGVncEVsbS52YWx1ZSA9IGhlaWdodE1vZGVEYXRhW2ldLnZhbHVlXHJcbiAgICAgICAgICAgIGhlaWdodE1vZGVPYmplY3QubGVncF9zZWFyY2hBY3RpdmUoXHJcbiAgICAgICAgICAgICAgaGVpZ2h0TW9kZURhdGFbaV0udmFsdWVcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBoZWlnaHRNb2RlRGF0YUxlZ3BFbG0uYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7XHJcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhlaWdodE1vZGVEYXRhLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChoZWlnaHRNb2RlRGF0YVtpXS52YWx1ZSA9PT0gaGVpZ2h0TW9kZURhdGFMZWdwRWxtLnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5oZWlnaHRNb2RlID0gaGVpZ2h0TW9kZURhdGFbaV0ua2V5XHJcbiAgICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcblxyXG4gICAgICAgIGhlaWdodEVsbS5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICgpID0+IHtcclxuICAgICAgICAgIHN3aXRjaCAodGhpcy5oZWlnaHRNb2RlKSB7XHJcbiAgICAgICAgICAgIGNhc2UgMDpcclxuICAgICAgICAgICAgY2FzZSAnMCc6XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgMTpcclxuICAgICAgICAgICAgY2FzZSAnMSc6XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgMjpcclxuICAgICAgICAgICAgY2FzZSAnMic6XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuXHJcbiAgICAgICAgdGhpcy5fZWxtcy5oZWlnaHQgPSBoZWlnaHRFbG1cclxuICAgICAgICB0aGlzLl9lbG1zLmhlaWdodEJveCA9IGhlaWdodEJveEVsbVxyXG4gICAgICAgIHRoaXMuX2VsbXMuaGVpZ2h0TW9kZSA9IGhlaWdodE1vZGVEYXRhTGVncEVsbVxyXG4gICAgICAgIHRoaXMuX2VsbXMuaGVpZ2h0Q29uZmlybSA9IGhlaWdodENvbmZpcm1FbG1cclxuICAgICAgICB0aGlzLl9lbG1zLmhlaWdodE1vZGVPYmplY3QgPSBoZWlnaHRNb2RlT2JqZWN0XHJcblxyXG4gICAgICAgIGhlaWdodENvbmZpcm1FbG0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XHJcbiAgICAgICAgICBpZiAodGhpcy5vcGVyYXRlLnBvc2l0aW9uRWRpdGluZykge1xyXG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uRWRpdGluZyA9IGZhbHNlXHJcbiAgICAgICAgICAgIHRoaXMuaGVpZ2h0ID0gdGhpcy5oZWlnaHQgKyBOdW1iZXIoaGVpZ2h0RWxtLnZhbHVlKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIEFzc2VtYmxlT2JqZWN0LmNsb3NlTm9kZUVkaXQodGhpcylcclxuICAgICAgICAgICAgdGhpcy5oZWlnaHRNb2RlID0gdGhpcy5oZWlnaHRNb2RlXHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgIHRoaXMuaGVpZ2h0ID0gdGhpcy5oZWlnaHQgKyBOdW1iZXIoaGVpZ2h0RWxtLnZhbHVlKVxyXG4gICAgICAgICAgICB9LCAxMDApO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuYXR0cmlidXRlTGluayA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50XHJcbiAgICAgICAgdGhpcy5hdHRyaWJ1dGVWciA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudFxyXG4gICAgICAgIHRoaXMuY2FtZXJhU2VsZWN0ICYmIHRoaXMuY2FtZXJhU2VsZWN0KClcclxuICAgICAgICB0aGlzLmdvb2RzU2VsZWN0ICYmIHRoaXMuZ29vZHNTZWxlY3QoKVxyXG4gICAgICAgIGxldCB0YWdEYXRhID0gdGhpcy5hdHRyaWJ1dGVTZWxlY3RcclxuICAgICAgICBsZXQgYXR0cmlidXRlRWxtID0gdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnYXR0cmlidXRlLXNlbGVjdC1ib3gnKVswXVxyXG4gICAgICAgIGlmIChhdHRyaWJ1dGVFbG0pIHtcclxuICAgICAgICAgIGxldCBsZWdwT2JqZWN0ID0gbGVncChhdHRyaWJ1dGVFbG0sIFwiLmF0dHJpYnV0ZS1zZWxlY3RcIilcclxuICAgICAgICAgIGxlZ3BPYmplY3QubGVncF9zZWFyY2godGFnRGF0YSlcclxuICAgICAgICAgIGxldCBhdHRyaWJ1dGVTZWxlY3RFbG0gPSB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdhdHRyaWJ1dGUtc2VsZWN0JylbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2lucHV0JylbMF1cclxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGFnRGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAodGFnRGF0YVtpXS5rZXkgPT09IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGVUeXBlKSB7XHJcbiAgICAgICAgICAgICAgYXR0cmlidXRlU2VsZWN0RWxtLnZhbHVlID0gdGFnRGF0YVtpXS52YWx1ZVxyXG4gICAgICAgICAgICAgIGxlZ3BPYmplY3QubGVncF9zZWFyY2hBY3RpdmUodGFnRGF0YVtpXS52YWx1ZSlcclxuICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBhdHRyaWJ1dGVTZWxlY3RFbG0uYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGFnRGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgIGlmICh0YWdEYXRhW2ldLnZhbHVlID09PSBhdHRyaWJ1dGVTZWxlY3RFbG0udmFsdWUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYXR0cmlidXRlVHlwZSA9IHRhZ0RhdGFbaV0ua2V5XHJcbiAgICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICB9XHJcbiAgICAgICAgY3JlYXRlU3BhdGlhbEluZm9UYWJsZUNvbnRlbnQoKVxyXG5cclxuICAgICAgICBsZXQgdW5pdERhdGEgPSBbe1xyXG4gICAgICAgICAgbmFtZTogJ+W5s+aWueexsycsXHJcbiAgICAgICAgICB2YWx1ZTogJ+W5s+aWueexsydcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIG5hbWU6ICflubPmlrnljYPnsbMnLFxyXG4gICAgICAgICAgdmFsdWU6ICflubPmlrnljYPnsbMnXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBuYW1lOiAn5LqpJyxcclxuICAgICAgICAgIHZhbHVlOiAn5LqpJ1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgbmFtZTogJ+WFrOmhtycsXHJcbiAgICAgICAgICB2YWx1ZTogJ+WFrOmhtydcclxuICAgICAgICB9LFxyXG4gICAgICAgIF1cclxuICAgICAgICBsZXQgdW5pdERhdGFMZWdwT2JqZWN0ID0gbGVncCh0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdpbnB1dC1zZWxlY3QtdW5pdC1ib3gnKVswXSwgXCIuaW5wdXQtc2VsZWN0LXVuaXRcIilcclxuICAgICAgICBpZiAodW5pdERhdGFMZWdwT2JqZWN0KSB7XHJcbiAgICAgICAgICB1bml0RGF0YUxlZ3BPYmplY3QubGVncF9zZWFyY2godW5pdERhdGEpXHJcbiAgICAgICAgICBsZXQgdW5pdERhdGFMZWdwRWxtID0gdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaW5wdXQtc2VsZWN0LXVuaXQnKVswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaW5wdXQnKVswXVxyXG4gICAgICAgICAgdW5pdERhdGFMZWdwRWxtLnZhbHVlID0gdGhpcy5vcHRpb25zWydhcmVhLXVuaXQnXVxyXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB1bml0RGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAodW5pdERhdGFbaV0udmFsdWUgPT09IHVuaXREYXRhTGVncEVsbS52YWx1ZSkge1xyXG4gICAgICAgICAgICAgIHVuaXREYXRhTGVncE9iamVjdC5sZWdwX3NlYXJjaEFjdGl2ZSh1bml0RGF0YVtpXS52YWx1ZSlcclxuICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB1bml0RGF0YUxlZ3BFbG0uYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdW5pdERhdGEubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICBpZiAodW5pdERhdGFbaV0udmFsdWUgPT09IHVuaXREYXRhTGVncEVsbS52YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hcmVhVW5pdCA9IHVuaXREYXRhW2ldLnZhbHVlXHJcbiAgICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBmb250RGF0YSA9IGdldEZvbnRMaXN0KClcclxuICAgICAgICBsZXQgZm9udE9iamVjdCA9IGxlZ3AoXHJcbiAgICAgICAgICB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFxyXG4gICAgICAgICAgICAnZm9udC1zZWxlY3QtYm94J1xyXG4gICAgICAgICAgKVswXSxcclxuICAgICAgICAgICcuZm9udC1zZWxlY3QnXHJcbiAgICAgICAgKVxyXG4gICAgICAgIGlmIChmb250T2JqZWN0KSB7XHJcbiAgICAgICAgICBmb250T2JqZWN0LmxlZ3Bfc2VhcmNoKGZvbnREYXRhKVxyXG4gICAgICAgICAgbGV0IGZvbnREYXRhTGVncEVsbSA9IHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50XHJcbiAgICAgICAgICAgIC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdmb250LXNlbGVjdCcpWzBdXHJcbiAgICAgICAgICAgIC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaW5wdXQnKVswXVxyXG4gICAgICAgICAgZm9udERhdGFMZWdwRWxtLnZhbHVlID0gZm9udERhdGFbdGhpcy5sYWJlbEZvbnRGYW1pbHldLnZhbHVlXHJcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZvbnREYXRhLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChmb250RGF0YVtpXS52YWx1ZSA9PSBmb250RGF0YUxlZ3BFbG0udmFsdWUpIHtcclxuICAgICAgICAgICAgICBmb250T2JqZWN0LmxlZ3Bfc2VhcmNoQWN0aXZlKGZvbnREYXRhW2ldLnZhbHVlKVxyXG4gICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGZvbnREYXRhTGVncEVsbS5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICgpID0+IHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmb250RGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgIGlmIChmb250RGF0YVtpXS52YWx1ZSA9PT0gZm9udERhdGFMZWdwRWxtLnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxhYmVsRm9udEZhbWlseSA9IGZvbnREYXRhW2ldLmtleVxyXG4gICAgICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICB0aGlzLl9lbG1zLmxhYmVsRm9udEZhbWlseSA9IFtmb250RGF0YUxlZ3BFbG1dXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgfSwgMCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAodGhpcy5fRGlhbG9nT2JqZWN0ICYmIHRoaXMuX0RpYWxvZ09iamVjdC5jbG9zZSkge1xyXG4gICAgICAgIHRoaXMuX0RpYWxvZ09iamVjdC5jbG9zZSgpXHJcbiAgICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0ID0gbnVsbFxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZXNldCgpIHtcclxuICAgIGlmICghdGhpcy5lbnRpdHkpIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcbiAgICB0aGlzLm9wdGlvbnMgPSB0aGlzLmRlZXBDb3B5T2JqKHRoaXMub3JpZ2luYWxPcHRpb25zKVxyXG4gICAgdGhpcy5uYW1lID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMubmFtZVxyXG4gICAgdGhpcy5jb2xvciA9IHRoaXMub3JpZ2luYWxPcHRpb25zLmNvbG9yXHJcbiAgICB0aGlzLmxpbmVDb2xvciA9IHRoaXMub3JpZ2luYWxPcHRpb25zLmxpbmUuY29sb3JcclxuICAgIHRoaXMubGluZVdpZHRoID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMubGluZS53aWR0aFxyXG4gICAgdGhpcy5hcmVhID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMuYXJlYVxyXG4gICAgdGhpcy5hcmVhVW5pdCA9IHRoaXMub3JpZ2luYWxPcHRpb25zWydhcmVhLXVuaXQnXVxyXG4gICAgdGhpcy5sYWJlbFNob3cgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5sYWJlbC5zaG93XHJcbiAgICB0aGlzLmxhYmVsQ29sb3IgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5sYWJlbC5jb2xvclxyXG4gICAgdGhpcy5sYWJlbEZvbnRTaXplID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMubGFiZWwuZm9udFNpemVcclxuICAgIHRoaXMubGFiZWxGb250RmFtaWx5ID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMubGFiZWwuZm9udEZhbWlseVxyXG4gICAgdGhpcy5sYWJlbFNjYWxlQnlEaXN0YW5jZSA9IHRoaXMub3JpZ2luYWxPcHRpb25zLmxhYmVsLnNjYWxlQnlEaXN0YW5jZVxyXG4gICAgdGhpcy5sYWJlbE5lYXIgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5sYWJlbC5uZWFyXHJcbiAgICB0aGlzLmxhYmVsRmFyID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMubGFiZWwuZmFyXHJcbiAgICB0aGlzLmxhYmVsTGluZVdpZHRoID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMubGFiZWwubGluZVdpZHRoXHJcbiAgICB0aGlzLmxhYmVsUGl4ZWxPZmZzZXQgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5sYWJlbC5waXhlbE9mZnNldFxyXG4gICAgdGhpcy5sYWJlbExpbmVDb2xvciA9IHRoaXMub3JpZ2luYWxPcHRpb25zLmxhYmVsLmxpbmVDb2xvclxyXG4gICAgdGhpcy5sYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0ID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMubGFiZWwuYmFja2dyb3VuZENvbG9yWzBdXHJcbiAgICB0aGlzLmxhYmVsQmFja2dyb3VuZENvbG9yRW5kID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMubGFiZWwuYmFja2dyb3VuZENvbG9yWzFdXHJcbiAgICB0aGlzLmF0dHJpYnV0ZUxpbmsgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudFxyXG4gICAgdGhpcy5hdHRyaWJ1dGVDYW1lcmEgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmNhbWVyYS5jb250ZW50XHJcbiAgICB0aGlzLmF0dHJpYnV0ZVZyID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52ci5jb250ZW50XHJcbiAgICB0aGlzLmF0dHJpYnV0ZUdvb2RzID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5nb29kcy5jb250ZW50XHJcbiAgICB0aGlzLmNhbWVyYVNlbGVjdCAmJiB0aGlzLmNhbWVyYVNlbGVjdCgpXHJcbiAgICB0aGlzLmdvb2RzU2VsZWN0ICYmIHRoaXMuZ29vZHNTZWxlY3QoKVxyXG5cclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMub3B0aW9ucy5wb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgaWYgKHRoaXMuX2VsbXMubG5nICYmIHRoaXMuX2VsbXMubG5nW2ldKSB7XHJcbiAgICAgICAgdGhpcy5fZWxtcy5sbmdbaV0uaW5uZXJIVE1MID0gdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sbmcudG9GaXhlZCg4KVxyXG4gICAgICB9XHJcbiAgICAgIGlmICh0aGlzLl9lbG1zLmxhdCAmJiB0aGlzLl9lbG1zLmxhdFtpXSkge1xyXG4gICAgICAgIHRoaXMuX2VsbXMubGF0W2ldLmlubmVySFRNTCA9IHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubGF0LnRvRml4ZWQoOClcclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy5fZWxtcy5hbHQgJiYgdGhpcy5fZWxtcy5hbHRbaV0pIHtcclxuICAgICAgICB0aGlzLl9lbG1zLmFsdFtpXS5pbm5lckhUTUwgPSBOdW1iZXIodGhpcy5vcHRpb25zLmhlaWdodC50b0ZpeGVkKDIpKVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5oZWlnaHRNb2RlID0gdGhpcy5oZWlnaHRNb2RlXHJcblxyXG5cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5ub2RlUG9pbnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIHRoaXMuc2RrLnZpZXdlci5lbnRpdGllcy5yZW1vdmUodGhpcy5ub2RlUG9pbnRzW2ldKVxyXG4gICAgfVxyXG4gICAgdGhpcy5wcmV2aW91cyA9IG51bGxcclxuICAgIHRoaXMubm9kZVBvaW50cyA9IFtdXHJcbiAgICBZSi5NZWFzdXJlLlNldE1lYXN1cmVTdGF0dXMoZmFsc2UpXHJcbiAgICB0aGlzLmV2ZW50ICYmIHRoaXMuZXZlbnQuZGVzdHJveSgpXHJcbiAgICB0aGlzLnRpcCAmJiB0aGlzLnRpcC5kZXN0cm95KClcclxuICB9XHJcblxyXG4gIGFzeW5jIHJlbW92ZSgpIHtcclxuICAgIHRoaXMuc2RrLnZpZXdlci5lbnRpdGllcy5yZW1vdmUodGhpcy5lbnRpdHkpXHJcbiAgICB0aGlzLmxhYmVsICYmIHRoaXMubGFiZWwucmVtb3ZlKClcclxuICAgIHRoaXMuZXZlbnQgJiYgdGhpcy5ldmVudC5kZXN0cm95KClcclxuICAgIHRoaXMudGlwICYmIHRoaXMudGlwLmRlc3Ryb3koKVxyXG4gICAgdGhpcy5lbnRpdHkgPSBudWxsXHJcbiAgICBpZiAodGhpcy5fRGlhbG9nT2JqZWN0ICYmICF0aGlzLl9EaWFsb2dPYmplY3QuaXNEZXN0cm95KSB7XHJcbiAgICAgIHRoaXMuX0RpYWxvZ09iamVjdC5jbG9zZSgpXHJcbiAgICAgIHRoaXMuX0RpYWxvZ09iamVjdCA9IG51bGxcclxuICAgIH1cclxuICAgIGF3YWl0IHRoaXMuc2RrLnJlbW92ZUluY2V0YW5jZSh0aGlzLm9wdGlvbnMuaWQpXHJcbiAgICBhd2FpdCBzeW5jRGF0YSh0aGlzLnNkaywgdGhpcy5vcHRpb25zLmlkKVxyXG4gIH1cclxuXHJcbiAgX2FkZExpbmsoKSB7XHJcbiAgICAvLyBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lXHJcbiAgICBpZiAodGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbGlua19hZGQnKVswXSAmJiB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdsaW5rX2FkZCcpWzBdLnZhbHVlKSB7XHJcbiAgICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50LnB1c2goe1xyXG4gICAgICAgIG5hbWU6ICfpk77mjqUnLFxyXG4gICAgICAgIHVybDogdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbGlua19hZGQnKVswXS52YWx1ZVxyXG4gICAgICB9KVxyXG4gICAgICB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdsaW5rX2FkZCcpWzBdLnZhbHVlID0gJydcclxuICAgICAgdGhpcy5hdHRyaWJ1dGVMaW5rID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnRcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLkRpYWxvZy5jbGlja0FkZExpbmsgJiYgdGhpcy5EaWFsb2cuY2xpY2tBZGRMaW5rKClcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFkZEF0dHJpYnV0ZUxpbmsobGluaykge1xyXG4gICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnQucHVzaCh7XHJcbiAgICAgIG5hbWU6ICfpk77mjqUnLFxyXG4gICAgICB1cmw6IGxpbmtcclxuICAgIH0pXHJcbiAgICB0aGlzLmF0dHJpYnV0ZUxpbmsgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudFxyXG4gIH1cclxuXHJcbiAgX2FkZFJyKCkge1xyXG4gICAgaWYgKHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3ZyX2FkZCcpWzBdLnZhbHVlKSB7XHJcbiAgICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudC5wdXNoKHtcclxuICAgICAgICBuYW1lOiAn5YWo5pmv5Zu+JyAsXHJcbiAgICAgICAgdXJsOiB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd2cl9hZGQnKVswXS52YWx1ZVxyXG4gICAgICB9KVxyXG4gICAgICB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd2cl9hZGQnKVswXS52YWx1ZSA9ICcnXHJcbiAgICAgIHRoaXMuYXR0cmlidXRlVnIgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnRcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLkRpYWxvZy5jbGlja0FkZFZyICYmIHRoaXMuRGlhbG9nLmNsaWNrQWRkVnIoKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYWRkQXR0cmlidXRlUnIodnIpIHtcclxuICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudC5wdXNoKHtcclxuICAgICAgbmFtZTogJ+WFqOaZr+WbvicgLFxyXG4gICAgICB1cmw6IHZyXHJcbiAgICB9KVxyXG4gICAgdGhpcy5hdHRyaWJ1dGVWciA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudFxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAqIOmjnuWIsFxyXG4qL1xyXG4gIGFzeW5jIGZseVRvKG9wdGlvbnMgPSB7fSkge1xyXG4gICAgaWYgKHRoaXMuX2Vycm9yKSB7XHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG4gICAgc2V0QWN0aXZlVmlld2VyKDApXHJcbiAgICBjbG9zZVJvdGF0ZUFyb3VuZCh0aGlzLnNkaylcclxuICAgIGNsb3NlVmlld0ZvbGxvdyh0aGlzLnNkaylcclxuXHJcbiAgICBpZiAodGhpcy5vcHRpb25zLmN1c3RvbVZpZXcgJiYgdGhpcy5vcHRpb25zLmN1c3RvbVZpZXcucmVsYXRpdmVQb3NpdGlvbiAmJiB0aGlzLm9wdGlvbnMuY3VzdG9tVmlldy5vcmllbnRhdGlvbikge1xyXG4gICAgICBsZXQgb3JpZW50YXRpb24gPSB7XHJcbiAgICAgICAgaGVhZGluZzogQ2VzaXVtLk1hdGgudG9SYWRpYW5zKHRoaXMub3B0aW9ucy5jdXN0b21WaWV3Lm9yaWVudGF0aW9uLmhlYWRpbmcgfHwgMC4wKSxcclxuICAgICAgICBwaXRjaDogQ2VzaXVtLk1hdGgudG9SYWRpYW5zKHRoaXMub3B0aW9ucy5jdXN0b21WaWV3Lm9yaWVudGF0aW9uLnBpdGNoIHx8IC02MC4wKSxcclxuICAgICAgICByb2xsOiBDZXNpdW0uTWF0aC50b1JhZGlhbnModGhpcy5vcHRpb25zLmN1c3RvbVZpZXcub3JpZW50YXRpb24ucm9sbCB8fCAwLjApXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBsbmcgPSB0aGlzLm9wdGlvbnMuY3VzdG9tVmlldy5yZWxhdGl2ZVBvc2l0aW9uLmxuZ1xyXG4gICAgICBsZXQgbGF0ID0gdGhpcy5vcHRpb25zLmN1c3RvbVZpZXcucmVsYXRpdmVQb3NpdGlvbi5sYXRcclxuICAgICAgbGV0IGFsdCA9IHRoaXMub3B0aW9ucy5jdXN0b21WaWV3LnJlbGF0aXZlUG9zaXRpb24uYWx0XHJcbiAgICAgIGxldCBkZXN0aW5hdGlvbiA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzKGxuZywgbGF0LCBhbHQpXHJcblxyXG4gICAgICBsZXQgcG9zaXRpb24gPSB7IGxuZzogMCwgbGF0OiAwIH1cclxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5wb3NpdGlvbikge1xyXG4gICAgICAgIHBvc2l0aW9uID0geyAuLi50aGlzLm9wdGlvbnMucG9zaXRpb24gfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKHRoaXMub3B0aW9ucy5wb3NpdGlvbnMpIHtcclxuICAgICAgICBwb3NpdGlvbiA9IHsgLi4udGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXSB9XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAodGhpcy5vcHRpb25zLmNlbnRlcikge1xyXG4gICAgICAgIHBvc2l0aW9uID0geyAuLi50aGlzLm9wdGlvbnMuY2VudGVyIH1cclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmICh0aGlzLm9wdGlvbnMuc3RhcnQpIHtcclxuICAgICAgICBwb3NpdGlvbiA9IHsgLi4udGhpcy5vcHRpb25zLnN0YXJ0IH1cclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmhhc093blByb3BlcnR5KCdsbmcnKSkge1xyXG4gICAgICAgICAgcG9zaXRpb24ubG5nID0gdGhpcy5vcHRpb25zLmxuZ1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmhhc093blByb3BlcnR5KCdsYXQnKSkge1xyXG4gICAgICAgICAgcG9zaXRpb24ubGF0ID0gdGhpcy5vcHRpb25zLmxhdFxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmhhc093blByb3BlcnR5KCdhbHQnKSkge1xyXG4gICAgICAgICAgcG9zaXRpb24uYWx0ID0gdGhpcy5vcHRpb25zLmFsdFxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICAvLyDlpoLmnpzmsqHmnInpq5jluqblgLzvvIzliJnojrflj5bntKfotLTpq5jluqborqHnrpdcclxuICAgICAgaWYgKCFwb3NpdGlvbi5oYXNPd25Qcm9wZXJ0eSgnYWx0JykpIHtcclxuICAgICAgICBwb3NpdGlvbi5hbHQgPSBhd2FpdCB0aGlzLmdldENsYW1wVG9IZWlnaHQocG9zaXRpb24pXHJcbiAgICAgIH1cclxuICAgICAgbG5nID0gdGhpcy5vcHRpb25zLmN1c3RvbVZpZXcucmVsYXRpdmVQb3NpdGlvbi5sbmcgKyBwb3NpdGlvbi5sbmdcclxuICAgICAgbGF0ID0gdGhpcy5vcHRpb25zLmN1c3RvbVZpZXcucmVsYXRpdmVQb3NpdGlvbi5sYXQgKyBwb3NpdGlvbi5sYXRcclxuICAgICAgYWx0ID0gdGhpcy5vcHRpb25zLmN1c3RvbVZpZXcucmVsYXRpdmVQb3NpdGlvbi5hbHQgKyBwb3NpdGlvbi5hbHRcclxuICAgICAgZGVzdGluYXRpb24gPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlcyhsbmcsIGxhdCwgYWx0KVxyXG4gICAgICB0aGlzLnNkay52aWV3ZXIuY2FtZXJhLmZseVRvKHtcclxuICAgICAgICBkZXN0aW5hdGlvbjogZGVzdGluYXRpb24sXHJcbiAgICAgICAgb3JpZW50YXRpb246IG9yaWVudGF0aW9uXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgbGV0IHBvc2l0aW9uQXJyYXkgPSBbXVxyXG4gICAgICBsZXQgZ3JvdW5kXHJcbiAgICAgIHN3aXRjaCAodGhpcy5oZWlnaHRNb2RlKSB7XHJcbiAgICAgICAgY2FzZSAwOlxyXG4gICAgICAgIGNhc2UgJzAnOlxyXG4gICAgICAgICAgZ3JvdW5kID0gZmFsc2VcclxuICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgY2FzZSAxOlxyXG4gICAgICAgIGNhc2UgJzEnOlxyXG4gICAgICAgICAgZ3JvdW5kID0gZmFsc2VcclxuICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgY2FzZSAyOlxyXG4gICAgICAgIGNhc2UgJzInOlxyXG4gICAgICAgICAgZ3JvdW5kID0gdHJ1ZVxyXG4gICAgICAgICAgYnJlYWtcclxuICAgICAgfVxyXG4gICAgICBpZiAoZ3JvdW5kKSB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm9wdGlvbnMucG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBsZXQgaGVpZ2h0ID0gYXdhaXQgdGhpcy5nZXRDbGFtcFRvSGVpZ2h0KHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0pXHJcbiAgICAgICAgICBsZXQgYSA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzKFxyXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxuZyxcclxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sYXQsXHJcbiAgICAgICAgICAgIGhlaWdodFxyXG4gICAgICAgICAgKVxyXG4gICAgICAgICAgcG9zaXRpb25BcnJheS5wdXNoKGEueCwgYS55LCBhLnopXHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlmICh0aGlzLnBvc2l0aW9uc0gpIHtcclxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5wb3NpdGlvbnNILmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHBvc2l0aW9uQXJyYXkucHVzaCh0aGlzLnBvc2l0aW9uc0hbaV0ueCwgdGhpcy5wb3NpdGlvbnNIW2ldLnksIHRoaXMucG9zaXRpb25zSFtpXS56KVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBsZXQgQm91bmRpbmdTcGhlcmUgPSBDZXNpdW0uQm91bmRpbmdTcGhlcmUuZnJvbVZlcnRpY2VzKHBvc2l0aW9uQXJyYXkpXHJcbiAgICAgIHRoaXMuc2RrLnZpZXdlci5jYW1lcmEuZmx5VG9Cb3VuZGluZ1NwaGVyZShCb3VuZGluZ1NwaGVyZSwge1xyXG4gICAgICAgIG9mZnNldDogb3B0aW9ucy5vcmllbnRhdGlvbiB8fCB7XHJcbiAgICAgICAgICBoZWFkaW5nOiBDZXNpdW0uTWF0aC50b1JhZGlhbnMoMC4wKSxcclxuICAgICAgICAgIHBpdGNoOiBDZXNpdW0uTWF0aC50b1JhZGlhbnMoLTkwLjApLFxyXG4gICAgICAgICAgcm9sbDogQ2VzaXVtLk1hdGgudG9SYWRpYW5zKDAuMClcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiDmiZPlvIDlr4zmlofmnKzmoYZcclxuICAgKi9cclxuICBvcGVuUmljaFRleHRFZGl0b3IoZSkge1xyXG4gICAgLy8gdmFyIHVlID0gVUUuZ2V0RWRpdG9yKCdhcHAnKTtcclxuICAgIHJpY2hUZXh0Lm9wZW4odGhpcy5vcHRpb25zLmlkLCB0aGlzLm9wdGlvbnMubmFtZSwgdGhpcy5vcHRpb25zLnJpY2hUZXh0Q29udGVudClcclxuICAgIHJpY2hUZXh0LnByaW1hcnlDYWxsQmFjayA9IChjb250ZW50KSA9PiB7XHJcbiAgICAgIHRoaXMub3B0aW9ucy5yaWNoVGV4dENvbnRlbnQgPSBjb250ZW50XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipAZGVzYyDmiZPlvIDlubPnp7vlip/og71cclxuICAgKlxyXG4gICAqIEBtZW1iZXJPZiBTb3VyY2VcclxuICAgKiBAcGFyYW0gc3RhdHVzIHtib29sZWFufVxyXG4gICAqXHJcbiAgICogKi9cclxuICBzZXQgcG9zaXRpb25FZGl0aW5nKHN0YXR1cykge1xyXG4gICAgaWYgKFlKLk1lYXN1cmUuR2V0TWVhc3VyZVN0YXR1cygpIHx8ICF0aGlzLnNkayB8fCAhdGhpcy5zZGsudmlld2VyIHx8ICF0aGlzLmVudGl0eSB8fCAhdGhpcy5lbnRpdHkucG9seWdvbikge1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuICAgIGxldCBfdGhpcyA9IHRoaXNcclxuICAgIHRoaXMuZXZlbnQgJiYgdGhpcy5ldmVudC5kZXN0cm95KClcclxuICAgIHRoaXMuZXZlbnQgPSBuZXcgTW91c2VFdmVudCh0aGlzLnNkaylcclxuICAgIHRoaXMub3BlcmF0ZS5wb3NpdGlvbkVkaXRpbmcgPSBzdGF0dXNcclxuXHJcbiAgICBpZiAoc3RhdHVzID09PSB0cnVlKSB7XHJcbiAgICAgIHRoaXMucHJldmlvdXMgPSB7XHJcbiAgICAgICAgcG9zaXRpb25zOiBbLi4udGhpcy5wb3NpdGlvbnNdXHJcbiAgICAgIH1cclxuICAgICAgdGhpcy50aXAgJiYgdGhpcy50aXAuZGVzdHJveSgpXHJcbiAgICAgIHRoaXMudGlwID0gbmV3IE1vdXNlVGlwKCfngrnlh7vpvKDmoIflt6bplK7noa7orqTvvIzlj7PplK7lj5bmtognLCB0aGlzLnNkaylcclxuICAgICAgdGhpcy5sYWJlbCAmJiAodGhpcy5sYWJlbC5lbnRpdHkuYmlsbGJvYXJkLmNvbG9yID0gQ2VzaXVtLkNvbG9yLmZyb21Dc3NDb2xvclN0cmluZyhgcmdiYSgyNTUsMjU1LDI1NSwwLjkpYCkpXHJcbiAgICAgIHRoaXMucGlja2luZyA9IGZhbHNlXHJcbiAgICAgIGxldCBhcnJheSA9IFtdXHJcbiAgICAgIGxldCBwb3NpdGlvbnMgPSBbLi4udGhpcy5wb3NpdGlvbnNdXHJcbiAgICAgIGxldCBkaXNwYXJpdHkgPSBbXVxyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGxldCBwb3NpdGlvbiA9IHRoaXMuY2FydGVzaWFuM1Rvd2dzODQocG9zaXRpb25zW2ldLCB0aGlzLnNkay52aWV3ZXIpXHJcbiAgICAgICAgYXJyYXkucHVzaChbcG9zaXRpb24ubG5nLCBwb3NpdGlvbi5sYXRdKVxyXG4gICAgICB9XHJcbiAgICAgIGxldCBmaXJzdHBvc2l0aW9uID0gdGhpcy5jYXJ0ZXNpYW4zVG93Z3M4NChwb3NpdGlvbnNbMF0sIHRoaXMuc2RrLnZpZXdlcilcclxuICAgICAgYXJyYXkucHVzaChbZmlyc3Rwb3NpdGlvbi5sbmcsIGZpcnN0cG9zaXRpb24ubGF0XSlcclxuICAgICAgdmFyIHBvbHlnb24gPSB0dXJmLnBvbHlnb24oW2FycmF5XSk7XHJcbiAgICAgIHZhciBjZW50cm9pZCA9IHR1cmYuY2VudHJvaWQocG9seWdvbik7XHJcbiAgICAgIGxldCBjZW50ZXIgPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlcyguLi5jZW50cm9pZC5nZW9tZXRyeS5jb29yZGluYXRlcylcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBjZW50ZXIueCAtIHBvc2l0aW9uc1tpXS54XHJcbiAgICAgICAgZGlzcGFyaXR5LnB1c2goe1xyXG4gICAgICAgICAgeDogY2VudGVyLnggLSBwb3NpdGlvbnNbaV0ueCxcclxuICAgICAgICAgIHk6IGNlbnRlci55IC0gcG9zaXRpb25zW2ldLnksXHJcbiAgICAgICAgICB6OiBjZW50ZXIueiAtIHBvc2l0aW9uc1tpXS56LFxyXG4gICAgICAgIH0pXHJcbiAgICAgIH1cclxuICAgICAgbGV0IG5ld3Bvc2l0aW9ucyA9IFtdXHJcbiAgICAgIHRoaXMuZXZlbnQubW91c2VfbW92ZSgobW92ZW1lbnQsIGNhcnRlc2lhbikgPT4ge1xyXG4gICAgICAgIGxldCBwb3NpdGlvbjg0ID0gdGhpcy5jYXJ0ZXNpYW4zVG93Z3M4NChjYXJ0ZXNpYW4sIHRoaXMuc2RrLnZpZXdlcilcclxuICAgICAgICBuZXdwb3NpdGlvbnMgPSBbXVxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGlzcGFyaXR5Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBuZXdwb3NpdGlvbnMucHVzaCh7XHJcbiAgICAgICAgICAgIHg6IGNhcnRlc2lhbi54IC0gZGlzcGFyaXR5W2ldLngsXHJcbiAgICAgICAgICAgIHk6IGNhcnRlc2lhbi55IC0gZGlzcGFyaXR5W2ldLnksXHJcbiAgICAgICAgICAgIHo6IGNhcnRlc2lhbi56IC0gZGlzcGFyaXR5W2ldLnosXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuICAgICAgICAvLyB0aGlzLmxhYmVsLnBvc2l0aW9uID0gW3Bvc2l0aW9uODQubG5nLCBwb3NpdGlvbjg0LmxhdCwgcG9zaXRpb244NC5hbHRdXHJcbiAgICAgICAgdGhpcy50aXAuc2V0UG9zaXRpb24oXHJcbiAgICAgICAgICBjYXJ0ZXNpYW4sXHJcbiAgICAgICAgICBtb3ZlbWVudC5lbmRQb3NpdGlvbi54LFxyXG4gICAgICAgICAgbW92ZW1lbnQuZW5kUG9zaXRpb24ueVxyXG4gICAgICAgIClcclxuICAgICAgfSlcclxuICAgICAgdGhpcy5ldmVudC5tb3VzZV9sZWZ0KChtb3ZlbWVudCwgY2FydGVzaWFuKSA9PiB7XHJcbiAgICAgICAgdGhpcy5ldmVudC5tb3VzZV9tb3ZlKCgpID0+IHsgfSlcclxuICAgICAgICB0aGlzLmV2ZW50Lm1vdXNlX2xlZnQoKCkgPT4geyB9KVxyXG4gICAgICAgIHRoaXMuZXZlbnQubW91c2VfcmlnaHQoKCkgPT4geyB9KVxyXG4gICAgICAgIHRoaXMuZXZlbnQuZ2VzdHVyZV9waW5ja19zdGFydCgoKSA9PiB7IH0pXHJcbiAgICAgICAgbmV3cG9zaXRpb25zID0gW11cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRpc3Bhcml0eS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgbGV0IHBvczMgPSB7XHJcbiAgICAgICAgICAgIHg6IGNhcnRlc2lhbi54IC0gZGlzcGFyaXR5W2ldLngsXHJcbiAgICAgICAgICAgIHk6IGNhcnRlc2lhbi55IC0gZGlzcGFyaXR5W2ldLnksXHJcbiAgICAgICAgICAgIHo6IGNhcnRlc2lhbi56IC0gZGlzcGFyaXR5W2ldLnosXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBuZXdwb3NpdGlvbnMucHVzaChwb3MzKVxyXG4gICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXSA9IHRoaXMuY2FydGVzaWFuM1Rvd2dzODQocG9zMywgdGhpcy5zZGsudmlld2VyKVxyXG4gICAgICAgICAgaWYgKHRoaXMuX2VsbXMubG5nICYmIHRoaXMuX2VsbXMubG5nW2ldKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2VsbXMubG5nW2ldLmlubmVySFRNTCA9IHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubG5nLnRvRml4ZWQoOClcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmICh0aGlzLl9lbG1zLmxhdCAmJiB0aGlzLl9lbG1zLmxhdFtpXSkge1xyXG4gICAgICAgICAgICB0aGlzLl9lbG1zLmxhdFtpXS5pbm5lckhUTUwgPSB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxhdC50b0ZpeGVkKDgpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMucG9zaXRpb25zID0gbmV3cG9zaXRpb25zXHJcbiAgICAgICAgdGhpcy5wcmV2aW91cyA9IG51bGxcclxuICAgICAgICB0aGlzLnBvc2l0aW9uRWRpdGluZyA9IGZhbHNlXHJcbiAgICAgIH0pXHJcbiAgICAgIHRoaXMuZXZlbnQubW91c2VfcmlnaHQoKG1vdmVtZW50LCBjYXJ0ZXNpYW4pID0+IHtcclxuICAgICAgICB0aGlzLnBvc2l0aW9uRWRpdGluZyA9IGZhbHNlXHJcbiAgICAgIH0pXHJcblxyXG4gICAgICB0aGlzLmV2ZW50Lmdlc3R1cmVfcGluY2tfc3RhcnQoKG1vdmVtZW50LCBjYXJ0ZXNpYW4pID0+IHtcclxuICAgICAgICBsZXQgc3RhcnRUaW1lID0gbmV3IERhdGUoKVxyXG4gICAgICAgIHRoaXMuZXZlbnQuZ2VzdHVyZV9waW5ja19lbmQoKCkgPT4ge1xyXG4gICAgICAgICAgbGV0IGVuZFRpbWUgPSBuZXcgRGF0ZSgpXHJcbiAgICAgICAgICBpZiAoZW5kVGltZSAtIHN0YXJ0VGltZSA+PSA1MDApIHtcclxuICAgICAgICAgICAgLy8g6ZW/5oyJ5Y+W5raIXHJcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb25FZGl0aW5nID0gZmFsc2VcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmV2ZW50Lm1vdXNlX21vdmUoKCkgPT4geyB9KVxyXG4gICAgICAgICAgICB0aGlzLmV2ZW50Lm1vdXNlX2xlZnQoKCkgPT4geyB9KVxyXG4gICAgICAgICAgICB0aGlzLmV2ZW50Lm1vdXNlX3JpZ2h0KCgpID0+IHsgfSlcclxuICAgICAgICAgICAgdGhpcy5ldmVudC5nZXN0dXJlX3BpbmNrX3N0YXJ0KCgpID0+IHsgfSlcclxuICAgICAgICAgICAgbmV3cG9zaXRpb25zID0gW11cclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkaXNwYXJpdHkubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICBsZXQgcG9zMyA9IHtcclxuICAgICAgICAgICAgICAgIHg6IGNhcnRlc2lhbi54IC0gZGlzcGFyaXR5W2ldLngsXHJcbiAgICAgICAgICAgICAgICB5OiBjYXJ0ZXNpYW4ueSAtIGRpc3Bhcml0eVtpXS55LFxyXG4gICAgICAgICAgICAgICAgejogY2FydGVzaWFuLnogLSBkaXNwYXJpdHlbaV0ueixcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgbmV3cG9zaXRpb25zLnB1c2gocG9zMylcclxuICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldID0gdGhpcy5jYXJ0ZXNpYW4zVG93Z3M4NChwb3MzLCB0aGlzLnNkay52aWV3ZXIpXHJcbiAgICAgICAgICAgICAgaWYgKHRoaXMuX2VsbXMubG5nICYmIHRoaXMuX2VsbXMubG5nW2ldKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9lbG1zLmxuZ1tpXS5pbm5lckhUTUwgPSB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxuZy50b0ZpeGVkKDgpXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGlmICh0aGlzLl9lbG1zLmxhdCAmJiB0aGlzLl9lbG1zLmxhdFtpXSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZWxtcy5sYXRbaV0uaW5uZXJIVE1MID0gdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sYXQudG9GaXhlZCg4KVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9ucyA9IG5ld3Bvc2l0aW9uc1xyXG4gICAgICAgICAgICB0aGlzLnByZXZpb3VzID0ge1xyXG4gICAgICAgICAgICAgIHBvc2l0aW9uczogWy4uLnRoaXMucG9zaXRpb25zXVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb25FZGl0aW5nID0gZmFsc2VcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgICB9KVxyXG5cclxuICAgICAgdGhpcy5lbnRpdHkucG9seWdvbi5oaWVyYXJjaHkgPSBuZXcgQ2VzaXVtLkNhbGxiYWNrUHJvcGVydHkoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGxldCBwb3NpdGlvbjg0ID0gW11cclxuICAgICAgICBpZiAobmV3cG9zaXRpb25zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmV3cG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHBvc2l0aW9uODQucHVzaChfdGhpcy5jYXJ0ZXNpYW4zVG93Z3M4NChuZXdwb3NpdGlvbnNbaV0sIF90aGlzLnNkay52aWV3ZXIpKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHBvc2l0aW9uODQucHVzaChfdGhpcy5jYXJ0ZXNpYW4zVG93Z3M4NChwb3NpdGlvbnNbaV0sIF90aGlzLnNkay52aWV3ZXIpKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBfdGhpcy5yZW5ld1Bvc2l0aW9ucyhwb3NpdGlvbjg0KVxyXG4gICAgICAgIHJldHVybiBuZXcgQ2VzaXVtLlBvbHlnb25IaWVyYXJjaHkoX3RoaXMucG9zaXRpb25zSClcclxuICAgICAgfSwgZmFsc2UpXHJcbiAgICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLnBvc2l0aW9ucyA9IG5ldyBDZXNpdW0uQ2FsbGJhY2tQcm9wZXJ0eShmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgcmV0dXJuIFsuLi5fdGhpcy5wb3NpdGlvbnNILCBfdGhpcy5wb3NpdGlvbnNIWzBdLCBfdGhpcy5wb3NpdGlvbnNIWzFdXVxyXG4gICAgICB9LCBmYWxzZSlcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBpZiAodGhpcy5sYWJlbCAmJiB0aGlzLmxhYmVsLmVudGl0eSAmJiB0aGlzLmxhYmVsLmVudGl0eS5iaWxsYm9hcmQpIHtcclxuICAgICAgICB0aGlzLmxhYmVsLmVudGl0eS5iaWxsYm9hcmQuY29sb3IgPSBDZXNpdW0uQ29sb3IuZnJvbUNzc0NvbG9yU3RyaW5nKGByZ2JhKDI1NSwyNTUsMjU1LDEpYClcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnBpY2tpbmcgPSB0cnVlXHJcbiAgICAgIGlmICh0aGlzLmV2ZW50KSB7XHJcbiAgICAgICAgdGhpcy5ldmVudC5tb3VzZV9tb3ZlKCgpID0+IHsgfSlcclxuICAgICAgICB0aGlzLmV2ZW50Lm1vdXNlX2xlZnQoKCkgPT4geyB9KVxyXG4gICAgICAgIHRoaXMuZXZlbnQubW91c2VfcmlnaHQoKCkgPT4geyB9KVxyXG4gICAgICAgIHRoaXMuZXZlbnQuZ2VzdHVyZV9waW5ja19zdGFydCgoKSA9PiB7IH0pXHJcbiAgICAgICAgdGhpcy5ldmVudC5kZXN0cm95KClcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnRpcCAmJiB0aGlzLnRpcC5kZXN0cm95KClcclxuICAgICAgaWYgKCF0aGlzLnByZXZpb3VzKSB7XHJcbiAgICAgICAgdGhpcy5wcmV2aW91cyA9IHtcclxuICAgICAgICAgIHBvc2l0aW9uczogWy4uLnRoaXMucG9zaXRpb25zXVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICB0aGlzLnBvc2l0aW9ucyA9IFsuLi50aGlzLnByZXZpb3VzLnBvc2l0aW9uc11cclxuICAgICAgfVxyXG4gICAgICBsZXQgcG9zaXRpb244NCA9IFtdXHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5wb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBwb3NpdGlvbjg0LnB1c2goX3RoaXMuY2FydGVzaWFuM1Rvd2dzODQodGhpcy5wb3NpdGlvbnNbaV0sIF90aGlzLnNkay52aWV3ZXIpKVxyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLnJlbmV3UG9zaXRpb25zKHBvc2l0aW9uODQpXHJcbiAgICAgIHRoaXMuZW50aXR5LnBvbHlnb24uaGllcmFyY2h5ID0gbmV3IENlc2l1bS5DYWxsYmFja1Byb3BlcnR5KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICByZXR1cm4gbmV3IENlc2l1bS5Qb2x5Z29uSGllcmFyY2h5KF90aGlzLnBvc2l0aW9uc0gpXHJcbiAgICAgIH0sIHRydWUpXHJcbiAgICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLnBvc2l0aW9ucyA9IG5ldyBDZXNpdW0uQ2FsbGJhY2tQcm9wZXJ0eShmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgcmV0dXJuIFsuLi5fdGhpcy5wb3NpdGlvbnNILCBfdGhpcy5wb3NpdGlvbnNIWzBdLCBfdGhpcy5wb3NpdGlvbnNIWzFdXVxyXG4gICAgICB9LCB0cnVlKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IHBvc2l0aW9uRWRpdGluZygpIHtcclxuICAgIHJldHVybiB0aGlzLm9wZXJhdGUucG9zaXRpb25FZGl0aW5nXHJcbiAgfVxyXG5cclxuICBzdGF0aWMgRXZlbnRCaW5kaW5nKHRoYXQsIGVsZW1lbnRzKSB7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGxldCBFdmVudCA9IFtdXHJcbiAgICAgIGxldCBpc0V2ZW50ID0gZmFsc2VcclxuICAgICAgbGV0IHJlbW92ZU5hbWUgPSBbXVxyXG4gICAgICBpZiAoIWVsZW1lbnRzW2ldIHx8ICFlbGVtZW50c1tpXS5hdHRyaWJ1dGVzKSB7XHJcbiAgICAgICAgY29udGludWU7XHJcbiAgICAgIH1cclxuICAgICAgZm9yIChsZXQgbSBvZiBlbGVtZW50c1tpXS5hdHRyaWJ1dGVzKSB7XHJcbiAgICAgICAgc3dpdGNoIChtLm5hbWUpIHtcclxuICAgICAgICAgIGNhc2UgJ0Btb2RlbCc6IHtcclxuICAgICAgICAgICAgaXNFdmVudCA9IHRydWVcclxuICAgICAgICAgICAgaWYgKGVsZW1lbnRzW2ldLnR5cGUgPT0gJ2NoZWNrYm94Jykge1xyXG4gICAgICAgICAgICAgIEV2ZW50LnB1c2goKGUpID0+IHsgdGhhdFttLnZhbHVlXSA9IGUudGFyZ2V0LmNoZWNrZWQgfSlcclxuICAgICAgICAgICAgICBlbGVtZW50c1tpXS5jaGVja2VkID0gdGhhdFttLnZhbHVlXVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgIEV2ZW50LnB1c2goKGUpID0+IHtcclxuICAgICAgICAgICAgICAgIGxldCB2YWx1ZSA9IGUudGFyZ2V0LnZhbHVlXHJcbiAgICAgICAgICAgICAgICBpZiAoZS50YXJnZXQudHlwZSA9PSAnbnVtYmVyJykge1xyXG4gICAgICAgICAgICAgICAgICBpZiAoZS5kYXRhICE9ICcuJyAmJiAoZS5kYXRhICE9ICctJyB8fCBlLnRhcmdldC52YWx1ZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IE51bWJlcih2YWx1ZSlcclxuICAgICAgICAgICAgICAgICAgICBpZiAoKGUudGFyZ2V0Lm1heCkgJiYgdmFsdWUgPiBOdW1iZXIoZS50YXJnZXQubWF4KSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBOdW1iZXIoZS50YXJnZXQubWF4KVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAoKGUudGFyZ2V0Lm1pbikgJiYgdmFsdWUgPCBOdW1iZXIoZS50YXJnZXQubWluKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBOdW1iZXIoZS50YXJnZXQubWluKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGF0W20udmFsdWVdID0gdmFsdWVcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIHRoYXRbbS52YWx1ZV0gPSB2YWx1ZVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgaWYgKGVsZW1lbnRzW2ldLm5vZGVOYW1lID09ICdJTUcnKSB7XHJcbiAgICAgICAgICAgICAgICBlbGVtZW50c1tpXS5zcmMgPSB0aGF0W20udmFsdWVdXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZWxlbWVudHNbaV0udmFsdWUgPSB0aGF0W20udmFsdWVdXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh0aGF0Ll9lbG1zW20udmFsdWVdKSB7XHJcbiAgICAgICAgICAgICAgdGhhdC5fZWxtc1ttLnZhbHVlXS5wdXNoKGVsZW1lbnRzW2ldKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgIHRoYXQuX2VsbXNbbS52YWx1ZV0gPSBbZWxlbWVudHNbaV1dXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmVtb3ZlTmFtZS5wdXNoKG0ubmFtZSlcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBjYXNlICdAY2xpY2snOiB7XHJcbiAgICAgICAgICAgIGVsZW1lbnRzW2ldLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcclxuICAgICAgICAgICAgICBpZiAodHlwZW9mICh0aGF0W20udmFsdWVdKSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgdGhhdFttLnZhbHVlXShlKVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHJlbW92ZU5hbWUucHVzaChtLm5hbWUpXHJcbiAgICAgICAgICAgIC8vIGVsZW1lbnRzW2ldLmF0dHJpYnV0ZXMucmVtb3ZlTmFtZWRJdGVtKG0ubmFtZSlcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBjYXNlICdAY2hhbmdlJzoge1xyXG4gICAgICAgICAgICBpc0V2ZW50ID0gdHJ1ZVxyXG4gICAgICAgICAgICBFdmVudC5wdXNoKChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgbGV0IHZhbHVlID0gZS50YXJnZXQudmFsdWVcclxuICAgICAgICAgICAgICBpZiAoZS50YXJnZXQudHlwZSA9PSAnbnVtYmVyJyAmJiB2YWx1ZSAhPSAnJykge1xyXG4gICAgICAgICAgICAgICAgdmFsdWUgPSBOdW1iZXIodmFsdWUpXHJcbiAgICAgICAgICAgICAgICBlLnRhcmdldC52YWx1ZSA9IHZhbHVlXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgKHRoYXRbbS52YWx1ZV0pID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgICAgICB0aGF0W20udmFsdWVdKGUsIHZhbHVlKVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGVsZW1lbnRzW2ldLmF0dHJpYnV0ZXNbbV0gPSB1bmRlZmluZWRcclxuICAgICAgfVxyXG4gICAgICBmb3IgKGxldCBuID0gMDsgbiA8IHJlbW92ZU5hbWUubGVuZ3RoOyBuKyspIHtcclxuICAgICAgICBlbGVtZW50c1tpXS5hdHRyaWJ1dGVzLnJlbW92ZU5hbWVkSXRlbShyZW1vdmVOYW1lW25dKVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoaXNFdmVudCkge1xyXG4gICAgICAgIGxldCB2ZW50VHlwZSA9ICdpbnB1dCdcclxuICAgICAgICBpZiAoZWxlbWVudHNbaV0udGFnTmFtZSAhPSAnSU5QVVQnIHx8IGVsZW1lbnRzW2ldLnR5cGUgPT0gJ2NoZWNrYm94Jykge1xyXG4gICAgICAgICAgdmVudFR5cGUgPSAnY2hhbmdlJ1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbGVtZW50c1tpXS5hZGRFdmVudExpc3RlbmVyKHZlbnRUeXBlLCAoZSkgPT4ge1xyXG4gICAgICAgICAgZm9yIChsZXQgdCA9IDA7IHQgPCBFdmVudC5sZW5ndGg7IHQrKykge1xyXG4gICAgICAgICAgICBFdmVudFt0XShlKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgbm9kZUVkaXQodGhhdCwgY2IgPSAoKSA9PiB7IH0pIHtcclxuICAgIHRoYXQucG9zaXRpb25FZGl0aW5nID0gZmFsc2VcclxuICAgIGlmIChZSi5NZWFzdXJlLkdldE1lYXN1cmVTdGF0dXMoKSkge1xyXG4gICAgICBjYign5LiK5LiA5qyh5rWL6YeP5pyq57uT5p2fJylcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIFlKLk1lYXN1cmUuU2V0TWVhc3VyZVN0YXR1cyh0cnVlKVxyXG4gICAgICB0aGF0LnRpcCA9IG5ldyBNb3VzZVRpcCgn6K+36YCJ5oup5LiA5Liq6aG254K577yM5Y+z6ZSu5Y+W5raIJywgdGhhdC5zZGspXHJcbiAgICAgIHRoYXQuZXZlbnQgPSBuZXcgTW91c2VFdmVudCh0aGF0LnNkaylcclxuICAgICAgdGhhdC5ub2RlUG9pbnRzID0gW11cclxuICAgICAgbGV0IHNlbGVjdFBvaW50XHJcbiAgICAgIGxldCBvcmlnaW5hbFBvc2l0aW9uXHJcbiAgICAgIGxldCBmcm9tRGVncmVlc0FycmF5ID0gW11cclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGF0Lm9wdGlvbnMucG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgZnJvbURlZ3JlZXNBcnJheS5wdXNoKHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbaV0ubG5nLCB0aGF0Lm9wdGlvbnMucG9zaXRpb25zW2ldLmxhdClcclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IG1vdmVFdmVudCA9IChtb3ZlbWVudCwgY2FydGVzaWFuKSA9PiB7XHJcbiAgICAgICAgaWYgKHNlbGVjdFBvaW50KSB7XHJcbiAgICAgICAgICB0aGF0Lm9wdGlvbnMucG9zaXRpb25zW3NlbGVjdFBvaW50LmluZGV4XSA9IHRoYXQuY2FydGVzaWFuM1Rvd2dzODQoY2FydGVzaWFuLCB0aGF0LnNkay52aWV3ZXIpXHJcbiAgICAgICAgICBpZiAodGhhdC5fZWxtcy5sbmcgJiYgdGhhdC5fZWxtcy5sbmdbc2VsZWN0UG9pbnQuaW5kZXhdKSB7XHJcbiAgICAgICAgICAgIHRoYXQuX2VsbXMubG5nW3NlbGVjdFBvaW50LmluZGV4XS5pbm5lckhUTUwgPSB0aGF0Lm9wdGlvbnMucG9zaXRpb25zW3NlbGVjdFBvaW50LmluZGV4XS5sbmcudG9GaXhlZCg4KVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKHRoYXQuX2VsbXMubGF0ICYmIHRoYXQuX2VsbXMubGF0W3NlbGVjdFBvaW50LmluZGV4XSkge1xyXG4gICAgICAgICAgICB0aGF0Ll9lbG1zLmxhdFtzZWxlY3RQb2ludC5pbmRleF0uaW5uZXJIVE1MID0gdGhhdC5vcHRpb25zLnBvc2l0aW9uc1tzZWxlY3RQb2ludC5pbmRleF0ubGF0LnRvRml4ZWQoOClcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoYXQucmVuZXdQb3NpdGlvbnMoKVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGF0LnRpcC5zZXRQb3NpdGlvbihcclxuICAgICAgICAgIGNhcnRlc2lhbixcclxuICAgICAgICAgIG1vdmVtZW50LnBvc2l0aW9uID8gbW92ZW1lbnQucG9zaXRpb24ueCA6IG1vdmVtZW50LmVuZFBvc2l0aW9uLngsXHJcbiAgICAgICAgICBtb3ZlbWVudC5wb3NpdGlvbiA/IG1vdmVtZW50LnBvc2l0aW9uLnkgOiBtb3ZlbWVudC5lbmRQb3NpdGlvbi55XHJcbiAgICAgICAgKVxyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgbGVmdEV2ZW50ID0gKG1vdmVtZW50LCBjYXJ0ZXNpYW4pID0+IHtcclxuICAgICAgICBtb3ZlRXZlbnQobW92ZW1lbnQsIGNhcnRlc2lhbilcclxuICAgICAgICBsZXQgcG9zaXRpb244NCA9IHRoYXQuY2FydGVzaWFuM1Rvd2dzODQoY2FydGVzaWFuLCB0aGF0LnNkay52aWV3ZXIpXHJcbiAgICAgICAgaWYgKHNlbGVjdFBvaW50KSB7XHJcbiAgICAgICAgICBsZXQgaW5kZXggPSBzZWxlY3RQb2ludC5pbmRleFxyXG4gICAgICAgICAgbGV0IGVudGl0eSA9IHRoYXQuc2RrLnZpZXdlci5lbnRpdGllcy5hZGQoe1xyXG4gICAgICAgICAgICBuYW1lOiAnbm9kZS1zZWNvbmRhcnktZWRpdC1wb2ludCcsXHJcbiAgICAgICAgICAgIGluZGV4OiBpbmRleCxcclxuICAgICAgICAgICAgcG9zaXRpb246IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzKHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbc2VsZWN0UG9pbnQuaW5kZXhdLmxuZywgdGhhdC5vcHRpb25zLnBvc2l0aW9uc1tzZWxlY3RQb2ludC5pbmRleF0ubGF0LCBwb3NpdGlvbjg0LmFsdCksXHJcbiAgICAgICAgICAgIGJpbGxib2FyZDoge1xyXG4gICAgICAgICAgICAgIGltYWdlOiB0aGF0LmdldFNvdXJjZVJvb3RQYXRoKCkgKyAnL2ltZy9wb2ludC5wbmcnLFxyXG4gICAgICAgICAgICAgIHdpZHRoOiAxNSxcclxuICAgICAgICAgICAgICBoZWlnaHQ6IDE1LFxyXG4gICAgICAgICAgICAgIGRpc2FibGVEZXB0aFRlc3REaXN0YW5jZTogTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLFxyXG4gICAgICAgICAgICAgIGNvbG9yOiBDZXNpdW0uQ29sb3IuV0hJVEUud2l0aEFscGhhKDAuOTkpXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgdGhhdC5ub2RlUG9pbnRzLnNwbGljZShzZWxlY3RQb2ludC5pbmRleCwgMCwgZW50aXR5KVxyXG4gICAgICAgICAgc2VsZWN0UG9pbnQgPSBudWxsXHJcblxyXG4gICAgICAgICAgdGhhdC50aXAuc2V0X3RleHQoJ+ivt+mAieaLqeS4gOS4qumhtueCue+8jOWPs+mUruWPlua2iCcpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgbGV0IHBvc2l0aW9uID0gbW92ZW1lbnQucG9zaXRpb25cclxuICAgICAgICAgIGlmICghcG9zaXRpb24pIHtcclxuICAgICAgICAgICAgcG9zaXRpb24gPSB7XHJcbiAgICAgICAgICAgICAgeDogKG1vdmVtZW50LnBvc2l0aW9uMS54ICsgbW92ZW1lbnQucG9zaXRpb24yLngpIC8gMixcclxuICAgICAgICAgICAgICB5OiAobW92ZW1lbnQucG9zaXRpb24xLnkgKyBtb3ZlbWVudC5wb3NpdGlvbjIueSkgLyAyXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHZhciBwaWNrID0gdGhhdC5zZGsudmlld2VyLnNjZW5lLnBpY2socG9zaXRpb24pO1xyXG4gICAgICAgICAgaWYgKHBpY2sgJiYgcGljay5pZCAmJiBwaWNrLmlkLm5hbWUgJiYgcGljay5pZC5uYW1lID09PSAnbm9kZS1zZWNvbmRhcnktZWRpdC1wb2ludCcpIHtcclxuICAgICAgICAgICAgc2VsZWN0UG9pbnQgPSBwaWNrLmlkXHJcbiAgICAgICAgICAgIG9yaWdpbmFsUG9zaXRpb24gPSB0aGF0LmNhcnRlc2lhbjNUb3dnczg0KHBpY2suaWQucG9zaXRpb24uZ2V0VmFsdWUoKSwgdGhhdC5zZGsudmlld2VyKVxyXG4gICAgICAgICAgICB0aGF0Lm5vZGVQb2ludHMuc3BsaWNlKHBpY2suaWQuaW5kZXgsIDEpXHJcbiAgICAgICAgICAgIHRoYXQuc2RrLnZpZXdlci5lbnRpdGllcy5yZW1vdmUocGljay5pZClcclxuICAgICAgICAgICAgdGhhdC50aXAuc2V0X3RleHQoJ+W3pumUruehruiupO+8jOWPs+mUruWPlua2iCcpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoYXQucmVuZXdQb3NpdGlvbnMoKVxyXG4gICAgICB9XHJcbiAgICAgIGxldCByaWdodEV2ZW50ID0gKCkgPT4ge1xyXG4gICAgICAgIHRoYXQuZXZlbnQubW91c2VfbW92ZSgoKSA9PiB7IH0pXHJcbiAgICAgICAgdGhhdC5ldmVudC5tb3VzZV9sZWZ0KCgpID0+IHsgfSlcclxuICAgICAgICB0aGF0LmV2ZW50Lm1vdXNlX3JpZ2h0KCgpID0+IHsgfSlcclxuICAgICAgICB0aGF0LmV2ZW50Lmdlc3R1cmVfcGluY2tfc3RhcnQoKCkgPT4geyB9KVxyXG4gICAgICAgIGlmIChzZWxlY3RQb2ludCkge1xyXG4gICAgICAgICAgaWYgKCFvcmlnaW5hbFBvc2l0aW9uKSB7XHJcbiAgICAgICAgICAgIHRoYXQub3B0aW9ucy5wb3NpdGlvbnMucG9wKClcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGF0Lm9wdGlvbnMucG9zaXRpb25zW3NlbGVjdFBvaW50LmluZGV4XSA9IG9yaWdpbmFsUG9zaXRpb25cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmICh0aGF0Ll9lbG1zLmxuZyAmJiB0aGF0Ll9lbG1zLmxuZ1tzZWxlY3RQb2ludC5pbmRleF0pIHtcclxuICAgICAgICAgICAgdGhhdC5fZWxtcy5sbmdbc2VsZWN0UG9pbnQuaW5kZXhdLmlubmVySFRNTCA9IHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbc2VsZWN0UG9pbnQuaW5kZXhdLmxuZy50b0ZpeGVkKDgpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAodGhhdC5fZWxtcy5sYXQgJiYgdGhhdC5fZWxtcy5sYXRbc2VsZWN0UG9pbnQuaW5kZXhdKSB7XHJcbiAgICAgICAgICAgIHRoYXQuX2VsbXMubGF0W3NlbGVjdFBvaW50LmluZGV4XS5pbm5lckhUTUwgPSB0aGF0Lm9wdGlvbnMucG9zaXRpb25zW3NlbGVjdFBvaW50LmluZGV4XS5sYXQudG9GaXhlZCg4KVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGF0LmhlaWdodE1vZGUgPSB0aGF0LmhlaWdodE1vZGVcclxuICAgICAgICB0aGF0LnByZXZpb3VzID0gbnVsbFxyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGF0LmVudGl0eS5wb2x5bGluZS5jbGFtcFRvR3JvdW5kID0gdHJ1ZVxyXG4gICAgICB0aGF0LmVudGl0eS5wb2x5bGluZS5hcmNUeXBlID0gQ2VzaXVtLkFyY1R5cGUuR0VPREVTSUNcclxuICAgICAgdGhhdC5lbnRpdHkucG9seWdvbi5wZXJQb3NpdGlvbkhlaWdodCA9IGZhbHNlXHJcbiAgICAgIHRoYXQuZW50aXR5LnBvbHlnb24uaGllcmFyY2h5ID0gbmV3IENlc2l1bS5DYWxsYmFja1Byb3BlcnR5KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBsZXQgYXJyID0gdGhhdC5jb21wdXRlQXNzZW1ibGUodGhhdC5vcHRpb25zLnBvc2l0aW9ucylcclxuICAgICAgICByZXR1cm4gbmV3IENlc2l1bS5Qb2x5Z29uSGllcmFyY2h5KGFycilcclxuICAgICAgfSwgZmFsc2UpXHJcbiAgICAgIHRoYXQuZW50aXR5LnBvbHlsaW5lLnBvc2l0aW9ucyA9IG5ldyBDZXNpdW0uQ2FsbGJhY2tQcm9wZXJ0eShmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgbGV0IGFyciA9IHRoYXQuY29tcHV0ZUFzc2VtYmxlKHRoYXQub3B0aW9ucy5wb3NpdGlvbnMpXHJcbiAgICAgICAgaWYgKGFyci5sZW5ndGggPj0gMykge1xyXG4gICAgICAgICAgcmV0dXJuIFsuLi5hcnIsIGFyclswXSwgYXJyWzFdXVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIHJldHVybiBbLi4uYXJyXVxyXG4gICAgICAgIH1cclxuICAgICAgfSwgZmFsc2UpXHJcblxyXG5cclxuICAgICAgbGV0IHBvaW50cyA9IFtbXV1cclxuICAgICAgbGV0IHBvczg0ID0gW11cclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGF0LnBvc2l0aW9uc0gubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBsZXQgcG9zaXRpb24gPSB0aGF0LmNhcnRlc2lhbjNUb3dnczg0KHRoYXQucG9zaXRpb25zSFtpXSwgdGhhdC5zZGsudmlld2VyKVxyXG4gICAgICAgIHBvczg0LnB1c2gocG9zaXRpb24pXHJcbiAgICAgICAgcG9pbnRzWzBdLnB1c2goW3Bvc2l0aW9uLmxuZywgcG9zaXRpb24ubGF0XSlcclxuICAgICAgfVxyXG4gICAgICBsZXQgcG9zaXRpb24gPSB0aGF0LmNhcnRlc2lhbjNUb3dnczg0KHRoYXQucG9zaXRpb25zSFswXSwgdGhhdC5zZGsudmlld2VyKVxyXG4gICAgICBwb2ludHNbMF0ucHVzaChbcG9zaXRpb24ubG5nLCBwb3NpdGlvbi5sYXRdKVxyXG4gICAgICBsZXQgcG9seWdvbiA9IHR1cmYucG9seWdvbihwb2ludHMpXHJcbiAgICAgIGxldCBjZW50cm9pZCA9IHR1cmYucG9pbnRPbkZlYXR1cmUocG9seWdvbilcclxuICAgICAgbGV0IG9iamVjdHNUb0V4Y2x1ZGUgPSBbLi4udGhhdC5zZGsudmlld2VyLmVudGl0aWVzLnZhbHVlc11cclxuICAgICAgdGhhdFxyXG4gICAgICAgIC5nZXRDbGFtcFRvSGVpZ2h0KHtcclxuICAgICAgICAgIGxuZzogY2VudHJvaWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMF0sXHJcbiAgICAgICAgICBsYXQ6IGNlbnRyb2lkLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzFdXHJcbiAgICAgICAgfSwgb2JqZWN0c1RvRXhjbHVkZSlcclxuICAgICAgICAudGhlbihoZWlnaHQgPT4ge1xyXG4gICAgICAgICAgdGhhdC5sYWJlbC5wb3NpdGlvbiA9IFtcclxuICAgICAgICAgICAgY2VudHJvaWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMF0sXHJcbiAgICAgICAgICAgIGNlbnRyb2lkLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzFdLFxyXG4gICAgICAgICAgICBoZWlnaHRcclxuICAgICAgICAgIF1cclxuICAgICAgICB9KVxyXG5cclxuXHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIHRoYXQuZXZlbnQubW91c2VfbGVmdChsZWZ0RXZlbnQpXHJcblxyXG4gICAgICAgIHRoYXQuZXZlbnQubW91c2VfcmlnaHQocmlnaHRFdmVudClcclxuXHJcbiAgICAgICAgdGhhdC5ldmVudC5tb3VzZV9tb3ZlKG1vdmVFdmVudClcclxuXHJcbiAgICAgICAgdGhhdC5ldmVudC5nZXN0dXJlX3BpbmNrX3N0YXJ0KChtb3ZlbWVudCwgY2FydGVzaWFuKSA9PiB7XHJcbiAgICAgICAgICBsZXQgc3RhcnRUaW1lID0gbmV3IERhdGUoKVxyXG4gICAgICAgICAgdGhhdC5ldmVudC5nZXN0dXJlX3BpbmNrX2VuZCgoKSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBlbmRUaW1lID0gbmV3IERhdGUoKVxyXG4gICAgICAgICAgICBsZXQgcG9zID0ge1xyXG4gICAgICAgICAgICAgIHBvc2l0aW9uOiB7XHJcbiAgICAgICAgICAgICAgICB4OiAobW92ZW1lbnQucG9zaXRpb24xLnggKyBtb3ZlbWVudC5wb3NpdGlvbjIueCkgLyAyLFxyXG4gICAgICAgICAgICAgICAgeTogKG1vdmVtZW50LnBvc2l0aW9uMS55ICsgbW92ZW1lbnQucG9zaXRpb24yLnkpIC8gMlxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoZW5kVGltZSAtIHN0YXJ0VGltZSA+PSA1MDApIHtcclxuICAgICAgICAgICAgICByaWdodEV2ZW50KClcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICBsZWZ0RXZlbnQocG9zLCBjYXJ0ZXNpYW4pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgfSlcclxuXHJcbiAgICAgICAgY3JlYXRlTm9kZVBvaW50cygpXHJcbiAgICAgIH0sIDIwMCk7XHJcbiAgICAgIGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZU5vZGVQb2ludHMoKSB7XHJcbiAgICAgICAgbGV0IG9iamVjdHNUb0V4Y2x1ZGUgPSBbLi4udGhhdC5zZGsudmlld2VyLmVudGl0aWVzLnZhbHVlc11cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoYXQub3B0aW9ucy5wb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGxldCBoZWlnaHQgPSBhd2FpdCB0aGF0LmdldENsYW1wVG9IZWlnaHQodGhhdC5vcHRpb25zLnBvc2l0aW9uc1tpXSwgb2JqZWN0c1RvRXhjbHVkZSlcclxuICAgICAgICAgIGxldCBlbnRpdHkgPSB0aGF0LnNkay52aWV3ZXIuZW50aXRpZXMuYWRkKHtcclxuICAgICAgICAgICAgbmFtZTogJ25vZGUtc2Vjb25kYXJ5LWVkaXQtcG9pbnQnLFxyXG4gICAgICAgICAgICBpbmRleDogaSxcclxuICAgICAgICAgICAgcG9zaXRpb246IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzKHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbaV0ubG5nLCB0aGF0Lm9wdGlvbnMucG9zaXRpb25zW2ldLmxhdCwgaGVpZ2h0KSxcclxuICAgICAgICAgICAgYmlsbGJvYXJkOiB7XHJcbiAgICAgICAgICAgICAgaW1hZ2U6IHRoYXQuZ2V0U291cmNlUm9vdFBhdGgoKSArICcvaW1nL3BvaW50LnBuZycsXHJcbiAgICAgICAgICAgICAgd2lkdGg6IDE1LFxyXG4gICAgICAgICAgICAgIGhlaWdodDogMTUsXHJcbiAgICAgICAgICAgICAgZGlzYWJsZURlcHRoVGVzdERpc3RhbmNlOiBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksXHJcbiAgICAgICAgICAgICAgY29sb3I6IENlc2l1bS5Db2xvci5XSElURS53aXRoQWxwaGEoMC45OSlcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICB0aGF0Lm5vZGVQb2ludHMucHVzaChlbnRpdHkpXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIC8vIGZvciAobGV0IGkgPSAwOyBpIDwgdGhhdC5vcHRpb25zLnBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAvLyAgIGxldCBlbnRpdHkgPSB0aGF0LnNkay52aWV3ZXIuZW50aXRpZXMuYWRkKHtcclxuICAgICAgLy8gICAgIG5hbWU6ICdub2RlLXNlY29uZGFyeS1lZGl0LXBvaW50JyxcclxuICAgICAgLy8gICAgIGluZGV4OiBpLFxyXG4gICAgICAvLyAgICAgcG9zaXRpb246IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzKHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbaV0ubG5nLCB0aGF0Lm9wdGlvbnMucG9zaXRpb25zW2ldLmxhdCksXHJcbiAgICAgIC8vICAgICBiaWxsYm9hcmQ6IHtcclxuICAgICAgLy8gICAgICAgaW1hZ2U6IHRoYXQuZ2V0U291cmNlUm9vdFBhdGgoKSArICcvaW1nL3BvaW50LnBuZycsXHJcbiAgICAgIC8vICAgICAgIHdpZHRoOiAxNSxcclxuICAgICAgLy8gICAgICAgaGVpZ2h0OiAxNSxcclxuICAgICAgLy8gICAgICAgZGlzYWJsZURlcHRoVGVzdERpc3RhbmNlOiBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksXHJcbiAgICAgIC8vICAgICB9LFxyXG4gICAgICAvLyAgIH0pXHJcbiAgICAgIC8vICAgbm9kZVBvaW50cy5wdXNoKGVudGl0eSlcclxuICAgICAgLy8gfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc3RhdGljIGNsb3NlTm9kZUVkaXQodGhhdCkge1xyXG4gICAgWUouTWVhc3VyZS5TZXRNZWFzdXJlU3RhdHVzKGZhbHNlKVxyXG4gICAgdGhhdC5ldmVudCAmJiB0aGF0LmV2ZW50LmRlc3Ryb3koKVxyXG4gICAgdGhhdC50aXAgJiYgdGhhdC50aXAuZGVzdHJveSgpXHJcbiAgICB0aGF0LnRpcCA9IG51bGxcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoYXQubm9kZVBvaW50cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICB0aGF0LnNkay52aWV3ZXIuZW50aXRpZXMucmVtb3ZlKHRoYXQubm9kZVBvaW50c1tpXSlcclxuICAgIH1cclxuICAgIHRoYXQubm9kZVBvaW50cyA9IFtdXHJcbiAgICB0aGF0LnBpY2tpbmcgPSB0cnVlXHJcbiAgfVxyXG5cclxuICBzZXRQb3NpdGlvbih2KSB7XHJcbiAgICBsZXQgY2FydGVzaWFuID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXModi5wb3NpdGlvbi5sbmcsIHYucG9zaXRpb24ubGF0LCB2LnBvc2l0aW9uLmFsdClcclxuICAgIGxldCBwb3NpdGlvbnMgPSBbLi4udGhpcy5wb3NpdGlvbnNdXHJcbiAgICBsZXQgYXJyYXkgPSBbXVxyXG4gICAgbGV0IGRpc3Bhcml0eSA9IFtdXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBsZXQgcG9zaXRpb24gPSB0aGlzLmNhcnRlc2lhbjNUb3dnczg0KHBvc2l0aW9uc1tpXSwgdGhpcy5zZGsudmlld2VyKVxyXG4gICAgICBhcnJheS5wdXNoKFtwb3NpdGlvbi5sbmcsIHBvc2l0aW9uLmxhdF0pXHJcbiAgICB9XHJcbiAgICBsZXQgZmlyc3Rwb3NpdGlvbiA9IHRoaXMuY2FydGVzaWFuM1Rvd2dzODQocG9zaXRpb25zWzBdLCB0aGlzLnNkay52aWV3ZXIpXHJcbiAgICBhcnJheS5wdXNoKFtmaXJzdHBvc2l0aW9uLmxuZywgZmlyc3Rwb3NpdGlvbi5sYXRdKVxyXG4gICAgdmFyIHBvbHlnb24gPSB0dXJmLnBvbHlnb24oW2FycmF5XSk7XHJcbiAgICB2YXIgY2VudHJvaWQgPSB0dXJmLmNlbnRyb2lkKHBvbHlnb24pO1xyXG4gICAgbGV0IGNlbnRlciA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzKC4uLmNlbnRyb2lkLmdlb21ldHJ5LmNvb3JkaW5hdGVzKVxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgZGlzcGFyaXR5LnB1c2goe1xyXG4gICAgICAgIHg6IGNlbnRlci54IC0gcG9zaXRpb25zW2ldLngsXHJcbiAgICAgICAgeTogY2VudGVyLnkgLSBwb3NpdGlvbnNbaV0ueSxcclxuICAgICAgICB6OiBjZW50ZXIueiAtIHBvc2l0aW9uc1tpXS56LFxyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gICAgbGV0IG5ld3Bvc2l0aW9ucyA9IFtdXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRpc3Bhcml0eS5sZW5ndGg7IGkrKykge1xyXG4gICAgICBuZXdwb3NpdGlvbnMucHVzaCh7XHJcbiAgICAgICAgeDogY2FydGVzaWFuLnggLSBkaXNwYXJpdHlbaV0ueCxcclxuICAgICAgICB5OiBjYXJ0ZXNpYW4ueSAtIGRpc3Bhcml0eVtpXS55LFxyXG4gICAgICAgIHo6IGNhcnRlc2lhbi56IC0gZGlzcGFyaXR5W2ldLnosXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgICB0aGlzLmxhYmVsLnBvc2l0aW9uID0gW3YucG9zaXRpb24ubG5nLCB2LnBvc2l0aW9uLmxhdCwgdi5wb3NpdGlvbi5hbHRdXHJcblxyXG4gICAgbGV0IHBvc2l0aW9uczg0ID0gW11cclxuICAgIGlmIChuZXdwb3NpdGlvbnMubGVuZ3RoID4gMCkge1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5ld3Bvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIHBvc2l0aW9uczg0LnB1c2godGhpcy5jYXJ0ZXNpYW4zVG93Z3M4NChuZXdwb3NpdGlvbnNbaV0sIHRoaXMuc2RrLnZpZXdlcikpXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGxldCBhcnIgPSB0aGlzLmNvbXB1dGVBc3NlbWJsZShwb3NpdGlvbnM4NClcclxuICAgIGlmIChhcnIubGVuZ3RoID09IDApIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcbiAgICB0aGlzLmVudGl0eS5wb2x5Z29uLmhpZXJhcmNoeSA9IG5ldyBDZXNpdW0uQ2FsbGJhY2tQcm9wZXJ0eShmdW5jdGlvbiAoKSB7XHJcbiAgICAgIHJldHVybiBuZXcgQ2VzaXVtLlBvbHlnb25IaWVyYXJjaHkoYXJyKVxyXG4gICAgfSwgZmFsc2UpXHJcbiAgICB0aGlzLmVudGl0eS5wb2x5bGluZS5wb3NpdGlvbnMgPSBuZXcgQ2VzaXVtLkNhbGxiYWNrUHJvcGVydHkoZnVuY3Rpb24gKCkge1xyXG4gICAgICBpZiAoYXJyLmxlbmd0aCA+PSAzKSB7XHJcbiAgICAgICAgcmV0dXJuIFsuLi5hcnIsIGFyclswXSwgYXJyWzFdXVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHJldHVybiBbLi4uYXJyXVxyXG4gICAgICB9XHJcbiAgICB9LCBmYWxzZSlcclxuICB9XHJcblxyXG4gIHNldERJVihvcHRpb25zID0geyBkb21pZDogXCJcIiwgeDogMTAsIHk6IDEwIH0pIHtcclxuICAgIG9wdGlvbnMueCA9IChvcHRpb25zLnggfHwgb3B0aW9ucy54ID09PSAwKSA/IG9wdGlvbnMueCA6IDEwXHJcbiAgICBvcHRpb25zLnkgPSAob3B0aW9ucy55IHx8IG9wdGlvbnMueSA9PT0gMCkgPyBvcHRpb25zLnkgOiAxMFxyXG5cclxuICAgIGxldCBwb3NpdGlvbnMgPSB0aGlzLmNvbXB1dGVBc3NlbWJsZSh0aGlzLm9wdGlvbnMucG9zaXRpb25zKVxyXG4gICAgaWYgKHBvc2l0aW9ucy5sZW5ndGggPT0gMCkge1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuICAgIGxldCBwb2ludHMgPSBbW11dXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBsZXQgcG9zaXRpb24gPSB0aGlzLmNhcnRlc2lhbjNUb3dnczg0KHBvc2l0aW9uc1tpXSwgdGhpcy5zZGsudmlld2VyKVxyXG4gICAgICBwb2ludHNbMF0ucHVzaChbcG9zaXRpb24ubG5nLCBwb3NpdGlvbi5sYXRdKVxyXG4gICAgfVxyXG4gICAgbGV0IHBvc2l0aW9uID0gdGhpcy5jYXJ0ZXNpYW4zVG93Z3M4NChwb3NpdGlvbnNbMF0sIHRoaXMuc2RrLnZpZXdlcilcclxuICAgIHBvaW50c1swXS5wdXNoKFtwb3NpdGlvbi5sbmcsIHBvc2l0aW9uLmxhdF0pXHJcbiAgICBsZXQgcG9seWdvbiA9IHR1cmYucG9seWdvbihwb2ludHMpO1xyXG4gICAgLy8gbGV0IGNlbnRyb2lkID0gdHVyZi5jZW50cm9pZChwb2x5Z29uKTtcclxuICAgIGxldCBjZW50cm9pZCA9IHR1cmYucG9pbnRPbkZlYXR1cmUocG9seWdvbik7XHJcbiAgICBsZXQgc2l0ZUluZm9Eb20gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChvcHRpb25zLmRvbWlkKVxyXG4gICAgbGV0IHNpdGVJbmZvUG9zaXRpb24gPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlcyhjZW50cm9pZC5nZW9tZXRyeS5jb29yZGluYXRlc1swXSwgY2VudHJvaWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMV0pXHJcblxyXG4gICAgdGhpcy5zZGsudmlld2VyLnNjZW5lLnBvc3RSZW5kZXIuYWRkRXZlbnRMaXN0ZW5lcigocGVyY2VudGFnZSkgPT4ge1xyXG4gICAgICAvL+i9rOaNouWIsOWxj+W5leWdkOagh1xyXG4gICAgICBpZiAoc2l0ZUluZm9Eb20uc3R5bGUuZGlzcGxheSA9PT0gJ2Jsb2NrJyB8fCBzaXRlSW5mb0RvbS5zdHlsZS5kaXNwbGF5ID09PSAnJykge1xyXG4gICAgICAgIGxldCB3aW5wb3MgPSB0aGlzLnNkay52aWV3ZXIuc2NlbmUuY2FydGVzaWFuVG9DYW52YXNDb29yZGluYXRlcyhzaXRlSW5mb1Bvc2l0aW9uKTtcclxuICAgICAgICBpZiAod2lucG9zKSB7XHJcbiAgICAgICAgICBzaXRlSW5mb0RvbS5zdHlsZS5sZWZ0ID0gKHdpbnBvcy54ICsgb3B0aW9ucy54KS50b0ZpeGVkKDApICsgJ3B4JztcclxuICAgICAgICAgIHNpdGVJbmZvRG9tLnN0eWxlLnRvcCA9ICh3aW5wb3MueSArIG9wdGlvbnMueSkudG9GaXhlZCgwKSArICdweCc7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8vIOabtOaWsOWdkOagh1xyXG4gIHJlbmV3UG9zaXRpb25zKHBvc2l0aW9uODQpIHtcclxuICAgIGlmICh0aGlzLl9lcnJvciB8fCAhdGhpcy5zZGsudmlld2VyKSB7XHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG4gICAgbGV0IGdyb3VuZCA9IGZhbHNlXHJcblxyXG4gICAgbGV0IGFycmF5ID0gW11cclxuICAgIGxldCBwb3NpdGlvbnMgPSB0aGlzLm9wdGlvbnMucG9zaXRpb25zXHJcbiAgICBpZiAocG9zaXRpb244NCkge1xyXG4gICAgICBwb3NpdGlvbnMgPSBwb3NpdGlvbjg0XHJcbiAgICB9XHJcbiAgICBsZXQgZnJvbURlZ3JlZXNBcnJheSA9IFtdXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBmcm9tRGVncmVlc0FycmF5LnB1c2gocG9zaXRpb25zW2ldLmxuZywgcG9zaXRpb25zW2ldLmxhdClcclxuICAgIH1cclxuICAgIHRoaXMucG9zaXRpb25zID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXNBcnJheShmcm9tRGVncmVlc0FycmF5KVxyXG5cclxuICAgIGxldCBwb3NpdGlvbnNBID0gdGhpcy5jb21wdXRlQXNzZW1ibGUocG9zaXRpb25zKVxyXG4gICAgaWYgKHBvc2l0aW9uc0EubGVuZ3RoID09IDApIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcbiAgICBsZXQgcG9pbnRzID0gW1tdXVxyXG4gICAgbGV0IHBvczg0ID0gW11cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9zaXRpb25zQS5sZW5ndGg7IGkrKykge1xyXG4gICAgICBsZXQgcG9zaXRpb24gPSB0aGlzLmNhcnRlc2lhbjNUb3dnczg0KHBvc2l0aW9uc0FbaV0sIHRoaXMuc2RrLnZpZXdlcilcclxuICAgICAgcG9zODQucHVzaChwb3NpdGlvbilcclxuICAgICAgcG9pbnRzWzBdLnB1c2goW3Bvc2l0aW9uLmxuZywgcG9zaXRpb24ubGF0XSlcclxuICAgIH1cclxuICAgIGxldCBwb3NpdGlvbiA9IHRoaXMuY2FydGVzaWFuM1Rvd2dzODQocG9zaXRpb25zQVswXSwgdGhpcy5zZGsudmlld2VyKVxyXG4gICAgcG9pbnRzWzBdLnB1c2goW3Bvc2l0aW9uLmxuZywgcG9zaXRpb24ubGF0XSlcclxuICAgIGxldCBoZWlnaHQgPSAwXHJcbiAgICBsZXQgcG9seWdvbiA9IHR1cmYucG9seWdvbihwb2ludHMpXHJcbiAgICBsZXQgY2VudHJvaWQgPSB0dXJmLnBvaW50T25GZWF0dXJlKHBvbHlnb24pXHJcbiAgICBzd2l0Y2ggKHRoaXMub3B0aW9ucy5oZWlnaHRNb2RlKSB7XHJcbiAgICAgIGNhc2UgJzAnOlxyXG4gICAgICBjYXNlIDA6XHJcbiAgICAgICAgZ3JvdW5kID0gZmFsc2VcclxuICAgICAgICBicmVha1xyXG4gICAgICBjYXNlICcxJzpcclxuICAgICAgY2FzZSAxOlxyXG4gICAgICAgIGhlaWdodCA9IHRoaXMuc2RrLnZpZXdlci5zY2VuZS5nbG9iZS5nZXRIZWlnaHQoQ2VzaXVtLkNhcnRvZ3JhcGhpYy5mcm9tRGVncmVlcyhjZW50cm9pZC5nZW9tZXRyeS5jb29yZGluYXRlc1swXSwgY2VudHJvaWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMV0pKSB8fCAwXHJcbiAgICAgICAgZ3JvdW5kID0gZmFsc2VcclxuICAgICAgICBicmVha1xyXG4gICAgICBjYXNlICcyJzpcclxuICAgICAgY2FzZSAyOlxyXG4gICAgICAgIGdyb3VuZCA9IHRydWVcclxuICAgICAgICBicmVha1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBmcm9tRGVncmVlc0FycmF5MiA9IFtdXHJcbiAgICBpZiAoIWdyb3VuZCAmJiB0aGlzLm5vZGVQb2ludHMubGVuZ3RoID09IDApIHtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb2ludHNbMF0ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBmcm9tRGVncmVlc0FycmF5Mi5wdXNoKFxyXG4gICAgICAgICAgcG9pbnRzWzBdW2ldWzBdLFxyXG4gICAgICAgICAgcG9pbnRzWzBdW2ldWzFdLFxyXG4gICAgICAgICAgdGhpcy5oZWlnaHQgKyBoZWlnaHRcclxuICAgICAgICApXHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5wb3NpdGlvbnNIID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXNBcnJheUhlaWdodHMoZnJvbURlZ3JlZXNBcnJheTIpXHJcblxyXG4gICAgICB0aGlzLmxhYmVsICYmICh0aGlzLmxhYmVsLnBvc2l0aW9uID0gW1xyXG4gICAgICAgIGNlbnRyb2lkLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzBdLFxyXG4gICAgICAgIGNlbnRyb2lkLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzFdLFxyXG4gICAgICAgIHRoaXMuaGVpZ2h0ICsgaGVpZ2h0XHJcbiAgICAgIF0pXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnBvc2l0aW9uc0ggPSBwb3NpdGlvbnNBXHJcblxyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICBpZiAoIXRoaXMuc2RrLnZpZXdlcikge1xyXG4gICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBvYmplY3RzVG9FeGNsdWRlID0gWy4uLnRoaXMuc2RrLnZpZXdlci5lbnRpdGllcy52YWx1ZXNdXHJcbiAgICAgICAgdGhpcy5nZXRDbGFtcFRvSGVpZ2h0KHtcclxuICAgICAgICAgIGxuZzogY2VudHJvaWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMF0sXHJcbiAgICAgICAgICBsYXQ6IGNlbnRyb2lkLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzFdXHJcbiAgICAgICAgfSwgb2JqZWN0c1RvRXhjbHVkZSkudGhlbihoZWlnaHQgPT4ge1xyXG4gICAgICAgICAgdGhpcy5sYWJlbCAmJiAodGhpcy5sYWJlbC5wb3NpdGlvbiA9IFtcclxuICAgICAgICAgICAgY2VudHJvaWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMF0sXHJcbiAgICAgICAgICAgIGNlbnRyb2lkLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzFdLFxyXG4gICAgICAgICAgICBoZWlnaHRcclxuICAgICAgICAgIF0pXHJcbiAgICAgICAgfSlcclxuICAgICAgfSwgMTAwKVxyXG4gICAgfVxyXG5cclxuICAgIC8vIOiuoeeul+aKleW9semdouenr1xyXG4gICAgdGhpcy5vcHRpb25zLmFyZWFCeU1ldGVyID0gdGhpcy5jb21wdXRlQXJlYShwb3M4NClcclxuICAgIHRoaXMuYXJlYVVuaXQgPSB0aGlzLmFyZWFVbml0XHJcbiAgICByZXR1cm4gZnJvbURlZ3JlZXNBcnJheVxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgQXNzZW1ibGVPYmplY3RcclxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBU0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQVdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQVhBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFyQkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQXdDQTtBQTdDQTtBQUFBO0FBQUE7QUFBQTtBQThDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBVkE7QUFBQTtBQVFBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFsQkE7QUFBQTtBQUFBO0FBdUJBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQVNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFXQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFYQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBckJBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUF3Q0E7QUE3Q0E7QUFBQTtBQUFBO0FBQUE7QUE4Q0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQVZBO0FBQUE7QUFRQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBbEJBO0FBQUE7QUFBQTtBQW1CQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUF3SUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQXpIQTtBQUFBO0FBQUE7QUEwSEE7QUFBQTtBQUFBO0FBR0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBekNBO0FBMENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFLQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFHQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBTEE7QUFBQTtBQUFBO0FBQUE7QUFTQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFNQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBeGVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBMmVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFaQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQWVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUFBO0FBRUE7QUFVQTtBQUFBO0FBUEE7QUFBQTtBQUFBO0FBSUE7QUFBQTtBQUFBO0FBSUE7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBS0E7QUFBQTtBQVBBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBVUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBcEdBO0FBQUE7QUFBQTtBQUFBO0FBc0dBO0FBQ0E7QUFDQTtBQUZBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUxBO0FBQUE7QUFBQTtBQXdMQTtBQUNBO0FBQUE7QUFuTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBaVVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUtBO0FBQ0E7QUFFQTtBQUtBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQS8vQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUtBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBbkJBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBazZCQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQXJFQTtBQUFBO0FBQUE7QUFxRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQTVGQTtBQUFBO0FBS0E7QUF3RkE7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFzS0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBZEE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBZ0JBO0FBbEJBO0FBQUE7QUFBQTtBQW9CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQXJNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUtBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUtBO0FBR0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQWtDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBdUxBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/Obj/Base/AssembleObject/index.js\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ \"./node_modules/@babel/runtime/helpers/defineProperty.js\");\n/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ \"./node_modules/@babel/runtime/helpers/asyncToGenerator.js\");\n/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/toConsumableArray */ \"./node_modules/@babel/runtime/helpers/toConsumableArray.js\");\n/* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ \"./node_modules/@babel/runtime/helpers/classCallCheck.js\");\n/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ \"./node_modules/@babel/runtime/helpers/createClass.js\");\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ \"./node_modules/@babel/runtime/helpers/possibleConstructorReturn.js\");\n/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ \"./node_modules/@babel/runtime/helpers/getPrototypeOf.js\");\n/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ \"./node_modules/@babel/runtime/helpers/inherits.js\");\n/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @babel/runtime/regenerator */ \"./node_modules/@babel/runtime/regenerator/index.js\");\n/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8__);\n/* harmony import */ var _Element_Dialog__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../Element/Dialog */ \"./src/Obj/Element/Dialog/index.js\");\n/* harmony import */ var _Element_cy_html_tabs__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../Element/cy_html_tabs */ \"./src/Obj/Element/cy_html_tabs.js\");\n/* harmony import */ var _Element_richText__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../Element/richText */ \"./src/Obj/Element/richText.js\");\n/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./_element */ \"./src/Obj/Base/AssembleObject/_element.js\");\n/* harmony import */ var _index__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../index */ \"./src/Obj/Base/index.js\");\n/* harmony import */ var _LabelObject__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../LabelObject */ \"./src/Obj/Base/LabelObject/index.js\");\n/* harmony import */ var _Event_index__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../../../Event/index */ \"./src/Event/index.js\");\n/* harmony import */ var _MouseTip__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../../../MouseTip */ \"./src/MouseTip/index.js\");\n/* harmony import */ var _Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../../../Global/MultiViewportMode */ \"./src/Global/MultiViewportMode/index.js\");\n/* harmony import */ var _Element_datalist__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../../Element/datalist */ \"./src/Obj/Element/datalist.js\");\n/* harmony import */ var _Element_fontSelect__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../../Element/fontSelect */ \"./src/Obj/Element/fontSelect.js\");\n/* harmony import */ var _Global_SplitScreen__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../../../Global/SplitScreen */ \"./src/Global/SplitScreen/index.js\");\n/* harmony import */ var _Global_global__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../../../Global/global */ \"./src/Global/global.js\");\n\n\n\n\n\n\n\n\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default()(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\n\nfunction _callSuper(t, o, e) { return o = _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6___default()(o), _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_5___default()(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6___default()(t).constructor) : o.apply(t, e)); }\nfunction _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }\n/**\r\n * 集结地\r\n */\n\n\n\n\n\n\n\n\n\n\n\n\n\n// import EditParticle from \"../../ModelController/EditParticle\";\nvar AssembleObject = /*#__PURE__*/function (_Base) {\n /**\r\n * @constructor\r\n * @param sdk\r\n * @description 集结地\r\n * @param options {object} 属性\r\n * @param options.id {string} 唯一标识\r\n * @param options.show=true {boolean} 显示/隐藏\r\n * @param options.name {string} 名称\r\n * @param options.color='rgba(255, 0, 0, 0.5)' {string} 颜色\r\n * @param options.height {number} 高度\r\n * @param options.heightMode=2{number} 高度模式(0:海拔高度;1:相对地表;2:依附模式)\r\n * @param options.line {object} 边框\r\n * @param options.line.width=2 {string} 边框宽\r\n * @param options.line.color=\"rgba(155, 155, 124, 0.89)\" {string} 边框颜色\r\n * @param {Array.} options.positions 必填,经纬度和高度的列表,值交替 [{lon,lat,alt},...]\r\n * @param options.positions[].lng {number} 经度\r\n * @param options.positions[].lat {number} 纬度\r\n * @param options.positions[].alt {number} 高度\r\n * @param options.label {object} 标签对象\r\n * @param options.label.text {string} 标签文本\r\n * @param options.label.show {string} 标签显隐\r\n * @param options.label.position {string} 标签位置\r\n * @param options.label.position {object} 标签位置\r\n * @param options.label.position.lng {number} 经度\r\n * @param options.label.position.lat {number} 纬度\r\n * @param options.label.position.alt {number} 高度\r\n * @param options.label.fontSize=20 {number} 字体大小\r\n * @param options.label.fontFamily=0 {number} 字体项 0:黑体;1:思源黑体;2:庞门正道标题体;3:数黑体\r\n * @param options.label.color=#ffffff {string} 字体颜色\r\n * @param options.label.lineWidth=4 {number} 引线宽\r\n * @param options.label.lineColor=#00ffff80 {string} 引线颜色\r\n * @param options.label.pixelOffset=20 {number} 字体偏移(引线长度)\r\n * @param options.label.backgroundColor=['#00ffff80', '#00ffff80'] {array} 背景颜色\r\n * @param options.label.scaleByDistance {boolean} 距离缩放\r\n * @param options.label.near=2000 {number} 视野缩放最近距离\r\n * @param options.label.far=100000 {number} 视野缩放最远距离\r\n * @param options.attribute {object} 属性内容\r\n * @param options.attribute.link={} {object} 链接\r\n * @param options.attribute.link.content=[]] {array} 链接内容\r\n * @param options.attribute.link.content[].name {string} 链接名称\r\n * @param options.attribute.link.content[].url {string} 链接地址\r\n * @param options.richTextContent {string} 富文本内容\r\n * @param options.customView {object} 默认视角\r\n * @param options.customView.orientation {object} 默认视角方位\r\n * @param options.customView.orientation.heading {number} 航向角\r\n * @param options.customView.orientation.pitch {number} 俯仰角\r\n * @param options.customView.orientation.roll {number} 翻滚角\r\n * @param options.customView.relativePosition {object} 视角相对位置\r\n * @param options.customView.relativePosition.lng {number} 经度\r\n * @param options.customView.relativePosition.lat {number} 纬度\r\n * @param options.customView.relativePosition.alt {number} 高度\r\n * */\n function AssembleObject(sdk) {\n var _this2;\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var _Dialog = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3___default()(this, AssembleObject);\n _this2 = _callSuper(this, AssembleObject, [sdk, options]);\n _this2.options.name = options.name || '未命名对象';\n _this2.options.color = options.color || \"#ff000080\";\n _this2.options.show = options.show || options.show === false ? options.show : true;\n _this2.options.heightMode = options.heightMode || options.heightMode == 0 ? options.heightMode : 2;\n _this2.options.positions = options.positions || [];\n _this2.options.line = options.line || {};\n _this2.options.line.width = _this2.options.line.width || _this2.options.line.width === 0 ? _this2.options.line.width : 3;\n _this2.options.line.color = _this2.options.line.color || 'rgba(255, 0, 0, 1)';\n _this2.entity;\n _this2.event = new _Event_index__WEBPACK_IMPORTED_MODULE_15__[\"default\"](_this2.sdk);\n _this2.operate = {};\n _this2._elms = {};\n _this2.Dialog = _Dialog;\n options.label = options.label || {};\n _this2.options.label = {\n text: _this2.options.name,\n show: options.label.show || false,\n position: options.label.position,\n fontSize: options.label.fontSize || options.label.fontSize === 0 ? options.label.fontSize : 20,\n fontFamily: options.label.fontFamily ? options.label.fontFamily : 0,\n color: options.label.color || '#ffffff',\n lineWidth: options.label.lineWidth || options.label.lineWidth === 0 ? options.label.lineWidth : 4,\n pixelOffset: options.label.pixelOffset || options.label.pixelOffset === 0 ? options.label.pixelOffset : 20,\n backgroundColor: options.label.backgroundColor || ['#00ffff80', '#00ffff80'],\n lineColor: options.label.lineColor || '#00ffff80',\n scaleByDistance: options.label.scaleByDistance || false,\n near: options.label.near || options.label.near === 0 ? options.label.near : 2000,\n far: options.label.far || options.label.far === 0 ? options.label.far : 100000\n };\n _this2.options.attribute = options.attribute || {};\n _this2.options.attribute.link = _this2.options.attribute.link || {};\n _this2.options.attribute.link.content = _this2.options.attribute.link.content || [];\n delete _this2.options.attribute.camera;\n delete _this2.options.attribute.vr;\n delete _this2.options.attribute.goods;\n _this2.nodePoints = [];\n if (!_this2.options.positions || _this2.options.positions.length < 3) {\n _this2._error = '集结地最少需要三个坐标!';\n console.warn(_this2._error);\n window.ELEMENT && window.ELEMENT.Message({\n message: _this2._error,\n type: 'warning',\n duration: 1500\n });\n } else {\n if (!_this2.options.height && _this2.options.height !== 0) {\n var height = _this2.options.positions[0].alt;\n for (var i = 1; i < _this2.options.positions.length; i++) {\n if (height < _this2.options.positions[i].alt) {\n height = _this2.options.positions[i].alt;\n }\n }\n _this2.options.height = height;\n }\n _this2.sdk.addIncetance(_this2.options.id, _this2);\n AssembleObject.create(_this2);\n }\n return _this2;\n }\n _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_7___default()(AssembleObject, _Base);\n return _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4___default()(AssembleObject, [{\n key: \"type\",\n get: function get() {\n return 'AssembleObject';\n }\n }, {\n key: \"color\",\n get: function get() {\n return this.options.color;\n },\n set: function set(v) {\n var _this3 = this;\n this.options.color = v || 'rgba(255, 0, 0, 0.5)';\n if (!this.sdk || !this.sdk.viewer || !this.entity || !this.entity.polygon) {\n return;\n }\n var material = Cesium.Color.fromCssColorString(this.options.color);\n if (this.sdk.viewer.scene.mode === 2) {\n material = new Cesium.CustomColorMaterialSource({\n color: this.options.color\n });\n }\n this.entity.polygon.material = material;\n if (this._elms.color) {\n this._elms.color.forEach(function (item, i) {\n var colorPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: _this3.options.color,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(c) {\n _this3.color = c;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this3.color = 'rgba(255,0,0,0.5)';\n } //点击清空按钮事件回调\n });\n _this3._elms.color[i] = colorPicker;\n });\n }\n }\n }, {\n key: \"heightMode\",\n get: function get() {\n return this.options.heightMode ? this.options.heightMode : 0;\n },\n set: function set(v) {\n var _this4 = this;\n this.entity.polygon.hierarchy = [];\n setTimeout(function () {\n _this4.options.heightMode = v || v == 0 ? v : 2;\n _this4.positionEditing = false;\n if (!_this4.entity) {\n return;\n }\n var heightModeName = '';\n _this4.closeNodeEdit();\n var ground = false;\n var disabled = false;\n _this4.renewPositions();\n _this4.entity.polyline.positions = [].concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(_this4.positionsH), [_this4.positionsH[0], _this4.positionsH[1]]);\n _this4.entity.polygon.hierarchy = new Cesium.PolygonHierarchy(_this4.positionsH);\n switch (_this4.options.heightMode) {\n case '0':\n case 0:\n heightModeName = '海拔高度';\n break;\n case '1':\n case 1:\n heightModeName = '相对地表';\n break;\n case '2':\n case 2:\n ground = true;\n disabled = true;\n heightModeName = '依附模型';\n break;\n }\n _this4.previous = null;\n _this4.label.ground = ground;\n _this4.entity.polyline.clampToGround = ground;\n _this4.entity.polyline.arcType = !ground ? Cesium.ArcType.NONE : Cesium.ArcType.GEODESIC, _this4.entity.polygon.perPositionHeight = !ground ? true : false;\n _this4._elms.heightMode && (_this4._elms.heightMode.value = heightModeName);\n _this4._elms.heightModeObject && _this4._elms.heightModeObject.legp_searchActive(heightModeName);\n if (disabled) {\n _this4._elms.heightBox && (_this4._elms.heightBox.className = 'input-number input-number-unit-1 height-box disabled');\n _this4._elms.heightConfirm && _this4._elms.heightConfirm.setAttribute('disabled', 'disabled');\n } else {\n _this4._elms.heightBox && (_this4._elms.heightBox.className = 'input-number input-number-unit-1 height-box');\n _this4._elms.heightConfirm && _this4._elms.heightConfirm.removeAttribute('disabled');\n }\n }, 50);\n }\n }, {\n key: \"height\",\n get: function get() {\n return this.options.height;\n },\n set: function set(v) {\n var _this5 = this;\n if (!v || isNaN(Number(v))) {\n this.options.height = 0;\n } else {\n this.options.height = Number(Number(v).toFixed(2));\n }\n var ground;\n if (this.heightMode == 2) {\n ground = true;\n } else {\n ground = false;\n }\n this.renewPositions();\n setTimeout(function () {\n _this5.entity.polygon.hierarchy = new Cesium.PolygonHierarchy(_this5.positionsH);\n _this5.entity.polygon.perPositionHeight = !ground ? true : false;\n _this5.entity.polyline.positions = [].concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(_this5.positionsH), [_this5.positionsH[0], _this5.positionsH[1]]);\n _this5.entity.polyline.clampToGround = !ground ? false : true;\n _this5.entity.polyline.arcType = !ground ? Cesium.ArcType.NONE : Cesium.ArcType.GEODESIC;\n }, 0);\n this._elms.alt && this._elms.alt.forEach(function (item) {\n item.innerHTML = _this5.options.height;\n });\n }\n }, {\n key: \"lineColor\",\n get: function get() {\n return this.options.line.color;\n },\n set: function set(v) {\n var _this6 = this;\n this.options.line.color = v || 'rgba(255, 0, 0, 0.5)';\n if (!this.sdk || !this.sdk.viewer || !this.entity || !this.entity.polyline) {\n return;\n }\n this.entity.polyline.material = Cesium.Color.fromCssColorString(this.options.line.color);\n if (this._elms.lineColor) {\n this._elms.lineColor.forEach(function (item, i) {\n var lineColorPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: _this6.options.line.color,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(c) {\n _this6.lineColor = c;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this6.lineColor = 'rgba(255,0,0,0.5)';\n } //点击清空按钮事件回调\n });\n _this6._elms.lineColor[i] = lineColorPicker;\n });\n }\n }\n }, {\n key: \"lineWidth\",\n get: function get() {\n return this.options.line.width;\n },\n set: function set(v) {\n var _this7 = this;\n this.options.line.width = v || v === 0 ? v : 3;\n this.entity.polyline.width = this.options.line.width;\n this._elms.lineColor && this._elms.lineColor.forEach(function (item) {\n item.value = _this7.options.line.width;\n });\n }\n }, {\n key: \"labelShow\",\n get: function get() {\n return this.options.label.show;\n },\n set: function set(v) {\n this.options.label.show = v;\n if (this.show && !this.showView || this.showView == 3) {\n this.label.show = v;\n } else {\n this.label.show = false;\n }\n this._elms.labelShow && this._elms.labelShow.forEach(function (item) {\n item.checked = v;\n });\n }\n }, {\n key: \"labelFontFamily\",\n get: function get() {\n return this.options.label.fontFamily;\n },\n set: function set(v) {\n this.options.label.fontFamily = v || 0;\n this.label && (this.label.fontFamily = this.options.label.fontFamily);\n var name = Object(_Element_fontSelect__WEBPACK_IMPORTED_MODULE_19__[\"getFontFamilyName\"])(this.labelFontFamily) || '';\n this._elms.labelFontFamily && this._elms.labelFontFamily.forEach(function (item) {\n item.value = name;\n });\n }\n }, {\n key: \"labelColor\",\n get: function get() {\n return this.options.label.color;\n },\n set: function set(v) {\n var _this8 = this;\n this.options.label.color = v;\n this.label.color = v;\n if (this._elms.labelColor) {\n this._elms.labelColor.forEach(function (item, i) {\n var labelColorPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: _this8.labelColor,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this8.labelColor = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this8.labelColor = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n _this8._elms.labelColor[i] = labelColorPicker;\n });\n }\n }\n }, {\n key: \"labelFontSize\",\n get: function get() {\n return this.options.label.fontSize;\n },\n set: function set(v) {\n this.options.label.fontSize = v;\n this.label.fontSize = v;\n this._elms.labelFontSize && this._elms.labelFontSize.forEach(function (item) {\n item.value = v;\n });\n }\n }, {\n key: \"labelScaleByDistance\",\n get: function get() {\n return this.options.label.scaleByDistance;\n },\n set: function set(v) {\n this.options.label.scaleByDistance = v;\n this.label.scaleByDistance = v;\n this._elms.labelScaleByDistance && this._elms.labelScaleByDistance.forEach(function (item) {\n item.checked = v;\n });\n }\n }, {\n key: \"labelNear\",\n get: function get() {\n return this.options.label.near;\n },\n set: function set(v) {\n var near = v;\n if (near > this.labelFar) {\n near = this.labelFar;\n }\n this.options.label.near = near;\n this.label.near = near;\n this._elms.labelNear && this._elms.labelNear.forEach(function (item) {\n item.value = near;\n });\n }\n }, {\n key: \"labelFar\",\n get: function get() {\n return this.options.label.far;\n },\n set: function set(v) {\n var far = v;\n if (far < this.labelNear) {\n far = this.labelNear;\n }\n this.options.label.far = far;\n this.label.far = far;\n this._elms.labelFar && this._elms.labelFar.forEach(function (item) {\n item.value = far;\n });\n }\n }, {\n key: \"labelLineWidth\",\n get: function get() {\n return this.options.label.lineWidth;\n },\n set: function set(v) {\n this.options.label.lineWidth = v;\n this.label.lineWidth = v;\n this._elms.labelLineWidth && this._elms.labelLineWidth.forEach(function (item) {\n item.value = v;\n });\n }\n }, {\n key: \"labelPixelOffset\",\n get: function get() {\n return this.options.label.pixelOffset;\n },\n set: function set(v) {\n this.options.label.pixelOffset = v;\n this.label.pixelOffset = v;\n this._elms.labelPixelOffset && this._elms.labelPixelOffset.forEach(function (item) {\n item.value = v;\n });\n }\n }, {\n key: \"labelLineColor\",\n get: function get() {\n return this.options.label.lineColor;\n },\n set: function set(v) {\n var _this9 = this;\n this.options.label.lineColor = v;\n this.label.lineColor = v;\n if (this._elms.labelLineColor) {\n this._elms.labelLineColor.forEach(function (item, i) {\n var lineColorPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: _this9.labelLineColor,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this9.labelLineColor = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this9.labelLineColor = 'rgba(0,255,255,0.5)';\n } //点击清空按钮事件回调\n });\n _this9._elms.labelLineColor[i] = lineColorPicker;\n });\n }\n }\n }, {\n key: \"labelBackgroundColorStart\",\n get: function get() {\n return this.options.label.backgroundColor[0];\n },\n set: function set(v) {\n var _this10 = this;\n this.options.label.backgroundColor[0] = v;\n this.label.backgroundColor = [v, this.label.backgroundColor[1]];\n if (this._elms.labelBackgroundColorStart) {\n this._elms.labelBackgroundColorStart.forEach(function (item, i) {\n var labelBackgroundColorStartPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: _this10.labelBackgroundColorStart,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this10.labelBackgroundColorStart = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this10.labelBackgroundColorStart = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n _this10._elms.labelBackgroundColorStart[i] = labelBackgroundColorStartPicker;\n });\n }\n }\n }, {\n key: \"labelBackgroundColorEnd\",\n get: function get() {\n return this.options.label.backgroundColor[1];\n },\n set: function set(v) {\n var _this11 = this;\n this.options.label.backgroundColor[1] = v;\n this.label.backgroundColor = [this.label.backgroundColor[0], v];\n if (this._elms.labelBackgroundColorEnd) {\n this._elms.labelBackgroundColorEnd.forEach(function (item, i) {\n var labelBackgroundColorEndPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: _this11.labelBackgroundColorEnd,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this11.labelBackgroundColorEnd = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this11.labelBackgroundColorEnd = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n _this11._elms.labelBackgroundColorEnd[i] = labelBackgroundColorEndPicker;\n });\n }\n }\n }, {\n key: \"edit\",\n value: // 编辑框\n function () {\n var _edit = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee(state) {\n var _this12 = this;\n var _this, createSpatialInfoTableContent, contentElm, tabsElm, colorPicker, linecolorPicker, labelColorPicker, labellineColorPicker, labelBackgroundColorStartPicker, labelBackgroundColorEndPicker, all_elm, heightBoxElm, heightElm, heightConfirmElm, heightModeData, heightModeObject, heightModeDataLegpElm, i;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee$(_context) {\n while (1) switch (_context.prev = _context.next) {\n case 0:\n return _context.abrupt(\"return\");\n case 3:\n _this = this;\n this.originalOptions = this.deepCopyObj(this.options);\n if (this._DialogObject && this._DialogObject.close) {\n this._DialogObject.close();\n this._DialogObject = null;\n }\n if (!state) {\n _context.next = 62;\n break;\n }\n createSpatialInfoTableContent = function createSpatialInfoTableContent() {\n var tableElm = contentElm.getElementsByClassName('spatial-info-table')[0];\n var tBodyElm = tableElm.getElementsByClassName('table-body')[0];\n tBodyElm.innerHTML = '';\n _this._elms.lng = [];\n _this._elms.lngInput = [];\n _this._elms.lat = [];\n _this._elms.latInput = [];\n _this._elms.alt = [];\n _this._elms.altInput = [];\n var _loop = function _loop(i) {\n var tr = document.createElement('div');\n tr.className = 'tr';\n tr.innerHTML = \"\\n
\".concat(i + 1, \"
\\n
\\n
\\n
\\n \");\n var lngBox = tr.getElementsByClassName('lng')[0];\n var lng = document.createElement('span');\n lng.innerHTML = _this.options.positions[i].lng.toFixed(8);\n lngBox.appendChild(lng);\n var lngInput = document.createElement('input');\n lngInput.className = 'input';\n lngInput.type = 'number';\n lngInput.title = '';\n lngInput.min = -180;\n lngInput.max = 180;\n lngInput.value = _this.options.positions[i].lng.toFixed(8);\n var latBox = tr.getElementsByClassName('lat')[0];\n var lat = document.createElement('span');\n lat.innerHTML = _this.options.positions[i].lat.toFixed(8);\n latBox.appendChild(lat);\n var latInput = document.createElement('input');\n latInput.className = 'input';\n latInput.type = 'number';\n latInput.title = '';\n latInput.min = -90;\n latInput.max = 90;\n latInput.value = _this.options.positions[i].lat.toFixed(8);\n var altBox = tr.getElementsByClassName('alt')[0];\n var alt = document.createElement('span');\n alt.innerHTML = _this.height.toFixed(2);\n altBox.appendChild(alt);\n var altInput = document.createElement('input');\n altInput.className = 'input';\n altInput.type = 'number';\n altInput.title = '';\n altInput.min = -9999999;\n altInput.max = 999999999;\n altInput.value = _this.height.toFixed(2);\n lngBox.addEventListener('dblclick', function () {\n lngBox.innerHTML = '';\n lngInput.value = Number(_this.options.positions[i].lng.toFixed(8));\n lngBox.appendChild(lngInput);\n lngInput.focus();\n if (_this.operate.positionEditing) {\n _this.positionEditing = false;\n }\n AssembleObject.closeNodeEdit(_this);\n _this.heightMode = _this.heightMode;\n });\n lngInput.addEventListener('blur', function () {\n lngInput.value = Number(_this.options.positions[i].lng.toFixed(8));\n lngBox.innerHTML = '';\n lngBox.appendChild(lng);\n });\n lngInput.addEventListener('input', function () {\n _this.options.positions[i].lng = Number(Number(lngInput.value).toFixed(8));\n lng.innerHTML = _this.options.positions[i].lng.toFixed(8);\n _this.height = _this.height;\n });\n latBox.addEventListener('dblclick', function () {\n latBox.innerHTML = '';\n latInput.value = Number(_this.options.positions[i].lat.toFixed(8));\n latBox.appendChild(latInput);\n latInput.focus();\n if (_this.operate.positionEditing) {\n _this.positionEditing = false;\n }\n AssembleObject.closeNodeEdit(_this);\n _this.heightMode = _this.heightMode;\n });\n latInput.addEventListener('blur', function () {\n latInput.value = Number(_this.options.positions[i].lat.toFixed(8));\n latBox.innerHTML = '';\n latBox.appendChild(lat);\n });\n latInput.addEventListener('input', function () {\n _this.options.positions[i].lat = Number(Number(latInput.value).toFixed(8));\n lat.innerHTML = _this.options.positions[i].lat.toFixed(8);\n _this.height = _this.height;\n });\n altBox.addEventListener('dblclick', function () {\n if (_this.heightMode == 2) {\n return;\n }\n altBox.innerHTML = '';\n altInput.value = Number(_this.height.toFixed(2));\n altBox.appendChild(altInput);\n altInput.focus();\n if (_this.operate.positionEditing) {\n _this.positionEditing = false;\n }\n AssembleObject.closeNodeEdit(_this);\n _this.heightMode = _this.heightMode;\n });\n altInput.addEventListener('blur', function () {\n altInput.value = Number(_this.height.toFixed(2));\n altBox.innerHTML = '';\n altBox.appendChild(alt);\n });\n altInput.addEventListener('input', function () {\n _this.height = Number(Number(altInput.value).toFixed(2));\n alt.innerHTML = Number(_this.height.toFixed(2));\n });\n _this._elms.lng.push(lng);\n _this._elms.lngInput.push(lngInput);\n _this._elms.lat.push(lat);\n _this._elms.latInput.push(latInput);\n _this._elms.alt.push(alt);\n _this._elms.altInput.push(altInput);\n tBodyElm.appendChild(tr);\n };\n for (var i = 0; i < _this.options.positions.length; i++) {\n _loop(i);\n }\n };\n _context.next = 10;\n return new _Element_Dialog__WEBPACK_IMPORTED_MODULE_9__[\"default\"](this.sdk, this.options, {\n title: '集结地属性',\n left: '180px',\n top: '100px',\n confirmCallBack: function confirmCallBack(options) {\n _this12.name = _this12.name.trim();\n if (!_this12.name) {\n _this12.name = '未命名对象';\n }\n _this12.options.label.position = {\n lng: _this12.label.position[0],\n lat: _this12.label.position[1],\n alt: _this12.label.position[2]\n };\n _this12.originalOptions = _this12.deepCopyObj(_this12.options);\n _this12._DialogObject.close();\n _this12.Dialog.confirmCallBack && _this12.Dialog.confirmCallBack(_this12.originalOptions);\n Object(_Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_17__[\"syncData\"])(_this12.sdk, _this12.options.id);\n Object(_Global_SplitScreen__WEBPACK_IMPORTED_MODULE_20__[\"syncSplitData\"])(_this12.sdk, _this12.options.id);\n },\n resetCallBack: function resetCallBack() {\n _this12.reset();\n _this12.Dialog.resetCallBack && _this12.Dialog.resetCallBack();\n },\n removeCallBack: function removeCallBack() {\n _this12.Dialog.removeCallBack && _this12.Dialog.removeCallBack();\n },\n closeCallBack: function closeCallBack() {\n _this12.reset();\n _this12.positionEditing = false;\n _this12.Dialog.closeCallBack && _this12.Dialog.closeCallBack();\n },\n showCallBack: function showCallBack(show) {\n _this12.options.show = show;\n _this12.originalOptions.show = show;\n _this12.show = show;\n _this12.Dialog.showCallBack && _this12.Dialog.showCallBack();\n },\n translationalCallBack: function translationalCallBack() {\n _this12.positionEditing = !_this12.positionEditing;\n },\n // 二次编辑回调\n secondaryEditCallBack: function secondaryEditCallBack() {\n AssembleObject.nodeEdit(_this12, function () {\n createSpatialInfoTableContent();\n });\n }\n });\n case 10:\n this._DialogObject = _context.sent;\n this._DialogObject._element.body.className = this._DialogObject._element.body.className + ' assemble';\n contentElm = document.createElement('div');\n contentElm.innerHTML = Object(_element__WEBPACK_IMPORTED_MODULE_12__[\"html\"])(this);\n this._DialogObject.contentAppChild(contentElm);\n this.attributeType = this.options.attributeType;\n this.attributeCamera = this.options.attribute.camera.content;\n\n // 创建标签页\n tabsElm = new _Element_cy_html_tabs__WEBPACK_IMPORTED_MODULE_10__[\"default\"]('assemble-object-edit-tabs', undefined, this.sdk); // 颜色组件\n colorPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName(\"color\")[0],\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: this.color,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this12.color = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this12.color = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n linecolorPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName(\"lineColor\")[0],\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: this.lineColor,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this12.lineColor = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this12.lineColor = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n labelColorPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName(\"labelColor\")[0],\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: this.labelColor,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this12.labelColor = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this12.labelColor = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n labellineColorPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName(\"labelLineColor\")[0],\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: this.labelLineColor,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this12.labelLineColor = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this12.labelLineColor = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n labelBackgroundColorStartPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName(\"labelBackgroundColorStart\")[0],\n size: 'mini',\n alpha: true,\n defaultColor: this.labelBackgroundColorStart,\n disabled: false,\n openPickerAni: 'opacity',\n sure: function sure(color) {\n _this12.labelBackgroundColorStart = color;\n },\n clear: function clear() {\n _this12.labelBackgroundColorStart = 'rgba(255,255,255,1)';\n }\n });\n labelBackgroundColorEndPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName(\"labelBackgroundColorEnd\")[0],\n size: 'mini',\n alpha: true,\n defaultColor: this.labelBackgroundColorEnd,\n disabled: false,\n openPickerAni: 'opacity',\n sure: function sure(color) {\n _this12.labelBackgroundColorEnd = color;\n },\n clear: function clear() {\n _this12.labelBackgroundColorEnd = 'rgba(255,255,255,1)';\n }\n });\n all_elm = contentElm.getElementsByTagName(\"*\");\n AssembleObject.EventBinding(this, all_elm);\n this._elms.color = [colorPicker];\n this._elms.lineColor = [linecolorPicker];\n this._elms.labelColor = [labelColorPicker];\n this._elms.labelLineColor = [labellineColorPicker];\n this._elms.labelBackgroundColorStart = [labelBackgroundColorStartPicker];\n this._elms.labelBackgroundColorEnd = [labelBackgroundColorEndPicker];\n heightBoxElm = this._DialogObject._element.content.getElementsByClassName('height-box')[0];\n heightElm = heightBoxElm.getElementsByClassName('height')[0];\n heightConfirmElm = this._DialogObject._element.content.getElementsByClassName('height-confirm')[0];\n heightElm.value = 10;\n if (this.heightMode == 2) {\n heightBoxElm && (heightBoxElm.className = 'input-number input-number-unit-1 height-box disabled');\n heightConfirmElm && heightConfirmElm.setAttribute('disabled', 'disabled');\n } else {\n heightBoxElm && (heightBoxElm.className = 'input-number input-number-unit-1 height-box');\n heightConfirmElm && heightConfirmElm.removeAttribute('disabled');\n }\n heightModeData = [{\n name: '海拔高度',\n value: '海拔高度',\n key: '0'\n }, {\n name: '相对地表',\n value: '相对地表',\n key: '1'\n }, {\n name: '依附模型',\n value: '依附模型',\n key: '2'\n }];\n heightModeObject = Object(_Element_datalist__WEBPACK_IMPORTED_MODULE_18__[\"legp\"])(this._DialogObject._element.content.getElementsByClassName('height-mode-box')[0], '.height-mode');\n if (!heightModeObject) {\n _context.next = 59;\n break;\n }\n heightModeObject.legp_search(heightModeData);\n heightModeDataLegpElm = this._DialogObject._element.content.getElementsByClassName('height-mode')[0].getElementsByTagName('input')[0];\n i = 0;\n case 43:\n if (!(i < heightModeData.length)) {\n _context.next = 51;\n break;\n }\n if (!(heightModeData[i].key == this.heightMode)) {\n _context.next = 48;\n break;\n }\n heightModeDataLegpElm.value = heightModeData[i].value;\n heightModeObject.legp_searchActive(heightModeData[i].value);\n return _context.abrupt(\"break\", 51);\n case 48:\n i++;\n _context.next = 43;\n break;\n case 51:\n heightModeDataLegpElm.addEventListener('input', function () {\n for (var _i = 0; _i < heightModeData.length; _i++) {\n if (heightModeData[_i].value === heightModeDataLegpElm.value) {\n _this12.heightMode = heightModeData[_i].key;\n break;\n }\n }\n });\n heightElm.addEventListener('input', function () {\n switch (_this12.heightMode) {\n case 0:\n case '0':\n break;\n case 1:\n case '1':\n break;\n case 2:\n case '2':\n break;\n }\n });\n this._elms.height = heightElm;\n this._elms.heightBox = heightBoxElm;\n this._elms.heightMode = heightModeDataLegpElm;\n this._elms.heightConfirm = heightConfirmElm;\n this._elms.heightModeObject = heightModeObject;\n heightConfirmElm.addEventListener('click', function () {\n if (_this12.operate.positionEditing) {\n _this12.positionEditing = false;\n _this12.height = _this12.height + Number(heightElm.value);\n } else {\n AssembleObject.closeNodeEdit(_this12);\n _this12.heightMode = _this12.heightMode;\n setTimeout(function () {\n _this12.height = _this12.height + Number(heightElm.value);\n }, 100);\n }\n });\n case 59:\n setTimeout(function () {\n _this12.attributeLink = _this12.options.attribute.link.content;\n _this12.attributeVr = _this12.options.attribute.vr.content;\n _this12.cameraSelect && _this12.cameraSelect();\n _this12.goodsSelect && _this12.goodsSelect();\n var tagData = _this12.attributeSelect;\n var attributeElm = _this12._DialogObject._element.content.getElementsByClassName('attribute-select-box')[0];\n if (attributeElm) {\n var legpObject = Object(_Element_datalist__WEBPACK_IMPORTED_MODULE_18__[\"legp\"])(attributeElm, \".attribute-select\");\n legpObject.legp_search(tagData);\n var attributeSelectElm = _this12._DialogObject._element.content.getElementsByClassName('attribute-select')[0].getElementsByTagName('input')[0];\n for (var _i2 = 0; _i2 < tagData.length; _i2++) {\n if (tagData[_i2].key === _this12.options.attributeType) {\n attributeSelectElm.value = tagData[_i2].value;\n legpObject.legp_searchActive(tagData[_i2].value);\n break;\n }\n }\n attributeSelectElm.addEventListener('input', function () {\n for (var _i3 = 0; _i3 < tagData.length; _i3++) {\n if (tagData[_i3].value === attributeSelectElm.value) {\n _this12.attributeType = tagData[_i3].key;\n break;\n }\n }\n });\n }\n createSpatialInfoTableContent();\n var unitData = [{\n name: '平方米',\n value: '平方米'\n }, {\n name: '平方千米',\n value: '平方千米'\n }, {\n name: '亩',\n value: '亩'\n }, {\n name: '公顷',\n value: '公顷'\n }];\n var unitDataLegpObject = Object(_Element_datalist__WEBPACK_IMPORTED_MODULE_18__[\"legp\"])(_this12._DialogObject._element.content.getElementsByClassName('input-select-unit-box')[0], \".input-select-unit\");\n if (unitDataLegpObject) {\n unitDataLegpObject.legp_search(unitData);\n var unitDataLegpElm = _this12._DialogObject._element.content.getElementsByClassName('input-select-unit')[0].getElementsByTagName('input')[0];\n for (var _i4 = 0; _i4 < unitData.length; _i4++) {\n if (unitData[_i4].value === unitDataLegpElm.value) {\n unitDataLegpObject.legp_searchActive(unitData[_i4].value);\n break;\n }\n }\n unitDataLegpElm.addEventListener('input', function () {\n for (var _i5 = 0; _i5 < unitData.length; _i5++) {\n if (unitData[_i5].value === unitDataLegpElm.value) {\n _this12.areaUnit = unitData[_i5].value;\n break;\n }\n }\n });\n }\n var fontData = Object(_Element_fontSelect__WEBPACK_IMPORTED_MODULE_19__[\"getFontList\"])();\n var fontObject = Object(_Element_datalist__WEBPACK_IMPORTED_MODULE_18__[\"legp\"])(_this12._DialogObject._element.content.getElementsByClassName('font-select-box')[0], '.font-select');\n if (fontObject) {\n fontObject.legp_search(fontData);\n var fontDataLegpElm = _this12._DialogObject._element.content.getElementsByClassName('font-select')[0].getElementsByTagName('input')[0];\n fontDataLegpElm.value = fontData[_this12.labelFontFamily].value;\n for (var _i6 = 0; _i6 < fontData.length; _i6++) {\n if (fontData[_i6].value == fontDataLegpElm.value) {\n fontObject.legp_searchActive(fontData[_i6].value);\n break;\n }\n }\n fontDataLegpElm.addEventListener('input', function () {\n for (var _i7 = 0; _i7 < fontData.length; _i7++) {\n if (fontData[_i7].value === fontDataLegpElm.value) {\n _this12.labelFontFamily = fontData[_i7].key;\n break;\n }\n }\n });\n _this12._elms.labelFontFamily = [fontDataLegpElm];\n }\n }, 0);\n _context.next = 63;\n break;\n case 62:\n if (this._DialogObject && this._DialogObject.close) {\n this._DialogObject.close();\n this._DialogObject = null;\n }\n case 63:\n case \"end\":\n return _context.stop();\n }\n }, _callee, this);\n }));\n function edit(_x) {\n return _edit.apply(this, arguments);\n }\n return edit;\n }()\n }, {\n key: \"reset\",\n value: function reset() {\n if (!this.entity) {\n return;\n }\n this.options = this.deepCopyObj(this.originalOptions);\n this.name = this.originalOptions.name;\n this.color = this.originalOptions.color;\n this.lineColor = this.originalOptions.line.color;\n this.lineWidth = this.originalOptions.line.width;\n this.labelShow = this.originalOptions.label.show;\n this.labelColor = this.originalOptions.label.color;\n this.labelFontSize = this.originalOptions.label.fontSize;\n this.labelFontFamily = this.originalOptions.label.fontFamily;\n this.labelScaleByDistance = this.originalOptions.label.scaleByDistance;\n this.labelNear = this.originalOptions.label.near;\n this.labelFar = this.originalOptions.label.far;\n this.labelLineWidth = this.originalOptions.label.lineWidth;\n this.labelPixelOffset = this.originalOptions.label.pixelOffset;\n this.labelLineColor = this.originalOptions.label.lineColor;\n this.labelBackgroundColorStart = this.originalOptions.label.backgroundColor[0];\n this.labelBackgroundColorEnd = this.originalOptions.label.backgroundColor[1];\n for (var i = 0; i < this.options.positions.length; i++) {\n if (this._elms.lng && this._elms.lng[i]) {\n this._elms.lng[i].innerHTML = this.options.positions[i].lng.toFixed(8);\n }\n if (this._elms.lat && this._elms.lat[i]) {\n this._elms.lat[i].innerHTML = this.options.positions[i].lat.toFixed(8);\n }\n if (this._elms.alt && this._elms.alt[i]) {\n this._elms.alt[i].innerHTML = Number(this.options.height.toFixed(2));\n }\n }\n this.heightMode = this.heightMode;\n for (var _i8 = 0; _i8 < this.nodePoints.length; _i8++) {\n this.sdk.viewer.entities.remove(this.nodePoints[_i8]);\n }\n this.previous = null;\n this.nodePoints = [];\n YJ.Measure.SetMeasureStatus(false);\n this.event && this.event.destroy();\n this.tip && this.tip.destroy();\n }\n }, {\n key: \"remove\",\n value: function () {\n var _remove = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee2() {\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee2$(_context2) {\n while (1) switch (_context2.prev = _context2.next) {\n case 0:\n this.sdk.viewer.entities.remove(this.entity);\n this.label && this.label.remove();\n this.event && this.event.destroy();\n this.tip && this.tip.destroy();\n this.entity = null;\n if (this._DialogObject && !this._DialogObject.isDestroy) {\n this._DialogObject.close();\n this._DialogObject = null;\n }\n _context2.next = 8;\n return this.sdk.removeIncetance(this.options.id);\n case 8:\n _context2.next = 10;\n return Object(_Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_17__[\"syncData\"])(this.sdk, this.options.id);\n case 10:\n case \"end\":\n return _context2.stop();\n }\n }, _callee2, this);\n }));\n function remove() {\n return _remove.apply(this, arguments);\n }\n return remove;\n }()\n /**\r\n * 飞到\r\n */\n }, {\n key: \"flyTo\",\n value: (function () {\n var _flyTo = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee3() {\n var options,\n orientation,\n lng,\n lat,\n alt,\n destination,\n position,\n positionArray,\n ground,\n i,\n height,\n a,\n _i9,\n BoundingSphere,\n _args3 = arguments;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee3$(_context3) {\n while (1) switch (_context3.prev = _context3.next) {\n case 0:\n options = _args3.length > 0 && _args3[0] !== undefined ? _args3[0] : {};\n if (!this._error) {\n _context3.next = 3;\n break;\n }\n return _context3.abrupt(\"return\");\n case 3:\n Object(_Global_global__WEBPACK_IMPORTED_MODULE_21__[\"setActiveViewer\"])(0);\n Object(_Global_global__WEBPACK_IMPORTED_MODULE_21__[\"closeRotateAround\"])(this.sdk);\n Object(_Global_global__WEBPACK_IMPORTED_MODULE_21__[\"closeViewFollow\"])(this.sdk);\n if (!(this.options.customView && this.options.customView.relativePosition && this.options.customView.orientation)) {\n _context3.next = 25;\n break;\n }\n orientation = {\n heading: Cesium.Math.toRadians(this.options.customView.orientation.heading || 0.0),\n pitch: Cesium.Math.toRadians(this.options.customView.orientation.pitch || -60.0),\n roll: Cesium.Math.toRadians(this.options.customView.orientation.roll || 0.0)\n };\n lng = this.options.customView.relativePosition.lng;\n lat = this.options.customView.relativePosition.lat;\n alt = this.options.customView.relativePosition.alt;\n destination = Cesium.Cartesian3.fromDegrees(lng, lat, alt);\n position = {\n lng: 0,\n lat: 0\n };\n if (this.options.position) {\n position = _objectSpread({}, this.options.position);\n } else if (this.options.positions) {\n position = _objectSpread({}, this.options.positions[0]);\n } else if (this.options.center) {\n position = _objectSpread({}, this.options.center);\n } else if (this.options.start) {\n position = _objectSpread({}, this.options.start);\n } else {\n if (this.options.hasOwnProperty('lng')) {\n position.lng = this.options.lng;\n }\n if (this.options.hasOwnProperty('lat')) {\n position.lat = this.options.lat;\n }\n if (this.options.hasOwnProperty('alt')) {\n position.alt = this.options.alt;\n }\n }\n // 如果没有高度值,则获取紧贴高度计算\n if (position.hasOwnProperty('alt')) {\n _context3.next = 18;\n break;\n }\n _context3.next = 17;\n return this.getClampToHeight(position);\n case 17:\n position.alt = _context3.sent;\n case 18:\n lng = this.options.customView.relativePosition.lng + position.lng;\n lat = this.options.customView.relativePosition.lat + position.lat;\n alt = this.options.customView.relativePosition.alt + position.alt;\n destination = Cesium.Cartesian3.fromDegrees(lng, lat, alt);\n this.sdk.viewer.camera.flyTo({\n destination: destination,\n orientation: orientation\n });\n _context3.next = 51;\n break;\n case 25:\n positionArray = [];\n _context3.t0 = this.heightMode;\n _context3.next = _context3.t0 === 0 ? 29 : _context3.t0 === '0' ? 29 : _context3.t0 === 1 ? 31 : _context3.t0 === '1' ? 31 : _context3.t0 === 2 ? 33 : _context3.t0 === '2' ? 33 : 35;\n break;\n case 29:\n ground = false;\n return _context3.abrupt(\"break\", 35);\n case 31:\n ground = false;\n return _context3.abrupt(\"break\", 35);\n case 33:\n ground = true;\n return _context3.abrupt(\"break\", 35);\n case 35:\n if (!ground) {\n _context3.next = 48;\n break;\n }\n i = 0;\n case 37:\n if (!(i < this.options.positions.length)) {\n _context3.next = 46;\n break;\n }\n _context3.next = 40;\n return this.getClampToHeight(this.options.positions[i]);\n case 40:\n height = _context3.sent;\n a = Cesium.Cartesian3.fromDegrees(this.options.positions[i].lng, this.options.positions[i].lat, height);\n positionArray.push(a.x, a.y, a.z);\n case 43:\n i++;\n _context3.next = 37;\n break;\n case 46:\n _context3.next = 49;\n break;\n case 48:\n if (this.positionsH) {\n for (_i9 = 0; _i9 < this.positionsH.length; _i9++) {\n positionArray.push(this.positionsH[_i9].x, this.positionsH[_i9].y, this.positionsH[_i9].z);\n }\n }\n case 49:\n BoundingSphere = Cesium.BoundingSphere.fromVertices(positionArray);\n this.sdk.viewer.camera.flyToBoundingSphere(BoundingSphere, {\n offset: options.orientation || {\n heading: Cesium.Math.toRadians(0.0),\n pitch: Cesium.Math.toRadians(-90.0),\n roll: Cesium.Math.toRadians(0.0)\n }\n });\n case 51:\n case \"end\":\n return _context3.stop();\n }\n }, _callee3, this);\n }));\n function flyTo() {\n return _flyTo.apply(this, arguments);\n }\n return flyTo;\n }()\n /**\r\n * 打开富文本框\r\n */\n )\n }, {\n key: \"openRichTextEditor\",\n value: function openRichTextEditor(e) {\n var _this13 = this;\n // var ue = UE.getEditor('app');\n _Element_richText__WEBPACK_IMPORTED_MODULE_11__[\"default\"].open(this.options.id, this.options.name, this.options.richTextContent);\n _Element_richText__WEBPACK_IMPORTED_MODULE_11__[\"default\"].primaryCallBack = function (content) {\n _this13.options.richTextContent = content;\n };\n }\n\n /**@desc 打开平移功能\r\n *\r\n * @memberOf Source\r\n * @param status {boolean}\r\n *\r\n * */\n }, {\n key: \"positionEditing\",\n get: function get() {\n return this.operate.positionEditing;\n },\n set: function set(status) {\n var _this14 = this;\n if (YJ.Measure.GetMeasureStatus() || !this.sdk || !this.sdk.viewer || !this.entity || !this.entity.polygon) {\n return;\n }\n var _this = this;\n this.event && this.event.destroy();\n this.event = new _Event_index__WEBPACK_IMPORTED_MODULE_15__[\"default\"](this.sdk);\n this.operate.positionEditing = status;\n if (status === true) {\n var _Cesium$Cartesian;\n this.previous = {\n positions: _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(this.positions)\n };\n this.tip && this.tip.destroy();\n this.tip = new _MouseTip__WEBPACK_IMPORTED_MODULE_16__[\"default\"]('点击鼠标左键确认,右键取消', this.sdk);\n this.label && (this.label.entity.billboard.color = Cesium.Color.fromCssColorString(\"rgba(255,255,255,0.9)\"));\n this.picking = false;\n var array = [];\n var positions = _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(this.positions);\n var disparity = [];\n for (var i = 0; i < positions.length; i++) {\n var position = this.cartesian3Towgs84(positions[i], this.sdk.viewer);\n array.push([position.lng, position.lat]);\n }\n var firstposition = this.cartesian3Towgs84(positions[0], this.sdk.viewer);\n array.push([firstposition.lng, firstposition.lat]);\n var polygon = turf.polygon([array]);\n var centroid = turf.centroid(polygon);\n var center = (_Cesium$Cartesian = Cesium.Cartesian3).fromDegrees.apply(_Cesium$Cartesian, _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(centroid.geometry.coordinates));\n for (var _i10 = 0; _i10 < positions.length; _i10++) {\n center.x - positions[_i10].x;\n disparity.push({\n x: center.x - positions[_i10].x,\n y: center.y - positions[_i10].y,\n z: center.z - positions[_i10].z\n });\n }\n var newpositions = [];\n this.event.mouse_move(function (movement, cartesian) {\n var position84 = _this14.cartesian3Towgs84(cartesian, _this14.sdk.viewer);\n newpositions = [];\n for (var _i11 = 0; _i11 < disparity.length; _i11++) {\n newpositions.push({\n x: cartesian.x - disparity[_i11].x,\n y: cartesian.y - disparity[_i11].y,\n z: cartesian.z - disparity[_i11].z\n });\n }\n // this.label.position = [position84.lng, position84.lat, position84.alt]\n _this14.tip.setPosition(cartesian, movement.endPosition.x, movement.endPosition.y);\n });\n this.event.mouse_left(function (movement, cartesian) {\n _this14.event.mouse_move(function () {});\n _this14.event.mouse_left(function () {});\n _this14.event.mouse_right(function () {});\n _this14.event.gesture_pinck_start(function () {});\n newpositions = [];\n for (var _i12 = 0; _i12 < disparity.length; _i12++) {\n var pos3 = {\n x: cartesian.x - disparity[_i12].x,\n y: cartesian.y - disparity[_i12].y,\n z: cartesian.z - disparity[_i12].z\n };\n newpositions.push(pos3);\n _this14.options.positions[_i12] = _this14.cartesian3Towgs84(pos3, _this14.sdk.viewer);\n if (_this14._elms.lng && _this14._elms.lng[_i12]) {\n _this14._elms.lng[_i12].innerHTML = _this14.options.positions[_i12].lng.toFixed(8);\n }\n if (_this14._elms.lat && _this14._elms.lat[_i12]) {\n _this14._elms.lat[_i12].innerHTML = _this14.options.positions[_i12].lat.toFixed(8);\n }\n }\n _this14.positions = newpositions;\n _this14.previous = null;\n _this14.positionEditing = false;\n if (_this14._positionEditingCallback) {\n _this14._positionEditingCallback();\n _this14._positionEditingCallback = null;\n }\n });\n this.event.mouse_right(function (movement, cartesian) {\n _this14.positionEditing = false;\n });\n this.event.gesture_pinck_start(function (movement, cartesian) {\n var startTime = new Date();\n _this14.event.gesture_pinck_end(function () {\n var endTime = new Date();\n if (endTime - startTime >= 500) {\n // 长按取消\n _this14.positionEditing = false;\n } else {\n _this14.event.mouse_move(function () {});\n _this14.event.mouse_left(function () {});\n _this14.event.mouse_right(function () {});\n _this14.event.gesture_pinck_start(function () {});\n newpositions = [];\n for (var _i13 = 0; _i13 < disparity.length; _i13++) {\n var pos3 = {\n x: cartesian.x - disparity[_i13].x,\n y: cartesian.y - disparity[_i13].y,\n z: cartesian.z - disparity[_i13].z\n };\n newpositions.push(pos3);\n _this14.options.positions[_i13] = _this14.cartesian3Towgs84(pos3, _this14.sdk.viewer);\n if (_this14._elms.lng && _this14._elms.lng[_i13]) {\n _this14._elms.lng[_i13].innerHTML = _this14.options.positions[_i13].lng.toFixed(8);\n }\n if (_this14._elms.lat && _this14._elms.lat[_i13]) {\n _this14._elms.lat[_i13].innerHTML = _this14.options.positions[_i13].lat.toFixed(8);\n }\n }\n _this14.positions = newpositions;\n _this14.previous = {\n positions: _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(_this14.positions)\n };\n _this14.positionEditing = false;\n }\n });\n });\n this.entity.polygon.hierarchy = new Cesium.CallbackProperty(function () {\n var position84 = [];\n if (newpositions.length > 0) {\n for (var _i14 = 0; _i14 < newpositions.length; _i14++) {\n position84.push(_this.cartesian3Towgs84(newpositions[_i14], _this.sdk.viewer));\n }\n } else {\n for (var _i15 = 0; _i15 < positions.length; _i15++) {\n position84.push(_this.cartesian3Towgs84(positions[_i15], _this.sdk.viewer));\n }\n }\n _this.renewPositions(position84);\n return new Cesium.PolygonHierarchy(_this.positionsH);\n }, false);\n this.entity.polyline.positions = new Cesium.CallbackProperty(function () {\n return [].concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(_this.positionsH), [_this.positionsH[0], _this.positionsH[1]]);\n }, false);\n } else {\n if (this.label && this.label.entity && this.label.entity.billboard) {\n this.label.entity.billboard.color = Cesium.Color.fromCssColorString(\"rgba(255,255,255,1)\");\n }\n this.picking = true;\n if (this.event) {\n this.event.mouse_move(function () {});\n this.event.mouse_left(function () {});\n this.event.mouse_right(function () {});\n this.event.gesture_pinck_start(function () {});\n this.event.destroy();\n }\n this.tip && this.tip.destroy();\n if (!this.previous) {\n this.previous = {\n positions: _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(this.positions)\n };\n } else {\n this.positions = _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(this.previous.positions);\n }\n var position84 = [];\n for (var _i16 = 0; _i16 < this.positions.length; _i16++) {\n position84.push(_this.cartesian3Towgs84(this.positions[_i16], _this.sdk.viewer));\n }\n this.renewPositions(position84);\n this.entity.polygon.hierarchy = new Cesium.CallbackProperty(function () {\n return new Cesium.PolygonHierarchy(_this.positionsH);\n }, true);\n this.entity.polyline.positions = new Cesium.CallbackProperty(function () {\n return [].concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(_this.positionsH), [_this.positionsH[0], _this.positionsH[1]]);\n }, true);\n }\n }\n }, {\n key: \"openPositionEditing\",\n value: function openPositionEditing(cd) {\n this.positionEditing = true;\n this._positionEditingCallback = cd;\n }\n }, {\n key: \"areaChangeCallBack\",\n get: function get() {\n return this._areaChangeCallBack;\n },\n set: function set(cd) {\n this._areaChangeCallBack = cd;\n }\n }, {\n key: \"nodeEdit\",\n value: function nodeEdit() {\n var _this16 = this;\n var cb = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function () {};\n this.positionEditing = false;\n if (YJ.Measure.GetMeasureStatus()) {\n cb('上一次测量未结束');\n } else {\n var createNodePoints = /*#__PURE__*/function () {\n var _ref = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee4() {\n var objectsToExclude, _i18, height, entity;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee4$(_context4) {\n while (1) switch (_context4.prev = _context4.next) {\n case 0:\n objectsToExclude = _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(_this15.sdk.viewer.entities.values);\n _i18 = 0;\n case 2:\n if (!(_i18 < _this15.options.positions.length)) {\n _context4.next = 11;\n break;\n }\n _context4.next = 5;\n return _this15.getClampToHeight(_this15.options.positions[_i18], objectsToExclude);\n case 5:\n height = _context4.sent;\n entity = _this15.sdk.viewer.entities.add({\n name: 'node-secondary-edit-point',\n index: _i18,\n position: Cesium.Cartesian3.fromDegrees(_this15.options.positions[_i18].lng, _this15.options.positions[_i18].lat, height),\n billboard: {\n image: _this15.getSourceRootPath() + '/img/point.png',\n width: 15,\n height: 15,\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\n color: Cesium.Color.WHITE.withAlpha(0.99)\n }\n });\n _this15.nodePoints.push(entity);\n case 8:\n _i18++;\n _context4.next = 2;\n break;\n case 11:\n case \"end\":\n return _context4.stop();\n }\n }, _callee4);\n }));\n return function createNodePoints() {\n return _ref.apply(this, arguments);\n };\n }(); // for (let i = 0; i < this.options.positions.length; i++) {\n // let entity = this.sdk.viewer.entities.add({\n // name: 'node-secondary-edit-point',\n // index: i,\n // position: Cesium.Cartesian3.fromDegrees(this.options.positions[i].lng, this.options.positions[i].lat),\n // billboard: {\n // image: this.getSourceRootPath() + '/img/point.png',\n // width: 15,\n // height: 15,\n // disableDepthTestDistance: Number.POSITIVE_INFINITY,\n // },\n // })\n // nodePoints.push(entity)\n // }\n YJ.Measure.SetMeasureStatus(true);\n var _this15 = this;\n this.tip = new _MouseTip__WEBPACK_IMPORTED_MODULE_16__[\"default\"]('请选择一个顶点,右键取消', this.sdk);\n this.event = new _Event_index__WEBPACK_IMPORTED_MODULE_15__[\"default\"](this.sdk);\n this.nodePoints = [];\n var selectPoint;\n var originalPosition;\n var fromDegreesArray = [];\n for (var i = 0; i < this.options.positions.length; i++) {\n fromDegreesArray.push(this.options.positions[i].lng, this.options.positions[i].lat);\n }\n var moveEvent = function moveEvent(movement, cartesian) {\n if (selectPoint) {\n _this16.options.positions[selectPoint.index] = _this16.cartesian3Towgs84(cartesian, _this16.sdk.viewer);\n if (_this16._elms.lng && _this16._elms.lng[selectPoint.index]) {\n _this16._elms.lng[selectPoint.index].innerHTML = _this16.options.positions[selectPoint.index].lng.toFixed(8);\n }\n if (_this16._elms.lat && _this16._elms.lat[selectPoint.index]) {\n _this16._elms.lat[selectPoint.index].innerHTML = _this16.options.positions[selectPoint.index].lat.toFixed(8);\n }\n _this16.renewPositions();\n }\n _this16.tip.setPosition(cartesian, movement.position ? movement.position.x : movement.endPosition.x, movement.position ? movement.position.y : movement.endPosition.y);\n };\n var leftEvent = function leftEvent(movement, cartesian) {\n moveEvent(movement, cartesian);\n var position84 = _this16.cartesian3Towgs84(cartesian, _this16.sdk.viewer);\n if (selectPoint) {\n var index = selectPoint.index;\n var entity = _this16.sdk.viewer.entities.add({\n name: 'node-secondary-edit-point',\n index: index,\n position: Cesium.Cartesian3.fromDegrees(_this16.options.positions[selectPoint.index].lng, _this16.options.positions[selectPoint.index].lat, position84.alt),\n billboard: {\n image: _this16.getSourceRootPath() + '/img/point.png',\n width: 15,\n height: 15,\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\n color: Cesium.Color.WHITE.withAlpha(0.99)\n }\n });\n _this16.nodePoints.splice(selectPoint.index, 0, entity);\n selectPoint = null;\n _this16.tip.set_text('请选择一个顶点,右键取消');\n } else {\n var _position = movement.position;\n if (!_position) {\n _position = {\n x: (movement.position1.x + movement.position2.x) / 2,\n y: (movement.position1.y + movement.position2.y) / 2\n };\n }\n var pick = _this16.sdk.viewer.scene.pick(_position);\n if (pick && pick.id && pick.id.name && pick.id.name === 'node-secondary-edit-point') {\n selectPoint = pick.id;\n originalPosition = _this16.cartesian3Towgs84(pick.id.position.getValue(), _this16.sdk.viewer);\n _this16.nodePoints.splice(pick.id.index, 1);\n _this16.sdk.viewer.entities.remove(pick.id);\n _this16.tip.set_text('左键确认,右键取消');\n }\n }\n _this16.renewPositions();\n cb('', _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(_this16.options.positions));\n };\n var rightEvent = function rightEvent() {\n _this16.event.mouse_move(function () {});\n _this16.event.mouse_left(function () {});\n _this16.event.mouse_right(function () {});\n _this16.event.gesture_pinck_start(function () {});\n if (selectPoint) {\n if (!originalPosition) {\n _this16.options.positions.pop();\n } else {\n _this16.options.positions[selectPoint.index] = originalPosition;\n }\n if (_this16._elms.lng && _this16._elms.lng[selectPoint.index]) {\n _this16._elms.lng[selectPoint.index].innerHTML = _this16.options.positions[selectPoint.index].lng.toFixed(8);\n }\n if (_this16._elms.lat && _this16._elms.lat[selectPoint.index]) {\n _this16._elms.lat[selectPoint.index].innerHTML = _this16.options.positions[selectPoint.index].lat.toFixed(8);\n }\n }\n _this16.heightMode = _this16.heightMode;\n _this16.previous = null;\n };\n this.entity.polyline.clampToGround = true;\n this.entity.polyline.arcType = Cesium.ArcType.GEODESIC;\n this.entity.polygon.perPositionHeight = false;\n this.entity.polygon.hierarchy = new Cesium.CallbackProperty(function () {\n var arr = _this15.computeAssemble(_this15.options.positions);\n return new Cesium.PolygonHierarchy(arr);\n }, false);\n this.entity.polyline.positions = new Cesium.CallbackProperty(function () {\n var arr = _this15.computeAssemble(_this15.options.positions);\n if (arr.length >= 3) {\n return [].concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(arr), [arr[0], arr[1]]);\n } else {\n return _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(arr);\n }\n }, false);\n var points = [[]];\n var pos84 = [];\n for (var _i17 = 0; _i17 < this.positionsH.length; _i17++) {\n var _position2 = this.cartesian3Towgs84(this.positionsH[_i17], this.sdk.viewer);\n pos84.push(_position2);\n points[0].push([_position2.lng, _position2.lat]);\n }\n var position = this.cartesian3Towgs84(this.positionsH[0], this.sdk.viewer);\n points[0].push([position.lng, position.lat]);\n var polygon = turf.polygon(points);\n var centroid = turf.pointOnFeature(polygon);\n var objectsToExclude = _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(this.sdk.viewer.entities.values);\n this.getClampToHeight({\n lng: centroid.geometry.coordinates[0],\n lat: centroid.geometry.coordinates[1]\n }, objectsToExclude).then(function (height) {\n _this16.label.position = [centroid.geometry.coordinates[0], centroid.geometry.coordinates[1], height];\n });\n setTimeout(function () {\n _this16.event.mouse_left(leftEvent);\n _this16.event.mouse_right(rightEvent);\n _this16.event.mouse_move(moveEvent);\n _this16.event.gesture_pinck_start(function (movement, cartesian) {\n var startTime = new Date();\n _this16.event.gesture_pinck_end(function () {\n var endTime = new Date();\n var pos = {\n position: {\n x: (movement.position1.x + movement.position2.x) / 2,\n y: (movement.position1.y + movement.position2.y) / 2\n }\n };\n if (endTime - startTime >= 500) {\n rightEvent();\n } else {\n leftEvent(pos, cartesian);\n }\n });\n });\n createNodePoints();\n }, 200);\n }\n }\n }, {\n key: \"closeNodeEdit\",\n value: function closeNodeEdit() {\n YJ.Measure.SetMeasureStatus(false);\n this.event && this.event.destroy();\n this.tip && this.tip.destroy();\n this.tip = null;\n for (var i = 0; i < this.nodePoints.length; i++) {\n this.sdk.viewer.entities.remove(this.nodePoints[i]);\n }\n this.nodePoints = [];\n this.picking = true;\n }\n }, {\n key: \"setPosition\",\n value: function setPosition(v) {\n var _Cesium$Cartesian2;\n var cartesian = Cesium.Cartesian3.fromDegrees(v.position.lng, v.position.lat, v.position.alt);\n var positions = _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(this.positions);\n var array = [];\n var disparity = [];\n for (var i = 0; i < positions.length; i++) {\n var position = this.cartesian3Towgs84(positions[i], this.sdk.viewer);\n array.push([position.lng, position.lat]);\n }\n var firstposition = this.cartesian3Towgs84(positions[0], this.sdk.viewer);\n array.push([firstposition.lng, firstposition.lat]);\n var polygon = turf.polygon([array]);\n var centroid = turf.centroid(polygon);\n var center = (_Cesium$Cartesian2 = Cesium.Cartesian3).fromDegrees.apply(_Cesium$Cartesian2, _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(centroid.geometry.coordinates));\n for (var _i19 = 0; _i19 < positions.length; _i19++) {\n disparity.push({\n x: center.x - positions[_i19].x,\n y: center.y - positions[_i19].y,\n z: center.z - positions[_i19].z\n });\n }\n var newpositions = [];\n for (var _i20 = 0; _i20 < disparity.length; _i20++) {\n newpositions.push({\n x: cartesian.x - disparity[_i20].x,\n y: cartesian.y - disparity[_i20].y,\n z: cartesian.z - disparity[_i20].z\n });\n }\n this.label.position = [v.position.lng, v.position.lat, v.position.alt];\n var positions84 = [];\n if (newpositions.length > 0) {\n for (var _i21 = 0; _i21 < newpositions.length; _i21++) {\n positions84.push(this.cartesian3Towgs84(newpositions[_i21], this.sdk.viewer));\n }\n }\n var arr = this.computeAssemble(positions84);\n if (arr.length == 0) {\n return;\n }\n this.entity.polygon.hierarchy = new Cesium.CallbackProperty(function () {\n return new Cesium.PolygonHierarchy(arr);\n }, false);\n this.entity.polyline.positions = new Cesium.CallbackProperty(function () {\n if (arr.length >= 3) {\n return [].concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(arr), [arr[0], arr[1]]);\n } else {\n return _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(arr);\n }\n }, false);\n }\n }, {\n key: \"setDIV\",\n value: function setDIV() {\n var _this17 = this;\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {\n domid: \"\",\n x: 10,\n y: 10\n };\n options.x = options.x || options.x === 0 ? options.x : 10;\n options.y = options.y || options.y === 0 ? options.y : 10;\n var positions = this.computeAssemble(this.options.positions);\n if (positions.length == 0) {\n return;\n }\n var points = [[]];\n for (var i = 0; i < positions.length; i++) {\n var _position3 = this.cartesian3Towgs84(positions[i], this.sdk.viewer);\n points[0].push([_position3.lng, _position3.lat]);\n }\n var position = this.cartesian3Towgs84(positions[0], this.sdk.viewer);\n points[0].push([position.lng, position.lat]);\n var polygon = turf.polygon(points);\n // let centroid = turf.centroid(polygon);\n var centroid = turf.pointOnFeature(polygon);\n var siteInfoDom = document.getElementById(options.domid);\n var siteInfoPosition = Cesium.Cartesian3.fromDegrees(centroid.geometry.coordinates[0], centroid.geometry.coordinates[1]);\n this.sdk.viewer.scene.postRender.addEventListener(function (percentage) {\n //转换到屏幕坐标\n if (siteInfoDom.style.display === 'block' || siteInfoDom.style.display === '') {\n var winpos = _this17.sdk.viewer.scene.cartesianToCanvasCoordinates(siteInfoPosition);\n if (winpos) {\n siteInfoDom.style.left = (winpos.x + options.x).toFixed(0) + 'px';\n siteInfoDom.style.top = (winpos.y + options.y).toFixed(0) + 'px';\n }\n }\n });\n }\n\n // 更新坐标\n }, {\n key: \"renewPositions\",\n value: function renewPositions(position84, cd) {\n var _this18 = this;\n if (this._error || !this.sdk.viewer) {\n return;\n }\n var ground = false;\n var array = [];\n var positions = this.options.positions;\n if (position84) {\n positions = position84;\n }\n var fromDegreesArray = [];\n for (var i = 0; i < positions.length; i++) {\n fromDegreesArray.push(positions[i].lng, positions[i].lat);\n }\n this.positions = Cesium.Cartesian3.fromDegreesArray(fromDegreesArray);\n var positionsA = this.computeAssemble(positions);\n if (positionsA.length == 0) {\n return;\n }\n var points = [[]];\n var pos84 = [];\n for (var _i22 = 0; _i22 < positionsA.length; _i22++) {\n var _position4 = this.cartesian3Towgs84(positionsA[_i22], this.sdk.viewer);\n pos84.push(_position4);\n points[0].push([_position4.lng, _position4.lat]);\n }\n var position = this.cartesian3Towgs84(positionsA[0], this.sdk.viewer);\n points[0].push([position.lng, position.lat]);\n var height = 0;\n var polygon = turf.polygon(points);\n var centroid = turf.pointOnFeature(polygon);\n switch (this.options.heightMode) {\n case '0':\n case 0:\n ground = false;\n break;\n case '1':\n case 1:\n height = this.sdk.viewer.scene.globe.getHeight(Cesium.Cartographic.fromDegrees(centroid.geometry.coordinates[0], centroid.geometry.coordinates[1])) || 0;\n ground = false;\n break;\n case '2':\n case 2:\n ground = true;\n break;\n }\n var fromDegreesArray2 = [];\n if (!ground && this.nodePoints.length == 0) {\n for (var _i23 = 0; _i23 < points[0].length; _i23++) {\n fromDegreesArray2.push(points[0][_i23][0], points[0][_i23][1], this.height + height);\n }\n this.positionsH = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray2);\n this.label && (this.label.position = [centroid.geometry.coordinates[0], centroid.geometry.coordinates[1], this.height + height]);\n } else {\n this.positionsH = positionsA;\n setTimeout(function () {\n if (!_this18.sdk.viewer) {\n return;\n }\n var objectsToExclude = _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(_this18.sdk.viewer.entities.values);\n _this18.getClampToHeight({\n lng: centroid.geometry.coordinates[0],\n lat: centroid.geometry.coordinates[1]\n }, objectsToExclude).then(function (height) {\n _this18.label && (_this18.label.position = [centroid.geometry.coordinates[0], centroid.geometry.coordinates[1], height]);\n });\n }, 100);\n }\n\n // 计算投影面积\n this.areaByMeter = this.computeArea(pos84);\n this.areaChangeCallBack && this.areaChangeCallBack();\n return fromDegreesArray;\n }\n }], [{\n key: \"create\",\n value: function create(that) {\n var positions = that.options.positions;\n var fromDegreesArray = [];\n for (var i = 0; i < positions.length; i++) {\n fromDegreesArray.push(positions[i].lng, positions[i].lat);\n }\n that.positions = Cesium.Cartesian3.fromDegreesArray(fromDegreesArray);\n var positionsA = that.computeAssemble(that.options.positions);\n if (positionsA.length == 0) {\n return;\n }\n var points = [[]];\n for (var _i24 = 0; _i24 < positionsA.length; _i24++) {\n var _position5 = that.cartesian3Towgs84(positionsA[_i24], that.sdk.viewer);\n points[0].push([_position5.lng, _position5.lat]);\n }\n var position = that.cartesian3Towgs84(positionsA[0], that.sdk.viewer);\n points[0].push([position.lng, position.lat]);\n var polygon = turf.polygon(points);\n // let centroid = turf.centroid(polygon);\n var centroid = turf.pointOnFeature(polygon);\n var ground;\n var height = 0;\n switch (that.options.heightMode) {\n case '0':\n case 0:\n ground = false;\n break;\n case '1':\n case 1:\n height = that.sdk.viewer.scene.globe.getHeight(Cesium.Cartographic.fromDegrees(centroid.geometry.coordinates[0], centroid.geometry.coordinates[1])) || 0;\n ground = false;\n break;\n case '2':\n case 2:\n ground = true;\n break;\n }\n\n // if (!that.options.label.position) {\n // that.options.label.position = { lng: centroid.geometry.coordinates[0], lat: centroid.geometry.coordinates[1], alt: that.height + height }\n // }\n that.options.label.position = {\n lng: centroid.geometry.coordinates[0],\n lat: centroid.geometry.coordinates[1],\n alt: that.height + height\n };\n var fromDegreesArray2 = [];\n for (var _i25 = 0; _i25 < points[0].length; _i25++) {\n fromDegreesArray2.push(points[0][_i25][0], points[0][_i25][1], that.height + height);\n }\n var material = Cesium.Color.fromCssColorString(that.options.color);\n if (that.sdk.viewer.scene.mode === 2) {\n ground = false;\n material = new Cesium.CustomColorMaterialSource({\n color: that.options.color\n });\n }\n // that.options.label.ground = ground\n that.positionsH = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray2);\n that.entity = that.sdk.viewer.entities.add({\n show: that.options.show,\n id: that.options.id,\n polygon: {\n hierarchy: !ground ? new Cesium.PolygonHierarchy(that.positionsH) : new Cesium.PolygonHierarchy(positionsA),\n perPositionHeight: !ground ? true : false,\n material: material,\n zIndex: that.sdk._entityZIndex\n },\n polyline: {\n positions: [].concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(that.positionsH), [that.positionsH[0], that.positionsH[1]]),\n width: that.options.line.width,\n material: Cesium.Color.fromCssColorString(that.options.line.color),\n clampToGround: !ground ? false : true,\n arcType: !ground ? Cesium.ArcType.NONE : Cesium.ArcType.GEODESIC,\n zIndex: that.sdk._entityZIndex\n }\n });\n that.sdk._entityZIndex++;\n AssembleObject.createLabel(that);\n var pos84 = [];\n for (var _i26 = 0; _i26 < positionsA.length; _i26++) {\n pos84.push(that.cartesian3Towgs84(positionsA[_i26], that.sdk.viewer));\n }\n that.areaByMeter = that.computeArea(pos84);\n that.areaChangeCallBack && that.areaChangeCallBack();\n Object(_Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_17__[\"syncData\"])(that.sdk, that.options.id);\n if (that.options.show) {\n Object(_Global_SplitScreen__WEBPACK_IMPORTED_MODULE_20__[\"setSplitDirection\"])(0, that.options.id);\n }\n }\n }, {\n key: \"createLabel\",\n value: function () {\n var _createLabel = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee5(that) {\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee5$(_context5) {\n while (1) switch (_context5.prev = _context5.next) {\n case 0:\n // 标签\n that.label = new _LabelObject__WEBPACK_IMPORTED_MODULE_14__[\"default\"](that.sdk, {\n id: that.options.id,\n show: that.options.show ? that.options.label.show : false,\n position: [that.options.label.position.lng, that.options.label.position.lat, that.options.label.position.alt],\n text: that.options.name,\n fontSize: that.options.label.fontSize,\n fontFamily: that.options.label.fontFamily,\n color: that.options.label.color,\n pixelOffset: that.options.label.pixelOffset,\n backgroundColor: that.options.label.backgroundColor,\n lineWidth: that.options.label.lineWidth,\n lineColor: that.options.label.lineColor,\n scaleByDistance: that.options.label.scaleByDistance,\n near: that.options.label.near,\n far: that.options.label.far\n // ground: that.options.label.ground,\n });\n case 1:\n case \"end\":\n return _context5.stop();\n }\n }, _callee5);\n }));\n function createLabel(_x2) {\n return _createLabel.apply(this, arguments);\n }\n return createLabel;\n }()\n }]);\n}(_index__WEBPACK_IMPORTED_MODULE_13__[\"default\"]);\n/* harmony default export */ __webpack_exports__[\"default\"] = (AssembleObject);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvT2JqL0Jhc2UvQXNzZW1ibGVPYmplY3QvaW5kZXguanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvT2JqL0Jhc2UvQXNzZW1ibGVPYmplY3QvaW5kZXguanM/MTRmYiJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICog6ZuG57uT5ZywXHJcbiAqL1xyXG5pbXBvcnQgRGlhbG9nIGZyb20gJy4uLy4uL0VsZW1lbnQvRGlhbG9nJztcclxuaW1wb3J0IGN5X3RhYnMgZnJvbSBcIi4uLy4uL0VsZW1lbnQvY3lfaHRtbF90YWJzXCI7XHJcbmltcG9ydCByaWNoVGV4dCBmcm9tIFwiLi4vLi4vRWxlbWVudC9yaWNoVGV4dFwiO1xyXG5pbXBvcnQgeyBodG1sIH0gZnJvbSBcIi4vX2VsZW1lbnRcIjtcclxuaW1wb3J0IEJhc2UgZnJvbSBcIi4uL2luZGV4XCI7XHJcbmltcG9ydCBMYWJlbE9iamVjdCBmcm9tICcuLi9MYWJlbE9iamVjdCdcclxuaW1wb3J0IE1vdXNlRXZlbnQgZnJvbSAnLi4vLi4vLi4vRXZlbnQvaW5kZXgnXHJcbmltcG9ydCBNb3VzZVRpcCBmcm9tICcuLi8uLi8uLi9Nb3VzZVRpcCdcclxuaW1wb3J0IHsgc3luY0RhdGEgfSBmcm9tICcuLi8uLi8uLi9HbG9iYWwvTXVsdGlWaWV3cG9ydE1vZGUnXHJcbmltcG9ydCB7IGxlZ3AgfSBmcm9tICcuLi8uLi9FbGVtZW50L2RhdGFsaXN0JztcclxuaW1wb3J0IHsgZ2V0Rm9udExpc3QsIGdldEZvbnRGYW1pbHlOYW1lIH0gZnJvbSAnLi4vLi4vRWxlbWVudC9mb250U2VsZWN0J1xyXG5pbXBvcnQgeyBzZXRTcGxpdERpcmVjdGlvbiwgc3luY1NwbGl0RGF0YSwgc2V0QWN0aXZlSWQgfSBmcm9tICcuLi8uLi8uLi9HbG9iYWwvU3BsaXRTY3JlZW4nXHJcbmltcG9ydCB7IHNldEFjdGl2ZVZpZXdlciwgY2xvc2VSb3RhdGVBcm91bmQsIGNsb3NlVmlld0ZvbGxvdyB9IGZyb20gJy4uLy4uLy4uL0dsb2JhbC9nbG9iYWwnXHJcbi8vIGltcG9ydCBFZGl0UGFydGljbGUgZnJvbSBcIi4uLy4uL01vZGVsQ29udHJvbGxlci9FZGl0UGFydGljbGVcIjtcclxuXHJcbmNsYXNzIEFzc2VtYmxlT2JqZWN0IGV4dGVuZHMgQmFzZSB7XHJcbiAgLyoqXHJcbiAgICogQGNvbnN0cnVjdG9yXHJcbiAgICogQHBhcmFtIHNka1xyXG4gICAqIEBkZXNjcmlwdGlvbiDpm4bnu5PlnLBcclxuICAgKiBAcGFyYW0gb3B0aW9ucyB7b2JqZWN0fSDlsZ7mgKdcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5pZCB7c3RyaW5nfSDllK/kuIDmoIfor4ZcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5zaG93PXRydWUge2Jvb2xlYW59IOaYvuekui/pmpDol49cclxuICAgKiBAcGFyYW0gb3B0aW9ucy5uYW1lIHtzdHJpbmd9IOWQjeensFxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmNvbG9yPSdyZ2JhKDI1NSwgMCwgMCwgMC41KScge3N0cmluZ30g6aKc6ImyXHJcbiAgICogQHBhcmFtIG9wdGlvbnMuaGVpZ2h0IHtudW1iZXJ9IOmrmOW6plxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmhlaWdodE1vZGU9MntudW1iZXJ9IOmrmOW6puaooeW8j++8iDDvvJrmtbfmi5Tpq5jluqbvvJsx77ya55u45a+55Zyw6KGo77ybMu+8muS+nemZhOaooeW8j++8iVxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxpbmUge29iamVjdH0g6L655qGGXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGluZS53aWR0aD0yIHtzdHJpbmd9IOi+ueahhuWuvVxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxpbmUuY29sb3I9XCJyZ2JhKDE1NSwgMTU1LCAxMjQsIDAuODkpXCIge3N0cmluZ30g6L655qGG6aKc6ImyXHJcbiAgICogQHBhcmFtIHtBcnJheS48b2JqZWN0Pn0gb3B0aW9ucy5wb3NpdGlvbnMg5b+F5aGr77yM57uP57qs5bqm5ZKM6auY5bqm55qE5YiX6KGo77yM5YC85Lqk5pu/IFt7bG9uLGxhdCxhbHR9LC4uLl1cclxuICAgKiBAcGFyYW0gb3B0aW9ucy5wb3NpdGlvbnNbXS5sbmcge251bWJlcn0g57uP5bqmXHJcbiAgICogQHBhcmFtIG9wdGlvbnMucG9zaXRpb25zW10ubGF0IHtudW1iZXJ9IOe6rOW6plxyXG4gICAqIEBwYXJhbSBvcHRpb25zLnBvc2l0aW9uc1tdLmFsdCB7bnVtYmVyfSDpq5jluqZcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5sYWJlbCB7b2JqZWN0fSDmoIfnrb7lr7nosaFcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5sYWJlbC50ZXh0IHtzdHJpbmd9IOagh+etvuaWh+acrFxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLnNob3cge3N0cmluZ30g5qCH562+5pi+6ZqQXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwucG9zaXRpb24ge3N0cmluZ30g5qCH562+5L2N572uXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwucG9zaXRpb24ge29iamVjdH0g5qCH562+5L2N572uXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwucG9zaXRpb24ubG5nIHtudW1iZXJ9IOe7j+W6plxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLnBvc2l0aW9uLmxhdCB7bnVtYmVyfSDnuqzluqZcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5sYWJlbC5wb3NpdGlvbi5hbHQge251bWJlcn0g6auY5bqmXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwuZm9udFNpemU9MjAge251bWJlcn0g5a2X5L2T5aSn5bCPXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwuZm9udEZhbWlseT0wIHtudW1iZXJ9IOWtl+S9k+mhuSAw77ya6buR5L2T77ybMe+8muaAnea6kOm7keS9k++8mzLvvJrlup7pl6jmraPpgZPmoIfpopjkvZPvvJsz77ya5pWw6buR5L2TXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwuY29sb3I9I2ZmZmZmZiB7c3RyaW5nfSDlrZfkvZPpopzoibJcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5sYWJlbC5saW5lV2lkdGg9NCB7bnVtYmVyfSDlvJXnur/lrr1cclxuICAgKiBAcGFyYW0gb3B0aW9ucy5sYWJlbC5saW5lQ29sb3I9IzAwZmZmZjgwIHtzdHJpbmd9IOW8lee6v+minOiJslxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLnBpeGVsT2Zmc2V0PTIwIHtudW1iZXJ9IOWtl+S9k+WBj+enuyjlvJXnur/plb/luqYpXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwuYmFja2dyb3VuZENvbG9yPVsnIzAwZmZmZjgwJywgJyMwMGZmZmY4MCddIHthcnJheX0g6IOM5pmv6aKc6ImyXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwuc2NhbGVCeURpc3RhbmNlIHtib29sZWFufSDot53nprvnvKnmlL5cclxuICAgKiBAcGFyYW0gb3B0aW9ucy5sYWJlbC5uZWFyPTIwMDAge251bWJlcn0g6KeG6YeO57yp5pS+5pyA6L+R6Led56a7XHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwuZmFyPTEwMDAwMCB7bnVtYmVyfSDop4bph47nvKnmlL7mnIDov5zot53nprtcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5hdHRyaWJ1dGUge29iamVjdH0g5bGe5oCn5YaF5a65XHJcbiAgICogQHBhcmFtIG9wdGlvbnMuYXR0cmlidXRlLmxpbms9e30ge29iamVjdH0g6ZO+5o6lXHJcbiAgICogQHBhcmFtIG9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudD1bXV0ge2FycmF5fSDpk77mjqXlhoXlrrlcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50W10ubmFtZSB7c3RyaW5nfSDpk77mjqXlkI3np7BcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50W10udXJsIHtzdHJpbmd9IOmTvuaOpeWcsOWdgFxyXG4gICAqIEBwYXJhbSBvcHRpb25zLnJpY2hUZXh0Q29udGVudCB7c3RyaW5nfSDlr4zmlofmnKzlhoXlrrlcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5jdXN0b21WaWV3IHtvYmplY3R9IOm7mOiupOinhuinklxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmN1c3RvbVZpZXcub3JpZW50YXRpb24ge29iamVjdH0g6buY6K6k6KeG6KeS5pa55L2NXHJcbiAgICogQHBhcmFtIG9wdGlvbnMuY3VzdG9tVmlldy5vcmllbnRhdGlvbi5oZWFkaW5nIHtudW1iZXJ9IOiIquWQkeinklxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmN1c3RvbVZpZXcub3JpZW50YXRpb24ucGl0Y2gge251bWJlcn0g5L+v5Luw6KeSXHJcbiAgICogQHBhcmFtIG9wdGlvbnMuY3VzdG9tVmlldy5vcmllbnRhdGlvbi5yb2xsIHtudW1iZXJ9IOe/u+a7muinklxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmN1c3RvbVZpZXcucmVsYXRpdmVQb3NpdGlvbiB7b2JqZWN0fSDop4bop5Lnm7jlr7nkvY3nva5cclxuICAgKiBAcGFyYW0gb3B0aW9ucy5jdXN0b21WaWV3LnJlbGF0aXZlUG9zaXRpb24ubG5nIHtudW1iZXJ9IOe7j+W6plxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmN1c3RvbVZpZXcucmVsYXRpdmVQb3NpdGlvbi5sYXQge251bWJlcn0g57qs5bqmXHJcbiAgICogQHBhcmFtIG9wdGlvbnMuY3VzdG9tVmlldy5yZWxhdGl2ZVBvc2l0aW9uLmFsdCB7bnVtYmVyfSDpq5jluqZcclxuICAgKiAqL1xyXG4gIGNvbnN0cnVjdG9yKHNkaywgb3B0aW9ucyA9IHt9LCBfRGlhbG9nID0ge30pIHtcclxuICAgIHN1cGVyKHNkaywgb3B0aW9ucyk7XHJcbiAgICB0aGlzLm9wdGlvbnMubmFtZSA9IG9wdGlvbnMubmFtZSB8fCAn5pyq5ZG95ZCN5a+56LGhJ1xyXG4gICAgdGhpcy5vcHRpb25zLmNvbG9yID0gb3B0aW9ucy5jb2xvciB8fCBcIiNmZjAwMDA4MFwiXHJcbiAgICB0aGlzLm9wdGlvbnMuc2hvdyA9IChvcHRpb25zLnNob3cgfHwgb3B0aW9ucy5zaG93ID09PSBmYWxzZSkgPyBvcHRpb25zLnNob3cgOiB0cnVlXHJcbiAgICB0aGlzLm9wdGlvbnMuaGVpZ2h0TW9kZSA9IChvcHRpb25zLmhlaWdodE1vZGUgfHwgb3B0aW9ucy5oZWlnaHRNb2RlID09IDApID8gb3B0aW9ucy5oZWlnaHRNb2RlIDogMlxyXG4gICAgdGhpcy5vcHRpb25zLnBvc2l0aW9ucyA9IG9wdGlvbnMucG9zaXRpb25zIHx8IFtdXHJcbiAgICB0aGlzLm9wdGlvbnMubGluZSA9IG9wdGlvbnMubGluZSB8fCB7fVxyXG4gICAgdGhpcy5vcHRpb25zLmxpbmUud2lkdGggPSAoKHRoaXMub3B0aW9ucy5saW5lLndpZHRoIHx8IHRoaXMub3B0aW9ucy5saW5lLndpZHRoID09PSAwKSA/IHRoaXMub3B0aW9ucy5saW5lLndpZHRoIDogMylcclxuICAgIHRoaXMub3B0aW9ucy5saW5lLmNvbG9yID0gdGhpcy5vcHRpb25zLmxpbmUuY29sb3IgfHwgJ3JnYmEoMjU1LCAwLCAwLCAxKSdcclxuICAgIHRoaXMuZW50aXR5XHJcbiAgICB0aGlzLmV2ZW50ID0gbmV3IE1vdXNlRXZlbnQodGhpcy5zZGspXHJcbiAgICB0aGlzLm9wZXJhdGUgPSB7fVxyXG4gICAgdGhpcy5fZWxtcyA9IHt9O1xyXG4gICAgdGhpcy5EaWFsb2cgPSBfRGlhbG9nXHJcbiAgICBvcHRpb25zLmxhYmVsID0gb3B0aW9ucy5sYWJlbCB8fCB7fVxyXG4gICAgdGhpcy5vcHRpb25zLmxhYmVsID0ge1xyXG4gICAgICB0ZXh0OiB0aGlzLm9wdGlvbnMubmFtZSxcclxuICAgICAgc2hvdzogb3B0aW9ucy5sYWJlbC5zaG93IHx8IGZhbHNlLFxyXG4gICAgICBwb3NpdGlvbjogb3B0aW9ucy5sYWJlbC5wb3NpdGlvbixcclxuICAgICAgZm9udFNpemU6IChvcHRpb25zLmxhYmVsLmZvbnRTaXplIHx8IG9wdGlvbnMubGFiZWwuZm9udFNpemUgPT09IDApID8gb3B0aW9ucy5sYWJlbC5mb250U2l6ZSA6IDIwLFxyXG4gICAgICBmb250RmFtaWx5OiBvcHRpb25zLmxhYmVsLmZvbnRGYW1pbHkgPyBvcHRpb25zLmxhYmVsLmZvbnRGYW1pbHkgOiAwLFxyXG4gICAgICBjb2xvcjogb3B0aW9ucy5sYWJlbC5jb2xvciB8fCAnI2ZmZmZmZicsXHJcbiAgICAgIGxpbmVXaWR0aDogKG9wdGlvbnMubGFiZWwubGluZVdpZHRoIHx8IG9wdGlvbnMubGFiZWwubGluZVdpZHRoID09PSAwKSA/IG9wdGlvbnMubGFiZWwubGluZVdpZHRoIDogNCxcclxuICAgICAgcGl4ZWxPZmZzZXQ6IChvcHRpb25zLmxhYmVsLnBpeGVsT2Zmc2V0IHx8IG9wdGlvbnMubGFiZWwucGl4ZWxPZmZzZXQgPT09IDApID8gb3B0aW9ucy5sYWJlbC5waXhlbE9mZnNldCA6IDIwLFxyXG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6IG9wdGlvbnMubGFiZWwuYmFja2dyb3VuZENvbG9yIHx8IFsnIzAwZmZmZjgwJywgJyMwMGZmZmY4MCddLFxyXG4gICAgICBsaW5lQ29sb3I6IG9wdGlvbnMubGFiZWwubGluZUNvbG9yIHx8ICcjMDBmZmZmODAnLFxyXG4gICAgICBzY2FsZUJ5RGlzdGFuY2U6IG9wdGlvbnMubGFiZWwuc2NhbGVCeURpc3RhbmNlIHx8IGZhbHNlLFxyXG4gICAgICBuZWFyOiAob3B0aW9ucy5sYWJlbC5uZWFyIHx8IG9wdGlvbnMubGFiZWwubmVhciA9PT0gMCkgPyBvcHRpb25zLmxhYmVsLm5lYXIgOiAyMDAwLFxyXG4gICAgICBmYXI6IChvcHRpb25zLmxhYmVsLmZhciB8fCBvcHRpb25zLmxhYmVsLmZhciA9PT0gMCkgPyBvcHRpb25zLmxhYmVsLmZhciA6IDEwMDAwMCxcclxuICAgIH1cclxuICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUgPSBvcHRpb25zLmF0dHJpYnV0ZSB8fCB7fVxyXG4gICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rIHx8IHt9XHJcbiAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudCA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50IHx8IFtdXHJcblxyXG4gICAgZGVsZXRlIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUuY2FtZXJhXHJcbiAgICBkZWxldGUgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52clxyXG4gICAgZGVsZXRlIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUuZ29vZHNcclxuXHJcbiAgICB0aGlzLm5vZGVQb2ludHMgPSBbXVxyXG4gICAgaWYgKCF0aGlzLm9wdGlvbnMucG9zaXRpb25zIHx8IHRoaXMub3B0aW9ucy5wb3NpdGlvbnMubGVuZ3RoIDwgMykge1xyXG4gICAgICB0aGlzLl9lcnJvciA9ICfpm4bnu5PlnLDmnIDlsJHpnIDopoHkuInkuKrlnZDmoIfvvIEnXHJcbiAgICAgIGNvbnNvbGUud2Fybih0aGlzLl9lcnJvcilcclxuICAgICAgd2luZG93LkVMRU1FTlQgJiYgd2luZG93LkVMRU1FTlQuTWVzc2FnZSh7XHJcbiAgICAgICAgbWVzc2FnZTogdGhpcy5fZXJyb3IsXHJcbiAgICAgICAgdHlwZTogJ3dhcm5pbmcnLFxyXG4gICAgICAgIGR1cmF0aW9uOiAxNTAwXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmICghdGhpcy5vcHRpb25zLmhlaWdodCAmJiB0aGlzLm9wdGlvbnMuaGVpZ2h0ICE9PSAwKSB7XHJcbiAgICAgICAgbGV0IGhlaWdodCA9IHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0uYWx0XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCB0aGlzLm9wdGlvbnMucG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBpZiAoaGVpZ2h0IDwgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5hbHQpIHtcclxuICAgICAgICAgICAgaGVpZ2h0ID0gdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5hbHRcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5vcHRpb25zLmhlaWdodCA9IGhlaWdodFxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuc2RrLmFkZEluY2V0YW5jZSh0aGlzLm9wdGlvbnMuaWQsIHRoaXMpXHJcbiAgICAgIEFzc2VtYmxlT2JqZWN0LmNyZWF0ZSh0aGlzKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IHR5cGUoKSB7XHJcbiAgICByZXR1cm4gJ0Fzc2VtYmxlT2JqZWN0J1xyXG4gIH1cclxuXHJcbiAgZ2V0IGNvbG9yKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5jb2xvclxyXG4gIH1cclxuICBzZXQgY29sb3Iodikge1xyXG4gICAgdGhpcy5vcHRpb25zLmNvbG9yID0gdiB8fCAncmdiYSgyNTUsIDAsIDAsIDAuNSknXHJcbiAgICBpZiAoIXRoaXMuc2RrIHx8ICF0aGlzLnNkay52aWV3ZXIgfHwgIXRoaXMuZW50aXR5IHx8ICF0aGlzLmVudGl0eS5wb2x5Z29uKSB7XHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG4gICAgbGV0IG1hdGVyaWFsID0gQ2VzaXVtLkNvbG9yLmZyb21Dc3NDb2xvclN0cmluZyh0aGlzLm9wdGlvbnMuY29sb3IpXHJcbiAgICBpZiAodGhpcy5zZGsudmlld2VyLnNjZW5lLm1vZGUgPT09IDIpIHtcclxuICAgICAgbWF0ZXJpYWwgPSBuZXcgQ2VzaXVtLkN1c3RvbUNvbG9yTWF0ZXJpYWxTb3VyY2Uoe1xyXG4gICAgICAgIGNvbG9yOiB0aGlzLm9wdGlvbnMuY29sb3JcclxuICAgICAgfSlcclxuICAgIH1cclxuICAgIHRoaXMuZW50aXR5LnBvbHlnb24ubWF0ZXJpYWwgPSBtYXRlcmlhbFxyXG4gICAgaWYgKHRoaXMuX2VsbXMuY29sb3IpIHtcclxuICAgICAgdGhpcy5fZWxtcy5jb2xvci5mb3JFYWNoKChpdGVtLCBpKSA9PiB7XHJcbiAgICAgICAgbGV0IGNvbG9yUGlja2VyID0gbmV3IFlKQ29sb3JQaWNrZXIoe1xyXG4gICAgICAgICAgZWw6IGl0ZW0uZWwsXHJcbiAgICAgICAgICBzaXplOiAnbWluaScsLy/popzoibJib3jnsbvlnotcclxuICAgICAgICAgIGFscGhhOiB0cnVlLC8v5piv5ZCm5byA5ZCv6YCP5piO5bqmXHJcbiAgICAgICAgICBkZWZhdWx0Q29sb3I6IHRoaXMub3B0aW9ucy5jb2xvcixcclxuICAgICAgICAgIGRpc2FibGVkOiBmYWxzZSwvL+aYr+WQpuemgeatouaJk+W8gOminOiJsumAieaLqeWZqFxyXG4gICAgICAgICAgb3BlblBpY2tlckFuaTogJ29wYWNpdHknLC8v5omT5byA6aKc6Imy6YCJ5oup5Zmo5Yqo55S7XHJcbiAgICAgICAgICBzdXJlOiAoYykgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmNvbG9yID0gY1xyXG4gICAgICAgICAgfSwvL+eCueWHu+ehruiupOaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICAgICAgY2xlYXI6ICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5jb2xvciA9ICdyZ2JhKDI1NSwwLDAsMC41KSdcclxuICAgICAgICAgIH0sLy/ngrnlh7vmuIXnqbrmjInpkq7kuovku7blm57osINcclxuICAgICAgICB9KVxyXG4gICAgICAgIHRoaXMuX2VsbXMuY29sb3JbaV0gPSBjb2xvclBpY2tlclxyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IGhlaWdodE1vZGUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmhlaWdodE1vZGUgPyB0aGlzLm9wdGlvbnMuaGVpZ2h0TW9kZSA6IDBcclxuICB9XHJcbiAgc2V0IGhlaWdodE1vZGUodikge1xyXG4gICAgdGhpcy5lbnRpdHkucG9seWdvbi5oaWVyYXJjaHkgPSBbXVxyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMub3B0aW9ucy5oZWlnaHRNb2RlID0gKHYgfHwgdiA9PSAwKSA/IHYgOiAyXHJcbiAgICAgIHRoaXMucG9zaXRpb25FZGl0aW5nID0gZmFsc2VcclxuICAgICAgaWYgKCF0aGlzLmVudGl0eSkge1xyXG4gICAgICAgIHJldHVyblxyXG4gICAgICB9XHJcbiAgICAgIGxldCBoZWlnaHRNb2RlTmFtZSA9ICcnXHJcbiAgICAgIHRoaXMuY2xvc2VOb2RlRWRpdCgpXHJcbiAgICAgIGxldCBncm91bmQgPSBmYWxzZVxyXG4gICAgICBsZXQgZGlzYWJsZWQgPSBmYWxzZVxyXG4gICAgICB0aGlzLnJlbmV3UG9zaXRpb25zKClcclxuICAgICAgdGhpcy5lbnRpdHkucG9seWxpbmUucG9zaXRpb25zID0gW1xyXG4gICAgICAgIC4uLnRoaXMucG9zaXRpb25zSCxcclxuICAgICAgICB0aGlzLnBvc2l0aW9uc0hbMF0sXHJcbiAgICAgICAgdGhpcy5wb3NpdGlvbnNIWzFdXHJcbiAgICAgIF1cclxuICAgICAgdGhpcy5lbnRpdHkucG9seWdvbi5oaWVyYXJjaHkgPSBuZXcgQ2VzaXVtLlBvbHlnb25IaWVyYXJjaHkoXHJcbiAgICAgICAgdGhpcy5wb3NpdGlvbnNIXHJcbiAgICAgIClcclxuICAgICAgc3dpdGNoICh0aGlzLm9wdGlvbnMuaGVpZ2h0TW9kZSkge1xyXG4gICAgICAgIGNhc2UgJzAnOlxyXG4gICAgICAgIGNhc2UgMDpcclxuICAgICAgICAgIGhlaWdodE1vZGVOYW1lID0gJ+a1t+aLlOmrmOW6pidcclxuICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgY2FzZSAnMSc6XHJcbiAgICAgICAgY2FzZSAxOlxyXG4gICAgICAgICAgaGVpZ2h0TW9kZU5hbWUgPSAn55u45a+55Zyw6KGoJ1xyXG4gICAgICAgICAgYnJlYWtcclxuICAgICAgICBjYXNlICcyJzpcclxuICAgICAgICBjYXNlIDI6XHJcbiAgICAgICAgICBncm91bmQgPSB0cnVlXHJcbiAgICAgICAgICBkaXNhYmxlZCA9IHRydWVcclxuICAgICAgICAgIGhlaWdodE1vZGVOYW1lID0gJ+S+nemZhOaooeWeiydcclxuICAgICAgICAgIGJyZWFrXHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5wcmV2aW91cyA9IG51bGxcclxuICAgICAgdGhpcy5sYWJlbC5ncm91bmQgPSBncm91bmRcclxuICAgICAgdGhpcy5lbnRpdHkucG9seWxpbmUuY2xhbXBUb0dyb3VuZCA9IGdyb3VuZFxyXG4gICAgICB0aGlzLmVudGl0eS5wb2x5bGluZS5hcmNUeXBlID0gIWdyb3VuZCA/IENlc2l1bS5BcmNUeXBlLk5PTkUgOiBDZXNpdW0uQXJjVHlwZS5HRU9ERVNJQyxcclxuICAgICAgICB0aGlzLmVudGl0eS5wb2x5Z29uLnBlclBvc2l0aW9uSGVpZ2h0ID0gIWdyb3VuZCA/IHRydWUgOiBmYWxzZVxyXG4gICAgICB0aGlzLl9lbG1zLmhlaWdodE1vZGUgJiYgKHRoaXMuX2VsbXMuaGVpZ2h0TW9kZS52YWx1ZSA9IGhlaWdodE1vZGVOYW1lKVxyXG4gICAgICB0aGlzLl9lbG1zLmhlaWdodE1vZGVPYmplY3QgJiYgKHRoaXMuX2VsbXMuaGVpZ2h0TW9kZU9iamVjdC5sZWdwX3NlYXJjaEFjdGl2ZShcclxuICAgICAgICBoZWlnaHRNb2RlTmFtZVxyXG4gICAgICApKVxyXG4gICAgICBpZiAoZGlzYWJsZWQpIHtcclxuICAgICAgICB0aGlzLl9lbG1zLmhlaWdodEJveCAmJiAodGhpcy5fZWxtcy5oZWlnaHRCb3guY2xhc3NOYW1lID0gJ2lucHV0LW51bWJlciBpbnB1dC1udW1iZXItdW5pdC0xIGhlaWdodC1ib3ggZGlzYWJsZWQnKTtcclxuICAgICAgICB0aGlzLl9lbG1zLmhlaWdodENvbmZpcm0gJiYgdGhpcy5fZWxtcy5oZWlnaHRDb25maXJtLnNldEF0dHJpYnV0ZSgnZGlzYWJsZWQnLCAnZGlzYWJsZWQnKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICB0aGlzLl9lbG1zLmhlaWdodEJveCAmJiAodGhpcy5fZWxtcy5oZWlnaHRCb3guY2xhc3NOYW1lID0gJ2lucHV0LW51bWJlciBpbnB1dC1udW1iZXItdW5pdC0xIGhlaWdodC1ib3gnKTtcclxuICAgICAgICB0aGlzLl9lbG1zLmhlaWdodENvbmZpcm0gJiYgdGhpcy5fZWxtcy5oZWlnaHRDb25maXJtLnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZWQnKTtcclxuICAgICAgfVxyXG4gICAgfSwgNTApO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGhlaWdodCgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuaGVpZ2h0XHJcbiAgfVxyXG5cclxuICBzZXQgaGVpZ2h0KHYpIHtcclxuICAgIGlmICghdiB8fCBpc05hTihOdW1iZXIodikpKSB7XHJcbiAgICAgIHRoaXMub3B0aW9ucy5oZWlnaHQgPSAwXHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5vcHRpb25zLmhlaWdodCA9IE51bWJlcihOdW1iZXIodikudG9GaXhlZCgyKSlcclxuICAgIH1cclxuICAgIGxldCBncm91bmRcclxuICAgIGlmICh0aGlzLmhlaWdodE1vZGUgPT0gMikge1xyXG4gICAgICBncm91bmQgPSB0cnVlXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBncm91bmQgPSBmYWxzZVxyXG4gICAgfVxyXG4gICAgdGhpcy5yZW5ld1Bvc2l0aW9ucygpXHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5lbnRpdHkucG9seWdvbi5oaWVyYXJjaHkgPSBuZXcgQ2VzaXVtLlBvbHlnb25IaWVyYXJjaHkodGhpcy5wb3NpdGlvbnNIKVxyXG4gICAgICB0aGlzLmVudGl0eS5wb2x5Z29uLnBlclBvc2l0aW9uSGVpZ2h0ID0gIWdyb3VuZCA/IHRydWUgOiBmYWxzZVxyXG4gICAgICB0aGlzLmVudGl0eS5wb2x5bGluZS5wb3NpdGlvbnMgPSBbXHJcbiAgICAgICAgLi4udGhpcy5wb3NpdGlvbnNILFxyXG4gICAgICAgIHRoaXMucG9zaXRpb25zSFswXSxcclxuICAgICAgICB0aGlzLnBvc2l0aW9uc0hbMV1cclxuICAgICAgXVxyXG4gICAgICB0aGlzLmVudGl0eS5wb2x5bGluZS5jbGFtcFRvR3JvdW5kID0gIWdyb3VuZCA/IGZhbHNlIDogdHJ1ZVxyXG4gICAgICB0aGlzLmVudGl0eS5wb2x5bGluZS5hcmNUeXBlID0gIWdyb3VuZCA/IENlc2l1bS5BcmNUeXBlLk5PTkUgOiBDZXNpdW0uQXJjVHlwZS5HRU9ERVNJQ1xyXG4gICAgfSwgMCk7XHJcblxyXG4gICAgdGhpcy5fZWxtcy5hbHQgJiZcclxuICAgICAgdGhpcy5fZWxtcy5hbHQuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICBpdGVtLmlubmVySFRNTCA9IHRoaXMub3B0aW9ucy5oZWlnaHRcclxuICAgICAgfSlcclxuICB9XHJcblxyXG4gIGdldCBsaW5lQ29sb3IoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmxpbmUuY29sb3JcclxuICB9XHJcbiAgc2V0IGxpbmVDb2xvcih2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMubGluZS5jb2xvciA9IHYgfHwgJ3JnYmEoMjU1LCAwLCAwLCAwLjUpJ1xyXG4gICAgaWYgKCF0aGlzLnNkayB8fCAhdGhpcy5zZGsudmlld2VyIHx8ICF0aGlzLmVudGl0eSB8fCAhdGhpcy5lbnRpdHkucG9seWxpbmUpIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcbiAgICB0aGlzLmVudGl0eS5wb2x5bGluZS5tYXRlcmlhbCA9IENlc2l1bS5Db2xvci5mcm9tQ3NzQ29sb3JTdHJpbmcodGhpcy5vcHRpb25zLmxpbmUuY29sb3IpXHJcbiAgICBpZiAodGhpcy5fZWxtcy5saW5lQ29sb3IpIHtcclxuICAgICAgdGhpcy5fZWxtcy5saW5lQ29sb3IuZm9yRWFjaCgoaXRlbSwgaSkgPT4ge1xyXG4gICAgICAgIGxldCBsaW5lQ29sb3JQaWNrZXIgPSBuZXcgWUpDb2xvclBpY2tlcih7XHJcbiAgICAgICAgICBlbDogaXRlbS5lbCxcclxuICAgICAgICAgIHNpemU6ICdtaW5pJywvL+minOiJsmJveOexu+Wei1xyXG4gICAgICAgICAgYWxwaGE6IHRydWUsLy/mmK/lkKblvIDlkK/pgI/mmI7luqZcclxuICAgICAgICAgIGRlZmF1bHRDb2xvcjogdGhpcy5vcHRpb25zLmxpbmUuY29sb3IsXHJcbiAgICAgICAgICBkaXNhYmxlZDogZmFsc2UsLy/mmK/lkKbnpoHmraLmiZPlvIDpopzoibLpgInmi6nlmahcclxuICAgICAgICAgIG9wZW5QaWNrZXJBbmk6ICdvcGFjaXR5JywvL+aJk+W8gOminOiJsumAieaLqeWZqOWKqOeUu1xyXG4gICAgICAgICAgc3VyZTogKGMpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5saW5lQ29sb3IgPSBjXHJcbiAgICAgICAgICB9LC8v54K55Ye756Gu6K6k5oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgICAgICBjbGVhcjogKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxpbmVDb2xvciA9ICdyZ2JhKDI1NSwwLDAsMC41KSdcclxuICAgICAgICAgIH0sLy/ngrnlh7vmuIXnqbrmjInpkq7kuovku7blm57osINcclxuICAgICAgICB9KVxyXG4gICAgICAgIHRoaXMuX2VsbXMubGluZUNvbG9yW2ldID0gbGluZUNvbG9yUGlja2VyXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgbGluZVdpZHRoKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5saW5lLndpZHRoXHJcbiAgfVxyXG4gIHNldCBsaW5lV2lkdGgodikge1xyXG4gICAgdGhpcy5vcHRpb25zLmxpbmUud2lkdGggPSAoKHYgfHwgdiA9PT0gMCkgPyB2IDogMylcclxuICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLndpZHRoID0gdGhpcy5vcHRpb25zLmxpbmUud2lkdGhcclxuICAgIHRoaXMuX2VsbXMubGluZUNvbG9yICYmIHRoaXMuX2VsbXMubGluZUNvbG9yLmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgaXRlbS52YWx1ZSA9IHRoaXMub3B0aW9ucy5saW5lLndpZHRoXHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgZ2V0IGxhYmVsU2hvdygpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubGFiZWwuc2hvd1xyXG4gIH1cclxuICBzZXQgbGFiZWxTaG93KHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5sYWJlbC5zaG93ID0gdlxyXG4gICAgaWYgKHRoaXMuc2hvdyAmJiAhdGhpcy5zaG93VmlldyB8fCB0aGlzLnNob3dWaWV3ID09IDMpIHtcclxuICAgICAgdGhpcy5sYWJlbC5zaG93ID0gdlxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMubGFiZWwuc2hvdyA9IGZhbHNlXHJcbiAgICB9XHJcbiAgICB0aGlzLl9lbG1zLmxhYmVsU2hvdyAmJiB0aGlzLl9lbG1zLmxhYmVsU2hvdy5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgIGl0ZW0uY2hlY2tlZCA9IHZcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBnZXQgbGFiZWxGb250RmFtaWx5KCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5sYWJlbC5mb250RmFtaWx5XHJcbiAgfVxyXG5cclxuICBzZXQgbGFiZWxGb250RmFtaWx5KHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5sYWJlbC5mb250RmFtaWx5ID0gdiB8fCAwXHJcbiAgICB0aGlzLmxhYmVsICYmICh0aGlzLmxhYmVsLmZvbnRGYW1pbHkgPSB0aGlzLm9wdGlvbnMubGFiZWwuZm9udEZhbWlseSlcclxuXHJcbiAgICBsZXQgbmFtZSA9IGdldEZvbnRGYW1pbHlOYW1lKHRoaXMubGFiZWxGb250RmFtaWx5KSB8fCAnJ1xyXG4gICAgdGhpcy5fZWxtcy5sYWJlbEZvbnRGYW1pbHkgJiZcclxuICAgICAgdGhpcy5fZWxtcy5sYWJlbEZvbnRGYW1pbHkuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICBpdGVtLnZhbHVlID0gbmFtZVxyXG4gICAgICB9KVxyXG4gIH1cclxuXHJcbiAgZ2V0IGxhYmVsQ29sb3IoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmxhYmVsLmNvbG9yXHJcbiAgfVxyXG4gIHNldCBsYWJlbENvbG9yKHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5sYWJlbC5jb2xvciA9IHZcclxuICAgIHRoaXMubGFiZWwuY29sb3IgPSB2XHJcbiAgICBpZiAodGhpcy5fZWxtcy5sYWJlbENvbG9yKSB7XHJcbiAgICAgIHRoaXMuX2VsbXMubGFiZWxDb2xvci5mb3JFYWNoKChpdGVtLCBpKSA9PiB7XHJcbiAgICAgICAgbGV0IGxhYmVsQ29sb3JQaWNrZXIgPSBuZXcgWUpDb2xvclBpY2tlcih7XHJcbiAgICAgICAgICBlbDogaXRlbS5lbCxcclxuICAgICAgICAgIHNpemU6ICdtaW5pJywvL+minOiJsmJveOexu+Wei1xyXG4gICAgICAgICAgYWxwaGE6IHRydWUsLy/mmK/lkKblvIDlkK/pgI/mmI7luqZcclxuICAgICAgICAgIGRlZmF1bHRDb2xvcjogdGhpcy5sYWJlbENvbG9yLFxyXG4gICAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLC8v5piv5ZCm56aB5q2i5omT5byA6aKc6Imy6YCJ5oup5ZmoXHJcbiAgICAgICAgICBvcGVuUGlja2VyQW5pOiAnb3BhY2l0eScsLy/miZPlvIDpopzoibLpgInmi6nlmajliqjnlLtcclxuICAgICAgICAgIHN1cmU6IChjb2xvcikgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxhYmVsQ29sb3IgPSBjb2xvclxyXG4gICAgICAgICAgfSwvL+eCueWHu+ehruiupOaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICAgICAgY2xlYXI6ICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5sYWJlbENvbG9yID0gJ3JnYmEoMjU1LDI1NSwyNTUsMSknXHJcbiAgICAgICAgICB9LC8v54K55Ye75riF56m65oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgICAgfSlcclxuICAgICAgICB0aGlzLl9lbG1zLmxhYmVsQ29sb3JbaV0gPSBsYWJlbENvbG9yUGlja2VyXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgbGFiZWxGb250U2l6ZSgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubGFiZWwuZm9udFNpemVcclxuICB9XHJcbiAgc2V0IGxhYmVsRm9udFNpemUodikge1xyXG4gICAgdGhpcy5vcHRpb25zLmxhYmVsLmZvbnRTaXplID0gdlxyXG4gICAgdGhpcy5sYWJlbC5mb250U2l6ZSA9IHZcclxuICAgIHRoaXMuX2VsbXMubGFiZWxGb250U2l6ZSAmJiB0aGlzLl9lbG1zLmxhYmVsRm9udFNpemUuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICBpdGVtLnZhbHVlID0gdlxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGdldCBsYWJlbFNjYWxlQnlEaXN0YW5jZSgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubGFiZWwuc2NhbGVCeURpc3RhbmNlXHJcbiAgfVxyXG4gIHNldCBsYWJlbFNjYWxlQnlEaXN0YW5jZSh2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMubGFiZWwuc2NhbGVCeURpc3RhbmNlID0gdlxyXG4gICAgdGhpcy5sYWJlbC5zY2FsZUJ5RGlzdGFuY2UgPSB2XHJcbiAgICB0aGlzLl9lbG1zLmxhYmVsU2NhbGVCeURpc3RhbmNlICYmIHRoaXMuX2VsbXMubGFiZWxTY2FsZUJ5RGlzdGFuY2UuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICBpdGVtLmNoZWNrZWQgPSB2XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgZ2V0IGxhYmVsTmVhcigpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubGFiZWwubmVhclxyXG4gIH1cclxuICBzZXQgbGFiZWxOZWFyKHYpIHtcclxuICAgIGxldCBuZWFyID0gdlxyXG4gICAgaWYgKG5lYXIgPiB0aGlzLmxhYmVsRmFyKSB7XHJcbiAgICAgIG5lYXIgPSB0aGlzLmxhYmVsRmFyXHJcbiAgICB9XHJcbiAgICB0aGlzLm9wdGlvbnMubGFiZWwubmVhciA9IG5lYXJcclxuICAgIHRoaXMubGFiZWwubmVhciA9IG5lYXJcclxuICAgIHRoaXMuX2VsbXMubGFiZWxOZWFyICYmIHRoaXMuX2VsbXMubGFiZWxOZWFyLmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgaXRlbS52YWx1ZSA9IG5lYXJcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBnZXQgbGFiZWxGYXIoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmxhYmVsLmZhclxyXG4gIH1cclxuICBzZXQgbGFiZWxGYXIodikge1xyXG4gICAgbGV0IGZhciA9IHZcclxuICAgIGlmIChmYXIgPCB0aGlzLmxhYmVsTmVhcikge1xyXG4gICAgICBmYXIgPSB0aGlzLmxhYmVsTmVhclxyXG4gICAgfVxyXG4gICAgdGhpcy5vcHRpb25zLmxhYmVsLmZhciA9IGZhclxyXG4gICAgdGhpcy5sYWJlbC5mYXIgPSBmYXJcclxuICAgIHRoaXMuX2VsbXMubGFiZWxGYXIgJiYgdGhpcy5fZWxtcy5sYWJlbEZhci5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgIGl0ZW0udmFsdWUgPSBmYXJcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBnZXQgbGFiZWxMaW5lV2lkdGgoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmxhYmVsLmxpbmVXaWR0aFxyXG4gIH1cclxuICBzZXQgbGFiZWxMaW5lV2lkdGgodikge1xyXG4gICAgdGhpcy5vcHRpb25zLmxhYmVsLmxpbmVXaWR0aCA9IHZcclxuICAgIHRoaXMubGFiZWwubGluZVdpZHRoID0gdlxyXG4gICAgdGhpcy5fZWxtcy5sYWJlbExpbmVXaWR0aCAmJiB0aGlzLl9lbG1zLmxhYmVsTGluZVdpZHRoLmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgaXRlbS52YWx1ZSA9IHZcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBnZXQgbGFiZWxQaXhlbE9mZnNldCgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubGFiZWwucGl4ZWxPZmZzZXRcclxuICB9XHJcbiAgc2V0IGxhYmVsUGl4ZWxPZmZzZXQodikge1xyXG4gICAgdGhpcy5vcHRpb25zLmxhYmVsLnBpeGVsT2Zmc2V0ID0gdlxyXG4gICAgdGhpcy5sYWJlbC5waXhlbE9mZnNldCA9IHZcclxuICAgIHRoaXMuX2VsbXMubGFiZWxQaXhlbE9mZnNldCAmJiB0aGlzLl9lbG1zLmxhYmVsUGl4ZWxPZmZzZXQuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICBpdGVtLnZhbHVlID0gdlxyXG4gICAgfSlcclxuICB9XHJcbiAgZ2V0IGxhYmVsTGluZUNvbG9yKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5sYWJlbC5saW5lQ29sb3JcclxuICB9XHJcbiAgc2V0IGxhYmVsTGluZUNvbG9yKHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5sYWJlbC5saW5lQ29sb3IgPSB2XHJcbiAgICB0aGlzLmxhYmVsLmxpbmVDb2xvciA9IHZcclxuICAgIGlmICh0aGlzLl9lbG1zLmxhYmVsTGluZUNvbG9yKSB7XHJcbiAgICAgIHRoaXMuX2VsbXMubGFiZWxMaW5lQ29sb3IuZm9yRWFjaCgoaXRlbSwgaSkgPT4ge1xyXG4gICAgICAgIGxldCBsaW5lQ29sb3JQaWNrZXIgPSBuZXcgWUpDb2xvclBpY2tlcih7XHJcbiAgICAgICAgICBlbDogaXRlbS5lbCxcclxuICAgICAgICAgIHNpemU6ICdtaW5pJywvL+minOiJsmJveOexu+Wei1xyXG4gICAgICAgICAgYWxwaGE6IHRydWUsLy/mmK/lkKblvIDlkK/pgI/mmI7luqZcclxuICAgICAgICAgIGRlZmF1bHRDb2xvcjogdGhpcy5sYWJlbExpbmVDb2xvcixcclxuICAgICAgICAgIGRpc2FibGVkOiBmYWxzZSwvL+aYr+WQpuemgeatouaJk+W8gOminOiJsumAieaLqeWZqFxyXG4gICAgICAgICAgb3BlblBpY2tlckFuaTogJ29wYWNpdHknLC8v5omT5byA6aKc6Imy6YCJ5oup5Zmo5Yqo55S7XHJcbiAgICAgICAgICBzdXJlOiAoY29sb3IpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5sYWJlbExpbmVDb2xvciA9IGNvbG9yXHJcbiAgICAgICAgICB9LC8v54K55Ye756Gu6K6k5oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgICAgICBjbGVhcjogKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxhYmVsTGluZUNvbG9yID0gJ3JnYmEoMCwyNTUsMjU1LDAuNSknXHJcbiAgICAgICAgICB9LC8v54K55Ye75riF56m65oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgICAgfSlcclxuICAgICAgICB0aGlzLl9lbG1zLmxhYmVsTGluZUNvbG9yW2ldID0gbGluZUNvbG9yUGlja2VyXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgbGFiZWxCYWNrZ3JvdW5kQ29sb3JTdGFydCgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubGFiZWwuYmFja2dyb3VuZENvbG9yWzBdXHJcbiAgfVxyXG4gIHNldCBsYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0KHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5sYWJlbC5iYWNrZ3JvdW5kQ29sb3JbMF0gPSB2XHJcbiAgICB0aGlzLmxhYmVsLmJhY2tncm91bmRDb2xvciA9IFt2LCB0aGlzLmxhYmVsLmJhY2tncm91bmRDb2xvclsxXV1cclxuICAgIGlmICh0aGlzLl9lbG1zLmxhYmVsQmFja2dyb3VuZENvbG9yU3RhcnQpIHtcclxuICAgICAgdGhpcy5fZWxtcy5sYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0LmZvckVhY2goKGl0ZW0sIGkpID0+IHtcclxuICAgICAgICBsZXQgbGFiZWxCYWNrZ3JvdW5kQ29sb3JTdGFydFBpY2tlciA9IG5ldyBZSkNvbG9yUGlja2VyKHtcclxuICAgICAgICAgIGVsOiBpdGVtLmVsLFxyXG4gICAgICAgICAgc2l6ZTogJ21pbmknLC8v6aKc6ImyYm9457G75Z6LXHJcbiAgICAgICAgICBhbHBoYTogdHJ1ZSwvL+aYr+WQpuW8gOWQr+mAj+aYjuW6plxyXG4gICAgICAgICAgZGVmYXVsdENvbG9yOiB0aGlzLmxhYmVsQmFja2dyb3VuZENvbG9yU3RhcnQsXHJcbiAgICAgICAgICBkaXNhYmxlZDogZmFsc2UsLy/mmK/lkKbnpoHmraLmiZPlvIDpopzoibLpgInmi6nlmahcclxuICAgICAgICAgIG9wZW5QaWNrZXJBbmk6ICdvcGFjaXR5JywvL+aJk+W8gOminOiJsumAieaLqeWZqOWKqOeUu1xyXG4gICAgICAgICAgc3VyZTogKGNvbG9yKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JTdGFydCA9IGNvbG9yXHJcbiAgICAgICAgICB9LC8v54K55Ye756Gu6K6k5oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgICAgICBjbGVhcjogKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxhYmVsQmFja2dyb3VuZENvbG9yU3RhcnQgPSAncmdiYSgyNTUsMjU1LDI1NSwxKSdcclxuICAgICAgICAgIH0sLy/ngrnlh7vmuIXnqbrmjInpkq7kuovku7blm57osINcclxuICAgICAgICB9KVxyXG4gICAgICAgIHRoaXMuX2VsbXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JTdGFydFtpXSA9IGxhYmVsQmFja2dyb3VuZENvbG9yU3RhcnRQaWNrZXJcclxuICAgICAgfSlcclxuICAgIH1cclxuICB9XHJcbiAgZ2V0IGxhYmVsQmFja2dyb3VuZENvbG9yRW5kKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5sYWJlbC5iYWNrZ3JvdW5kQ29sb3JbMV1cclxuICB9XHJcbiAgc2V0IGxhYmVsQmFja2dyb3VuZENvbG9yRW5kKHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5sYWJlbC5iYWNrZ3JvdW5kQ29sb3JbMV0gPSB2XHJcbiAgICB0aGlzLmxhYmVsLmJhY2tncm91bmRDb2xvciA9IFt0aGlzLmxhYmVsLmJhY2tncm91bmRDb2xvclswXSwgdl1cclxuICAgIGlmICh0aGlzLl9lbG1zLmxhYmVsQmFja2dyb3VuZENvbG9yRW5kKSB7XHJcbiAgICAgIHRoaXMuX2VsbXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmQuZm9yRWFjaCgoaXRlbSwgaSkgPT4ge1xyXG4gICAgICAgIGxldCBsYWJlbEJhY2tncm91bmRDb2xvckVuZFBpY2tlciA9IG5ldyBZSkNvbG9yUGlja2VyKHtcclxuICAgICAgICAgIGVsOiBpdGVtLmVsLFxyXG4gICAgICAgICAgc2l6ZTogJ21pbmknLC8v6aKc6ImyYm9457G75Z6LXHJcbiAgICAgICAgICBhbHBoYTogdHJ1ZSwvL+aYr+WQpuW8gOWQr+mAj+aYjuW6plxyXG4gICAgICAgICAgZGVmYXVsdENvbG9yOiB0aGlzLmxhYmVsQmFja2dyb3VuZENvbG9yRW5kLFxyXG4gICAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLC8v5piv5ZCm56aB5q2i5omT5byA6aKc6Imy6YCJ5oup5ZmoXHJcbiAgICAgICAgICBvcGVuUGlja2VyQW5pOiAnb3BhY2l0eScsLy/miZPlvIDpopzoibLpgInmi6nlmajliqjnlLtcclxuICAgICAgICAgIHN1cmU6IChjb2xvcikgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxhYmVsQmFja2dyb3VuZENvbG9yRW5kID0gY29sb3JcclxuICAgICAgICAgIH0sLy/ngrnlh7vnoa7orqTmjInpkq7kuovku7blm57osINcclxuICAgICAgICAgIGNsZWFyOiAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmQgPSAncmdiYSgyNTUsMjU1LDI1NSwxKSdcclxuICAgICAgICAgIH0sLy/ngrnlh7vmuIXnqbrmjInpkq7kuovku7blm57osINcclxuICAgICAgICB9KVxyXG4gICAgICAgIHRoaXMuX2VsbXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmRbaV0gPSBsYWJlbEJhY2tncm91bmRDb2xvckVuZFBpY2tlclxyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc3RhdGljIGNyZWF0ZSh0aGF0KSB7XHJcbiAgICBsZXQgcG9zaXRpb25zID0gdGhhdC5vcHRpb25zLnBvc2l0aW9uc1xyXG4gICAgbGV0IGZyb21EZWdyZWVzQXJyYXkgPSBbXVxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgZnJvbURlZ3JlZXNBcnJheS5wdXNoKHBvc2l0aW9uc1tpXS5sbmcsIHBvc2l0aW9uc1tpXS5sYXQpXHJcbiAgICB9XHJcbiAgICB0aGF0LnBvc2l0aW9ucyA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzQXJyYXkoZnJvbURlZ3JlZXNBcnJheSlcclxuICAgIGxldCBwb3NpdGlvbnNBID0gdGhhdC5jb21wdXRlQXNzZW1ibGUodGhhdC5vcHRpb25zLnBvc2l0aW9ucylcclxuICAgIGlmIChwb3NpdGlvbnNBLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG4gICAgbGV0IHBvaW50cyA9IFtbXV1cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9zaXRpb25zQS5sZW5ndGg7IGkrKykge1xyXG4gICAgICBsZXQgcG9zaXRpb24gPSB0aGF0LmNhcnRlc2lhbjNUb3dnczg0KHBvc2l0aW9uc0FbaV0sIHRoYXQuc2RrLnZpZXdlcilcclxuICAgICAgcG9pbnRzWzBdLnB1c2goW3Bvc2l0aW9uLmxuZywgcG9zaXRpb24ubGF0XSlcclxuICAgIH1cclxuICAgIGxldCBwb3NpdGlvbiA9IHRoYXQuY2FydGVzaWFuM1Rvd2dzODQocG9zaXRpb25zQVswXSwgdGhhdC5zZGsudmlld2VyKVxyXG4gICAgcG9pbnRzWzBdLnB1c2goW3Bvc2l0aW9uLmxuZywgcG9zaXRpb24ubGF0XSlcclxuICAgIGxldCBwb2x5Z29uID0gdHVyZi5wb2x5Z29uKHBvaW50cyk7XHJcbiAgICAvLyBsZXQgY2VudHJvaWQgPSB0dXJmLmNlbnRyb2lkKHBvbHlnb24pO1xyXG4gICAgbGV0IGNlbnRyb2lkID0gdHVyZi5wb2ludE9uRmVhdHVyZShwb2x5Z29uKTtcclxuXHJcblxyXG4gICAgbGV0IGdyb3VuZFxyXG4gICAgbGV0IGhlaWdodCA9IDBcclxuXHJcbiAgICBzd2l0Y2ggKHRoYXQub3B0aW9ucy5oZWlnaHRNb2RlKSB7XHJcbiAgICAgIGNhc2UgJzAnOlxyXG4gICAgICBjYXNlIDA6XHJcbiAgICAgICAgZ3JvdW5kID0gZmFsc2VcclxuICAgICAgICBicmVha1xyXG4gICAgICBjYXNlICcxJzpcclxuICAgICAgY2FzZSAxOlxyXG4gICAgICAgIGhlaWdodCA9IHRoYXQuc2RrLnZpZXdlci5zY2VuZS5nbG9iZS5nZXRIZWlnaHQoQ2VzaXVtLkNhcnRvZ3JhcGhpYy5mcm9tRGVncmVlcyhjZW50cm9pZC5nZW9tZXRyeS5jb29yZGluYXRlc1swXSwgY2VudHJvaWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMV0pKSB8fCAwXHJcbiAgICAgICAgZ3JvdW5kID0gZmFsc2VcclxuICAgICAgICBicmVha1xyXG4gICAgICBjYXNlICcyJzpcclxuICAgICAgY2FzZSAyOlxyXG4gICAgICAgIGdyb3VuZCA9IHRydWVcclxuICAgICAgICBicmVha1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGlmICghdGhhdC5vcHRpb25zLmxhYmVsLnBvc2l0aW9uKSB7XHJcbiAgICAvLyAgIHRoYXQub3B0aW9ucy5sYWJlbC5wb3NpdGlvbiA9IHsgbG5nOiBjZW50cm9pZC5nZW9tZXRyeS5jb29yZGluYXRlc1swXSwgbGF0OiBjZW50cm9pZC5nZW9tZXRyeS5jb29yZGluYXRlc1sxXSwgYWx0OiB0aGF0LmhlaWdodCArIGhlaWdodCB9XHJcbiAgICAvLyB9XHJcbiAgICB0aGF0Lm9wdGlvbnMubGFiZWwucG9zaXRpb24gPSB7IGxuZzogY2VudHJvaWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMF0sIGxhdDogY2VudHJvaWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMV0sIGFsdDogdGhhdC5oZWlnaHQgKyBoZWlnaHQgfVxyXG5cclxuICAgIGxldCBmcm9tRGVncmVlc0FycmF5MiA9IFtdXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvaW50c1swXS5sZW5ndGg7IGkrKykge1xyXG4gICAgICBmcm9tRGVncmVlc0FycmF5Mi5wdXNoKFxyXG4gICAgICAgIHBvaW50c1swXVtpXVswXSxcclxuICAgICAgICBwb2ludHNbMF1baV1bMV0sXHJcbiAgICAgICAgdGhhdC5oZWlnaHQgKyBoZWlnaHRcclxuICAgICAgKVxyXG4gICAgfVxyXG5cclxuICAgIGxldCBtYXRlcmlhbCA9IENlc2l1bS5Db2xvci5mcm9tQ3NzQ29sb3JTdHJpbmcodGhhdC5vcHRpb25zLmNvbG9yKVxyXG4gICAgaWYgKHRoYXQuc2RrLnZpZXdlci5zY2VuZS5tb2RlID09PSAyKSB7XHJcbiAgICAgIGdyb3VuZCA9IGZhbHNlXHJcbiAgICAgIG1hdGVyaWFsID0gbmV3IENlc2l1bS5DdXN0b21Db2xvck1hdGVyaWFsU291cmNlKHtcclxuICAgICAgICBjb2xvcjogdGhhdC5vcHRpb25zLmNvbG9yXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgICAvLyB0aGF0Lm9wdGlvbnMubGFiZWwuZ3JvdW5kID0gZ3JvdW5kXHJcbiAgICB0aGF0LnBvc2l0aW9uc0ggPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlc0FycmF5SGVpZ2h0cyhmcm9tRGVncmVlc0FycmF5MilcclxuXHJcbiAgICB0aGF0LmVudGl0eSA9IHRoYXQuc2RrLnZpZXdlci5lbnRpdGllcy5hZGQoe1xyXG4gICAgICBzaG93OiB0aGF0Lm9wdGlvbnMuc2hvdyxcclxuICAgICAgaWQ6IHRoYXQub3B0aW9ucy5pZCxcclxuICAgICAgcG9seWdvbjoge1xyXG4gICAgICAgIGhpZXJhcmNoeTogIWdyb3VuZCA/IG5ldyBDZXNpdW0uUG9seWdvbkhpZXJhcmNoeSh0aGF0LnBvc2l0aW9uc0gpIDogbmV3IENlc2l1bS5Qb2x5Z29uSGllcmFyY2h5KHBvc2l0aW9uc0EpLFxyXG4gICAgICAgIHBlclBvc2l0aW9uSGVpZ2h0OiAhZ3JvdW5kID8gdHJ1ZSA6IGZhbHNlLFxyXG4gICAgICAgIG1hdGVyaWFsOiBtYXRlcmlhbCxcclxuICAgICAgICB6SW5kZXg6IHRoYXQuc2RrLl9lbnRpdHlaSW5kZXhcclxuICAgICAgfSxcclxuICAgICAgcG9seWxpbmU6IHtcclxuICAgICAgICBwb3NpdGlvbnM6IFsuLi50aGF0LnBvc2l0aW9uc0gsIHRoYXQucG9zaXRpb25zSFswXSwgdGhhdC5wb3NpdGlvbnNIWzFdXSxcclxuICAgICAgICB3aWR0aDogdGhhdC5vcHRpb25zLmxpbmUud2lkdGgsXHJcbiAgICAgICAgbWF0ZXJpYWw6IENlc2l1bS5Db2xvci5mcm9tQ3NzQ29sb3JTdHJpbmcodGhhdC5vcHRpb25zLmxpbmUuY29sb3IpLFxyXG4gICAgICAgIGNsYW1wVG9Hcm91bmQ6ICFncm91bmQgPyBmYWxzZSA6IHRydWUsXHJcbiAgICAgICAgYXJjVHlwZTogIWdyb3VuZCA/IENlc2l1bS5BcmNUeXBlLk5PTkUgOiBDZXNpdW0uQXJjVHlwZS5HRU9ERVNJQyxcclxuICAgICAgICB6SW5kZXg6IHRoYXQuc2RrLl9lbnRpdHlaSW5kZXhcclxuICAgICAgfSxcclxuICAgIH0pXHJcbiAgICB0aGF0LnNkay5fZW50aXR5WkluZGV4KytcclxuICAgIEFzc2VtYmxlT2JqZWN0LmNyZWF0ZUxhYmVsKHRoYXQpXHJcblxyXG4gICAgbGV0IHBvczg0ID0gW11cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9zaXRpb25zQS5sZW5ndGg7IGkrKykge1xyXG4gICAgICBwb3M4NC5wdXNoKHRoYXQuY2FydGVzaWFuM1Rvd2dzODQocG9zaXRpb25zQVtpXSwgdGhhdC5zZGsudmlld2VyKSlcclxuICAgIH1cclxuICAgIHRoYXQuYXJlYUJ5TWV0ZXIgPSB0aGF0LmNvbXB1dGVBcmVhKHBvczg0KTtcclxuICAgIHRoYXQuYXJlYUNoYW5nZUNhbGxCYWNrICYmIHRoYXQuYXJlYUNoYW5nZUNhbGxCYWNrKClcclxuICAgIHN5bmNEYXRhKHRoYXQuc2RrLCB0aGF0Lm9wdGlvbnMuaWQpXHJcbiAgICBpZiAodGhhdC5vcHRpb25zLnNob3cpIHtcclxuICAgICAgc2V0U3BsaXREaXJlY3Rpb24oMCwgdGhhdC5vcHRpb25zLmlkKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc3RhdGljIGFzeW5jIGNyZWF0ZUxhYmVsKHRoYXQpIHtcclxuICAgIC8vIOagh+etvlxyXG4gICAgdGhhdC5sYWJlbCA9IG5ldyBMYWJlbE9iamVjdCh0aGF0LnNkaywge1xyXG4gICAgICBpZDogdGhhdC5vcHRpb25zLmlkLFxyXG4gICAgICBzaG93OiB0aGF0Lm9wdGlvbnMuc2hvdyA/IHRoYXQub3B0aW9ucy5sYWJlbC5zaG93IDogZmFsc2UsXHJcbiAgICAgIHBvc2l0aW9uOiBbdGhhdC5vcHRpb25zLmxhYmVsLnBvc2l0aW9uLmxuZywgdGhhdC5vcHRpb25zLmxhYmVsLnBvc2l0aW9uLmxhdCwgdGhhdC5vcHRpb25zLmxhYmVsLnBvc2l0aW9uLmFsdF0sXHJcbiAgICAgIHRleHQ6IHRoYXQub3B0aW9ucy5uYW1lLFxyXG4gICAgICBmb250U2l6ZTogdGhhdC5vcHRpb25zLmxhYmVsLmZvbnRTaXplLFxyXG4gICAgICBmb250RmFtaWx5OiB0aGF0Lm9wdGlvbnMubGFiZWwuZm9udEZhbWlseSxcclxuICAgICAgY29sb3I6IHRoYXQub3B0aW9ucy5sYWJlbC5jb2xvcixcclxuICAgICAgcGl4ZWxPZmZzZXQ6IHRoYXQub3B0aW9ucy5sYWJlbC5waXhlbE9mZnNldCxcclxuICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGF0Lm9wdGlvbnMubGFiZWwuYmFja2dyb3VuZENvbG9yLFxyXG4gICAgICBsaW5lV2lkdGg6IHRoYXQub3B0aW9ucy5sYWJlbC5saW5lV2lkdGgsXHJcbiAgICAgIGxpbmVDb2xvcjogdGhhdC5vcHRpb25zLmxhYmVsLmxpbmVDb2xvcixcclxuICAgICAgc2NhbGVCeURpc3RhbmNlOiB0aGF0Lm9wdGlvbnMubGFiZWwuc2NhbGVCeURpc3RhbmNlLFxyXG4gICAgICBuZWFyOiB0aGF0Lm9wdGlvbnMubGFiZWwubmVhcixcclxuICAgICAgZmFyOiB0aGF0Lm9wdGlvbnMubGFiZWwuZmFyLFxyXG4gICAgICAvLyBncm91bmQ6IHRoYXQub3B0aW9ucy5sYWJlbC5ncm91bmQsXHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgLy8g57yW6L6R5qGGXHJcbiAgYXN5bmMgZWRpdChzdGF0ZSkge1xyXG4gICAgcmV0dXJuXHJcbiAgICBpZiAodGhpcy5fZXJyb3IpIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzXHJcbiAgICB0aGlzLm9yaWdpbmFsT3B0aW9ucyA9IHRoaXMuZGVlcENvcHlPYmoodGhpcy5vcHRpb25zKVxyXG5cclxuICAgIGlmICh0aGlzLl9EaWFsb2dPYmplY3QgJiYgdGhpcy5fRGlhbG9nT2JqZWN0LmNsb3NlKSB7XHJcbiAgICAgIHRoaXMuX0RpYWxvZ09iamVjdC5jbG9zZSgpXHJcbiAgICAgIHRoaXMuX0RpYWxvZ09iamVjdCA9IG51bGxcclxuICAgIH1cclxuICAgIGlmIChzdGF0ZSkge1xyXG4gICAgICBmdW5jdGlvbiBjcmVhdGVTcGF0aWFsSW5mb1RhYmxlQ29udGVudCgpIHtcclxuICAgICAgICBsZXQgdGFibGVFbG0gPSBjb250ZW50RWxtLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3NwYXRpYWwtaW5mby10YWJsZScpWzBdXHJcbiAgICAgICAgbGV0IHRCb2R5RWxtID0gdGFibGVFbG0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndGFibGUtYm9keScpWzBdXHJcbiAgICAgICAgdEJvZHlFbG0uaW5uZXJIVE1MID0gJydcclxuICAgICAgICBfdGhpcy5fZWxtcy5sbmcgPSBbXVxyXG4gICAgICAgIF90aGlzLl9lbG1zLmxuZ0lucHV0ID0gW11cclxuICAgICAgICBfdGhpcy5fZWxtcy5sYXQgPSBbXVxyXG4gICAgICAgIF90aGlzLl9lbG1zLmxhdElucHV0ID0gW11cclxuICAgICAgICBfdGhpcy5fZWxtcy5hbHQgPSBbXVxyXG4gICAgICAgIF90aGlzLl9lbG1zLmFsdElucHV0ID0gW11cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IF90aGlzLm9wdGlvbnMucG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBsZXQgdHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKVxyXG4gICAgICAgICAgdHIuY2xhc3NOYW1lID0gJ3RyJ1xyXG4gICAgICAgICAgdHIuaW5uZXJIVE1MID0gYFxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRkXCI+JHtpICsgMX08L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZCBsbmcgYWxpZ24tY2VudGVyXCI+PC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidGQgbGF0IGFsaWduLWNlbnRlclwiPjwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRkIGFsdCBhbGlnbi1jZW50ZXJcIj48L2Rpdj5cclxuICAgICAgICBgXHJcbiAgICAgICAgICBsZXQgbG5nQm94ID0gdHIuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbG5nJylbMF1cclxuICAgICAgICAgIGxldCBsbmcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJylcclxuICAgICAgICAgIGxuZy5pbm5lckhUTUwgPSAoX3RoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubG5nKS50b0ZpeGVkKDgpXHJcbiAgICAgICAgICBsbmdCb3guYXBwZW5kQ2hpbGQobG5nKVxyXG4gICAgICAgICAgbGV0IGxuZ0lucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKVxyXG4gICAgICAgICAgbG5nSW5wdXQuY2xhc3NOYW1lID0gJ2lucHV0J1xyXG4gICAgICAgICAgbG5nSW5wdXQudHlwZSA9ICdudW1iZXInXHJcbiAgICAgICAgICBsbmdJbnB1dC50aXRsZSA9ICcnXHJcbiAgICAgICAgICBsbmdJbnB1dC5taW4gPSAtMTgwXHJcbiAgICAgICAgICBsbmdJbnB1dC5tYXggPSAxODBcclxuICAgICAgICAgIGxuZ0lucHV0LnZhbHVlID0gKF90aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxuZykudG9GaXhlZCg4KVxyXG5cclxuICAgICAgICAgIGxldCBsYXRCb3ggPSB0ci5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdsYXQnKVswXVxyXG4gICAgICAgICAgbGV0IGxhdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKVxyXG4gICAgICAgICAgbGF0LmlubmVySFRNTCA9IChfdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sYXQpLnRvRml4ZWQoOClcclxuICAgICAgICAgIGxhdEJveC5hcHBlbmRDaGlsZChsYXQpXHJcbiAgICAgICAgICBsZXQgbGF0SW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpXHJcbiAgICAgICAgICBsYXRJbnB1dC5jbGFzc05hbWUgPSAnaW5wdXQnXHJcbiAgICAgICAgICBsYXRJbnB1dC50eXBlID0gJ251bWJlcidcclxuICAgICAgICAgIGxhdElucHV0LnRpdGxlID0gJydcclxuICAgICAgICAgIGxhdElucHV0Lm1pbiA9IC05MFxyXG4gICAgICAgICAgbGF0SW5wdXQubWF4ID0gOTBcclxuICAgICAgICAgIGxhdElucHV0LnZhbHVlID0gKF90aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxhdCkudG9GaXhlZCg4KVxyXG5cclxuICAgICAgICAgIGxldCBhbHRCb3ggPSB0ci5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdhbHQnKVswXVxyXG4gICAgICAgICAgbGV0IGFsdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKVxyXG4gICAgICAgICAgYWx0LmlubmVySFRNTCA9IChfdGhpcy5oZWlnaHQpLnRvRml4ZWQoMilcclxuICAgICAgICAgIGFsdEJveC5hcHBlbmRDaGlsZChhbHQpXHJcbiAgICAgICAgICBsZXQgYWx0SW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpXHJcbiAgICAgICAgICBhbHRJbnB1dC5jbGFzc05hbWUgPSAnaW5wdXQnXHJcbiAgICAgICAgICBhbHRJbnB1dC50eXBlID0gJ251bWJlcidcclxuICAgICAgICAgIGFsdElucHV0LnRpdGxlID0gJydcclxuICAgICAgICAgIGFsdElucHV0Lm1pbiA9IC05OTk5OTk5XHJcbiAgICAgICAgICBhbHRJbnB1dC5tYXggPSA5OTk5OTk5OTlcclxuICAgICAgICAgIGFsdElucHV0LnZhbHVlID0gKF90aGlzLmhlaWdodCkudG9GaXhlZCgyKVxyXG5cclxuICAgICAgICAgIGxuZ0JveC5hZGRFdmVudExpc3RlbmVyKCdkYmxjbGljaycsICgpID0+IHtcclxuICAgICAgICAgICAgbG5nQm94LmlubmVySFRNTCA9ICcnXHJcbiAgICAgICAgICAgIGxuZ0lucHV0LnZhbHVlID0gTnVtYmVyKChfdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sbmcpLnRvRml4ZWQoOCkpXHJcbiAgICAgICAgICAgIGxuZ0JveC5hcHBlbmRDaGlsZChsbmdJbnB1dClcclxuICAgICAgICAgICAgbG5nSW5wdXQuZm9jdXMoKVxyXG4gICAgICAgICAgICBpZiAoX3RoaXMub3BlcmF0ZS5wb3NpdGlvbkVkaXRpbmcpIHtcclxuICAgICAgICAgICAgICBfdGhpcy5wb3NpdGlvbkVkaXRpbmcgPSBmYWxzZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIEFzc2VtYmxlT2JqZWN0LmNsb3NlTm9kZUVkaXQoX3RoaXMpXHJcbiAgICAgICAgICAgIF90aGlzLmhlaWdodE1vZGUgPSBfdGhpcy5oZWlnaHRNb2RlXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgbG5nSW5wdXQuYWRkRXZlbnRMaXN0ZW5lcignYmx1cicsICgpID0+IHtcclxuICAgICAgICAgICAgbG5nSW5wdXQudmFsdWUgPSBOdW1iZXIoKF90aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxuZykudG9GaXhlZCg4KSlcclxuICAgICAgICAgICAgbG5nQm94LmlubmVySFRNTCA9ICcnXHJcbiAgICAgICAgICAgIGxuZ0JveC5hcHBlbmRDaGlsZChsbmcpXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgbG5nSW5wdXQuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIF90aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxuZyA9IE51bWJlcihOdW1iZXIobG5nSW5wdXQudmFsdWUpLnRvRml4ZWQoOCkpXHJcbiAgICAgICAgICAgIGxuZy5pbm5lckhUTUwgPSBfdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sbmcudG9GaXhlZCg4KVxyXG4gICAgICAgICAgICBfdGhpcy5oZWlnaHQgPSBfdGhpcy5oZWlnaHRcclxuICAgICAgICAgIH0pXHJcblxyXG4gICAgICAgICAgbGF0Qm94LmFkZEV2ZW50TGlzdGVuZXIoJ2RibGNsaWNrJywgKCkgPT4ge1xyXG4gICAgICAgICAgICBsYXRCb3guaW5uZXJIVE1MID0gJydcclxuICAgICAgICAgICAgbGF0SW5wdXQudmFsdWUgPSBOdW1iZXIoKF90aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxhdCkudG9GaXhlZCg4KSlcclxuICAgICAgICAgICAgbGF0Qm94LmFwcGVuZENoaWxkKGxhdElucHV0KVxyXG4gICAgICAgICAgICBsYXRJbnB1dC5mb2N1cygpXHJcbiAgICAgICAgICAgIGlmIChfdGhpcy5vcGVyYXRlLnBvc2l0aW9uRWRpdGluZykge1xyXG4gICAgICAgICAgICAgIF90aGlzLnBvc2l0aW9uRWRpdGluZyA9IGZhbHNlXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgQXNzZW1ibGVPYmplY3QuY2xvc2VOb2RlRWRpdChfdGhpcylcclxuICAgICAgICAgICAgX3RoaXMuaGVpZ2h0TW9kZSA9IF90aGlzLmhlaWdodE1vZGVcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICBsYXRJbnB1dC5hZGRFdmVudExpc3RlbmVyKCdibHVyJywgKCkgPT4ge1xyXG4gICAgICAgICAgICBsYXRJbnB1dC52YWx1ZSA9IE51bWJlcigoX3RoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubGF0KS50b0ZpeGVkKDgpKVxyXG4gICAgICAgICAgICBsYXRCb3guaW5uZXJIVE1MID0gJydcclxuICAgICAgICAgICAgbGF0Qm94LmFwcGVuZENoaWxkKGxhdClcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICBsYXRJbnB1dC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICgpID0+IHtcclxuICAgICAgICAgICAgX3RoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubGF0ID0gTnVtYmVyKE51bWJlcihsYXRJbnB1dC52YWx1ZSkudG9GaXhlZCg4KSlcclxuICAgICAgICAgICAgbGF0LmlubmVySFRNTCA9IF90aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxhdC50b0ZpeGVkKDgpXHJcbiAgICAgICAgICAgIF90aGlzLmhlaWdodCA9IF90aGlzLmhlaWdodFxyXG4gICAgICAgICAgfSlcclxuXHJcbiAgICAgICAgICBhbHRCb3guYWRkRXZlbnRMaXN0ZW5lcignZGJsY2xpY2snLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChfdGhpcy5oZWlnaHRNb2RlID09IDIpIHtcclxuICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYWx0Qm94LmlubmVySFRNTCA9ICcnXHJcbiAgICAgICAgICAgIGFsdElucHV0LnZhbHVlID0gTnVtYmVyKChfdGhpcy5oZWlnaHQpLnRvRml4ZWQoMikpXHJcbiAgICAgICAgICAgIGFsdEJveC5hcHBlbmRDaGlsZChhbHRJbnB1dClcclxuICAgICAgICAgICAgYWx0SW5wdXQuZm9jdXMoKVxyXG4gICAgICAgICAgICBpZiAoX3RoaXMub3BlcmF0ZS5wb3NpdGlvbkVkaXRpbmcpIHtcclxuICAgICAgICAgICAgICBfdGhpcy5wb3NpdGlvbkVkaXRpbmcgPSBmYWxzZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIEFzc2VtYmxlT2JqZWN0LmNsb3NlTm9kZUVkaXQoX3RoaXMpXHJcbiAgICAgICAgICAgIF90aGlzLmhlaWdodE1vZGUgPSBfdGhpcy5oZWlnaHRNb2RlXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgYWx0SW5wdXQuYWRkRXZlbnRMaXN0ZW5lcignYmx1cicsICgpID0+IHtcclxuICAgICAgICAgICAgYWx0SW5wdXQudmFsdWUgPSBOdW1iZXIoKF90aGlzLmhlaWdodCkudG9GaXhlZCgyKSlcclxuICAgICAgICAgICAgYWx0Qm94LmlubmVySFRNTCA9ICcnXHJcbiAgICAgICAgICAgIGFsdEJveC5hcHBlbmRDaGlsZChhbHQpXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgYWx0SW5wdXQuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIF90aGlzLmhlaWdodCA9IE51bWJlcihOdW1iZXIoYWx0SW5wdXQudmFsdWUpLnRvRml4ZWQoMikpXHJcbiAgICAgICAgICAgIGFsdC5pbm5lckhUTUwgPSBOdW1iZXIoX3RoaXMuaGVpZ2h0LnRvRml4ZWQoMikpXHJcbiAgICAgICAgICB9KVxyXG5cclxuXHJcbiAgICAgICAgICBfdGhpcy5fZWxtcy5sbmcucHVzaChsbmcpXHJcbiAgICAgICAgICBfdGhpcy5fZWxtcy5sbmdJbnB1dC5wdXNoKGxuZ0lucHV0KVxyXG4gICAgICAgICAgX3RoaXMuX2VsbXMubGF0LnB1c2gobGF0KVxyXG4gICAgICAgICAgX3RoaXMuX2VsbXMubGF0SW5wdXQucHVzaChsYXRJbnB1dClcclxuICAgICAgICAgIF90aGlzLl9lbG1zLmFsdC5wdXNoKGFsdClcclxuICAgICAgICAgIF90aGlzLl9lbG1zLmFsdElucHV0LnB1c2goYWx0SW5wdXQpXHJcbiAgICAgICAgICB0Qm9keUVsbS5hcHBlbmRDaGlsZCh0cilcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuX0RpYWxvZ09iamVjdCA9IGF3YWl0IG5ldyBEaWFsb2codGhpcy5zZGssIHRoaXMub3B0aW9ucywge1xyXG4gICAgICAgIHRpdGxlOiAn6ZuG57uT5Zyw5bGe5oCnJywgbGVmdDogJzE4MHB4JywgdG9wOiAnMTAwcHgnLFxyXG4gICAgICAgIGNvbmZpcm1DYWxsQmFjazogKG9wdGlvbnMpID0+IHtcclxuICAgICAgICAgIHRoaXMubmFtZSA9IHRoaXMubmFtZS50cmltKClcclxuICAgICAgICAgIGlmICghdGhpcy5uYW1lKSB7XHJcbiAgICAgICAgICAgIHRoaXMubmFtZSA9ICfmnKrlkb3lkI3lr7nosaEnXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLm9wdGlvbnMubGFiZWwucG9zaXRpb24gPSB7IGxuZzogdGhpcy5sYWJlbC5wb3NpdGlvblswXSwgbGF0OiB0aGlzLmxhYmVsLnBvc2l0aW9uWzFdLCBhbHQ6IHRoaXMubGFiZWwucG9zaXRpb25bMl0gfVxyXG4gICAgICAgICAgdGhpcy5vcmlnaW5hbE9wdGlvbnMgPSB0aGlzLmRlZXBDb3B5T2JqKHRoaXMub3B0aW9ucylcclxuICAgICAgICAgIHRoaXMuX0RpYWxvZ09iamVjdC5jbG9zZSgpXHJcbiAgICAgICAgICB0aGlzLkRpYWxvZy5jb25maXJtQ2FsbEJhY2sgJiYgdGhpcy5EaWFsb2cuY29uZmlybUNhbGxCYWNrKHRoaXMub3JpZ2luYWxPcHRpb25zKVxyXG4gICAgICAgICAgc3luY0RhdGEodGhpcy5zZGssIHRoaXMub3B0aW9ucy5pZClcclxuICAgICAgICAgIHN5bmNTcGxpdERhdGEodGhpcy5zZGssIHRoaXMub3B0aW9ucy5pZClcclxuICAgICAgICB9LFxyXG4gICAgICAgIHJlc2V0Q2FsbEJhY2s6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMucmVzZXQoKVxyXG4gICAgICAgICAgdGhpcy5EaWFsb2cucmVzZXRDYWxsQmFjayAmJiB0aGlzLkRpYWxvZy5yZXNldENhbGxCYWNrKClcclxuICAgICAgICB9LFxyXG4gICAgICAgIHJlbW92ZUNhbGxCYWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLkRpYWxvZy5yZW1vdmVDYWxsQmFjayAmJiB0aGlzLkRpYWxvZy5yZW1vdmVDYWxsQmFjaygpXHJcbiAgICAgICAgfSxcclxuICAgICAgICBjbG9zZUNhbGxCYWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnJlc2V0KClcclxuICAgICAgICAgIHRoaXMucG9zaXRpb25FZGl0aW5nID0gZmFsc2VcclxuICAgICAgICAgIHRoaXMuRGlhbG9nLmNsb3NlQ2FsbEJhY2sgJiYgdGhpcy5EaWFsb2cuY2xvc2VDYWxsQmFjaygpXHJcbiAgICAgICAgfSxcclxuICAgICAgICBzaG93Q2FsbEJhY2s6IChzaG93KSA9PiB7XHJcbiAgICAgICAgICB0aGlzLm9wdGlvbnMuc2hvdyA9IHNob3dcclxuICAgICAgICAgIHRoaXMub3JpZ2luYWxPcHRpb25zLnNob3cgPSBzaG93XHJcbiAgICAgICAgICB0aGlzLnNob3cgPSBzaG93XHJcbiAgICAgICAgICB0aGlzLkRpYWxvZy5zaG93Q2FsbEJhY2sgJiYgdGhpcy5EaWFsb2cuc2hvd0NhbGxCYWNrKClcclxuICAgICAgICB9LFxyXG4gICAgICAgIHRyYW5zbGF0aW9uYWxDYWxsQmFjazogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5wb3NpdGlvbkVkaXRpbmcgPSAhdGhpcy5wb3NpdGlvbkVkaXRpbmdcclxuICAgICAgICB9LFxyXG4gICAgICAgIC8vIOS6jOasoee8lui+keWbnuiwg1xyXG4gICAgICAgIHNlY29uZGFyeUVkaXRDYWxsQmFjazogKCkgPT4ge1xyXG4gICAgICAgICAgQXNzZW1ibGVPYmplY3Qubm9kZUVkaXQodGhpcywgKCkgPT4ge1xyXG4gICAgICAgICAgICBjcmVhdGVTcGF0aWFsSW5mb1RhYmxlQ29udGVudCgpXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmJvZHkuY2xhc3NOYW1lID0gdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmJvZHkuY2xhc3NOYW1lICsgJyBhc3NlbWJsZSdcclxuICAgICAgbGV0IGNvbnRlbnRFbG0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgY29udGVudEVsbS5pbm5lckhUTUwgPSBodG1sKHRoaXMpXHJcbiAgICAgIHRoaXMuX0RpYWxvZ09iamVjdC5jb250ZW50QXBwQ2hpbGQoY29udGVudEVsbSlcclxuICAgICAgdGhpcy5hdHRyaWJ1dGVUeXBlID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZVR5cGVcclxuICAgICAgdGhpcy5hdHRyaWJ1dGVDYW1lcmEgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmNhbWVyYS5jb250ZW50XHJcblxyXG4gICAgICAvLyDliJvlu7rmoIfnrb7pobVcclxuICAgICAgbGV0IHRhYnNFbG0gPSBuZXcgY3lfdGFicygnYXNzZW1ibGUtb2JqZWN0LWVkaXQtdGFicycsIHVuZGVmaW5lZCwgdGhpcy5zZGspXHJcbiAgICAgIC8vIOminOiJsue7hOS7tlxyXG4gICAgICBsZXQgY29sb3JQaWNrZXIgPSBuZXcgWUpDb2xvclBpY2tlcih7XHJcbiAgICAgICAgZWw6IGNvbnRlbnRFbG0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcImNvbG9yXCIpWzBdLFxyXG4gICAgICAgIHNpemU6ICdtaW5pJywvL+minOiJsmJveOexu+Wei1xyXG4gICAgICAgIGFscGhhOiB0cnVlLC8v5piv5ZCm5byA5ZCv6YCP5piO5bqmXHJcbiAgICAgICAgZGVmYXVsdENvbG9yOiB0aGlzLmNvbG9yLFxyXG4gICAgICAgIGRpc2FibGVkOiBmYWxzZSwvL+aYr+WQpuemgeatouaJk+W8gOminOiJsumAieaLqeWZqFxyXG4gICAgICAgIG9wZW5QaWNrZXJBbmk6ICdvcGFjaXR5JywvL+aJk+W8gOminOiJsumAieaLqeWZqOWKqOeUu1xyXG4gICAgICAgIHN1cmU6IChjb2xvcikgPT4ge1xyXG4gICAgICAgICAgdGhpcy5jb2xvciA9IGNvbG9yXHJcbiAgICAgICAgfSwvL+eCueWHu+ehruiupOaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICAgIGNsZWFyOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmNvbG9yID0gJ3JnYmEoMjU1LDI1NSwyNTUsMSknXHJcbiAgICAgICAgfSwvL+eCueWHu+a4heepuuaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICB9KVxyXG4gICAgICBsZXQgbGluZWNvbG9yUGlja2VyID0gbmV3IFlKQ29sb3JQaWNrZXIoe1xyXG4gICAgICAgIGVsOiBjb250ZW50RWxtLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXCJsaW5lQ29sb3JcIilbMF0sXHJcbiAgICAgICAgc2l6ZTogJ21pbmknLC8v6aKc6ImyYm9457G75Z6LXHJcbiAgICAgICAgYWxwaGE6IHRydWUsLy/mmK/lkKblvIDlkK/pgI/mmI7luqZcclxuICAgICAgICBkZWZhdWx0Q29sb3I6IHRoaXMubGluZUNvbG9yLFxyXG4gICAgICAgIGRpc2FibGVkOiBmYWxzZSwvL+aYr+WQpuemgeatouaJk+W8gOminOiJsumAieaLqeWZqFxyXG4gICAgICAgIG9wZW5QaWNrZXJBbmk6ICdvcGFjaXR5JywvL+aJk+W8gOminOiJsumAieaLqeWZqOWKqOeUu1xyXG4gICAgICAgIHN1cmU6IChjb2xvcikgPT4ge1xyXG4gICAgICAgICAgdGhpcy5saW5lQ29sb3IgPSBjb2xvclxyXG4gICAgICAgIH0sLy/ngrnlh7vnoa7orqTmjInpkq7kuovku7blm57osINcclxuICAgICAgICBjbGVhcjogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5saW5lQ29sb3IgPSAncmdiYSgyNTUsMjU1LDI1NSwxKSdcclxuICAgICAgICB9LC8v54K55Ye75riF56m65oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgIH0pXHJcbiAgICAgIGxldCBsYWJlbENvbG9yUGlja2VyID0gbmV3IFlKQ29sb3JQaWNrZXIoe1xyXG4gICAgICAgIGVsOiBjb250ZW50RWxtLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXCJsYWJlbENvbG9yXCIpWzBdLFxyXG4gICAgICAgIHNpemU6ICdtaW5pJywvL+minOiJsmJveOexu+Wei1xyXG4gICAgICAgIGFscGhhOiB0cnVlLC8v5piv5ZCm5byA5ZCv6YCP5piO5bqmXHJcbiAgICAgICAgZGVmYXVsdENvbG9yOiB0aGlzLmxhYmVsQ29sb3IsXHJcbiAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLC8v5piv5ZCm56aB5q2i5omT5byA6aKc6Imy6YCJ5oup5ZmoXHJcbiAgICAgICAgb3BlblBpY2tlckFuaTogJ29wYWNpdHknLC8v5omT5byA6aKc6Imy6YCJ5oup5Zmo5Yqo55S7XHJcbiAgICAgICAgc3VyZTogKGNvbG9yKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmxhYmVsQ29sb3IgPSBjb2xvclxyXG4gICAgICAgIH0sLy/ngrnlh7vnoa7orqTmjInpkq7kuovku7blm57osINcclxuICAgICAgICBjbGVhcjogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5sYWJlbENvbG9yID0gJ3JnYmEoMjU1LDI1NSwyNTUsMSknXHJcbiAgICAgICAgfSwvL+eCueWHu+a4heepuuaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICB9KVxyXG4gICAgICBsZXQgbGFiZWxsaW5lQ29sb3JQaWNrZXIgPSBuZXcgWUpDb2xvclBpY2tlcih7XHJcbiAgICAgICAgZWw6IGNvbnRlbnRFbG0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcImxhYmVsTGluZUNvbG9yXCIpWzBdLFxyXG4gICAgICAgIHNpemU6ICdtaW5pJywvL+minOiJsmJveOexu+Wei1xyXG4gICAgICAgIGFscGhhOiB0cnVlLC8v5piv5ZCm5byA5ZCv6YCP5piO5bqmXHJcbiAgICAgICAgZGVmYXVsdENvbG9yOiB0aGlzLmxhYmVsTGluZUNvbG9yLFxyXG4gICAgICAgIGRpc2FibGVkOiBmYWxzZSwvL+aYr+WQpuemgeatouaJk+W8gOminOiJsumAieaLqeWZqFxyXG4gICAgICAgIG9wZW5QaWNrZXJBbmk6ICdvcGFjaXR5JywvL+aJk+W8gOminOiJsumAieaLqeWZqOWKqOeUu1xyXG4gICAgICAgIHN1cmU6IChjb2xvcikgPT4ge1xyXG4gICAgICAgICAgdGhpcy5sYWJlbExpbmVDb2xvciA9IGNvbG9yXHJcbiAgICAgICAgfSwvL+eCueWHu+ehruiupOaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICAgIGNsZWFyOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmxhYmVsTGluZUNvbG9yID0gJ3JnYmEoMjU1LDI1NSwyNTUsMSknXHJcbiAgICAgICAgfSwvL+eCueWHu+a4heepuuaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICB9KVxyXG4gICAgICBsZXQgbGFiZWxCYWNrZ3JvdW5kQ29sb3JTdGFydFBpY2tlciA9IG5ldyBZSkNvbG9yUGlja2VyKHtcclxuICAgICAgICBlbDogY29udGVudEVsbS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFwibGFiZWxCYWNrZ3JvdW5kQ29sb3JTdGFydFwiKVswXSxcclxuICAgICAgICBzaXplOiAnbWluaScsXHJcbiAgICAgICAgYWxwaGE6IHRydWUsXHJcbiAgICAgICAgZGVmYXVsdENvbG9yOiB0aGlzLmxhYmVsQmFja2dyb3VuZENvbG9yU3RhcnQsXHJcbiAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLFxyXG4gICAgICAgIG9wZW5QaWNrZXJBbmk6ICdvcGFjaXR5JyxcclxuICAgICAgICBzdXJlOiAoY29sb3IpID0+IHtcclxuICAgICAgICAgIHRoaXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JTdGFydCA9IGNvbG9yXHJcbiAgICAgICAgfSxcclxuICAgICAgICBjbGVhcjogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5sYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0ID0gJ3JnYmEoMjU1LDI1NSwyNTUsMSknXHJcbiAgICAgICAgfSxcclxuICAgICAgfSlcclxuICAgICAgbGV0IGxhYmVsQmFja2dyb3VuZENvbG9yRW5kUGlja2VyID0gbmV3IFlKQ29sb3JQaWNrZXIoe1xyXG4gICAgICAgIGVsOiBjb250ZW50RWxtLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXCJsYWJlbEJhY2tncm91bmRDb2xvckVuZFwiKVswXSxcclxuICAgICAgICBzaXplOiAnbWluaScsXHJcbiAgICAgICAgYWxwaGE6IHRydWUsXHJcbiAgICAgICAgZGVmYXVsdENvbG9yOiB0aGlzLmxhYmVsQmFja2dyb3VuZENvbG9yRW5kLFxyXG4gICAgICAgIGRpc2FibGVkOiBmYWxzZSxcclxuICAgICAgICBvcGVuUGlja2VyQW5pOiAnb3BhY2l0eScsXHJcbiAgICAgICAgc3VyZTogKGNvbG9yKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmxhYmVsQmFja2dyb3VuZENvbG9yRW5kID0gY29sb3JcclxuICAgICAgICB9LFxyXG4gICAgICAgIGNsZWFyOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmxhYmVsQmFja2dyb3VuZENvbG9yRW5kID0gJ3JnYmEoMjU1LDI1NSwyNTUsMSknXHJcbiAgICAgICAgfSxcclxuICAgICAgfSlcclxuICAgICAgbGV0IGFsbF9lbG0gPSBjb250ZW50RWxtLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiKlwiKVxyXG4gICAgICBBc3NlbWJsZU9iamVjdC5FdmVudEJpbmRpbmcodGhpcywgYWxsX2VsbSlcclxuICAgICAgdGhpcy5fZWxtcy5jb2xvciA9IFtjb2xvclBpY2tlcl1cclxuICAgICAgdGhpcy5fZWxtcy5saW5lQ29sb3IgPSBbbGluZWNvbG9yUGlja2VyXVxyXG4gICAgICB0aGlzLl9lbG1zLmxhYmVsQ29sb3IgPSBbbGFiZWxDb2xvclBpY2tlcl1cclxuICAgICAgdGhpcy5fZWxtcy5sYWJlbExpbmVDb2xvciA9IFtsYWJlbGxpbmVDb2xvclBpY2tlcl1cclxuICAgICAgdGhpcy5fZWxtcy5sYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0ID0gW2xhYmVsQmFja2dyb3VuZENvbG9yU3RhcnRQaWNrZXJdXHJcbiAgICAgIHRoaXMuX2VsbXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmQgPSBbbGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmRQaWNrZXJdXHJcblxyXG4gICAgICBsZXQgaGVpZ2h0Qm94RWxtID0gdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaGVpZ2h0LWJveCcpWzBdXHJcbiAgICAgIGxldCBoZWlnaHRFbG0gPSBoZWlnaHRCb3hFbG0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaGVpZ2h0JylbMF1cclxuICAgICAgbGV0IGhlaWdodENvbmZpcm1FbG0gPSB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdoZWlnaHQtY29uZmlybScpWzBdXHJcbiAgICAgIGhlaWdodEVsbS52YWx1ZSA9IDEwXHJcbiAgICAgIGlmICh0aGlzLmhlaWdodE1vZGUgPT0gMikge1xyXG4gICAgICAgIGhlaWdodEJveEVsbSAmJiAoaGVpZ2h0Qm94RWxtLmNsYXNzTmFtZSA9ICdpbnB1dC1udW1iZXIgaW5wdXQtbnVtYmVyLXVuaXQtMSBoZWlnaHQtYm94IGRpc2FibGVkJyk7XHJcbiAgICAgICAgaGVpZ2h0Q29uZmlybUVsbSAmJiBoZWlnaHRDb25maXJtRWxtLnNldEF0dHJpYnV0ZSgnZGlzYWJsZWQnLCAnZGlzYWJsZWQnKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBoZWlnaHRCb3hFbG0gJiYgKGhlaWdodEJveEVsbS5jbGFzc05hbWUgPSAnaW5wdXQtbnVtYmVyIGlucHV0LW51bWJlci11bml0LTEgaGVpZ2h0LWJveCcpO1xyXG4gICAgICAgIGhlaWdodENvbmZpcm1FbG0gJiYgaGVpZ2h0Q29uZmlybUVsbS5yZW1vdmVBdHRyaWJ1dGUoJ2Rpc2FibGVkJyk7XHJcbiAgICAgIH1cclxuICAgICAgbGV0IGhlaWdodE1vZGVEYXRhID0gW1xyXG4gICAgICAgIHtcclxuICAgICAgICAgIG5hbWU6ICfmtbfmi5Tpq5jluqYnLFxyXG4gICAgICAgICAgdmFsdWU6ICfmtbfmi5Tpq5jluqYnLFxyXG4gICAgICAgICAga2V5OiAnMCcsXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBuYW1lOiAn55u45a+55Zyw6KGoJyxcclxuICAgICAgICAgIHZhbHVlOiAn55u45a+55Zyw6KGoJyxcclxuICAgICAgICAgIGtleTogJzEnLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgbmFtZTogJ+S+nemZhOaooeWeiycsXHJcbiAgICAgICAgICB2YWx1ZTogJ+S+nemZhOaooeWeiycsXHJcbiAgICAgICAgICBrZXk6ICcyJyxcclxuICAgICAgICB9XHJcbiAgICAgIF1cclxuICAgICAgbGV0IGhlaWdodE1vZGVPYmplY3QgPSBsZWdwKFxyXG4gICAgICAgIHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXHJcbiAgICAgICAgICAnaGVpZ2h0LW1vZGUtYm94J1xyXG4gICAgICAgIClbMF0sXHJcbiAgICAgICAgJy5oZWlnaHQtbW9kZSdcclxuICAgICAgKVxyXG4gICAgICBpZiAoaGVpZ2h0TW9kZU9iamVjdCkge1xyXG4gICAgICAgIGhlaWdodE1vZGVPYmplY3QubGVncF9zZWFyY2goaGVpZ2h0TW9kZURhdGEpXHJcbiAgICAgICAgbGV0IGhlaWdodE1vZGVEYXRhTGVncEVsbSA9IHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50XHJcbiAgICAgICAgICAuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaGVpZ2h0LW1vZGUnKVswXVxyXG4gICAgICAgICAgLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdpbnB1dCcpWzBdXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoZWlnaHRNb2RlRGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgaWYgKGhlaWdodE1vZGVEYXRhW2ldLmtleSA9PSB0aGlzLmhlaWdodE1vZGUpIHtcclxuICAgICAgICAgICAgaGVpZ2h0TW9kZURhdGFMZWdwRWxtLnZhbHVlID0gaGVpZ2h0TW9kZURhdGFbaV0udmFsdWVcclxuICAgICAgICAgICAgaGVpZ2h0TW9kZU9iamVjdC5sZWdwX3NlYXJjaEFjdGl2ZShcclxuICAgICAgICAgICAgICBoZWlnaHRNb2RlRGF0YVtpXS52YWx1ZVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGhlaWdodE1vZGVEYXRhTGVncEVsbS5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICgpID0+IHtcclxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaGVpZ2h0TW9kZURhdGEubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKGhlaWdodE1vZGVEYXRhW2ldLnZhbHVlID09PSBoZWlnaHRNb2RlRGF0YUxlZ3BFbG0udmFsdWUpIHtcclxuICAgICAgICAgICAgICB0aGlzLmhlaWdodE1vZGUgPSBoZWlnaHRNb2RlRGF0YVtpXS5rZXlcclxuICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuXHJcbiAgICAgICAgaGVpZ2h0RWxtLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKCkgPT4ge1xyXG4gICAgICAgICAgc3dpdGNoICh0aGlzLmhlaWdodE1vZGUpIHtcclxuICAgICAgICAgICAgY2FzZSAwOlxyXG4gICAgICAgICAgICBjYXNlICcwJzpcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAxOlxyXG4gICAgICAgICAgICBjYXNlICcxJzpcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAyOlxyXG4gICAgICAgICAgICBjYXNlICcyJzpcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG5cclxuICAgICAgICB0aGlzLl9lbG1zLmhlaWdodCA9IGhlaWdodEVsbVxyXG4gICAgICAgIHRoaXMuX2VsbXMuaGVpZ2h0Qm94ID0gaGVpZ2h0Qm94RWxtXHJcbiAgICAgICAgdGhpcy5fZWxtcy5oZWlnaHRNb2RlID0gaGVpZ2h0TW9kZURhdGFMZWdwRWxtXHJcbiAgICAgICAgdGhpcy5fZWxtcy5oZWlnaHRDb25maXJtID0gaGVpZ2h0Q29uZmlybUVsbVxyXG4gICAgICAgIHRoaXMuX2VsbXMuaGVpZ2h0TW9kZU9iamVjdCA9IGhlaWdodE1vZGVPYmplY3RcclxuXHJcbiAgICAgICAgaGVpZ2h0Q29uZmlybUVsbS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcclxuICAgICAgICAgIGlmICh0aGlzLm9wZXJhdGUucG9zaXRpb25FZGl0aW5nKSB7XHJcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb25FZGl0aW5nID0gZmFsc2VcclxuICAgICAgICAgICAgdGhpcy5oZWlnaHQgPSB0aGlzLmhlaWdodCArIE51bWJlcihoZWlnaHRFbG0udmFsdWUpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgQXNzZW1ibGVPYmplY3QuY2xvc2VOb2RlRWRpdCh0aGlzKVxyXG4gICAgICAgICAgICB0aGlzLmhlaWdodE1vZGUgPSB0aGlzLmhlaWdodE1vZGVcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgdGhpcy5oZWlnaHQgPSB0aGlzLmhlaWdodCArIE51bWJlcihoZWlnaHRFbG0udmFsdWUpXHJcbiAgICAgICAgICAgIH0sIDEwMCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgfVxyXG5cclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5hdHRyaWJ1dGVMaW5rID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnRcclxuICAgICAgICB0aGlzLmF0dHJpYnV0ZVZyID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52ci5jb250ZW50XHJcbiAgICAgICAgdGhpcy5jYW1lcmFTZWxlY3QgJiYgdGhpcy5jYW1lcmFTZWxlY3QoKVxyXG4gICAgICAgIHRoaXMuZ29vZHNTZWxlY3QgJiYgdGhpcy5nb29kc1NlbGVjdCgpXHJcbiAgICAgICAgbGV0IHRhZ0RhdGEgPSB0aGlzLmF0dHJpYnV0ZVNlbGVjdFxyXG4gICAgICAgIGxldCBhdHRyaWJ1dGVFbG0gPSB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdhdHRyaWJ1dGUtc2VsZWN0LWJveCcpWzBdXHJcbiAgICAgICAgaWYgKGF0dHJpYnV0ZUVsbSkge1xyXG4gICAgICAgICAgbGV0IGxlZ3BPYmplY3QgPSBsZWdwKGF0dHJpYnV0ZUVsbSwgXCIuYXR0cmlidXRlLXNlbGVjdFwiKVxyXG4gICAgICAgICAgbGVncE9iamVjdC5sZWdwX3NlYXJjaCh0YWdEYXRhKVxyXG4gICAgICAgICAgbGV0IGF0dHJpYnV0ZVNlbGVjdEVsbSA9IHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2F0dHJpYnV0ZS1zZWxlY3QnKVswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaW5wdXQnKVswXVxyXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YWdEYXRhLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmICh0YWdEYXRhW2ldLmtleSA9PT0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZVR5cGUpIHtcclxuICAgICAgICAgICAgICBhdHRyaWJ1dGVTZWxlY3RFbG0udmFsdWUgPSB0YWdEYXRhW2ldLnZhbHVlXHJcbiAgICAgICAgICAgICAgbGVncE9iamVjdC5sZWdwX3NlYXJjaEFjdGl2ZSh0YWdEYXRhW2ldLnZhbHVlKVxyXG4gICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGF0dHJpYnV0ZVNlbGVjdEVsbS5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICgpID0+IHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YWdEYXRhLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgaWYgKHRhZ0RhdGFbaV0udmFsdWUgPT09IGF0dHJpYnV0ZVNlbGVjdEVsbS52YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hdHRyaWJ1dGVUeXBlID0gdGFnRGF0YVtpXS5rZXlcclxuICAgICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuICAgICAgICBjcmVhdGVTcGF0aWFsSW5mb1RhYmxlQ29udGVudCgpXHJcblxyXG4gICAgICAgIGxldCB1bml0RGF0YSA9IFt7XHJcbiAgICAgICAgICBuYW1lOiAn5bmz5pa557GzJyxcclxuICAgICAgICAgIHZhbHVlOiAn5bmz5pa557GzJ1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgbmFtZTogJ+W5s+aWueWNg+exsycsXHJcbiAgICAgICAgICB2YWx1ZTogJ+W5s+aWueWNg+exsydcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIG5hbWU6ICfkuqknLFxyXG4gICAgICAgICAgdmFsdWU6ICfkuqknXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBuYW1lOiAn5YWs6aG3JyxcclxuICAgICAgICAgIHZhbHVlOiAn5YWs6aG3J1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgXVxyXG4gICAgICAgIGxldCB1bml0RGF0YUxlZ3BPYmplY3QgPSBsZWdwKHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2lucHV0LXNlbGVjdC11bml0LWJveCcpWzBdLCBcIi5pbnB1dC1zZWxlY3QtdW5pdFwiKVxyXG4gICAgICAgIGlmICh1bml0RGF0YUxlZ3BPYmplY3QpIHtcclxuICAgICAgICAgIHVuaXREYXRhTGVncE9iamVjdC5sZWdwX3NlYXJjaCh1bml0RGF0YSlcclxuICAgICAgICAgIGxldCB1bml0RGF0YUxlZ3BFbG0gPSB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdpbnB1dC1zZWxlY3QtdW5pdCcpWzBdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdpbnB1dCcpWzBdXHJcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHVuaXREYXRhLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmICh1bml0RGF0YVtpXS52YWx1ZSA9PT0gdW5pdERhdGFMZWdwRWxtLnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgdW5pdERhdGFMZWdwT2JqZWN0LmxlZ3Bfc2VhcmNoQWN0aXZlKHVuaXREYXRhW2ldLnZhbHVlKVxyXG4gICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHVuaXREYXRhTGVncEVsbS5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICgpID0+IHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB1bml0RGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgIGlmICh1bml0RGF0YVtpXS52YWx1ZSA9PT0gdW5pdERhdGFMZWdwRWxtLnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFyZWFVbml0ID0gdW5pdERhdGFbaV0udmFsdWVcclxuICAgICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IGZvbnREYXRhID0gZ2V0Rm9udExpc3QoKVxyXG4gICAgICAgIGxldCBmb250T2JqZWN0ID0gbGVncChcclxuICAgICAgICAgIHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXHJcbiAgICAgICAgICAgICdmb250LXNlbGVjdC1ib3gnXHJcbiAgICAgICAgICApWzBdLFxyXG4gICAgICAgICAgJy5mb250LXNlbGVjdCdcclxuICAgICAgICApXHJcbiAgICAgICAgaWYgKGZvbnRPYmplY3QpIHtcclxuICAgICAgICAgIGZvbnRPYmplY3QubGVncF9zZWFyY2goZm9udERhdGEpXHJcbiAgICAgICAgICBsZXQgZm9udERhdGFMZWdwRWxtID0gdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnRcclxuICAgICAgICAgICAgLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2ZvbnQtc2VsZWN0JylbMF1cclxuICAgICAgICAgICAgLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdpbnB1dCcpWzBdXHJcbiAgICAgICAgICBmb250RGF0YUxlZ3BFbG0udmFsdWUgPSBmb250RGF0YVt0aGlzLmxhYmVsRm9udEZhbWlseV0udmFsdWVcclxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZm9udERhdGEubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKGZvbnREYXRhW2ldLnZhbHVlID09IGZvbnREYXRhTGVncEVsbS52YWx1ZSkge1xyXG4gICAgICAgICAgICAgIGZvbnRPYmplY3QubGVncF9zZWFyY2hBY3RpdmUoZm9udERhdGFbaV0udmFsdWUpXHJcbiAgICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZm9udERhdGFMZWdwRWxtLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKCkgPT4ge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZvbnREYXRhLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgaWYgKGZvbnREYXRhW2ldLnZhbHVlID09PSBmb250RGF0YUxlZ3BFbG0udmFsdWUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubGFiZWxGb250RmFtaWx5ID0gZm9udERhdGFbaV0ua2V5XHJcbiAgICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIHRoaXMuX2VsbXMubGFiZWxGb250RmFtaWx5ID0gW2ZvbnREYXRhTGVncEVsbV1cclxuICAgICAgICB9XHJcblxyXG4gICAgICB9LCAwKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmICh0aGlzLl9EaWFsb2dPYmplY3QgJiYgdGhpcy5fRGlhbG9nT2JqZWN0LmNsb3NlKSB7XHJcbiAgICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0LmNsb3NlKClcclxuICAgICAgICB0aGlzLl9EaWFsb2dPYmplY3QgPSBudWxsXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlc2V0KCkge1xyXG4gICAgaWYgKCF0aGlzLmVudGl0eSkge1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuICAgIHRoaXMub3B0aW9ucyA9IHRoaXMuZGVlcENvcHlPYmoodGhpcy5vcmlnaW5hbE9wdGlvbnMpXHJcbiAgICB0aGlzLm5hbWUgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5uYW1lXHJcbiAgICB0aGlzLmNvbG9yID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMuY29sb3JcclxuICAgIHRoaXMubGluZUNvbG9yID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMubGluZS5jb2xvclxyXG4gICAgdGhpcy5saW5lV2lkdGggPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5saW5lLndpZHRoXHJcbiAgICB0aGlzLmxhYmVsU2hvdyA9IHRoaXMub3JpZ2luYWxPcHRpb25zLmxhYmVsLnNob3dcclxuICAgIHRoaXMubGFiZWxDb2xvciA9IHRoaXMub3JpZ2luYWxPcHRpb25zLmxhYmVsLmNvbG9yXHJcbiAgICB0aGlzLmxhYmVsRm9udFNpemUgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5sYWJlbC5mb250U2l6ZVxyXG4gICAgdGhpcy5sYWJlbEZvbnRGYW1pbHkgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5sYWJlbC5mb250RmFtaWx5XHJcbiAgICB0aGlzLmxhYmVsU2NhbGVCeURpc3RhbmNlID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMubGFiZWwuc2NhbGVCeURpc3RhbmNlXHJcbiAgICB0aGlzLmxhYmVsTmVhciA9IHRoaXMub3JpZ2luYWxPcHRpb25zLmxhYmVsLm5lYXJcclxuICAgIHRoaXMubGFiZWxGYXIgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5sYWJlbC5mYXJcclxuICAgIHRoaXMubGFiZWxMaW5lV2lkdGggPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5sYWJlbC5saW5lV2lkdGhcclxuICAgIHRoaXMubGFiZWxQaXhlbE9mZnNldCA9IHRoaXMub3JpZ2luYWxPcHRpb25zLmxhYmVsLnBpeGVsT2Zmc2V0XHJcbiAgICB0aGlzLmxhYmVsTGluZUNvbG9yID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMubGFiZWwubGluZUNvbG9yXHJcbiAgICB0aGlzLmxhYmVsQmFja2dyb3VuZENvbG9yU3RhcnQgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5sYWJlbC5iYWNrZ3JvdW5kQ29sb3JbMF1cclxuICAgIHRoaXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmQgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5sYWJlbC5iYWNrZ3JvdW5kQ29sb3JbMV1cclxuXHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm9wdGlvbnMucG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGlmICh0aGlzLl9lbG1zLmxuZyAmJiB0aGlzLl9lbG1zLmxuZ1tpXSkge1xyXG4gICAgICAgIHRoaXMuX2VsbXMubG5nW2ldLmlubmVySFRNTCA9IHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubG5nLnRvRml4ZWQoOClcclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy5fZWxtcy5sYXQgJiYgdGhpcy5fZWxtcy5sYXRbaV0pIHtcclxuICAgICAgICB0aGlzLl9lbG1zLmxhdFtpXS5pbm5lckhUTUwgPSB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxhdC50b0ZpeGVkKDgpXHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRoaXMuX2VsbXMuYWx0ICYmIHRoaXMuX2VsbXMuYWx0W2ldKSB7XHJcbiAgICAgICAgdGhpcy5fZWxtcy5hbHRbaV0uaW5uZXJIVE1MID0gTnVtYmVyKHRoaXMub3B0aW9ucy5oZWlnaHQudG9GaXhlZCgyKSlcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaGVpZ2h0TW9kZSA9IHRoaXMuaGVpZ2h0TW9kZVxyXG5cclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubm9kZVBvaW50cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICB0aGlzLnNkay52aWV3ZXIuZW50aXRpZXMucmVtb3ZlKHRoaXMubm9kZVBvaW50c1tpXSlcclxuICAgIH1cclxuICAgIHRoaXMucHJldmlvdXMgPSBudWxsXHJcbiAgICB0aGlzLm5vZGVQb2ludHMgPSBbXVxyXG4gICAgWUouTWVhc3VyZS5TZXRNZWFzdXJlU3RhdHVzKGZhbHNlKVxyXG4gICAgdGhpcy5ldmVudCAmJiB0aGlzLmV2ZW50LmRlc3Ryb3koKVxyXG4gICAgdGhpcy50aXAgJiYgdGhpcy50aXAuZGVzdHJveSgpXHJcbiAgfVxyXG5cclxuICBhc3luYyByZW1vdmUoKSB7XHJcbiAgICB0aGlzLnNkay52aWV3ZXIuZW50aXRpZXMucmVtb3ZlKHRoaXMuZW50aXR5KVxyXG4gICAgdGhpcy5sYWJlbCAmJiB0aGlzLmxhYmVsLnJlbW92ZSgpXHJcbiAgICB0aGlzLmV2ZW50ICYmIHRoaXMuZXZlbnQuZGVzdHJveSgpXHJcbiAgICB0aGlzLnRpcCAmJiB0aGlzLnRpcC5kZXN0cm95KClcclxuICAgIHRoaXMuZW50aXR5ID0gbnVsbFxyXG4gICAgaWYgKHRoaXMuX0RpYWxvZ09iamVjdCAmJiAhdGhpcy5fRGlhbG9nT2JqZWN0LmlzRGVzdHJveSkge1xyXG4gICAgICB0aGlzLl9EaWFsb2dPYmplY3QuY2xvc2UoKVxyXG4gICAgICB0aGlzLl9EaWFsb2dPYmplY3QgPSBudWxsXHJcbiAgICB9XHJcbiAgICBhd2FpdCB0aGlzLnNkay5yZW1vdmVJbmNldGFuY2UodGhpcy5vcHRpb25zLmlkKVxyXG4gICAgYXdhaXQgc3luY0RhdGEodGhpcy5zZGssIHRoaXMub3B0aW9ucy5pZClcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gKiDpo57liLBcclxuKi9cclxuICBhc3luYyBmbHlUbyhvcHRpb25zID0ge30pIHtcclxuICAgIGlmICh0aGlzLl9lcnJvcikge1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuICAgIHNldEFjdGl2ZVZpZXdlcigwKVxyXG4gICAgY2xvc2VSb3RhdGVBcm91bmQodGhpcy5zZGspXHJcbiAgICBjbG9zZVZpZXdGb2xsb3codGhpcy5zZGspXHJcblxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5jdXN0b21WaWV3ICYmIHRoaXMub3B0aW9ucy5jdXN0b21WaWV3LnJlbGF0aXZlUG9zaXRpb24gJiYgdGhpcy5vcHRpb25zLmN1c3RvbVZpZXcub3JpZW50YXRpb24pIHtcclxuICAgICAgbGV0IG9yaWVudGF0aW9uID0ge1xyXG4gICAgICAgIGhlYWRpbmc6IENlc2l1bS5NYXRoLnRvUmFkaWFucyh0aGlzLm9wdGlvbnMuY3VzdG9tVmlldy5vcmllbnRhdGlvbi5oZWFkaW5nIHx8IDAuMCksXHJcbiAgICAgICAgcGl0Y2g6IENlc2l1bS5NYXRoLnRvUmFkaWFucyh0aGlzLm9wdGlvbnMuY3VzdG9tVmlldy5vcmllbnRhdGlvbi5waXRjaCB8fCAtNjAuMCksXHJcbiAgICAgICAgcm9sbDogQ2VzaXVtLk1hdGgudG9SYWRpYW5zKHRoaXMub3B0aW9ucy5jdXN0b21WaWV3Lm9yaWVudGF0aW9uLnJvbGwgfHwgMC4wKVxyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgbG5nID0gdGhpcy5vcHRpb25zLmN1c3RvbVZpZXcucmVsYXRpdmVQb3NpdGlvbi5sbmdcclxuICAgICAgbGV0IGxhdCA9IHRoaXMub3B0aW9ucy5jdXN0b21WaWV3LnJlbGF0aXZlUG9zaXRpb24ubGF0XHJcbiAgICAgIGxldCBhbHQgPSB0aGlzLm9wdGlvbnMuY3VzdG9tVmlldy5yZWxhdGl2ZVBvc2l0aW9uLmFsdFxyXG4gICAgICBsZXQgZGVzdGluYXRpb24gPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlcyhsbmcsIGxhdCwgYWx0KVxyXG5cclxuICAgICAgbGV0IHBvc2l0aW9uID0geyBsbmc6IDAsIGxhdDogMCB9XHJcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMucG9zaXRpb24pIHtcclxuICAgICAgICBwb3NpdGlvbiA9IHsgLi4udGhpcy5vcHRpb25zLnBvc2l0aW9uIH1cclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmICh0aGlzLm9wdGlvbnMucG9zaXRpb25zKSB7XHJcbiAgICAgICAgcG9zaXRpb24gPSB7IC4uLnRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0gfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKHRoaXMub3B0aW9ucy5jZW50ZXIpIHtcclxuICAgICAgICBwb3NpdGlvbiA9IHsgLi4udGhpcy5vcHRpb25zLmNlbnRlciB9XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAodGhpcy5vcHRpb25zLnN0YXJ0KSB7XHJcbiAgICAgICAgcG9zaXRpb24gPSB7IC4uLnRoaXMub3B0aW9ucy5zdGFydCB9XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgnbG5nJykpIHtcclxuICAgICAgICAgIHBvc2l0aW9uLmxuZyA9IHRoaXMub3B0aW9ucy5sbmdcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgnbGF0JykpIHtcclxuICAgICAgICAgIHBvc2l0aW9uLmxhdCA9IHRoaXMub3B0aW9ucy5sYXRcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgnYWx0JykpIHtcclxuICAgICAgICAgIHBvc2l0aW9uLmFsdCA9IHRoaXMub3B0aW9ucy5hbHRcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgLy8g5aaC5p6c5rKh5pyJ6auY5bqm5YC877yM5YiZ6I635Y+W57Sn6LS06auY5bqm6K6h566XXHJcbiAgICAgIGlmICghcG9zaXRpb24uaGFzT3duUHJvcGVydHkoJ2FsdCcpKSB7XHJcbiAgICAgICAgcG9zaXRpb24uYWx0ID0gYXdhaXQgdGhpcy5nZXRDbGFtcFRvSGVpZ2h0KHBvc2l0aW9uKVxyXG4gICAgICB9XHJcbiAgICAgIGxuZyA9IHRoaXMub3B0aW9ucy5jdXN0b21WaWV3LnJlbGF0aXZlUG9zaXRpb24ubG5nICsgcG9zaXRpb24ubG5nXHJcbiAgICAgIGxhdCA9IHRoaXMub3B0aW9ucy5jdXN0b21WaWV3LnJlbGF0aXZlUG9zaXRpb24ubGF0ICsgcG9zaXRpb24ubGF0XHJcbiAgICAgIGFsdCA9IHRoaXMub3B0aW9ucy5jdXN0b21WaWV3LnJlbGF0aXZlUG9zaXRpb24uYWx0ICsgcG9zaXRpb24uYWx0XHJcbiAgICAgIGRlc3RpbmF0aW9uID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXMobG5nLCBsYXQsIGFsdClcclxuICAgICAgdGhpcy5zZGsudmlld2VyLmNhbWVyYS5mbHlUbyh7XHJcbiAgICAgICAgZGVzdGluYXRpb246IGRlc3RpbmF0aW9uLFxyXG4gICAgICAgIG9yaWVudGF0aW9uOiBvcmllbnRhdGlvblxyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGxldCBwb3NpdGlvbkFycmF5ID0gW11cclxuICAgICAgbGV0IGdyb3VuZFxyXG4gICAgICBzd2l0Y2ggKHRoaXMuaGVpZ2h0TW9kZSkge1xyXG4gICAgICAgIGNhc2UgMDpcclxuICAgICAgICBjYXNlICcwJzpcclxuICAgICAgICAgIGdyb3VuZCA9IGZhbHNlXHJcbiAgICAgICAgICBicmVha1xyXG4gICAgICAgIGNhc2UgMTpcclxuICAgICAgICBjYXNlICcxJzpcclxuICAgICAgICAgIGdyb3VuZCA9IGZhbHNlXHJcbiAgICAgICAgICBicmVha1xyXG4gICAgICAgIGNhc2UgMjpcclxuICAgICAgICBjYXNlICcyJzpcclxuICAgICAgICAgIGdyb3VuZCA9IHRydWVcclxuICAgICAgICAgIGJyZWFrXHJcbiAgICAgIH1cclxuICAgICAgaWYgKGdyb3VuZCkge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5vcHRpb25zLnBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgbGV0IGhlaWdodCA9IGF3YWl0IHRoaXMuZ2V0Q2xhbXBUb0hlaWdodCh0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldKVxyXG4gICAgICAgICAgbGV0IGEgPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlcyhcclxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sbmcsXHJcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubGF0LFxyXG4gICAgICAgICAgICBoZWlnaHRcclxuICAgICAgICAgIClcclxuICAgICAgICAgIHBvc2l0aW9uQXJyYXkucHVzaChhLngsIGEueSwgYS56KVxyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpZiAodGhpcy5wb3NpdGlvbnNIKSB7XHJcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucG9zaXRpb25zSC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBwb3NpdGlvbkFycmF5LnB1c2godGhpcy5wb3NpdGlvbnNIW2ldLngsIHRoaXMucG9zaXRpb25zSFtpXS55LCB0aGlzLnBvc2l0aW9uc0hbaV0ueilcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgbGV0IEJvdW5kaW5nU3BoZXJlID0gQ2VzaXVtLkJvdW5kaW5nU3BoZXJlLmZyb21WZXJ0aWNlcyhwb3NpdGlvbkFycmF5KVxyXG4gICAgICB0aGlzLnNkay52aWV3ZXIuY2FtZXJhLmZseVRvQm91bmRpbmdTcGhlcmUoQm91bmRpbmdTcGhlcmUsIHtcclxuICAgICAgICBvZmZzZXQ6IG9wdGlvbnMub3JpZW50YXRpb24gfHwge1xyXG4gICAgICAgICAgaGVhZGluZzogQ2VzaXVtLk1hdGgudG9SYWRpYW5zKDAuMCksXHJcbiAgICAgICAgICBwaXRjaDogQ2VzaXVtLk1hdGgudG9SYWRpYW5zKC05MC4wKSxcclxuICAgICAgICAgIHJvbGw6IENlc2l1bS5NYXRoLnRvUmFkaWFucygwLjApXHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICog5omT5byA5a+M5paH5pys5qGGXHJcbiAgICovXHJcbiAgb3BlblJpY2hUZXh0RWRpdG9yKGUpIHtcclxuICAgIC8vIHZhciB1ZSA9IFVFLmdldEVkaXRvcignYXBwJyk7XHJcbiAgICByaWNoVGV4dC5vcGVuKHRoaXMub3B0aW9ucy5pZCwgdGhpcy5vcHRpb25zLm5hbWUsIHRoaXMub3B0aW9ucy5yaWNoVGV4dENvbnRlbnQpXHJcbiAgICByaWNoVGV4dC5wcmltYXJ5Q2FsbEJhY2sgPSAoY29udGVudCkgPT4ge1xyXG4gICAgICB0aGlzLm9wdGlvbnMucmljaFRleHRDb250ZW50ID0gY29udGVudFxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqQGRlc2Mg5omT5byA5bmz56e75Yqf6IO9XHJcbiAgICpcclxuICAgKiBAbWVtYmVyT2YgU291cmNlXHJcbiAgICogQHBhcmFtIHN0YXR1cyB7Ym9vbGVhbn1cclxuICAgKlxyXG4gICAqICovXHJcbiAgc2V0IHBvc2l0aW9uRWRpdGluZyhzdGF0dXMpIHtcclxuICAgIGlmIChZSi5NZWFzdXJlLkdldE1lYXN1cmVTdGF0dXMoKSB8fCAhdGhpcy5zZGsgfHwgIXRoaXMuc2RrLnZpZXdlciB8fCAhdGhpcy5lbnRpdHkgfHwgIXRoaXMuZW50aXR5LnBvbHlnb24pIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzXHJcbiAgICB0aGlzLmV2ZW50ICYmIHRoaXMuZXZlbnQuZGVzdHJveSgpXHJcbiAgICB0aGlzLmV2ZW50ID0gbmV3IE1vdXNlRXZlbnQodGhpcy5zZGspXHJcbiAgICB0aGlzLm9wZXJhdGUucG9zaXRpb25FZGl0aW5nID0gc3RhdHVzXHJcblxyXG4gICAgaWYgKHN0YXR1cyA9PT0gdHJ1ZSkge1xyXG4gICAgICB0aGlzLnByZXZpb3VzID0ge1xyXG4gICAgICAgIHBvc2l0aW9uczogWy4uLnRoaXMucG9zaXRpb25zXVxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMudGlwICYmIHRoaXMudGlwLmRlc3Ryb3koKVxyXG4gICAgICB0aGlzLnRpcCA9IG5ldyBNb3VzZVRpcCgn54K55Ye76byg5qCH5bem6ZSu56Gu6K6k77yM5Y+z6ZSu5Y+W5raIJywgdGhpcy5zZGspXHJcbiAgICAgIHRoaXMubGFiZWwgJiYgKHRoaXMubGFiZWwuZW50aXR5LmJpbGxib2FyZC5jb2xvciA9IENlc2l1bS5Db2xvci5mcm9tQ3NzQ29sb3JTdHJpbmcoYHJnYmEoMjU1LDI1NSwyNTUsMC45KWApKVxyXG4gICAgICB0aGlzLnBpY2tpbmcgPSBmYWxzZVxyXG4gICAgICBsZXQgYXJyYXkgPSBbXVxyXG4gICAgICBsZXQgcG9zaXRpb25zID0gWy4uLnRoaXMucG9zaXRpb25zXVxyXG4gICAgICBsZXQgZGlzcGFyaXR5ID0gW11cclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBsZXQgcG9zaXRpb24gPSB0aGlzLmNhcnRlc2lhbjNUb3dnczg0KHBvc2l0aW9uc1tpXSwgdGhpcy5zZGsudmlld2VyKVxyXG4gICAgICAgIGFycmF5LnB1c2goW3Bvc2l0aW9uLmxuZywgcG9zaXRpb24ubGF0XSlcclxuICAgICAgfVxyXG4gICAgICBsZXQgZmlyc3Rwb3NpdGlvbiA9IHRoaXMuY2FydGVzaWFuM1Rvd2dzODQocG9zaXRpb25zWzBdLCB0aGlzLnNkay52aWV3ZXIpXHJcbiAgICAgIGFycmF5LnB1c2goW2ZpcnN0cG9zaXRpb24ubG5nLCBmaXJzdHBvc2l0aW9uLmxhdF0pXHJcbiAgICAgIHZhciBwb2x5Z29uID0gdHVyZi5wb2x5Z29uKFthcnJheV0pO1xyXG4gICAgICB2YXIgY2VudHJvaWQgPSB0dXJmLmNlbnRyb2lkKHBvbHlnb24pO1xyXG4gICAgICBsZXQgY2VudGVyID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXMoLi4uY2VudHJvaWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXMpXHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY2VudGVyLnggLSBwb3NpdGlvbnNbaV0ueFxyXG4gICAgICAgIGRpc3Bhcml0eS5wdXNoKHtcclxuICAgICAgICAgIHg6IGNlbnRlci54IC0gcG9zaXRpb25zW2ldLngsXHJcbiAgICAgICAgICB5OiBjZW50ZXIueSAtIHBvc2l0aW9uc1tpXS55LFxyXG4gICAgICAgICAgejogY2VudGVyLnogLSBwb3NpdGlvbnNbaV0ueixcclxuICAgICAgICB9KVxyXG4gICAgICB9XHJcbiAgICAgIGxldCBuZXdwb3NpdGlvbnMgPSBbXVxyXG4gICAgICB0aGlzLmV2ZW50Lm1vdXNlX21vdmUoKG1vdmVtZW50LCBjYXJ0ZXNpYW4pID0+IHtcclxuICAgICAgICBsZXQgcG9zaXRpb244NCA9IHRoaXMuY2FydGVzaWFuM1Rvd2dzODQoY2FydGVzaWFuLCB0aGlzLnNkay52aWV3ZXIpXHJcbiAgICAgICAgbmV3cG9zaXRpb25zID0gW11cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRpc3Bhcml0eS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgbmV3cG9zaXRpb25zLnB1c2goe1xyXG4gICAgICAgICAgICB4OiBjYXJ0ZXNpYW4ueCAtIGRpc3Bhcml0eVtpXS54LFxyXG4gICAgICAgICAgICB5OiBjYXJ0ZXNpYW4ueSAtIGRpc3Bhcml0eVtpXS55LFxyXG4gICAgICAgICAgICB6OiBjYXJ0ZXNpYW4ueiAtIGRpc3Bhcml0eVtpXS56LFxyXG4gICAgICAgICAgfSlcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gdGhpcy5sYWJlbC5wb3NpdGlvbiA9IFtwb3NpdGlvbjg0LmxuZywgcG9zaXRpb244NC5sYXQsIHBvc2l0aW9uODQuYWx0XVxyXG4gICAgICAgIHRoaXMudGlwLnNldFBvc2l0aW9uKFxyXG4gICAgICAgICAgY2FydGVzaWFuLFxyXG4gICAgICAgICAgbW92ZW1lbnQuZW5kUG9zaXRpb24ueCxcclxuICAgICAgICAgIG1vdmVtZW50LmVuZFBvc2l0aW9uLnlcclxuICAgICAgICApXHJcbiAgICAgIH0pXHJcbiAgICAgIHRoaXMuZXZlbnQubW91c2VfbGVmdCgobW92ZW1lbnQsIGNhcnRlc2lhbikgPT4ge1xyXG4gICAgICAgIHRoaXMuZXZlbnQubW91c2VfbW92ZSgoKSA9PiB7IH0pXHJcbiAgICAgICAgdGhpcy5ldmVudC5tb3VzZV9sZWZ0KCgpID0+IHsgfSlcclxuICAgICAgICB0aGlzLmV2ZW50Lm1vdXNlX3JpZ2h0KCgpID0+IHsgfSlcclxuICAgICAgICB0aGlzLmV2ZW50Lmdlc3R1cmVfcGluY2tfc3RhcnQoKCkgPT4geyB9KVxyXG4gICAgICAgIG5ld3Bvc2l0aW9ucyA9IFtdXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkaXNwYXJpdHkubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGxldCBwb3MzID0ge1xyXG4gICAgICAgICAgICB4OiBjYXJ0ZXNpYW4ueCAtIGRpc3Bhcml0eVtpXS54LFxyXG4gICAgICAgICAgICB5OiBjYXJ0ZXNpYW4ueSAtIGRpc3Bhcml0eVtpXS55LFxyXG4gICAgICAgICAgICB6OiBjYXJ0ZXNpYW4ueiAtIGRpc3Bhcml0eVtpXS56LFxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgbmV3cG9zaXRpb25zLnB1c2gocG9zMylcclxuICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0gPSB0aGlzLmNhcnRlc2lhbjNUb3dnczg0KHBvczMsIHRoaXMuc2RrLnZpZXdlcilcclxuICAgICAgICAgIGlmICh0aGlzLl9lbG1zLmxuZyAmJiB0aGlzLl9lbG1zLmxuZ1tpXSkge1xyXG4gICAgICAgICAgICB0aGlzLl9lbG1zLmxuZ1tpXS5pbm5lckhUTUwgPSB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxuZy50b0ZpeGVkKDgpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAodGhpcy5fZWxtcy5sYXQgJiYgdGhpcy5fZWxtcy5sYXRbaV0pIHtcclxuICAgICAgICAgICAgdGhpcy5fZWxtcy5sYXRbaV0uaW5uZXJIVE1MID0gdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sYXQudG9GaXhlZCg4KVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnBvc2l0aW9ucyA9IG5ld3Bvc2l0aW9uc1xyXG4gICAgICAgIHRoaXMucHJldmlvdXMgPSBudWxsXHJcbiAgICAgICAgdGhpcy5wb3NpdGlvbkVkaXRpbmcgPSBmYWxzZVxyXG5cclxuICAgICAgICBpZih0aGlzLl9wb3NpdGlvbkVkaXRpbmdDYWxsYmFjaykge1xyXG4gICAgICAgICAgdGhpcy5fcG9zaXRpb25FZGl0aW5nQ2FsbGJhY2soKVxyXG4gICAgICAgICAgdGhpcy5fcG9zaXRpb25FZGl0aW5nQ2FsbGJhY2sgPSBudWxsXHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgICB0aGlzLmV2ZW50Lm1vdXNlX3JpZ2h0KChtb3ZlbWVudCwgY2FydGVzaWFuKSA9PiB7XHJcbiAgICAgICAgdGhpcy5wb3NpdGlvbkVkaXRpbmcgPSBmYWxzZVxyXG4gICAgICB9KVxyXG5cclxuICAgICAgdGhpcy5ldmVudC5nZXN0dXJlX3BpbmNrX3N0YXJ0KChtb3ZlbWVudCwgY2FydGVzaWFuKSA9PiB7XHJcbiAgICAgICAgbGV0IHN0YXJ0VGltZSA9IG5ldyBEYXRlKClcclxuICAgICAgICB0aGlzLmV2ZW50Lmdlc3R1cmVfcGluY2tfZW5kKCgpID0+IHtcclxuICAgICAgICAgIGxldCBlbmRUaW1lID0gbmV3IERhdGUoKVxyXG4gICAgICAgICAgaWYgKGVuZFRpbWUgLSBzdGFydFRpbWUgPj0gNTAwKSB7XHJcbiAgICAgICAgICAgIC8vIOmVv+aMieWPlua2iFxyXG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uRWRpdGluZyA9IGZhbHNlXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5ldmVudC5tb3VzZV9tb3ZlKCgpID0+IHsgfSlcclxuICAgICAgICAgICAgdGhpcy5ldmVudC5tb3VzZV9sZWZ0KCgpID0+IHsgfSlcclxuICAgICAgICAgICAgdGhpcy5ldmVudC5tb3VzZV9yaWdodCgoKSA9PiB7IH0pXHJcbiAgICAgICAgICAgIHRoaXMuZXZlbnQuZ2VzdHVyZV9waW5ja19zdGFydCgoKSA9PiB7IH0pXHJcbiAgICAgICAgICAgIG5ld3Bvc2l0aW9ucyA9IFtdXHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGlzcGFyaXR5Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgbGV0IHBvczMgPSB7XHJcbiAgICAgICAgICAgICAgICB4OiBjYXJ0ZXNpYW4ueCAtIGRpc3Bhcml0eVtpXS54LFxyXG4gICAgICAgICAgICAgICAgeTogY2FydGVzaWFuLnkgLSBkaXNwYXJpdHlbaV0ueSxcclxuICAgICAgICAgICAgICAgIHo6IGNhcnRlc2lhbi56IC0gZGlzcGFyaXR5W2ldLnosXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIG5ld3Bvc2l0aW9ucy5wdXNoKHBvczMpXHJcbiAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXSA9IHRoaXMuY2FydGVzaWFuM1Rvd2dzODQocG9zMywgdGhpcy5zZGsudmlld2VyKVxyXG4gICAgICAgICAgICAgIGlmICh0aGlzLl9lbG1zLmxuZyAmJiB0aGlzLl9lbG1zLmxuZ1tpXSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZWxtcy5sbmdbaV0uaW5uZXJIVE1MID0gdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sbmcudG9GaXhlZCg4KVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBpZiAodGhpcy5fZWxtcy5sYXQgJiYgdGhpcy5fZWxtcy5sYXRbaV0pIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2VsbXMubGF0W2ldLmlubmVySFRNTCA9IHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubGF0LnRvRml4ZWQoOClcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5wb3NpdGlvbnMgPSBuZXdwb3NpdGlvbnNcclxuICAgICAgICAgICAgdGhpcy5wcmV2aW91cyA9IHtcclxuICAgICAgICAgICAgICBwb3NpdGlvbnM6IFsuLi50aGlzLnBvc2l0aW9uc11cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uRWRpdGluZyA9IGZhbHNlXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgfSlcclxuXHJcbiAgICAgIHRoaXMuZW50aXR5LnBvbHlnb24uaGllcmFyY2h5ID0gbmV3IENlc2l1bS5DYWxsYmFja1Byb3BlcnR5KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBsZXQgcG9zaXRpb244NCA9IFtdXHJcbiAgICAgICAgaWYgKG5ld3Bvc2l0aW9ucy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5ld3Bvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBwb3NpdGlvbjg0LnB1c2goX3RoaXMuY2FydGVzaWFuM1Rvd2dzODQobmV3cG9zaXRpb25zW2ldLCBfdGhpcy5zZGsudmlld2VyKSlcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBwb3NpdGlvbjg0LnB1c2goX3RoaXMuY2FydGVzaWFuM1Rvd2dzODQocG9zaXRpb25zW2ldLCBfdGhpcy5zZGsudmlld2VyKSlcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgX3RoaXMucmVuZXdQb3NpdGlvbnMocG9zaXRpb244NClcclxuICAgICAgICByZXR1cm4gbmV3IENlc2l1bS5Qb2x5Z29uSGllcmFyY2h5KF90aGlzLnBvc2l0aW9uc0gpXHJcbiAgICAgIH0sIGZhbHNlKVxyXG4gICAgICB0aGlzLmVudGl0eS5wb2x5bGluZS5wb3NpdGlvbnMgPSBuZXcgQ2VzaXVtLkNhbGxiYWNrUHJvcGVydHkoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHJldHVybiBbLi4uX3RoaXMucG9zaXRpb25zSCwgX3RoaXMucG9zaXRpb25zSFswXSwgX3RoaXMucG9zaXRpb25zSFsxXV1cclxuICAgICAgfSwgZmFsc2UpXHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKHRoaXMubGFiZWwgJiYgdGhpcy5sYWJlbC5lbnRpdHkgJiYgdGhpcy5sYWJlbC5lbnRpdHkuYmlsbGJvYXJkKSB7XHJcbiAgICAgICAgdGhpcy5sYWJlbC5lbnRpdHkuYmlsbGJvYXJkLmNvbG9yID0gQ2VzaXVtLkNvbG9yLmZyb21Dc3NDb2xvclN0cmluZyhgcmdiYSgyNTUsMjU1LDI1NSwxKWApXHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5waWNraW5nID0gdHJ1ZVxyXG4gICAgICBpZiAodGhpcy5ldmVudCkge1xyXG4gICAgICAgIHRoaXMuZXZlbnQubW91c2VfbW92ZSgoKSA9PiB7IH0pXHJcbiAgICAgICAgdGhpcy5ldmVudC5tb3VzZV9sZWZ0KCgpID0+IHsgfSlcclxuICAgICAgICB0aGlzLmV2ZW50Lm1vdXNlX3JpZ2h0KCgpID0+IHsgfSlcclxuICAgICAgICB0aGlzLmV2ZW50Lmdlc3R1cmVfcGluY2tfc3RhcnQoKCkgPT4geyB9KVxyXG4gICAgICAgIHRoaXMuZXZlbnQuZGVzdHJveSgpXHJcbiAgICAgIH1cclxuICAgICAgdGhpcy50aXAgJiYgdGhpcy50aXAuZGVzdHJveSgpXHJcbiAgICAgIGlmICghdGhpcy5wcmV2aW91cykge1xyXG4gICAgICAgIHRoaXMucHJldmlvdXMgPSB7XHJcbiAgICAgICAgICBwb3NpdGlvbnM6IFsuLi50aGlzLnBvc2l0aW9uc11cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdGhpcy5wb3NpdGlvbnMgPSBbLi4udGhpcy5wcmV2aW91cy5wb3NpdGlvbnNdXHJcbiAgICAgIH1cclxuICAgICAgbGV0IHBvc2l0aW9uODQgPSBbXVxyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgcG9zaXRpb244NC5wdXNoKF90aGlzLmNhcnRlc2lhbjNUb3dnczg0KHRoaXMucG9zaXRpb25zW2ldLCBfdGhpcy5zZGsudmlld2VyKSlcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5yZW5ld1Bvc2l0aW9ucyhwb3NpdGlvbjg0KVxyXG4gICAgICB0aGlzLmVudGl0eS5wb2x5Z29uLmhpZXJhcmNoeSA9IG5ldyBDZXNpdW0uQ2FsbGJhY2tQcm9wZXJ0eShmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBDZXNpdW0uUG9seWdvbkhpZXJhcmNoeShfdGhpcy5wb3NpdGlvbnNIKVxyXG4gICAgICB9LCB0cnVlKVxyXG4gICAgICB0aGlzLmVudGl0eS5wb2x5bGluZS5wb3NpdGlvbnMgPSBuZXcgQ2VzaXVtLkNhbGxiYWNrUHJvcGVydHkoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHJldHVybiBbLi4uX3RoaXMucG9zaXRpb25zSCwgX3RoaXMucG9zaXRpb25zSFswXSwgX3RoaXMucG9zaXRpb25zSFsxXV1cclxuICAgICAgfSwgdHJ1ZSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCBwb3NpdGlvbkVkaXRpbmcoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcGVyYXRlLnBvc2l0aW9uRWRpdGluZ1xyXG4gIH1cclxuICBvcGVuUG9zaXRpb25FZGl0aW5nKGNkKSB7XHJcbiAgICB0aGlzLnBvc2l0aW9uRWRpdGluZyA9IHRydWVcclxuICAgIHRoaXMuX3Bvc2l0aW9uRWRpdGluZ0NhbGxiYWNrID0gY2RcclxuICB9XHJcbiAgZ2V0IGFyZWFDaGFuZ2VDYWxsQmFjaygpIHtcclxuICAgIHJldHVybiB0aGlzLl9hcmVhQ2hhbmdlQ2FsbEJhY2tcclxuICB9XHJcblxyXG4gIHNldCBhcmVhQ2hhbmdlQ2FsbEJhY2sgKGNkKSB7XHJcbiAgICB0aGlzLl9hcmVhQ2hhbmdlQ2FsbEJhY2sgPSBjZFxyXG4gIH1cclxuXHJcbiAgbm9kZUVkaXQoY2IgPSAoKSA9PiB7IH0pIHtcclxuICAgIHRoaXMucG9zaXRpb25FZGl0aW5nID0gZmFsc2VcclxuICAgIGlmIChZSi5NZWFzdXJlLkdldE1lYXN1cmVTdGF0dXMoKSkge1xyXG4gICAgICBjYign5LiK5LiA5qyh5rWL6YeP5pyq57uT5p2fJylcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIFlKLk1lYXN1cmUuU2V0TWVhc3VyZVN0YXR1cyh0cnVlKVxyXG4gICAgICBsZXQgX3RoaXMgPSB0aGlzXHJcbiAgICAgIHRoaXMudGlwID0gbmV3IE1vdXNlVGlwKCfor7fpgInmi6nkuIDkuKrpobbngrnvvIzlj7PplK7lj5bmtognLCB0aGlzLnNkaylcclxuICAgICAgdGhpcy5ldmVudCA9IG5ldyBNb3VzZUV2ZW50KHRoaXMuc2RrKVxyXG4gICAgICB0aGlzLm5vZGVQb2ludHMgPSBbXVxyXG4gICAgICBsZXQgc2VsZWN0UG9pbnRcclxuICAgICAgbGV0IG9yaWdpbmFsUG9zaXRpb25cclxuICAgICAgbGV0IGZyb21EZWdyZWVzQXJyYXkgPSBbXVxyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMub3B0aW9ucy5wb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBmcm9tRGVncmVlc0FycmF5LnB1c2godGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sbmcsIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubGF0KVxyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgbW92ZUV2ZW50ID0gKG1vdmVtZW50LCBjYXJ0ZXNpYW4pID0+IHtcclxuICAgICAgICBpZiAoc2VsZWN0UG9pbnQpIHtcclxuICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbc2VsZWN0UG9pbnQuaW5kZXhdID0gdGhpcy5jYXJ0ZXNpYW4zVG93Z3M4NChjYXJ0ZXNpYW4sIHRoaXMuc2RrLnZpZXdlcilcclxuICAgICAgICAgIGlmICh0aGlzLl9lbG1zLmxuZyAmJiB0aGlzLl9lbG1zLmxuZ1tzZWxlY3RQb2ludC5pbmRleF0pIHtcclxuICAgICAgICAgICAgdGhpcy5fZWxtcy5sbmdbc2VsZWN0UG9pbnQuaW5kZXhdLmlubmVySFRNTCA9IHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbc2VsZWN0UG9pbnQuaW5kZXhdLmxuZy50b0ZpeGVkKDgpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAodGhpcy5fZWxtcy5sYXQgJiYgdGhpcy5fZWxtcy5sYXRbc2VsZWN0UG9pbnQuaW5kZXhdKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2VsbXMubGF0W3NlbGVjdFBvaW50LmluZGV4XS5pbm5lckhUTUwgPSB0aGlzLm9wdGlvbnMucG9zaXRpb25zW3NlbGVjdFBvaW50LmluZGV4XS5sYXQudG9GaXhlZCg4KVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5yZW5ld1Bvc2l0aW9ucygpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMudGlwLnNldFBvc2l0aW9uKFxyXG4gICAgICAgICAgY2FydGVzaWFuLFxyXG4gICAgICAgICAgbW92ZW1lbnQucG9zaXRpb24gPyBtb3ZlbWVudC5wb3NpdGlvbi54IDogbW92ZW1lbnQuZW5kUG9zaXRpb24ueCxcclxuICAgICAgICAgIG1vdmVtZW50LnBvc2l0aW9uID8gbW92ZW1lbnQucG9zaXRpb24ueSA6IG1vdmVtZW50LmVuZFBvc2l0aW9uLnlcclxuICAgICAgICApXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBsZWZ0RXZlbnQgPSAobW92ZW1lbnQsIGNhcnRlc2lhbikgPT4ge1xyXG4gICAgICAgIG1vdmVFdmVudChtb3ZlbWVudCwgY2FydGVzaWFuKVxyXG4gICAgICAgIGxldCBwb3NpdGlvbjg0ID0gdGhpcy5jYXJ0ZXNpYW4zVG93Z3M4NChjYXJ0ZXNpYW4sIHRoaXMuc2RrLnZpZXdlcilcclxuICAgICAgICBpZiAoc2VsZWN0UG9pbnQpIHtcclxuICAgICAgICAgIGxldCBpbmRleCA9IHNlbGVjdFBvaW50LmluZGV4XHJcbiAgICAgICAgICBsZXQgZW50aXR5ID0gdGhpcy5zZGsudmlld2VyLmVudGl0aWVzLmFkZCh7XHJcbiAgICAgICAgICAgIG5hbWU6ICdub2RlLXNlY29uZGFyeS1lZGl0LXBvaW50JyxcclxuICAgICAgICAgICAgaW5kZXg6IGluZGV4LFxyXG4gICAgICAgICAgICBwb3NpdGlvbjogQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXModGhpcy5vcHRpb25zLnBvc2l0aW9uc1tzZWxlY3RQb2ludC5pbmRleF0ubG5nLCB0aGlzLm9wdGlvbnMucG9zaXRpb25zW3NlbGVjdFBvaW50LmluZGV4XS5sYXQsIHBvc2l0aW9uODQuYWx0KSxcclxuICAgICAgICAgICAgYmlsbGJvYXJkOiB7XHJcbiAgICAgICAgICAgICAgaW1hZ2U6IHRoaXMuZ2V0U291cmNlUm9vdFBhdGgoKSArICcvaW1nL3BvaW50LnBuZycsXHJcbiAgICAgICAgICAgICAgd2lkdGg6IDE1LFxyXG4gICAgICAgICAgICAgIGhlaWdodDogMTUsXHJcbiAgICAgICAgICAgICAgZGlzYWJsZURlcHRoVGVzdERpc3RhbmNlOiBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksXHJcbiAgICAgICAgICAgICAgY29sb3I6IENlc2l1bS5Db2xvci5XSElURS53aXRoQWxwaGEoMC45OSlcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICB0aGlzLm5vZGVQb2ludHMuc3BsaWNlKHNlbGVjdFBvaW50LmluZGV4LCAwLCBlbnRpdHkpXHJcbiAgICAgICAgICBzZWxlY3RQb2ludCA9IG51bGxcclxuXHJcbiAgICAgICAgICB0aGlzLnRpcC5zZXRfdGV4dCgn6K+36YCJ5oup5LiA5Liq6aG254K577yM5Y+z6ZSu5Y+W5raIJylcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBsZXQgcG9zaXRpb24gPSBtb3ZlbWVudC5wb3NpdGlvblxyXG4gICAgICAgICAgaWYgKCFwb3NpdGlvbikge1xyXG4gICAgICAgICAgICBwb3NpdGlvbiA9IHtcclxuICAgICAgICAgICAgICB4OiAobW92ZW1lbnQucG9zaXRpb24xLnggKyBtb3ZlbWVudC5wb3NpdGlvbjIueCkgLyAyLFxyXG4gICAgICAgICAgICAgIHk6IChtb3ZlbWVudC5wb3NpdGlvbjEueSArIG1vdmVtZW50LnBvc2l0aW9uMi55KSAvIDJcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdmFyIHBpY2sgPSB0aGlzLnNkay52aWV3ZXIuc2NlbmUucGljayhwb3NpdGlvbik7XHJcbiAgICAgICAgICBpZiAocGljayAmJiBwaWNrLmlkICYmIHBpY2suaWQubmFtZSAmJiBwaWNrLmlkLm5hbWUgPT09ICdub2RlLXNlY29uZGFyeS1lZGl0LXBvaW50Jykge1xyXG4gICAgICAgICAgICBzZWxlY3RQb2ludCA9IHBpY2suaWRcclxuICAgICAgICAgICAgb3JpZ2luYWxQb3NpdGlvbiA9IHRoaXMuY2FydGVzaWFuM1Rvd2dzODQocGljay5pZC5wb3NpdGlvbi5nZXRWYWx1ZSgpLCB0aGlzLnNkay52aWV3ZXIpXHJcbiAgICAgICAgICAgIHRoaXMubm9kZVBvaW50cy5zcGxpY2UocGljay5pZC5pbmRleCwgMSlcclxuICAgICAgICAgICAgdGhpcy5zZGsudmlld2VyLmVudGl0aWVzLnJlbW92ZShwaWNrLmlkKVxyXG4gICAgICAgICAgICB0aGlzLnRpcC5zZXRfdGV4dCgn5bem6ZSu56Gu6K6k77yM5Y+z6ZSu5Y+W5raIJylcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5yZW5ld1Bvc2l0aW9ucygpXHJcbiAgICAgICAgY2IoJycsIFsuLi50aGlzLm9wdGlvbnMucG9zaXRpb25zXSlcclxuICAgICAgfVxyXG4gICAgICBsZXQgcmlnaHRFdmVudCA9ICgpID0+IHtcclxuICAgICAgICB0aGlzLmV2ZW50Lm1vdXNlX21vdmUoKCkgPT4geyB9KVxyXG4gICAgICAgIHRoaXMuZXZlbnQubW91c2VfbGVmdCgoKSA9PiB7IH0pXHJcbiAgICAgICAgdGhpcy5ldmVudC5tb3VzZV9yaWdodCgoKSA9PiB7IH0pXHJcbiAgICAgICAgdGhpcy5ldmVudC5nZXN0dXJlX3BpbmNrX3N0YXJ0KCgpID0+IHsgfSlcclxuICAgICAgICBpZiAoc2VsZWN0UG9pbnQpIHtcclxuICAgICAgICAgIGlmICghb3JpZ2luYWxQb3NpdGlvbikge1xyXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zLnBvcCgpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tzZWxlY3RQb2ludC5pbmRleF0gPSBvcmlnaW5hbFBvc2l0aW9uXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAodGhpcy5fZWxtcy5sbmcgJiYgdGhpcy5fZWxtcy5sbmdbc2VsZWN0UG9pbnQuaW5kZXhdKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2VsbXMubG5nW3NlbGVjdFBvaW50LmluZGV4XS5pbm5lckhUTUwgPSB0aGlzLm9wdGlvbnMucG9zaXRpb25zW3NlbGVjdFBvaW50LmluZGV4XS5sbmcudG9GaXhlZCg4KVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKHRoaXMuX2VsbXMubGF0ICYmIHRoaXMuX2VsbXMubGF0W3NlbGVjdFBvaW50LmluZGV4XSkge1xyXG4gICAgICAgICAgICB0aGlzLl9lbG1zLmxhdFtzZWxlY3RQb2ludC5pbmRleF0uaW5uZXJIVE1MID0gdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tzZWxlY3RQb2ludC5pbmRleF0ubGF0LnRvRml4ZWQoOClcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5oZWlnaHRNb2RlID0gdGhpcy5oZWlnaHRNb2RlXHJcbiAgICAgICAgdGhpcy5wcmV2aW91cyA9IG51bGxcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5lbnRpdHkucG9seWxpbmUuY2xhbXBUb0dyb3VuZCA9IHRydWVcclxuICAgICAgdGhpcy5lbnRpdHkucG9seWxpbmUuYXJjVHlwZSA9IENlc2l1bS5BcmNUeXBlLkdFT0RFU0lDXHJcbiAgICAgIHRoaXMuZW50aXR5LnBvbHlnb24ucGVyUG9zaXRpb25IZWlnaHQgPSBmYWxzZVxyXG4gICAgICB0aGlzLmVudGl0eS5wb2x5Z29uLmhpZXJhcmNoeSA9IG5ldyBDZXNpdW0uQ2FsbGJhY2tQcm9wZXJ0eShmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgbGV0IGFyciA9IF90aGlzLmNvbXB1dGVBc3NlbWJsZShfdGhpcy5vcHRpb25zLnBvc2l0aW9ucylcclxuICAgICAgICByZXR1cm4gbmV3IENlc2l1bS5Qb2x5Z29uSGllcmFyY2h5KGFycilcclxuICAgICAgfSwgZmFsc2UpXHJcbiAgICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLnBvc2l0aW9ucyA9IG5ldyBDZXNpdW0uQ2FsbGJhY2tQcm9wZXJ0eShmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgbGV0IGFyciA9IF90aGlzLmNvbXB1dGVBc3NlbWJsZShfdGhpcy5vcHRpb25zLnBvc2l0aW9ucylcclxuICAgICAgICBpZiAoYXJyLmxlbmd0aCA+PSAzKSB7XHJcbiAgICAgICAgICByZXR1cm4gWy4uLmFyciwgYXJyWzBdLCBhcnJbMV1dXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgcmV0dXJuIFsuLi5hcnJdXHJcbiAgICAgICAgfVxyXG4gICAgICB9LCBmYWxzZSlcclxuXHJcblxyXG4gICAgICBsZXQgcG9pbnRzID0gW1tdXVxyXG4gICAgICBsZXQgcG9zODQgPSBbXVxyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucG9zaXRpb25zSC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGxldCBwb3NpdGlvbiA9IHRoaXMuY2FydGVzaWFuM1Rvd2dzODQodGhpcy5wb3NpdGlvbnNIW2ldLCB0aGlzLnNkay52aWV3ZXIpXHJcbiAgICAgICAgcG9zODQucHVzaChwb3NpdGlvbilcclxuICAgICAgICBwb2ludHNbMF0ucHVzaChbcG9zaXRpb24ubG5nLCBwb3NpdGlvbi5sYXRdKVxyXG4gICAgICB9XHJcbiAgICAgIGxldCBwb3NpdGlvbiA9IHRoaXMuY2FydGVzaWFuM1Rvd2dzODQodGhpcy5wb3NpdGlvbnNIWzBdLCB0aGlzLnNkay52aWV3ZXIpXHJcbiAgICAgIHBvaW50c1swXS5wdXNoKFtwb3NpdGlvbi5sbmcsIHBvc2l0aW9uLmxhdF0pXHJcbiAgICAgIGxldCBwb2x5Z29uID0gdHVyZi5wb2x5Z29uKHBvaW50cylcclxuICAgICAgbGV0IGNlbnRyb2lkID0gdHVyZi5wb2ludE9uRmVhdHVyZShwb2x5Z29uKVxyXG4gICAgICBsZXQgb2JqZWN0c1RvRXhjbHVkZSA9IFsuLi50aGlzLnNkay52aWV3ZXIuZW50aXRpZXMudmFsdWVzXVxyXG4gICAgICB0aGlzXHJcbiAgICAgICAgLmdldENsYW1wVG9IZWlnaHQoe1xyXG4gICAgICAgICAgbG5nOiBjZW50cm9pZC5nZW9tZXRyeS5jb29yZGluYXRlc1swXSxcclxuICAgICAgICAgIGxhdDogY2VudHJvaWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMV1cclxuICAgICAgICB9LCBvYmplY3RzVG9FeGNsdWRlKVxyXG4gICAgICAgIC50aGVuKGhlaWdodCA9PiB7XHJcbiAgICAgICAgICB0aGlzLmxhYmVsLnBvc2l0aW9uID0gW1xyXG4gICAgICAgICAgICBjZW50cm9pZC5nZW9tZXRyeS5jb29yZGluYXRlc1swXSxcclxuICAgICAgICAgICAgY2VudHJvaWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMV0sXHJcbiAgICAgICAgICAgIGhlaWdodFxyXG4gICAgICAgICAgXVxyXG4gICAgICAgIH0pXHJcblxyXG5cclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5ldmVudC5tb3VzZV9sZWZ0KGxlZnRFdmVudClcclxuXHJcbiAgICAgICAgdGhpcy5ldmVudC5tb3VzZV9yaWdodChyaWdodEV2ZW50KVxyXG5cclxuICAgICAgICB0aGlzLmV2ZW50Lm1vdXNlX21vdmUobW92ZUV2ZW50KVxyXG5cclxuICAgICAgICB0aGlzLmV2ZW50Lmdlc3R1cmVfcGluY2tfc3RhcnQoKG1vdmVtZW50LCBjYXJ0ZXNpYW4pID0+IHtcclxuICAgICAgICAgIGxldCBzdGFydFRpbWUgPSBuZXcgRGF0ZSgpXHJcbiAgICAgICAgICB0aGlzLmV2ZW50Lmdlc3R1cmVfcGluY2tfZW5kKCgpID0+IHtcclxuICAgICAgICAgICAgbGV0IGVuZFRpbWUgPSBuZXcgRGF0ZSgpXHJcbiAgICAgICAgICAgIGxldCBwb3MgPSB7XHJcbiAgICAgICAgICAgICAgcG9zaXRpb246IHtcclxuICAgICAgICAgICAgICAgIHg6IChtb3ZlbWVudC5wb3NpdGlvbjEueCArIG1vdmVtZW50LnBvc2l0aW9uMi54KSAvIDIsXHJcbiAgICAgICAgICAgICAgICB5OiAobW92ZW1lbnQucG9zaXRpb24xLnkgKyBtb3ZlbWVudC5wb3NpdGlvbjIueSkgLyAyXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChlbmRUaW1lIC0gc3RhcnRUaW1lID49IDUwMCkge1xyXG4gICAgICAgICAgICAgIHJpZ2h0RXZlbnQoKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgIGxlZnRFdmVudChwb3MsIGNhcnRlc2lhbilcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICB9KVxyXG5cclxuICAgICAgICBjcmVhdGVOb2RlUG9pbnRzKClcclxuICAgICAgfSwgMjAwKTtcclxuICAgICAgYXN5bmMgZnVuY3Rpb24gY3JlYXRlTm9kZVBvaW50cygpIHtcclxuICAgICAgICBsZXQgb2JqZWN0c1RvRXhjbHVkZSA9IFsuLi5fdGhpcy5zZGsudmlld2VyLmVudGl0aWVzLnZhbHVlc11cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IF90aGlzLm9wdGlvbnMucG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBsZXQgaGVpZ2h0ID0gYXdhaXQgX3RoaXMuZ2V0Q2xhbXBUb0hlaWdodChfdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXSwgb2JqZWN0c1RvRXhjbHVkZSlcclxuICAgICAgICAgIGxldCBlbnRpdHkgPSBfdGhpcy5zZGsudmlld2VyLmVudGl0aWVzLmFkZCh7XHJcbiAgICAgICAgICAgIG5hbWU6ICdub2RlLXNlY29uZGFyeS1lZGl0LXBvaW50JyxcclxuICAgICAgICAgICAgaW5kZXg6IGksXHJcbiAgICAgICAgICAgIHBvc2l0aW9uOiBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlcyhfdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sbmcsIF90aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxhdCwgaGVpZ2h0KSxcclxuICAgICAgICAgICAgYmlsbGJvYXJkOiB7XHJcbiAgICAgICAgICAgICAgaW1hZ2U6IF90aGlzLmdldFNvdXJjZVJvb3RQYXRoKCkgKyAnL2ltZy9wb2ludC5wbmcnLFxyXG4gICAgICAgICAgICAgIHdpZHRoOiAxNSxcclxuICAgICAgICAgICAgICBoZWlnaHQ6IDE1LFxyXG4gICAgICAgICAgICAgIGRpc2FibGVEZXB0aFRlc3REaXN0YW5jZTogTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLFxyXG4gICAgICAgICAgICAgIGNvbG9yOiBDZXNpdW0uQ29sb3IuV0hJVEUud2l0aEFscGhhKDAuOTkpXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgX3RoaXMubm9kZVBvaW50cy5wdXNoKGVudGl0eSlcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgLy8gZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm9wdGlvbnMucG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIC8vICAgbGV0IGVudGl0eSA9IHRoaXMuc2RrLnZpZXdlci5lbnRpdGllcy5hZGQoe1xyXG4gICAgICAvLyAgICAgbmFtZTogJ25vZGUtc2Vjb25kYXJ5LWVkaXQtcG9pbnQnLFxyXG4gICAgICAvLyAgICAgaW5kZXg6IGksXHJcbiAgICAgIC8vICAgICBwb3NpdGlvbjogQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXModGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sbmcsIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubGF0KSxcclxuICAgICAgLy8gICAgIGJpbGxib2FyZDoge1xyXG4gICAgICAvLyAgICAgICBpbWFnZTogdGhpcy5nZXRTb3VyY2VSb290UGF0aCgpICsgJy9pbWcvcG9pbnQucG5nJyxcclxuICAgICAgLy8gICAgICAgd2lkdGg6IDE1LFxyXG4gICAgICAvLyAgICAgICBoZWlnaHQ6IDE1LFxyXG4gICAgICAvLyAgICAgICBkaXNhYmxlRGVwdGhUZXN0RGlzdGFuY2U6IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSxcclxuICAgICAgLy8gICAgIH0sXHJcbiAgICAgIC8vICAgfSlcclxuICAgICAgLy8gICBub2RlUG9pbnRzLnB1c2goZW50aXR5KVxyXG4gICAgICAvLyB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjbG9zZU5vZGVFZGl0KCkge1xyXG4gICAgWUouTWVhc3VyZS5TZXRNZWFzdXJlU3RhdHVzKGZhbHNlKVxyXG4gICAgdGhpcy5ldmVudCAmJiB0aGlzLmV2ZW50LmRlc3Ryb3koKVxyXG4gICAgdGhpcy50aXAgJiYgdGhpcy50aXAuZGVzdHJveSgpXHJcbiAgICB0aGlzLnRpcCA9IG51bGxcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubm9kZVBvaW50cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICB0aGlzLnNkay52aWV3ZXIuZW50aXRpZXMucmVtb3ZlKHRoaXMubm9kZVBvaW50c1tpXSlcclxuICAgIH1cclxuICAgIHRoaXMubm9kZVBvaW50cyA9IFtdXHJcbiAgICB0aGlzLnBpY2tpbmcgPSB0cnVlXHJcbiAgfVxyXG5cclxuICBzZXRQb3NpdGlvbih2KSB7XHJcbiAgICBsZXQgY2FydGVzaWFuID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXModi5wb3NpdGlvbi5sbmcsIHYucG9zaXRpb24ubGF0LCB2LnBvc2l0aW9uLmFsdClcclxuICAgIGxldCBwb3NpdGlvbnMgPSBbLi4udGhpcy5wb3NpdGlvbnNdXHJcbiAgICBsZXQgYXJyYXkgPSBbXVxyXG4gICAgbGV0IGRpc3Bhcml0eSA9IFtdXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBsZXQgcG9zaXRpb24gPSB0aGlzLmNhcnRlc2lhbjNUb3dnczg0KHBvc2l0aW9uc1tpXSwgdGhpcy5zZGsudmlld2VyKVxyXG4gICAgICBhcnJheS5wdXNoKFtwb3NpdGlvbi5sbmcsIHBvc2l0aW9uLmxhdF0pXHJcbiAgICB9XHJcbiAgICBsZXQgZmlyc3Rwb3NpdGlvbiA9IHRoaXMuY2FydGVzaWFuM1Rvd2dzODQocG9zaXRpb25zWzBdLCB0aGlzLnNkay52aWV3ZXIpXHJcbiAgICBhcnJheS5wdXNoKFtmaXJzdHBvc2l0aW9uLmxuZywgZmlyc3Rwb3NpdGlvbi5sYXRdKVxyXG4gICAgdmFyIHBvbHlnb24gPSB0dXJmLnBvbHlnb24oW2FycmF5XSk7XHJcbiAgICB2YXIgY2VudHJvaWQgPSB0dXJmLmNlbnRyb2lkKHBvbHlnb24pO1xyXG4gICAgbGV0IGNlbnRlciA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzKC4uLmNlbnRyb2lkLmdlb21ldHJ5LmNvb3JkaW5hdGVzKVxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgZGlzcGFyaXR5LnB1c2goe1xyXG4gICAgICAgIHg6IGNlbnRlci54IC0gcG9zaXRpb25zW2ldLngsXHJcbiAgICAgICAgeTogY2VudGVyLnkgLSBwb3NpdGlvbnNbaV0ueSxcclxuICAgICAgICB6OiBjZW50ZXIueiAtIHBvc2l0aW9uc1tpXS56LFxyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gICAgbGV0IG5ld3Bvc2l0aW9ucyA9IFtdXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRpc3Bhcml0eS5sZW5ndGg7IGkrKykge1xyXG4gICAgICBuZXdwb3NpdGlvbnMucHVzaCh7XHJcbiAgICAgICAgeDogY2FydGVzaWFuLnggLSBkaXNwYXJpdHlbaV0ueCxcclxuICAgICAgICB5OiBjYXJ0ZXNpYW4ueSAtIGRpc3Bhcml0eVtpXS55LFxyXG4gICAgICAgIHo6IGNhcnRlc2lhbi56IC0gZGlzcGFyaXR5W2ldLnosXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgICB0aGlzLmxhYmVsLnBvc2l0aW9uID0gW3YucG9zaXRpb24ubG5nLCB2LnBvc2l0aW9uLmxhdCwgdi5wb3NpdGlvbi5hbHRdXHJcblxyXG4gICAgbGV0IHBvc2l0aW9uczg0ID0gW11cclxuICAgIGlmIChuZXdwb3NpdGlvbnMubGVuZ3RoID4gMCkge1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5ld3Bvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIHBvc2l0aW9uczg0LnB1c2godGhpcy5jYXJ0ZXNpYW4zVG93Z3M4NChuZXdwb3NpdGlvbnNbaV0sIHRoaXMuc2RrLnZpZXdlcikpXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGxldCBhcnIgPSB0aGlzLmNvbXB1dGVBc3NlbWJsZShwb3NpdGlvbnM4NClcclxuICAgIGlmIChhcnIubGVuZ3RoID09IDApIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcbiAgICB0aGlzLmVudGl0eS5wb2x5Z29uLmhpZXJhcmNoeSA9IG5ldyBDZXNpdW0uQ2FsbGJhY2tQcm9wZXJ0eShmdW5jdGlvbiAoKSB7XHJcbiAgICAgIHJldHVybiBuZXcgQ2VzaXVtLlBvbHlnb25IaWVyYXJjaHkoYXJyKVxyXG4gICAgfSwgZmFsc2UpXHJcbiAgICB0aGlzLmVudGl0eS5wb2x5bGluZS5wb3NpdGlvbnMgPSBuZXcgQ2VzaXVtLkNhbGxiYWNrUHJvcGVydHkoZnVuY3Rpb24gKCkge1xyXG4gICAgICBpZiAoYXJyLmxlbmd0aCA+PSAzKSB7XHJcbiAgICAgICAgcmV0dXJuIFsuLi5hcnIsIGFyclswXSwgYXJyWzFdXVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHJldHVybiBbLi4uYXJyXVxyXG4gICAgICB9XHJcbiAgICB9LCBmYWxzZSlcclxuICB9XHJcblxyXG4gIHNldERJVihvcHRpb25zID0geyBkb21pZDogXCJcIiwgeDogMTAsIHk6IDEwIH0pIHtcclxuICAgIG9wdGlvbnMueCA9IChvcHRpb25zLnggfHwgb3B0aW9ucy54ID09PSAwKSA/IG9wdGlvbnMueCA6IDEwXHJcbiAgICBvcHRpb25zLnkgPSAob3B0aW9ucy55IHx8IG9wdGlvbnMueSA9PT0gMCkgPyBvcHRpb25zLnkgOiAxMFxyXG5cclxuICAgIGxldCBwb3NpdGlvbnMgPSB0aGlzLmNvbXB1dGVBc3NlbWJsZSh0aGlzLm9wdGlvbnMucG9zaXRpb25zKVxyXG4gICAgaWYgKHBvc2l0aW9ucy5sZW5ndGggPT0gMCkge1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuICAgIGxldCBwb2ludHMgPSBbW11dXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBsZXQgcG9zaXRpb24gPSB0aGlzLmNhcnRlc2lhbjNUb3dnczg0KHBvc2l0aW9uc1tpXSwgdGhpcy5zZGsudmlld2VyKVxyXG4gICAgICBwb2ludHNbMF0ucHVzaChbcG9zaXRpb24ubG5nLCBwb3NpdGlvbi5sYXRdKVxyXG4gICAgfVxyXG4gICAgbGV0IHBvc2l0aW9uID0gdGhpcy5jYXJ0ZXNpYW4zVG93Z3M4NChwb3NpdGlvbnNbMF0sIHRoaXMuc2RrLnZpZXdlcilcclxuICAgIHBvaW50c1swXS5wdXNoKFtwb3NpdGlvbi5sbmcsIHBvc2l0aW9uLmxhdF0pXHJcbiAgICBsZXQgcG9seWdvbiA9IHR1cmYucG9seWdvbihwb2ludHMpO1xyXG4gICAgLy8gbGV0IGNlbnRyb2lkID0gdHVyZi5jZW50cm9pZChwb2x5Z29uKTtcclxuICAgIGxldCBjZW50cm9pZCA9IHR1cmYucG9pbnRPbkZlYXR1cmUocG9seWdvbik7XHJcbiAgICBsZXQgc2l0ZUluZm9Eb20gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChvcHRpb25zLmRvbWlkKVxyXG4gICAgbGV0IHNpdGVJbmZvUG9zaXRpb24gPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlcyhjZW50cm9pZC5nZW9tZXRyeS5jb29yZGluYXRlc1swXSwgY2VudHJvaWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMV0pXHJcblxyXG4gICAgdGhpcy5zZGsudmlld2VyLnNjZW5lLnBvc3RSZW5kZXIuYWRkRXZlbnRMaXN0ZW5lcigocGVyY2VudGFnZSkgPT4ge1xyXG4gICAgICAvL+i9rOaNouWIsOWxj+W5leWdkOagh1xyXG4gICAgICBpZiAoc2l0ZUluZm9Eb20uc3R5bGUuZGlzcGxheSA9PT0gJ2Jsb2NrJyB8fCBzaXRlSW5mb0RvbS5zdHlsZS5kaXNwbGF5ID09PSAnJykge1xyXG4gICAgICAgIGxldCB3aW5wb3MgPSB0aGlzLnNkay52aWV3ZXIuc2NlbmUuY2FydGVzaWFuVG9DYW52YXNDb29yZGluYXRlcyhzaXRlSW5mb1Bvc2l0aW9uKTtcclxuICAgICAgICBpZiAod2lucG9zKSB7XHJcbiAgICAgICAgICBzaXRlSW5mb0RvbS5zdHlsZS5sZWZ0ID0gKHdpbnBvcy54ICsgb3B0aW9ucy54KS50b0ZpeGVkKDApICsgJ3B4JztcclxuICAgICAgICAgIHNpdGVJbmZvRG9tLnN0eWxlLnRvcCA9ICh3aW5wb3MueSArIG9wdGlvbnMueSkudG9GaXhlZCgwKSArICdweCc7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8vIOabtOaWsOWdkOagh1xyXG4gIHJlbmV3UG9zaXRpb25zKHBvc2l0aW9uODQsIGNkKSB7XHJcbiAgICBpZiAodGhpcy5fZXJyb3IgfHwgIXRoaXMuc2RrLnZpZXdlcikge1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuICAgIGxldCBncm91bmQgPSBmYWxzZVxyXG5cclxuICAgIGxldCBhcnJheSA9IFtdXHJcbiAgICBsZXQgcG9zaXRpb25zID0gdGhpcy5vcHRpb25zLnBvc2l0aW9uc1xyXG4gICAgaWYgKHBvc2l0aW9uODQpIHtcclxuICAgICAgcG9zaXRpb25zID0gcG9zaXRpb244NFxyXG4gICAgfVxyXG4gICAgbGV0IGZyb21EZWdyZWVzQXJyYXkgPSBbXVxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgZnJvbURlZ3JlZXNBcnJheS5wdXNoKHBvc2l0aW9uc1tpXS5sbmcsIHBvc2l0aW9uc1tpXS5sYXQpXHJcbiAgICB9XHJcbiAgICB0aGlzLnBvc2l0aW9ucyA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzQXJyYXkoZnJvbURlZ3JlZXNBcnJheSlcclxuXHJcbiAgICBsZXQgcG9zaXRpb25zQSA9IHRoaXMuY29tcHV0ZUFzc2VtYmxlKHBvc2l0aW9ucylcclxuICAgIGlmIChwb3NpdGlvbnNBLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG4gICAgbGV0IHBvaW50cyA9IFtbXV1cclxuICAgIGxldCBwb3M4NCA9IFtdXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvc2l0aW9uc0EubGVuZ3RoOyBpKyspIHtcclxuICAgICAgbGV0IHBvc2l0aW9uID0gdGhpcy5jYXJ0ZXNpYW4zVG93Z3M4NChwb3NpdGlvbnNBW2ldLCB0aGlzLnNkay52aWV3ZXIpXHJcbiAgICAgIHBvczg0LnB1c2gocG9zaXRpb24pXHJcbiAgICAgIHBvaW50c1swXS5wdXNoKFtwb3NpdGlvbi5sbmcsIHBvc2l0aW9uLmxhdF0pXHJcbiAgICB9XHJcbiAgICBsZXQgcG9zaXRpb24gPSB0aGlzLmNhcnRlc2lhbjNUb3dnczg0KHBvc2l0aW9uc0FbMF0sIHRoaXMuc2RrLnZpZXdlcilcclxuICAgIHBvaW50c1swXS5wdXNoKFtwb3NpdGlvbi5sbmcsIHBvc2l0aW9uLmxhdF0pXHJcbiAgICBsZXQgaGVpZ2h0ID0gMFxyXG4gICAgbGV0IHBvbHlnb24gPSB0dXJmLnBvbHlnb24ocG9pbnRzKVxyXG4gICAgbGV0IGNlbnRyb2lkID0gdHVyZi5wb2ludE9uRmVhdHVyZShwb2x5Z29uKVxyXG4gICAgc3dpdGNoICh0aGlzLm9wdGlvbnMuaGVpZ2h0TW9kZSkge1xyXG4gICAgICBjYXNlICcwJzpcclxuICAgICAgY2FzZSAwOlxyXG4gICAgICAgIGdyb3VuZCA9IGZhbHNlXHJcbiAgICAgICAgYnJlYWtcclxuICAgICAgY2FzZSAnMSc6XHJcbiAgICAgIGNhc2UgMTpcclxuICAgICAgICBoZWlnaHQgPSB0aGlzLnNkay52aWV3ZXIuc2NlbmUuZ2xvYmUuZ2V0SGVpZ2h0KENlc2l1bS5DYXJ0b2dyYXBoaWMuZnJvbURlZ3JlZXMoY2VudHJvaWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMF0sIGNlbnRyb2lkLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzFdKSkgfHwgMFxyXG4gICAgICAgIGdyb3VuZCA9IGZhbHNlXHJcbiAgICAgICAgYnJlYWtcclxuICAgICAgY2FzZSAnMic6XHJcbiAgICAgIGNhc2UgMjpcclxuICAgICAgICBncm91bmQgPSB0cnVlXHJcbiAgICAgICAgYnJlYWtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgZnJvbURlZ3JlZXNBcnJheTIgPSBbXVxyXG4gICAgaWYgKCFncm91bmQgJiYgdGhpcy5ub2RlUG9pbnRzLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9pbnRzWzBdLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgZnJvbURlZ3JlZXNBcnJheTIucHVzaChcclxuICAgICAgICAgIHBvaW50c1swXVtpXVswXSxcclxuICAgICAgICAgIHBvaW50c1swXVtpXVsxXSxcclxuICAgICAgICAgIHRoaXMuaGVpZ2h0ICsgaGVpZ2h0XHJcbiAgICAgICAgKVxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMucG9zaXRpb25zSCA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzQXJyYXlIZWlnaHRzKGZyb21EZWdyZWVzQXJyYXkyKVxyXG5cclxuICAgICAgdGhpcy5sYWJlbCAmJiAodGhpcy5sYWJlbC5wb3NpdGlvbiA9IFtcclxuICAgICAgICBjZW50cm9pZC5nZW9tZXRyeS5jb29yZGluYXRlc1swXSxcclxuICAgICAgICBjZW50cm9pZC5nZW9tZXRyeS5jb29yZGluYXRlc1sxXSxcclxuICAgICAgICB0aGlzLmhlaWdodCArIGhlaWdodFxyXG4gICAgICBdKVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5wb3NpdGlvbnNIID0gcG9zaXRpb25zQVxyXG5cclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnNkay52aWV3ZXIpIHtcclxuICAgICAgICAgIHJldHVyblxyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgb2JqZWN0c1RvRXhjbHVkZSA9IFsuLi50aGlzLnNkay52aWV3ZXIuZW50aXRpZXMudmFsdWVzXVxyXG4gICAgICAgIHRoaXMuZ2V0Q2xhbXBUb0hlaWdodCh7XHJcbiAgICAgICAgICBsbmc6IGNlbnRyb2lkLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzBdLFxyXG4gICAgICAgICAgbGF0OiBjZW50cm9pZC5nZW9tZXRyeS5jb29yZGluYXRlc1sxXVxyXG4gICAgICAgIH0sIG9iamVjdHNUb0V4Y2x1ZGUpLnRoZW4oaGVpZ2h0ID0+IHtcclxuICAgICAgICAgIHRoaXMubGFiZWwgJiYgKHRoaXMubGFiZWwucG9zaXRpb24gPSBbXHJcbiAgICAgICAgICAgIGNlbnRyb2lkLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzBdLFxyXG4gICAgICAgICAgICBjZW50cm9pZC5nZW9tZXRyeS5jb29yZGluYXRlc1sxXSxcclxuICAgICAgICAgICAgaGVpZ2h0XHJcbiAgICAgICAgICBdKVxyXG4gICAgICAgIH0pXHJcbiAgICAgIH0sIDEwMClcclxuICAgIH1cclxuXHJcbiAgICAvLyDorqHnrpfmipXlvbHpnaLnp69cclxuICAgIHRoaXMuYXJlYUJ5TWV0ZXIgPSB0aGlzLmNvbXB1dGVBcmVhKHBvczg0KVxyXG4gICAgdGhpcy5hcmVhQ2hhbmdlQ2FsbEJhY2sgJiYgdGhpcy5hcmVhQ2hhbmdlQ2FsbEJhY2soKVxyXG4gICAgcmV0dXJuIGZyb21EZWdyZWVzQXJyYXlcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IEFzc2VtYmxlT2JqZWN0XHJcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBMEhBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUtBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBekhBO0FBQUE7QUFBQTtBQTBIQTtBQUFBO0FBQUE7QUFHQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUF6Q0E7QUEwQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUtBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUdBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFMQTtBQUFBO0FBQUE7QUFBQTtBQVNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFNQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBeGVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBMmVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQVpBO0FBQUE7QUFBQTtBQUFBO0FBY0E7QUFDQTtBQUNBO0FBRkE7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQUE7QUFFQTtBQVVBO0FBQUE7QUFQQTtBQUFBO0FBQUE7QUFJQTtBQUFBO0FBQUE7QUFJQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFLQTtBQUFBO0FBUEE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFVQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFwR0E7QUFBQTtBQUFBO0FBQUE7QUFzR0E7QUFDQTtBQUNBO0FBRkE7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTEE7QUFBQTtBQUFBO0FBNkxBO0FBQ0E7QUFBQTtBQXhMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQU1BO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQXdLQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFkQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFnQkE7QUFsQkE7QUFBQTtBQUFBO0FBb0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBdk1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUtBO0FBR0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQWtDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBRUE7QUFLQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUE5MkNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBS0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFuQkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBK3dDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/Obj/Base/AssembleObject/index.js\n"); /***/ }), @@ -1547,7 +1547,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) * /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ \"./node_modules/@babel/runtime/helpers/defineProperty.js\");\n/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ \"./node_modules/@babel/runtime/helpers/asyncToGenerator.js\");\n/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/toConsumableArray */ \"./node_modules/@babel/runtime/helpers/toConsumableArray.js\");\n/* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ \"./node_modules/@babel/runtime/helpers/classCallCheck.js\");\n/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ \"./node_modules/@babel/runtime/helpers/createClass.js\");\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ \"./node_modules/@babel/runtime/helpers/possibleConstructorReturn.js\");\n/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ \"./node_modules/@babel/runtime/helpers/getPrototypeOf.js\");\n/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ \"./node_modules/@babel/runtime/helpers/inherits.js\");\n/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @babel/runtime/regenerator */ \"./node_modules/@babel/runtime/regenerator/index.js\");\n/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8__);\n/* harmony import */ var _Element_Dialog__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../Element/Dialog */ \"./src/Obj/Element/Dialog/index.js\");\n/* harmony import */ var _Element_cy_html_tabs__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../Element/cy_html_tabs */ \"./src/Obj/Element/cy_html_tabs.js\");\n/* harmony import */ var _Element_richText__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../Element/richText */ \"./src/Obj/Element/richText.js\");\n/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./_element */ \"./src/Obj/Base/AttackArrowObject/_element.js\");\n/* harmony import */ var _index__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../index */ \"./src/Obj/Base/index.js\");\n/* harmony import */ var _LabelObject__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../LabelObject */ \"./src/Obj/Base/LabelObject/index.js\");\n/* harmony import */ var _Event_index__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../../../Event/index */ \"./src/Event/index.js\");\n/* harmony import */ var _MouseTip__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../../../MouseTip */ \"./src/MouseTip/index.js\");\n/* harmony import */ var _Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../../../Global/MultiViewportMode */ \"./src/Global/MultiViewportMode/index.js\");\n/* harmony import */ var _Element_datalist__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../../Element/datalist */ \"./src/Obj/Element/datalist.js\");\n/* harmony import */ var _Element_fontSelect__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../../Element/fontSelect */ \"./src/Obj/Element/fontSelect.js\");\n/* harmony import */ var _Global_SplitScreen__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../../../Global/SplitScreen */ \"./src/Global/SplitScreen/index.js\");\n/* harmony import */ var _Global_global__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../../../Global/global */ \"./src/Global/global.js\");\n\n\n\n\n\n\n\n\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default()(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\n\nfunction _createForOfIteratorHelper(r, e) { var t = \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && \"number\" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t.return || t.return(); } finally { if (u) throw o; } } }; }\nfunction _unsupportedIterableToArray(r, a) { if (r) { if (\"string\" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }\nfunction _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }\nfunction _callSuper(t, o, e) { return o = _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6___default()(o), _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_5___default()(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6___default()(t).constructor) : o.apply(t, e)); }\nfunction _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }\n/**\r\n * 箭头\r\n */\n\n\n\n\n\n\n\n\n\n\n\n\n\n// import EditParticle from \"../../ModelController/EditParticle\";\nvar AttackArrowObject = /*#__PURE__*/function (_Base) {\n /**\r\n * @constructor\r\n * @param sdk\r\n * @description 箭头面\r\n * @param options {object} 属性\r\n * @param options.id {string} 唯一标识\r\n * @param options.show=true {boolean} 显示/隐藏\r\n * @param options.name {string} 名称\r\n * @param options.color='rgba(255, 0, 0, 0.5)' {string} 颜色\r\n * @param options.height {number} 高度\r\n * @param options.heightMode=2{number} 高度模式(0:海拔高度;1:相对地表;2:依附模式)\r\n * @param options.areaUnit='平方米' {string} 面积单位\r\n * @param options.line {object} 边框\r\n * @param options.line.width=2 {string} 边框宽\r\n * @param options.line.color=\"rgba(155, 155, 124, 0.89)\" {string} 边框颜色\r\n * @param {Array.} options.positions 必填,经纬度和高度的列表,值交替 [{lon,lat,alt},...]\r\n * @param options.positions[].lng {number} 经度\r\n * @param options.positions[].lat {number} 纬度\r\n * @param options.positions[].alt {number} 高度\r\n * @param options.spreadState=false {boolean} 动画\r\n * @param options.loop=false {loop} 动画重复\r\n * @param options.spreadTime=3000 {number} 动画持续时长(毫秒)\r\n * @param options.label {object} 标签对象\r\n * @param options.label.text {string} 标签文本\r\n * @param options.label.show {string} 标签显隐\r\n * @param options.label.position {string} 标签位置\r\n * @param options.label.position {object} 标签位置\r\n * @param options.label.position.lng {number} 经度\r\n * @param options.label.position.lat {number} 纬度\r\n * @param options.label.position.alt {number} 高度\r\n * @param options.label.fontSize=20 {number} 字体大小\r\n * @param options.label.fontFamily=0 {number} 字体项 0:黑体;1:思源黑体;2:庞门正道标题体;3:数黑体\r\n * @param options.label.color=#ffffff {string} 字体颜色\r\n * @param options.label.lineWidth=4 {number} 引线宽\r\n * @param options.label.lineColor=#00ffff80 {string} 引线颜色\r\n * @param options.label.pixelOffset=20 {number} 字体偏移(引线长度)\r\n * @param options.label.backgroundColor=['#00ffff80', '#00ffff80'] {array} 背景颜色\r\n * @param options.label.scaleByDistance {boolean} 距离缩放\r\n * @param options.label.near=2000 {number} 视野缩放最近距离\r\n * @param options.label.far=100000 {number} 视野缩放最远距离\r\n * @param options.attribute {object} 属性内容\r\n * @param options.attribute.link={} {object} 链接\r\n * @param options.attribute.link.content=[]] {array} 链接内容\r\n * @param options.attribute.link.content[].name {string} 链接名称\r\n * @param options.attribute.link.content[].url {string} 链接地址\r\n * @param options.richTextContent {string} 富文本内容\r\n * @param options.customView {object} 默认视角\r\n * @param options.customView.orientation {object} 默认视角方位\r\n * @param options.customView.orientation.heading {number} 航向角\r\n * @param options.customView.orientation.pitch {number} 俯仰角\r\n * @param options.customView.orientation.roll {number} 翻滚角\r\n * @param options.customView.relativePosition {object} 视角相对位置\r\n * @param options.customView.relativePosition.lng {number} 经度\r\n * @param options.customView.relativePosition.lat {number} 纬度\r\n * @param options.customView.relativePosition.alt {number} 高度\r\n * */\n function AttackArrowObject(sdk) {\n var _this2;\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var _Dialog = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3___default()(this, AttackArrowObject);\n _this2 = _callSuper(this, AttackArrowObject, [sdk, options]);\n _this2.options.name = options.name || '未命名对象';\n _this2.options.color = options.color || \"#ff000080\";\n _this2.options.show = options.show || options.show === false ? options.show : true;\n _this2.options.positions = options.positions || [];\n _this2.options.heightMode = options.heightMode || options.heightMode == 0 ? options.heightMode : 2;\n _this2.options.line = options.line || {};\n _this2.options.line.width = _this2.options.line.width || _this2.options.line.width === 0 ? _this2.options.line.width : 3;\n _this2.options.line.color = _this2.options.line.color || 'rgba(255, 0, 0, 1)';\n _this2.options['area-unit'] = options['area-unit'] || '平方米';\n _this2.entity;\n _this2.event = new _Event_index__WEBPACK_IMPORTED_MODULE_15__[\"default\"](_this2.sdk);\n _this2.operate = {};\n _this2._elms = {};\n _this2.nodePoints = [];\n _this2.Dialog = _Dialog;\n _this2.options.loop = options.loop || false;\n _this2.options.spreadState = options.spreadState || false;\n _this2.spreadTime = options.spreadTime;\n options.label = options.label || {};\n _this2.options.label = {\n text: _this2.options.name,\n show: options.label.show || false,\n position: options.label.position,\n fontFamily: options.label.fontFamily ? options.label.fontFamily : 0,\n fontSize: options.label.fontSize || options.label.fontSize === 0 ? options.label.fontSize : 20,\n color: options.label.color || '#ffffff',\n lineWidth: options.label.lineWidth || options.label.lineWidth === 0 ? options.label.lineWidth : 4,\n pixelOffset: options.label.pixelOffset || options.label.pixelOffset === 0 ? options.label.pixelOffset : 20,\n backgroundColor: options.label.backgroundColor || ['#00ffff80', '#00ffff80'],\n lineColor: options.label.lineColor || '#00ffff80',\n scaleByDistance: options.label.scaleByDistance || false,\n near: options.label.near || options.label.near === 0 ? options.label.near : 2000,\n far: options.label.far || options.label.far === 0 ? options.label.far : 100000\n };\n _this2.options.attribute = options.attribute || {};\n _this2.options.attribute.link = _this2.options.attribute.link || {};\n _this2.options.attribute.link.content = _this2.options.attribute.link.content || [];\n _this2.options.attribute.camera = _this2.options.attribute.camera || {};\n _this2.options.attribute.camera.content = _this2.options.attribute.camera.content || [];\n _this2.options.attribute.vr = _this2.options.attribute.vr || {};\n _this2.options.attribute.vr.content = _this2.options.attribute.vr.content || [];\n _this2.options.attribute.goods = _this2.options.attribute.goods || {};\n _this2.options.attribute.goods.content = _this2.options.attribute.goods.content || [];\n _this2.options.attributeType = options.attributeType || 'richText';\n if (!_this2.options.positions || _this2.options.positions.length < 3) {\n _this2._error = '箭头面最少需要三个坐标!';\n console.warn(_this2._error);\n window.ELEMENT && window.ELEMENT.Message({\n message: _this2._error,\n type: 'warning',\n duration: 1500\n });\n } else {\n if (!_this2.options.height && _this2.options.height !== 0) {\n var height = _this2.options.positions[0].alt;\n for (var i = 1; i < _this2.options.positions.length; i++) {\n if (height < _this2.options.positions[i].alt) {\n height = _this2.options.positions[i].alt;\n }\n }\n _this2.options.height = height;\n }\n _this2.sdk.addIncetance(_this2.options.id, _this2);\n AttackArrowObject.create(_this2);\n }\n return _this2;\n }\n _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_7___default()(AttackArrowObject, _Base);\n return _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4___default()(AttackArrowObject, [{\n key: \"type\",\n get: function get() {\n return 'AttackArrowObject';\n }\n }, {\n key: \"color\",\n get: function get() {\n return this.options.color;\n },\n set: function set(v) {\n var _this3 = this;\n this.options.color = v || 'rgba(255, 0, 0, 0.5)';\n if (!this.sdk || !this.sdk.viewer || !this.entity || !this.entity.polygon) {\n return;\n }\n var material = Cesium.Color.fromCssColorString(this.options.color);\n if (this.sdk.viewer.scene.mode === 2) {\n material = new Cesium.CustomColorMaterialSource({\n color: this.options.color\n });\n }\n this.entity.polygon.material = material;\n if (this._elms.color) {\n this._elms.color.forEach(function (item, i) {\n var colorPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: _this3.options.color,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(c) {\n _this3.color = c;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this3.color = 'rgba(255,0,0,0.5)';\n } //点击清空按钮事件回调\n });\n _this3._elms.color[i] = colorPicker;\n });\n }\n }\n }, {\n key: \"heightMode\",\n get: function get() {\n return this.options.heightMode ? this.options.heightMode : 0;\n },\n set: function set(v) {\n var _this4 = this;\n this.entity.polygon.hierarchy = [];\n setTimeout(function () {\n _this4.options.heightMode = v || v == 0 ? v : 2;\n _this4.positionEditing = false;\n if (!_this4.entity) {\n return;\n }\n var heightModeName = '';\n AttackArrowObject.closeNodeEdit(_this4);\n var ground = false;\n var disabled = false;\n _this4.renewPositions();\n _this4.entity.polyline.positions = [].concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(_this4.positionsH), [_this4.positionsH[0], _this4.positionsH[1]]);\n _this4.entity.polygon.hierarchy = new Cesium.PolygonHierarchy(_this4.positionsH);\n switch (_this4.options.heightMode) {\n case '0':\n case 0:\n heightModeName = '海拔高度';\n break;\n case '1':\n case 1:\n heightModeName = '相对地表';\n break;\n case '2':\n case 2:\n ground = true;\n disabled = true;\n heightModeName = '依附模型';\n break;\n }\n _this4.previous = null;\n _this4.label.ground = ground;\n _this4.entity.polyline.clampToGround = ground;\n _this4.entity.polyline.arcType = !ground ? Cesium.ArcType.NONE : Cesium.ArcType.GEODESIC, _this4.entity.polygon.perPositionHeight = !ground ? true : false;\n _this4._elms.heightMode && (_this4._elms.heightMode.value = heightModeName);\n _this4._elms.heightModeObject && _this4._elms.heightModeObject.legp_searchActive(heightModeName);\n if (disabled) {\n _this4._elms.heightBox && (_this4._elms.heightBox.className = 'input-number input-number-unit-1 height-box disabled');\n _this4._elms.heightConfirm && _this4._elms.heightConfirm.setAttribute('disabled', 'disabled');\n } else {\n _this4._elms.heightBox && (_this4._elms.heightBox.className = 'input-number input-number-unit-1 height-box');\n _this4._elms.heightConfirm && _this4._elms.heightConfirm.removeAttribute('disabled');\n }\n }, 50);\n }\n }, {\n key: \"height\",\n get: function get() {\n return this.options.height;\n },\n set: function set(v) {\n var _this5 = this;\n if (!v || isNaN(Number(v))) {\n this.options.height = 0;\n } else {\n this.options.height = Number(Number(v).toFixed(2));\n }\n var ground;\n if (this.heightMode == 2) {\n ground = true;\n } else {\n ground = false;\n }\n this.renewPositions();\n setTimeout(function () {\n _this5.entity.polygon.hierarchy = new Cesium.PolygonHierarchy(_this5.positionsH);\n _this5.entity.polygon.perPositionHeight = !ground ? true : false;\n _this5.entity.polyline.positions = [].concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(_this5.positionsH), [_this5.positionsH[0], _this5.positionsH[1]]);\n _this5.entity.polyline.clampToGround = !ground ? false : true;\n _this5.entity.polyline.arcType = !ground ? Cesium.ArcType.NONE : Cesium.ArcType.GEODESIC;\n }, 0);\n this._elms.alt && this._elms.alt.forEach(function (item) {\n item.innerHTML = _this5.options.height;\n });\n }\n }, {\n key: \"lineColor\",\n get: function get() {\n return this.options.line.color;\n },\n set: function set(v) {\n var _this6 = this;\n this.options.line.color = v || 'rgba(255, 0, 0, 0.5)';\n if (!this.sdk || !this.sdk.viewer || !this.entity || !this.entity.polyline) {\n return;\n }\n this.entity.polyline.material = Cesium.Color.fromCssColorString(this.options.line.color);\n if (this._elms.lineColor) {\n this._elms.lineColor.forEach(function (item, i) {\n var lineColorPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: _this6.options.line.color,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(c) {\n _this6.lineColor = c;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this6.lineColor = 'rgba(255,0,0,0.5)';\n } //点击清空按钮事件回调\n });\n _this6._elms.lineColor[i] = lineColorPicker;\n });\n }\n }\n }, {\n key: \"lineWidth\",\n get: function get() {\n return this.options.line.width;\n },\n set: function set(v) {\n this.options.line.width = v || v === 0 ? v : 3;\n this.entity.polyline.width = this.options.line.width;\n this._elms.lineColor && this._elms.lineColor.forEach(function (item) {\n item.value = v;\n });\n }\n }, {\n key: \"area\",\n get: function get() {\n return this.options.area;\n },\n set: function set(v) {\n this.options.area = v;\n this._elms.area && this._elms.area.forEach(function (item) {\n item.value = v;\n });\n }\n }, {\n key: \"areaUnit\",\n get: function get() {\n return this.options['area-unit'];\n },\n set: function set(v) {\n this.options['area-unit'] = v;\n this._elms.areaUnit && this._elms.areaUnit.forEach(function (item) {\n item.value = v;\n });\n if (this.options.areaByMeter) {\n switch (v) {\n case '平方米':\n this.area = this.options.areaByMeter;\n break;\n case '平方千米':\n this.area = Number((this.options.areaByMeter / 1000000).toFixed(8));\n break;\n case '亩':\n this.area = Number((this.options.areaByMeter / 666.6666667).toFixed(4));\n break;\n case '公顷':\n this.area = Number((this.options.areaByMeter / 10000).toFixed(6));\n break;\n default:\n this.area = this.options.areaByMeter;\n }\n }\n }\n }, {\n key: \"labelShow\",\n get: function get() {\n return this.options.label.show;\n },\n set: function set(v) {\n this.options.label.show = v;\n if (this.show && !this.showView || this.showView == 3) {\n this.label.show = v;\n } else {\n this.label.show = false;\n }\n this._elms.labelShow && this._elms.labelShow.forEach(function (item) {\n item.checked = v;\n });\n }\n }, {\n key: \"labelFontFamily\",\n get: function get() {\n return this.options.label.fontFamily;\n },\n set: function set(v) {\n this.options.label.fontFamily = v || 0;\n this.label && (this.label.fontFamily = this.options.label.fontFamily);\n var name = Object(_Element_fontSelect__WEBPACK_IMPORTED_MODULE_19__[\"getFontFamilyName\"])(this.labelFontFamily) || '';\n this._elms.labelFontFamily && this._elms.labelFontFamily.forEach(function (item) {\n item.value = name;\n });\n }\n }, {\n key: \"labelColor\",\n get: function get() {\n return this.options.label.color;\n },\n set: function set(v) {\n var _this7 = this;\n this.options.label.color = v;\n this.label.color = v;\n if (this._elms.labelColor) {\n this._elms.labelColor.forEach(function (item, i) {\n var labelColorPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: _this7.labelColor,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this7.labelColor = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this7.labelColor = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n _this7._elms.labelColor[i] = labelColorPicker;\n });\n }\n }\n }, {\n key: \"labelFontSize\",\n get: function get() {\n return this.options.label.fontSize;\n },\n set: function set(v) {\n this.options.label.fontSize = v;\n this.label.fontSize = v;\n this._elms.labelFontSize && this._elms.labelFontSize.forEach(function (item) {\n item.value = v;\n });\n }\n }, {\n key: \"labelScaleByDistance\",\n get: function get() {\n return this.options.label.scaleByDistance;\n },\n set: function set(v) {\n this.options.label.scaleByDistance = v;\n this.label.scaleByDistance = v;\n this._elms.labelScaleByDistance && this._elms.labelScaleByDistance.forEach(function (item) {\n item.checked = v;\n });\n }\n }, {\n key: \"labelNear\",\n get: function get() {\n return this.options.label.near;\n },\n set: function set(v) {\n var near = v;\n if (near > this.labelFar) {\n near = this.labelFar;\n }\n this.options.label.near = near;\n this.label.near = near;\n this._elms.labelNear && this._elms.labelNear.forEach(function (item) {\n item.value = near;\n });\n }\n }, {\n key: \"labelFar\",\n get: function get() {\n return this.options.label.far;\n },\n set: function set(v) {\n var far = v;\n if (far < this.labelNear) {\n far = this.labelNear;\n }\n this.options.label.far = far;\n this.label.far = far;\n this._elms.labelFar && this._elms.labelFar.forEach(function (item) {\n item.value = far;\n });\n }\n }, {\n key: \"labelLineWidth\",\n get: function get() {\n return this.options.label.lineWidth;\n },\n set: function set(v) {\n this.options.label.lineWidth = v;\n this.label.lineWidth = v;\n this._elms.labelLineWidth && this._elms.labelLineWidth.forEach(function (item) {\n item.value = v;\n });\n }\n }, {\n key: \"labelPixelOffset\",\n get: function get() {\n return this.options.label.pixelOffset;\n },\n set: function set(v) {\n this.options.label.pixelOffset = v;\n this.label.pixelOffset = v;\n this._elms.labelPixelOffset && this._elms.labelPixelOffset.forEach(function (item) {\n item.value = v;\n });\n }\n }, {\n key: \"labelLineColor\",\n get: function get() {\n return this.options.label.lineColor;\n },\n set: function set(v) {\n var _this8 = this;\n this.options.label.lineColor = v;\n this.label.lineColor = v;\n if (this._elms.labelLineColor) {\n this._elms.labelLineColor.forEach(function (item, i) {\n var lineColorPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: _this8.labelLineColor,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this8.labelLineColor = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this8.labelLineColor = 'rgba(0,255,255,0.5)';\n } //点击清空按钮事件回调\n });\n _this8._elms.labelLineColor[i] = lineColorPicker;\n });\n }\n }\n }, {\n key: \"labelBackgroundColorStart\",\n get: function get() {\n return this.options.label.backgroundColor[0];\n },\n set: function set(v) {\n var _this9 = this;\n this.options.label.backgroundColor[0] = v;\n this.label.backgroundColor = [v, this.label.backgroundColor[1]];\n if (this._elms.labelBackgroundColorStart) {\n this._elms.labelBackgroundColorStart.forEach(function (item, i) {\n var labelBackgroundColorStartPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: _this9.labelBackgroundColorStart,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this9.labelBackgroundColorStart = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this9.labelBackgroundColorStart = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n _this9._elms.labelBackgroundColorStart[i] = labelBackgroundColorStartPicker;\n });\n }\n }\n }, {\n key: \"labelBackgroundColorEnd\",\n get: function get() {\n return this.options.label.backgroundColor[1];\n },\n set: function set(v) {\n var _this10 = this;\n this.options.label.backgroundColor[1] = v;\n this.label.backgroundColor = [this.label.backgroundColor[0], v];\n if (this._elms.labelBackgroundColorEnd) {\n this._elms.labelBackgroundColorEnd.forEach(function (item, i) {\n var labelBackgroundColorEndPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: _this10.labelBackgroundColorEnd,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this10.labelBackgroundColorEnd = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this10.labelBackgroundColorEnd = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n _this10._elms.labelBackgroundColorEnd[i] = labelBackgroundColorEndPicker;\n });\n }\n }\n }, {\n key: \"attributeType\",\n get: function get() {\n return this.options.attributeType;\n },\n set: function set(v) {\n this.options.attributeType = v;\n this._elms.attributeType && this._elms.attributeType.forEach(function (item) {\n item.value = v;\n });\n var attributeContent = this._DialogObject._element.content.getElementsByClassName('attribute-content');\n for (var i = 0; i < attributeContent.length; i++) {\n if (attributeContent[i].className.indexOf('attribute-content-' + v) > -1) {\n attributeContent[i].style.display = 'block';\n } else {\n attributeContent[i].style.display = 'none';\n }\n }\n }\n }, {\n key: \"attributeLink\",\n get: function get() {\n return this.options.attribute.link.content;\n },\n set: function set(v) {\n var _this11 = this;\n this.options.attribute.link.content = v;\n if (!this._DialogObject || !this._DialogObject._element || !this._DialogObject._element.content || this._DialogObject._element.content.getElementsByClassName('attribute-content-link').length == 0) {\n return;\n }\n var table = this._DialogObject._element.content.getElementsByClassName('attribute-content-link')[1].getElementsByClassName('table')[0];\n var tableContent = table.getElementsByClassName('table-body')[0];\n tableContent.innerHTML = '';\n if (this.options.attribute.link.content.length > 0) {\n table.getElementsByClassName('table-empty')[0].style.display = 'none';\n } else {\n table.getElementsByClassName('table-empty')[0].style.display = 'flex';\n }\n for (var i = 0; i < this.options.attribute.link.content.length; i++) {\n var tr = \"\\n
\\n
\" + this.options.attribute.link.content[i].name + \"
\\n
\" + this.options.attribute.link.content[i].url + \"
\\n
\\n \\n \\n
\\n
\";\n var trElm = document.createRange().createContextualFragment(tr);\n tableContent.appendChild(trElm);\n }\n var item = tableContent.getElementsByClassName('tr');\n var fun = {\n linkEdit: function () {\n var _linkEdit = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee(index) {\n var table, tableContent, item, _loop, _i;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee$(_context3) {\n while (1) switch (_context3.prev = _context3.next) {\n case 0:\n _context3.next = 2;\n return _this11.options.attribute.link.content;\n case 2:\n _this11.attributeLink = _context3.sent;\n table = _this11._DialogObject._element.content.getElementsByClassName('attribute-content-link')[1].getElementsByClassName('table')[0];\n tableContent = table.getElementsByClassName('table-body')[0];\n item = tableContent.getElementsByClassName('tr');\n _loop = /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _loop(_i) {\n var height, _html, textareaElm, td, btn, n, _iterator, _step, _loop2;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _loop$(_context2) {\n while (1) switch (_context2.prev = _context2.next) {\n case 0:\n if (!(index === _i)) {\n _context2.next = 36;\n break;\n }\n height = item[_i].offsetHeight;\n _html = \"\\n
\\n \\n
\\n
\\n \\n
\\n
\\n \\n \\n
\";\n item[_i].innerHTML = _html;\n textareaElm = item[_i].getElementsByClassName('link-edit')[0];\n textareaElm.style.height = height - 10 + 'px';\n td = item[_i].getElementsByClassName('td');\n td[0].getElementsByClassName('input')[0].value = _this11.options.attribute.link.content[index].name;\n td[1].getElementsByClassName('input')[0].value = _this11.options.attribute.link.content[index].url;\n btn = item[_i].getElementsByTagName('button');\n n = 0;\n case 11:\n if (!(n < btn.length)) {\n _context2.next = 35;\n break;\n }\n if (!(!btn[n] || !btn[n].attributes)) {\n _context2.next = 14;\n break;\n }\n return _context2.abrupt(\"continue\", 32);\n case 14:\n _iterator = _createForOfIteratorHelper(btn[n].attributes);\n _context2.prev = 15;\n _loop2 = /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _loop2() {\n var m;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _loop2$(_context) {\n while (1) switch (_context.prev = _context.next) {\n case 0:\n m = _step.value;\n if (!(m.name === '@click')) {\n _context.next = 5;\n break;\n }\n btn[n].addEventListener('click', function (e) {\n if (typeof fun[m.value] === 'function') {\n fun[m.value]({\n name: td[0].getElementsByClassName('input')[0].value,\n url: td[1].getElementsByClassName('input')[0].value\n }, _i);\n }\n });\n btn[n].attributes.removeNamedItem(m.name);\n return _context.abrupt(\"return\", 1);\n case 5:\n case \"end\":\n return _context.stop();\n }\n }, _loop2);\n });\n _iterator.s();\n case 18:\n if ((_step = _iterator.n()).done) {\n _context2.next = 24;\n break;\n }\n return _context2.delegateYield(_loop2(), \"t0\", 20);\n case 20:\n if (!_context2.t0) {\n _context2.next = 22;\n break;\n }\n return _context2.abrupt(\"break\", 24);\n case 22:\n _context2.next = 18;\n break;\n case 24:\n _context2.next = 29;\n break;\n case 26:\n _context2.prev = 26;\n _context2.t1 = _context2[\"catch\"](15);\n _iterator.e(_context2.t1);\n case 29:\n _context2.prev = 29;\n _iterator.f();\n return _context2.finish(29);\n case 32:\n n++;\n _context2.next = 11;\n break;\n case 35:\n return _context2.abrupt(\"return\", 1);\n case 36:\n case \"end\":\n return _context2.stop();\n }\n }, _loop, null, [[15, 26, 29, 32]]);\n });\n _i = 0;\n case 8:\n if (!(_i < item.length)) {\n _context3.next = 15;\n break;\n }\n return _context3.delegateYield(_loop(_i), \"t0\", 10);\n case 10:\n if (!_context3.t0) {\n _context3.next = 12;\n break;\n }\n return _context3.abrupt(\"break\", 15);\n case 12:\n _i++;\n _context3.next = 8;\n break;\n case 15:\n case \"end\":\n return _context3.stop();\n }\n }, _callee);\n }));\n function linkEdit(_x) {\n return _linkEdit.apply(this, arguments);\n }\n return linkEdit;\n }(),\n linkDelete: function linkDelete(i) {\n _this11.options.attribute.link.content.splice(i, 1);\n _this11.attributeLink = _this11.options.attribute.link.content;\n },\n confirmEdit: function confirmEdit(value, i) {\n var name = value.name && value.name.replace(/\\s/g, \"\");\n var url = value.url && value.url.replace(/\\s/g, \"\");\n if (name && url) {\n _this11.options.attribute.link.content[i] = value;\n } else {\n window.ELEMENT && window.ELEMENT.Message({\n message: '名称或链接不能为空!',\n type: 'warning',\n duration: 1500\n });\n }\n _this11.attributeLink = _this11.options.attribute.link.content;\n },\n cancelEdit: function cancelEdit() {\n _this11.attributeLink = _this11.options.attribute.link.content;\n },\n fileSelect: function fileSelect(value, i) {\n var fileElm = item[i].getElementsByClassName('file-select')[0];\n fileElm.click();\n fileElm.removeEventListener('change', _fileSelect);\n fileElm.addEventListener('change', _fileSelect);\n }\n };\n var _fileSelect = function _fileSelect(event) {\n if (event.target.value) {\n var td = item[event.target.getAttribute('index')].getElementsByClassName('td');\n td[1].getElementsByClassName('input')[0].value = event.target.value;\n event.target.value = null;\n }\n };\n var _loop3 = function _loop3(_i2) {\n var btn = item[_i2].getElementsByTagName('button');\n for (var n = 0; n < btn.length; n++) {\n if (!btn[n] || !btn[n].attributes) {\n continue;\n }\n var _iterator2 = _createForOfIteratorHelper(btn[n].attributes),\n _step2;\n try {\n var _loop4 = function _loop4() {\n var m = _step2.value;\n if (m.name === '@click') {\n btn[n].addEventListener('click', function (e) {\n if (typeof fun[m.value] === 'function') {\n fun[m.value](_i2);\n }\n });\n btn[n].attributes.removeNamedItem(m.name);\n return 1; // break\n }\n };\n for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {\n if (_loop4()) break;\n }\n } catch (err) {\n _iterator2.e(err);\n } finally {\n _iterator2.f();\n }\n }\n };\n for (var _i2 = 0; _i2 < item.length; _i2++) {\n _loop3(_i2);\n }\n }\n }, {\n key: \"attributeCamera\",\n get: function get() {\n return this.options.attribute.camera.content;\n },\n set: function set(v) {\n this.options.attribute.camera.content = v;\n }\n }, {\n key: \"attributeVr\",\n get: function get() {\n return this.options.attribute.vr.content;\n },\n set: function set(v) {\n var _this12 = this;\n this.options.attribute.vr.content = v;\n if (!this._DialogObject || !this._DialogObject._element || !this._DialogObject._element.content || this._DialogObject._element.content.getElementsByClassName('attribute-content-vr').length == 0) {\n return;\n }\n var table = this._DialogObject._element.content.getElementsByClassName('attribute-content-vr')[1].getElementsByClassName('table')[0];\n var tableContent = table.getElementsByClassName('table-body')[0];\n tableContent.innerHTML = '';\n if (this.options.attribute.vr.content.length > 0) {\n table.getElementsByClassName('table-empty')[0].style.display = 'none';\n } else {\n table.getElementsByClassName('table-empty')[0].style.display = 'flex';\n }\n for (var i = 0; i < this.options.attribute.vr.content.length; i++) {\n var tr = \"\\n
\\n
\" + this.options.attribute.vr.content[i].name + \"
\\n
\" + this.options.attribute.vr.content[i].url + \"
\\n
\\n \\n \\n
\\n
\";\n var trElm = document.createRange().createContextualFragment(tr);\n tableContent.appendChild(trElm);\n }\n var item = tableContent.getElementsByClassName('tr');\n var fun = {\n vrEdit: function () {\n var _vrEdit = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee2(index) {\n var table, tableContent, item, _loop5, _i3;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee2$(_context6) {\n while (1) switch (_context6.prev = _context6.next) {\n case 0:\n _context6.next = 2;\n return _this12.options.attribute.vr.content;\n case 2:\n _this12.attributeVr = _context6.sent;\n table = _this12._DialogObject._element.content.getElementsByClassName('attribute-content-vr')[1].getElementsByClassName('table')[0];\n tableContent = table.getElementsByClassName('table-body')[0];\n item = tableContent.getElementsByClassName('tr');\n _loop5 = /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _loop5(_i3) {\n var height, _html2, textareaElm, td, btn, n, _iterator3, _step3, _loop6;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _loop5$(_context5) {\n while (1) switch (_context5.prev = _context5.next) {\n case 0:\n if (!(index === _i3)) {\n _context5.next = 36;\n break;\n }\n height = item[_i3].offsetHeight;\n _html2 = \"\\n
\\n \\n
\\n
\\n \\n
\\n
\\n \\n \\n
\";\n item[_i3].innerHTML = _html2;\n textareaElm = item[_i3].getElementsByClassName('link-edit')[0];\n textareaElm.style.height = height - 10 + 'px';\n td = item[_i3].getElementsByClassName('td');\n td[0].getElementsByClassName('input')[0].value = _this12.options.attribute.vr.content[index].name;\n td[1].getElementsByClassName('input')[0].value = _this12.options.attribute.vr.content[index].url;\n btn = item[_i3].getElementsByTagName('button');\n n = 0;\n case 11:\n if (!(n < btn.length)) {\n _context5.next = 35;\n break;\n }\n if (!(!btn[n] || !btn[n].attributes)) {\n _context5.next = 14;\n break;\n }\n return _context5.abrupt(\"continue\", 32);\n case 14:\n _iterator3 = _createForOfIteratorHelper(btn[n].attributes);\n _context5.prev = 15;\n _loop6 = /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _loop6() {\n var m;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _loop6$(_context4) {\n while (1) switch (_context4.prev = _context4.next) {\n case 0:\n m = _step3.value;\n if (!(m.name === '@click')) {\n _context4.next = 5;\n break;\n }\n btn[n].addEventListener('click', function (e) {\n if (typeof fun[m.value] === 'function') {\n fun[m.value]({\n name: td[0].getElementsByClassName('input')[0].value,\n url: td[1].getElementsByClassName('input')[0].value\n }, _i3);\n }\n });\n btn[n].attributes.removeNamedItem(m.name);\n return _context4.abrupt(\"return\", 1);\n case 5:\n case \"end\":\n return _context4.stop();\n }\n }, _loop6);\n });\n _iterator3.s();\n case 18:\n if ((_step3 = _iterator3.n()).done) {\n _context5.next = 24;\n break;\n }\n return _context5.delegateYield(_loop6(), \"t0\", 20);\n case 20:\n if (!_context5.t0) {\n _context5.next = 22;\n break;\n }\n return _context5.abrupt(\"break\", 24);\n case 22:\n _context5.next = 18;\n break;\n case 24:\n _context5.next = 29;\n break;\n case 26:\n _context5.prev = 26;\n _context5.t1 = _context5[\"catch\"](15);\n _iterator3.e(_context5.t1);\n case 29:\n _context5.prev = 29;\n _iterator3.f();\n return _context5.finish(29);\n case 32:\n n++;\n _context5.next = 11;\n break;\n case 35:\n return _context5.abrupt(\"return\", 1);\n case 36:\n case \"end\":\n return _context5.stop();\n }\n }, _loop5, null, [[15, 26, 29, 32]]);\n });\n _i3 = 0;\n case 8:\n if (!(_i3 < item.length)) {\n _context6.next = 15;\n break;\n }\n return _context6.delegateYield(_loop5(_i3), \"t0\", 10);\n case 10:\n if (!_context6.t0) {\n _context6.next = 12;\n break;\n }\n return _context6.abrupt(\"break\", 15);\n case 12:\n _i3++;\n _context6.next = 8;\n break;\n case 15:\n case \"end\":\n return _context6.stop();\n }\n }, _callee2);\n }));\n function vrEdit(_x2) {\n return _vrEdit.apply(this, arguments);\n }\n return vrEdit;\n }(),\n vrDelete: function vrDelete(i) {\n _this12.options.attribute.vr.content.splice(i, 1);\n _this12.attributeVr = _this12.options.attribute.vr.content;\n },\n confirmEdit: function confirmEdit(value, i) {\n var name = value.name && value.name.replace(/\\s/g, \"\");\n var url = value.url && value.url.replace(/\\s/g, \"\");\n if (name && url) {\n _this12.options.attribute.vr.content[i] = value;\n } else {\n window.ELEMENT && window.ELEMENT.Message({\n message: '名称或链接不能为空!',\n type: 'warning',\n duration: 1500\n });\n }\n _this12.attributeVr = _this12.options.attribute.vr.content;\n },\n cancelEdit: function cancelEdit() {\n _this12.attributeVr = _this12.options.attribute.vr.content;\n },\n fileSelect: function fileSelect(value, i) {\n var fileElm = item[i].getElementsByClassName('file-select')[0];\n fileElm.click();\n fileElm.removeEventListener('change', _fileSelect2);\n fileElm.addEventListener('change', _fileSelect2);\n }\n };\n var _fileSelect2 = function _fileSelect2(event) {\n if (event.target.value) {\n var td = item[event.target.getAttribute('index')].getElementsByClassName('td');\n td[1].getElementsByClassName('input')[0].value = event.target.value;\n event.target.value = null;\n }\n };\n var _loop7 = function _loop7(_i4) {\n var btn = item[_i4].getElementsByTagName('button');\n for (var n = 0; n < btn.length; n++) {\n if (!btn[n] || !btn[n].attributes) {\n continue;\n }\n var _iterator4 = _createForOfIteratorHelper(btn[n].attributes),\n _step4;\n try {\n var _loop8 = function _loop8() {\n var m = _step4.value;\n if (m.name === '@click') {\n btn[n].addEventListener('click', function (e) {\n if (typeof fun[m.value] === 'function') {\n fun[m.value](_i4);\n }\n });\n btn[n].attributes.removeNamedItem(m.name);\n return 1; // break\n }\n };\n for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {\n if (_loop8()) break;\n }\n } catch (err) {\n _iterator4.e(err);\n } finally {\n _iterator4.f();\n }\n }\n };\n for (var _i4 = 0; _i4 < item.length; _i4++) {\n _loop7(_i4);\n }\n }\n }, {\n key: \"attributeGoods\",\n get: function get() {\n return this.options.attribute.goods.content;\n },\n set: function set(v) {\n this.options.attribute.goods.content = v;\n }\n }, {\n key: \"edit\",\n value: // 编辑框\n function () {\n var _edit = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee3(state) {\n var _this13 = this;\n var _this, createSpatialInfoTableContent, contentElm, tabsElm, colorPicker, linecolorPicker, labelColorPicker, labellineColorPicker, labelBackgroundColorStartPicker, labelBackgroundColorEndPicker, all_elm, heightBoxElm, heightElm, heightConfirmElm, heightModeData, heightModeObject, heightModeDataLegpElm, i;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee3$(_context7) {\n while (1) switch (_context7.prev = _context7.next) {\n case 0:\n if (!this._error) {\n _context7.next = 2;\n break;\n }\n return _context7.abrupt(\"return\");\n case 2:\n _this = this;\n this.originalOptions = this.deepCopyObj(this.options);\n if (this._DialogObject && this._DialogObject.close) {\n this._DialogObject.close();\n }\n if (!state) {\n _context7.next = 61;\n break;\n }\n createSpatialInfoTableContent = function createSpatialInfoTableContent() {\n var tableElm = contentElm.getElementsByClassName('spatial-info-table')[0];\n var tBodyElm = tableElm.getElementsByClassName('table-body')[0];\n tBodyElm.innerHTML = '';\n _this._elms.lng = [];\n _this._elms.lngInput = [];\n _this._elms.lat = [];\n _this._elms.latInput = [];\n _this._elms.alt = [];\n _this._elms.altInput = [];\n var _loop9 = function _loop9(i) {\n var tr = document.createElement('div');\n tr.className = 'tr';\n tr.innerHTML = \"\\n
\".concat(i + 1, \"
\\n
\\n
\\n
\\n \");\n var lngBox = tr.getElementsByClassName('lng')[0];\n var lng = document.createElement('span');\n lng.innerHTML = _this.options.positions[i].lng.toFixed(8);\n lngBox.appendChild(lng);\n var lngInput = document.createElement('input');\n lngInput.className = 'input';\n lngInput.type = 'number';\n lngInput.title = '';\n lngInput.min = -180;\n lngInput.max = 180;\n lngInput.value = _this.options.positions[i].lng.toFixed(8);\n var latBox = tr.getElementsByClassName('lat')[0];\n var lat = document.createElement('span');\n lat.innerHTML = _this.options.positions[i].lat.toFixed(8);\n latBox.appendChild(lat);\n var latInput = document.createElement('input');\n latInput.className = 'input';\n latInput.type = 'number';\n latInput.title = '';\n latInput.min = -90;\n latInput.max = 90;\n latInput.value = _this.options.positions[i].lat.toFixed(8);\n var altBox = tr.getElementsByClassName('alt')[0];\n var alt = document.createElement('span');\n alt.innerHTML = _this.height.toFixed(2);\n altBox.appendChild(alt);\n var altInput = document.createElement('input');\n altInput.className = 'input';\n altInput.type = 'number';\n altInput.title = '';\n altInput.min = -9999999;\n altInput.max = 999999999;\n altInput.value = _this.height.toFixed(2);\n lngBox.addEventListener('dblclick', function () {\n lngBox.innerHTML = '';\n lngInput.value = Number(_this.options.positions[i].lng.toFixed(8));\n lngBox.appendChild(lngInput);\n lngInput.focus();\n if (_this.operate.positionEditing) {\n _this.positionEditing = false;\n }\n AttackArrowObject.closeNodeEdit(_this);\n _this.heightMode = _this.heightMode;\n });\n lngInput.addEventListener('blur', function () {\n lngInput.value = Number(_this.options.positions[i].lng.toFixed(8));\n lngBox.innerHTML = '';\n lngBox.appendChild(lng);\n });\n lngInput.addEventListener('input', function () {\n _this.options.positions[i].lng = Number(Number(lngInput.value).toFixed(8));\n lng.innerHTML = _this.options.positions[i].lng.toFixed(8);\n _this.height = _this.height;\n });\n latBox.addEventListener('dblclick', function () {\n latBox.innerHTML = '';\n latInput.value = Number(_this.options.positions[i].lat.toFixed(8));\n latBox.appendChild(latInput);\n latInput.focus();\n if (_this.operate.positionEditing) {\n _this.positionEditing = false;\n }\n AttackArrowObject.closeNodeEdit(_this);\n _this.heightMode = _this.heightMode;\n });\n latInput.addEventListener('blur', function () {\n latInput.value = Number(_this.options.positions[i].lat.toFixed(8));\n latBox.innerHTML = '';\n latBox.appendChild(lat);\n });\n latInput.addEventListener('input', function () {\n _this.options.positions[i].lat = Number(Number(latInput.value).toFixed(8));\n lat.innerHTML = _this.options.positions[i].lat.toFixed(8);\n _this.height = _this.height;\n });\n altBox.addEventListener('dblclick', function () {\n if (_this.heightMode == 2) {\n return;\n }\n altBox.innerHTML = '';\n altInput.value = Number(_this.height.toFixed(2));\n altBox.appendChild(altInput);\n altInput.focus();\n if (_this.operate.positionEditing) {\n _this.positionEditing = false;\n }\n AttackArrowObject.closeNodeEdit(_this);\n _this.heightMode = _this.heightMode;\n });\n altInput.addEventListener('blur', function () {\n altInput.value = Number(_this.height.toFixed(2));\n altBox.innerHTML = '';\n altBox.appendChild(alt);\n });\n altInput.addEventListener('input', function () {\n _this.height = Number(Number(altInput.value).toFixed(2));\n alt.innerHTML = Number(_this.height.toFixed(2));\n });\n _this._elms.lng.push(lng);\n _this._elms.lngInput.push(lngInput);\n _this._elms.lat.push(lat);\n _this._elms.latInput.push(latInput);\n _this._elms.alt.push(alt);\n _this._elms.altInput.push(altInput);\n tBodyElm.appendChild(tr);\n };\n for (var i = 0; i < _this.options.positions.length; i++) {\n _loop9(i);\n }\n };\n _context7.next = 9;\n return new _Element_Dialog__WEBPACK_IMPORTED_MODULE_9__[\"default\"](this.sdk, this.options, {\n title: '箭头属性',\n left: '180px',\n top: '100px',\n confirmCallBack: function confirmCallBack(options) {\n _this13.name = _this13.name.trim();\n if (!_this13.name) {\n _this13.name = '未命名对象';\n }\n _this13.options.label.position = {\n lng: _this13.label.position[0],\n lat: _this13.label.position[1],\n alt: _this13.label.position[2]\n };\n _this13.originalOptions = _this13.deepCopyObj(_this13.options);\n _this13._DialogObject.close();\n _this13.Dialog.confirmCallBack && _this13.Dialog.confirmCallBack(_this13.originalOptions);\n },\n resetCallBack: function resetCallBack() {\n _this13.reset();\n _this13.Dialog.resetCallBack && _this13.Dialog.resetCallBack();\n },\n removeCallBack: function removeCallBack() {\n _this13.Dialog.removeCallBack && _this13.Dialog.removeCallBack();\n },\n closeCallBack: function closeCallBack() {\n var spreadState = _this13.options.spreadState;\n _this13.positionEditing = false;\n setTimeout(function () {\n _this13.options.spreadState = spreadState;\n _this13.reset();\n }, 10);\n _this13.Dialog.closeCallBack && _this13.Dialog.closeCallBack();\n },\n showCallBack: function showCallBack(show) {\n _this13.options.show = show;\n _this13.originalOptions.show = show;\n _this13.show = show;\n _this13.Dialog.showCallBack && _this13.Dialog.showCallBack();\n },\n translationalCallBack: function translationalCallBack() {\n _this13.positionEditing = !_this13.positionEditing;\n },\n // 二次编辑回调\n secondaryEditCallBack: function secondaryEditCallBack() {\n AttackArrowObject.nodeEdit(_this13, function () {\n createSpatialInfoTableContent();\n });\n }\n });\n case 9:\n this._DialogObject = _context7.sent;\n this._DialogObject._element.body.className = this._DialogObject._element.body.className + ' attackArrow';\n contentElm = document.createElement('div');\n contentElm.innerHTML = Object(_element__WEBPACK_IMPORTED_MODULE_12__[\"html\"])(this);\n this._DialogObject.contentAppChild(contentElm);\n this.attributeType = this.options.attributeType;\n this.attributeCamera = this.options.attribute.camera.content;\n\n // 创建标签页\n tabsElm = new _Element_cy_html_tabs__WEBPACK_IMPORTED_MODULE_10__[\"default\"]('attack-arrow-object-edit-tabs', undefined, this.sdk); // 颜色组件\n colorPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName(\"color\")[0],\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: this.color,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this13.color = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this13.color = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n linecolorPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName(\"lineColor\")[0],\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: this.lineColor,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this13.lineColor = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this13.lineColor = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n labelColorPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName(\"labelColor\")[0],\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: this.labelColor,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this13.labelColor = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this13.labelColor = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n labellineColorPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName(\"labelLineColor\")[0],\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: this.labelLineColor,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this13.labelLineColor = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this13.labelLineColor = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n labelBackgroundColorStartPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName(\"labelBackgroundColorStart\")[0],\n size: 'mini',\n alpha: true,\n defaultColor: this.labelBackgroundColorStart,\n disabled: false,\n openPickerAni: 'opacity',\n sure: function sure(color) {\n _this13.labelBackgroundColorStart = color;\n },\n clear: function clear() {\n _this13.labelBackgroundColorStart = 'rgba(255,255,255,1)';\n }\n });\n labelBackgroundColorEndPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName(\"labelBackgroundColorEnd\")[0],\n size: 'mini',\n alpha: true,\n defaultColor: this.labelBackgroundColorEnd,\n disabled: false,\n openPickerAni: 'opacity',\n sure: function sure(color) {\n _this13.labelBackgroundColorEnd = color;\n },\n clear: function clear() {\n _this13.labelBackgroundColorEnd = 'rgba(255,255,255,1)';\n }\n });\n all_elm = contentElm.getElementsByTagName(\"*\");\n AttackArrowObject.EventBinding(this, all_elm);\n this._elms.color = [colorPicker];\n this._elms.lineColor = [linecolorPicker];\n this._elms.labelColor = [labelColorPicker];\n this._elms.labelLineColor = [labellineColorPicker];\n this._elms.labelBackgroundColorStart = [labelBackgroundColorStartPicker];\n this._elms.labelBackgroundColorEnd = [labelBackgroundColorEndPicker];\n heightBoxElm = this._DialogObject._element.content.getElementsByClassName('height-box')[0];\n heightElm = heightBoxElm.getElementsByClassName('height')[0];\n heightConfirmElm = this._DialogObject._element.content.getElementsByClassName('height-confirm')[0];\n heightElm.value = 10;\n if (this.heightMode == 2) {\n heightBoxElm && (heightBoxElm.className = 'input-number input-number-unit-1 height-box disabled');\n heightConfirmElm && heightConfirmElm.setAttribute('disabled', 'disabled');\n } else {\n heightBoxElm && (heightBoxElm.className = 'input-number input-number-unit-1 height-box');\n heightConfirmElm && heightConfirmElm.removeAttribute('disabled');\n }\n heightModeData = [{\n name: '海拔高度',\n value: '海拔高度',\n key: '0'\n }, {\n name: '相对地表',\n value: '相对地表',\n key: '1'\n }, {\n name: '依附模型',\n value: '依附模型',\n key: '2'\n }];\n heightModeObject = Object(_Element_datalist__WEBPACK_IMPORTED_MODULE_18__[\"legp\"])(this._DialogObject._element.content.getElementsByClassName('height-mode-box')[0], '.height-mode');\n if (!heightModeObject) {\n _context7.next = 58;\n break;\n }\n heightModeObject.legp_search(heightModeData);\n heightModeDataLegpElm = this._DialogObject._element.content.getElementsByClassName('height-mode')[0].getElementsByTagName('input')[0];\n i = 0;\n case 42:\n if (!(i < heightModeData.length)) {\n _context7.next = 50;\n break;\n }\n if (!(heightModeData[i].key == this.heightMode)) {\n _context7.next = 47;\n break;\n }\n heightModeDataLegpElm.value = heightModeData[i].value;\n heightModeObject.legp_searchActive(heightModeData[i].value);\n return _context7.abrupt(\"break\", 50);\n case 47:\n i++;\n _context7.next = 42;\n break;\n case 50:\n heightModeDataLegpElm.addEventListener('input', function () {\n for (var _i5 = 0; _i5 < heightModeData.length; _i5++) {\n if (heightModeData[_i5].value === heightModeDataLegpElm.value) {\n _this13.heightMode = heightModeData[_i5].key;\n break;\n }\n }\n });\n heightElm.addEventListener('input', function () {\n switch (_this13.heightMode) {\n case 0:\n case '0':\n break;\n case 1:\n case '1':\n break;\n case 2:\n case '2':\n break;\n }\n });\n this._elms.height = heightElm;\n this._elms.heightBox = heightBoxElm;\n this._elms.heightMode = heightModeDataLegpElm;\n this._elms.heightConfirm = heightConfirmElm;\n this._elms.heightModeObject = heightModeObject;\n heightConfirmElm.addEventListener('click', function () {\n if (_this13.operate.positionEditing) {\n _this13.positionEditing = false;\n _this13.height = _this13.height + Number(heightElm.value);\n } else {\n AttackArrowObject.closeNodeEdit(_this13);\n _this13.heightMode = _this13.heightMode;\n setTimeout(function () {\n _this13.height = _this13.height + Number(heightElm.value);\n }, 100);\n }\n });\n case 58:\n setTimeout(function () {\n _this13.attributeLink = _this13.options.attribute.link.content;\n _this13.attributeVr = _this13.options.attribute.vr.content;\n _this13.cameraSelect && _this13.cameraSelect();\n _this13.goodsSelect && _this13.goodsSelect();\n var tagData = _this13.attributeSelect;\n var attributeElm = _this13._DialogObject._element.content.getElementsByClassName('attribute-select-box')[0];\n if (attributeElm) {\n var legpObject = Object(_Element_datalist__WEBPACK_IMPORTED_MODULE_18__[\"legp\"])(attributeElm, \".attribute-select\");\n legpObject.legp_search(tagData);\n var attributeSelectElm = _this13._DialogObject._element.content.getElementsByClassName('attribute-select')[0].getElementsByTagName('input')[0];\n for (var _i6 = 0; _i6 < tagData.length; _i6++) {\n if (tagData[_i6].key === _this13.options.attributeType) {\n attributeSelectElm.value = tagData[_i6].value;\n legpObject.legp_searchActive(tagData[_i6].value);\n break;\n }\n }\n attributeSelectElm.addEventListener('input', function () {\n for (var _i7 = 0; _i7 < tagData.length; _i7++) {\n if (tagData[_i7].value === attributeSelectElm.value) {\n _this13.attributeType = tagData[_i7].key;\n break;\n }\n }\n });\n }\n var unitData = [{\n name: '平方米',\n value: '平方米'\n }, {\n name: '平方千米',\n value: '平方千米'\n }, {\n name: '亩',\n value: '亩'\n }, {\n name: '公顷',\n value: '公顷'\n }];\n var unitDataLegpObject = Object(_Element_datalist__WEBPACK_IMPORTED_MODULE_18__[\"legp\"])(_this13._DialogObject._element.content.getElementsByClassName('input-select-unit-box')[0], \".input-select-unit\");\n if (unitDataLegpObject) {\n unitDataLegpObject.legp_search(unitData);\n var unitDataLegpElm = _this13._DialogObject._element.content.getElementsByClassName('input-select-unit')[0].getElementsByTagName('input')[0];\n unitDataLegpElm.value = _this13.options['area-unit'];\n for (var _i8 = 0; _i8 < unitData.length; _i8++) {\n if (unitData[_i8].value === unitDataLegpElm.value) {\n unitDataLegpObject.legp_searchActive(unitData[_i8].value);\n break;\n }\n }\n unitDataLegpElm.addEventListener('input', function () {\n for (var _i9 = 0; _i9 < unitData.length; _i9++) {\n if (unitData[_i9].value === unitDataLegpElm.value) {\n _this13.areaUnit = unitData[_i9].value;\n break;\n }\n }\n });\n }\n var fontData = Object(_Element_fontSelect__WEBPACK_IMPORTED_MODULE_19__[\"getFontList\"])();\n var fontObject = Object(_Element_datalist__WEBPACK_IMPORTED_MODULE_18__[\"legp\"])(_this13._DialogObject._element.content.getElementsByClassName('font-select-box')[0], '.font-select');\n if (fontObject) {\n fontObject.legp_search(fontData);\n var fontDataLegpElm = _this13._DialogObject._element.content.getElementsByClassName('font-select')[0].getElementsByTagName('input')[0];\n fontDataLegpElm.value = fontData[_this13.labelFontFamily].value;\n for (var _i10 = 0; _i10 < fontData.length; _i10++) {\n if (fontData[_i10].value == fontDataLegpElm.value) {\n fontObject.legp_searchActive(fontData[_i10].value);\n break;\n }\n }\n fontDataLegpElm.addEventListener('input', function () {\n for (var _i11 = 0; _i11 < fontData.length; _i11++) {\n if (fontData[_i11].value === fontDataLegpElm.value) {\n _this13.labelFontFamily = fontData[_i11].key;\n break;\n }\n }\n });\n _this13._elms.labelFontFamily = [fontDataLegpElm];\n }\n createSpatialInfoTableContent();\n }, 0);\n _context7.next = 62;\n break;\n case 61:\n if (this._DialogObject && this._DialogObject.close) {\n this._DialogObject.close();\n this._DialogObject = null;\n }\n case 62:\n case \"end\":\n return _context7.stop();\n }\n }, _callee3, this);\n }));\n function edit(_x3) {\n return _edit.apply(this, arguments);\n }\n return edit;\n }()\n }, {\n key: \"reset\",\n value: function reset() {\n var _this14 = this;\n if (!this.entity) {\n return;\n }\n this.options = this.deepCopyObj(this.originalOptions);\n this.name = this.originalOptions.name;\n this.color = this.originalOptions.color;\n this.lineColor = this.originalOptions.line.color;\n this.lineWidth = this.originalOptions.line.width;\n this.area = this.originalOptions.area;\n this.areaUnit = this.originalOptions['area-unit'];\n this.labelShow = this.originalOptions.label.show;\n this.labelColor = this.originalOptions.label.color;\n this.labelFontSize = this.originalOptions.label.fontSize;\n this.labelFontFamily = this.originalOptions.label.fontFamily;\n this.labelScaleByDistance = this.originalOptions.label.scaleByDistance;\n this.labelNear = this.originalOptions.label.near;\n this.labelFar = this.originalOptions.label.far;\n this.labelLineWidth = this.originalOptions.label.lineWidth;\n this.labelPixelOffset = this.originalOptions.label.pixelOffset;\n this.labelLineColor = this.originalOptions.label.lineColor;\n this.labelBackgroundColorStart = this.originalOptions.label.backgroundColor[0];\n this.labelBackgroundColorEnd = this.originalOptions.label.backgroundColor[1];\n this.attributeLink = this.options.attribute.link.content;\n this.attributeVr = this.options.attribute.vr.content;\n this.attributeCamera = this.options.attribute.camera.content;\n this.attributeGoods = this.options.attribute.goods.content;\n this.cameraSelect && this.cameraSelect();\n this.goodsSelect && this.goodsSelect();\n for (var i = 0; i < this.options.positions.length; i++) {\n if (this._elms.lng && this._elms.lng[i]) {\n this._elms.lng[i].innerHTML = this.options.positions[i].lng.toFixed(8);\n }\n if (this._elms.lat && this._elms.lat[i]) {\n this._elms.lat[i].innerHTML = this.options.positions[i].lat.toFixed(8);\n }\n if (this._elms.alt && this._elms.alt[i]) {\n this._elms.alt[i].innerHTML = Number(this.options.height.toFixed(2));\n }\n }\n this.heightMode = this.heightMode;\n for (var _i12 = 0; _i12 < this.nodePoints.length; _i12++) {\n this.sdk.viewer.entities.remove(this.nodePoints[_i12]);\n }\n this.previous = null;\n this.nodePoints = [];\n YJ.Measure.SetMeasureStatus(false);\n this.event && this.event.destroy();\n this.tip && this.tip.destroy();\n var spreadState = this.options.spreadState;\n this.removeAnimate();\n setTimeout(function () {\n _this14.loop = _this14.options.loop;\n _this14.spreadState = spreadState;\n Object(_Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_17__[\"syncData\"])(_this14.sdk, _this14.options.id);\n Object(_Global_SplitScreen__WEBPACK_IMPORTED_MODULE_20__[\"syncSplitData\"])(_this14.sdk, _this14.options.id);\n }, 200);\n }\n }, {\n key: \"remove\",\n value: function () {\n var _remove = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee4() {\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee4$(_context8) {\n while (1) switch (_context8.prev = _context8.next) {\n case 0:\n this.removeAnimate();\n this.event && this.event.destroy();\n this.tip && this.tip.destroy();\n this.entity && this.sdk.viewer.entities.remove(this.entity);\n this.label && this.label.remove();\n this.entity = null;\n if (this._DialogObject && !this._DialogObject.isDestroy) {\n this._DialogObject.close();\n this._DialogObject = null;\n }\n _context8.next = 9;\n return this.sdk.removeIncetance(this.options.id);\n case 9:\n _context8.next = 11;\n return Object(_Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_17__[\"syncData\"])(this.sdk, this.options.id);\n case 11:\n case \"end\":\n return _context8.stop();\n }\n }, _callee4, this);\n }));\n function remove() {\n return _remove.apply(this, arguments);\n }\n return remove;\n }()\n }, {\n key: \"_addLink\",\n value: function _addLink() {\n // document.getElementsByClassName\n if (this._DialogObject._element.content.getElementsByClassName('link_add')[0] && this._DialogObject._element.content.getElementsByClassName('link_add')[0].value) {\n this.options.attribute.link.content.push({\n name: '链接',\n url: this._DialogObject._element.content.getElementsByClassName('link_add')[0].value\n });\n this._DialogObject._element.content.getElementsByClassName('link_add')[0].value = '';\n this.attributeLink = this.options.attribute.link.content;\n } else {\n this.Dialog.clickAddLink && this.Dialog.clickAddLink();\n }\n }\n }, {\n key: \"addAttributeLink\",\n value: function addAttributeLink(link) {\n this.options.attribute.link.content.push({\n name: '链接',\n url: link\n });\n this.attributeLink = this.options.attribute.link.content;\n }\n }, {\n key: \"_addRr\",\n value: function _addRr() {\n if (this._DialogObject._element.content.getElementsByClassName('vr_add')[0].value) {\n this.options.attribute.vr.content.push({\n name: '全景图',\n url: this._DialogObject._element.content.getElementsByClassName('vr_add')[0].value\n });\n this._DialogObject._element.content.getElementsByClassName('vr_add')[0].value = '';\n this.attributeVr = this.options.attribute.vr.content;\n } else {\n this.Dialog.clickAddVr && this.Dialog.clickAddVr();\n }\n }\n }, {\n key: \"addAttributeRr\",\n value: function addAttributeRr(vr) {\n this.options.attribute.vr.content.push({\n name: '全景图',\n url: vr\n });\n this.attributeVr = this.options.attribute.vr.content;\n }\n\n /**\r\n * 飞到\r\n */\n }, {\n key: \"flyTo\",\n value: (function () {\n var _flyTo = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee5() {\n var options,\n orientation,\n lng,\n lat,\n alt,\n destination,\n position,\n positionArray,\n ground,\n i,\n height,\n a,\n _i13,\n BoundingSphere,\n _args9 = arguments;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee5$(_context9) {\n while (1) switch (_context9.prev = _context9.next) {\n case 0:\n options = _args9.length > 0 && _args9[0] !== undefined ? _args9[0] : {};\n if (!this._error) {\n _context9.next = 3;\n break;\n }\n return _context9.abrupt(\"return\");\n case 3:\n Object(_Global_global__WEBPACK_IMPORTED_MODULE_21__[\"setActiveViewer\"])(0);\n Object(_Global_global__WEBPACK_IMPORTED_MODULE_21__[\"closeRotateAround\"])(this.sdk);\n Object(_Global_global__WEBPACK_IMPORTED_MODULE_21__[\"closeViewFollow\"])(this.sdk);\n if (!(this.options.customView && this.options.customView.relativePosition && this.options.customView.orientation)) {\n _context9.next = 25;\n break;\n }\n orientation = {\n heading: Cesium.Math.toRadians(this.options.customView.orientation.heading || 0.0),\n pitch: Cesium.Math.toRadians(this.options.customView.orientation.pitch || -60.0),\n roll: Cesium.Math.toRadians(this.options.customView.orientation.roll || 0.0)\n };\n lng = this.options.customView.relativePosition.lng;\n lat = this.options.customView.relativePosition.lat;\n alt = this.options.customView.relativePosition.alt;\n destination = Cesium.Cartesian3.fromDegrees(lng, lat, alt);\n position = {\n lng: 0,\n lat: 0\n };\n if (this.options.position) {\n position = _objectSpread({}, this.options.position);\n } else if (this.options.positions) {\n position = _objectSpread({}, this.options.positions[0]);\n } else if (this.options.center) {\n position = _objectSpread({}, this.options.center);\n } else if (this.options.start) {\n position = _objectSpread({}, this.options.start);\n } else {\n if (this.options.hasOwnProperty('lng')) {\n position.lng = this.options.lng;\n }\n if (this.options.hasOwnProperty('lat')) {\n position.lat = this.options.lat;\n }\n if (this.options.hasOwnProperty('alt')) {\n position.alt = this.options.alt;\n }\n }\n // 如果没有高度值,则获取紧贴高度计算\n if (position.hasOwnProperty('alt')) {\n _context9.next = 18;\n break;\n }\n _context9.next = 17;\n return this.getClampToHeight(position);\n case 17:\n position.alt = _context9.sent;\n case 18:\n lng = this.options.customView.relativePosition.lng + position.lng;\n lat = this.options.customView.relativePosition.lat + position.lat;\n alt = this.options.customView.relativePosition.alt + position.alt;\n destination = Cesium.Cartesian3.fromDegrees(lng, lat, alt);\n this.sdk.viewer.camera.flyTo({\n destination: destination,\n orientation: orientation\n });\n _context9.next = 51;\n break;\n case 25:\n positionArray = [];\n _context9.t0 = this.heightMode;\n _context9.next = _context9.t0 === 0 ? 29 : _context9.t0 === '0' ? 29 : _context9.t0 === 1 ? 31 : _context9.t0 === '1' ? 31 : _context9.t0 === 2 ? 33 : _context9.t0 === '2' ? 33 : 35;\n break;\n case 29:\n ground = false;\n return _context9.abrupt(\"break\", 35);\n case 31:\n ground = false;\n return _context9.abrupt(\"break\", 35);\n case 33:\n ground = true;\n return _context9.abrupt(\"break\", 35);\n case 35:\n if (!ground) {\n _context9.next = 48;\n break;\n }\n i = 0;\n case 37:\n if (!(i < this.options.positions.length)) {\n _context9.next = 46;\n break;\n }\n _context9.next = 40;\n return this.getClampToHeight(this.options.positions[i]);\n case 40:\n height = _context9.sent;\n a = Cesium.Cartesian3.fromDegrees(this.options.positions[i].lng, this.options.positions[i].lat, height);\n positionArray.push(a.x, a.y, a.z);\n case 43:\n i++;\n _context9.next = 37;\n break;\n case 46:\n _context9.next = 49;\n break;\n case 48:\n if (this.positionsH) {\n for (_i13 = 0; _i13 < this.positionsH.length; _i13++) {\n positionArray.push(this.positionsH[_i13].x, this.positionsH[_i13].y, this.positionsH[_i13].z);\n }\n }\n case 49:\n BoundingSphere = Cesium.BoundingSphere.fromVertices(positionArray);\n this.sdk.viewer.camera.flyToBoundingSphere(BoundingSphere, {\n offset: options.orientation || {\n heading: Cesium.Math.toRadians(0.0),\n pitch: Cesium.Math.toRadians(-90.0),\n roll: Cesium.Math.toRadians(0.0)\n }\n });\n case 51:\n case \"end\":\n return _context9.stop();\n }\n }, _callee5, this);\n }));\n function flyTo() {\n return _flyTo.apply(this, arguments);\n }\n return flyTo;\n }()\n /**\r\n * 打开富文本框\r\n */\n )\n }, {\n key: \"openRichTextEditor\",\n value: function openRichTextEditor(e) {\n var _this15 = this;\n // var ue = UE.getEditor('app');\n _Element_richText__WEBPACK_IMPORTED_MODULE_11__[\"default\"].open(this.options.id, this.options.name, this.options.richTextContent);\n _Element_richText__WEBPACK_IMPORTED_MODULE_11__[\"default\"].primaryCallBack = function (content) {\n _this15.options.richTextContent = content;\n };\n }\n\n /**@desc 打开平移功能\r\n *\r\n * @memberOf Source\r\n * @param status {boolean}\r\n *\r\n * */\n }, {\n key: \"positionEditing\",\n get: function get() {\n return this.operate.positionEditing;\n },\n set: function set(status) {\n var _this16 = this;\n if (YJ.Measure.GetMeasureStatus() || !this.sdk || !this.sdk.viewer || !this.entity) {\n return;\n }\n this.removeAnimate();\n var _this = this;\n this.event && this.event.destroy();\n this.event = new _Event_index__WEBPACK_IMPORTED_MODULE_15__[\"default\"](this.sdk);\n this.operate.positionEditing = status;\n if (status === true) {\n var _Cesium$Cartesian;\n this.previous = {\n positions: _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(this.positions)\n };\n this.tip && this.tip.destroy();\n this.tip = new _MouseTip__WEBPACK_IMPORTED_MODULE_16__[\"default\"]('点击鼠标左键确认,右键取消', this.sdk);\n this.label && (this.label.entity.billboard.color = Cesium.Color.fromCssColorString(\"rgba(255,255,255,0.9)\"));\n this.picking = false;\n var array = [];\n var positions = _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(this.positions);\n var disparity = [];\n for (var i = 0; i < positions.length; i++) {\n var position = this.cartesian3Towgs84(positions[i], this.sdk.viewer);\n array.push([position.lng, position.lat]);\n }\n var firstposition = this.cartesian3Towgs84(positions[0], this.sdk.viewer);\n array.push([firstposition.lng, firstposition.lat]);\n var polygon = turf.polygon([array]);\n var centroid = turf.centroid(polygon);\n var center = (_Cesium$Cartesian = Cesium.Cartesian3).fromDegrees.apply(_Cesium$Cartesian, _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(centroid.geometry.coordinates));\n for (var _i14 = 0; _i14 < positions.length; _i14++) {\n center.x - positions[_i14].x;\n disparity.push({\n x: center.x - positions[_i14].x,\n y: center.y - positions[_i14].y,\n z: center.z - positions[_i14].z\n });\n }\n var newpositions = [];\n this.event.mouse_move(function (movement, cartesian) {\n newpositions = [];\n for (var _i15 = 0; _i15 < disparity.length; _i15++) {\n newpositions.push({\n x: cartesian.x - disparity[_i15].x,\n y: cartesian.y - disparity[_i15].y,\n z: cartesian.z - disparity[_i15].z\n });\n }\n // this.label.position = [position84.lng, position84.lat, position84.alt]\n _this16.tip.setPosition(cartesian, movement.endPosition.x, movement.endPosition.y);\n });\n this.event.mouse_left(function (movement, cartesian) {\n _this16.event.mouse_move(function () {});\n _this16.event.mouse_left(function () {});\n _this16.event.mouse_right(function () {});\n _this16.event.gesture_pinck_start(function () {});\n newpositions = [];\n for (var _i16 = 0; _i16 < disparity.length; _i16++) {\n var pos3 = {\n x: cartesian.x - disparity[_i16].x,\n y: cartesian.y - disparity[_i16].y,\n z: cartesian.z - disparity[_i16].z\n };\n newpositions.push(pos3);\n _this16.options.positions[_i16] = _this16.cartesian3Towgs84(pos3, _this16.sdk.viewer);\n if (_this16._elms.lng && _this16._elms.lng[_i16]) {\n _this16._elms.lng[_i16].innerHTML = _this16.options.positions[_i16].lng.toFixed(8);\n }\n if (_this16._elms.lat && _this16._elms.lat[_i16]) {\n _this16._elms.lat[_i16].innerHTML = _this16.options.positions[_i16].lat.toFixed(8);\n }\n }\n _this16.positions = newpositions;\n _this16.previous = {\n positions: _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(_this16.positions)\n };\n _this16.positionEditing = false;\n });\n this.event.mouse_right(function (movement, cartesian) {\n _this16.positionEditing = false;\n });\n this.event.gesture_pinck_start(function (movement, cartesian) {\n var startTime = new Date();\n _this16.event.gesture_pinck_end(function () {\n var endTime = new Date();\n if (endTime - startTime >= 500) {\n // 长按取消\n _this16.positionEditing = false;\n } else {\n _this16.event.mouse_move(function () {});\n _this16.event.mouse_left(function () {});\n _this16.event.mouse_right(function () {});\n _this16.event.gesture_pinck_start(function () {});\n newpositions = [];\n for (var _i17 = 0; _i17 < disparity.length; _i17++) {\n var pos3 = {\n x: cartesian.x - disparity[_i17].x,\n y: cartesian.y - disparity[_i17].y,\n z: cartesian.z - disparity[_i17].z\n };\n newpositions.push(pos3);\n _this16.options.positions[_i17] = _this16.cartesian3Towgs84(pos3, _this16.sdk.viewer);\n if (_this16._elms.lng && _this16._elms.lng[_i17]) {\n _this16._elms.lng[_i17].innerHTML = _this16.options.positions[_i17].lng.toFixed(8);\n }\n if (_this16._elms.lat && _this16._elms.lat[_i17]) {\n _this16._elms.lat[_i17].innerHTML = _this16.options.positions[_i17].lat.toFixed(8);\n }\n }\n _this16.positions = newpositions;\n _this16.previous = {\n positions: _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(_this16.positions)\n };\n _this16.positionEditing = false;\n }\n });\n });\n this.entity.polygon.hierarchy = new Cesium.CallbackProperty(function () {\n var position84 = [];\n if (newpositions.length > 0) {\n for (var _i18 = 0; _i18 < newpositions.length; _i18++) {\n position84.push(_this.cartesian3Towgs84(newpositions[_i18], _this.sdk.viewer));\n }\n } else {\n for (var _i19 = 0; _i19 < positions.length; _i19++) {\n position84.push(_this.cartesian3Towgs84(positions[_i19], _this.sdk.viewer));\n }\n }\n _this.renewPositions(position84);\n return new Cesium.PolygonHierarchy(_this.positionsH);\n }, false);\n this.entity.polyline.positions = new Cesium.CallbackProperty(function () {\n return [].concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(_this.positionsH), [_this.positionsH[0], _this.positionsH[1]]);\n }, false);\n } else {\n if (this.label && this.label.entity && this.label.entity.billboard) {\n this.label.entity.billboard.color = Cesium.Color.fromCssColorString(\"rgba(255,255,255,1)\");\n }\n this.picking = true;\n if (this.event) {\n this.event.mouse_move(function () {});\n this.event.mouse_left(function () {});\n this.event.mouse_right(function () {});\n this.event.destroy();\n }\n this.tip && this.tip.destroy();\n if (!this.previous) {\n this.previous = {\n positions: _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(this.positions)\n };\n } else {\n this.positions = _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(this.previous.positions);\n }\n var position84 = [];\n for (var _i20 = 0; _i20 < this.positions.length; _i20++) {\n position84.push(_this.cartesian3Towgs84(this.positions[_i20], _this.sdk.viewer));\n }\n _this.renewPositions(position84);\n this.entity.polygon.hierarchy = new Cesium.CallbackProperty(function () {\n return new Cesium.PolygonHierarchy(_this.positionsH);\n }, true);\n this.entity.polyline.positions = new Cesium.CallbackProperty(function () {\n return [].concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(_this.positionsH), [_this.positionsH[0], _this.positionsH[1]]);\n }, true);\n }\n }\n }, {\n key: \"setPosition\",\n value: function setPosition(v) {\n var _Cesium$Cartesian2;\n var cartesian = Cesium.Cartesian3.fromDegrees(v.position.lng, v.position.lat, v.position.alt);\n var positions = _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(this.positions);\n var array = [];\n var disparity = [];\n for (var i = 0; i < positions.length; i++) {\n var position = this.cartesian3Towgs84(positions[i], this.sdk.viewer);\n array.push([position.lng, position.lat]);\n }\n var firstposition = this.cartesian3Towgs84(positions[0], this.sdk.viewer);\n array.push([firstposition.lng, firstposition.lat]);\n var polygon = turf.polygon([array]);\n var centroid = turf.centroid(polygon);\n var center = (_Cesium$Cartesian2 = Cesium.Cartesian3).fromDegrees.apply(_Cesium$Cartesian2, _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(centroid.geometry.coordinates));\n for (var _i21 = 0; _i21 < positions.length; _i21++) {\n disparity.push({\n x: center.x - positions[_i21].x,\n y: center.y - positions[_i21].y,\n z: center.z - positions[_i21].z\n });\n }\n var newpositions = [];\n for (var _i22 = 0; _i22 < disparity.length; _i22++) {\n newpositions.push({\n x: cartesian.x - disparity[_i22].x,\n y: cartesian.y - disparity[_i22].y,\n z: cartesian.z - disparity[_i22].z\n });\n }\n this.label.position = [v.position.lng, v.position.lat, v.position.alt];\n var positions84 = [];\n if (newpositions.length > 0) {\n for (var _i23 = 0; _i23 < newpositions.length; _i23++) {\n positions84.push(this.cartesian3Towgs84(newpositions[_i23], this.sdk.viewer));\n }\n }\n var arr = this.computeAttackArrow(positions84);\n if (arr.length == 0) {\n return;\n }\n this.entity.polygon.hierarchy = new Cesium.CallbackProperty(function () {\n return new Cesium.PolygonHierarchy(arr);\n }, false);\n this.entity.polyline.positions = new Cesium.CallbackProperty(function () {\n if (arr.length >= 3) {\n return [].concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(arr), [arr[0], arr[1]]);\n } else {\n return _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(arr);\n }\n }, false);\n }\n }, {\n key: \"setDIV\",\n value: function setDIV() {\n var _this17 = this;\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {\n domid: \"\",\n x: 10,\n y: 10\n };\n options.x = options.x || options.x === 0 ? options.x : 10;\n options.y = options.y || options.y === 0 ? options.y : 10;\n var positions = this.computeAttackArrow(this.options.positions);\n if (positions.length == 0) {\n return;\n }\n var points = [[]];\n for (var i = 0; i < positions.length; i++) {\n var _position = this.cartesian3Towgs84(positions[i], this.sdk.viewer);\n points[0].push([_position.lng, _position.lat]);\n }\n var position = this.cartesian3Towgs84(positions[0], this.sdk.viewer);\n points[0].push([position.lng, position.lat]);\n var polygon = turf.polygon(points);\n // let centroid = turf.centroid(polygon);\n var centroid = turf.pointOnFeature(polygon);\n var siteInfoDom = document.getElementById(options.domid);\n var siteInfoPosition = Cesium.Cartesian3.fromDegrees(centroid.geometry.coordinates[0], centroid.geometry.coordinates[1]);\n this.sdk.viewer.scene.postRender.addEventListener(function (percentage) {\n //转换到屏幕坐标\n if (siteInfoDom.style.display === 'block' || siteInfoDom.style.display === '') {\n var winpos = _this17.sdk.viewer.scene.cartesianToCanvasCoordinates(siteInfoPosition);\n if (winpos) {\n siteInfoDom.style.left = (winpos.x + options.x).toFixed(0) + 'px';\n siteInfoDom.style.top = (winpos.y + options.y).toFixed(0) + 'px';\n }\n }\n });\n }\n }, {\n key: \"spreadTime\",\n get: function get() {\n return this.options.spreadTime;\n },\n set: function set(v) {\n var spreadTime = Number(v);\n if (isNaN(spreadTime)) {\n spreadTime = 3000;\n } else if (spreadTime < 500) {\n spreadTime = 500;\n } else if (spreadTime > 9999999) {\n spreadTime = 9999999;\n }\n this.options.spreadTime = spreadTime;\n if (this.spreadState) {\n this.setSpreadProgressByTime();\n }\n this._elms.spreadTime && this._elms.spreadTime.forEach(function (item) {\n item.value = spreadTime;\n });\n }\n }, {\n key: \"loop\",\n get: function get() {\n return this.options.loop;\n },\n set: function set(v) {\n this.options.loop = v;\n if (this.TweenAnimate) {\n if (v) {\n this.TweenAnimate.repeat(Infinity);\n } else {\n this.TweenAnimate.repeat();\n }\n }\n this._elms.loop && this._elms.loop.forEach(function (item) {\n item.checked = v;\n });\n }\n }, {\n key: \"spreadState\",\n get: function get() {\n return this.options.spreadState;\n },\n set: function set(v) {\n this.options.spreadState = v;\n if (this.TweenAnimate) {\n if (v) {\n this.lineEdit = false;\n this.setSpreadProgressByTime(this.TweenAnimate._object.distance / this.TweenAnimate._valuesEnd.distance * this.spreadTime);\n } else {\n this.TweenAnimate.pause();\n }\n } else {\n if (v) {\n this.setSpreadProgressByTime();\n }\n }\n this._elms.spreadState && this._elms.spreadState.forEach(function (item) {\n item.checked = v;\n });\n }\n }, {\n key: \"setSpreadProgressByTime\",\n value: function setSpreadProgressByTime() {\n var _this18 = this;\n var time = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n if (!this.entity) {\n return;\n }\n var that = this;\n for (var i = 0; i < this.nodePoints.length; i++) {\n this.sdk.viewer.entities.remove(this.nodePoints[i]);\n }\n this.nodePoints = [];\n YJ.Measure.SetMeasureStatus(false);\n this.event && this.event.destroy();\n this.tip && this.tip.destroy();\n var AttackArrowArr = that.computeAttackArrow(that.options.positions);\n var arr;\n var lineArr;\n // if (arr.length >= 3) {\n // lineArr = [...arr, arr[0], arr[1]]\n // }\n // else {\n // lineArr = [...arr]\n // }\n if (this.TweenAnimate) {\n TWEEN.remove(this.TweenAnimate);\n this.TweenAnimate = null;\n }\n var _getSdk = Object(_Global_SplitScreen__WEBPACK_IMPORTED_MODULE_20__[\"getSdk\"])(),\n sdkP = _getSdk.sdkP,\n sdkD = _getSdk.sdkD;\n var thatP;\n if (sdkD && sdkP) {\n if (this.sdk === sdkD) {\n thatP = sdkP.entityMap.get(this.options.id);\n if (thatP && thatP.entity && thatP.entity.polygon && thatP.positionsH) {\n this.entity.polygon.hierarchy = new Cesium.CallbackProperty(function () {\n return new Cesium.PolygonHierarchy(thatP.positionsH);\n }, false);\n this.entity.polyline.positions = new Cesium.CallbackProperty(function () {\n return [].concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(thatP.positionsH), [thatP.positionsH[0], thatP.positionsH[1]]);\n }, false);\n }\n return;\n }\n }\n\n // this.entity.polygon.hierarchy = arr\n // this.entity.polyline.positions = lineArr\n\n var linePos84 = [[(that.options.positions[0].lng + that.options.positions[1].lng) / 2, (that.options.positions[0].lat + that.options.positions[1].lat) / 2]];\n for (var _i24 = 2; _i24 < that.options.positions.length; _i24++) {\n linePos84.push([that.options.positions[_i24].lng, that.options.positions[_i24].lat]);\n }\n var line = turf.lineString(linePos84);\n var distanceArray = [];\n for (var _i25 = 1; _i25 < linePos84.length; _i25++) {\n var from = turf.point(linePos84[_i25]);\n var to = turf.point(linePos84[_i25 - 1]);\n var d = turf.distance(from, to, {\n units: 'kilometers'\n });\n var od = distanceArray[distanceArray.length - 1] || 0;\n distanceArray.push(od + d);\n }\n var distance = turf.length(line, {\n units: 'kilometers'\n });\n var timeRatio = time / this.spreadTime;\n var m = 0;\n this.TweenAnimate = new TWEEN.Tween({\n distance: distance * timeRatio\n }).to({\n distance: distance\n }, this.spreadTime - time).easing(TWEEN.Easing.Linear.None).repeat(this.options.loop ? Infinity : 0).onRepeat(function () {\n if (time) {\n _this18.setSpreadProgressByTime();\n } else {}\n }).onUpdate(/*#__PURE__*/function () {\n var _ref = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee6(r, a) {\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee6$(_context10) {\n while (1) switch (_context10.prev = _context10.next) {\n case 0:\n if (!(_this18.TweenAnimate._duration == Infinity)) {\n _context10.next = 2;\n break;\n }\n return _context10.abrupt(\"return\");\n case 2:\n m++;\n if (_this18.sdk.viewer) {\n _context10.next = 6;\n break;\n }\n _this18.removeAnimate();\n return _context10.abrupt(\"return\");\n case 6:\n setSpread(r);\n case 7:\n case \"end\":\n return _context10.stop();\n }\n }, _callee6);\n }));\n return function (_x4, _x5) {\n return _ref.apply(this, arguments);\n };\n }()).onStart(function () {\n _this18.options.spreadState = true;\n _this18._elms.spreadState && _this18._elms.spreadState.forEach(function (item) {\n item.checked = true;\n });\n }).onComplete(function (d) {\n _this18.removeAnimate();\n });\n if (this.spreadState) {\n this.TweenAnimate.start();\n } else {\n setSpread({\n distance: distance * timeRatio\n });\n }\n function setSpread(_x6) {\n return _setSpread.apply(this, arguments);\n }\n function _setSpread() {\n _setSpread = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee7(v) {\n var index, _i26, positions, _i27, sliced, coordinates;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee7$(_context11) {\n while (1) switch (_context11.prev = _context11.next) {\n case 0:\n if (that.show) {\n _context11.next = 2;\n break;\n }\n return _context11.abrupt(\"return\");\n case 2:\n index = 2;\n _i26 = distanceArray.length - 2;\n case 4:\n if (!(_i26 >= 0)) {\n _context11.next = 12;\n break;\n }\n if (!(v.distance >= distanceArray[_i26])) {\n _context11.next = 9;\n break;\n }\n index = index + _i26 + 1;\n if (index > that.options.positions.length - 1) {\n index = that.options.positions.length - 1;\n }\n return _context11.abrupt(\"break\", 12);\n case 9:\n _i26--;\n _context11.next = 4;\n break;\n case 12:\n positions = [];\n for (_i27 = 0; _i27 < index; _i27++) {\n positions[_i27] = _objectSpread({}, that.options.positions[_i27]);\n }\n if (v.distance) {\n _context11.next = 18;\n break;\n }\n positions[index] = {\n lng: positions[1].lng,\n lat: positions[1].lat\n };\n _context11.next = 25;\n break;\n case 18:\n _context11.next = 20;\n return turf.lineSliceAlong(line, 0, v.distance, {\n units: 'kilometers'\n });\n case 20:\n sliced = _context11.sent;\n coordinates = _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(sliced.geometry.coordinates[sliced.geometry.coordinates.length - 1]);\n if (!positions[index]) {\n positions[index] = {};\n }\n positions[index].lng = coordinates[0];\n positions[index].lat = coordinates[1];\n case 25:\n // console.log('positions', positions)\n that.renewPositions(positions);\n case 26:\n case \"end\":\n return _context11.stop();\n }\n }, _callee7);\n }));\n return _setSpread.apply(this, arguments);\n }\n this.entity.polygon.hierarchy = new Cesium.CallbackProperty(function () {\n return new Cesium.PolygonHierarchy(that.positionsH);\n }, false);\n this.entity.polyline.positions = new Cesium.CallbackProperty(function () {\n return [].concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(that.positionsH), [that.positionsH[0], that.positionsH[1]]);\n }, false);\n }\n\n // 移除动画\n }, {\n key: \"removeAnimate\",\n value: function removeAnimate() {\n this.spreadState = false;\n if (this.TweenAnimate) {\n TWEEN.remove(this.TweenAnimate);\n this.TweenAnimate = null;\n this.renewPositions();\n this.entity.polygon.hierarchy = new Cesium.PolygonHierarchy(this.positionsH);\n this.entity.polyline.positions = [].concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(this.positionsH), [this.positionsH[0], this.positionsH[1]]);\n }\n }\n\n // 更新坐标\n }, {\n key: \"renewPositions\",\n value: function renewPositions(position84) {\n var _this19 = this;\n if (this._error || !this.sdk.viewer) {\n return;\n }\n var ground = false;\n var array = [];\n var positions = this.options.positions;\n if (position84) {\n positions = position84;\n }\n var fromDegreesArray = [];\n for (var i = 0; i < positions.length; i++) {\n fromDegreesArray.push(positions[i].lng, positions[i].lat);\n }\n this.positions = Cesium.Cartesian3.fromDegreesArray(fromDegreesArray);\n var positionsA = this.computeAttackArrow(positions);\n if (positionsA.length == 0) {\n return;\n }\n var points = [[]];\n var pos84 = [];\n for (var _i28 = 0; _i28 < positionsA.length; _i28++) {\n var _position2 = this.cartesian3Towgs84(positionsA[_i28], this.sdk.viewer);\n pos84.push(_position2);\n points[0].push([_position2.lng, _position2.lat]);\n }\n var position = this.cartesian3Towgs84(positionsA[0], this.sdk.viewer);\n points[0].push([position.lng, position.lat]);\n var height = 0;\n var polygon = turf.polygon(points);\n var centroid = turf.pointOnFeature(polygon);\n switch (this.options.heightMode) {\n case '0':\n case 0:\n ground = false;\n break;\n case '1':\n case 1:\n height = this.sdk.viewer.scene.globe.getHeight(Cesium.Cartographic.fromDegrees(centroid.geometry.coordinates[0], centroid.geometry.coordinates[1])) || 0;\n ground = false;\n break;\n case '2':\n case 2:\n ground = true;\n break;\n }\n var fromDegreesArray2 = [];\n if (!ground && this.nodePoints.length == 0) {\n for (var _i29 = 0; _i29 < points[0].length; _i29++) {\n fromDegreesArray2.push(points[0][_i29][0], points[0][_i29][1], this.height + height);\n }\n this.positionsH = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray2);\n this.label && (this.label.position = [centroid.geometry.coordinates[0], centroid.geometry.coordinates[1], this.height + height]);\n } else {\n this.positionsH = positionsA;\n setTimeout(function () {\n if (!_this19.sdk.viewer) {\n return;\n }\n var objectsToExclude = _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(_this19.sdk.viewer.entities.values);\n _this19.getClampToHeight({\n lng: centroid.geometry.coordinates[0],\n lat: centroid.geometry.coordinates[1]\n }, objectsToExclude).then(function (height) {\n _this19.label && (_this19.label.position = [centroid.geometry.coordinates[0], centroid.geometry.coordinates[1], height]);\n });\n }, 100);\n }\n\n // 计算投影面积\n if (!this.spreadState) {\n this.options.areaByMeter = this.computeArea(pos84);\n this.areaUnit = this.areaUnit;\n }\n return fromDegreesArray;\n }\n }], [{\n key: \"create\",\n value: function create(that) {\n var positions = that.options.positions;\n var fromDegreesArray = [];\n for (var i = 0; i < positions.length; i++) {\n fromDegreesArray.push(positions[i].lng, positions[i].lat);\n }\n that.positions = Cesium.Cartesian3.fromDegreesArray(fromDegreesArray);\n var positionsA = that.computeAttackArrow(that.options.positions);\n if (positionsA.length == 0) {\n return;\n }\n var points = [[]];\n for (var _i30 = 0; _i30 < positionsA.length; _i30++) {\n var _position3 = that.cartesian3Towgs84(positionsA[_i30], that.sdk.viewer);\n points[0].push([_position3.lng, _position3.lat]);\n }\n var position = that.cartesian3Towgs84(positionsA[0], that.sdk.viewer);\n points[0].push([position.lng, position.lat]);\n var polygon = turf.polygon(points);\n // let centroid = turf.centroid(polygon);\n var centroid = turf.pointOnFeature(polygon);\n var ground;\n var height = 0;\n switch (that.options.heightMode) {\n case '0':\n case 0:\n ground = false;\n break;\n case '1':\n case 1:\n height = that.sdk.viewer.scene.globe.getHeight(Cesium.Cartographic.fromDegrees(centroid.geometry.coordinates[0], centroid.geometry.coordinates[1])) || 0;\n ground = false;\n break;\n case '2':\n case 2:\n ground = true;\n break;\n }\n if (!that.options.label.position) {\n that.options.label.position = {\n lng: centroid.geometry.coordinates[0],\n lat: centroid.geometry.coordinates[1],\n alt: that.height + height\n };\n }\n that.options.label.ground = ground;\n var fromDegreesArray2 = [];\n for (var _i31 = 0; _i31 < points[0].length; _i31++) {\n fromDegreesArray2.push(points[0][_i31][0], points[0][_i31][1], that.height + height);\n }\n var material = Cesium.Color.fromCssColorString(that.options.color);\n if (that.sdk.viewer.scene.mode === 2) {\n ground = false;\n material = new Cesium.CustomColorMaterialSource({\n color: that.options.color\n });\n }\n that.positionsH = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray2);\n that.entity = that.sdk.viewer.entities.add({\n show: that.options.show,\n id: that.options.id,\n polygon: {\n hierarchy: !ground ? new Cesium.PolygonHierarchy(that.positionsH) : new Cesium.PolygonHierarchy(positionsA),\n perPositionHeight: !ground ? true : false,\n material: material,\n zIndex: that.sdk._entityZIndex\n },\n polyline: {\n positions: [].concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(that.positionsH), [that.positionsH[0], that.positionsH[1]]),\n width: that.options.line.width,\n material: Cesium.Color.fromCssColorString(that.options.line.color),\n clampToGround: !ground ? false : true,\n arcType: !ground ? Cesium.ArcType.NONE : Cesium.ArcType.GEODESIC,\n zIndex: that.sdk._entityZIndex\n }\n });\n that.sdk._entityZIndex++;\n AttackArrowObject.createLabel(that);\n var pos84 = [];\n for (var _i32 = 0; _i32 < positionsA.length; _i32++) {\n pos84.push(that.cartesian3Towgs84(positionsA[_i32], that.sdk.viewer));\n }\n that.options.areaByMeter = that.computeArea(pos84);\n switch (that.options['area-unit']) {\n case '平方米':\n that.options.area = that.options.areaByMeter;\n break;\n case '平方千米':\n that.options.area = Number((that.options.areaByMeter / 1000000).toFixed(8));\n break;\n case '亩':\n that.options.area = Number((that.options.areaByMeter / 666.6666667).toFixed(4));\n break;\n case '公顷':\n that.options.area = Number((that.options.areaByMeter / 10000).toFixed(6));\n break;\n default:\n that.options.area = that.options.areaByMeter;\n }\n Object(_Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_17__[\"syncData\"])(that.sdk, that.options.id);\n if (that.options.show) {\n Object(_Global_SplitScreen__WEBPACK_IMPORTED_MODULE_20__[\"setSplitDirection\"])(0, that.options.id);\n }\n that.spreadState = that.options.spreadState;\n }\n }, {\n key: \"createLabel\",\n value: function () {\n var _createLabel = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee8(that) {\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee8$(_context12) {\n while (1) switch (_context12.prev = _context12.next) {\n case 0:\n // 标签\n that.label = new _LabelObject__WEBPACK_IMPORTED_MODULE_14__[\"default\"](that.sdk, {\n id: that.options.id,\n show: that.options.show ? that.options.label.show : false,\n position: [that.options.label.position.lng, that.options.label.position.lat, that.options.label.position.alt],\n text: that.options.name,\n fontSize: that.options.label.fontSize,\n fontFamily: that.options.label.fontFamily,\n color: that.options.label.color,\n pixelOffset: that.options.label.pixelOffset,\n backgroundColor: that.options.label.backgroundColor,\n lineColor: that.options.label.lineColor,\n lineWidth: that.options.label.lineWidth,\n scaleByDistance: that.options.label.scaleByDistance,\n near: that.options.label.near,\n far: that.options.label.far,\n ground: that.options.label.ground\n });\n case 1:\n case \"end\":\n return _context12.stop();\n }\n }, _callee8);\n }));\n function createLabel(_x7) {\n return _createLabel.apply(this, arguments);\n }\n return createLabel;\n }()\n }, {\n key: \"EventBinding\",\n value: function EventBinding(that, elements) {\n var _loop10 = function _loop10() {\n var Event = [];\n var isEvent = false;\n var removeName = [];\n if (!elements[i] || !elements[i].attributes) {\n return 1; // continue\n }\n var _iterator5 = _createForOfIteratorHelper(elements[i].attributes),\n _step5;\n try {\n var _loop11 = function _loop11() {\n var m = _step5.value;\n switch (m.name) {\n case '@model':\n {\n isEvent = true;\n if (elements[i].type == 'checkbox') {\n Event.push(function (e) {\n that[m.value] = e.target.checked;\n });\n elements[i].checked = that[m.value];\n } else {\n Event.push(function (e) {\n var value = e.target.value;\n if (e.target.type == 'number') {\n if (e.data != '.' && (e.data != '-' || e.target.value)) {\n value = Number(value);\n if (e.target.max && value > Number(e.target.max)) {\n value = Number(e.target.max);\n }\n if (e.target.min && value < Number(e.target.min)) {\n value = Number(e.target.min);\n }\n that[m.value] = value;\n }\n } else {\n that[m.value] = value;\n }\n });\n if (elements[i].nodeName == 'IMG') {\n elements[i].src = that[m.value];\n } else {\n elements[i].value = that[m.value];\n }\n }\n if (that._elms[m.value]) {\n that._elms[m.value].push(elements[i]);\n } else {\n that._elms[m.value] = [elements[i]];\n }\n removeName.push(m.name);\n break;\n }\n case '@click':\n {\n elements[i].addEventListener('click', function (e) {\n if (typeof that[m.value] === 'function') {\n that[m.value](e);\n }\n });\n removeName.push(m.name);\n // elements[i].attributes.removeNamedItem(m.name)\n break;\n }\n case '@change':\n {\n isEvent = true;\n Event.push(function (e) {\n var value = e.target.value;\n if (e.target.type == 'number' && value != '') {\n value = Number(value);\n e.target.value = value;\n }\n if (typeof that[m.value] === 'function') {\n that[m.value](e, value);\n }\n });\n break;\n }\n }\n // elements[i].attributes[m] = undefined\n };\n for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {\n _loop11();\n }\n } catch (err) {\n _iterator5.e(err);\n } finally {\n _iterator5.f();\n }\n for (var n = 0; n < removeName.length; n++) {\n elements[i].attributes.removeNamedItem(removeName[n]);\n }\n if (isEvent) {\n var ventType = 'input';\n if (elements[i].tagName != 'INPUT' || elements[i].type == 'checkbox') {\n ventType = 'change';\n }\n if (elements[i].className.indexOf('blur') !== -1) {\n ventType = 'blur';\n }\n elements[i].addEventListener(ventType, function (e) {\n for (var t = 0; t < Event.length; t++) {\n Event[t](e);\n }\n });\n }\n };\n for (var i = 0; i < elements.length; i++) {\n if (_loop10()) continue;\n }\n }\n }, {\n key: \"nodeEdit\",\n value: function nodeEdit(that) {\n var cb = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};\n that.positionEditing = false;\n setTimeout(function () {\n if (YJ.Measure.GetMeasureStatus()) {\n cb('上一次测量未结束');\n } else {\n var createNodePoints = /*#__PURE__*/function () {\n var _ref2 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee9() {\n var objectsToExclude, _i33, height, entity;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee9$(_context13) {\n while (1) switch (_context13.prev = _context13.next) {\n case 0:\n objectsToExclude = _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(that.sdk.viewer.entities.values);\n _i33 = 0;\n case 2:\n if (!(_i33 < that.options.positions.length)) {\n _context13.next = 11;\n break;\n }\n _context13.next = 5;\n return that.getClampToHeight(that.options.positions[_i33], objectsToExclude);\n case 5:\n height = _context13.sent;\n entity = that.sdk.viewer.entities.add({\n name: 'node-secondary-edit-point',\n index: _i33,\n position: Cesium.Cartesian3.fromDegrees(that.options.positions[_i33].lng, that.options.positions[_i33].lat, height),\n billboard: {\n image: that.getSourceRootPath() + '/img/point.png',\n width: 15,\n height: 15,\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\n color: Cesium.Color.WHITE.withAlpha(0.99)\n }\n });\n that.nodePoints.push(entity);\n case 8:\n _i33++;\n _context13.next = 2;\n break;\n case 11:\n case \"end\":\n return _context13.stop();\n }\n }, _callee9);\n }));\n return function createNodePoints() {\n return _ref2.apply(this, arguments);\n };\n }(); // for (let i = 0; i < that.options.positions.length; i++) {\n // let entity = that.sdk.viewer.entities.add({\n // name: 'node-secondary-edit-point',\n // index: i,\n // position: Cesium.Cartesian3.fromDegrees(that.options.positions[i].lng, that.options.positions[i].lat),\n // billboard: {\n // image: that.getSourceRootPath() + '/img/point.png',\n // width: 15,\n // height: 15,\n // disableDepthTestDistance: Number.POSITIVE_INFINITY,\n // },\n // })\n // nodePoints.push(entity)\n // }\n that.removeAnimate();\n YJ.Measure.SetMeasureStatus(true);\n that.event && that.event.destroy();\n that.tip && that.tip.destroy();\n that.tip = new _MouseTip__WEBPACK_IMPORTED_MODULE_16__[\"default\"]('请选择一个顶点,右键取消', that.sdk);\n that.event = new _Event_index__WEBPACK_IMPORTED_MODULE_15__[\"default\"](that.sdk);\n that.nodePoints = [];\n var selectPoint;\n var originalPosition;\n var moveEvent = function moveEvent(movement, cartesian) {\n if (selectPoint) {\n that.options.positions[selectPoint.index] = that.cartesian3Towgs84(cartesian, that.sdk.viewer);\n that.renewPositions();\n }\n that.tip.setPosition(cartesian, movement.position ? movement.position.x : movement.endPosition.x, movement.position ? movement.position.y : movement.endPosition.y);\n };\n var leftEvent = function leftEvent(movement, cartesian) {\n moveEvent(movement, cartesian);\n if (selectPoint) {\n that.options.positions[selectPoint.index] = that.cartesian3Towgs84(cartesian, that.sdk.viewer);\n var index = selectPoint.index;\n if (selectPoint.index === that.options.positions.length - 1) {\n index = index + 1;\n }\n var entity = that.sdk.viewer.entities.add({\n name: 'node-secondary-edit-point',\n index: index,\n position: Cesium.Cartesian3.fromDegrees(that.options.positions[selectPoint.index].lng, that.options.positions[selectPoint.index].lat, that.options.positions[selectPoint.index].alt),\n billboard: {\n image: that.getSourceRootPath() + '/img/point.png',\n width: 15,\n height: 15,\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\n color: Cesium.Color.WHITE.withAlpha(0.99)\n }\n });\n selectPoint = entity;\n originalPosition = that.options.positions[selectPoint.index];\n that.nodePoints.splice(selectPoint.index, 0, entity);\n if (index < that.options.positions.length) {\n selectPoint = null;\n that.tip.set_text('请选择一个顶点,右键取消');\n } else {\n that.options.positions.splice(selectPoint.index, 0, that.options.positions[selectPoint.index]);\n that.options.positions[selectPoint.index] = that.cartesian3Towgs84(cartesian, that.sdk.viewer);\n }\n that.renewPositions();\n } else {\n var pick = that.sdk.viewer.scene.pick(movement.position || movement.endPosition);\n if (pick && pick.id && pick.id.name && pick.id.name === 'node-secondary-edit-point') {\n selectPoint = pick.id;\n originalPosition = that.cartesian3Towgs84(pick.id.position.getValue(), that.sdk.viewer);\n that.nodePoints.splice(pick.id.index, 1);\n that.sdk.viewer.entities.remove(pick.id);\n that.tip.set_text('左键确认,右键结束,CTRL+右键撤销');\n }\n }\n };\n var rightEvent = function rightEvent(movement, cartesian) {\n that.event.mouse_move(function () {});\n that.event.mouse_left(function () {});\n that.event.mouse_right(function () {});\n that.event.gesture_pinck_start(function () {});\n if (selectPoint) {\n if (!originalPosition) {\n that.options.positions.pop();\n } else {\n that.options.positions[selectPoint.index] = originalPosition;\n if (that.options.positions.length > 3 && selectPoint.index === that.options.positions.length - 1) {\n that.options.positions.splice(selectPoint.index + 1, 1);\n }\n }\n if (that._elms.lng && that._elms.lng[selectPoint.index]) {\n that._elms.lng[selectPoint.index].innerHTML = that.options.positions[selectPoint.index].lng.toFixed(8);\n }\n if (that._elms.lat && that._elms.lat[selectPoint.index]) {\n that._elms.lat[selectPoint.index].innerHTML = that.options.positions[selectPoint.index].lat.toFixed(8);\n }\n }\n that.heightMode = that.heightMode;\n that.previous = null;\n };\n that.entity.polyline.clampToGround = true;\n that.entity.polyline.arcType = Cesium.ArcType.GEODESIC;\n that.entity.polygon.perPositionHeight = false;\n that.entity.polygon.hierarchy = new Cesium.CallbackProperty(function () {\n return new Cesium.PolygonHierarchy(that.positionsH);\n }, false);\n that.entity.polyline.positions = new Cesium.CallbackProperty(function () {\n return [].concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(that.positionsH), [that.positionsH[0], that.positionsH[1]]);\n }, false);\n var points = [[]];\n var pos84 = [];\n for (var i = 0; i < that.positionsH.length; i++) {\n var _position4 = that.cartesian3Towgs84(that.positionsH[i], that.sdk.viewer);\n pos84.push(_position4);\n points[0].push([_position4.lng, _position4.lat]);\n }\n var position = that.cartesian3Towgs84(that.positionsH[0], that.sdk.viewer);\n points[0].push([position.lng, position.lat]);\n var polygon = turf.polygon(points);\n var centroid = turf.pointOnFeature(polygon);\n var objectsToExclude = _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(that.sdk.viewer.entities.values);\n that.getClampToHeight({\n lng: centroid.geometry.coordinates[0],\n lat: centroid.geometry.coordinates[1]\n }, objectsToExclude).then(function (height) {\n that.label.position = [centroid.geometry.coordinates[0], centroid.geometry.coordinates[1], height];\n });\n setTimeout(function () {\n that.event.mouse_left(leftEvent);\n that.event.mouse_right(rightEvent);\n that.event.mouse_move(moveEvent);\n that.event.mouse_right_keyboard_ctrl(function (movement, cartesian) {\n if (selectPoint) {\n that.options.positions.pop();\n that.sdk.viewer.entities.remove(that.nodePoints[that.nodePoints.length - 1]);\n that.nodePoints.pop();\n if (!selectPoint.index) {\n // selectPoint = null\n } else if (selectPoint.index === that.options.positions.length) {\n if (that.nodePoints[selectPoint.index - 1]) {\n selectPoint = that.nodePoints[selectPoint.index - 1];\n } else {\n selectPoint.index = selectPoint.index - 1;\n }\n }\n that.renewPositions();\n }\n });\n that.event.gesture_pinck_start(function (movement, cartesian) {\n var startTime = new Date();\n that.event.gesture_pinck_end(function () {\n var endTime = new Date();\n var pos = {\n position: {\n x: (movement.position1.x + movement.position2.x) / 2,\n y: (movement.position1.y + movement.position2.y) / 2\n }\n };\n if (endTime - startTime >= 500) {\n // 长按取消\n rightEvent(pos, cartesian);\n } else {\n leftEvent(pos, cartesian);\n }\n });\n });\n createNodePoints();\n }, 200);\n }\n }, 0);\n }\n }, {\n key: \"closeNodeEdit\",\n value: function closeNodeEdit(that) {\n YJ.Measure.SetMeasureStatus(false);\n that.event && that.event.destroy();\n that.tip && that.tip.destroy();\n that.tip = null;\n for (var i = 0; i < that.nodePoints.length; i++) {\n that.sdk.viewer.entities.remove(that.nodePoints[i]);\n }\n that.nodePoints = [];\n that.picking = true;\n }\n }]);\n}(_index__WEBPACK_IMPORTED_MODULE_13__[\"default\"]);\n/* harmony default export */ __webpack_exports__[\"default\"] = (AttackArrowObject);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvT2JqL0Jhc2UvQXR0YWNrQXJyb3dPYmplY3QvaW5kZXguanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvT2JqL0Jhc2UvQXR0YWNrQXJyb3dPYmplY3QvaW5kZXguanM/N2EyMSJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICog566t5aS0XHJcbiAqL1xyXG5pbXBvcnQgRGlhbG9nIGZyb20gJy4uLy4uL0VsZW1lbnQvRGlhbG9nJztcclxuaW1wb3J0IGN5X3RhYnMgZnJvbSBcIi4uLy4uL0VsZW1lbnQvY3lfaHRtbF90YWJzXCI7XHJcbmltcG9ydCByaWNoVGV4dCBmcm9tIFwiLi4vLi4vRWxlbWVudC9yaWNoVGV4dFwiO1xyXG5pbXBvcnQgeyBodG1sLCBjc3MgfSBmcm9tIFwiLi9fZWxlbWVudFwiO1xyXG5pbXBvcnQgQmFzZSBmcm9tIFwiLi4vaW5kZXhcIjtcclxuaW1wb3J0IExhYmVsT2JqZWN0IGZyb20gJy4uL0xhYmVsT2JqZWN0J1xyXG5pbXBvcnQgTW91c2VFdmVudCBmcm9tICcuLi8uLi8uLi9FdmVudC9pbmRleCdcclxuaW1wb3J0IE1vdXNlVGlwIGZyb20gJy4uLy4uLy4uL01vdXNlVGlwJ1xyXG5pbXBvcnQgeyBzeW5jRGF0YSB9IGZyb20gJy4uLy4uLy4uL0dsb2JhbC9NdWx0aVZpZXdwb3J0TW9kZSdcclxuaW1wb3J0IHsgbGVncCB9IGZyb20gJy4uLy4uL0VsZW1lbnQvZGF0YWxpc3QnO1xyXG5pbXBvcnQgeyBnZXRGb250TGlzdCwgZ2V0Rm9udEZhbWlseU5hbWUgfSBmcm9tICcuLi8uLi9FbGVtZW50L2ZvbnRTZWxlY3QnXHJcbmltcG9ydCB7IHNldFNwbGl0RGlyZWN0aW9uLCBzeW5jU3BsaXREYXRhLCBnZXRTZGsgfSBmcm9tICcuLi8uLi8uLi9HbG9iYWwvU3BsaXRTY3JlZW4nXHJcbmltcG9ydCB7IHNldEFjdGl2ZVZpZXdlciwgY2xvc2VSb3RhdGVBcm91bmQsIGNsb3NlVmlld0ZvbGxvdyB9IGZyb20gJy4uLy4uLy4uL0dsb2JhbC9nbG9iYWwnXHJcbi8vIGltcG9ydCBFZGl0UGFydGljbGUgZnJvbSBcIi4uLy4uL01vZGVsQ29udHJvbGxlci9FZGl0UGFydGljbGVcIjtcclxuXHJcbmNsYXNzIEF0dGFja0Fycm93T2JqZWN0IGV4dGVuZHMgQmFzZSB7XHJcbiAgLyoqXHJcbiAgICogQGNvbnN0cnVjdG9yXHJcbiAgICogQHBhcmFtIHNka1xyXG4gICAqIEBkZXNjcmlwdGlvbiDnrq3lpLTpnaJcclxuICAgKiBAcGFyYW0gb3B0aW9ucyB7b2JqZWN0fSDlsZ7mgKdcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5pZCB7c3RyaW5nfSDllK/kuIDmoIfor4ZcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5zaG93PXRydWUge2Jvb2xlYW59IOaYvuekui/pmpDol49cclxuICAgKiBAcGFyYW0gb3B0aW9ucy5uYW1lIHtzdHJpbmd9IOWQjeensFxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmNvbG9yPSdyZ2JhKDI1NSwgMCwgMCwgMC41KScge3N0cmluZ30g6aKc6ImyXHJcbiAgICogQHBhcmFtIG9wdGlvbnMuaGVpZ2h0IHtudW1iZXJ9IOmrmOW6plxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmhlaWdodE1vZGU9MntudW1iZXJ9IOmrmOW6puaooeW8j++8iDDvvJrmtbfmi5Tpq5jluqbvvJsx77ya55u45a+55Zyw6KGo77ybMu+8muS+nemZhOaooeW8j++8iVxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmFyZWFVbml0PSflubPmlrnnsbMnIHtzdHJpbmd9IOmdouenr+WNleS9jVxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxpbmUge29iamVjdH0g6L655qGGXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGluZS53aWR0aD0yIHtzdHJpbmd9IOi+ueahhuWuvVxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxpbmUuY29sb3I9XCJyZ2JhKDE1NSwgMTU1LCAxMjQsIDAuODkpXCIge3N0cmluZ30g6L655qGG6aKc6ImyXHJcbiAgICogQHBhcmFtIHtBcnJheS48b2JqZWN0Pn0gb3B0aW9ucy5wb3NpdGlvbnMg5b+F5aGr77yM57uP57qs5bqm5ZKM6auY5bqm55qE5YiX6KGo77yM5YC85Lqk5pu/IFt7bG9uLGxhdCxhbHR9LC4uLl1cclxuICAgKiBAcGFyYW0gb3B0aW9ucy5wb3NpdGlvbnNbXS5sbmcge251bWJlcn0g57uP5bqmXHJcbiAgICogQHBhcmFtIG9wdGlvbnMucG9zaXRpb25zW10ubGF0IHtudW1iZXJ9IOe6rOW6plxyXG4gICAqIEBwYXJhbSBvcHRpb25zLnBvc2l0aW9uc1tdLmFsdCB7bnVtYmVyfSDpq5jluqZcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5zcHJlYWRTdGF0ZT1mYWxzZSB7Ym9vbGVhbn0g5Yqo55S7XHJcbiAgICogQHBhcmFtIG9wdGlvbnMubG9vcD1mYWxzZSB7bG9vcH0g5Yqo55S76YeN5aSNXHJcbiAgICogQHBhcmFtIG9wdGlvbnMuc3ByZWFkVGltZT0zMDAwIHtudW1iZXJ9IOWKqOeUu+aMgee7reaXtumVvyjmr6vnp5IpXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwge29iamVjdH0g5qCH562+5a+56LGhXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwudGV4dCB7c3RyaW5nfSDmoIfnrb7mlofmnKxcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5sYWJlbC5zaG93IHtzdHJpbmd9IOagh+etvuaYvumakFxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLnBvc2l0aW9uIHtzdHJpbmd9IOagh+etvuS9jee9rlxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLnBvc2l0aW9uIHtvYmplY3R9IOagh+etvuS9jee9rlxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLnBvc2l0aW9uLmxuZyB7bnVtYmVyfSDnu4/luqZcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5sYWJlbC5wb3NpdGlvbi5sYXQge251bWJlcn0g57qs5bqmXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwucG9zaXRpb24uYWx0IHtudW1iZXJ9IOmrmOW6plxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLmZvbnRTaXplPTIwIHtudW1iZXJ9IOWtl+S9k+Wkp+Wwj1xyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLmZvbnRGYW1pbHk9MCB7bnVtYmVyfSDlrZfkvZPpobkgMO+8mum7keS9k++8mzHvvJrmgJ3mupDpu5HkvZPvvJsy77ya5bqe6Zeo5q2j6YGT5qCH6aKY5L2T77ybM++8muaVsOm7keS9k1xyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLmNvbG9yPSNmZmZmZmYge3N0cmluZ30g5a2X5L2T6aKc6ImyXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwubGluZVdpZHRoPTQge251bWJlcn0g5byV57q/5a69XHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwubGluZUNvbG9yPSMwMGZmZmY4MCB7c3RyaW5nfSDlvJXnur/popzoibJcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5sYWJlbC5waXhlbE9mZnNldD0yMCB7bnVtYmVyfSDlrZfkvZPlgY/np7so5byV57q/6ZW/5bqmKVxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLmJhY2tncm91bmRDb2xvcj1bJyMwMGZmZmY4MCcsICcjMDBmZmZmODAnXSB7YXJyYXl9IOiDjOaZr+minOiJslxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLnNjYWxlQnlEaXN0YW5jZSB7Ym9vbGVhbn0g6Led56a757yp5pS+XHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwubmVhcj0yMDAwIHtudW1iZXJ9IOinhumHjue8qeaUvuacgOi/kei3neemu1xyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLmZhcj0xMDAwMDAge251bWJlcn0g6KeG6YeO57yp5pS+5pyA6L+c6Led56a7XHJcbiAgICogQHBhcmFtIG9wdGlvbnMuYXR0cmlidXRlIHtvYmplY3R9IOWxnuaAp+WGheWuuVxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmF0dHJpYnV0ZS5saW5rPXt9IHtvYmplY3R9IOmTvuaOpVxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnQ9W11dIHthcnJheX0g6ZO+5o6l5YaF5a65XHJcbiAgICogQHBhcmFtIG9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudFtdLm5hbWUge3N0cmluZ30g6ZO+5o6l5ZCN56ewXHJcbiAgICogQHBhcmFtIG9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudFtdLnVybCB7c3RyaW5nfSDpk77mjqXlnLDlnYBcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5yaWNoVGV4dENvbnRlbnQge3N0cmluZ30g5a+M5paH5pys5YaF5a65XHJcbiAgICogQHBhcmFtIG9wdGlvbnMuY3VzdG9tVmlldyB7b2JqZWN0fSDpu5jorqTop4bop5JcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5jdXN0b21WaWV3Lm9yaWVudGF0aW9uIHtvYmplY3R9IOm7mOiupOinhuinkuaWueS9jVxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmN1c3RvbVZpZXcub3JpZW50YXRpb24uaGVhZGluZyB7bnVtYmVyfSDoiKrlkJHop5JcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5jdXN0b21WaWV3Lm9yaWVudGF0aW9uLnBpdGNoIHtudW1iZXJ9IOS/r+S7sOinklxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmN1c3RvbVZpZXcub3JpZW50YXRpb24ucm9sbCB7bnVtYmVyfSDnv7vmu5rop5JcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5jdXN0b21WaWV3LnJlbGF0aXZlUG9zaXRpb24ge29iamVjdH0g6KeG6KeS55u45a+55L2N572uXHJcbiAgICogQHBhcmFtIG9wdGlvbnMuY3VzdG9tVmlldy5yZWxhdGl2ZVBvc2l0aW9uLmxuZyB7bnVtYmVyfSDnu4/luqZcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5jdXN0b21WaWV3LnJlbGF0aXZlUG9zaXRpb24ubGF0IHtudW1iZXJ9IOe6rOW6plxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmN1c3RvbVZpZXcucmVsYXRpdmVQb3NpdGlvbi5hbHQge251bWJlcn0g6auY5bqmXHJcbiAgICogKi9cclxuICBjb25zdHJ1Y3RvcihzZGssIG9wdGlvbnMgPSB7fSwgX0RpYWxvZyA9IHt9KSB7XHJcbiAgICBzdXBlcihzZGssIG9wdGlvbnMpO1xyXG4gICAgdGhpcy5vcHRpb25zLm5hbWUgPSBvcHRpb25zLm5hbWUgfHwgJ+acquWRveWQjeWvueixoSdcclxuICAgIHRoaXMub3B0aW9ucy5jb2xvciA9IG9wdGlvbnMuY29sb3IgfHwgXCIjZmYwMDAwODBcIlxyXG4gICAgdGhpcy5vcHRpb25zLnNob3cgPSAob3B0aW9ucy5zaG93IHx8IG9wdGlvbnMuc2hvdyA9PT0gZmFsc2UpID8gb3B0aW9ucy5zaG93IDogdHJ1ZVxyXG4gICAgdGhpcy5vcHRpb25zLnBvc2l0aW9ucyA9IG9wdGlvbnMucG9zaXRpb25zIHx8IFtdXHJcbiAgICB0aGlzLm9wdGlvbnMuaGVpZ2h0TW9kZSA9IChvcHRpb25zLmhlaWdodE1vZGUgfHwgb3B0aW9ucy5oZWlnaHRNb2RlID09IDApID8gb3B0aW9ucy5oZWlnaHRNb2RlIDogMlxyXG4gICAgdGhpcy5vcHRpb25zLmxpbmUgPSBvcHRpb25zLmxpbmUgfHwge31cclxuICAgIHRoaXMub3B0aW9ucy5saW5lLndpZHRoID0gKCh0aGlzLm9wdGlvbnMubGluZS53aWR0aCB8fCB0aGlzLm9wdGlvbnMubGluZS53aWR0aCA9PT0gMCkgPyB0aGlzLm9wdGlvbnMubGluZS53aWR0aCA6IDMpXHJcbiAgICB0aGlzLm9wdGlvbnMubGluZS5jb2xvciA9IHRoaXMub3B0aW9ucy5saW5lLmNvbG9yIHx8ICdyZ2JhKDI1NSwgMCwgMCwgMSknXHJcbiAgICB0aGlzLm9wdGlvbnNbJ2FyZWEtdW5pdCddID0gb3B0aW9uc1snYXJlYS11bml0J10gfHwgJ+W5s+aWueexsydcclxuICAgIHRoaXMuZW50aXR5XHJcbiAgICB0aGlzLmV2ZW50ID0gbmV3IE1vdXNlRXZlbnQodGhpcy5zZGspXHJcbiAgICB0aGlzLm9wZXJhdGUgPSB7fVxyXG4gICAgdGhpcy5fZWxtcyA9IHt9O1xyXG4gICAgdGhpcy5ub2RlUG9pbnRzID0gW11cclxuICAgIHRoaXMuRGlhbG9nID0gX0RpYWxvZ1xyXG4gICAgdGhpcy5vcHRpb25zLmxvb3AgPSBvcHRpb25zLmxvb3AgfHwgZmFsc2VcclxuICAgIHRoaXMub3B0aW9ucy5zcHJlYWRTdGF0ZSA9IG9wdGlvbnMuc3ByZWFkU3RhdGUgfHwgZmFsc2VcclxuICAgIHRoaXMuc3ByZWFkVGltZSA9IG9wdGlvbnMuc3ByZWFkVGltZVxyXG4gICAgb3B0aW9ucy5sYWJlbCA9IG9wdGlvbnMubGFiZWwgfHwge31cclxuICAgIHRoaXMub3B0aW9ucy5sYWJlbCA9IHtcclxuICAgICAgdGV4dDogdGhpcy5vcHRpb25zLm5hbWUsXHJcbiAgICAgIHNob3c6IG9wdGlvbnMubGFiZWwuc2hvdyB8fCBmYWxzZSxcclxuICAgICAgcG9zaXRpb246IG9wdGlvbnMubGFiZWwucG9zaXRpb24sXHJcbiAgICAgIGZvbnRGYW1pbHk6IG9wdGlvbnMubGFiZWwuZm9udEZhbWlseSA/IG9wdGlvbnMubGFiZWwuZm9udEZhbWlseSA6IDAsXHJcbiAgICAgIGZvbnRTaXplOiAob3B0aW9ucy5sYWJlbC5mb250U2l6ZSB8fCBvcHRpb25zLmxhYmVsLmZvbnRTaXplID09PSAwKSA/IG9wdGlvbnMubGFiZWwuZm9udFNpemUgOiAyMCxcclxuICAgICAgY29sb3I6IG9wdGlvbnMubGFiZWwuY29sb3IgfHwgJyNmZmZmZmYnLFxyXG4gICAgICBsaW5lV2lkdGg6IChvcHRpb25zLmxhYmVsLmxpbmVXaWR0aCB8fCBvcHRpb25zLmxhYmVsLmxpbmVXaWR0aCA9PT0gMCkgPyBvcHRpb25zLmxhYmVsLmxpbmVXaWR0aCA6IDQsXHJcbiAgICAgIHBpeGVsT2Zmc2V0OiAob3B0aW9ucy5sYWJlbC5waXhlbE9mZnNldCB8fCBvcHRpb25zLmxhYmVsLnBpeGVsT2Zmc2V0ID09PSAwKSA/IG9wdGlvbnMubGFiZWwucGl4ZWxPZmZzZXQgOiAyMCxcclxuICAgICAgYmFja2dyb3VuZENvbG9yOiBvcHRpb25zLmxhYmVsLmJhY2tncm91bmRDb2xvciB8fCBbJyMwMGZmZmY4MCcsICcjMDBmZmZmODAnXSxcclxuICAgICAgbGluZUNvbG9yOiBvcHRpb25zLmxhYmVsLmxpbmVDb2xvciB8fCAnIzAwZmZmZjgwJyxcclxuICAgICAgc2NhbGVCeURpc3RhbmNlOiBvcHRpb25zLmxhYmVsLnNjYWxlQnlEaXN0YW5jZSB8fCBmYWxzZSxcclxuICAgICAgbmVhcjogKG9wdGlvbnMubGFiZWwubmVhciB8fCBvcHRpb25zLmxhYmVsLm5lYXIgPT09IDApID8gb3B0aW9ucy5sYWJlbC5uZWFyIDogMjAwMCxcclxuICAgICAgZmFyOiAob3B0aW9ucy5sYWJlbC5mYXIgfHwgb3B0aW9ucy5sYWJlbC5mYXIgPT09IDApID8gb3B0aW9ucy5sYWJlbC5mYXIgOiAxMDAwMDAsXHJcbiAgICB9XHJcbiAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlID0gb3B0aW9ucy5hdHRyaWJ1dGUgfHwge31cclxuICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluayA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluayB8fCB7fVxyXG4gICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnQgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudCB8fCBbXVxyXG4gICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5jYW1lcmEgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmNhbWVyYSB8fCB7fVxyXG4gICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5jYW1lcmEuY29udGVudCA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUuY2FtZXJhLmNvbnRlbnQgfHwgW11cclxuICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyIHx8IHt9XHJcbiAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnQgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnQgfHwgW11cclxuICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUuZ29vZHMgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmdvb2RzIHx8IHt9XHJcbiAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmdvb2RzLmNvbnRlbnQgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmdvb2RzLmNvbnRlbnQgfHwgW11cclxuICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGVUeXBlID0gb3B0aW9ucy5hdHRyaWJ1dGVUeXBlIHx8ICdyaWNoVGV4dCdcclxuXHJcbiAgICBpZiAoIXRoaXMub3B0aW9ucy5wb3NpdGlvbnMgfHwgdGhpcy5vcHRpb25zLnBvc2l0aW9ucy5sZW5ndGggPCAzKSB7XHJcbiAgICAgIHRoaXMuX2Vycm9yID0gJ+eureWktOmdouacgOWwkemcgOimgeS4ieS4quWdkOagh++8gSdcclxuICAgICAgY29uc29sZS53YXJuKHRoaXMuX2Vycm9yKVxyXG4gICAgICB3aW5kb3cuRUxFTUVOVCAmJiB3aW5kb3cuRUxFTUVOVC5NZXNzYWdlKHtcclxuICAgICAgICBtZXNzYWdlOiB0aGlzLl9lcnJvcixcclxuICAgICAgICB0eXBlOiAnd2FybmluZycsXHJcbiAgICAgICAgZHVyYXRpb246IDE1MDBcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuaGVpZ2h0ICYmIHRoaXMub3B0aW9ucy5oZWlnaHQgIT09IDApIHtcclxuICAgICAgICBsZXQgaGVpZ2h0ID0gdGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXS5hbHRcclxuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IHRoaXMub3B0aW9ucy5wb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGlmIChoZWlnaHQgPCB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmFsdCkge1xyXG4gICAgICAgICAgICBoZWlnaHQgPSB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmFsdFxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLm9wdGlvbnMuaGVpZ2h0ID0gaGVpZ2h0XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5zZGsuYWRkSW5jZXRhbmNlKHRoaXMub3B0aW9ucy5pZCwgdGhpcylcclxuICAgICAgQXR0YWNrQXJyb3dPYmplY3QuY3JlYXRlKHRoaXMpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgdHlwZSgpIHtcclxuICAgIHJldHVybiAnQXR0YWNrQXJyb3dPYmplY3QnXHJcbiAgfVxyXG5cclxuICBnZXQgY29sb3IoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmNvbG9yXHJcbiAgfVxyXG4gIHNldCBjb2xvcih2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMuY29sb3IgPSB2IHx8ICdyZ2JhKDI1NSwgMCwgMCwgMC41KSdcclxuICAgIGlmICghdGhpcy5zZGsgfHwgIXRoaXMuc2RrLnZpZXdlciB8fCAhdGhpcy5lbnRpdHkgfHwgIXRoaXMuZW50aXR5LnBvbHlnb24pIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcbiAgICBsZXQgbWF0ZXJpYWwgPSBDZXNpdW0uQ29sb3IuZnJvbUNzc0NvbG9yU3RyaW5nKHRoaXMub3B0aW9ucy5jb2xvcilcclxuICAgIGlmICh0aGlzLnNkay52aWV3ZXIuc2NlbmUubW9kZSA9PT0gMikge1xyXG4gICAgICBtYXRlcmlhbCA9IG5ldyBDZXNpdW0uQ3VzdG9tQ29sb3JNYXRlcmlhbFNvdXJjZSh7XHJcbiAgICAgICAgY29sb3I6IHRoaXMub3B0aW9ucy5jb2xvclxyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gICAgdGhpcy5lbnRpdHkucG9seWdvbi5tYXRlcmlhbCA9IG1hdGVyaWFsXHJcbiAgICBpZiAodGhpcy5fZWxtcy5jb2xvcikge1xyXG4gICAgICB0aGlzLl9lbG1zLmNvbG9yLmZvckVhY2goKGl0ZW0sIGkpID0+IHtcclxuICAgICAgICBsZXQgY29sb3JQaWNrZXIgPSBuZXcgWUpDb2xvclBpY2tlcih7XHJcbiAgICAgICAgICBlbDogaXRlbS5lbCxcclxuICAgICAgICAgIHNpemU6ICdtaW5pJywvL+minOiJsmJveOexu+Wei1xyXG4gICAgICAgICAgYWxwaGE6IHRydWUsLy/mmK/lkKblvIDlkK/pgI/mmI7luqZcclxuICAgICAgICAgIGRlZmF1bHRDb2xvcjogdGhpcy5vcHRpb25zLmNvbG9yLFxyXG4gICAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLC8v5piv5ZCm56aB5q2i5omT5byA6aKc6Imy6YCJ5oup5ZmoXHJcbiAgICAgICAgICBvcGVuUGlja2VyQW5pOiAnb3BhY2l0eScsLy/miZPlvIDpopzoibLpgInmi6nlmajliqjnlLtcclxuICAgICAgICAgIHN1cmU6IChjKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuY29sb3IgPSBjXHJcbiAgICAgICAgICB9LC8v54K55Ye756Gu6K6k5oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgICAgICBjbGVhcjogKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmNvbG9yID0gJ3JnYmEoMjU1LDAsMCwwLjUpJ1xyXG4gICAgICAgICAgfSwvL+eCueWHu+a4heepuuaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgdGhpcy5fZWxtcy5jb2xvcltpXSA9IGNvbG9yUGlja2VyXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgaGVpZ2h0TW9kZSgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuaGVpZ2h0TW9kZSA/IHRoaXMub3B0aW9ucy5oZWlnaHRNb2RlIDogMFxyXG4gIH1cclxuICBzZXQgaGVpZ2h0TW9kZSh2KSB7XHJcbiAgICB0aGlzLmVudGl0eS5wb2x5Z29uLmhpZXJhcmNoeSA9IFtdXHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5vcHRpb25zLmhlaWdodE1vZGUgPSAodiB8fCB2ID09IDApID8gdiA6IDJcclxuICAgICAgdGhpcy5wb3NpdGlvbkVkaXRpbmcgPSBmYWxzZVxyXG4gICAgICBpZiAoIXRoaXMuZW50aXR5KSB7XHJcbiAgICAgICAgcmV0dXJuXHJcbiAgICAgIH1cclxuICAgICAgbGV0IGhlaWdodE1vZGVOYW1lID0gJydcclxuICAgICAgQXR0YWNrQXJyb3dPYmplY3QuY2xvc2VOb2RlRWRpdCh0aGlzKVxyXG4gICAgICBsZXQgZ3JvdW5kID0gZmFsc2VcclxuICAgICAgbGV0IGRpc2FibGVkID0gZmFsc2VcclxuICAgICAgdGhpcy5yZW5ld1Bvc2l0aW9ucygpXHJcbiAgICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLnBvc2l0aW9ucyA9IFtcclxuICAgICAgICAuLi50aGlzLnBvc2l0aW9uc0gsXHJcbiAgICAgICAgdGhpcy5wb3NpdGlvbnNIWzBdLFxyXG4gICAgICAgIHRoaXMucG9zaXRpb25zSFsxXVxyXG4gICAgICBdXHJcbiAgICAgIHRoaXMuZW50aXR5LnBvbHlnb24uaGllcmFyY2h5ID0gbmV3IENlc2l1bS5Qb2x5Z29uSGllcmFyY2h5KFxyXG4gICAgICAgIHRoaXMucG9zaXRpb25zSFxyXG4gICAgICApXHJcbiAgICAgIHN3aXRjaCAodGhpcy5vcHRpb25zLmhlaWdodE1vZGUpIHtcclxuICAgICAgICBjYXNlICcwJzpcclxuICAgICAgICBjYXNlIDA6XHJcbiAgICAgICAgICBoZWlnaHRNb2RlTmFtZSA9ICfmtbfmi5Tpq5jluqYnXHJcbiAgICAgICAgICBicmVha1xyXG4gICAgICAgIGNhc2UgJzEnOlxyXG4gICAgICAgIGNhc2UgMTpcclxuICAgICAgICAgIGhlaWdodE1vZGVOYW1lID0gJ+ebuOWvueWcsOihqCdcclxuICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgY2FzZSAnMic6XHJcbiAgICAgICAgY2FzZSAyOlxyXG4gICAgICAgICAgZ3JvdW5kID0gdHJ1ZVxyXG4gICAgICAgICAgZGlzYWJsZWQgPSB0cnVlXHJcbiAgICAgICAgICBoZWlnaHRNb2RlTmFtZSA9ICfkvp3pmYTmqKHlnosnXHJcbiAgICAgICAgICBicmVha1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLnByZXZpb3VzID0gbnVsbFxyXG4gICAgICB0aGlzLmxhYmVsLmdyb3VuZCA9IGdyb3VuZFxyXG4gICAgICB0aGlzLmVudGl0eS5wb2x5bGluZS5jbGFtcFRvR3JvdW5kID0gZ3JvdW5kXHJcbiAgICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLmFyY1R5cGUgPSAhZ3JvdW5kID8gQ2VzaXVtLkFyY1R5cGUuTk9ORSA6IENlc2l1bS5BcmNUeXBlLkdFT0RFU0lDLFxyXG4gICAgICAgIHRoaXMuZW50aXR5LnBvbHlnb24ucGVyUG9zaXRpb25IZWlnaHQgPSAhZ3JvdW5kID8gdHJ1ZSA6IGZhbHNlXHJcbiAgICAgIHRoaXMuX2VsbXMuaGVpZ2h0TW9kZSAmJiAodGhpcy5fZWxtcy5oZWlnaHRNb2RlLnZhbHVlID0gaGVpZ2h0TW9kZU5hbWUpXHJcbiAgICAgIHRoaXMuX2VsbXMuaGVpZ2h0TW9kZU9iamVjdCAmJiAodGhpcy5fZWxtcy5oZWlnaHRNb2RlT2JqZWN0LmxlZ3Bfc2VhcmNoQWN0aXZlKFxyXG4gICAgICAgIGhlaWdodE1vZGVOYW1lXHJcbiAgICAgICkpXHJcbiAgICAgIGlmIChkaXNhYmxlZCkge1xyXG4gICAgICAgIHRoaXMuX2VsbXMuaGVpZ2h0Qm94ICYmICh0aGlzLl9lbG1zLmhlaWdodEJveC5jbGFzc05hbWUgPSAnaW5wdXQtbnVtYmVyIGlucHV0LW51bWJlci11bml0LTEgaGVpZ2h0LWJveCBkaXNhYmxlZCcpO1xyXG4gICAgICAgIHRoaXMuX2VsbXMuaGVpZ2h0Q29uZmlybSAmJiB0aGlzLl9lbG1zLmhlaWdodENvbmZpcm0uc2V0QXR0cmlidXRlKCdkaXNhYmxlZCcsICdkaXNhYmxlZCcpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRoaXMuX2VsbXMuaGVpZ2h0Qm94ICYmICh0aGlzLl9lbG1zLmhlaWdodEJveC5jbGFzc05hbWUgPSAnaW5wdXQtbnVtYmVyIGlucHV0LW51bWJlci11bml0LTEgaGVpZ2h0LWJveCcpO1xyXG4gICAgICAgIHRoaXMuX2VsbXMuaGVpZ2h0Q29uZmlybSAmJiB0aGlzLl9lbG1zLmhlaWdodENvbmZpcm0ucmVtb3ZlQXR0cmlidXRlKCdkaXNhYmxlZCcpO1xyXG4gICAgICB9XHJcbiAgICB9LCA1MCk7XHJcbiAgfVxyXG5cclxuICBnZXQgaGVpZ2h0KCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5oZWlnaHRcclxuICB9XHJcblxyXG4gIHNldCBoZWlnaHQodikge1xyXG4gICAgaWYgKCF2IHx8IGlzTmFOKE51bWJlcih2KSkpIHtcclxuICAgICAgdGhpcy5vcHRpb25zLmhlaWdodCA9IDBcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLm9wdGlvbnMuaGVpZ2h0ID0gTnVtYmVyKE51bWJlcih2KS50b0ZpeGVkKDIpKVxyXG4gICAgfVxyXG4gICAgbGV0IGdyb3VuZFxyXG4gICAgaWYgKHRoaXMuaGVpZ2h0TW9kZSA9PSAyKSB7XHJcbiAgICAgIGdyb3VuZCA9IHRydWVcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGdyb3VuZCA9IGZhbHNlXHJcbiAgICB9XHJcbiAgICB0aGlzLnJlbmV3UG9zaXRpb25zKClcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLmVudGl0eS5wb2x5Z29uLmhpZXJhcmNoeSA9IG5ldyBDZXNpdW0uUG9seWdvbkhpZXJhcmNoeSh0aGlzLnBvc2l0aW9uc0gpXHJcbiAgICAgIHRoaXMuZW50aXR5LnBvbHlnb24ucGVyUG9zaXRpb25IZWlnaHQgPSAhZ3JvdW5kID8gdHJ1ZSA6IGZhbHNlXHJcbiAgICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLnBvc2l0aW9ucyA9IFtcclxuICAgICAgICAuLi50aGlzLnBvc2l0aW9uc0gsXHJcbiAgICAgICAgdGhpcy5wb3NpdGlvbnNIWzBdLFxyXG4gICAgICAgIHRoaXMucG9zaXRpb25zSFsxXVxyXG4gICAgICBdXHJcbiAgICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLmNsYW1wVG9Hcm91bmQgPSAhZ3JvdW5kID8gZmFsc2UgOiB0cnVlXHJcbiAgICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLmFyY1R5cGUgPSAhZ3JvdW5kID8gQ2VzaXVtLkFyY1R5cGUuTk9ORSA6IENlc2l1bS5BcmNUeXBlLkdFT0RFU0lDXHJcbiAgICB9LCAwKTtcclxuXHJcbiAgICB0aGlzLl9lbG1zLmFsdCAmJlxyXG4gICAgICB0aGlzLl9lbG1zLmFsdC5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgIGl0ZW0uaW5uZXJIVE1MID0gdGhpcy5vcHRpb25zLmhlaWdodFxyXG4gICAgICB9KVxyXG4gIH1cclxuXHJcbiAgZ2V0IGxpbmVDb2xvcigpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubGluZS5jb2xvclxyXG4gIH1cclxuICBzZXQgbGluZUNvbG9yKHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5saW5lLmNvbG9yID0gdiB8fCAncmdiYSgyNTUsIDAsIDAsIDAuNSknXHJcbiAgICBpZiAoIXRoaXMuc2RrIHx8ICF0aGlzLnNkay52aWV3ZXIgfHwgIXRoaXMuZW50aXR5IHx8ICF0aGlzLmVudGl0eS5wb2x5bGluZSkge1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLm1hdGVyaWFsID0gQ2VzaXVtLkNvbG9yLmZyb21Dc3NDb2xvclN0cmluZyh0aGlzLm9wdGlvbnMubGluZS5jb2xvcilcclxuICAgIGlmICh0aGlzLl9lbG1zLmxpbmVDb2xvcikge1xyXG4gICAgICB0aGlzLl9lbG1zLmxpbmVDb2xvci5mb3JFYWNoKChpdGVtLCBpKSA9PiB7XHJcbiAgICAgICAgbGV0IGxpbmVDb2xvclBpY2tlciA9IG5ldyBZSkNvbG9yUGlja2VyKHtcclxuICAgICAgICAgIGVsOiBpdGVtLmVsLFxyXG4gICAgICAgICAgc2l6ZTogJ21pbmknLC8v6aKc6ImyYm9457G75Z6LXHJcbiAgICAgICAgICBhbHBoYTogdHJ1ZSwvL+aYr+WQpuW8gOWQr+mAj+aYjuW6plxyXG4gICAgICAgICAgZGVmYXVsdENvbG9yOiB0aGlzLm9wdGlvbnMubGluZS5jb2xvcixcclxuICAgICAgICAgIGRpc2FibGVkOiBmYWxzZSwvL+aYr+WQpuemgeatouaJk+W8gOminOiJsumAieaLqeWZqFxyXG4gICAgICAgICAgb3BlblBpY2tlckFuaTogJ29wYWNpdHknLC8v5omT5byA6aKc6Imy6YCJ5oup5Zmo5Yqo55S7XHJcbiAgICAgICAgICBzdXJlOiAoYykgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxpbmVDb2xvciA9IGNcclxuICAgICAgICAgIH0sLy/ngrnlh7vnoa7orqTmjInpkq7kuovku7blm57osINcclxuICAgICAgICAgIGNsZWFyOiAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubGluZUNvbG9yID0gJ3JnYmEoMjU1LDAsMCwwLjUpJ1xyXG4gICAgICAgICAgfSwvL+eCueWHu+a4heepuuaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgdGhpcy5fZWxtcy5saW5lQ29sb3JbaV0gPSBsaW5lQ29sb3JQaWNrZXJcclxuICAgICAgfSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCBsaW5lV2lkdGgoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmxpbmUud2lkdGhcclxuICB9XHJcbiAgc2V0IGxpbmVXaWR0aCh2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMubGluZS53aWR0aCA9ICgodiB8fCB2ID09PSAwKSA/IHYgOiAzKVxyXG4gICAgdGhpcy5lbnRpdHkucG9seWxpbmUud2lkdGggPSB0aGlzLm9wdGlvbnMubGluZS53aWR0aFxyXG4gICAgdGhpcy5fZWxtcy5saW5lQ29sb3IgJiYgdGhpcy5fZWxtcy5saW5lQ29sb3IuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICBpdGVtLnZhbHVlID0gdlxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGdldCBhcmVhKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5hcmVhXHJcbiAgfVxyXG5cclxuICBzZXQgYXJlYSh2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMuYXJlYSA9IHZcclxuICAgIHRoaXMuX2VsbXMuYXJlYSAmJiB0aGlzLl9lbG1zLmFyZWEuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICBpdGVtLnZhbHVlID0gdlxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGdldCBhcmVhVW5pdCgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnNbJ2FyZWEtdW5pdCddXHJcbiAgfVxyXG4gIHNldCBhcmVhVW5pdCh2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnNbJ2FyZWEtdW5pdCddID0gdlxyXG4gICAgdGhpcy5fZWxtcy5hcmVhVW5pdCAmJiB0aGlzLl9lbG1zLmFyZWFVbml0LmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgaXRlbS52YWx1ZSA9IHZcclxuICAgIH0pXHJcbiAgICBpZiAodGhpcy5vcHRpb25zLmFyZWFCeU1ldGVyKSB7XHJcbiAgICAgIHN3aXRjaCAodikge1xyXG4gICAgICAgIGNhc2UgJ+W5s+aWueexsyc6XHJcbiAgICAgICAgICB0aGlzLmFyZWEgPSB0aGlzLm9wdGlvbnMuYXJlYUJ5TWV0ZXJcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgJ+W5s+aWueWNg+exsyc6XHJcbiAgICAgICAgICB0aGlzLmFyZWEgPSBOdW1iZXIoKHRoaXMub3B0aW9ucy5hcmVhQnlNZXRlciAvIDEwMDAwMDApLnRvRml4ZWQoOCkpXHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlICfkuqknOlxyXG4gICAgICAgICAgdGhpcy5hcmVhID0gTnVtYmVyKCh0aGlzLm9wdGlvbnMuYXJlYUJ5TWV0ZXIgLyA2NjYuNjY2NjY2NykudG9GaXhlZCg0KSlcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgJ+WFrOmhtyc6XHJcbiAgICAgICAgICB0aGlzLmFyZWEgPSBOdW1iZXIoKHRoaXMub3B0aW9ucy5hcmVhQnlNZXRlciAvIDEwMDAwKS50b0ZpeGVkKDYpKVxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIHRoaXMuYXJlYSA9IHRoaXMub3B0aW9ucy5hcmVhQnlNZXRlclxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgbGFiZWxTaG93KCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5sYWJlbC5zaG93XHJcbiAgfVxyXG4gIHNldCBsYWJlbFNob3codikge1xyXG4gICAgdGhpcy5vcHRpb25zLmxhYmVsLnNob3cgPSB2XHJcbiAgICBpZiAodGhpcy5zaG93ICYmICF0aGlzLnNob3dWaWV3IHx8IHRoaXMuc2hvd1ZpZXcgPT0gMykge1xyXG4gICAgICB0aGlzLmxhYmVsLnNob3cgPSB2XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5sYWJlbC5zaG93ID0gZmFsc2VcclxuICAgIH1cclxuICAgIHRoaXMuX2VsbXMubGFiZWxTaG93ICYmIHRoaXMuX2VsbXMubGFiZWxTaG93LmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgaXRlbS5jaGVja2VkID0gdlxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGdldCBsYWJlbEZvbnRGYW1pbHkoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmxhYmVsLmZvbnRGYW1pbHlcclxuICB9XHJcblxyXG4gIHNldCBsYWJlbEZvbnRGYW1pbHkodikge1xyXG4gICAgdGhpcy5vcHRpb25zLmxhYmVsLmZvbnRGYW1pbHkgPSB2IHx8IDBcclxuICAgIHRoaXMubGFiZWwgJiYgKHRoaXMubGFiZWwuZm9udEZhbWlseSA9IHRoaXMub3B0aW9ucy5sYWJlbC5mb250RmFtaWx5KVxyXG5cclxuICAgIGxldCBuYW1lID0gZ2V0Rm9udEZhbWlseU5hbWUodGhpcy5sYWJlbEZvbnRGYW1pbHkpIHx8ICcnXHJcbiAgICB0aGlzLl9lbG1zLmxhYmVsRm9udEZhbWlseSAmJlxyXG4gICAgICB0aGlzLl9lbG1zLmxhYmVsRm9udEZhbWlseS5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgIGl0ZW0udmFsdWUgPSBuYW1lXHJcbiAgICAgIH0pXHJcbiAgfVxyXG5cclxuICBnZXQgbGFiZWxDb2xvcigpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubGFiZWwuY29sb3JcclxuICB9XHJcbiAgc2V0IGxhYmVsQ29sb3Iodikge1xyXG4gICAgdGhpcy5vcHRpb25zLmxhYmVsLmNvbG9yID0gdlxyXG4gICAgdGhpcy5sYWJlbC5jb2xvciA9IHZcclxuICAgIGlmICh0aGlzLl9lbG1zLmxhYmVsQ29sb3IpIHtcclxuICAgICAgdGhpcy5fZWxtcy5sYWJlbENvbG9yLmZvckVhY2goKGl0ZW0sIGkpID0+IHtcclxuICAgICAgICBsZXQgbGFiZWxDb2xvclBpY2tlciA9IG5ldyBZSkNvbG9yUGlja2VyKHtcclxuICAgICAgICAgIGVsOiBpdGVtLmVsLFxyXG4gICAgICAgICAgc2l6ZTogJ21pbmknLC8v6aKc6ImyYm9457G75Z6LXHJcbiAgICAgICAgICBhbHBoYTogdHJ1ZSwvL+aYr+WQpuW8gOWQr+mAj+aYjuW6plxyXG4gICAgICAgICAgZGVmYXVsdENvbG9yOiB0aGlzLmxhYmVsQ29sb3IsXHJcbiAgICAgICAgICBkaXNhYmxlZDogZmFsc2UsLy/mmK/lkKbnpoHmraLmiZPlvIDpopzoibLpgInmi6nlmahcclxuICAgICAgICAgIG9wZW5QaWNrZXJBbmk6ICdvcGFjaXR5JywvL+aJk+W8gOminOiJsumAieaLqeWZqOWKqOeUu1xyXG4gICAgICAgICAgc3VyZTogKGNvbG9yKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubGFiZWxDb2xvciA9IGNvbG9yXHJcbiAgICAgICAgICB9LC8v54K55Ye756Gu6K6k5oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgICAgICBjbGVhcjogKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxhYmVsQ29sb3IgPSAncmdiYSgyNTUsMjU1LDI1NSwxKSdcclxuICAgICAgICAgIH0sLy/ngrnlh7vmuIXnqbrmjInpkq7kuovku7blm57osINcclxuICAgICAgICB9KVxyXG4gICAgICAgIHRoaXMuX2VsbXMubGFiZWxDb2xvcltpXSA9IGxhYmVsQ29sb3JQaWNrZXJcclxuICAgICAgfSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCBsYWJlbEZvbnRTaXplKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5sYWJlbC5mb250U2l6ZVxyXG4gIH1cclxuICBzZXQgbGFiZWxGb250U2l6ZSh2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMubGFiZWwuZm9udFNpemUgPSB2XHJcbiAgICB0aGlzLmxhYmVsLmZvbnRTaXplID0gdlxyXG4gICAgdGhpcy5fZWxtcy5sYWJlbEZvbnRTaXplICYmIHRoaXMuX2VsbXMubGFiZWxGb250U2l6ZS5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgIGl0ZW0udmFsdWUgPSB2XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgZ2V0IGxhYmVsU2NhbGVCeURpc3RhbmNlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5sYWJlbC5zY2FsZUJ5RGlzdGFuY2VcclxuICB9XHJcbiAgc2V0IGxhYmVsU2NhbGVCeURpc3RhbmNlKHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5sYWJlbC5zY2FsZUJ5RGlzdGFuY2UgPSB2XHJcbiAgICB0aGlzLmxhYmVsLnNjYWxlQnlEaXN0YW5jZSA9IHZcclxuICAgIHRoaXMuX2VsbXMubGFiZWxTY2FsZUJ5RGlzdGFuY2UgJiYgdGhpcy5fZWxtcy5sYWJlbFNjYWxlQnlEaXN0YW5jZS5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgIGl0ZW0uY2hlY2tlZCA9IHZcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBnZXQgbGFiZWxOZWFyKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5sYWJlbC5uZWFyXHJcbiAgfVxyXG4gIHNldCBsYWJlbE5lYXIodikge1xyXG4gICAgbGV0IG5lYXIgPSB2XHJcbiAgICBpZiAobmVhciA+IHRoaXMubGFiZWxGYXIpIHtcclxuICAgICAgbmVhciA9IHRoaXMubGFiZWxGYXJcclxuICAgIH1cclxuICAgIHRoaXMub3B0aW9ucy5sYWJlbC5uZWFyID0gbmVhclxyXG4gICAgdGhpcy5sYWJlbC5uZWFyID0gbmVhclxyXG4gICAgdGhpcy5fZWxtcy5sYWJlbE5lYXIgJiYgdGhpcy5fZWxtcy5sYWJlbE5lYXIuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICBpdGVtLnZhbHVlID0gbmVhclxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGdldCBsYWJlbEZhcigpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubGFiZWwuZmFyXHJcbiAgfVxyXG4gIHNldCBsYWJlbEZhcih2KSB7XHJcbiAgICBsZXQgZmFyID0gdlxyXG4gICAgaWYgKGZhciA8IHRoaXMubGFiZWxOZWFyKSB7XHJcbiAgICAgIGZhciA9IHRoaXMubGFiZWxOZWFyXHJcbiAgICB9XHJcbiAgICB0aGlzLm9wdGlvbnMubGFiZWwuZmFyID0gZmFyXHJcbiAgICB0aGlzLmxhYmVsLmZhciA9IGZhclxyXG4gICAgdGhpcy5fZWxtcy5sYWJlbEZhciAmJiB0aGlzLl9lbG1zLmxhYmVsRmFyLmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgaXRlbS52YWx1ZSA9IGZhclxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGdldCBsYWJlbExpbmVXaWR0aCgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubGFiZWwubGluZVdpZHRoXHJcbiAgfVxyXG4gIHNldCBsYWJlbExpbmVXaWR0aCh2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMubGFiZWwubGluZVdpZHRoID0gdlxyXG4gICAgdGhpcy5sYWJlbC5saW5lV2lkdGggPSB2XHJcbiAgICB0aGlzLl9lbG1zLmxhYmVsTGluZVdpZHRoICYmIHRoaXMuX2VsbXMubGFiZWxMaW5lV2lkdGguZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICBpdGVtLnZhbHVlID0gdlxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGdldCBsYWJlbFBpeGVsT2Zmc2V0KCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5sYWJlbC5waXhlbE9mZnNldFxyXG4gIH1cclxuICBzZXQgbGFiZWxQaXhlbE9mZnNldCh2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMubGFiZWwucGl4ZWxPZmZzZXQgPSB2XHJcbiAgICB0aGlzLmxhYmVsLnBpeGVsT2Zmc2V0ID0gdlxyXG4gICAgdGhpcy5fZWxtcy5sYWJlbFBpeGVsT2Zmc2V0ICYmIHRoaXMuX2VsbXMubGFiZWxQaXhlbE9mZnNldC5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgIGl0ZW0udmFsdWUgPSB2XHJcbiAgICB9KVxyXG4gIH1cclxuICBnZXQgbGFiZWxMaW5lQ29sb3IoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmxhYmVsLmxpbmVDb2xvclxyXG4gIH1cclxuICBzZXQgbGFiZWxMaW5lQ29sb3Iodikge1xyXG4gICAgdGhpcy5vcHRpb25zLmxhYmVsLmxpbmVDb2xvciA9IHZcclxuICAgIHRoaXMubGFiZWwubGluZUNvbG9yID0gdlxyXG4gICAgaWYgKHRoaXMuX2VsbXMubGFiZWxMaW5lQ29sb3IpIHtcclxuICAgICAgdGhpcy5fZWxtcy5sYWJlbExpbmVDb2xvci5mb3JFYWNoKChpdGVtLCBpKSA9PiB7XHJcbiAgICAgICAgbGV0IGxpbmVDb2xvclBpY2tlciA9IG5ldyBZSkNvbG9yUGlja2VyKHtcclxuICAgICAgICAgIGVsOiBpdGVtLmVsLFxyXG4gICAgICAgICAgc2l6ZTogJ21pbmknLC8v6aKc6ImyYm9457G75Z6LXHJcbiAgICAgICAgICBhbHBoYTogdHJ1ZSwvL+aYr+WQpuW8gOWQr+mAj+aYjuW6plxyXG4gICAgICAgICAgZGVmYXVsdENvbG9yOiB0aGlzLmxhYmVsTGluZUNvbG9yLFxyXG4gICAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLC8v5piv5ZCm56aB5q2i5omT5byA6aKc6Imy6YCJ5oup5ZmoXHJcbiAgICAgICAgICBvcGVuUGlja2VyQW5pOiAnb3BhY2l0eScsLy/miZPlvIDpopzoibLpgInmi6nlmajliqjnlLtcclxuICAgICAgICAgIHN1cmU6IChjb2xvcikgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxhYmVsTGluZUNvbG9yID0gY29sb3JcclxuICAgICAgICAgIH0sLy/ngrnlh7vnoa7orqTmjInpkq7kuovku7blm57osINcclxuICAgICAgICAgIGNsZWFyOiAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubGFiZWxMaW5lQ29sb3IgPSAncmdiYSgwLDI1NSwyNTUsMC41KSdcclxuICAgICAgICAgIH0sLy/ngrnlh7vmuIXnqbrmjInpkq7kuovku7blm57osINcclxuICAgICAgICB9KVxyXG4gICAgICAgIHRoaXMuX2VsbXMubGFiZWxMaW5lQ29sb3JbaV0gPSBsaW5lQ29sb3JQaWNrZXJcclxuICAgICAgfSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCBsYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0KCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5sYWJlbC5iYWNrZ3JvdW5kQ29sb3JbMF1cclxuICB9XHJcbiAgc2V0IGxhYmVsQmFja2dyb3VuZENvbG9yU3RhcnQodikge1xyXG4gICAgdGhpcy5vcHRpb25zLmxhYmVsLmJhY2tncm91bmRDb2xvclswXSA9IHZcclxuICAgIHRoaXMubGFiZWwuYmFja2dyb3VuZENvbG9yID0gW3YsIHRoaXMubGFiZWwuYmFja2dyb3VuZENvbG9yWzFdXVxyXG4gICAgaWYgKHRoaXMuX2VsbXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JTdGFydCkge1xyXG4gICAgICB0aGlzLl9lbG1zLmxhYmVsQmFja2dyb3VuZENvbG9yU3RhcnQuZm9yRWFjaCgoaXRlbSwgaSkgPT4ge1xyXG4gICAgICAgIGxldCBsYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0UGlja2VyID0gbmV3IFlKQ29sb3JQaWNrZXIoe1xyXG4gICAgICAgICAgZWw6IGl0ZW0uZWwsXHJcbiAgICAgICAgICBzaXplOiAnbWluaScsLy/popzoibJib3jnsbvlnotcclxuICAgICAgICAgIGFscGhhOiB0cnVlLC8v5piv5ZCm5byA5ZCv6YCP5piO5bqmXHJcbiAgICAgICAgICBkZWZhdWx0Q29sb3I6IHRoaXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JTdGFydCxcclxuICAgICAgICAgIGRpc2FibGVkOiBmYWxzZSwvL+aYr+WQpuemgeatouaJk+W8gOminOiJsumAieaLqeWZqFxyXG4gICAgICAgICAgb3BlblBpY2tlckFuaTogJ29wYWNpdHknLC8v5omT5byA6aKc6Imy6YCJ5oup5Zmo5Yqo55S7XHJcbiAgICAgICAgICBzdXJlOiAoY29sb3IpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5sYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0ID0gY29sb3JcclxuICAgICAgICAgIH0sLy/ngrnlh7vnoa7orqTmjInpkq7kuovku7blm57osINcclxuICAgICAgICAgIGNsZWFyOiAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JTdGFydCA9ICdyZ2JhKDI1NSwyNTUsMjU1LDEpJ1xyXG4gICAgICAgICAgfSwvL+eCueWHu+a4heepuuaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgdGhpcy5fZWxtcy5sYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0W2ldID0gbGFiZWxCYWNrZ3JvdW5kQ29sb3JTdGFydFBpY2tlclxyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gIH1cclxuICBnZXQgbGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmxhYmVsLmJhY2tncm91bmRDb2xvclsxXVxyXG4gIH1cclxuICBzZXQgbGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmQodikge1xyXG4gICAgdGhpcy5vcHRpb25zLmxhYmVsLmJhY2tncm91bmRDb2xvclsxXSA9IHZcclxuICAgIHRoaXMubGFiZWwuYmFja2dyb3VuZENvbG9yID0gW3RoaXMubGFiZWwuYmFja2dyb3VuZENvbG9yWzBdLCB2XVxyXG4gICAgaWYgKHRoaXMuX2VsbXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmQpIHtcclxuICAgICAgdGhpcy5fZWxtcy5sYWJlbEJhY2tncm91bmRDb2xvckVuZC5mb3JFYWNoKChpdGVtLCBpKSA9PiB7XHJcbiAgICAgICAgbGV0IGxhYmVsQmFja2dyb3VuZENvbG9yRW5kUGlja2VyID0gbmV3IFlKQ29sb3JQaWNrZXIoe1xyXG4gICAgICAgICAgZWw6IGl0ZW0uZWwsXHJcbiAgICAgICAgICBzaXplOiAnbWluaScsLy/popzoibJib3jnsbvlnotcclxuICAgICAgICAgIGFscGhhOiB0cnVlLC8v5piv5ZCm5byA5ZCv6YCP5piO5bqmXHJcbiAgICAgICAgICBkZWZhdWx0Q29sb3I6IHRoaXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmQsXHJcbiAgICAgICAgICBkaXNhYmxlZDogZmFsc2UsLy/mmK/lkKbnpoHmraLmiZPlvIDpopzoibLpgInmi6nlmahcclxuICAgICAgICAgIG9wZW5QaWNrZXJBbmk6ICdvcGFjaXR5JywvL+aJk+W8gOminOiJsumAieaLqeWZqOWKqOeUu1xyXG4gICAgICAgICAgc3VyZTogKGNvbG9yKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmQgPSBjb2xvclxyXG4gICAgICAgICAgfSwvL+eCueWHu+ehruiupOaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICAgICAgY2xlYXI6ICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5sYWJlbEJhY2tncm91bmRDb2xvckVuZCA9ICdyZ2JhKDI1NSwyNTUsMjU1LDEpJ1xyXG4gICAgICAgICAgfSwvL+eCueWHu+a4heepuuaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgdGhpcy5fZWxtcy5sYWJlbEJhY2tncm91bmRDb2xvckVuZFtpXSA9IGxhYmVsQmFja2dyb3VuZENvbG9yRW5kUGlja2VyXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgYXR0cmlidXRlVHlwZSgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuYXR0cmlidXRlVHlwZVxyXG4gIH1cclxuXHJcbiAgc2V0IGF0dHJpYnV0ZVR5cGUodikge1xyXG4gICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZVR5cGUgPSB2XHJcbiAgICB0aGlzLl9lbG1zLmF0dHJpYnV0ZVR5cGUgJiYgdGhpcy5fZWxtcy5hdHRyaWJ1dGVUeXBlLmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgaXRlbS52YWx1ZSA9IHZcclxuICAgIH0pXHJcbiAgICBsZXQgYXR0cmlidXRlQ29udGVudCA9IHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2F0dHJpYnV0ZS1jb250ZW50JylcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXR0cmlidXRlQ29udGVudC5sZW5ndGg7IGkrKykge1xyXG4gICAgICBpZiAoYXR0cmlidXRlQ29udGVudFtpXS5jbGFzc05hbWUuaW5kZXhPZignYXR0cmlidXRlLWNvbnRlbnQtJyArIHYpID4gLTEpIHtcclxuICAgICAgICBhdHRyaWJ1dGVDb250ZW50W2ldLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGF0dHJpYnV0ZUNvbnRlbnRbaV0uc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IGF0dHJpYnV0ZUxpbmsoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnRcclxuICB9XHJcblxyXG4gIHNldCBhdHRyaWJ1dGVMaW5rKHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50ID0gdlxyXG4gICAgaWYgKCF0aGlzLl9EaWFsb2dPYmplY3QgfHwgIXRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudCB8fCAhdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQgfHwgdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnYXR0cmlidXRlLWNvbnRlbnQtbGluaycpLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG4gICAgbGV0IHRhYmxlID0gdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnYXR0cmlidXRlLWNvbnRlbnQtbGluaycpWzFdLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RhYmxlJylbMF1cclxuICAgIGxldCB0YWJsZUNvbnRlbnQgPSB0YWJsZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0YWJsZS1ib2R5JylbMF1cclxuICAgIHRhYmxlQ29udGVudC5pbm5lckhUTUwgPSAnJ1xyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50Lmxlbmd0aCA+IDApIHtcclxuICAgICAgdGFibGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndGFibGUtZW1wdHknKVswXS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnXHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGFibGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndGFibGUtZW1wdHknKVswXS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnXHJcbiAgICB9XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGxldCB0ciA9IGBcclxuICAgICAgPGRpdiBjbGFzcz1cInRyXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidGRcIj5gICsgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnRbaV0ubmFtZSArIGA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZFwiPmAgKyB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudFtpXS51cmwgKyBgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidGRcIj5cclxuICAgICAgICAgICAgICA8YnV0dG9uIEBjbGljaz1cImxpbmtFZGl0XCI+57yW6L6RPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvbiBAY2xpY2s9XCJsaW5rRGVsZXRlXCI+5Yig6ZmkPC9idXR0b24+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+YFxyXG4gICAgICBsZXQgdHJFbG0gPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpLmNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudCh0cilcclxuICAgICAgdGFibGVDb250ZW50LmFwcGVuZENoaWxkKHRyRWxtKVxyXG4gICAgfVxyXG4gICAgbGV0IGl0ZW0gPSB0YWJsZUNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndHInKVxyXG4gICAgbGV0IGZ1biA9IHtcclxuICAgICAgbGlua0VkaXQ6IGFzeW5jIChpbmRleCkgPT4ge1xyXG4gICAgICAgIHRoaXMuYXR0cmlidXRlTGluayA9IGF3YWl0IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50XHJcbiAgICAgICAgbGV0IHRhYmxlID0gdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnYXR0cmlidXRlLWNvbnRlbnQtbGluaycpWzFdLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RhYmxlJylbMF1cclxuICAgICAgICBsZXQgdGFibGVDb250ZW50ID0gdGFibGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndGFibGUtYm9keScpWzBdXHJcbiAgICAgICAgbGV0IGl0ZW0gPSB0YWJsZUNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndHInKVxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgaWYgKGluZGV4ID09PSBpKSB7XHJcbiAgICAgICAgICAgIGxldCBoZWlnaHQgPSBpdGVtW2ldLm9mZnNldEhlaWdodFxyXG4gICAgICAgICAgICBsZXQgaHRtbCA9IGBcclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGRcIj5cclxuICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImlucHV0XCIgdHlwZT1cInRleHRcIj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGRcIj5cclxuICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBjbGFzcz1cImlucHV0IGxpbmstZWRpdFwiIHR5cGU9XCJ0ZXh0XCI+PC90ZXh0YXJlYT5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGRcIj5cclxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBAY2xpY2s9XCJjb25maXJtRWRpdFwiPuehruiupDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICA8YnV0dG9uIEBjbGljaz1cImNhbmNlbEVkaXRcIj7lj5bmtog8L2J1dHRvbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5gXHJcbiAgICAgICAgICAgIGl0ZW1baV0uaW5uZXJIVE1MID0gaHRtbFxyXG4gICAgICAgICAgICBsZXQgdGV4dGFyZWFFbG0gPSBpdGVtW2ldLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xpbmstZWRpdCcpWzBdXHJcbiAgICAgICAgICAgIHRleHRhcmVhRWxtLnN0eWxlLmhlaWdodCA9IChoZWlnaHQgLSAxMCkgKyAncHgnXHJcbiAgICAgICAgICAgIGxldCB0ZCA9IGl0ZW1baV0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndGQnKVxyXG4gICAgICAgICAgICB0ZFswXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdpbnB1dCcpWzBdLnZhbHVlID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnRbaW5kZXhdLm5hbWVcclxuICAgICAgICAgICAgdGRbMV0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaW5wdXQnKVswXS52YWx1ZSA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50W2luZGV4XS51cmxcclxuICAgICAgICAgICAgbGV0IGJ0biA9IGl0ZW1baV0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2J1dHRvbicpXHJcbiAgICAgICAgICAgIGZvciAobGV0IG4gPSAwOyBuIDwgYnRuLmxlbmd0aDsgbisrKSB7XHJcbiAgICAgICAgICAgICAgaWYgKCFidG5bbl0gfHwgIWJ0bltuXS5hdHRyaWJ1dGVzKSB7XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBmb3IgKGxldCBtIG9mIGJ0bltuXS5hdHRyaWJ1dGVzKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAobS5uYW1lID09PSAnQGNsaWNrJykge1xyXG4gICAgICAgICAgICAgICAgICBidG5bbl0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgKGZ1blttLnZhbHVlXSkgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGZ1blttLnZhbHVlXSh7IG5hbWU6IHRkWzBdLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2lucHV0JylbMF0udmFsdWUsIHVybDogdGRbMV0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaW5wdXQnKVswXS52YWx1ZSB9LCBpKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgIGJ0bltuXS5hdHRyaWJ1dGVzLnJlbW92ZU5hbWVkSXRlbShtLm5hbWUpXHJcbiAgICAgICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBsaW5rRGVsZXRlOiAoaSkgPT4ge1xyXG4gICAgICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50LnNwbGljZShpLCAxKVxyXG4gICAgICAgIHRoaXMuYXR0cmlidXRlTGluayA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50XHJcbiAgICAgIH0sXHJcblxyXG4gICAgICBjb25maXJtRWRpdDogKHZhbHVlLCBpKSA9PiB7XHJcbiAgICAgICAgbGV0IG5hbWUgPSB2YWx1ZS5uYW1lICYmIHZhbHVlLm5hbWUucmVwbGFjZSgvXFxzL2csIFwiXCIpXHJcbiAgICAgICAgbGV0IHVybCA9IHZhbHVlLnVybCAmJiB2YWx1ZS51cmwucmVwbGFjZSgvXFxzL2csIFwiXCIpXHJcbiAgICAgICAgaWYgKG5hbWUgJiYgdXJsKSB7XHJcbiAgICAgICAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudFtpXSA9IHZhbHVlXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgd2luZG93LkVMRU1FTlQgJiYgd2luZG93LkVMRU1FTlQuTWVzc2FnZSh7XHJcbiAgICAgICAgICAgIG1lc3NhZ2U6ICflkI3np7DmiJbpk77mjqXkuI3og73kuLrnqbrvvIEnLFxyXG4gICAgICAgICAgICB0eXBlOiAnd2FybmluZycsXHJcbiAgICAgICAgICAgIGR1cmF0aW9uOiAxNTAwXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5hdHRyaWJ1dGVMaW5rID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnRcclxuICAgICAgfSxcclxuICAgICAgY2FuY2VsRWRpdDogKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuYXR0cmlidXRlTGluayA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50XHJcbiAgICAgIH0sXHJcbiAgICAgIGZpbGVTZWxlY3Q6ICh2YWx1ZSwgaSkgPT4ge1xyXG4gICAgICAgIGxldCBmaWxlRWxtID0gaXRlbVtpXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdmaWxlLXNlbGVjdCcpWzBdXHJcbiAgICAgICAgZmlsZUVsbS5jbGljaygpXHJcbiAgICAgICAgZmlsZUVsbS5yZW1vdmVFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBmaWxlU2VsZWN0KVxyXG4gICAgICAgIGZpbGVFbG0uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgZmlsZVNlbGVjdClcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgbGV0IGZpbGVTZWxlY3QgPSAoZXZlbnQpID0+IHtcclxuICAgICAgaWYgKGV2ZW50LnRhcmdldC52YWx1ZSkge1xyXG4gICAgICAgIGxldCB0ZCA9IGl0ZW1bZXZlbnQudGFyZ2V0LmdldEF0dHJpYnV0ZSgnaW5kZXgnKV0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndGQnKVxyXG4gICAgICAgIHRkWzFdLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2lucHV0JylbMF0udmFsdWUgPSBldmVudC50YXJnZXQudmFsdWVcclxuICAgICAgICBldmVudC50YXJnZXQudmFsdWUgPSBudWxsXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbS5sZW5ndGg7IGkrKykge1xyXG4gICAgICBsZXQgYnRuID0gaXRlbVtpXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnYnV0dG9uJylcclxuICAgICAgZm9yIChsZXQgbiA9IDA7IG4gPCBidG4ubGVuZ3RoOyBuKyspIHtcclxuICAgICAgICBpZiAoIWJ0bltuXSB8fCAhYnRuW25dLmF0dHJpYnV0ZXMpIHtcclxuICAgICAgICAgIGNvbnRpbnVlXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvciAobGV0IG0gb2YgYnRuW25dLmF0dHJpYnV0ZXMpIHtcclxuICAgICAgICAgIGlmIChtLm5hbWUgPT09ICdAY2xpY2snKSB7XHJcbiAgICAgICAgICAgIGJ0bltuXS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiAoZnVuW20udmFsdWVdKSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgZnVuW20udmFsdWVdKGkpXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgYnRuW25dLmF0dHJpYnV0ZXMucmVtb3ZlTmFtZWRJdGVtKG0ubmFtZSlcclxuICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG5cclxuXHJcbiAgfVxyXG5cclxuICBnZXQgYXR0cmlidXRlQ2FtZXJhKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUuY2FtZXJhLmNvbnRlbnRcclxuICB9XHJcbiAgc2V0IGF0dHJpYnV0ZUNhbWVyYSh2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmNhbWVyYS5jb250ZW50ID0gdlxyXG4gIH1cclxuXHJcbiAgZ2V0IGF0dHJpYnV0ZVZyKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudFxyXG4gIH1cclxuXHJcbiAgc2V0IGF0dHJpYnV0ZVZyKHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudCA9IHZcclxuICAgIGlmICghdGhpcy5fRGlhbG9nT2JqZWN0IHx8ICF0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQgfHwgIXRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50IHx8IHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2F0dHJpYnV0ZS1jb250ZW50LXZyJykubGVuZ3RoID09IDApIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcbiAgICBsZXQgdGFibGUgPSB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdhdHRyaWJ1dGUtY29udGVudC12cicpWzFdLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RhYmxlJylbMF1cclxuICAgIGxldCB0YWJsZUNvbnRlbnQgPSB0YWJsZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0YWJsZS1ib2R5JylbMF1cclxuICAgIHRhYmxlQ29udGVudC5pbm5lckhUTUwgPSAnJ1xyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudC5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRhYmxlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RhYmxlLWVtcHR5JylbMF0uc3R5bGUuZGlzcGxheSA9ICdub25lJ1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRhYmxlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RhYmxlLWVtcHR5JylbMF0uc3R5bGUuZGlzcGxheSA9ICdmbGV4J1xyXG4gICAgfVxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnQubGVuZ3RoOyBpKyspIHtcclxuICAgICAgbGV0IHRyID0gYFxyXG4gICAgICA8ZGl2IGNsYXNzPVwidHJcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZFwiPmAgKyB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnRbaV0ubmFtZSArIGA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZFwiPmAgKyB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnRbaV0udXJsICsgYDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRkXCI+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvbiBAY2xpY2s9XCJ2ckVkaXRcIj7nvJbovpE8L2J1dHRvbj5cclxuICAgICAgICAgICAgICA8YnV0dG9uIEBjbGljaz1cInZyRGVsZXRlXCI+5Yig6ZmkPC9idXR0b24+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+YFxyXG4gICAgICBsZXQgdHJFbG0gPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpLmNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudCh0cilcclxuICAgICAgdGFibGVDb250ZW50LmFwcGVuZENoaWxkKHRyRWxtKVxyXG4gICAgfVxyXG4gICAgbGV0IGl0ZW0gPSB0YWJsZUNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndHInKVxyXG4gICAgbGV0IGZ1biA9IHtcclxuICAgICAgdnJFZGl0OiBhc3luYyAoaW5kZXgpID0+IHtcclxuICAgICAgICB0aGlzLmF0dHJpYnV0ZVZyID0gYXdhaXQgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52ci5jb250ZW50XHJcbiAgICAgICAgbGV0IHRhYmxlID0gdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnYXR0cmlidXRlLWNvbnRlbnQtdnInKVsxXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0YWJsZScpWzBdXHJcbiAgICAgICAgbGV0IHRhYmxlQ29udGVudCA9IHRhYmxlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RhYmxlLWJvZHknKVswXVxyXG4gICAgICAgIGxldCBpdGVtID0gdGFibGVDb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RyJylcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW0ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGlmIChpbmRleCA9PT0gaSkge1xyXG4gICAgICAgICAgICBsZXQgaGVpZ2h0ID0gaXRlbVtpXS5vZmZzZXRIZWlnaHRcclxuICAgICAgICAgICAgbGV0IGh0bWwgPSBgXHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRkXCI+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJpbnB1dFwiIHR5cGU9XCJ0ZXh0XCI+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRkXCI+XHJcbiAgICAgICAgICAgICAgICA8dGV4dGFyZWEgY2xhc3M9XCJpbnB1dCBsaW5rLWVkaXRcIiB0eXBlPVwidGV4dFwiPjwvdGV4dGFyZWE+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRkXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxidXR0b24gQGNsaWNrPVwiY29uZmlybUVkaXRcIj7noa7orqQ8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBAY2xpY2s9XCJjYW5jZWxFZGl0XCI+5Y+W5raIPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgPC9kaXY+YFxyXG4gICAgICAgICAgICBpdGVtW2ldLmlubmVySFRNTCA9IGh0bWxcclxuICAgICAgICAgICAgbGV0IHRleHRhcmVhRWxtID0gaXRlbVtpXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdsaW5rLWVkaXQnKVswXVxyXG4gICAgICAgICAgICB0ZXh0YXJlYUVsbS5zdHlsZS5oZWlnaHQgPSAoaGVpZ2h0IC0gMTApICsgJ3B4J1xyXG4gICAgICAgICAgICBsZXQgdGQgPSBpdGVtW2ldLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RkJylcclxuICAgICAgICAgICAgdGRbMF0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaW5wdXQnKVswXS52YWx1ZSA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudFtpbmRleF0ubmFtZVxyXG4gICAgICAgICAgICB0ZFsxXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdpbnB1dCcpWzBdLnZhbHVlID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52ci5jb250ZW50W2luZGV4XS51cmxcclxuICAgICAgICAgICAgbGV0IGJ0biA9IGl0ZW1baV0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2J1dHRvbicpXHJcbiAgICAgICAgICAgIGZvciAobGV0IG4gPSAwOyBuIDwgYnRuLmxlbmd0aDsgbisrKSB7XHJcbiAgICAgICAgICAgICAgaWYgKCFidG5bbl0gfHwgIWJ0bltuXS5hdHRyaWJ1dGVzKSB7XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBmb3IgKGxldCBtIG9mIGJ0bltuXS5hdHRyaWJ1dGVzKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAobS5uYW1lID09PSAnQGNsaWNrJykge1xyXG4gICAgICAgICAgICAgICAgICBidG5bbl0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgKGZ1blttLnZhbHVlXSkgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGZ1blttLnZhbHVlXSh7IG5hbWU6IHRkWzBdLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2lucHV0JylbMF0udmFsdWUsIHVybDogdGRbMV0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaW5wdXQnKVswXS52YWx1ZSB9LCBpKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgIGJ0bltuXS5hdHRyaWJ1dGVzLnJlbW92ZU5hbWVkSXRlbShtLm5hbWUpXHJcbiAgICAgICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICB2ckRlbGV0ZTogKGkpID0+IHtcclxuICAgICAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnQuc3BsaWNlKGksIDEpXHJcbiAgICAgICAgdGhpcy5hdHRyaWJ1dGVWciA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudFxyXG4gICAgICB9LFxyXG5cclxuICAgICAgY29uZmlybUVkaXQ6ICh2YWx1ZSwgaSkgPT4ge1xyXG4gICAgICAgIGxldCBuYW1lID0gdmFsdWUubmFtZSAmJiB2YWx1ZS5uYW1lLnJlcGxhY2UoL1xccy9nLCBcIlwiKVxyXG4gICAgICAgIGxldCB1cmwgPSB2YWx1ZS51cmwgJiYgdmFsdWUudXJsLnJlcGxhY2UoL1xccy9nLCBcIlwiKVxyXG4gICAgICAgIGlmIChuYW1lICYmIHVybCkge1xyXG4gICAgICAgICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52ci5jb250ZW50W2ldID0gdmFsdWVcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICB3aW5kb3cuRUxFTUVOVCAmJiB3aW5kb3cuRUxFTUVOVC5NZXNzYWdlKHtcclxuICAgICAgICAgICAgbWVzc2FnZTogJ+WQjeensOaIlumTvuaOpeS4jeiDveS4uuepuu+8gScsXHJcbiAgICAgICAgICAgIHR5cGU6ICd3YXJuaW5nJyxcclxuICAgICAgICAgICAgZHVyYXRpb246IDE1MDBcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmF0dHJpYnV0ZVZyID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52ci5jb250ZW50XHJcbiAgICAgIH0sXHJcbiAgICAgIGNhbmNlbEVkaXQ6ICgpID0+IHtcclxuICAgICAgICB0aGlzLmF0dHJpYnV0ZVZyID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52ci5jb250ZW50XHJcbiAgICAgIH0sXHJcbiAgICAgIGZpbGVTZWxlY3Q6ICh2YWx1ZSwgaSkgPT4ge1xyXG4gICAgICAgIGxldCBmaWxlRWxtID0gaXRlbVtpXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdmaWxlLXNlbGVjdCcpWzBdXHJcbiAgICAgICAgZmlsZUVsbS5jbGljaygpXHJcbiAgICAgICAgZmlsZUVsbS5yZW1vdmVFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBmaWxlU2VsZWN0KVxyXG4gICAgICAgIGZpbGVFbG0uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgZmlsZVNlbGVjdClcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgbGV0IGZpbGVTZWxlY3QgPSAoZXZlbnQpID0+IHtcclxuICAgICAgaWYgKGV2ZW50LnRhcmdldC52YWx1ZSkge1xyXG4gICAgICAgIGxldCB0ZCA9IGl0ZW1bZXZlbnQudGFyZ2V0LmdldEF0dHJpYnV0ZSgnaW5kZXgnKV0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndGQnKVxyXG4gICAgICAgIHRkWzFdLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2lucHV0JylbMF0udmFsdWUgPSBldmVudC50YXJnZXQudmFsdWVcclxuICAgICAgICBldmVudC50YXJnZXQudmFsdWUgPSBudWxsXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbS5sZW5ndGg7IGkrKykge1xyXG4gICAgICBsZXQgYnRuID0gaXRlbVtpXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnYnV0dG9uJylcclxuICAgICAgZm9yIChsZXQgbiA9IDA7IG4gPCBidG4ubGVuZ3RoOyBuKyspIHtcclxuICAgICAgICBpZiAoIWJ0bltuXSB8fCAhYnRuW25dLmF0dHJpYnV0ZXMpIHtcclxuICAgICAgICAgIGNvbnRpbnVlXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvciAobGV0IG0gb2YgYnRuW25dLmF0dHJpYnV0ZXMpIHtcclxuICAgICAgICAgIGlmIChtLm5hbWUgPT09ICdAY2xpY2snKSB7XHJcbiAgICAgICAgICAgIGJ0bltuXS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiAoZnVuW20udmFsdWVdKSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgZnVuW20udmFsdWVdKGkpXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgYnRuW25dLmF0dHJpYnV0ZXMucmVtb3ZlTmFtZWRJdGVtKG0ubmFtZSlcclxuICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCBhdHRyaWJ1dGVHb29kcygpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmdvb2RzLmNvbnRlbnRcclxuICB9XHJcblxyXG4gIHNldCBhdHRyaWJ1dGVHb29kcyh2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmdvb2RzLmNvbnRlbnQgPSB2XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgY3JlYXRlKHRoYXQpIHtcclxuICAgIGxldCBwb3NpdGlvbnMgPSB0aGF0Lm9wdGlvbnMucG9zaXRpb25zXHJcbiAgICBsZXQgZnJvbURlZ3JlZXNBcnJheSA9IFtdXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBmcm9tRGVncmVlc0FycmF5LnB1c2gocG9zaXRpb25zW2ldLmxuZywgcG9zaXRpb25zW2ldLmxhdClcclxuICAgIH1cclxuICAgIHRoYXQucG9zaXRpb25zID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXNBcnJheShmcm9tRGVncmVlc0FycmF5KVxyXG4gICAgbGV0IHBvc2l0aW9uc0EgPSB0aGF0LmNvbXB1dGVBdHRhY2tBcnJvdyh0aGF0Lm9wdGlvbnMucG9zaXRpb25zKVxyXG4gICAgaWYgKHBvc2l0aW9uc0EubGVuZ3RoID09IDApIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHBvaW50cyA9IFtbXV1cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9zaXRpb25zQS5sZW5ndGg7IGkrKykge1xyXG4gICAgICBsZXQgcG9zaXRpb24gPSB0aGF0LmNhcnRlc2lhbjNUb3dnczg0KHBvc2l0aW9uc0FbaV0sIHRoYXQuc2RrLnZpZXdlcilcclxuICAgICAgcG9pbnRzWzBdLnB1c2goW3Bvc2l0aW9uLmxuZywgcG9zaXRpb24ubGF0XSlcclxuICAgIH1cclxuICAgIGxldCBwb3NpdGlvbiA9IHRoYXQuY2FydGVzaWFuM1Rvd2dzODQocG9zaXRpb25zQVswXSwgdGhhdC5zZGsudmlld2VyKVxyXG4gICAgcG9pbnRzWzBdLnB1c2goW3Bvc2l0aW9uLmxuZywgcG9zaXRpb24ubGF0XSlcclxuICAgIGxldCBwb2x5Z29uID0gdHVyZi5wb2x5Z29uKHBvaW50cyk7XHJcbiAgICAvLyBsZXQgY2VudHJvaWQgPSB0dXJmLmNlbnRyb2lkKHBvbHlnb24pO1xyXG4gICAgbGV0IGNlbnRyb2lkID0gdHVyZi5wb2ludE9uRmVhdHVyZShwb2x5Z29uKTtcclxuXHJcblxyXG4gICAgbGV0IGdyb3VuZFxyXG4gICAgbGV0IGhlaWdodCA9IDBcclxuXHJcbiAgICBzd2l0Y2ggKHRoYXQub3B0aW9ucy5oZWlnaHRNb2RlKSB7XHJcbiAgICAgIGNhc2UgJzAnOlxyXG4gICAgICBjYXNlIDA6XHJcbiAgICAgICAgZ3JvdW5kID0gZmFsc2VcclxuICAgICAgICBicmVha1xyXG4gICAgICBjYXNlICcxJzpcclxuICAgICAgY2FzZSAxOlxyXG4gICAgICAgIGhlaWdodCA9IHRoYXQuc2RrLnZpZXdlci5zY2VuZS5nbG9iZS5nZXRIZWlnaHQoQ2VzaXVtLkNhcnRvZ3JhcGhpYy5mcm9tRGVncmVlcyhjZW50cm9pZC5nZW9tZXRyeS5jb29yZGluYXRlc1swXSwgY2VudHJvaWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMV0pKSB8fCAwXHJcbiAgICAgICAgZ3JvdW5kID0gZmFsc2VcclxuICAgICAgICBicmVha1xyXG4gICAgICBjYXNlICcyJzpcclxuICAgICAgY2FzZSAyOlxyXG4gICAgICAgIGdyb3VuZCA9IHRydWVcclxuICAgICAgICBicmVha1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghdGhhdC5vcHRpb25zLmxhYmVsLnBvc2l0aW9uKSB7XHJcbiAgICAgIHRoYXQub3B0aW9ucy5sYWJlbC5wb3NpdGlvbiA9IHsgbG5nOiBjZW50cm9pZC5nZW9tZXRyeS5jb29yZGluYXRlc1swXSwgbGF0OiBjZW50cm9pZC5nZW9tZXRyeS5jb29yZGluYXRlc1sxXSwgYWx0OiB0aGF0LmhlaWdodCArIGhlaWdodCB9XHJcbiAgICB9XHJcbiAgICB0aGF0Lm9wdGlvbnMubGFiZWwuZ3JvdW5kID0gZ3JvdW5kXHJcblxyXG4gICAgbGV0IGZyb21EZWdyZWVzQXJyYXkyID0gW11cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9pbnRzWzBdLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGZyb21EZWdyZWVzQXJyYXkyLnB1c2goXHJcbiAgICAgICAgcG9pbnRzWzBdW2ldWzBdLFxyXG4gICAgICAgIHBvaW50c1swXVtpXVsxXSxcclxuICAgICAgICB0aGF0LmhlaWdodCArIGhlaWdodFxyXG4gICAgICApXHJcbiAgICB9XHJcblxyXG4gICAgbGV0IG1hdGVyaWFsID0gQ2VzaXVtLkNvbG9yLmZyb21Dc3NDb2xvclN0cmluZyh0aGF0Lm9wdGlvbnMuY29sb3IpXHJcbiAgICBpZiAodGhhdC5zZGsudmlld2VyLnNjZW5lLm1vZGUgPT09IDIpIHtcclxuICAgICAgZ3JvdW5kID0gZmFsc2VcclxuICAgICAgbWF0ZXJpYWwgPSBuZXcgQ2VzaXVtLkN1c3RvbUNvbG9yTWF0ZXJpYWxTb3VyY2Uoe1xyXG4gICAgICAgIGNvbG9yOiB0aGF0Lm9wdGlvbnMuY29sb3JcclxuICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgICB0aGF0LnBvc2l0aW9uc0ggPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlc0FycmF5SGVpZ2h0cyhmcm9tRGVncmVlc0FycmF5MilcclxuXHJcbiAgICB0aGF0LmVudGl0eSA9IHRoYXQuc2RrLnZpZXdlci5lbnRpdGllcy5hZGQoe1xyXG4gICAgICBzaG93OiB0aGF0Lm9wdGlvbnMuc2hvdyxcclxuICAgICAgaWQ6IHRoYXQub3B0aW9ucy5pZCxcclxuICAgICAgcG9seWdvbjoge1xyXG4gICAgICAgIGhpZXJhcmNoeTogIWdyb3VuZCA/IG5ldyBDZXNpdW0uUG9seWdvbkhpZXJhcmNoeSh0aGF0LnBvc2l0aW9uc0gpIDogbmV3IENlc2l1bS5Qb2x5Z29uSGllcmFyY2h5KHBvc2l0aW9uc0EpLFxyXG4gICAgICAgIHBlclBvc2l0aW9uSGVpZ2h0OiAhZ3JvdW5kID8gdHJ1ZSA6IGZhbHNlLFxyXG4gICAgICAgIG1hdGVyaWFsOiBtYXRlcmlhbCxcclxuICAgICAgICB6SW5kZXg6IHRoYXQuc2RrLl9lbnRpdHlaSW5kZXhcclxuICAgICAgfSxcclxuICAgICAgcG9seWxpbmU6IHtcclxuICAgICAgICBwb3NpdGlvbnM6IFsuLi50aGF0LnBvc2l0aW9uc0gsIHRoYXQucG9zaXRpb25zSFswXSwgdGhhdC5wb3NpdGlvbnNIWzFdXSxcclxuICAgICAgICB3aWR0aDogdGhhdC5vcHRpb25zLmxpbmUud2lkdGgsXHJcbiAgICAgICAgbWF0ZXJpYWw6IENlc2l1bS5Db2xvci5mcm9tQ3NzQ29sb3JTdHJpbmcodGhhdC5vcHRpb25zLmxpbmUuY29sb3IpLFxyXG4gICAgICAgIGNsYW1wVG9Hcm91bmQ6ICFncm91bmQgPyBmYWxzZSA6IHRydWUsXHJcbiAgICAgICAgYXJjVHlwZTogIWdyb3VuZCA/IENlc2l1bS5BcmNUeXBlLk5PTkUgOiBDZXNpdW0uQXJjVHlwZS5HRU9ERVNJQyxcclxuICAgICAgICB6SW5kZXg6IHRoYXQuc2RrLl9lbnRpdHlaSW5kZXhcclxuICAgICAgfSxcclxuICAgIH0pXHJcbiAgICB0aGF0LnNkay5fZW50aXR5WkluZGV4KytcclxuICAgIEF0dGFja0Fycm93T2JqZWN0LmNyZWF0ZUxhYmVsKHRoYXQpXHJcblxyXG4gICAgbGV0IHBvczg0ID0gW11cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9zaXRpb25zQS5sZW5ndGg7IGkrKykge1xyXG4gICAgICBwb3M4NC5wdXNoKHRoYXQuY2FydGVzaWFuM1Rvd2dzODQocG9zaXRpb25zQVtpXSwgdGhhdC5zZGsudmlld2VyKSlcclxuICAgIH1cclxuICAgIHRoYXQub3B0aW9ucy5hcmVhQnlNZXRlciA9IHRoYXQuY29tcHV0ZUFyZWEocG9zODQpO1xyXG4gICAgc3dpdGNoICh0aGF0Lm9wdGlvbnNbJ2FyZWEtdW5pdCddKSB7XHJcbiAgICAgIGNhc2UgJ+W5s+aWueexsyc6XHJcbiAgICAgICAgdGhhdC5vcHRpb25zLmFyZWEgPSB0aGF0Lm9wdGlvbnMuYXJlYUJ5TWV0ZXJcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAn5bmz5pa55Y2D57GzJzpcclxuICAgICAgICB0aGF0Lm9wdGlvbnMuYXJlYSA9IE51bWJlcigodGhhdC5vcHRpb25zLmFyZWFCeU1ldGVyIC8gMTAwMDAwMCkudG9GaXhlZCg4KSlcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAn5LqpJzpcclxuICAgICAgICB0aGF0Lm9wdGlvbnMuYXJlYSA9IE51bWJlcigodGhhdC5vcHRpb25zLmFyZWFCeU1ldGVyIC8gNjY2LjY2NjY2NjcpLnRvRml4ZWQoNCkpXHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ+WFrOmhtyc6XHJcbiAgICAgICAgdGhhdC5vcHRpb25zLmFyZWEgPSBOdW1iZXIoKHRoYXQub3B0aW9ucy5hcmVhQnlNZXRlciAvIDEwMDAwKS50b0ZpeGVkKDYpKVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHRoYXQub3B0aW9ucy5hcmVhID0gdGhhdC5vcHRpb25zLmFyZWFCeU1ldGVyXHJcbiAgICB9XHJcbiAgICBzeW5jRGF0YSh0aGF0LnNkaywgdGhhdC5vcHRpb25zLmlkKVxyXG4gICAgaWYgKHRoYXQub3B0aW9ucy5zaG93KSB7XHJcblxyXG4gICAgICBzZXRTcGxpdERpcmVjdGlvbigwLCB0aGF0Lm9wdGlvbnMuaWQpXHJcbiAgICB9XHJcblxyXG4gICAgdGhhdC5zcHJlYWRTdGF0ZSA9IHRoYXQub3B0aW9ucy5zcHJlYWRTdGF0ZVxyXG4gIH1cclxuXHJcbiAgc3RhdGljIGFzeW5jIGNyZWF0ZUxhYmVsKHRoYXQpIHtcclxuICAgIC8vIOagh+etvlxyXG4gICAgdGhhdC5sYWJlbCA9IG5ldyBMYWJlbE9iamVjdCh0aGF0LnNkaywge1xyXG4gICAgICBpZDogdGhhdC5vcHRpb25zLmlkLFxyXG4gICAgICBzaG93OiB0aGF0Lm9wdGlvbnMuc2hvdyA/IHRoYXQub3B0aW9ucy5sYWJlbC5zaG93IDogZmFsc2UsXHJcbiAgICAgIHBvc2l0aW9uOiBbdGhhdC5vcHRpb25zLmxhYmVsLnBvc2l0aW9uLmxuZywgdGhhdC5vcHRpb25zLmxhYmVsLnBvc2l0aW9uLmxhdCwgdGhhdC5vcHRpb25zLmxhYmVsLnBvc2l0aW9uLmFsdF0sXHJcbiAgICAgIHRleHQ6IHRoYXQub3B0aW9ucy5uYW1lLFxyXG4gICAgICBmb250U2l6ZTogdGhhdC5vcHRpb25zLmxhYmVsLmZvbnRTaXplLFxyXG4gICAgICBmb250RmFtaWx5OiB0aGF0Lm9wdGlvbnMubGFiZWwuZm9udEZhbWlseSxcclxuICAgICAgY29sb3I6IHRoYXQub3B0aW9ucy5sYWJlbC5jb2xvcixcclxuICAgICAgcGl4ZWxPZmZzZXQ6IHRoYXQub3B0aW9ucy5sYWJlbC5waXhlbE9mZnNldCxcclxuICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGF0Lm9wdGlvbnMubGFiZWwuYmFja2dyb3VuZENvbG9yLFxyXG4gICAgICBsaW5lQ29sb3I6IHRoYXQub3B0aW9ucy5sYWJlbC5saW5lQ29sb3IsXHJcbiAgICAgIGxpbmVXaWR0aDogdGhhdC5vcHRpb25zLmxhYmVsLmxpbmVXaWR0aCxcclxuICAgICAgc2NhbGVCeURpc3RhbmNlOiB0aGF0Lm9wdGlvbnMubGFiZWwuc2NhbGVCeURpc3RhbmNlLFxyXG4gICAgICBuZWFyOiB0aGF0Lm9wdGlvbnMubGFiZWwubmVhcixcclxuICAgICAgZmFyOiB0aGF0Lm9wdGlvbnMubGFiZWwuZmFyLFxyXG4gICAgICBncm91bmQ6IHRoYXQub3B0aW9ucy5sYWJlbC5ncm91bmQsXHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgLy8g57yW6L6R5qGGXHJcbiAgYXN5bmMgZWRpdChzdGF0ZSkge1xyXG4gICAgaWYgKHRoaXMuX2Vycm9yKSB7XHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG4gICAgbGV0IF90aGlzID0gdGhpc1xyXG4gICAgdGhpcy5vcmlnaW5hbE9wdGlvbnMgPSB0aGlzLmRlZXBDb3B5T2JqKHRoaXMub3B0aW9ucylcclxuXHJcbiAgICBpZiAodGhpcy5fRGlhbG9nT2JqZWN0ICYmIHRoaXMuX0RpYWxvZ09iamVjdC5jbG9zZSkge1xyXG4gICAgICB0aGlzLl9EaWFsb2dPYmplY3QuY2xvc2UoKVxyXG4gICAgfVxyXG4gICAgaWYgKHN0YXRlKSB7XHJcbiAgICAgIGZ1bmN0aW9uIGNyZWF0ZVNwYXRpYWxJbmZvVGFibGVDb250ZW50KCkge1xyXG4gICAgICAgIGxldCB0YWJsZUVsbSA9IGNvbnRlbnRFbG0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnc3BhdGlhbC1pbmZvLXRhYmxlJylbMF1cclxuICAgICAgICBsZXQgdEJvZHlFbG0gPSB0YWJsZUVsbS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0YWJsZS1ib2R5JylbMF1cclxuICAgICAgICB0Qm9keUVsbS5pbm5lckhUTUwgPSAnJ1xyXG4gICAgICAgIF90aGlzLl9lbG1zLmxuZyA9IFtdXHJcbiAgICAgICAgX3RoaXMuX2VsbXMubG5nSW5wdXQgPSBbXVxyXG4gICAgICAgIF90aGlzLl9lbG1zLmxhdCA9IFtdXHJcbiAgICAgICAgX3RoaXMuX2VsbXMubGF0SW5wdXQgPSBbXVxyXG4gICAgICAgIF90aGlzLl9lbG1zLmFsdCA9IFtdXHJcbiAgICAgICAgX3RoaXMuX2VsbXMuYWx0SW5wdXQgPSBbXVxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgX3RoaXMub3B0aW9ucy5wb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGxldCB0ciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpXHJcbiAgICAgICAgICB0ci5jbGFzc05hbWUgPSAndHInXHJcbiAgICAgICAgICB0ci5pbm5lckhUTUwgPSBgXHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidGRcIj4ke2kgKyAxfTwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRkIGxuZyBhbGlnbi1jZW50ZXJcIj48L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZCBsYXQgYWxpZ24tY2VudGVyXCI+PC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidGQgYWx0IGFsaWduLWNlbnRlclwiPjwvZGl2PlxyXG4gICAgICAgIGBcclxuICAgICAgICAgIGxldCBsbmdCb3ggPSB0ci5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdsbmcnKVswXVxyXG4gICAgICAgICAgbGV0IGxuZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKVxyXG4gICAgICAgICAgbG5nLmlubmVySFRNTCA9IChfdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sbmcpLnRvRml4ZWQoOClcclxuICAgICAgICAgIGxuZ0JveC5hcHBlbmRDaGlsZChsbmcpXHJcbiAgICAgICAgICBsZXQgbG5nSW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpXHJcbiAgICAgICAgICBsbmdJbnB1dC5jbGFzc05hbWUgPSAnaW5wdXQnXHJcbiAgICAgICAgICBsbmdJbnB1dC50eXBlID0gJ251bWJlcidcclxuICAgICAgICAgIGxuZ0lucHV0LnRpdGxlID0gJydcclxuICAgICAgICAgIGxuZ0lucHV0Lm1pbiA9IC0xODBcclxuICAgICAgICAgIGxuZ0lucHV0Lm1heCA9IDE4MFxyXG4gICAgICAgICAgbG5nSW5wdXQudmFsdWUgPSAoX3RoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubG5nKS50b0ZpeGVkKDgpXHJcblxyXG4gICAgICAgICAgbGV0IGxhdEJveCA9IHRyLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xhdCcpWzBdXHJcbiAgICAgICAgICBsZXQgbGF0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpXHJcbiAgICAgICAgICBsYXQuaW5uZXJIVE1MID0gKF90aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxhdCkudG9GaXhlZCg4KVxyXG4gICAgICAgICAgbGF0Qm94LmFwcGVuZENoaWxkKGxhdClcclxuICAgICAgICAgIGxldCBsYXRJbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0JylcclxuICAgICAgICAgIGxhdElucHV0LmNsYXNzTmFtZSA9ICdpbnB1dCdcclxuICAgICAgICAgIGxhdElucHV0LnR5cGUgPSAnbnVtYmVyJ1xyXG4gICAgICAgICAgbGF0SW5wdXQudGl0bGUgPSAnJ1xyXG4gICAgICAgICAgbGF0SW5wdXQubWluID0gLTkwXHJcbiAgICAgICAgICBsYXRJbnB1dC5tYXggPSA5MFxyXG4gICAgICAgICAgbGF0SW5wdXQudmFsdWUgPSAoX3RoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubGF0KS50b0ZpeGVkKDgpXHJcblxyXG4gICAgICAgICAgbGV0IGFsdEJveCA9IHRyLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2FsdCcpWzBdXHJcbiAgICAgICAgICBsZXQgYWx0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpXHJcbiAgICAgICAgICBhbHQuaW5uZXJIVE1MID0gKF90aGlzLmhlaWdodCkudG9GaXhlZCgyKVxyXG4gICAgICAgICAgYWx0Qm94LmFwcGVuZENoaWxkKGFsdClcclxuICAgICAgICAgIGxldCBhbHRJbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0JylcclxuICAgICAgICAgIGFsdElucHV0LmNsYXNzTmFtZSA9ICdpbnB1dCdcclxuICAgICAgICAgIGFsdElucHV0LnR5cGUgPSAnbnVtYmVyJ1xyXG4gICAgICAgICAgYWx0SW5wdXQudGl0bGUgPSAnJ1xyXG4gICAgICAgICAgYWx0SW5wdXQubWluID0gLTk5OTk5OTlcclxuICAgICAgICAgIGFsdElucHV0Lm1heCA9IDk5OTk5OTk5OVxyXG4gICAgICAgICAgYWx0SW5wdXQudmFsdWUgPSAoX3RoaXMuaGVpZ2h0KS50b0ZpeGVkKDIpXHJcblxyXG4gICAgICAgICAgbG5nQm94LmFkZEV2ZW50TGlzdGVuZXIoJ2RibGNsaWNrJywgKCkgPT4ge1xyXG4gICAgICAgICAgICBsbmdCb3guaW5uZXJIVE1MID0gJydcclxuICAgICAgICAgICAgbG5nSW5wdXQudmFsdWUgPSBOdW1iZXIoKF90aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxuZykudG9GaXhlZCg4KSlcclxuICAgICAgICAgICAgbG5nQm94LmFwcGVuZENoaWxkKGxuZ0lucHV0KVxyXG4gICAgICAgICAgICBsbmdJbnB1dC5mb2N1cygpXHJcbiAgICAgICAgICAgIGlmIChfdGhpcy5vcGVyYXRlLnBvc2l0aW9uRWRpdGluZykge1xyXG4gICAgICAgICAgICAgIF90aGlzLnBvc2l0aW9uRWRpdGluZyA9IGZhbHNlXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgQXR0YWNrQXJyb3dPYmplY3QuY2xvc2VOb2RlRWRpdChfdGhpcylcclxuICAgICAgICAgICAgX3RoaXMuaGVpZ2h0TW9kZSA9IF90aGlzLmhlaWdodE1vZGVcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICBsbmdJbnB1dC5hZGRFdmVudExpc3RlbmVyKCdibHVyJywgKCkgPT4ge1xyXG4gICAgICAgICAgICBsbmdJbnB1dC52YWx1ZSA9IE51bWJlcigoX3RoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubG5nKS50b0ZpeGVkKDgpKVxyXG4gICAgICAgICAgICBsbmdCb3guaW5uZXJIVE1MID0gJydcclxuICAgICAgICAgICAgbG5nQm94LmFwcGVuZENoaWxkKGxuZylcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICBsbmdJbnB1dC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICgpID0+IHtcclxuICAgICAgICAgICAgX3RoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubG5nID0gTnVtYmVyKE51bWJlcihsbmdJbnB1dC52YWx1ZSkudG9GaXhlZCg4KSlcclxuICAgICAgICAgICAgbG5nLmlubmVySFRNTCA9IF90aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxuZy50b0ZpeGVkKDgpXHJcbiAgICAgICAgICAgIF90aGlzLmhlaWdodCA9IF90aGlzLmhlaWdodFxyXG4gICAgICAgICAgfSlcclxuXHJcbiAgICAgICAgICBsYXRCb3guYWRkRXZlbnRMaXN0ZW5lcignZGJsY2xpY2snLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGxhdEJveC5pbm5lckhUTUwgPSAnJ1xyXG4gICAgICAgICAgICBsYXRJbnB1dC52YWx1ZSA9IE51bWJlcigoX3RoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubGF0KS50b0ZpeGVkKDgpKVxyXG4gICAgICAgICAgICBsYXRCb3guYXBwZW5kQ2hpbGQobGF0SW5wdXQpXHJcbiAgICAgICAgICAgIGxhdElucHV0LmZvY3VzKClcclxuICAgICAgICAgICAgaWYgKF90aGlzLm9wZXJhdGUucG9zaXRpb25FZGl0aW5nKSB7XHJcbiAgICAgICAgICAgICAgX3RoaXMucG9zaXRpb25FZGl0aW5nID0gZmFsc2VcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBBdHRhY2tBcnJvd09iamVjdC5jbG9zZU5vZGVFZGl0KF90aGlzKVxyXG4gICAgICAgICAgICBfdGhpcy5oZWlnaHRNb2RlID0gX3RoaXMuaGVpZ2h0TW9kZVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIGxhdElucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2JsdXInLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGxhdElucHV0LnZhbHVlID0gTnVtYmVyKChfdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sYXQpLnRvRml4ZWQoOCkpXHJcbiAgICAgICAgICAgIGxhdEJveC5pbm5lckhUTUwgPSAnJ1xyXG4gICAgICAgICAgICBsYXRCb3guYXBwZW5kQ2hpbGQobGF0KVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIGxhdElucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKCkgPT4ge1xyXG4gICAgICAgICAgICBfdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sYXQgPSBOdW1iZXIoTnVtYmVyKGxhdElucHV0LnZhbHVlKS50b0ZpeGVkKDgpKVxyXG4gICAgICAgICAgICBsYXQuaW5uZXJIVE1MID0gX3RoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubGF0LnRvRml4ZWQoOClcclxuICAgICAgICAgICAgX3RoaXMuaGVpZ2h0ID0gX3RoaXMuaGVpZ2h0XHJcbiAgICAgICAgICB9KVxyXG5cclxuICAgICAgICAgIGFsdEJveC5hZGRFdmVudExpc3RlbmVyKCdkYmxjbGljaycsICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKF90aGlzLmhlaWdodE1vZGUgPT0gMikge1xyXG4gICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBhbHRCb3guaW5uZXJIVE1MID0gJydcclxuICAgICAgICAgICAgYWx0SW5wdXQudmFsdWUgPSBOdW1iZXIoKF90aGlzLmhlaWdodCkudG9GaXhlZCgyKSlcclxuICAgICAgICAgICAgYWx0Qm94LmFwcGVuZENoaWxkKGFsdElucHV0KVxyXG4gICAgICAgICAgICBhbHRJbnB1dC5mb2N1cygpXHJcbiAgICAgICAgICAgIGlmIChfdGhpcy5vcGVyYXRlLnBvc2l0aW9uRWRpdGluZykge1xyXG4gICAgICAgICAgICAgIF90aGlzLnBvc2l0aW9uRWRpdGluZyA9IGZhbHNlXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgQXR0YWNrQXJyb3dPYmplY3QuY2xvc2VOb2RlRWRpdChfdGhpcylcclxuICAgICAgICAgICAgX3RoaXMuaGVpZ2h0TW9kZSA9IF90aGlzLmhlaWdodE1vZGVcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICBhbHRJbnB1dC5hZGRFdmVudExpc3RlbmVyKCdibHVyJywgKCkgPT4ge1xyXG4gICAgICAgICAgICBhbHRJbnB1dC52YWx1ZSA9IE51bWJlcigoX3RoaXMuaGVpZ2h0KS50b0ZpeGVkKDIpKVxyXG4gICAgICAgICAgICBhbHRCb3guaW5uZXJIVE1MID0gJydcclxuICAgICAgICAgICAgYWx0Qm94LmFwcGVuZENoaWxkKGFsdClcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICBhbHRJbnB1dC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICgpID0+IHtcclxuICAgICAgICAgICAgX3RoaXMuaGVpZ2h0ID0gTnVtYmVyKE51bWJlcihhbHRJbnB1dC52YWx1ZSkudG9GaXhlZCgyKSlcclxuICAgICAgICAgICAgYWx0LmlubmVySFRNTCA9IE51bWJlcihfdGhpcy5oZWlnaHQudG9GaXhlZCgyKSlcclxuICAgICAgICAgIH0pXHJcblxyXG5cclxuICAgICAgICAgIF90aGlzLl9lbG1zLmxuZy5wdXNoKGxuZylcclxuICAgICAgICAgIF90aGlzLl9lbG1zLmxuZ0lucHV0LnB1c2gobG5nSW5wdXQpXHJcbiAgICAgICAgICBfdGhpcy5fZWxtcy5sYXQucHVzaChsYXQpXHJcbiAgICAgICAgICBfdGhpcy5fZWxtcy5sYXRJbnB1dC5wdXNoKGxhdElucHV0KVxyXG4gICAgICAgICAgX3RoaXMuX2VsbXMuYWx0LnB1c2goYWx0KVxyXG4gICAgICAgICAgX3RoaXMuX2VsbXMuYWx0SW5wdXQucHVzaChhbHRJbnB1dClcclxuICAgICAgICAgIHRCb2R5RWxtLmFwcGVuZENoaWxkKHRyKVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0ID0gYXdhaXQgbmV3IERpYWxvZyh0aGlzLnNkaywgdGhpcy5vcHRpb25zLCB7XHJcbiAgICAgICAgdGl0bGU6ICfnrq3lpLTlsZ7mgKcnLCBsZWZ0OiAnMTgwcHgnLCB0b3A6ICcxMDBweCcsXHJcbiAgICAgICAgY29uZmlybUNhbGxCYWNrOiAob3B0aW9ucykgPT4ge1xyXG4gICAgICAgICAgdGhpcy5uYW1lID0gdGhpcy5uYW1lLnRyaW0oKVxyXG4gICAgICAgICAgaWYgKCF0aGlzLm5hbWUpIHtcclxuICAgICAgICAgICAgdGhpcy5uYW1lID0gJ+acquWRveWQjeWvueixoSdcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMub3B0aW9ucy5sYWJlbC5wb3NpdGlvbiA9IHsgbG5nOiB0aGlzLmxhYmVsLnBvc2l0aW9uWzBdLCBsYXQ6IHRoaXMubGFiZWwucG9zaXRpb25bMV0sIGFsdDogdGhpcy5sYWJlbC5wb3NpdGlvblsyXSB9XHJcbiAgICAgICAgICB0aGlzLm9yaWdpbmFsT3B0aW9ucyA9IHRoaXMuZGVlcENvcHlPYmoodGhpcy5vcHRpb25zKVxyXG4gICAgICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0LmNsb3NlKClcclxuICAgICAgICAgIHRoaXMuRGlhbG9nLmNvbmZpcm1DYWxsQmFjayAmJiB0aGlzLkRpYWxvZy5jb25maXJtQ2FsbEJhY2sodGhpcy5vcmlnaW5hbE9wdGlvbnMpXHJcbiAgICAgICAgfSxcclxuICAgICAgICByZXNldENhbGxCYWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnJlc2V0KClcclxuICAgICAgICAgIHRoaXMuRGlhbG9nLnJlc2V0Q2FsbEJhY2sgJiYgdGhpcy5EaWFsb2cucmVzZXRDYWxsQmFjaygpXHJcbiAgICAgICAgfSxcclxuICAgICAgICByZW1vdmVDYWxsQmFjazogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5EaWFsb2cucmVtb3ZlQ2FsbEJhY2sgJiYgdGhpcy5EaWFsb2cucmVtb3ZlQ2FsbEJhY2soKVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgY2xvc2VDYWxsQmFjazogKCkgPT4ge1xyXG4gICAgICAgICAgbGV0IHNwcmVhZFN0YXRlID0gdGhpcy5vcHRpb25zLnNwcmVhZFN0YXRlXHJcbiAgICAgICAgICB0aGlzLnBvc2l0aW9uRWRpdGluZyA9IGZhbHNlXHJcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnNwcmVhZFN0YXRlID0gc3ByZWFkU3RhdGVcclxuICAgICAgICAgICAgdGhpcy5yZXNldCgpXHJcbiAgICAgICAgICB9LCAxMCk7XHJcbiAgICAgICAgICB0aGlzLkRpYWxvZy5jbG9zZUNhbGxCYWNrICYmIHRoaXMuRGlhbG9nLmNsb3NlQ2FsbEJhY2soKVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgc2hvd0NhbGxCYWNrOiAoc2hvdykgPT4ge1xyXG4gICAgICAgICAgdGhpcy5vcHRpb25zLnNob3cgPSBzaG93XHJcbiAgICAgICAgICB0aGlzLm9yaWdpbmFsT3B0aW9ucy5zaG93ID0gc2hvd1xyXG4gICAgICAgICAgdGhpcy5zaG93ID0gc2hvd1xyXG4gICAgICAgICAgdGhpcy5EaWFsb2cuc2hvd0NhbGxCYWNrICYmIHRoaXMuRGlhbG9nLnNob3dDYWxsQmFjaygpXHJcbiAgICAgICAgfSxcclxuICAgICAgICB0cmFuc2xhdGlvbmFsQ2FsbEJhY2s6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMucG9zaXRpb25FZGl0aW5nID0gIXRoaXMucG9zaXRpb25FZGl0aW5nXHJcbiAgICAgICAgfSxcclxuICAgICAgICAvLyDkuozmrKHnvJbovpHlm57osINcclxuICAgICAgICBzZWNvbmRhcnlFZGl0Q2FsbEJhY2s6ICgpID0+IHtcclxuICAgICAgICAgIEF0dGFja0Fycm93T2JqZWN0Lm5vZGVFZGl0KHRoaXMsICgpID0+IHtcclxuICAgICAgICAgICAgY3JlYXRlU3BhdGlhbEluZm9UYWJsZUNvbnRlbnQoKVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICAgIHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5ib2R5LmNsYXNzTmFtZSA9IHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5ib2R5LmNsYXNzTmFtZSArICcgYXR0YWNrQXJyb3cnXHJcbiAgICAgIGxldCBjb250ZW50RWxtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgIGNvbnRlbnRFbG0uaW5uZXJIVE1MID0gaHRtbCh0aGlzKVxyXG4gICAgICB0aGlzLl9EaWFsb2dPYmplY3QuY29udGVudEFwcENoaWxkKGNvbnRlbnRFbG0pXHJcbiAgICAgIHRoaXMuYXR0cmlidXRlVHlwZSA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGVUeXBlXHJcbiAgICAgIHRoaXMuYXR0cmlidXRlQ2FtZXJhID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5jYW1lcmEuY29udGVudFxyXG5cclxuICAgICAgLy8g5Yib5bu65qCH562+6aG1XHJcbiAgICAgIGxldCB0YWJzRWxtID0gbmV3IGN5X3RhYnMoJ2F0dGFjay1hcnJvdy1vYmplY3QtZWRpdC10YWJzJywgdW5kZWZpbmVkLCB0aGlzLnNkaylcclxuICAgICAgLy8g6aKc6Imy57uE5Lu2XHJcbiAgICAgIGxldCBjb2xvclBpY2tlciA9IG5ldyBZSkNvbG9yUGlja2VyKHtcclxuICAgICAgICBlbDogY29udGVudEVsbS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFwiY29sb3JcIilbMF0sXHJcbiAgICAgICAgc2l6ZTogJ21pbmknLC8v6aKc6ImyYm9457G75Z6LXHJcbiAgICAgICAgYWxwaGE6IHRydWUsLy/mmK/lkKblvIDlkK/pgI/mmI7luqZcclxuICAgICAgICBkZWZhdWx0Q29sb3I6IHRoaXMuY29sb3IsXHJcbiAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLC8v5piv5ZCm56aB5q2i5omT5byA6aKc6Imy6YCJ5oup5ZmoXHJcbiAgICAgICAgb3BlblBpY2tlckFuaTogJ29wYWNpdHknLC8v5omT5byA6aKc6Imy6YCJ5oup5Zmo5Yqo55S7XHJcbiAgICAgICAgc3VyZTogKGNvbG9yKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmNvbG9yID0gY29sb3JcclxuICAgICAgICB9LC8v54K55Ye756Gu6K6k5oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgICAgY2xlYXI6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMuY29sb3IgPSAncmdiYSgyNTUsMjU1LDI1NSwxKSdcclxuICAgICAgICB9LC8v54K55Ye75riF56m65oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgIH0pXHJcbiAgICAgIGxldCBsaW5lY29sb3JQaWNrZXIgPSBuZXcgWUpDb2xvclBpY2tlcih7XHJcbiAgICAgICAgZWw6IGNvbnRlbnRFbG0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcImxpbmVDb2xvclwiKVswXSxcclxuICAgICAgICBzaXplOiAnbWluaScsLy/popzoibJib3jnsbvlnotcclxuICAgICAgICBhbHBoYTogdHJ1ZSwvL+aYr+WQpuW8gOWQr+mAj+aYjuW6plxyXG4gICAgICAgIGRlZmF1bHRDb2xvcjogdGhpcy5saW5lQ29sb3IsXHJcbiAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLC8v5piv5ZCm56aB5q2i5omT5byA6aKc6Imy6YCJ5oup5ZmoXHJcbiAgICAgICAgb3BlblBpY2tlckFuaTogJ29wYWNpdHknLC8v5omT5byA6aKc6Imy6YCJ5oup5Zmo5Yqo55S7XHJcbiAgICAgICAgc3VyZTogKGNvbG9yKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmxpbmVDb2xvciA9IGNvbG9yXHJcbiAgICAgICAgfSwvL+eCueWHu+ehruiupOaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICAgIGNsZWFyOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmxpbmVDb2xvciA9ICdyZ2JhKDI1NSwyNTUsMjU1LDEpJ1xyXG4gICAgICAgIH0sLy/ngrnlh7vmuIXnqbrmjInpkq7kuovku7blm57osINcclxuICAgICAgfSlcclxuICAgICAgbGV0IGxhYmVsQ29sb3JQaWNrZXIgPSBuZXcgWUpDb2xvclBpY2tlcih7XHJcbiAgICAgICAgZWw6IGNvbnRlbnRFbG0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcImxhYmVsQ29sb3JcIilbMF0sXHJcbiAgICAgICAgc2l6ZTogJ21pbmknLC8v6aKc6ImyYm9457G75Z6LXHJcbiAgICAgICAgYWxwaGE6IHRydWUsLy/mmK/lkKblvIDlkK/pgI/mmI7luqZcclxuICAgICAgICBkZWZhdWx0Q29sb3I6IHRoaXMubGFiZWxDb2xvcixcclxuICAgICAgICBkaXNhYmxlZDogZmFsc2UsLy/mmK/lkKbnpoHmraLmiZPlvIDpopzoibLpgInmi6nlmahcclxuICAgICAgICBvcGVuUGlja2VyQW5pOiAnb3BhY2l0eScsLy/miZPlvIDpopzoibLpgInmi6nlmajliqjnlLtcclxuICAgICAgICBzdXJlOiAoY29sb3IpID0+IHtcclxuICAgICAgICAgIHRoaXMubGFiZWxDb2xvciA9IGNvbG9yXHJcbiAgICAgICAgfSwvL+eCueWHu+ehruiupOaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICAgIGNsZWFyOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmxhYmVsQ29sb3IgPSAncmdiYSgyNTUsMjU1LDI1NSwxKSdcclxuICAgICAgICB9LC8v54K55Ye75riF56m65oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgIH0pXHJcbiAgICAgIGxldCBsYWJlbGxpbmVDb2xvclBpY2tlciA9IG5ldyBZSkNvbG9yUGlja2VyKHtcclxuICAgICAgICBlbDogY29udGVudEVsbS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFwibGFiZWxMaW5lQ29sb3JcIilbMF0sXHJcbiAgICAgICAgc2l6ZTogJ21pbmknLC8v6aKc6ImyYm9457G75Z6LXHJcbiAgICAgICAgYWxwaGE6IHRydWUsLy/mmK/lkKblvIDlkK/pgI/mmI7luqZcclxuICAgICAgICBkZWZhdWx0Q29sb3I6IHRoaXMubGFiZWxMaW5lQ29sb3IsXHJcbiAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLC8v5piv5ZCm56aB5q2i5omT5byA6aKc6Imy6YCJ5oup5ZmoXHJcbiAgICAgICAgb3BlblBpY2tlckFuaTogJ29wYWNpdHknLC8v5omT5byA6aKc6Imy6YCJ5oup5Zmo5Yqo55S7XHJcbiAgICAgICAgc3VyZTogKGNvbG9yKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmxhYmVsTGluZUNvbG9yID0gY29sb3JcclxuICAgICAgICB9LC8v54K55Ye756Gu6K6k5oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgICAgY2xlYXI6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMubGFiZWxMaW5lQ29sb3IgPSAncmdiYSgyNTUsMjU1LDI1NSwxKSdcclxuICAgICAgICB9LC8v54K55Ye75riF56m65oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgIH0pXHJcbiAgICAgIGxldCBsYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0UGlja2VyID0gbmV3IFlKQ29sb3JQaWNrZXIoe1xyXG4gICAgICAgIGVsOiBjb250ZW50RWxtLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXCJsYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0XCIpWzBdLFxyXG4gICAgICAgIHNpemU6ICdtaW5pJyxcclxuICAgICAgICBhbHBoYTogdHJ1ZSxcclxuICAgICAgICBkZWZhdWx0Q29sb3I6IHRoaXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JTdGFydCxcclxuICAgICAgICBkaXNhYmxlZDogZmFsc2UsXHJcbiAgICAgICAgb3BlblBpY2tlckFuaTogJ29wYWNpdHknLFxyXG4gICAgICAgIHN1cmU6IChjb2xvcikgPT4ge1xyXG4gICAgICAgICAgdGhpcy5sYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0ID0gY29sb3JcclxuICAgICAgICB9LFxyXG4gICAgICAgIGNsZWFyOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmxhYmVsQmFja2dyb3VuZENvbG9yU3RhcnQgPSAncmdiYSgyNTUsMjU1LDI1NSwxKSdcclxuICAgICAgICB9LFxyXG4gICAgICB9KVxyXG4gICAgICBsZXQgbGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmRQaWNrZXIgPSBuZXcgWUpDb2xvclBpY2tlcih7XHJcbiAgICAgICAgZWw6IGNvbnRlbnRFbG0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcImxhYmVsQmFja2dyb3VuZENvbG9yRW5kXCIpWzBdLFxyXG4gICAgICAgIHNpemU6ICdtaW5pJyxcclxuICAgICAgICBhbHBoYTogdHJ1ZSxcclxuICAgICAgICBkZWZhdWx0Q29sb3I6IHRoaXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmQsXHJcbiAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLFxyXG4gICAgICAgIG9wZW5QaWNrZXJBbmk6ICdvcGFjaXR5JyxcclxuICAgICAgICBzdXJlOiAoY29sb3IpID0+IHtcclxuICAgICAgICAgIHRoaXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmQgPSBjb2xvclxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgY2xlYXI6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmQgPSAncmdiYSgyNTUsMjU1LDI1NSwxKSdcclxuICAgICAgICB9LFxyXG4gICAgICB9KVxyXG4gICAgICBsZXQgYWxsX2VsbSA9IGNvbnRlbnRFbG0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCIqXCIpXHJcbiAgICAgIEF0dGFja0Fycm93T2JqZWN0LkV2ZW50QmluZGluZyh0aGlzLCBhbGxfZWxtKVxyXG4gICAgICB0aGlzLl9lbG1zLmNvbG9yID0gW2NvbG9yUGlja2VyXVxyXG4gICAgICB0aGlzLl9lbG1zLmxpbmVDb2xvciA9IFtsaW5lY29sb3JQaWNrZXJdXHJcbiAgICAgIHRoaXMuX2VsbXMubGFiZWxDb2xvciA9IFtsYWJlbENvbG9yUGlja2VyXVxyXG4gICAgICB0aGlzLl9lbG1zLmxhYmVsTGluZUNvbG9yID0gW2xhYmVsbGluZUNvbG9yUGlja2VyXVxyXG4gICAgICB0aGlzLl9lbG1zLmxhYmVsQmFja2dyb3VuZENvbG9yU3RhcnQgPSBbbGFiZWxCYWNrZ3JvdW5kQ29sb3JTdGFydFBpY2tlcl1cclxuICAgICAgdGhpcy5fZWxtcy5sYWJlbEJhY2tncm91bmRDb2xvckVuZCA9IFtsYWJlbEJhY2tncm91bmRDb2xvckVuZFBpY2tlcl1cclxuXHJcbiAgICAgIGxldCBoZWlnaHRCb3hFbG0gPSB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdoZWlnaHQtYm94JylbMF1cclxuICAgICAgbGV0IGhlaWdodEVsbSA9IGhlaWdodEJveEVsbS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdoZWlnaHQnKVswXVxyXG4gICAgICBsZXQgaGVpZ2h0Q29uZmlybUVsbSA9IHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2hlaWdodC1jb25maXJtJylbMF1cclxuICAgICAgaGVpZ2h0RWxtLnZhbHVlID0gMTBcclxuICAgICAgaWYgKHRoaXMuaGVpZ2h0TW9kZSA9PSAyKSB7XHJcbiAgICAgICAgaGVpZ2h0Qm94RWxtICYmIChoZWlnaHRCb3hFbG0uY2xhc3NOYW1lID0gJ2lucHV0LW51bWJlciBpbnB1dC1udW1iZXItdW5pdC0xIGhlaWdodC1ib3ggZGlzYWJsZWQnKTtcclxuICAgICAgICBoZWlnaHRDb25maXJtRWxtICYmIGhlaWdodENvbmZpcm1FbG0uc2V0QXR0cmlidXRlKCdkaXNhYmxlZCcsICdkaXNhYmxlZCcpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGhlaWdodEJveEVsbSAmJiAoaGVpZ2h0Qm94RWxtLmNsYXNzTmFtZSA9ICdpbnB1dC1udW1iZXIgaW5wdXQtbnVtYmVyLXVuaXQtMSBoZWlnaHQtYm94Jyk7XHJcbiAgICAgICAgaGVpZ2h0Q29uZmlybUVsbSAmJiBoZWlnaHRDb25maXJtRWxtLnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZWQnKTtcclxuICAgICAgfVxyXG4gICAgICBsZXQgaGVpZ2h0TW9kZURhdGEgPSBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgbmFtZTogJ+a1t+aLlOmrmOW6picsXHJcbiAgICAgICAgICB2YWx1ZTogJ+a1t+aLlOmrmOW6picsXHJcbiAgICAgICAgICBrZXk6ICcwJyxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIG5hbWU6ICfnm7jlr7nlnLDooagnLFxyXG4gICAgICAgICAgdmFsdWU6ICfnm7jlr7nlnLDooagnLFxyXG4gICAgICAgICAga2V5OiAnMScsXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBuYW1lOiAn5L6d6ZmE5qih5Z6LJyxcclxuICAgICAgICAgIHZhbHVlOiAn5L6d6ZmE5qih5Z6LJyxcclxuICAgICAgICAgIGtleTogJzInLFxyXG4gICAgICAgIH1cclxuICAgICAgXVxyXG4gICAgICBsZXQgaGVpZ2h0TW9kZU9iamVjdCA9IGxlZ3AoXHJcbiAgICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcclxuICAgICAgICAgICdoZWlnaHQtbW9kZS1ib3gnXHJcbiAgICAgICAgKVswXSxcclxuICAgICAgICAnLmhlaWdodC1tb2RlJ1xyXG4gICAgICApXHJcbiAgICAgIGlmIChoZWlnaHRNb2RlT2JqZWN0KSB7XHJcbiAgICAgICAgaGVpZ2h0TW9kZU9iamVjdC5sZWdwX3NlYXJjaChoZWlnaHRNb2RlRGF0YSlcclxuICAgICAgICBsZXQgaGVpZ2h0TW9kZURhdGFMZWdwRWxtID0gdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnRcclxuICAgICAgICAgIC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdoZWlnaHQtbW9kZScpWzBdXHJcbiAgICAgICAgICAuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2lucHV0JylbMF1cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhlaWdodE1vZGVEYXRhLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBpZiAoaGVpZ2h0TW9kZURhdGFbaV0ua2V5ID09IHRoaXMuaGVpZ2h0TW9kZSkge1xyXG4gICAgICAgICAgICBoZWlnaHRNb2RlRGF0YUxlZ3BFbG0udmFsdWUgPSBoZWlnaHRNb2RlRGF0YVtpXS52YWx1ZVxyXG4gICAgICAgICAgICBoZWlnaHRNb2RlT2JqZWN0LmxlZ3Bfc2VhcmNoQWN0aXZlKFxyXG4gICAgICAgICAgICAgIGhlaWdodE1vZGVEYXRhW2ldLnZhbHVlXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaGVpZ2h0TW9kZURhdGFMZWdwRWxtLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKCkgPT4ge1xyXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoZWlnaHRNb2RlRGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoaGVpZ2h0TW9kZURhdGFbaV0udmFsdWUgPT09IGhlaWdodE1vZGVEYXRhTGVncEVsbS52YWx1ZSkge1xyXG4gICAgICAgICAgICAgIHRoaXMuaGVpZ2h0TW9kZSA9IGhlaWdodE1vZGVEYXRhW2ldLmtleVxyXG4gICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG5cclxuICAgICAgICBoZWlnaHRFbG0uYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7XHJcbiAgICAgICAgICBzd2l0Y2ggKHRoaXMuaGVpZ2h0TW9kZSkge1xyXG4gICAgICAgICAgICBjYXNlIDA6XHJcbiAgICAgICAgICAgIGNhc2UgJzAnOlxyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIDE6XHJcbiAgICAgICAgICAgIGNhc2UgJzEnOlxyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIDI6XHJcbiAgICAgICAgICAgIGNhc2UgJzInOlxyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcblxyXG4gICAgICAgIHRoaXMuX2VsbXMuaGVpZ2h0ID0gaGVpZ2h0RWxtXHJcbiAgICAgICAgdGhpcy5fZWxtcy5oZWlnaHRCb3ggPSBoZWlnaHRCb3hFbG1cclxuICAgICAgICB0aGlzLl9lbG1zLmhlaWdodE1vZGUgPSBoZWlnaHRNb2RlRGF0YUxlZ3BFbG1cclxuICAgICAgICB0aGlzLl9lbG1zLmhlaWdodENvbmZpcm0gPSBoZWlnaHRDb25maXJtRWxtXHJcbiAgICAgICAgdGhpcy5fZWxtcy5oZWlnaHRNb2RlT2JqZWN0ID0gaGVpZ2h0TW9kZU9iamVjdFxyXG5cclxuICAgICAgICBoZWlnaHRDb25maXJtRWxtLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xyXG4gICAgICAgICAgaWYgKHRoaXMub3BlcmF0ZS5wb3NpdGlvbkVkaXRpbmcpIHtcclxuICAgICAgICAgICAgdGhpcy5wb3NpdGlvbkVkaXRpbmcgPSBmYWxzZVxyXG4gICAgICAgICAgICB0aGlzLmhlaWdodCA9IHRoaXMuaGVpZ2h0ICsgTnVtYmVyKGhlaWdodEVsbS52YWx1ZSlcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBBdHRhY2tBcnJvd09iamVjdC5jbG9zZU5vZGVFZGl0KHRoaXMpXHJcbiAgICAgICAgICAgIHRoaXMuaGVpZ2h0TW9kZSA9IHRoaXMuaGVpZ2h0TW9kZVxyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICB0aGlzLmhlaWdodCA9IHRoaXMuaGVpZ2h0ICsgTnVtYmVyKGhlaWdodEVsbS52YWx1ZSlcclxuICAgICAgICAgICAgfSwgMTAwKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgICB9XHJcblxyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICB0aGlzLmF0dHJpYnV0ZUxpbmsgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudFxyXG4gICAgICAgIHRoaXMuYXR0cmlidXRlVnIgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnRcclxuICAgICAgICB0aGlzLmNhbWVyYVNlbGVjdCAmJiB0aGlzLmNhbWVyYVNlbGVjdCgpXHJcbiAgICAgICAgdGhpcy5nb29kc1NlbGVjdCAmJiB0aGlzLmdvb2RzU2VsZWN0KClcclxuICAgICAgICBsZXQgdGFnRGF0YSA9IHRoaXMuYXR0cmlidXRlU2VsZWN0XHJcbiAgICAgICAgbGV0IGF0dHJpYnV0ZUVsbSA9IHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2F0dHJpYnV0ZS1zZWxlY3QtYm94JylbMF1cclxuICAgICAgICBpZiAoYXR0cmlidXRlRWxtKSB7XHJcbiAgICAgICAgICBsZXQgbGVncE9iamVjdCA9IGxlZ3AoYXR0cmlidXRlRWxtLCBcIi5hdHRyaWJ1dGUtc2VsZWN0XCIpXHJcbiAgICAgICAgICBsZWdwT2JqZWN0LmxlZ3Bfc2VhcmNoKHRhZ0RhdGEpXHJcbiAgICAgICAgICBsZXQgYXR0cmlidXRlU2VsZWN0RWxtID0gdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnYXR0cmlidXRlLXNlbGVjdCcpWzBdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdpbnB1dCcpWzBdXHJcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhZ0RhdGEubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKHRhZ0RhdGFbaV0ua2V5ID09PSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlVHlwZSkge1xyXG4gICAgICAgICAgICAgIGF0dHJpYnV0ZVNlbGVjdEVsbS52YWx1ZSA9IHRhZ0RhdGFbaV0udmFsdWVcclxuICAgICAgICAgICAgICBsZWdwT2JqZWN0LmxlZ3Bfc2VhcmNoQWN0aXZlKHRhZ0RhdGFbaV0udmFsdWUpXHJcbiAgICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYXR0cmlidXRlU2VsZWN0RWxtLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKCkgPT4ge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhZ0RhdGEubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICBpZiAodGFnRGF0YVtpXS52YWx1ZSA9PT0gYXR0cmlidXRlU2VsZWN0RWxtLnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmF0dHJpYnV0ZVR5cGUgPSB0YWdEYXRhW2ldLmtleVxyXG4gICAgICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgbGV0IHVuaXREYXRhID0gW3tcclxuICAgICAgICAgIG5hbWU6ICflubPmlrnnsbMnLFxyXG4gICAgICAgICAgdmFsdWU6ICflubPmlrnnsbMnXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBuYW1lOiAn5bmz5pa55Y2D57GzJyxcclxuICAgICAgICAgIHZhbHVlOiAn5bmz5pa55Y2D57GzJ1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgbmFtZTogJ+S6qScsXHJcbiAgICAgICAgICB2YWx1ZTogJ+S6qSdcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIG5hbWU6ICflhazpobcnLFxyXG4gICAgICAgICAgdmFsdWU6ICflhazpobcnXHJcbiAgICAgICAgfSxcclxuICAgICAgICBdXHJcbiAgICAgICAgbGV0IHVuaXREYXRhTGVncE9iamVjdCA9IGxlZ3AodGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaW5wdXQtc2VsZWN0LXVuaXQtYm94JylbMF0sIFwiLmlucHV0LXNlbGVjdC11bml0XCIpXHJcbiAgICAgICAgaWYgKHVuaXREYXRhTGVncE9iamVjdCkge1xyXG4gICAgICAgICAgdW5pdERhdGFMZWdwT2JqZWN0LmxlZ3Bfc2VhcmNoKHVuaXREYXRhKVxyXG4gICAgICAgICAgbGV0IHVuaXREYXRhTGVncEVsbSA9IHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2lucHV0LXNlbGVjdC11bml0JylbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2lucHV0JylbMF1cclxuICAgICAgICAgIHVuaXREYXRhTGVncEVsbS52YWx1ZSA9IHRoaXMub3B0aW9uc1snYXJlYS11bml0J11cclxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdW5pdERhdGEubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKHVuaXREYXRhW2ldLnZhbHVlID09PSB1bml0RGF0YUxlZ3BFbG0udmFsdWUpIHtcclxuICAgICAgICAgICAgICB1bml0RGF0YUxlZ3BPYmplY3QubGVncF9zZWFyY2hBY3RpdmUodW5pdERhdGFbaV0udmFsdWUpXHJcbiAgICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdW5pdERhdGFMZWdwRWxtLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKCkgPT4ge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHVuaXREYXRhLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgaWYgKHVuaXREYXRhW2ldLnZhbHVlID09PSB1bml0RGF0YUxlZ3BFbG0udmFsdWUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYXJlYVVuaXQgPSB1bml0RGF0YVtpXS52YWx1ZVxyXG4gICAgICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgZm9udERhdGEgPSBnZXRGb250TGlzdCgpXHJcbiAgICAgICAgbGV0IGZvbnRPYmplY3QgPSBsZWdwKFxyXG4gICAgICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcclxuICAgICAgICAgICAgJ2ZvbnQtc2VsZWN0LWJveCdcclxuICAgICAgICAgIClbMF0sXHJcbiAgICAgICAgICAnLmZvbnQtc2VsZWN0J1xyXG4gICAgICAgIClcclxuICAgICAgICBpZiAoZm9udE9iamVjdCkge1xyXG4gICAgICAgICAgZm9udE9iamVjdC5sZWdwX3NlYXJjaChmb250RGF0YSlcclxuICAgICAgICAgIGxldCBmb250RGF0YUxlZ3BFbG0gPSB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudFxyXG4gICAgICAgICAgICAuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnZm9udC1zZWxlY3QnKVswXVxyXG4gICAgICAgICAgICAuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2lucHV0JylbMF1cclxuICAgICAgICAgIGZvbnREYXRhTGVncEVsbS52YWx1ZSA9IGZvbnREYXRhW3RoaXMubGFiZWxGb250RmFtaWx5XS52YWx1ZVxyXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmb250RGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoZm9udERhdGFbaV0udmFsdWUgPT0gZm9udERhdGFMZWdwRWxtLnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgZm9udE9iamVjdC5sZWdwX3NlYXJjaEFjdGl2ZShmb250RGF0YVtpXS52YWx1ZSlcclxuICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBmb250RGF0YUxlZ3BFbG0uYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZm9udERhdGEubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICBpZiAoZm9udERhdGFbaV0udmFsdWUgPT09IGZvbnREYXRhTGVncEVsbS52YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sYWJlbEZvbnRGYW1pbHkgPSBmb250RGF0YVtpXS5rZXlcclxuICAgICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgdGhpcy5fZWxtcy5sYWJlbEZvbnRGYW1pbHkgPSBbZm9udERhdGFMZWdwRWxtXVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY3JlYXRlU3BhdGlhbEluZm9UYWJsZUNvbnRlbnQoKVxyXG5cclxuICAgICAgfSwgMCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAodGhpcy5fRGlhbG9nT2JqZWN0ICYmIHRoaXMuX0RpYWxvZ09iamVjdC5jbG9zZSkge1xyXG4gICAgICAgIHRoaXMuX0RpYWxvZ09iamVjdC5jbG9zZSgpXHJcbiAgICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0ID0gbnVsbFxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZXNldCgpIHtcclxuICAgIGlmICghdGhpcy5lbnRpdHkpIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcbiAgICB0aGlzLm9wdGlvbnMgPSB0aGlzLmRlZXBDb3B5T2JqKHRoaXMub3JpZ2luYWxPcHRpb25zKVxyXG4gICAgdGhpcy5uYW1lID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMubmFtZVxyXG4gICAgdGhpcy5jb2xvciA9IHRoaXMub3JpZ2luYWxPcHRpb25zLmNvbG9yXHJcbiAgICB0aGlzLmxpbmVDb2xvciA9IHRoaXMub3JpZ2luYWxPcHRpb25zLmxpbmUuY29sb3JcclxuICAgIHRoaXMubGluZVdpZHRoID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMubGluZS53aWR0aFxyXG4gICAgdGhpcy5hcmVhID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMuYXJlYVxyXG4gICAgdGhpcy5hcmVhVW5pdCA9IHRoaXMub3JpZ2luYWxPcHRpb25zWydhcmVhLXVuaXQnXVxyXG4gICAgdGhpcy5sYWJlbFNob3cgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5sYWJlbC5zaG93XHJcbiAgICB0aGlzLmxhYmVsQ29sb3IgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5sYWJlbC5jb2xvclxyXG4gICAgdGhpcy5sYWJlbEZvbnRTaXplID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMubGFiZWwuZm9udFNpemVcclxuICAgIHRoaXMubGFiZWxGb250RmFtaWx5ID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMubGFiZWwuZm9udEZhbWlseVxyXG4gICAgdGhpcy5sYWJlbFNjYWxlQnlEaXN0YW5jZSA9IHRoaXMub3JpZ2luYWxPcHRpb25zLmxhYmVsLnNjYWxlQnlEaXN0YW5jZVxyXG4gICAgdGhpcy5sYWJlbE5lYXIgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5sYWJlbC5uZWFyXHJcbiAgICB0aGlzLmxhYmVsRmFyID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMubGFiZWwuZmFyXHJcbiAgICB0aGlzLmxhYmVsTGluZVdpZHRoID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMubGFiZWwubGluZVdpZHRoXHJcbiAgICB0aGlzLmxhYmVsUGl4ZWxPZmZzZXQgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5sYWJlbC5waXhlbE9mZnNldFxyXG4gICAgdGhpcy5sYWJlbExpbmVDb2xvciA9IHRoaXMub3JpZ2luYWxPcHRpb25zLmxhYmVsLmxpbmVDb2xvclxyXG4gICAgdGhpcy5sYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0ID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMubGFiZWwuYmFja2dyb3VuZENvbG9yWzBdXHJcbiAgICB0aGlzLmxhYmVsQmFja2dyb3VuZENvbG9yRW5kID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMubGFiZWwuYmFja2dyb3VuZENvbG9yWzFdXHJcbiAgICB0aGlzLmF0dHJpYnV0ZUxpbmsgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudFxyXG4gICAgdGhpcy5hdHRyaWJ1dGVWciA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudFxyXG4gICAgdGhpcy5hdHRyaWJ1dGVDYW1lcmEgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmNhbWVyYS5jb250ZW50XHJcbiAgICB0aGlzLmF0dHJpYnV0ZUdvb2RzID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5nb29kcy5jb250ZW50XHJcbiAgICB0aGlzLmNhbWVyYVNlbGVjdCAmJiB0aGlzLmNhbWVyYVNlbGVjdCgpXHJcbiAgICB0aGlzLmdvb2RzU2VsZWN0ICYmIHRoaXMuZ29vZHNTZWxlY3QoKVxyXG5cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5vcHRpb25zLnBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBpZiAodGhpcy5fZWxtcy5sbmcgJiYgdGhpcy5fZWxtcy5sbmdbaV0pIHtcclxuICAgICAgICB0aGlzLl9lbG1zLmxuZ1tpXS5pbm5lckhUTUwgPSB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxuZy50b0ZpeGVkKDgpXHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRoaXMuX2VsbXMubGF0ICYmIHRoaXMuX2VsbXMubGF0W2ldKSB7XHJcbiAgICAgICAgdGhpcy5fZWxtcy5sYXRbaV0uaW5uZXJIVE1MID0gdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sYXQudG9GaXhlZCg4KVxyXG4gICAgICB9XHJcbiAgICAgIGlmICh0aGlzLl9lbG1zLmFsdCAmJiB0aGlzLl9lbG1zLmFsdFtpXSkge1xyXG4gICAgICAgIHRoaXMuX2VsbXMuYWx0W2ldLmlubmVySFRNTCA9IE51bWJlcih0aGlzLm9wdGlvbnMuaGVpZ2h0LnRvRml4ZWQoMikpXHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmhlaWdodE1vZGUgPSB0aGlzLmhlaWdodE1vZGVcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubm9kZVBvaW50cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICB0aGlzLnNkay52aWV3ZXIuZW50aXRpZXMucmVtb3ZlKHRoaXMubm9kZVBvaW50c1tpXSlcclxuICAgIH1cclxuICAgIHRoaXMucHJldmlvdXMgPSBudWxsXHJcbiAgICB0aGlzLm5vZGVQb2ludHMgPSBbXVxyXG4gICAgWUouTWVhc3VyZS5TZXRNZWFzdXJlU3RhdHVzKGZhbHNlKVxyXG4gICAgdGhpcy5ldmVudCAmJiB0aGlzLmV2ZW50LmRlc3Ryb3koKVxyXG4gICAgdGhpcy50aXAgJiYgdGhpcy50aXAuZGVzdHJveSgpXHJcblxyXG4gICAgbGV0IHNwcmVhZFN0YXRlID0gdGhpcy5vcHRpb25zLnNwcmVhZFN0YXRlXHJcbiAgICB0aGlzLnJlbW92ZUFuaW1hdGUoKVxyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMubG9vcCA9IHRoaXMub3B0aW9ucy5sb29wXHJcbiAgICAgIHRoaXMuc3ByZWFkU3RhdGUgPSBzcHJlYWRTdGF0ZVxyXG4gICAgICBzeW5jRGF0YSh0aGlzLnNkaywgdGhpcy5vcHRpb25zLmlkKVxyXG4gICAgICBzeW5jU3BsaXREYXRhKHRoaXMuc2RrLCB0aGlzLm9wdGlvbnMuaWQpXHJcbiAgICB9LCAyMDApO1xyXG4gIH1cclxuXHJcblxyXG4gIGFzeW5jIHJlbW92ZSgpIHtcclxuICAgIHRoaXMucmVtb3ZlQW5pbWF0ZSgpXHJcbiAgICB0aGlzLmV2ZW50ICYmIHRoaXMuZXZlbnQuZGVzdHJveSgpXHJcbiAgICB0aGlzLnRpcCAmJiB0aGlzLnRpcC5kZXN0cm95KClcclxuICAgIHRoaXMuZW50aXR5ICYmIHRoaXMuc2RrLnZpZXdlci5lbnRpdGllcy5yZW1vdmUodGhpcy5lbnRpdHkpXHJcbiAgICB0aGlzLmxhYmVsICYmIHRoaXMubGFiZWwucmVtb3ZlKClcclxuICAgIHRoaXMuZW50aXR5ID0gbnVsbFxyXG4gICAgaWYgKHRoaXMuX0RpYWxvZ09iamVjdCAmJiAhdGhpcy5fRGlhbG9nT2JqZWN0LmlzRGVzdHJveSkge1xyXG4gICAgICB0aGlzLl9EaWFsb2dPYmplY3QuY2xvc2UoKVxyXG4gICAgICB0aGlzLl9EaWFsb2dPYmplY3QgPSBudWxsXHJcbiAgICB9XHJcbiAgICBhd2FpdCB0aGlzLnNkay5yZW1vdmVJbmNldGFuY2UodGhpcy5vcHRpb25zLmlkKVxyXG4gICAgYXdhaXQgc3luY0RhdGEodGhpcy5zZGssIHRoaXMub3B0aW9ucy5pZClcclxuICB9XHJcblxyXG4gIF9hZGRMaW5rKCkge1xyXG4gICAgLy8gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZVxyXG4gICAgaWYgKHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xpbmtfYWRkJylbMF0gJiYgdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbGlua19hZGQnKVswXS52YWx1ZSkge1xyXG4gICAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudC5wdXNoKHtcclxuICAgICAgICBuYW1lOiAn6ZO+5o6lJyxcclxuICAgICAgICB1cmw6IHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xpbmtfYWRkJylbMF0udmFsdWVcclxuICAgICAgfSlcclxuICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbGlua19hZGQnKVswXS52YWx1ZSA9ICcnXHJcbiAgICAgIHRoaXMuYXR0cmlidXRlTGluayA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5EaWFsb2cuY2xpY2tBZGRMaW5rICYmIHRoaXMuRGlhbG9nLmNsaWNrQWRkTGluaygpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhZGRBdHRyaWJ1dGVMaW5rKGxpbmspIHtcclxuICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50LnB1c2goe1xyXG4gICAgICBuYW1lOiAn6ZO+5o6lJyxcclxuICAgICAgdXJsOiBsaW5rXHJcbiAgICB9KVxyXG4gICAgdGhpcy5hdHRyaWJ1dGVMaW5rID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnRcclxuICB9XHJcblxyXG4gIF9hZGRScigpIHtcclxuICAgIGlmICh0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd2cl9hZGQnKVswXS52YWx1ZSkge1xyXG4gICAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnQucHVzaCh7XHJcbiAgICAgICAgbmFtZTogJ+WFqOaZr+WbvicgLFxyXG4gICAgICAgIHVybDogdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndnJfYWRkJylbMF0udmFsdWVcclxuICAgICAgfSlcclxuICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndnJfYWRkJylbMF0udmFsdWUgPSAnJ1xyXG4gICAgICB0aGlzLmF0dHJpYnV0ZVZyID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52ci5jb250ZW50XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5EaWFsb2cuY2xpY2tBZGRWciAmJiB0aGlzLkRpYWxvZy5jbGlja0FkZFZyKClcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFkZEF0dHJpYnV0ZVJyKHZyKSB7XHJcbiAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnQucHVzaCh7XHJcbiAgICAgIG5hbWU6ICflhajmma/lm74nICxcclxuICAgICAgdXJsOiB2clxyXG4gICAgfSlcclxuICAgIHRoaXMuYXR0cmlidXRlVnIgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnRcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gKiDpo57liLBcclxuKi9cclxuICBhc3luYyBmbHlUbyhvcHRpb25zID0ge30pIHtcclxuICAgIGlmICh0aGlzLl9lcnJvcikge1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuICAgIHNldEFjdGl2ZVZpZXdlcigwKVxyXG4gICAgY2xvc2VSb3RhdGVBcm91bmQodGhpcy5zZGspXHJcbiAgICBjbG9zZVZpZXdGb2xsb3codGhpcy5zZGspXHJcblxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5jdXN0b21WaWV3ICYmIHRoaXMub3B0aW9ucy5jdXN0b21WaWV3LnJlbGF0aXZlUG9zaXRpb24gJiYgdGhpcy5vcHRpb25zLmN1c3RvbVZpZXcub3JpZW50YXRpb24pIHtcclxuICAgICAgbGV0IG9yaWVudGF0aW9uID0ge1xyXG4gICAgICAgIGhlYWRpbmc6IENlc2l1bS5NYXRoLnRvUmFkaWFucyh0aGlzLm9wdGlvbnMuY3VzdG9tVmlldy5vcmllbnRhdGlvbi5oZWFkaW5nIHx8IDAuMCksXHJcbiAgICAgICAgcGl0Y2g6IENlc2l1bS5NYXRoLnRvUmFkaWFucyh0aGlzLm9wdGlvbnMuY3VzdG9tVmlldy5vcmllbnRhdGlvbi5waXRjaCB8fCAtNjAuMCksXHJcbiAgICAgICAgcm9sbDogQ2VzaXVtLk1hdGgudG9SYWRpYW5zKHRoaXMub3B0aW9ucy5jdXN0b21WaWV3Lm9yaWVudGF0aW9uLnJvbGwgfHwgMC4wKVxyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgbG5nID0gdGhpcy5vcHRpb25zLmN1c3RvbVZpZXcucmVsYXRpdmVQb3NpdGlvbi5sbmdcclxuICAgICAgbGV0IGxhdCA9IHRoaXMub3B0aW9ucy5jdXN0b21WaWV3LnJlbGF0aXZlUG9zaXRpb24ubGF0XHJcbiAgICAgIGxldCBhbHQgPSB0aGlzLm9wdGlvbnMuY3VzdG9tVmlldy5yZWxhdGl2ZVBvc2l0aW9uLmFsdFxyXG4gICAgICBsZXQgZGVzdGluYXRpb24gPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlcyhsbmcsIGxhdCwgYWx0KVxyXG5cclxuICAgICAgbGV0IHBvc2l0aW9uID0geyBsbmc6IDAsIGxhdDogMCB9XHJcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMucG9zaXRpb24pIHtcclxuICAgICAgICBwb3NpdGlvbiA9IHsgLi4udGhpcy5vcHRpb25zLnBvc2l0aW9uIH1cclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmICh0aGlzLm9wdGlvbnMucG9zaXRpb25zKSB7XHJcbiAgICAgICAgcG9zaXRpb24gPSB7IC4uLnRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0gfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKHRoaXMub3B0aW9ucy5jZW50ZXIpIHtcclxuICAgICAgICBwb3NpdGlvbiA9IHsgLi4udGhpcy5vcHRpb25zLmNlbnRlciB9XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAodGhpcy5vcHRpb25zLnN0YXJ0KSB7XHJcbiAgICAgICAgcG9zaXRpb24gPSB7IC4uLnRoaXMub3B0aW9ucy5zdGFydCB9XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgnbG5nJykpIHtcclxuICAgICAgICAgIHBvc2l0aW9uLmxuZyA9IHRoaXMub3B0aW9ucy5sbmdcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgnbGF0JykpIHtcclxuICAgICAgICAgIHBvc2l0aW9uLmxhdCA9IHRoaXMub3B0aW9ucy5sYXRcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgnYWx0JykpIHtcclxuICAgICAgICAgIHBvc2l0aW9uLmFsdCA9IHRoaXMub3B0aW9ucy5hbHRcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgLy8g5aaC5p6c5rKh5pyJ6auY5bqm5YC877yM5YiZ6I635Y+W57Sn6LS06auY5bqm6K6h566XXHJcbiAgICAgIGlmICghcG9zaXRpb24uaGFzT3duUHJvcGVydHkoJ2FsdCcpKSB7XHJcbiAgICAgICAgcG9zaXRpb24uYWx0ID0gYXdhaXQgdGhpcy5nZXRDbGFtcFRvSGVpZ2h0KHBvc2l0aW9uKVxyXG4gICAgICB9XHJcbiAgICAgIGxuZyA9IHRoaXMub3B0aW9ucy5jdXN0b21WaWV3LnJlbGF0aXZlUG9zaXRpb24ubG5nICsgcG9zaXRpb24ubG5nXHJcbiAgICAgIGxhdCA9IHRoaXMub3B0aW9ucy5jdXN0b21WaWV3LnJlbGF0aXZlUG9zaXRpb24ubGF0ICsgcG9zaXRpb24ubGF0XHJcbiAgICAgIGFsdCA9IHRoaXMub3B0aW9ucy5jdXN0b21WaWV3LnJlbGF0aXZlUG9zaXRpb24uYWx0ICsgcG9zaXRpb24uYWx0XHJcbiAgICAgIGRlc3RpbmF0aW9uID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXMobG5nLCBsYXQsIGFsdClcclxuICAgICAgdGhpcy5zZGsudmlld2VyLmNhbWVyYS5mbHlUbyh7XHJcbiAgICAgICAgZGVzdGluYXRpb246IGRlc3RpbmF0aW9uLFxyXG4gICAgICAgIG9yaWVudGF0aW9uOiBvcmllbnRhdGlvblxyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGxldCBwb3NpdGlvbkFycmF5ID0gW11cclxuICAgICAgbGV0IGdyb3VuZFxyXG4gICAgICBzd2l0Y2ggKHRoaXMuaGVpZ2h0TW9kZSkge1xyXG4gICAgICAgIGNhc2UgMDpcclxuICAgICAgICBjYXNlICcwJzpcclxuICAgICAgICAgIGdyb3VuZCA9IGZhbHNlXHJcbiAgICAgICAgICBicmVha1xyXG4gICAgICAgIGNhc2UgMTpcclxuICAgICAgICBjYXNlICcxJzpcclxuICAgICAgICAgIGdyb3VuZCA9IGZhbHNlXHJcbiAgICAgICAgICBicmVha1xyXG4gICAgICAgIGNhc2UgMjpcclxuICAgICAgICBjYXNlICcyJzpcclxuICAgICAgICAgIGdyb3VuZCA9IHRydWVcclxuICAgICAgICAgIGJyZWFrXHJcbiAgICAgIH1cclxuICAgICAgaWYgKGdyb3VuZCkge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5vcHRpb25zLnBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgbGV0IGhlaWdodCA9IGF3YWl0IHRoaXMuZ2V0Q2xhbXBUb0hlaWdodCh0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldKVxyXG4gICAgICAgICAgbGV0IGEgPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlcyhcclxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sbmcsXHJcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubGF0LFxyXG4gICAgICAgICAgICBoZWlnaHRcclxuICAgICAgICAgIClcclxuICAgICAgICAgIHBvc2l0aW9uQXJyYXkucHVzaChhLngsIGEueSwgYS56KVxyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpZiAodGhpcy5wb3NpdGlvbnNIKSB7XHJcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucG9zaXRpb25zSC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBwb3NpdGlvbkFycmF5LnB1c2godGhpcy5wb3NpdGlvbnNIW2ldLngsIHRoaXMucG9zaXRpb25zSFtpXS55LCB0aGlzLnBvc2l0aW9uc0hbaV0ueilcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgbGV0IEJvdW5kaW5nU3BoZXJlID0gQ2VzaXVtLkJvdW5kaW5nU3BoZXJlLmZyb21WZXJ0aWNlcyhwb3NpdGlvbkFycmF5KVxyXG4gICAgICB0aGlzLnNkay52aWV3ZXIuY2FtZXJhLmZseVRvQm91bmRpbmdTcGhlcmUoQm91bmRpbmdTcGhlcmUsIHtcclxuICAgICAgICBvZmZzZXQ6IG9wdGlvbnMub3JpZW50YXRpb24gfHwge1xyXG4gICAgICAgICAgaGVhZGluZzogQ2VzaXVtLk1hdGgudG9SYWRpYW5zKDAuMCksXHJcbiAgICAgICAgICBwaXRjaDogQ2VzaXVtLk1hdGgudG9SYWRpYW5zKC05MC4wKSxcclxuICAgICAgICAgIHJvbGw6IENlc2l1bS5NYXRoLnRvUmFkaWFucygwLjApXHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICog5omT5byA5a+M5paH5pys5qGGXHJcbiAgICovXHJcbiAgb3BlblJpY2hUZXh0RWRpdG9yKGUpIHtcclxuICAgIC8vIHZhciB1ZSA9IFVFLmdldEVkaXRvcignYXBwJyk7XHJcbiAgICByaWNoVGV4dC5vcGVuKHRoaXMub3B0aW9ucy5pZCwgdGhpcy5vcHRpb25zLm5hbWUsIHRoaXMub3B0aW9ucy5yaWNoVGV4dENvbnRlbnQpXHJcbiAgICByaWNoVGV4dC5wcmltYXJ5Q2FsbEJhY2sgPSAoY29udGVudCkgPT4ge1xyXG4gICAgICB0aGlzLm9wdGlvbnMucmljaFRleHRDb250ZW50ID0gY29udGVudFxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqQGRlc2Mg5omT5byA5bmz56e75Yqf6IO9XHJcbiAgICpcclxuICAgKiBAbWVtYmVyT2YgU291cmNlXHJcbiAgICogQHBhcmFtIHN0YXR1cyB7Ym9vbGVhbn1cclxuICAgKlxyXG4gICAqICovXHJcbiAgc2V0IHBvc2l0aW9uRWRpdGluZyhzdGF0dXMpIHtcclxuICAgIGlmIChZSi5NZWFzdXJlLkdldE1lYXN1cmVTdGF0dXMoKSB8fCAhdGhpcy5zZGsgfHwgIXRoaXMuc2RrLnZpZXdlciB8fCAhdGhpcy5lbnRpdHkpIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcbiAgICB0aGlzLnJlbW92ZUFuaW1hdGUoKVxyXG4gICAgbGV0IF90aGlzID0gdGhpc1xyXG4gICAgdGhpcy5ldmVudCAmJiB0aGlzLmV2ZW50LmRlc3Ryb3koKVxyXG4gICAgdGhpcy5ldmVudCA9IG5ldyBNb3VzZUV2ZW50KHRoaXMuc2RrKVxyXG4gICAgdGhpcy5vcGVyYXRlLnBvc2l0aW9uRWRpdGluZyA9IHN0YXR1c1xyXG4gICAgaWYgKHN0YXR1cyA9PT0gdHJ1ZSkge1xyXG4gICAgICB0aGlzLnByZXZpb3VzID0ge1xyXG4gICAgICAgIHBvc2l0aW9uczogWy4uLnRoaXMucG9zaXRpb25zXVxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMudGlwICYmIHRoaXMudGlwLmRlc3Ryb3koKVxyXG4gICAgICB0aGlzLnRpcCA9IG5ldyBNb3VzZVRpcCgn54K55Ye76byg5qCH5bem6ZSu56Gu6K6k77yM5Y+z6ZSu5Y+W5raIJywgdGhpcy5zZGspXHJcbiAgICAgIHRoaXMubGFiZWwgJiYgKHRoaXMubGFiZWwuZW50aXR5LmJpbGxib2FyZC5jb2xvciA9IENlc2l1bS5Db2xvci5mcm9tQ3NzQ29sb3JTdHJpbmcoYHJnYmEoMjU1LDI1NSwyNTUsMC45KWApKVxyXG4gICAgICB0aGlzLnBpY2tpbmcgPSBmYWxzZVxyXG4gICAgICBsZXQgYXJyYXkgPSBbXVxyXG4gICAgICBsZXQgcG9zaXRpb25zID0gWy4uLnRoaXMucG9zaXRpb25zXVxyXG4gICAgICBsZXQgZGlzcGFyaXR5ID0gW11cclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBsZXQgcG9zaXRpb24gPSB0aGlzLmNhcnRlc2lhbjNUb3dnczg0KHBvc2l0aW9uc1tpXSwgdGhpcy5zZGsudmlld2VyKVxyXG4gICAgICAgIGFycmF5LnB1c2goW3Bvc2l0aW9uLmxuZywgcG9zaXRpb24ubGF0XSlcclxuICAgICAgfVxyXG4gICAgICBsZXQgZmlyc3Rwb3NpdGlvbiA9IHRoaXMuY2FydGVzaWFuM1Rvd2dzODQocG9zaXRpb25zWzBdLCB0aGlzLnNkay52aWV3ZXIpXHJcbiAgICAgIGFycmF5LnB1c2goW2ZpcnN0cG9zaXRpb24ubG5nLCBmaXJzdHBvc2l0aW9uLmxhdF0pXHJcbiAgICAgIHZhciBwb2x5Z29uID0gdHVyZi5wb2x5Z29uKFthcnJheV0pO1xyXG4gICAgICB2YXIgY2VudHJvaWQgPSB0dXJmLmNlbnRyb2lkKHBvbHlnb24pO1xyXG4gICAgICBsZXQgY2VudGVyID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXMoLi4uY2VudHJvaWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXMpXHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY2VudGVyLnggLSBwb3NpdGlvbnNbaV0ueFxyXG4gICAgICAgIGRpc3Bhcml0eS5wdXNoKHtcclxuICAgICAgICAgIHg6IGNlbnRlci54IC0gcG9zaXRpb25zW2ldLngsXHJcbiAgICAgICAgICB5OiBjZW50ZXIueSAtIHBvc2l0aW9uc1tpXS55LFxyXG4gICAgICAgICAgejogY2VudGVyLnogLSBwb3NpdGlvbnNbaV0ueixcclxuICAgICAgICB9KVxyXG4gICAgICB9XHJcbiAgICAgIGxldCBuZXdwb3NpdGlvbnMgPSBbXVxyXG4gICAgICB0aGlzLmV2ZW50Lm1vdXNlX21vdmUoKG1vdmVtZW50LCBjYXJ0ZXNpYW4pID0+IHtcclxuICAgICAgICBuZXdwb3NpdGlvbnMgPSBbXVxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGlzcGFyaXR5Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBuZXdwb3NpdGlvbnMucHVzaCh7XHJcbiAgICAgICAgICAgIHg6IGNhcnRlc2lhbi54IC0gZGlzcGFyaXR5W2ldLngsXHJcbiAgICAgICAgICAgIHk6IGNhcnRlc2lhbi55IC0gZGlzcGFyaXR5W2ldLnksXHJcbiAgICAgICAgICAgIHo6IGNhcnRlc2lhbi56IC0gZGlzcGFyaXR5W2ldLnosXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuICAgICAgICAvLyB0aGlzLmxhYmVsLnBvc2l0aW9uID0gW3Bvc2l0aW9uODQubG5nLCBwb3NpdGlvbjg0LmxhdCwgcG9zaXRpb244NC5hbHRdXHJcbiAgICAgICAgdGhpcy50aXAuc2V0UG9zaXRpb24oXHJcbiAgICAgICAgICBjYXJ0ZXNpYW4sXHJcbiAgICAgICAgICBtb3ZlbWVudC5lbmRQb3NpdGlvbi54LFxyXG4gICAgICAgICAgbW92ZW1lbnQuZW5kUG9zaXRpb24ueVxyXG4gICAgICAgIClcclxuICAgICAgfSlcclxuICAgICAgdGhpcy5ldmVudC5tb3VzZV9sZWZ0KChtb3ZlbWVudCwgY2FydGVzaWFuKSA9PiB7XHJcbiAgICAgICAgdGhpcy5ldmVudC5tb3VzZV9tb3ZlKCgpID0+IHsgfSlcclxuICAgICAgICB0aGlzLmV2ZW50Lm1vdXNlX2xlZnQoKCkgPT4geyB9KVxyXG4gICAgICAgIHRoaXMuZXZlbnQubW91c2VfcmlnaHQoKCkgPT4geyB9KVxyXG4gICAgICAgIHRoaXMuZXZlbnQuZ2VzdHVyZV9waW5ja19zdGFydCgoKSA9PiB7IH0pXHJcbiAgICAgICAgbmV3cG9zaXRpb25zID0gW11cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRpc3Bhcml0eS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgbGV0IHBvczMgPSB7XHJcbiAgICAgICAgICAgIHg6IGNhcnRlc2lhbi54IC0gZGlzcGFyaXR5W2ldLngsXHJcbiAgICAgICAgICAgIHk6IGNhcnRlc2lhbi55IC0gZGlzcGFyaXR5W2ldLnksXHJcbiAgICAgICAgICAgIHo6IGNhcnRlc2lhbi56IC0gZGlzcGFyaXR5W2ldLnosXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBuZXdwb3NpdGlvbnMucHVzaChwb3MzKVxyXG4gICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXSA9IHRoaXMuY2FydGVzaWFuM1Rvd2dzODQocG9zMywgdGhpcy5zZGsudmlld2VyKVxyXG4gICAgICAgICAgaWYgKHRoaXMuX2VsbXMubG5nICYmIHRoaXMuX2VsbXMubG5nW2ldKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2VsbXMubG5nW2ldLmlubmVySFRNTCA9IHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubG5nLnRvRml4ZWQoOClcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmICh0aGlzLl9lbG1zLmxhdCAmJiB0aGlzLl9lbG1zLmxhdFtpXSkge1xyXG4gICAgICAgICAgICB0aGlzLl9lbG1zLmxhdFtpXS5pbm5lckhUTUwgPSB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxhdC50b0ZpeGVkKDgpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMucG9zaXRpb25zID0gbmV3cG9zaXRpb25zXHJcbiAgICAgICAgdGhpcy5wcmV2aW91cyA9IHtcclxuICAgICAgICAgIHBvc2l0aW9uczogWy4uLnRoaXMucG9zaXRpb25zXVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnBvc2l0aW9uRWRpdGluZyA9IGZhbHNlXHJcbiAgICAgIH0pXHJcbiAgICAgIHRoaXMuZXZlbnQubW91c2VfcmlnaHQoKG1vdmVtZW50LCBjYXJ0ZXNpYW4pID0+IHtcclxuICAgICAgICB0aGlzLnBvc2l0aW9uRWRpdGluZyA9IGZhbHNlXHJcbiAgICAgIH0pXHJcblxyXG4gICAgICB0aGlzLmV2ZW50Lmdlc3R1cmVfcGluY2tfc3RhcnQoKG1vdmVtZW50LCBjYXJ0ZXNpYW4pID0+IHtcclxuICAgICAgICBsZXQgc3RhcnRUaW1lID0gbmV3IERhdGUoKVxyXG4gICAgICAgIHRoaXMuZXZlbnQuZ2VzdHVyZV9waW5ja19lbmQoKCkgPT4ge1xyXG4gICAgICAgICAgbGV0IGVuZFRpbWUgPSBuZXcgRGF0ZSgpXHJcbiAgICAgICAgICBpZiAoZW5kVGltZSAtIHN0YXJ0VGltZSA+PSA1MDApIHtcclxuICAgICAgICAgICAgLy8g6ZW/5oyJ5Y+W5raIXHJcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb25FZGl0aW5nID0gZmFsc2VcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmV2ZW50Lm1vdXNlX21vdmUoKCkgPT4geyB9KVxyXG4gICAgICAgICAgICB0aGlzLmV2ZW50Lm1vdXNlX2xlZnQoKCkgPT4geyB9KVxyXG4gICAgICAgICAgICB0aGlzLmV2ZW50Lm1vdXNlX3JpZ2h0KCgpID0+IHsgfSlcclxuICAgICAgICAgICAgdGhpcy5ldmVudC5nZXN0dXJlX3BpbmNrX3N0YXJ0KCgpID0+IHsgfSlcclxuICAgICAgICAgICAgbmV3cG9zaXRpb25zID0gW11cclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkaXNwYXJpdHkubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICBsZXQgcG9zMyA9IHtcclxuICAgICAgICAgICAgICAgIHg6IGNhcnRlc2lhbi54IC0gZGlzcGFyaXR5W2ldLngsXHJcbiAgICAgICAgICAgICAgICB5OiBjYXJ0ZXNpYW4ueSAtIGRpc3Bhcml0eVtpXS55LFxyXG4gICAgICAgICAgICAgICAgejogY2FydGVzaWFuLnogLSBkaXNwYXJpdHlbaV0ueixcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgbmV3cG9zaXRpb25zLnB1c2gocG9zMylcclxuICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldID0gdGhpcy5jYXJ0ZXNpYW4zVG93Z3M4NChwb3MzLCB0aGlzLnNkay52aWV3ZXIpXHJcbiAgICAgICAgICAgICAgaWYgKHRoaXMuX2VsbXMubG5nICYmIHRoaXMuX2VsbXMubG5nW2ldKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9lbG1zLmxuZ1tpXS5pbm5lckhUTUwgPSB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxuZy50b0ZpeGVkKDgpXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGlmICh0aGlzLl9lbG1zLmxhdCAmJiB0aGlzLl9lbG1zLmxhdFtpXSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZWxtcy5sYXRbaV0uaW5uZXJIVE1MID0gdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sYXQudG9GaXhlZCg4KVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9ucyA9IG5ld3Bvc2l0aW9uc1xyXG4gICAgICAgICAgICB0aGlzLnByZXZpb3VzID0ge1xyXG4gICAgICAgICAgICAgIHBvc2l0aW9uczogWy4uLnRoaXMucG9zaXRpb25zXVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb25FZGl0aW5nID0gZmFsc2VcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgICB9KVxyXG5cclxuICAgICAgdGhpcy5lbnRpdHkucG9seWdvbi5oaWVyYXJjaHkgPSBuZXcgQ2VzaXVtLkNhbGxiYWNrUHJvcGVydHkoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGxldCBwb3NpdGlvbjg0ID0gW11cclxuICAgICAgICBpZiAobmV3cG9zaXRpb25zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmV3cG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHBvc2l0aW9uODQucHVzaChfdGhpcy5jYXJ0ZXNpYW4zVG93Z3M4NChuZXdwb3NpdGlvbnNbaV0sIF90aGlzLnNkay52aWV3ZXIpKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHBvc2l0aW9uODQucHVzaChfdGhpcy5jYXJ0ZXNpYW4zVG93Z3M4NChwb3NpdGlvbnNbaV0sIF90aGlzLnNkay52aWV3ZXIpKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBfdGhpcy5yZW5ld1Bvc2l0aW9ucyhwb3NpdGlvbjg0KVxyXG4gICAgICAgIHJldHVybiBuZXcgQ2VzaXVtLlBvbHlnb25IaWVyYXJjaHkoX3RoaXMucG9zaXRpb25zSClcclxuICAgICAgfSwgZmFsc2UpXHJcbiAgICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLnBvc2l0aW9ucyA9IG5ldyBDZXNpdW0uQ2FsbGJhY2tQcm9wZXJ0eShmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgcmV0dXJuIFsuLi5fdGhpcy5wb3NpdGlvbnNILCBfdGhpcy5wb3NpdGlvbnNIWzBdLCBfdGhpcy5wb3NpdGlvbnNIWzFdXVxyXG4gICAgICB9LCBmYWxzZSlcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBpZiAodGhpcy5sYWJlbCAmJiB0aGlzLmxhYmVsLmVudGl0eSAmJiB0aGlzLmxhYmVsLmVudGl0eS5iaWxsYm9hcmQpIHtcclxuICAgICAgICB0aGlzLmxhYmVsLmVudGl0eS5iaWxsYm9hcmQuY29sb3IgPSBDZXNpdW0uQ29sb3IuZnJvbUNzc0NvbG9yU3RyaW5nKGByZ2JhKDI1NSwyNTUsMjU1LDEpYClcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnBpY2tpbmcgPSB0cnVlXHJcbiAgICAgIGlmICh0aGlzLmV2ZW50KSB7XHJcbiAgICAgICAgdGhpcy5ldmVudC5tb3VzZV9tb3ZlKCgpID0+IHsgfSlcclxuICAgICAgICB0aGlzLmV2ZW50Lm1vdXNlX2xlZnQoKCkgPT4geyB9KVxyXG4gICAgICAgIHRoaXMuZXZlbnQubW91c2VfcmlnaHQoKCkgPT4geyB9KVxyXG4gICAgICAgIHRoaXMuZXZlbnQuZGVzdHJveSgpXHJcbiAgICAgIH1cclxuICAgICAgdGhpcy50aXAgJiYgdGhpcy50aXAuZGVzdHJveSgpXHJcblxyXG4gICAgICBpZiAoIXRoaXMucHJldmlvdXMpIHtcclxuICAgICAgICB0aGlzLnByZXZpb3VzID0ge1xyXG4gICAgICAgICAgcG9zaXRpb25zOiBbLi4udGhpcy5wb3NpdGlvbnNdXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRoaXMucG9zaXRpb25zID0gWy4uLnRoaXMucHJldmlvdXMucG9zaXRpb25zXVxyXG4gICAgICB9XHJcbiAgICAgIGxldCBwb3NpdGlvbjg0ID0gW11cclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIHBvc2l0aW9uODQucHVzaChfdGhpcy5jYXJ0ZXNpYW4zVG93Z3M4NCh0aGlzLnBvc2l0aW9uc1tpXSwgX3RoaXMuc2RrLnZpZXdlcikpXHJcbiAgICAgIH1cclxuICAgICAgX3RoaXMucmVuZXdQb3NpdGlvbnMocG9zaXRpb244NClcclxuXHJcbiAgICAgIHRoaXMuZW50aXR5LnBvbHlnb24uaGllcmFyY2h5ID0gbmV3IENlc2l1bS5DYWxsYmFja1Byb3BlcnR5KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICByZXR1cm4gbmV3IENlc2l1bS5Qb2x5Z29uSGllcmFyY2h5KF90aGlzLnBvc2l0aW9uc0gpXHJcbiAgICAgIH0sIHRydWUpXHJcbiAgICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLnBvc2l0aW9ucyA9IG5ldyBDZXNpdW0uQ2FsbGJhY2tQcm9wZXJ0eShmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgcmV0dXJuIFsuLi5fdGhpcy5wb3NpdGlvbnNILCBfdGhpcy5wb3NpdGlvbnNIWzBdLCBfdGhpcy5wb3NpdGlvbnNIWzFdXVxyXG4gICAgICB9LCB0cnVlKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IHBvc2l0aW9uRWRpdGluZygpIHtcclxuICAgIHJldHVybiB0aGlzLm9wZXJhdGUucG9zaXRpb25FZGl0aW5nXHJcbiAgfVxyXG5cclxuICBzdGF0aWMgRXZlbnRCaW5kaW5nKHRoYXQsIGVsZW1lbnRzKSB7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGxldCBFdmVudCA9IFtdXHJcbiAgICAgIGxldCBpc0V2ZW50ID0gZmFsc2VcclxuICAgICAgbGV0IHJlbW92ZU5hbWUgPSBbXVxyXG4gICAgICBpZiAoIWVsZW1lbnRzW2ldIHx8ICFlbGVtZW50c1tpXS5hdHRyaWJ1dGVzKSB7XHJcbiAgICAgICAgY29udGludWU7XHJcbiAgICAgIH1cclxuICAgICAgZm9yIChsZXQgbSBvZiBlbGVtZW50c1tpXS5hdHRyaWJ1dGVzKSB7XHJcbiAgICAgICAgc3dpdGNoIChtLm5hbWUpIHtcclxuICAgICAgICAgIGNhc2UgJ0Btb2RlbCc6IHtcclxuICAgICAgICAgICAgaXNFdmVudCA9IHRydWVcclxuICAgICAgICAgICAgaWYgKGVsZW1lbnRzW2ldLnR5cGUgPT0gJ2NoZWNrYm94Jykge1xyXG4gICAgICAgICAgICAgIEV2ZW50LnB1c2goKGUpID0+IHsgdGhhdFttLnZhbHVlXSA9IGUudGFyZ2V0LmNoZWNrZWQgfSlcclxuICAgICAgICAgICAgICBlbGVtZW50c1tpXS5jaGVja2VkID0gdGhhdFttLnZhbHVlXVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgIEV2ZW50LnB1c2goKGUpID0+IHtcclxuICAgICAgICAgICAgICAgIGxldCB2YWx1ZSA9IGUudGFyZ2V0LnZhbHVlXHJcbiAgICAgICAgICAgICAgICBpZiAoZS50YXJnZXQudHlwZSA9PSAnbnVtYmVyJykge1xyXG4gICAgICAgICAgICAgICAgICBpZiAoZS5kYXRhICE9ICcuJyAmJiAoZS5kYXRhICE9ICctJyB8fCBlLnRhcmdldC52YWx1ZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IE51bWJlcih2YWx1ZSlcclxuICAgICAgICAgICAgICAgICAgICBpZiAoKGUudGFyZ2V0Lm1heCkgJiYgdmFsdWUgPiBOdW1iZXIoZS50YXJnZXQubWF4KSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBOdW1iZXIoZS50YXJnZXQubWF4KVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAoKGUudGFyZ2V0Lm1pbikgJiYgdmFsdWUgPCBOdW1iZXIoZS50YXJnZXQubWluKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBOdW1iZXIoZS50YXJnZXQubWluKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGF0W20udmFsdWVdID0gdmFsdWVcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIHRoYXRbbS52YWx1ZV0gPSB2YWx1ZVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgaWYgKGVsZW1lbnRzW2ldLm5vZGVOYW1lID09ICdJTUcnKSB7XHJcbiAgICAgICAgICAgICAgICBlbGVtZW50c1tpXS5zcmMgPSB0aGF0W20udmFsdWVdXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZWxlbWVudHNbaV0udmFsdWUgPSB0aGF0W20udmFsdWVdXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh0aGF0Ll9lbG1zW20udmFsdWVdKSB7XHJcbiAgICAgICAgICAgICAgdGhhdC5fZWxtc1ttLnZhbHVlXS5wdXNoKGVsZW1lbnRzW2ldKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgIHRoYXQuX2VsbXNbbS52YWx1ZV0gPSBbZWxlbWVudHNbaV1dXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmVtb3ZlTmFtZS5wdXNoKG0ubmFtZSlcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBjYXNlICdAY2xpY2snOiB7XHJcbiAgICAgICAgICAgIGVsZW1lbnRzW2ldLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcclxuICAgICAgICAgICAgICBpZiAodHlwZW9mICh0aGF0W20udmFsdWVdKSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgdGhhdFttLnZhbHVlXShlKVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHJlbW92ZU5hbWUucHVzaChtLm5hbWUpXHJcbiAgICAgICAgICAgIC8vIGVsZW1lbnRzW2ldLmF0dHJpYnV0ZXMucmVtb3ZlTmFtZWRJdGVtKG0ubmFtZSlcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBjYXNlICdAY2hhbmdlJzoge1xyXG4gICAgICAgICAgICBpc0V2ZW50ID0gdHJ1ZVxyXG4gICAgICAgICAgICBFdmVudC5wdXNoKChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgbGV0IHZhbHVlID0gZS50YXJnZXQudmFsdWVcclxuICAgICAgICAgICAgICBpZiAoZS50YXJnZXQudHlwZSA9PSAnbnVtYmVyJyAmJiB2YWx1ZSAhPSAnJykge1xyXG4gICAgICAgICAgICAgICAgdmFsdWUgPSBOdW1iZXIodmFsdWUpXHJcbiAgICAgICAgICAgICAgICBlLnRhcmdldC52YWx1ZSA9IHZhbHVlXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgKHRoYXRbbS52YWx1ZV0pID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgICAgICB0aGF0W20udmFsdWVdKGUsIHZhbHVlKVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGVsZW1lbnRzW2ldLmF0dHJpYnV0ZXNbbV0gPSB1bmRlZmluZWRcclxuICAgICAgfVxyXG4gICAgICBmb3IgKGxldCBuID0gMDsgbiA8IHJlbW92ZU5hbWUubGVuZ3RoOyBuKyspIHtcclxuICAgICAgICBlbGVtZW50c1tpXS5hdHRyaWJ1dGVzLnJlbW92ZU5hbWVkSXRlbShyZW1vdmVOYW1lW25dKVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoaXNFdmVudCkge1xyXG4gICAgICAgIGxldCB2ZW50VHlwZSA9ICdpbnB1dCdcclxuICAgICAgICBpZiAoZWxlbWVudHNbaV0udGFnTmFtZSAhPSAnSU5QVVQnIHx8IGVsZW1lbnRzW2ldLnR5cGUgPT0gJ2NoZWNrYm94Jykge1xyXG4gICAgICAgICAgdmVudFR5cGUgPSAnY2hhbmdlJ1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZWxlbWVudHNbaV0uY2xhc3NOYW1lLmluZGV4T2YoJ2JsdXInKSAhPT0gLTEpIHtcclxuICAgICAgICAgIHZlbnRUeXBlID0gJ2JsdXInXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsZW1lbnRzW2ldLmFkZEV2ZW50TGlzdGVuZXIodmVudFR5cGUsIChlKSA9PiB7XHJcbiAgICAgICAgICBmb3IgKGxldCB0ID0gMDsgdCA8IEV2ZW50Lmxlbmd0aDsgdCsrKSB7XHJcbiAgICAgICAgICAgIEV2ZW50W3RdKGUpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHN0YXRpYyBub2RlRWRpdCh0aGF0LCBjYiA9ICgpID0+IHsgfSkge1xyXG4gICAgdGhhdC5wb3NpdGlvbkVkaXRpbmcgPSBmYWxzZVxyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIGlmIChZSi5NZWFzdXJlLkdldE1lYXN1cmVTdGF0dXMoKSkge1xyXG4gICAgICAgIGNiKCfkuIrkuIDmrKHmtYvph4/mnKrnu5PmnZ8nKVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoYXQucmVtb3ZlQW5pbWF0ZSgpXHJcbiAgICAgICAgWUouTWVhc3VyZS5TZXRNZWFzdXJlU3RhdHVzKHRydWUpXHJcbiAgICAgICAgdGhhdC5ldmVudCAmJiB0aGF0LmV2ZW50LmRlc3Ryb3koKVxyXG4gICAgICAgIHRoYXQudGlwICYmIHRoYXQudGlwLmRlc3Ryb3koKVxyXG4gICAgICAgIHRoYXQudGlwID0gbmV3IE1vdXNlVGlwKCfor7fpgInmi6nkuIDkuKrpobbngrnvvIzlj7PplK7lj5bmtognLCB0aGF0LnNkaylcclxuICAgICAgICB0aGF0LmV2ZW50ID0gbmV3IE1vdXNlRXZlbnQodGhhdC5zZGspXHJcbiAgICAgICAgdGhhdC5ub2RlUG9pbnRzID0gW11cclxuICAgICAgICBsZXQgc2VsZWN0UG9pbnRcclxuICAgICAgICBsZXQgb3JpZ2luYWxQb3NpdGlvblxyXG5cclxuICAgICAgICBsZXQgbW92ZUV2ZW50ID0gKG1vdmVtZW50LCBjYXJ0ZXNpYW4pID0+IHtcclxuICAgICAgICAgIGlmIChzZWxlY3RQb2ludCkge1xyXG4gICAgICAgICAgICB0aGF0Lm9wdGlvbnMucG9zaXRpb25zW3NlbGVjdFBvaW50LmluZGV4XSA9IHRoYXQuY2FydGVzaWFuM1Rvd2dzODQoY2FydGVzaWFuLCB0aGF0LnNkay52aWV3ZXIpXHJcbiAgICAgICAgICAgIHRoYXQucmVuZXdQb3NpdGlvbnMoKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhhdC50aXAuc2V0UG9zaXRpb24oXHJcbiAgICAgICAgICAgIGNhcnRlc2lhbixcclxuICAgICAgICAgICAgbW92ZW1lbnQucG9zaXRpb24gPyBtb3ZlbWVudC5wb3NpdGlvbi54IDogbW92ZW1lbnQuZW5kUG9zaXRpb24ueCxcclxuICAgICAgICAgICAgbW92ZW1lbnQucG9zaXRpb24gPyBtb3ZlbWVudC5wb3NpdGlvbi55IDogbW92ZW1lbnQuZW5kUG9zaXRpb24ueVxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgbGVmdEV2ZW50ID0gKG1vdmVtZW50LCBjYXJ0ZXNpYW4pID0+IHtcclxuICAgICAgICAgIG1vdmVFdmVudChtb3ZlbWVudCwgY2FydGVzaWFuKVxyXG4gICAgICAgICAgaWYgKHNlbGVjdFBvaW50KSB7XHJcbiAgICAgICAgICAgIHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbc2VsZWN0UG9pbnQuaW5kZXhdID0gdGhhdC5jYXJ0ZXNpYW4zVG93Z3M4NChjYXJ0ZXNpYW4sIHRoYXQuc2RrLnZpZXdlcilcclxuICAgICAgICAgICAgbGV0IGluZGV4ID0gc2VsZWN0UG9pbnQuaW5kZXhcclxuICAgICAgICAgICAgaWYgKHNlbGVjdFBvaW50LmluZGV4ID09PSB0aGF0Lm9wdGlvbnMucG9zaXRpb25zLmxlbmd0aCAtIDEpIHtcclxuICAgICAgICAgICAgICBpbmRleCA9IGluZGV4ICsgMVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGxldCBlbnRpdHkgPSB0aGF0LnNkay52aWV3ZXIuZW50aXRpZXMuYWRkKHtcclxuICAgICAgICAgICAgICBuYW1lOiAnbm9kZS1zZWNvbmRhcnktZWRpdC1wb2ludCcsXHJcbiAgICAgICAgICAgICAgaW5kZXg6IGluZGV4LFxyXG4gICAgICAgICAgICAgIHBvc2l0aW9uOiBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlcyh0aGF0Lm9wdGlvbnMucG9zaXRpb25zW3NlbGVjdFBvaW50LmluZGV4XS5sbmcsIHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbc2VsZWN0UG9pbnQuaW5kZXhdLmxhdCwgdGhhdC5vcHRpb25zLnBvc2l0aW9uc1tzZWxlY3RQb2ludC5pbmRleF0uYWx0KSxcclxuICAgICAgICAgICAgICBiaWxsYm9hcmQ6IHtcclxuICAgICAgICAgICAgICAgIGltYWdlOiB0aGF0LmdldFNvdXJjZVJvb3RQYXRoKCkgKyAnL2ltZy9wb2ludC5wbmcnLFxyXG4gICAgICAgICAgICAgICAgd2lkdGg6IDE1LFxyXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiAxNSxcclxuICAgICAgICAgICAgICAgIGRpc2FibGVEZXB0aFRlc3REaXN0YW5jZTogTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLFxyXG4gICAgICAgICAgICAgICAgY29sb3I6IENlc2l1bS5Db2xvci5XSElURS53aXRoQWxwaGEoMC45OSlcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICBzZWxlY3RQb2ludCA9IGVudGl0eVxyXG5cclxuICAgICAgICAgICAgb3JpZ2luYWxQb3NpdGlvbiA9IHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbc2VsZWN0UG9pbnQuaW5kZXhdXHJcbiAgICAgICAgICAgIHRoYXQubm9kZVBvaW50cy5zcGxpY2Uoc2VsZWN0UG9pbnQuaW5kZXgsIDAsIGVudGl0eSlcclxuXHJcbiAgICAgICAgICAgIGlmIChpbmRleCA8IHRoYXQub3B0aW9ucy5wb3NpdGlvbnMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgc2VsZWN0UG9pbnQgPSBudWxsXHJcbiAgICAgICAgICAgICAgdGhhdC50aXAuc2V0X3RleHQoJ+ivt+mAieaLqeS4gOS4qumhtueCue+8jOWPs+mUruWPlua2iCcpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgdGhhdC5vcHRpb25zLnBvc2l0aW9ucy5zcGxpY2Uoc2VsZWN0UG9pbnQuaW5kZXgsIDAsIHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbc2VsZWN0UG9pbnQuaW5kZXhdKVxyXG4gICAgICAgICAgICAgIHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbc2VsZWN0UG9pbnQuaW5kZXhdID0gdGhhdC5jYXJ0ZXNpYW4zVG93Z3M4NChjYXJ0ZXNpYW4sIHRoYXQuc2RrLnZpZXdlcilcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGF0LnJlbmV3UG9zaXRpb25zKClcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB2YXIgcGljayA9IHRoYXQuc2RrLnZpZXdlci5zY2VuZS5waWNrKG1vdmVtZW50LnBvc2l0aW9uIHx8IG1vdmVtZW50LmVuZFBvc2l0aW9uKTtcclxuICAgICAgICAgICAgaWYgKHBpY2sgJiYgcGljay5pZCAmJiBwaWNrLmlkLm5hbWUgJiYgcGljay5pZC5uYW1lID09PSAnbm9kZS1zZWNvbmRhcnktZWRpdC1wb2ludCcpIHtcclxuICAgICAgICAgICAgICBzZWxlY3RQb2ludCA9IHBpY2suaWRcclxuICAgICAgICAgICAgICBvcmlnaW5hbFBvc2l0aW9uID0gdGhhdC5jYXJ0ZXNpYW4zVG93Z3M4NChwaWNrLmlkLnBvc2l0aW9uLmdldFZhbHVlKCksIHRoYXQuc2RrLnZpZXdlcilcclxuICAgICAgICAgICAgICB0aGF0Lm5vZGVQb2ludHMuc3BsaWNlKHBpY2suaWQuaW5kZXgsIDEpXHJcbiAgICAgICAgICAgICAgdGhhdC5zZGsudmlld2VyLmVudGl0aWVzLnJlbW92ZShwaWNrLmlkKVxyXG4gICAgICAgICAgICAgIHRoYXQudGlwLnNldF90ZXh0KCflt6bplK7noa7orqTvvIzlj7PplK7nu5PmnZ/vvIxDVFJMK+WPs+mUruaSpOmUgCcpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IHJpZ2h0RXZlbnQgPSAobW92ZW1lbnQsIGNhcnRlc2lhbikgPT4ge1xyXG4gICAgICAgICAgdGhhdC5ldmVudC5tb3VzZV9tb3ZlKCgpID0+IHsgfSlcclxuICAgICAgICAgIHRoYXQuZXZlbnQubW91c2VfbGVmdCgoKSA9PiB7IH0pXHJcbiAgICAgICAgICB0aGF0LmV2ZW50Lm1vdXNlX3JpZ2h0KCgpID0+IHsgfSlcclxuICAgICAgICAgIHRoYXQuZXZlbnQuZ2VzdHVyZV9waW5ja19zdGFydCgoKSA9PiB7IH0pXHJcbiAgICAgICAgICBpZiAoc2VsZWN0UG9pbnQpIHtcclxuICAgICAgICAgICAgaWYgKCFvcmlnaW5hbFBvc2l0aW9uKSB7XHJcbiAgICAgICAgICAgICAgdGhhdC5vcHRpb25zLnBvc2l0aW9ucy5wb3AoKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgIHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbc2VsZWN0UG9pbnQuaW5kZXhdID0gb3JpZ2luYWxQb3NpdGlvblxyXG4gICAgICAgICAgICAgIGlmICh0aGF0Lm9wdGlvbnMucG9zaXRpb25zLmxlbmd0aCA+IDMgJiYgc2VsZWN0UG9pbnQuaW5kZXggPT09IHRoYXQub3B0aW9ucy5wb3NpdGlvbnMubGVuZ3RoIC0gMSkge1xyXG4gICAgICAgICAgICAgICAgdGhhdC5vcHRpb25zLnBvc2l0aW9ucy5zcGxpY2Uoc2VsZWN0UG9pbnQuaW5kZXggKyAxLCAxKVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodGhhdC5fZWxtcy5sbmcgJiYgdGhhdC5fZWxtcy5sbmdbc2VsZWN0UG9pbnQuaW5kZXhdKSB7XHJcbiAgICAgICAgICAgICAgdGhhdC5fZWxtcy5sbmdbc2VsZWN0UG9pbnQuaW5kZXhdLmlubmVySFRNTCA9IHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbc2VsZWN0UG9pbnQuaW5kZXhdLmxuZy50b0ZpeGVkKDgpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHRoYXQuX2VsbXMubGF0ICYmIHRoYXQuX2VsbXMubGF0W3NlbGVjdFBvaW50LmluZGV4XSkge1xyXG4gICAgICAgICAgICAgIHRoYXQuX2VsbXMubGF0W3NlbGVjdFBvaW50LmluZGV4XS5pbm5lckhUTUwgPSB0aGF0Lm9wdGlvbnMucG9zaXRpb25zW3NlbGVjdFBvaW50LmluZGV4XS5sYXQudG9GaXhlZCg4KVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGF0LmhlaWdodE1vZGUgPSB0aGF0LmhlaWdodE1vZGVcclxuICAgICAgICAgIHRoYXQucHJldmlvdXMgPSBudWxsXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGF0LmVudGl0eS5wb2x5bGluZS5jbGFtcFRvR3JvdW5kID0gdHJ1ZVxyXG4gICAgICAgIHRoYXQuZW50aXR5LnBvbHlsaW5lLmFyY1R5cGUgPSBDZXNpdW0uQXJjVHlwZS5HRU9ERVNJQ1xyXG4gICAgICAgIHRoYXQuZW50aXR5LnBvbHlnb24ucGVyUG9zaXRpb25IZWlnaHQgPSBmYWxzZVxyXG4gICAgICAgIHRoYXQuZW50aXR5LnBvbHlnb24uaGllcmFyY2h5ID0gbmV3IENlc2l1bS5DYWxsYmFja1Byb3BlcnR5KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgIHJldHVybiBuZXcgQ2VzaXVtLlBvbHlnb25IaWVyYXJjaHkodGhhdC5wb3NpdGlvbnNIKVxyXG4gICAgICAgIH0sIGZhbHNlKVxyXG4gICAgICAgIHRoYXQuZW50aXR5LnBvbHlsaW5lLnBvc2l0aW9ucyA9IG5ldyBDZXNpdW0uQ2FsbGJhY2tQcm9wZXJ0eShmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICByZXR1cm4gWy4uLnRoYXQucG9zaXRpb25zSCwgdGhhdC5wb3NpdGlvbnNIWzBdLCB0aGF0LnBvc2l0aW9uc0hbMV1dXHJcbiAgICAgICAgfSwgZmFsc2UpXHJcblxyXG5cclxuICAgICAgICBsZXQgcG9pbnRzID0gW1tdXVxyXG4gICAgICAgIGxldCBwb3M4NCA9IFtdXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGF0LnBvc2l0aW9uc0gubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGxldCBwb3NpdGlvbiA9IHRoYXQuY2FydGVzaWFuM1Rvd2dzODQodGhhdC5wb3NpdGlvbnNIW2ldLCB0aGF0LnNkay52aWV3ZXIpXHJcbiAgICAgICAgICBwb3M4NC5wdXNoKHBvc2l0aW9uKVxyXG4gICAgICAgICAgcG9pbnRzWzBdLnB1c2goW3Bvc2l0aW9uLmxuZywgcG9zaXRpb24ubGF0XSlcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IHBvc2l0aW9uID0gdGhhdC5jYXJ0ZXNpYW4zVG93Z3M4NCh0aGF0LnBvc2l0aW9uc0hbMF0sIHRoYXQuc2RrLnZpZXdlcilcclxuICAgICAgICBwb2ludHNbMF0ucHVzaChbcG9zaXRpb24ubG5nLCBwb3NpdGlvbi5sYXRdKVxyXG4gICAgICAgIGxldCBwb2x5Z29uID0gdHVyZi5wb2x5Z29uKHBvaW50cylcclxuICAgICAgICBsZXQgY2VudHJvaWQgPSB0dXJmLnBvaW50T25GZWF0dXJlKHBvbHlnb24pXHJcbiAgICAgICAgbGV0IG9iamVjdHNUb0V4Y2x1ZGUgPSBbLi4udGhhdC5zZGsudmlld2VyLmVudGl0aWVzLnZhbHVlc11cclxuICAgICAgICB0aGF0XHJcbiAgICAgICAgICAuZ2V0Q2xhbXBUb0hlaWdodCh7XHJcbiAgICAgICAgICAgIGxuZzogY2VudHJvaWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMF0sXHJcbiAgICAgICAgICAgIGxhdDogY2VudHJvaWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMV1cclxuICAgICAgICAgIH0sIG9iamVjdHNUb0V4Y2x1ZGUpXHJcbiAgICAgICAgICAudGhlbihoZWlnaHQgPT4ge1xyXG4gICAgICAgICAgICB0aGF0LmxhYmVsLnBvc2l0aW9uID0gW1xyXG4gICAgICAgICAgICAgIGNlbnRyb2lkLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzBdLFxyXG4gICAgICAgICAgICAgIGNlbnRyb2lkLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzFdLFxyXG4gICAgICAgICAgICAgIGhlaWdodFxyXG4gICAgICAgICAgICBdXHJcbiAgICAgICAgICB9KVxyXG5cclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgIHRoYXQuZXZlbnQubW91c2VfbGVmdChsZWZ0RXZlbnQpXHJcblxyXG4gICAgICAgICAgdGhhdC5ldmVudC5tb3VzZV9yaWdodChyaWdodEV2ZW50KVxyXG5cclxuICAgICAgICAgIHRoYXQuZXZlbnQubW91c2VfbW92ZShtb3ZlRXZlbnQpXHJcblxyXG4gICAgICAgICAgdGhhdC5ldmVudC5tb3VzZV9yaWdodF9rZXlib2FyZF9jdHJsKChtb3ZlbWVudCwgY2FydGVzaWFuKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChzZWxlY3RQb2ludCkge1xyXG4gICAgICAgICAgICAgIHRoYXQub3B0aW9ucy5wb3NpdGlvbnMucG9wKClcclxuICAgICAgICAgICAgICB0aGF0LnNkay52aWV3ZXIuZW50aXRpZXMucmVtb3ZlKHRoYXQubm9kZVBvaW50c1t0aGF0Lm5vZGVQb2ludHMubGVuZ3RoIC0gMV0pXHJcbiAgICAgICAgICAgICAgdGhhdC5ub2RlUG9pbnRzLnBvcCgpXHJcbiAgICAgICAgICAgICAgaWYgKCFzZWxlY3RQb2ludC5pbmRleCkge1xyXG4gICAgICAgICAgICAgICAgLy8gc2VsZWN0UG9pbnQgPSBudWxsXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGVsc2UgaWYgKHNlbGVjdFBvaW50LmluZGV4ID09PSB0aGF0Lm9wdGlvbnMucG9zaXRpb25zLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoYXQubm9kZVBvaW50c1tzZWxlY3RQb2ludC5pbmRleCAtIDFdKSB7XHJcbiAgICAgICAgICAgICAgICAgIHNlbGVjdFBvaW50ID0gdGhhdC5ub2RlUG9pbnRzW3NlbGVjdFBvaW50LmluZGV4IC0gMV1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICBzZWxlY3RQb2ludC5pbmRleCA9IHNlbGVjdFBvaW50LmluZGV4IC0gMVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgdGhhdC5yZW5ld1Bvc2l0aW9ucygpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pXHJcblxyXG4gICAgICAgICAgdGhhdC5ldmVudC5nZXN0dXJlX3BpbmNrX3N0YXJ0KChtb3ZlbWVudCwgY2FydGVzaWFuKSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBzdGFydFRpbWUgPSBuZXcgRGF0ZSgpXHJcbiAgICAgICAgICAgIHRoYXQuZXZlbnQuZ2VzdHVyZV9waW5ja19lbmQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgIGxldCBlbmRUaW1lID0gbmV3IERhdGUoKVxyXG4gICAgICAgICAgICAgIGxldCBwb3MgPSB7XHJcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjoge1xyXG4gICAgICAgICAgICAgICAgICB4OiAobW92ZW1lbnQucG9zaXRpb24xLnggKyBtb3ZlbWVudC5wb3NpdGlvbjIueCkgLyAyLFxyXG4gICAgICAgICAgICAgICAgICB5OiAobW92ZW1lbnQucG9zaXRpb24xLnkgKyBtb3ZlbWVudC5wb3NpdGlvbjIueSkgLyAyXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGlmIChlbmRUaW1lIC0gc3RhcnRUaW1lID49IDUwMCkge1xyXG4gICAgICAgICAgICAgICAgLy8g6ZW/5oyJ5Y+W5raIXHJcbiAgICAgICAgICAgICAgICByaWdodEV2ZW50KHBvcywgY2FydGVzaWFuKVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGxlZnRFdmVudChwb3MsIGNhcnRlc2lhbilcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgY3JlYXRlTm9kZVBvaW50cygpXHJcbiAgICAgICAgfSwgMjAwKTtcclxuICAgICAgICBhc3luYyBmdW5jdGlvbiBjcmVhdGVOb2RlUG9pbnRzKCkge1xyXG4gICAgICAgICAgbGV0IG9iamVjdHNUb0V4Y2x1ZGUgPSBbLi4udGhhdC5zZGsudmlld2VyLmVudGl0aWVzLnZhbHVlc11cclxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhhdC5vcHRpb25zLnBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBsZXQgaGVpZ2h0ID0gYXdhaXQgdGhhdC5nZXRDbGFtcFRvSGVpZ2h0KHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbaV0sIG9iamVjdHNUb0V4Y2x1ZGUpXHJcbiAgICAgICAgICAgIGxldCBlbnRpdHkgPSB0aGF0LnNkay52aWV3ZXIuZW50aXRpZXMuYWRkKHtcclxuICAgICAgICAgICAgICBuYW1lOiAnbm9kZS1zZWNvbmRhcnktZWRpdC1wb2ludCcsXHJcbiAgICAgICAgICAgICAgaW5kZXg6IGksXHJcbiAgICAgICAgICAgICAgcG9zaXRpb246IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzKHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbaV0ubG5nLCB0aGF0Lm9wdGlvbnMucG9zaXRpb25zW2ldLmxhdCwgaGVpZ2h0KSxcclxuICAgICAgICAgICAgICBiaWxsYm9hcmQ6IHtcclxuICAgICAgICAgICAgICAgIGltYWdlOiB0aGF0LmdldFNvdXJjZVJvb3RQYXRoKCkgKyAnL2ltZy9wb2ludC5wbmcnLFxyXG4gICAgICAgICAgICAgICAgd2lkdGg6IDE1LFxyXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiAxNSxcclxuICAgICAgICAgICAgICAgIGRpc2FibGVEZXB0aFRlc3REaXN0YW5jZTogTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLFxyXG4gICAgICAgICAgICAgICAgY29sb3I6IENlc2l1bS5Db2xvci5XSElURS53aXRoQWxwaGEoMC45OSlcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB0aGF0Lm5vZGVQb2ludHMucHVzaChlbnRpdHkpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGZvciAobGV0IGkgPSAwOyBpIDwgdGhhdC5vcHRpb25zLnBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIC8vICAgbGV0IGVudGl0eSA9IHRoYXQuc2RrLnZpZXdlci5lbnRpdGllcy5hZGQoe1xyXG4gICAgICAgIC8vICAgICBuYW1lOiAnbm9kZS1zZWNvbmRhcnktZWRpdC1wb2ludCcsXHJcbiAgICAgICAgLy8gICAgIGluZGV4OiBpLFxyXG4gICAgICAgIC8vICAgICBwb3NpdGlvbjogQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXModGhhdC5vcHRpb25zLnBvc2l0aW9uc1tpXS5sbmcsIHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbaV0ubGF0KSxcclxuICAgICAgICAvLyAgICAgYmlsbGJvYXJkOiB7XHJcbiAgICAgICAgLy8gICAgICAgaW1hZ2U6IHRoYXQuZ2V0U291cmNlUm9vdFBhdGgoKSArICcvaW1nL3BvaW50LnBuZycsXHJcbiAgICAgICAgLy8gICAgICAgd2lkdGg6IDE1LFxyXG4gICAgICAgIC8vICAgICAgIGhlaWdodDogMTUsXHJcbiAgICAgICAgLy8gICAgICAgZGlzYWJsZURlcHRoVGVzdERpc3RhbmNlOiBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksXHJcbiAgICAgICAgLy8gICAgIH0sXHJcbiAgICAgICAgLy8gICB9KVxyXG4gICAgICAgIC8vICAgbm9kZVBvaW50cy5wdXNoKGVudGl0eSlcclxuICAgICAgICAvLyB9XHJcbiAgICAgIH1cclxuICAgIH0sIDApO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGNsb3NlTm9kZUVkaXQodGhhdCkge1xyXG4gICAgWUouTWVhc3VyZS5TZXRNZWFzdXJlU3RhdHVzKGZhbHNlKVxyXG4gICAgdGhhdC5ldmVudCAmJiB0aGF0LmV2ZW50LmRlc3Ryb3koKVxyXG4gICAgdGhhdC50aXAgJiYgdGhhdC50aXAuZGVzdHJveSgpXHJcbiAgICB0aGF0LnRpcCA9IG51bGxcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoYXQubm9kZVBvaW50cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICB0aGF0LnNkay52aWV3ZXIuZW50aXRpZXMucmVtb3ZlKHRoYXQubm9kZVBvaW50c1tpXSlcclxuICAgIH1cclxuICAgIHRoYXQubm9kZVBvaW50cyA9IFtdXHJcbiAgICB0aGF0LnBpY2tpbmcgPSB0cnVlXHJcbiAgfVxyXG5cclxuICBzZXRQb3NpdGlvbih2KSB7XHJcbiAgICBsZXQgY2FydGVzaWFuID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXModi5wb3NpdGlvbi5sbmcsIHYucG9zaXRpb24ubGF0LCB2LnBvc2l0aW9uLmFsdClcclxuICAgIGxldCBwb3NpdGlvbnMgPSBbLi4udGhpcy5wb3NpdGlvbnNdXHJcbiAgICBsZXQgYXJyYXkgPSBbXVxyXG4gICAgbGV0IGRpc3Bhcml0eSA9IFtdXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBsZXQgcG9zaXRpb24gPSB0aGlzLmNhcnRlc2lhbjNUb3dnczg0KHBvc2l0aW9uc1tpXSwgdGhpcy5zZGsudmlld2VyKVxyXG4gICAgICBhcnJheS5wdXNoKFtwb3NpdGlvbi5sbmcsIHBvc2l0aW9uLmxhdF0pXHJcbiAgICB9XHJcbiAgICBsZXQgZmlyc3Rwb3NpdGlvbiA9IHRoaXMuY2FydGVzaWFuM1Rvd2dzODQocG9zaXRpb25zWzBdLCB0aGlzLnNkay52aWV3ZXIpXHJcbiAgICBhcnJheS5wdXNoKFtmaXJzdHBvc2l0aW9uLmxuZywgZmlyc3Rwb3NpdGlvbi5sYXRdKVxyXG4gICAgdmFyIHBvbHlnb24gPSB0dXJmLnBvbHlnb24oW2FycmF5XSk7XHJcbiAgICB2YXIgY2VudHJvaWQgPSB0dXJmLmNlbnRyb2lkKHBvbHlnb24pO1xyXG4gICAgbGV0IGNlbnRlciA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzKC4uLmNlbnRyb2lkLmdlb21ldHJ5LmNvb3JkaW5hdGVzKVxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgZGlzcGFyaXR5LnB1c2goe1xyXG4gICAgICAgIHg6IGNlbnRlci54IC0gcG9zaXRpb25zW2ldLngsXHJcbiAgICAgICAgeTogY2VudGVyLnkgLSBwb3NpdGlvbnNbaV0ueSxcclxuICAgICAgICB6OiBjZW50ZXIueiAtIHBvc2l0aW9uc1tpXS56LFxyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gICAgbGV0IG5ld3Bvc2l0aW9ucyA9IFtdXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRpc3Bhcml0eS5sZW5ndGg7IGkrKykge1xyXG4gICAgICBuZXdwb3NpdGlvbnMucHVzaCh7XHJcbiAgICAgICAgeDogY2FydGVzaWFuLnggLSBkaXNwYXJpdHlbaV0ueCxcclxuICAgICAgICB5OiBjYXJ0ZXNpYW4ueSAtIGRpc3Bhcml0eVtpXS55LFxyXG4gICAgICAgIHo6IGNhcnRlc2lhbi56IC0gZGlzcGFyaXR5W2ldLnosXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgICB0aGlzLmxhYmVsLnBvc2l0aW9uID0gW3YucG9zaXRpb24ubG5nLCB2LnBvc2l0aW9uLmxhdCwgdi5wb3NpdGlvbi5hbHRdXHJcblxyXG4gICAgbGV0IHBvc2l0aW9uczg0ID0gW11cclxuICAgIGlmIChuZXdwb3NpdGlvbnMubGVuZ3RoID4gMCkge1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5ld3Bvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIHBvc2l0aW9uczg0LnB1c2godGhpcy5jYXJ0ZXNpYW4zVG93Z3M4NChuZXdwb3NpdGlvbnNbaV0sIHRoaXMuc2RrLnZpZXdlcikpXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGxldCBhcnIgPSB0aGlzLmNvbXB1dGVBdHRhY2tBcnJvdyhwb3NpdGlvbnM4NClcclxuICAgIGlmIChhcnIubGVuZ3RoID09IDApIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcbiAgICB0aGlzLmVudGl0eS5wb2x5Z29uLmhpZXJhcmNoeSA9IG5ldyBDZXNpdW0uQ2FsbGJhY2tQcm9wZXJ0eShmdW5jdGlvbiAoKSB7XHJcbiAgICAgIHJldHVybiBuZXcgQ2VzaXVtLlBvbHlnb25IaWVyYXJjaHkoYXJyKVxyXG4gICAgfSwgZmFsc2UpXHJcbiAgICB0aGlzLmVudGl0eS5wb2x5bGluZS5wb3NpdGlvbnMgPSBuZXcgQ2VzaXVtLkNhbGxiYWNrUHJvcGVydHkoZnVuY3Rpb24gKCkge1xyXG4gICAgICBpZiAoYXJyLmxlbmd0aCA+PSAzKSB7XHJcbiAgICAgICAgcmV0dXJuIFsuLi5hcnIsIGFyclswXSwgYXJyWzFdXVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHJldHVybiBbLi4uYXJyXVxyXG4gICAgICB9XHJcbiAgICB9LCBmYWxzZSlcclxuICB9XHJcblxyXG4gIHNldERJVihvcHRpb25zID0geyBkb21pZDogXCJcIiwgeDogMTAsIHk6IDEwIH0pIHtcclxuICAgIG9wdGlvbnMueCA9IChvcHRpb25zLnggfHwgb3B0aW9ucy54ID09PSAwKSA/IG9wdGlvbnMueCA6IDEwXHJcbiAgICBvcHRpb25zLnkgPSAob3B0aW9ucy55IHx8IG9wdGlvbnMueSA9PT0gMCkgPyBvcHRpb25zLnkgOiAxMFxyXG5cclxuICAgIGxldCBwb3NpdGlvbnMgPSB0aGlzLmNvbXB1dGVBdHRhY2tBcnJvdyh0aGlzLm9wdGlvbnMucG9zaXRpb25zKVxyXG4gICAgaWYgKHBvc2l0aW9ucy5sZW5ndGggPT0gMCkge1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuICAgIGxldCBwb2ludHMgPSBbW11dXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBsZXQgcG9zaXRpb24gPSB0aGlzLmNhcnRlc2lhbjNUb3dnczg0KHBvc2l0aW9uc1tpXSwgdGhpcy5zZGsudmlld2VyKVxyXG4gICAgICBwb2ludHNbMF0ucHVzaChbcG9zaXRpb24ubG5nLCBwb3NpdGlvbi5sYXRdKVxyXG4gICAgfVxyXG4gICAgbGV0IHBvc2l0aW9uID0gdGhpcy5jYXJ0ZXNpYW4zVG93Z3M4NChwb3NpdGlvbnNbMF0sIHRoaXMuc2RrLnZpZXdlcilcclxuICAgIHBvaW50c1swXS5wdXNoKFtwb3NpdGlvbi5sbmcsIHBvc2l0aW9uLmxhdF0pXHJcbiAgICBsZXQgcG9seWdvbiA9IHR1cmYucG9seWdvbihwb2ludHMpO1xyXG4gICAgLy8gbGV0IGNlbnRyb2lkID0gdHVyZi5jZW50cm9pZChwb2x5Z29uKTtcclxuICAgIGxldCBjZW50cm9pZCA9IHR1cmYucG9pbnRPbkZlYXR1cmUocG9seWdvbik7XHJcbiAgICBsZXQgc2l0ZUluZm9Eb20gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChvcHRpb25zLmRvbWlkKVxyXG4gICAgbGV0IHNpdGVJbmZvUG9zaXRpb24gPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlcyhjZW50cm9pZC5nZW9tZXRyeS5jb29yZGluYXRlc1swXSwgY2VudHJvaWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMV0pXHJcblxyXG4gICAgdGhpcy5zZGsudmlld2VyLnNjZW5lLnBvc3RSZW5kZXIuYWRkRXZlbnRMaXN0ZW5lcigocGVyY2VudGFnZSkgPT4ge1xyXG4gICAgICAvL+i9rOaNouWIsOWxj+W5leWdkOagh1xyXG4gICAgICBpZiAoc2l0ZUluZm9Eb20uc3R5bGUuZGlzcGxheSA9PT0gJ2Jsb2NrJyB8fCBzaXRlSW5mb0RvbS5zdHlsZS5kaXNwbGF5ID09PSAnJykge1xyXG4gICAgICAgIGxldCB3aW5wb3MgPSB0aGlzLnNkay52aWV3ZXIuc2NlbmUuY2FydGVzaWFuVG9DYW52YXNDb29yZGluYXRlcyhzaXRlSW5mb1Bvc2l0aW9uKTtcclxuICAgICAgICBpZiAod2lucG9zKSB7XHJcbiAgICAgICAgICBzaXRlSW5mb0RvbS5zdHlsZS5sZWZ0ID0gKHdpbnBvcy54ICsgb3B0aW9ucy54KS50b0ZpeGVkKDApICsgJ3B4JztcclxuICAgICAgICAgIHNpdGVJbmZvRG9tLnN0eWxlLnRvcCA9ICh3aW5wb3MueSArIG9wdGlvbnMueSkudG9GaXhlZCgwKSArICdweCc7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGdldCBzcHJlYWRUaW1lKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5zcHJlYWRUaW1lXHJcbiAgfVxyXG5cclxuICBzZXQgc3ByZWFkVGltZSh2KSB7XHJcbiAgICBsZXQgc3ByZWFkVGltZSA9IE51bWJlcih2KVxyXG4gICAgaWYgKGlzTmFOKHNwcmVhZFRpbWUpKSB7XHJcbiAgICAgIHNwcmVhZFRpbWUgPSAzMDAwXHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChzcHJlYWRUaW1lIDwgNTAwKSB7XHJcbiAgICAgIHNwcmVhZFRpbWUgPSA1MDBcclxuICAgIH0gZWxzZSBpZiAoc3ByZWFkVGltZSA+IDk5OTk5OTkpIHtcclxuICAgICAgc3ByZWFkVGltZSA9IDk5OTk5OTlcclxuICAgIH1cclxuICAgIHRoaXMub3B0aW9ucy5zcHJlYWRUaW1lID0gc3ByZWFkVGltZVxyXG4gICAgaWYgKHRoaXMuc3ByZWFkU3RhdGUpIHtcclxuICAgICAgdGhpcy5zZXRTcHJlYWRQcm9ncmVzc0J5VGltZSgpXHJcbiAgICB9XHJcbiAgICB0aGlzLl9lbG1zLnNwcmVhZFRpbWUgJiYgdGhpcy5fZWxtcy5zcHJlYWRUaW1lLmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgaXRlbS52YWx1ZSA9IHNwcmVhZFRpbWVcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBnZXQgbG9vcCgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubG9vcFxyXG4gIH1cclxuICBzZXQgbG9vcCh2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMubG9vcCA9IHZcclxuICAgIGlmICh0aGlzLlR3ZWVuQW5pbWF0ZSkge1xyXG4gICAgICBpZiAodikge1xyXG4gICAgICAgIHRoaXMuVHdlZW5BbmltYXRlLnJlcGVhdChJbmZpbml0eSlcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICB0aGlzLlR3ZWVuQW5pbWF0ZS5yZXBlYXQoKVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLl9lbG1zLmxvb3AgJiYgdGhpcy5fZWxtcy5sb29wLmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgaXRlbS5jaGVja2VkID0gdlxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGdldCBzcHJlYWRTdGF0ZSgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuc3ByZWFkU3RhdGVcclxuICB9XHJcbiAgc2V0IHNwcmVhZFN0YXRlKHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5zcHJlYWRTdGF0ZSA9IHZcclxuICAgIGlmICh0aGlzLlR3ZWVuQW5pbWF0ZSkge1xyXG4gICAgICBpZiAodikge1xyXG4gICAgICAgIHRoaXMubGluZUVkaXQgPSBmYWxzZVxyXG4gICAgICAgIHRoaXMuc2V0U3ByZWFkUHJvZ3Jlc3NCeVRpbWUodGhpcy5Ud2VlbkFuaW1hdGUuX29iamVjdC5kaXN0YW5jZSAvIHRoaXMuVHdlZW5BbmltYXRlLl92YWx1ZXNFbmQuZGlzdGFuY2UgKiB0aGlzLnNwcmVhZFRpbWUpXHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdGhpcy5Ud2VlbkFuaW1hdGUucGF1c2UoKVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKHYpIHtcclxuICAgICAgICB0aGlzLnNldFNwcmVhZFByb2dyZXNzQnlUaW1lKClcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5fZWxtcy5zcHJlYWRTdGF0ZSAmJiB0aGlzLl9lbG1zLnNwcmVhZFN0YXRlLmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgaXRlbS5jaGVja2VkID0gdlxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIHNldFNwcmVhZFByb2dyZXNzQnlUaW1lKHRpbWUgPSAwKSB7XHJcbiAgICBpZiAoIXRoaXMuZW50aXR5KSB7XHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG4gICAgbGV0IHRoYXQgPSB0aGlzXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubm9kZVBvaW50cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICB0aGlzLnNkay52aWV3ZXIuZW50aXRpZXMucmVtb3ZlKHRoaXMubm9kZVBvaW50c1tpXSlcclxuICAgIH1cclxuICAgIHRoaXMubm9kZVBvaW50cyA9IFtdXHJcbiAgICBZSi5NZWFzdXJlLlNldE1lYXN1cmVTdGF0dXMoZmFsc2UpXHJcbiAgICB0aGlzLmV2ZW50ICYmIHRoaXMuZXZlbnQuZGVzdHJveSgpXHJcbiAgICB0aGlzLnRpcCAmJiB0aGlzLnRpcC5kZXN0cm95KClcclxuXHJcblxyXG5cclxuICAgIGxldCBBdHRhY2tBcnJvd0FyciA9IHRoYXQuY29tcHV0ZUF0dGFja0Fycm93KHRoYXQub3B0aW9ucy5wb3NpdGlvbnMpXHJcbiAgICBsZXQgYXJyXHJcbiAgICBsZXQgbGluZUFyclxyXG4gICAgLy8gaWYgKGFyci5sZW5ndGggPj0gMykge1xyXG4gICAgLy8gICBsaW5lQXJyID0gWy4uLmFyciwgYXJyWzBdLCBhcnJbMV1dXHJcbiAgICAvLyB9XHJcbiAgICAvLyBlbHNlIHtcclxuICAgIC8vICAgbGluZUFyciA9IFsuLi5hcnJdXHJcbiAgICAvLyB9XHJcbiAgICBpZiAodGhpcy5Ud2VlbkFuaW1hdGUpIHtcclxuICAgICAgVFdFRU4ucmVtb3ZlKHRoaXMuVHdlZW5BbmltYXRlKVxyXG4gICAgICB0aGlzLlR3ZWVuQW5pbWF0ZSA9IG51bGxcclxuICAgIH1cclxuXHJcbiAgICBsZXQgeyBzZGtQLCBzZGtEIH0gPSBnZXRTZGsoKVxyXG4gICAgbGV0IHRoYXRQXHJcbiAgICBpZiAoc2RrRCAmJiBzZGtQKSB7XHJcbiAgICAgIGlmICh0aGlzLnNkayA9PT0gc2RrRCkge1xyXG4gICAgICAgIHRoYXRQID0gc2RrUC5lbnRpdHlNYXAuZ2V0KHRoaXMub3B0aW9ucy5pZClcclxuICAgICAgICBpZiAodGhhdFAgJiYgdGhhdFAuZW50aXR5ICYmIHRoYXRQLmVudGl0eS5wb2x5Z29uICYmIHRoYXRQLnBvc2l0aW9uc0gpIHtcclxuICAgICAgICAgIHRoaXMuZW50aXR5LnBvbHlnb24uaGllcmFyY2h5ID0gbmV3IENlc2l1bS5DYWxsYmFja1Byb3BlcnR5KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBDZXNpdW0uUG9seWdvbkhpZXJhcmNoeSh0aGF0UC5wb3NpdGlvbnNIKVxyXG4gICAgICAgICAgfSwgZmFsc2UpXHJcbiAgICAgICAgICB0aGlzLmVudGl0eS5wb2x5bGluZS5wb3NpdGlvbnMgPSBuZXcgQ2VzaXVtLkNhbGxiYWNrUHJvcGVydHkoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gWy4uLnRoYXRQLnBvc2l0aW9uc0gsIHRoYXRQLnBvc2l0aW9uc0hbMF0sIHRoYXRQLnBvc2l0aW9uc0hbMV1dXHJcbiAgICAgICAgICB9LCBmYWxzZSlcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuXHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyB0aGlzLmVudGl0eS5wb2x5Z29uLmhpZXJhcmNoeSA9IGFyclxyXG4gICAgLy8gdGhpcy5lbnRpdHkucG9seWxpbmUucG9zaXRpb25zID0gbGluZUFyclxyXG5cclxuICAgIGxldCBsaW5lUG9zODQgPSBbWyh0aGF0Lm9wdGlvbnMucG9zaXRpb25zWzBdLmxuZyArIHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbMV0ubG5nKSAvIDIsICh0aGF0Lm9wdGlvbnMucG9zaXRpb25zWzBdLmxhdCArIHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbMV0ubGF0KSAvIDJdXVxyXG4gICAgZm9yIChsZXQgaSA9IDI7IGkgPCB0aGF0Lm9wdGlvbnMucG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGxpbmVQb3M4NC5wdXNoKFt0aGF0Lm9wdGlvbnMucG9zaXRpb25zW2ldLmxuZywgdGhhdC5vcHRpb25zLnBvc2l0aW9uc1tpXS5sYXRdKVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICBsZXQgbGluZSA9IHR1cmYubGluZVN0cmluZyhsaW5lUG9zODQpO1xyXG5cclxuICAgIGxldCBkaXN0YW5jZUFycmF5ID0gW11cclxuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgbGluZVBvczg0Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGxldCBmcm9tID0gdHVyZi5wb2ludChsaW5lUG9zODRbaV0pO1xyXG4gICAgICBsZXQgdG8gPSB0dXJmLnBvaW50KGxpbmVQb3M4NFtpIC0gMV0pO1xyXG4gICAgICBsZXQgZCA9IHR1cmYuZGlzdGFuY2UoZnJvbSwgdG8sIHsgdW5pdHM6ICdraWxvbWV0ZXJzJyB9KTtcclxuICAgICAgbGV0IG9kID0gZGlzdGFuY2VBcnJheVtkaXN0YW5jZUFycmF5Lmxlbmd0aCAtIDFdIHx8IDBcclxuICAgICAgZGlzdGFuY2VBcnJheS5wdXNoKG9kICsgZClcclxuICAgIH1cclxuXHJcbiAgICBsZXQgZGlzdGFuY2UgPSB0dXJmLmxlbmd0aChsaW5lLCB7IHVuaXRzOiAna2lsb21ldGVycycgfSk7XHJcbiAgICBsZXQgdGltZVJhdGlvID0gdGltZSAvIHRoaXMuc3ByZWFkVGltZVxyXG4gICAgbGV0IG0gPSAwXHJcbiAgICB0aGlzLlR3ZWVuQW5pbWF0ZSA9IG5ldyBUV0VFTi5Ud2Vlbih7IGRpc3RhbmNlOiBkaXN0YW5jZSAqIHRpbWVSYXRpbyB9KS50byh7IGRpc3RhbmNlOiBkaXN0YW5jZSB9LCB0aGlzLnNwcmVhZFRpbWUgLSB0aW1lKS5lYXNpbmcoVFdFRU4uRWFzaW5nLkxpbmVhci5Ob25lKS5yZXBlYXQodGhpcy5vcHRpb25zLmxvb3AgPyBJbmZpbml0eSA6IDApLm9uUmVwZWF0KCgpID0+IHtcclxuICAgICAgaWYgKHRpbWUpIHtcclxuICAgICAgICB0aGlzLnNldFNwcmVhZFByb2dyZXNzQnlUaW1lKClcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuXHJcbiAgICAgIH1cclxuICAgIH0pLm9uVXBkYXRlKGFzeW5jIChyLCBhKSA9PiB7XHJcbiAgICAgIGlmICh0aGlzLlR3ZWVuQW5pbWF0ZS5fZHVyYXRpb24gPT0gSW5maW5pdHkpIHtcclxuICAgICAgICByZXR1cm5cclxuICAgICAgfVxyXG4gICAgICBtKytcclxuICAgICAgaWYgKCF0aGlzLnNkay52aWV3ZXIpIHtcclxuICAgICAgICB0aGlzLnJlbW92ZUFuaW1hdGUoKVxyXG4gICAgICAgIHJldHVyblxyXG4gICAgICB9XHJcbiAgICAgIHNldFNwcmVhZChyKVxyXG4gICAgfSkub25TdGFydCgoKSA9PiB7XHJcbiAgICAgIHRoaXMub3B0aW9ucy5zcHJlYWRTdGF0ZSA9IHRydWVcclxuICAgICAgdGhpcy5fZWxtcy5zcHJlYWRTdGF0ZSAmJiB0aGlzLl9lbG1zLnNwcmVhZFN0YXRlLmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgICBpdGVtLmNoZWNrZWQgPSB0cnVlXHJcbiAgICAgIH0pXHJcbiAgICB9KS5vbkNvbXBsZXRlKChkKSA9PiB7XHJcbiAgICAgIHRoaXMucmVtb3ZlQW5pbWF0ZSgpXHJcbiAgICB9KVxyXG4gICAgaWYgKHRoaXMuc3ByZWFkU3RhdGUpIHtcclxuICAgICAgdGhpcy5Ud2VlbkFuaW1hdGUuc3RhcnQoKVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHNldFNwcmVhZCh7IGRpc3RhbmNlOiBkaXN0YW5jZSAqIHRpbWVSYXRpbyB9KVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGZ1bmN0aW9uIHNldFNwcmVhZCh2KSB7XHJcbiAgICAgIGlmICghdGhhdC5zaG93KSB7XHJcbiAgICAgICAgcmV0dXJuXHJcbiAgICAgIH1cclxuICAgICAgbGV0IGluZGV4ID0gMlxyXG4gICAgICBmb3IgKGxldCBpID0gZGlzdGFuY2VBcnJheS5sZW5ndGggLSAyOyBpID49IDA7IGktLSkge1xyXG4gICAgICAgIGlmICh2LmRpc3RhbmNlID49IGRpc3RhbmNlQXJyYXlbaV0pIHtcclxuICAgICAgICAgIGluZGV4ID0gaW5kZXggKyBpICsgMVxyXG4gICAgICAgICAgaWYgKGluZGV4ID4gdGhhdC5vcHRpb25zLnBvc2l0aW9ucy5sZW5ndGggLSAxKSB7XHJcbiAgICAgICAgICAgIGluZGV4ID0gdGhhdC5vcHRpb25zLnBvc2l0aW9ucy5sZW5ndGggLSAxXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVha1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBsZXQgcG9zaXRpb25zID0gW11cclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbmRleDsgaSsrKSB7XHJcbiAgICAgICAgcG9zaXRpb25zW2ldID0geyAuLi50aGF0Lm9wdGlvbnMucG9zaXRpb25zW2ldIH1cclxuICAgICAgfVxyXG4gICAgICBpZiAoIXYuZGlzdGFuY2UpIHtcclxuICAgICAgICBwb3NpdGlvbnNbaW5kZXhdID0ge1xyXG4gICAgICAgICAgbG5nOiBwb3NpdGlvbnNbMV0ubG5nLFxyXG4gICAgICAgICAgbGF0OiBwb3NpdGlvbnNbMV0ubGF0XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGxldCBzbGljZWQgPSBhd2FpdCB0dXJmLmxpbmVTbGljZUFsb25nKGxpbmUsIDAsIHYuZGlzdGFuY2UsIHsgdW5pdHM6ICdraWxvbWV0ZXJzJyB9KTtcclxuICAgICAgICBsZXQgY29vcmRpbmF0ZXMgPSBbLi4uc2xpY2VkLmdlb21ldHJ5LmNvb3JkaW5hdGVzW3NsaWNlZC5nZW9tZXRyeS5jb29yZGluYXRlcy5sZW5ndGggLSAxXV1cclxuICAgICAgICBpZiAoIXBvc2l0aW9uc1tpbmRleF0pIHtcclxuICAgICAgICAgIHBvc2l0aW9uc1tpbmRleF0gPSB7fVxyXG4gICAgICAgIH1cclxuICAgICAgICBwb3NpdGlvbnNbaW5kZXhdLmxuZyA9IGNvb3JkaW5hdGVzWzBdXHJcbiAgICAgICAgcG9zaXRpb25zW2luZGV4XS5sYXQgPSBjb29yZGluYXRlc1sxXVxyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBjb25zb2xlLmxvZygncG9zaXRpb25zJywgcG9zaXRpb25zKVxyXG4gICAgICB0aGF0LnJlbmV3UG9zaXRpb25zKHBvc2l0aW9ucylcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmVudGl0eS5wb2x5Z29uLmhpZXJhcmNoeSA9IG5ldyBDZXNpdW0uQ2FsbGJhY2tQcm9wZXJ0eShmdW5jdGlvbiAoKSB7XHJcbiAgICAgIHJldHVybiBuZXcgQ2VzaXVtLlBvbHlnb25IaWVyYXJjaHkodGhhdC5wb3NpdGlvbnNIKVxyXG4gICAgfSwgZmFsc2UpXHJcbiAgICB0aGlzLmVudGl0eS5wb2x5bGluZS5wb3NpdGlvbnMgPSBuZXcgQ2VzaXVtLkNhbGxiYWNrUHJvcGVydHkoZnVuY3Rpb24gKCkge1xyXG4gICAgICByZXR1cm4gWy4uLnRoYXQucG9zaXRpb25zSCwgdGhhdC5wb3NpdGlvbnNIWzBdLCB0aGF0LnBvc2l0aW9uc0hbMV1dXHJcbiAgICB9LCBmYWxzZSlcclxuICB9XHJcblxyXG4gIC8vIOenu+mZpOWKqOeUu1xyXG4gIHJlbW92ZUFuaW1hdGUoKSB7XHJcbiAgICB0aGlzLnNwcmVhZFN0YXRlID0gZmFsc2VcclxuICAgIGlmICh0aGlzLlR3ZWVuQW5pbWF0ZSkge1xyXG4gICAgICBUV0VFTi5yZW1vdmUodGhpcy5Ud2VlbkFuaW1hdGUpXHJcbiAgICAgIHRoaXMuVHdlZW5BbmltYXRlID0gbnVsbFxyXG4gICAgICB0aGlzLnJlbmV3UG9zaXRpb25zKClcclxuICAgICAgdGhpcy5lbnRpdHkucG9seWdvbi5oaWVyYXJjaHkgPSBuZXcgQ2VzaXVtLlBvbHlnb25IaWVyYXJjaHkodGhpcy5wb3NpdGlvbnNIKVxyXG4gICAgICB0aGlzLmVudGl0eS5wb2x5bGluZS5wb3NpdGlvbnMgPSBbLi4udGhpcy5wb3NpdGlvbnNILCB0aGlzLnBvc2l0aW9uc0hbMF0sIHRoaXMucG9zaXRpb25zSFsxXV1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIOabtOaWsOWdkOagh1xyXG4gIHJlbmV3UG9zaXRpb25zKHBvc2l0aW9uODQpIHtcclxuICAgIGlmICh0aGlzLl9lcnJvciB8fCAhdGhpcy5zZGsudmlld2VyKSB7XHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG4gICAgbGV0IGdyb3VuZCA9IGZhbHNlXHJcblxyXG4gICAgbGV0IGFycmF5ID0gW11cclxuICAgIGxldCBwb3NpdGlvbnMgPSB0aGlzLm9wdGlvbnMucG9zaXRpb25zXHJcbiAgICBpZiAocG9zaXRpb244NCkge1xyXG4gICAgICBwb3NpdGlvbnMgPSBwb3NpdGlvbjg0XHJcbiAgICB9XHJcbiAgICBsZXQgZnJvbURlZ3JlZXNBcnJheSA9IFtdXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBmcm9tRGVncmVlc0FycmF5LnB1c2gocG9zaXRpb25zW2ldLmxuZywgcG9zaXRpb25zW2ldLmxhdClcclxuICAgIH1cclxuICAgIHRoaXMucG9zaXRpb25zID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXNBcnJheShmcm9tRGVncmVlc0FycmF5KVxyXG5cclxuICAgIGxldCBwb3NpdGlvbnNBID0gdGhpcy5jb21wdXRlQXR0YWNrQXJyb3cocG9zaXRpb25zKVxyXG4gICAgaWYgKHBvc2l0aW9uc0EubGVuZ3RoID09IDApIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcbiAgICBsZXQgcG9pbnRzID0gW1tdXVxyXG4gICAgbGV0IHBvczg0ID0gW11cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9zaXRpb25zQS5sZW5ndGg7IGkrKykge1xyXG4gICAgICBsZXQgcG9zaXRpb24gPSB0aGlzLmNhcnRlc2lhbjNUb3dnczg0KHBvc2l0aW9uc0FbaV0sIHRoaXMuc2RrLnZpZXdlcilcclxuICAgICAgcG9zODQucHVzaChwb3NpdGlvbilcclxuICAgICAgcG9pbnRzWzBdLnB1c2goW3Bvc2l0aW9uLmxuZywgcG9zaXRpb24ubGF0XSlcclxuICAgIH1cclxuICAgIGxldCBwb3NpdGlvbiA9IHRoaXMuY2FydGVzaWFuM1Rvd2dzODQocG9zaXRpb25zQVswXSwgdGhpcy5zZGsudmlld2VyKVxyXG4gICAgcG9pbnRzWzBdLnB1c2goW3Bvc2l0aW9uLmxuZywgcG9zaXRpb24ubGF0XSlcclxuICAgIGxldCBoZWlnaHQgPSAwXHJcbiAgICBsZXQgcG9seWdvbiA9IHR1cmYucG9seWdvbihwb2ludHMpXHJcbiAgICBsZXQgY2VudHJvaWQgPSB0dXJmLnBvaW50T25GZWF0dXJlKHBvbHlnb24pXHJcbiAgICBzd2l0Y2ggKHRoaXMub3B0aW9ucy5oZWlnaHRNb2RlKSB7XHJcbiAgICAgIGNhc2UgJzAnOlxyXG4gICAgICBjYXNlIDA6XHJcbiAgICAgICAgZ3JvdW5kID0gZmFsc2VcclxuICAgICAgICBicmVha1xyXG4gICAgICBjYXNlICcxJzpcclxuICAgICAgY2FzZSAxOlxyXG4gICAgICAgIGhlaWdodCA9IHRoaXMuc2RrLnZpZXdlci5zY2VuZS5nbG9iZS5nZXRIZWlnaHQoQ2VzaXVtLkNhcnRvZ3JhcGhpYy5mcm9tRGVncmVlcyhjZW50cm9pZC5nZW9tZXRyeS5jb29yZGluYXRlc1swXSwgY2VudHJvaWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMV0pKSB8fCAwXHJcbiAgICAgICAgZ3JvdW5kID0gZmFsc2VcclxuICAgICAgICBicmVha1xyXG4gICAgICBjYXNlICcyJzpcclxuICAgICAgY2FzZSAyOlxyXG4gICAgICAgIGdyb3VuZCA9IHRydWVcclxuICAgICAgICBicmVha1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBmcm9tRGVncmVlc0FycmF5MiA9IFtdXHJcbiAgICBpZiAoIWdyb3VuZCAmJiB0aGlzLm5vZGVQb2ludHMubGVuZ3RoID09IDApIHtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb2ludHNbMF0ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBmcm9tRGVncmVlc0FycmF5Mi5wdXNoKFxyXG4gICAgICAgICAgcG9pbnRzWzBdW2ldWzBdLFxyXG4gICAgICAgICAgcG9pbnRzWzBdW2ldWzFdLFxyXG4gICAgICAgICAgdGhpcy5oZWlnaHQgKyBoZWlnaHRcclxuICAgICAgICApXHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5wb3NpdGlvbnNIID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXNBcnJheUhlaWdodHMoZnJvbURlZ3JlZXNBcnJheTIpXHJcblxyXG4gICAgICB0aGlzLmxhYmVsICYmICh0aGlzLmxhYmVsLnBvc2l0aW9uID0gW1xyXG4gICAgICAgIGNlbnRyb2lkLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzBdLFxyXG4gICAgICAgIGNlbnRyb2lkLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzFdLFxyXG4gICAgICAgIHRoaXMuaGVpZ2h0ICsgaGVpZ2h0XHJcbiAgICAgIF0pXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnBvc2l0aW9uc0ggPSBwb3NpdGlvbnNBXHJcblxyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICBpZiAoIXRoaXMuc2RrLnZpZXdlcikge1xyXG4gICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBvYmplY3RzVG9FeGNsdWRlID0gWy4uLnRoaXMuc2RrLnZpZXdlci5lbnRpdGllcy52YWx1ZXNdXHJcbiAgICAgICAgdGhpcy5nZXRDbGFtcFRvSGVpZ2h0KHtcclxuICAgICAgICAgIGxuZzogY2VudHJvaWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMF0sXHJcbiAgICAgICAgICBsYXQ6IGNlbnRyb2lkLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzFdXHJcbiAgICAgICAgfSwgb2JqZWN0c1RvRXhjbHVkZSkudGhlbihoZWlnaHQgPT4ge1xyXG4gICAgICAgICAgdGhpcy5sYWJlbCAmJiAodGhpcy5sYWJlbC5wb3NpdGlvbiA9IFtcclxuICAgICAgICAgICAgY2VudHJvaWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMF0sXHJcbiAgICAgICAgICAgIGNlbnRyb2lkLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzFdLFxyXG4gICAgICAgICAgICBoZWlnaHRcclxuICAgICAgICAgIF0pXHJcbiAgICAgICAgfSlcclxuICAgICAgfSwgMTAwKVxyXG4gICAgfVxyXG5cclxuICAgIC8vIOiuoeeul+aKleW9semdouenr1xyXG4gICAgaWYgKCF0aGlzLnNwcmVhZFN0YXRlKSB7XHJcbiAgICAgIHRoaXMub3B0aW9ucy5hcmVhQnlNZXRlciA9IHRoaXMuY29tcHV0ZUFyZWEocG9zODQpXHJcbiAgICAgIHRoaXMuYXJlYVVuaXQgPSB0aGlzLmFyZWFVbml0XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZnJvbURlZ3JlZXNBcnJheVxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgQXR0YWNrQXJyb3dPYmplY3RcclxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQVNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFXQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFYQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBckJBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUF3Q0E7QUE3Q0E7QUFBQTtBQUFBO0FBQUE7QUE4Q0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQVZBO0FBQUE7QUFRQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBbEJBO0FBQUE7QUFBQTtBQXVCQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFTQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBV0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBWEE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQXJCQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBd0NBO0FBN0NBO0FBQUE7QUFBQTtBQUFBO0FBOENBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFWQTtBQUFBO0FBUUE7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQWxCQTtBQUFBO0FBQUE7QUFtQkE7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBNklBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBekhBO0FBQUE7QUFBQTtBQTBIQTtBQUFBO0FBQUE7QUFHQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBM0NBO0FBNENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFLQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFHQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBTEE7QUFBQTtBQUFBO0FBQUE7QUFTQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBTUE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBM2VBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBNmVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQWJBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBZ0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUFBO0FBRUE7QUFVQTtBQUFBO0FBUEE7QUFBQTtBQUFBO0FBSUE7QUFBQTtBQUFBO0FBSUE7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBS0E7QUFBQTtBQVBBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBVUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBcEdBO0FBQUE7QUFBQTtBQUFBO0FBc0dBO0FBQ0E7QUFDQTtBQUZBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUxBO0FBQUE7QUFBQTtBQXlMQTtBQUNBO0FBQUE7QUFwTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFtVkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFHQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFMQTtBQUFBO0FBQUE7QUFBQTtBQVNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUtBO0FBQ0E7QUFFQTtBQUtBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFyd0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUtBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBbkJBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBKzZCQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQXJFQTtBQUFBO0FBQUE7QUFxRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQS9GQTtBQUFBO0FBS0E7QUEyRkE7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQW1MQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFkQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFnQkE7QUFsQkE7QUFBQTtBQUFBO0FBb0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBbE5BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUtBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQWtDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUF5WkEiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/Obj/Base/AttackArrowObject/index.js\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ \"./node_modules/@babel/runtime/helpers/defineProperty.js\");\n/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ \"./node_modules/@babel/runtime/helpers/asyncToGenerator.js\");\n/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/toConsumableArray */ \"./node_modules/@babel/runtime/helpers/toConsumableArray.js\");\n/* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ \"./node_modules/@babel/runtime/helpers/classCallCheck.js\");\n/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ \"./node_modules/@babel/runtime/helpers/createClass.js\");\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ \"./node_modules/@babel/runtime/helpers/possibleConstructorReturn.js\");\n/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ \"./node_modules/@babel/runtime/helpers/getPrototypeOf.js\");\n/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ \"./node_modules/@babel/runtime/helpers/inherits.js\");\n/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @babel/runtime/regenerator */ \"./node_modules/@babel/runtime/regenerator/index.js\");\n/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8__);\n/* harmony import */ var _Element_Dialog__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../Element/Dialog */ \"./src/Obj/Element/Dialog/index.js\");\n/* harmony import */ var _Element_cy_html_tabs__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../Element/cy_html_tabs */ \"./src/Obj/Element/cy_html_tabs.js\");\n/* harmony import */ var _Element_richText__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../Element/richText */ \"./src/Obj/Element/richText.js\");\n/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./_element */ \"./src/Obj/Base/AttackArrowObject/_element.js\");\n/* harmony import */ var _index__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../index */ \"./src/Obj/Base/index.js\");\n/* harmony import */ var _LabelObject__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../LabelObject */ \"./src/Obj/Base/LabelObject/index.js\");\n/* harmony import */ var _Event_index__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../../../Event/index */ \"./src/Event/index.js\");\n/* harmony import */ var _MouseTip__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../../../MouseTip */ \"./src/MouseTip/index.js\");\n/* harmony import */ var _Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../../../Global/MultiViewportMode */ \"./src/Global/MultiViewportMode/index.js\");\n/* harmony import */ var _Element_datalist__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../../Element/datalist */ \"./src/Obj/Element/datalist.js\");\n/* harmony import */ var _Element_fontSelect__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../../Element/fontSelect */ \"./src/Obj/Element/fontSelect.js\");\n/* harmony import */ var _Global_SplitScreen__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../../../Global/SplitScreen */ \"./src/Global/SplitScreen/index.js\");\n/* harmony import */ var _Global_global__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../../../Global/global */ \"./src/Global/global.js\");\n\n\n\n\n\n\n\n\nfunction _createForOfIteratorHelper(r, e) { var t = \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && \"number\" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t.return || t.return(); } finally { if (u) throw o; } } }; }\nfunction _unsupportedIterableToArray(r, a) { if (r) { if (\"string\" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }\nfunction _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default()(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\n\nfunction _callSuper(t, o, e) { return o = _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6___default()(o), _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_5___default()(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6___default()(t).constructor) : o.apply(t, e)); }\nfunction _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }\n/**\r\n * 箭头\r\n */\n\n\n\n\n\n\n\n\n\n\n\n\n\n// import EditParticle from \"../../ModelController/EditParticle\";\nvar AttackArrowObject = /*#__PURE__*/function (_Base) {\n /**\r\n * @constructor\r\n * @param sdk\r\n * @description 箭头面\r\n * @param options {object} 属性\r\n * @param options.id {string} 唯一标识\r\n * @param options.show=true {boolean} 显示/隐藏\r\n * @param options.name {string} 名称\r\n * @param options.color='rgba(255, 0, 0, 0.5)' {string} 颜色\r\n * @param options.height {number} 高度\r\n * @param options.heightMode=2{number} 高度模式(0:海拔高度;1:相对地表;2:依附模式)\r\n * @param options.areaUnit='平方米' {string} 面积单位\r\n * @param options.line {object} 边框\r\n * @param options.line.width=2 {string} 边框宽\r\n * @param options.line.color=\"rgba(155, 155, 124, 0.89)\" {string} 边框颜色\r\n * @param {Array.} options.positions 必填,经纬度和高度的列表,值交替 [{lon,lat,alt},...]\r\n * @param options.positions[].lng {number} 经度\r\n * @param options.positions[].lat {number} 纬度\r\n * @param options.positions[].alt {number} 高度\r\n * @param options.spreadState=false {boolean} 动画\r\n * @param options.loop=false {loop} 动画重复\r\n * @param options.spreadTime=3000 {number} 动画持续时长(毫秒)\r\n * @param options.label {object} 标签对象\r\n * @param options.label.text {string} 标签文本\r\n * @param options.label.show {string} 标签显隐\r\n * @param options.label.position {string} 标签位置\r\n * @param options.label.position {object} 标签位置\r\n * @param options.label.position.lng {number} 经度\r\n * @param options.label.position.lat {number} 纬度\r\n * @param options.label.position.alt {number} 高度\r\n * @param options.label.fontSize=20 {number} 字体大小\r\n * @param options.label.fontFamily=0 {number} 字体项 0:黑体;1:思源黑体;2:庞门正道标题体;3:数黑体\r\n * @param options.label.color=#ffffff {string} 字体颜色\r\n * @param options.label.lineWidth=4 {number} 引线宽\r\n * @param options.label.lineColor=#00ffff80 {string} 引线颜色\r\n * @param options.label.pixelOffset=20 {number} 字体偏移(引线长度)\r\n * @param options.label.backgroundColor=['#00ffff80', '#00ffff80'] {array} 背景颜色\r\n * @param options.label.scaleByDistance {boolean} 距离缩放\r\n * @param options.label.near=2000 {number} 视野缩放最近距离\r\n * @param options.label.far=100000 {number} 视野缩放最远距离\r\n * @param options.attribute {object} 属性内容\r\n * @param options.attribute.link={} {object} 链接\r\n * @param options.attribute.link.content=[]] {array} 链接内容\r\n * @param options.attribute.link.content[].name {string} 链接名称\r\n * @param options.attribute.link.content[].url {string} 链接地址\r\n * @param options.richTextContent {string} 富文本内容\r\n * @param options.customView {object} 默认视角\r\n * @param options.customView.orientation {object} 默认视角方位\r\n * @param options.customView.orientation.heading {number} 航向角\r\n * @param options.customView.orientation.pitch {number} 俯仰角\r\n * @param options.customView.orientation.roll {number} 翻滚角\r\n * @param options.customView.relativePosition {object} 视角相对位置\r\n * @param options.customView.relativePosition.lng {number} 经度\r\n * @param options.customView.relativePosition.lat {number} 纬度\r\n * @param options.customView.relativePosition.alt {number} 高度\r\n * */\n function AttackArrowObject(sdk) {\n var _this2;\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var _Dialog = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3___default()(this, AttackArrowObject);\n _this2 = _callSuper(this, AttackArrowObject, [sdk, options]);\n _this2.options.name = options.name || '未命名对象';\n _this2.options.color = options.color || \"#ff000080\";\n _this2.options.show = options.show || options.show === false ? options.show : true;\n _this2.options.positions = options.positions || [];\n _this2.options.heightMode = options.heightMode || options.heightMode == 0 ? options.heightMode : 2;\n _this2.options.line = options.line || {};\n _this2.options.line.width = _this2.options.line.width || _this2.options.line.width === 0 ? _this2.options.line.width : 3;\n _this2.options.line.color = _this2.options.line.color || 'rgba(255, 0, 0, 1)';\n _this2.entity;\n _this2.event = new _Event_index__WEBPACK_IMPORTED_MODULE_15__[\"default\"](_this2.sdk);\n _this2.operate = {};\n _this2._elms = {};\n _this2.nodePoints = [];\n _this2.Dialog = _Dialog;\n _this2.options.loop = options.loop || false;\n _this2.options.spreadState = options.spreadState || false;\n _this2.spreadTime = options.spreadTime;\n options.label = options.label || {};\n _this2.options.label = {\n text: _this2.options.name,\n show: options.label.show || false,\n position: options.label.position,\n fontFamily: options.label.fontFamily ? options.label.fontFamily : 0,\n fontSize: options.label.fontSize || options.label.fontSize === 0 ? options.label.fontSize : 20,\n color: options.label.color || '#ffffff',\n lineWidth: options.label.lineWidth || options.label.lineWidth === 0 ? options.label.lineWidth : 4,\n pixelOffset: options.label.pixelOffset || options.label.pixelOffset === 0 ? options.label.pixelOffset : 20,\n backgroundColor: options.label.backgroundColor || ['#00ffff80', '#00ffff80'],\n lineColor: options.label.lineColor || '#00ffff80',\n scaleByDistance: options.label.scaleByDistance || false,\n near: options.label.near || options.label.near === 0 ? options.label.near : 2000,\n far: options.label.far || options.label.far === 0 ? options.label.far : 100000\n };\n _this2.options.attribute = options.attribute || {};\n _this2.options.attribute.link = _this2.options.attribute.link || {};\n _this2.options.attribute.link.content = _this2.options.attribute.link.content || [];\n delete _this2.options.attribute.camera;\n delete _this2.options.attribute.vr;\n delete _this2.options.attribute.goods;\n if (!_this2.options.positions || _this2.options.positions.length < 3) {\n _this2._error = '箭头面最少需要三个坐标!';\n console.warn(_this2._error);\n window.ELEMENT && window.ELEMENT.Message({\n message: _this2._error,\n type: 'warning',\n duration: 1500\n });\n } else {\n if (!_this2.options.height && _this2.options.height !== 0) {\n var height = _this2.options.positions[0].alt;\n for (var i = 1; i < _this2.options.positions.length; i++) {\n if (height < _this2.options.positions[i].alt) {\n height = _this2.options.positions[i].alt;\n }\n }\n _this2.options.height = height;\n }\n _this2.sdk.addIncetance(_this2.options.id, _this2);\n AttackArrowObject.create(_this2);\n }\n return _this2;\n }\n _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_7___default()(AttackArrowObject, _Base);\n return _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4___default()(AttackArrowObject, [{\n key: \"type\",\n get: function get() {\n return 'AttackArrowObject';\n }\n }, {\n key: \"color\",\n get: function get() {\n return this.options.color;\n },\n set: function set(v) {\n var _this3 = this;\n this.options.color = v || 'rgba(255, 0, 0, 0.5)';\n if (!this.sdk || !this.sdk.viewer || !this.entity || !this.entity.polygon) {\n return;\n }\n var material = Cesium.Color.fromCssColorString(this.options.color);\n if (this.sdk.viewer.scene.mode === 2) {\n material = new Cesium.CustomColorMaterialSource({\n color: this.options.color\n });\n }\n this.entity.polygon.material = material;\n if (this._elms.color) {\n this._elms.color.forEach(function (item, i) {\n var colorPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: _this3.options.color,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(c) {\n _this3.color = c;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this3.color = 'rgba(255,0,0,0.5)';\n } //点击清空按钮事件回调\n });\n _this3._elms.color[i] = colorPicker;\n });\n }\n }\n }, {\n key: \"heightMode\",\n get: function get() {\n return this.options.heightMode ? this.options.heightMode : 0;\n },\n set: function set(v) {\n var _this4 = this;\n this.entity.polygon.hierarchy = [];\n setTimeout(function () {\n _this4.options.heightMode = v || v == 0 ? v : 2;\n _this4.positionEditing = false;\n if (!_this4.entity) {\n return;\n }\n var heightModeName = '';\n _this4.closeNodeEdit();\n var ground = false;\n var disabled = false;\n _this4.renewPositions();\n _this4.entity.polyline.positions = [].concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(_this4.positionsH), [_this4.positionsH[0], _this4.positionsH[1]]);\n _this4.entity.polygon.hierarchy = new Cesium.PolygonHierarchy(_this4.positionsH);\n switch (_this4.options.heightMode) {\n case '0':\n case 0:\n heightModeName = '海拔高度';\n break;\n case '1':\n case 1:\n heightModeName = '相对地表';\n break;\n case '2':\n case 2:\n ground = true;\n disabled = true;\n heightModeName = '依附模型';\n break;\n }\n _this4.previous = null;\n _this4.label.ground = ground;\n _this4.entity.polyline.clampToGround = ground;\n _this4.entity.polyline.arcType = !ground ? Cesium.ArcType.NONE : Cesium.ArcType.GEODESIC, _this4.entity.polygon.perPositionHeight = !ground ? true : false;\n _this4._elms.heightMode && (_this4._elms.heightMode.value = heightModeName);\n _this4._elms.heightModeObject && _this4._elms.heightModeObject.legp_searchActive(heightModeName);\n if (disabled) {\n _this4._elms.heightBox && (_this4._elms.heightBox.className = 'input-number input-number-unit-1 height-box disabled');\n _this4._elms.heightConfirm && _this4._elms.heightConfirm.setAttribute('disabled', 'disabled');\n } else {\n _this4._elms.heightBox && (_this4._elms.heightBox.className = 'input-number input-number-unit-1 height-box');\n _this4._elms.heightConfirm && _this4._elms.heightConfirm.removeAttribute('disabled');\n }\n }, 50);\n }\n }, {\n key: \"height\",\n get: function get() {\n return this.options.height;\n },\n set: function set(v) {\n var _this5 = this;\n if (!v || isNaN(Number(v))) {\n this.options.height = 0;\n } else {\n this.options.height = Number(Number(v).toFixed(2));\n }\n var ground;\n if (this.heightMode == 2) {\n ground = true;\n } else {\n ground = false;\n }\n this.renewPositions();\n setTimeout(function () {\n _this5.entity.polygon.hierarchy = new Cesium.PolygonHierarchy(_this5.positionsH);\n _this5.entity.polygon.perPositionHeight = !ground ? true : false;\n _this5.entity.polyline.positions = [].concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(_this5.positionsH), [_this5.positionsH[0], _this5.positionsH[1]]);\n _this5.entity.polyline.clampToGround = !ground ? false : true;\n _this5.entity.polyline.arcType = !ground ? Cesium.ArcType.NONE : Cesium.ArcType.GEODESIC;\n }, 0);\n this._elms.alt && this._elms.alt.forEach(function (item) {\n item.innerHTML = _this5.options.height;\n });\n }\n }, {\n key: \"lineColor\",\n get: function get() {\n return this.options.line.color;\n },\n set: function set(v) {\n var _this6 = this;\n this.options.line.color = v || 'rgba(255, 0, 0, 0.5)';\n if (!this.sdk || !this.sdk.viewer || !this.entity || !this.entity.polyline) {\n return;\n }\n this.entity.polyline.material = Cesium.Color.fromCssColorString(this.options.line.color);\n if (this._elms.lineColor) {\n this._elms.lineColor.forEach(function (item, i) {\n var lineColorPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: _this6.options.line.color,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(c) {\n _this6.lineColor = c;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this6.lineColor = 'rgba(255,0,0,0.5)';\n } //点击清空按钮事件回调\n });\n _this6._elms.lineColor[i] = lineColorPicker;\n });\n }\n }\n }, {\n key: \"lineWidth\",\n get: function get() {\n return this.options.line.width;\n },\n set: function set(v) {\n this.options.line.width = v || v === 0 ? v : 3;\n this.entity.polyline.width = this.options.line.width;\n this._elms.lineColor && this._elms.lineColor.forEach(function (item) {\n item.value = v;\n });\n }\n }, {\n key: \"labelShow\",\n get: function get() {\n return this.options.label.show;\n },\n set: function set(v) {\n this.options.label.show = v;\n if (this.show && !this.showView || this.showView == 3) {\n this.label.show = v;\n } else {\n this.label.show = false;\n }\n this._elms.labelShow && this._elms.labelShow.forEach(function (item) {\n item.checked = v;\n });\n }\n }, {\n key: \"labelFontFamily\",\n get: function get() {\n return this.options.label.fontFamily;\n },\n set: function set(v) {\n this.options.label.fontFamily = v || 0;\n this.label && (this.label.fontFamily = this.options.label.fontFamily);\n var name = Object(_Element_fontSelect__WEBPACK_IMPORTED_MODULE_19__[\"getFontFamilyName\"])(this.labelFontFamily) || '';\n this._elms.labelFontFamily && this._elms.labelFontFamily.forEach(function (item) {\n item.value = name;\n });\n }\n }, {\n key: \"labelColor\",\n get: function get() {\n return this.options.label.color;\n },\n set: function set(v) {\n var _this7 = this;\n this.options.label.color = v;\n this.label.color = v;\n if (this._elms.labelColor) {\n this._elms.labelColor.forEach(function (item, i) {\n var labelColorPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: _this7.labelColor,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this7.labelColor = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this7.labelColor = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n _this7._elms.labelColor[i] = labelColorPicker;\n });\n }\n }\n }, {\n key: \"labelFontSize\",\n get: function get() {\n return this.options.label.fontSize;\n },\n set: function set(v) {\n this.options.label.fontSize = v;\n this.label.fontSize = v;\n this._elms.labelFontSize && this._elms.labelFontSize.forEach(function (item) {\n item.value = v;\n });\n }\n }, {\n key: \"labelScaleByDistance\",\n get: function get() {\n return this.options.label.scaleByDistance;\n },\n set: function set(v) {\n this.options.label.scaleByDistance = v;\n this.label.scaleByDistance = v;\n this._elms.labelScaleByDistance && this._elms.labelScaleByDistance.forEach(function (item) {\n item.checked = v;\n });\n }\n }, {\n key: \"labelNear\",\n get: function get() {\n return this.options.label.near;\n },\n set: function set(v) {\n var near = v;\n if (near > this.labelFar) {\n near = this.labelFar;\n }\n this.options.label.near = near;\n this.label.near = near;\n this._elms.labelNear && this._elms.labelNear.forEach(function (item) {\n item.value = near;\n });\n }\n }, {\n key: \"labelFar\",\n get: function get() {\n return this.options.label.far;\n },\n set: function set(v) {\n var far = v;\n if (far < this.labelNear) {\n far = this.labelNear;\n }\n this.options.label.far = far;\n this.label.far = far;\n this._elms.labelFar && this._elms.labelFar.forEach(function (item) {\n item.value = far;\n });\n }\n }, {\n key: \"labelLineWidth\",\n get: function get() {\n return this.options.label.lineWidth;\n },\n set: function set(v) {\n this.options.label.lineWidth = v;\n this.label.lineWidth = v;\n this._elms.labelLineWidth && this._elms.labelLineWidth.forEach(function (item) {\n item.value = v;\n });\n }\n }, {\n key: \"labelPixelOffset\",\n get: function get() {\n return this.options.label.pixelOffset;\n },\n set: function set(v) {\n this.options.label.pixelOffset = v;\n this.label.pixelOffset = v;\n this._elms.labelPixelOffset && this._elms.labelPixelOffset.forEach(function (item) {\n item.value = v;\n });\n }\n }, {\n key: \"labelLineColor\",\n get: function get() {\n return this.options.label.lineColor;\n },\n set: function set(v) {\n var _this8 = this;\n this.options.label.lineColor = v;\n this.label.lineColor = v;\n if (this._elms.labelLineColor) {\n this._elms.labelLineColor.forEach(function (item, i) {\n var lineColorPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: _this8.labelLineColor,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this8.labelLineColor = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this8.labelLineColor = 'rgba(0,255,255,0.5)';\n } //点击清空按钮事件回调\n });\n _this8._elms.labelLineColor[i] = lineColorPicker;\n });\n }\n }\n }, {\n key: \"labelBackgroundColorStart\",\n get: function get() {\n return this.options.label.backgroundColor[0];\n },\n set: function set(v) {\n var _this9 = this;\n this.options.label.backgroundColor[0] = v;\n this.label.backgroundColor = [v, this.label.backgroundColor[1]];\n if (this._elms.labelBackgroundColorStart) {\n this._elms.labelBackgroundColorStart.forEach(function (item, i) {\n var labelBackgroundColorStartPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: _this9.labelBackgroundColorStart,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this9.labelBackgroundColorStart = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this9.labelBackgroundColorStart = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n _this9._elms.labelBackgroundColorStart[i] = labelBackgroundColorStartPicker;\n });\n }\n }\n }, {\n key: \"labelBackgroundColorEnd\",\n get: function get() {\n return this.options.label.backgroundColor[1];\n },\n set: function set(v) {\n var _this10 = this;\n this.options.label.backgroundColor[1] = v;\n this.label.backgroundColor = [this.label.backgroundColor[0], v];\n if (this._elms.labelBackgroundColorEnd) {\n this._elms.labelBackgroundColorEnd.forEach(function (item, i) {\n var labelBackgroundColorEndPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: _this10.labelBackgroundColorEnd,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this10.labelBackgroundColorEnd = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this10.labelBackgroundColorEnd = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n _this10._elms.labelBackgroundColorEnd[i] = labelBackgroundColorEndPicker;\n });\n }\n }\n }, {\n key: \"edit\",\n value: // 编辑框\n function () {\n var _edit = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee(state) {\n var _this11 = this;\n var _this, createSpatialInfoTableContent, contentElm, tabsElm, colorPicker, linecolorPicker, labelColorPicker, labellineColorPicker, labelBackgroundColorStartPicker, labelBackgroundColorEndPicker, all_elm, heightBoxElm, heightElm, heightConfirmElm, heightModeData, heightModeObject, heightModeDataLegpElm, i;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee$(_context) {\n while (1) switch (_context.prev = _context.next) {\n case 0:\n return _context.abrupt(\"return\");\n case 3:\n _this = this;\n this.originalOptions = this.deepCopyObj(this.options);\n if (this._DialogObject && this._DialogObject.close) {\n this._DialogObject.close();\n }\n if (!state) {\n _context.next = 62;\n break;\n }\n createSpatialInfoTableContent = function createSpatialInfoTableContent() {\n var tableElm = contentElm.getElementsByClassName('spatial-info-table')[0];\n var tBodyElm = tableElm.getElementsByClassName('table-body')[0];\n tBodyElm.innerHTML = '';\n _this._elms.lng = [];\n _this._elms.lngInput = [];\n _this._elms.lat = [];\n _this._elms.latInput = [];\n _this._elms.alt = [];\n _this._elms.altInput = [];\n var _loop = function _loop(i) {\n var tr = document.createElement('div');\n tr.className = 'tr';\n tr.innerHTML = \"\\n
\".concat(i + 1, \"
\\n
\\n
\\n
\\n \");\n var lngBox = tr.getElementsByClassName('lng')[0];\n var lng = document.createElement('span');\n lng.innerHTML = _this.options.positions[i].lng.toFixed(8);\n lngBox.appendChild(lng);\n var lngInput = document.createElement('input');\n lngInput.className = 'input';\n lngInput.type = 'number';\n lngInput.title = '';\n lngInput.min = -180;\n lngInput.max = 180;\n lngInput.value = _this.options.positions[i].lng.toFixed(8);\n var latBox = tr.getElementsByClassName('lat')[0];\n var lat = document.createElement('span');\n lat.innerHTML = _this.options.positions[i].lat.toFixed(8);\n latBox.appendChild(lat);\n var latInput = document.createElement('input');\n latInput.className = 'input';\n latInput.type = 'number';\n latInput.title = '';\n latInput.min = -90;\n latInput.max = 90;\n latInput.value = _this.options.positions[i].lat.toFixed(8);\n var altBox = tr.getElementsByClassName('alt')[0];\n var alt = document.createElement('span');\n alt.innerHTML = _this.height.toFixed(2);\n altBox.appendChild(alt);\n var altInput = document.createElement('input');\n altInput.className = 'input';\n altInput.type = 'number';\n altInput.title = '';\n altInput.min = -9999999;\n altInput.max = 999999999;\n altInput.value = _this.height.toFixed(2);\n lngBox.addEventListener('dblclick', function () {\n lngBox.innerHTML = '';\n lngInput.value = Number(_this.options.positions[i].lng.toFixed(8));\n lngBox.appendChild(lngInput);\n lngInput.focus();\n if (_this.operate.positionEditing) {\n _this.positionEditing = false;\n }\n AttackArrowObject.closeNodeEdit(_this);\n _this.heightMode = _this.heightMode;\n });\n lngInput.addEventListener('blur', function () {\n lngInput.value = Number(_this.options.positions[i].lng.toFixed(8));\n lngBox.innerHTML = '';\n lngBox.appendChild(lng);\n });\n lngInput.addEventListener('input', function () {\n _this.options.positions[i].lng = Number(Number(lngInput.value).toFixed(8));\n lng.innerHTML = _this.options.positions[i].lng.toFixed(8);\n _this.height = _this.height;\n });\n latBox.addEventListener('dblclick', function () {\n latBox.innerHTML = '';\n latInput.value = Number(_this.options.positions[i].lat.toFixed(8));\n latBox.appendChild(latInput);\n latInput.focus();\n if (_this.operate.positionEditing) {\n _this.positionEditing = false;\n }\n AttackArrowObject.closeNodeEdit(_this);\n _this.heightMode = _this.heightMode;\n });\n latInput.addEventListener('blur', function () {\n latInput.value = Number(_this.options.positions[i].lat.toFixed(8));\n latBox.innerHTML = '';\n latBox.appendChild(lat);\n });\n latInput.addEventListener('input', function () {\n _this.options.positions[i].lat = Number(Number(latInput.value).toFixed(8));\n lat.innerHTML = _this.options.positions[i].lat.toFixed(8);\n _this.height = _this.height;\n });\n altBox.addEventListener('dblclick', function () {\n if (_this.heightMode == 2) {\n return;\n }\n altBox.innerHTML = '';\n altInput.value = Number(_this.height.toFixed(2));\n altBox.appendChild(altInput);\n altInput.focus();\n if (_this.operate.positionEditing) {\n _this.positionEditing = false;\n }\n AttackArrowObject.closeNodeEdit(_this);\n _this.heightMode = _this.heightMode;\n });\n altInput.addEventListener('blur', function () {\n altInput.value = Number(_this.height.toFixed(2));\n altBox.innerHTML = '';\n altBox.appendChild(alt);\n });\n altInput.addEventListener('input', function () {\n _this.height = Number(Number(altInput.value).toFixed(2));\n alt.innerHTML = Number(_this.height.toFixed(2));\n });\n _this._elms.lng.push(lng);\n _this._elms.lngInput.push(lngInput);\n _this._elms.lat.push(lat);\n _this._elms.latInput.push(latInput);\n _this._elms.alt.push(alt);\n _this._elms.altInput.push(altInput);\n tBodyElm.appendChild(tr);\n };\n for (var i = 0; i < _this.options.positions.length; i++) {\n _loop(i);\n }\n };\n _context.next = 10;\n return new _Element_Dialog__WEBPACK_IMPORTED_MODULE_9__[\"default\"](this.sdk, this.options, {\n title: '箭头属性',\n left: '180px',\n top: '100px',\n confirmCallBack: function confirmCallBack(options) {\n _this11.name = _this11.name.trim();\n if (!_this11.name) {\n _this11.name = '未命名对象';\n }\n _this11.options.label.position = {\n lng: _this11.label.position[0],\n lat: _this11.label.position[1],\n alt: _this11.label.position[2]\n };\n _this11.originalOptions = _this11.deepCopyObj(_this11.options);\n _this11._DialogObject.close();\n _this11.Dialog.confirmCallBack && _this11.Dialog.confirmCallBack(_this11.originalOptions);\n },\n resetCallBack: function resetCallBack() {\n _this11.reset();\n _this11.Dialog.resetCallBack && _this11.Dialog.resetCallBack();\n },\n removeCallBack: function removeCallBack() {\n _this11.Dialog.removeCallBack && _this11.Dialog.removeCallBack();\n },\n closeCallBack: function closeCallBack() {\n var spreadState = _this11.options.spreadState;\n _this11.positionEditing = false;\n setTimeout(function () {\n _this11.options.spreadState = spreadState;\n _this11.reset();\n }, 10);\n _this11.Dialog.closeCallBack && _this11.Dialog.closeCallBack();\n },\n showCallBack: function showCallBack(show) {\n _this11.options.show = show;\n _this11.originalOptions.show = show;\n _this11.show = show;\n _this11.Dialog.showCallBack && _this11.Dialog.showCallBack();\n },\n translationalCallBack: function translationalCallBack() {\n _this11.positionEditing = !_this11.positionEditing;\n },\n // 二次编辑回调\n secondaryEditCallBack: function secondaryEditCallBack() {\n AttackArrowObject.nodeEdit(_this11, function () {\n createSpatialInfoTableContent();\n });\n }\n });\n case 10:\n this._DialogObject = _context.sent;\n this._DialogObject._element.body.className = this._DialogObject._element.body.className + ' attackArrow';\n contentElm = document.createElement('div');\n contentElm.innerHTML = Object(_element__WEBPACK_IMPORTED_MODULE_12__[\"html\"])(this);\n this._DialogObject.contentAppChild(contentElm);\n this.attributeType = this.options.attributeType;\n this.attributeCamera = this.options.attribute.camera.content;\n\n // 创建标签页\n tabsElm = new _Element_cy_html_tabs__WEBPACK_IMPORTED_MODULE_10__[\"default\"]('attack-arrow-object-edit-tabs', undefined, this.sdk); // 颜色组件\n colorPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName(\"color\")[0],\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: this.color,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this11.color = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this11.color = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n linecolorPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName(\"lineColor\")[0],\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: this.lineColor,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this11.lineColor = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this11.lineColor = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n labelColorPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName(\"labelColor\")[0],\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: this.labelColor,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this11.labelColor = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this11.labelColor = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n labellineColorPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName(\"labelLineColor\")[0],\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: this.labelLineColor,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this11.labelLineColor = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this11.labelLineColor = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n labelBackgroundColorStartPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName(\"labelBackgroundColorStart\")[0],\n size: 'mini',\n alpha: true,\n defaultColor: this.labelBackgroundColorStart,\n disabled: false,\n openPickerAni: 'opacity',\n sure: function sure(color) {\n _this11.labelBackgroundColorStart = color;\n },\n clear: function clear() {\n _this11.labelBackgroundColorStart = 'rgba(255,255,255,1)';\n }\n });\n labelBackgroundColorEndPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName(\"labelBackgroundColorEnd\")[0],\n size: 'mini',\n alpha: true,\n defaultColor: this.labelBackgroundColorEnd,\n disabled: false,\n openPickerAni: 'opacity',\n sure: function sure(color) {\n _this11.labelBackgroundColorEnd = color;\n },\n clear: function clear() {\n _this11.labelBackgroundColorEnd = 'rgba(255,255,255,1)';\n }\n });\n all_elm = contentElm.getElementsByTagName(\"*\");\n AttackArrowObject.EventBinding(this, all_elm);\n this._elms.color = [colorPicker];\n this._elms.lineColor = [linecolorPicker];\n this._elms.labelColor = [labelColorPicker];\n this._elms.labelLineColor = [labellineColorPicker];\n this._elms.labelBackgroundColorStart = [labelBackgroundColorStartPicker];\n this._elms.labelBackgroundColorEnd = [labelBackgroundColorEndPicker];\n heightBoxElm = this._DialogObject._element.content.getElementsByClassName('height-box')[0];\n heightElm = heightBoxElm.getElementsByClassName('height')[0];\n heightConfirmElm = this._DialogObject._element.content.getElementsByClassName('height-confirm')[0];\n heightElm.value = 10;\n if (this.heightMode == 2) {\n heightBoxElm && (heightBoxElm.className = 'input-number input-number-unit-1 height-box disabled');\n heightConfirmElm && heightConfirmElm.setAttribute('disabled', 'disabled');\n } else {\n heightBoxElm && (heightBoxElm.className = 'input-number input-number-unit-1 height-box');\n heightConfirmElm && heightConfirmElm.removeAttribute('disabled');\n }\n heightModeData = [{\n name: '海拔高度',\n value: '海拔高度',\n key: '0'\n }, {\n name: '相对地表',\n value: '相对地表',\n key: '1'\n }, {\n name: '依附模型',\n value: '依附模型',\n key: '2'\n }];\n heightModeObject = Object(_Element_datalist__WEBPACK_IMPORTED_MODULE_18__[\"legp\"])(this._DialogObject._element.content.getElementsByClassName('height-mode-box')[0], '.height-mode');\n if (!heightModeObject) {\n _context.next = 59;\n break;\n }\n heightModeObject.legp_search(heightModeData);\n heightModeDataLegpElm = this._DialogObject._element.content.getElementsByClassName('height-mode')[0].getElementsByTagName('input')[0];\n i = 0;\n case 43:\n if (!(i < heightModeData.length)) {\n _context.next = 51;\n break;\n }\n if (!(heightModeData[i].key == this.heightMode)) {\n _context.next = 48;\n break;\n }\n heightModeDataLegpElm.value = heightModeData[i].value;\n heightModeObject.legp_searchActive(heightModeData[i].value);\n return _context.abrupt(\"break\", 51);\n case 48:\n i++;\n _context.next = 43;\n break;\n case 51:\n heightModeDataLegpElm.addEventListener('input', function () {\n for (var _i = 0; _i < heightModeData.length; _i++) {\n if (heightModeData[_i].value === heightModeDataLegpElm.value) {\n _this11.heightMode = heightModeData[_i].key;\n break;\n }\n }\n });\n heightElm.addEventListener('input', function () {\n switch (_this11.heightMode) {\n case 0:\n case '0':\n break;\n case 1:\n case '1':\n break;\n case 2:\n case '2':\n break;\n }\n });\n this._elms.height = heightElm;\n this._elms.heightBox = heightBoxElm;\n this._elms.heightMode = heightModeDataLegpElm;\n this._elms.heightConfirm = heightConfirmElm;\n this._elms.heightModeObject = heightModeObject;\n heightConfirmElm.addEventListener('click', function () {\n if (_this11.operate.positionEditing) {\n _this11.positionEditing = false;\n _this11.height = _this11.height + Number(heightElm.value);\n } else {\n AttackArrowObject.closeNodeEdit(_this11);\n _this11.heightMode = _this11.heightMode;\n setTimeout(function () {\n _this11.height = _this11.height + Number(heightElm.value);\n }, 100);\n }\n });\n case 59:\n setTimeout(function () {\n _this11.attributeLink = _this11.options.attribute.link.content;\n _this11.attributeVr = _this11.options.attribute.vr.content;\n _this11.cameraSelect && _this11.cameraSelect();\n _this11.goodsSelect && _this11.goodsSelect();\n var tagData = _this11.attributeSelect;\n var attributeElm = _this11._DialogObject._element.content.getElementsByClassName('attribute-select-box')[0];\n if (attributeElm) {\n var legpObject = Object(_Element_datalist__WEBPACK_IMPORTED_MODULE_18__[\"legp\"])(attributeElm, \".attribute-select\");\n legpObject.legp_search(tagData);\n var attributeSelectElm = _this11._DialogObject._element.content.getElementsByClassName('attribute-select')[0].getElementsByTagName('input')[0];\n for (var _i2 = 0; _i2 < tagData.length; _i2++) {\n if (tagData[_i2].key === _this11.options.attributeType) {\n attributeSelectElm.value = tagData[_i2].value;\n legpObject.legp_searchActive(tagData[_i2].value);\n break;\n }\n }\n attributeSelectElm.addEventListener('input', function () {\n for (var _i3 = 0; _i3 < tagData.length; _i3++) {\n if (tagData[_i3].value === attributeSelectElm.value) {\n _this11.attributeType = tagData[_i3].key;\n break;\n }\n }\n });\n }\n var unitData = [{\n name: '平方米',\n value: '平方米'\n }, {\n name: '平方千米',\n value: '平方千米'\n }, {\n name: '亩',\n value: '亩'\n }, {\n name: '公顷',\n value: '公顷'\n }];\n var unitDataLegpObject = Object(_Element_datalist__WEBPACK_IMPORTED_MODULE_18__[\"legp\"])(_this11._DialogObject._element.content.getElementsByClassName('input-select-unit-box')[0], \".input-select-unit\");\n if (unitDataLegpObject) {\n unitDataLegpObject.legp_search(unitData);\n var unitDataLegpElm = _this11._DialogObject._element.content.getElementsByClassName('input-select-unit')[0].getElementsByTagName('input')[0];\n unitDataLegpElm.value = _this11.options['area-unit'];\n for (var _i4 = 0; _i4 < unitData.length; _i4++) {\n if (unitData[_i4].value === unitDataLegpElm.value) {\n unitDataLegpObject.legp_searchActive(unitData[_i4].value);\n break;\n }\n }\n unitDataLegpElm.addEventListener('input', function () {\n for (var _i5 = 0; _i5 < unitData.length; _i5++) {\n if (unitData[_i5].value === unitDataLegpElm.value) {\n _this11.areaUnit = unitData[_i5].value;\n break;\n }\n }\n });\n }\n var fontData = Object(_Element_fontSelect__WEBPACK_IMPORTED_MODULE_19__[\"getFontList\"])();\n var fontObject = Object(_Element_datalist__WEBPACK_IMPORTED_MODULE_18__[\"legp\"])(_this11._DialogObject._element.content.getElementsByClassName('font-select-box')[0], '.font-select');\n if (fontObject) {\n fontObject.legp_search(fontData);\n var fontDataLegpElm = _this11._DialogObject._element.content.getElementsByClassName('font-select')[0].getElementsByTagName('input')[0];\n fontDataLegpElm.value = fontData[_this11.labelFontFamily].value;\n for (var _i6 = 0; _i6 < fontData.length; _i6++) {\n if (fontData[_i6].value == fontDataLegpElm.value) {\n fontObject.legp_searchActive(fontData[_i6].value);\n break;\n }\n }\n fontDataLegpElm.addEventListener('input', function () {\n for (var _i7 = 0; _i7 < fontData.length; _i7++) {\n if (fontData[_i7].value === fontDataLegpElm.value) {\n _this11.labelFontFamily = fontData[_i7].key;\n break;\n }\n }\n });\n _this11._elms.labelFontFamily = [fontDataLegpElm];\n }\n createSpatialInfoTableContent();\n }, 0);\n _context.next = 63;\n break;\n case 62:\n if (this._DialogObject && this._DialogObject.close) {\n this._DialogObject.close();\n this._DialogObject = null;\n }\n case 63:\n case \"end\":\n return _context.stop();\n }\n }, _callee, this);\n }));\n function edit(_x) {\n return _edit.apply(this, arguments);\n }\n return edit;\n }()\n }, {\n key: \"reset\",\n value: function reset() {\n var _this12 = this;\n if (!this.entity) {\n return;\n }\n this.options = this.deepCopyObj(this.originalOptions);\n this.name = this.originalOptions.name;\n this.color = this.originalOptions.color;\n this.lineColor = this.originalOptions.line.color;\n this.lineWidth = this.originalOptions.line.width;\n this.labelShow = this.originalOptions.label.show;\n this.labelColor = this.originalOptions.label.color;\n this.labelFontSize = this.originalOptions.label.fontSize;\n this.labelFontFamily = this.originalOptions.label.fontFamily;\n this.labelScaleByDistance = this.originalOptions.label.scaleByDistance;\n this.labelNear = this.originalOptions.label.near;\n this.labelFar = this.originalOptions.label.far;\n this.labelLineWidth = this.originalOptions.label.lineWidth;\n this.labelPixelOffset = this.originalOptions.label.pixelOffset;\n this.labelLineColor = this.originalOptions.label.lineColor;\n this.labelBackgroundColorStart = this.originalOptions.label.backgroundColor[0];\n this.labelBackgroundColorEnd = this.originalOptions.label.backgroundColor[1];\n for (var i = 0; i < this.options.positions.length; i++) {\n if (this._elms.lng && this._elms.lng[i]) {\n this._elms.lng[i].innerHTML = this.options.positions[i].lng.toFixed(8);\n }\n if (this._elms.lat && this._elms.lat[i]) {\n this._elms.lat[i].innerHTML = this.options.positions[i].lat.toFixed(8);\n }\n if (this._elms.alt && this._elms.alt[i]) {\n this._elms.alt[i].innerHTML = Number(this.options.height.toFixed(2));\n }\n }\n this.heightMode = this.heightMode;\n for (var _i8 = 0; _i8 < this.nodePoints.length; _i8++) {\n this.sdk.viewer.entities.remove(this.nodePoints[_i8]);\n }\n this.previous = null;\n this.nodePoints = [];\n YJ.Measure.SetMeasureStatus(false);\n this.event && this.event.destroy();\n this.tip && this.tip.destroy();\n var spreadState = this.options.spreadState;\n this.removeAnimate();\n setTimeout(function () {\n _this12.loop = _this12.options.loop;\n _this12.spreadState = spreadState;\n Object(_Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_17__[\"syncData\"])(_this12.sdk, _this12.options.id);\n Object(_Global_SplitScreen__WEBPACK_IMPORTED_MODULE_20__[\"syncSplitData\"])(_this12.sdk, _this12.options.id);\n }, 200);\n }\n }, {\n key: \"remove\",\n value: function () {\n var _remove = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee2() {\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee2$(_context2) {\n while (1) switch (_context2.prev = _context2.next) {\n case 0:\n this.removeAnimate();\n this.event && this.event.destroy();\n this.tip && this.tip.destroy();\n this.entity && this.sdk.viewer.entities.remove(this.entity);\n this.label && this.label.remove();\n this.entity = null;\n if (this._DialogObject && !this._DialogObject.isDestroy) {\n this._DialogObject.close();\n this._DialogObject = null;\n }\n _context2.next = 9;\n return this.sdk.removeIncetance(this.options.id);\n case 9:\n _context2.next = 11;\n return Object(_Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_17__[\"syncData\"])(this.sdk, this.options.id);\n case 11:\n case \"end\":\n return _context2.stop();\n }\n }, _callee2, this);\n }));\n function remove() {\n return _remove.apply(this, arguments);\n }\n return remove;\n }()\n /**\r\n * 飞到\r\n */\n }, {\n key: \"flyTo\",\n value: (function () {\n var _flyTo = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee3() {\n var options,\n orientation,\n lng,\n lat,\n alt,\n destination,\n position,\n positionArray,\n ground,\n i,\n height,\n a,\n _i9,\n BoundingSphere,\n _args3 = arguments;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee3$(_context3) {\n while (1) switch (_context3.prev = _context3.next) {\n case 0:\n options = _args3.length > 0 && _args3[0] !== undefined ? _args3[0] : {};\n if (!this._error) {\n _context3.next = 3;\n break;\n }\n return _context3.abrupt(\"return\");\n case 3:\n Object(_Global_global__WEBPACK_IMPORTED_MODULE_21__[\"setActiveViewer\"])(0);\n Object(_Global_global__WEBPACK_IMPORTED_MODULE_21__[\"closeRotateAround\"])(this.sdk);\n Object(_Global_global__WEBPACK_IMPORTED_MODULE_21__[\"closeViewFollow\"])(this.sdk);\n if (!(this.options.customView && this.options.customView.relativePosition && this.options.customView.orientation)) {\n _context3.next = 25;\n break;\n }\n orientation = {\n heading: Cesium.Math.toRadians(this.options.customView.orientation.heading || 0.0),\n pitch: Cesium.Math.toRadians(this.options.customView.orientation.pitch || -60.0),\n roll: Cesium.Math.toRadians(this.options.customView.orientation.roll || 0.0)\n };\n lng = this.options.customView.relativePosition.lng;\n lat = this.options.customView.relativePosition.lat;\n alt = this.options.customView.relativePosition.alt;\n destination = Cesium.Cartesian3.fromDegrees(lng, lat, alt);\n position = {\n lng: 0,\n lat: 0\n };\n if (this.options.position) {\n position = _objectSpread({}, this.options.position);\n } else if (this.options.positions) {\n position = _objectSpread({}, this.options.positions[0]);\n } else if (this.options.center) {\n position = _objectSpread({}, this.options.center);\n } else if (this.options.start) {\n position = _objectSpread({}, this.options.start);\n } else {\n if (this.options.hasOwnProperty('lng')) {\n position.lng = this.options.lng;\n }\n if (this.options.hasOwnProperty('lat')) {\n position.lat = this.options.lat;\n }\n if (this.options.hasOwnProperty('alt')) {\n position.alt = this.options.alt;\n }\n }\n // 如果没有高度值,则获取紧贴高度计算\n if (position.hasOwnProperty('alt')) {\n _context3.next = 18;\n break;\n }\n _context3.next = 17;\n return this.getClampToHeight(position);\n case 17:\n position.alt = _context3.sent;\n case 18:\n lng = this.options.customView.relativePosition.lng + position.lng;\n lat = this.options.customView.relativePosition.lat + position.lat;\n alt = this.options.customView.relativePosition.alt + position.alt;\n destination = Cesium.Cartesian3.fromDegrees(lng, lat, alt);\n this.sdk.viewer.camera.flyTo({\n destination: destination,\n orientation: orientation\n });\n _context3.next = 51;\n break;\n case 25:\n positionArray = [];\n _context3.t0 = this.heightMode;\n _context3.next = _context3.t0 === 0 ? 29 : _context3.t0 === '0' ? 29 : _context3.t0 === 1 ? 31 : _context3.t0 === '1' ? 31 : _context3.t0 === 2 ? 33 : _context3.t0 === '2' ? 33 : 35;\n break;\n case 29:\n ground = false;\n return _context3.abrupt(\"break\", 35);\n case 31:\n ground = false;\n return _context3.abrupt(\"break\", 35);\n case 33:\n ground = true;\n return _context3.abrupt(\"break\", 35);\n case 35:\n if (!ground) {\n _context3.next = 48;\n break;\n }\n i = 0;\n case 37:\n if (!(i < this.options.positions.length)) {\n _context3.next = 46;\n break;\n }\n _context3.next = 40;\n return this.getClampToHeight(this.options.positions[i]);\n case 40:\n height = _context3.sent;\n a = Cesium.Cartesian3.fromDegrees(this.options.positions[i].lng, this.options.positions[i].lat, height);\n positionArray.push(a.x, a.y, a.z);\n case 43:\n i++;\n _context3.next = 37;\n break;\n case 46:\n _context3.next = 49;\n break;\n case 48:\n if (this.positionsH) {\n for (_i9 = 0; _i9 < this.positionsH.length; _i9++) {\n positionArray.push(this.positionsH[_i9].x, this.positionsH[_i9].y, this.positionsH[_i9].z);\n }\n }\n case 49:\n BoundingSphere = Cesium.BoundingSphere.fromVertices(positionArray);\n this.sdk.viewer.camera.flyToBoundingSphere(BoundingSphere, {\n offset: options.orientation || {\n heading: Cesium.Math.toRadians(0.0),\n pitch: Cesium.Math.toRadians(-90.0),\n roll: Cesium.Math.toRadians(0.0)\n }\n });\n case 51:\n case \"end\":\n return _context3.stop();\n }\n }, _callee3, this);\n }));\n function flyTo() {\n return _flyTo.apply(this, arguments);\n }\n return flyTo;\n }()\n /**@desc 打开平移功能\r\n *\r\n * @memberOf Source\r\n * @param status {boolean}\r\n *\r\n * */\n )\n }, {\n key: \"positionEditing\",\n get: function get() {\n return this.operate.positionEditing;\n },\n set: function set(status) {\n var _this13 = this;\n if (YJ.Measure.GetMeasureStatus() || !this.sdk || !this.sdk.viewer || !this.entity) {\n return;\n }\n this.removeAnimate();\n var _this = this;\n this.event && this.event.destroy();\n this.event = new _Event_index__WEBPACK_IMPORTED_MODULE_15__[\"default\"](this.sdk);\n this.operate.positionEditing = status;\n if (status === true) {\n var _Cesium$Cartesian;\n this.previous = {\n positions: _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(this.positions)\n };\n this.tip && this.tip.destroy();\n this.tip = new _MouseTip__WEBPACK_IMPORTED_MODULE_16__[\"default\"]('点击鼠标左键确认,右键取消', this.sdk);\n this.label && (this.label.entity.billboard.color = Cesium.Color.fromCssColorString(\"rgba(255,255,255,0.9)\"));\n this.picking = false;\n var array = [];\n var positions = _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(this.positions);\n var disparity = [];\n for (var i = 0; i < positions.length; i++) {\n var position = this.cartesian3Towgs84(positions[i], this.sdk.viewer);\n array.push([position.lng, position.lat]);\n }\n var firstposition = this.cartesian3Towgs84(positions[0], this.sdk.viewer);\n array.push([firstposition.lng, firstposition.lat]);\n var polygon = turf.polygon([array]);\n var centroid = turf.centroid(polygon);\n var center = (_Cesium$Cartesian = Cesium.Cartesian3).fromDegrees.apply(_Cesium$Cartesian, _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(centroid.geometry.coordinates));\n for (var _i10 = 0; _i10 < positions.length; _i10++) {\n center.x - positions[_i10].x;\n disparity.push({\n x: center.x - positions[_i10].x,\n y: center.y - positions[_i10].y,\n z: center.z - positions[_i10].z\n });\n }\n var newpositions = [];\n this.event.mouse_move(function (movement, cartesian) {\n newpositions = [];\n for (var _i11 = 0; _i11 < disparity.length; _i11++) {\n newpositions.push({\n x: cartesian.x - disparity[_i11].x,\n y: cartesian.y - disparity[_i11].y,\n z: cartesian.z - disparity[_i11].z\n });\n }\n // this.label.position = [position84.lng, position84.lat, position84.alt]\n _this13.tip.setPosition(cartesian, movement.endPosition.x, movement.endPosition.y);\n });\n this.event.mouse_left(function (movement, cartesian) {\n _this13.event.mouse_move(function () {});\n _this13.event.mouse_left(function () {});\n _this13.event.mouse_right(function () {});\n _this13.event.gesture_pinck_start(function () {});\n newpositions = [];\n for (var _i12 = 0; _i12 < disparity.length; _i12++) {\n var pos3 = {\n x: cartesian.x - disparity[_i12].x,\n y: cartesian.y - disparity[_i12].y,\n z: cartesian.z - disparity[_i12].z\n };\n newpositions.push(pos3);\n _this13.options.positions[_i12] = _this13.cartesian3Towgs84(pos3, _this13.sdk.viewer);\n if (_this13._elms.lng && _this13._elms.lng[_i12]) {\n _this13._elms.lng[_i12].innerHTML = _this13.options.positions[_i12].lng.toFixed(8);\n }\n if (_this13._elms.lat && _this13._elms.lat[_i12]) {\n _this13._elms.lat[_i12].innerHTML = _this13.options.positions[_i12].lat.toFixed(8);\n }\n }\n _this13.positions = newpositions;\n _this13.previous = {\n positions: _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(_this13.positions)\n };\n _this13.positionEditing = false;\n if (_this13._positionEditingCallback) {\n _this13._positionEditingCallback();\n _this13._positionEditingCallback = null;\n }\n });\n this.event.mouse_right(function (movement, cartesian) {\n _this13.positionEditing = false;\n });\n this.event.gesture_pinck_start(function (movement, cartesian) {\n var startTime = new Date();\n _this13.event.gesture_pinck_end(function () {\n var endTime = new Date();\n if (endTime - startTime >= 500) {\n // 长按取消\n _this13.positionEditing = false;\n } else {\n _this13.event.mouse_move(function () {});\n _this13.event.mouse_left(function () {});\n _this13.event.mouse_right(function () {});\n _this13.event.gesture_pinck_start(function () {});\n newpositions = [];\n for (var _i13 = 0; _i13 < disparity.length; _i13++) {\n var pos3 = {\n x: cartesian.x - disparity[_i13].x,\n y: cartesian.y - disparity[_i13].y,\n z: cartesian.z - disparity[_i13].z\n };\n newpositions.push(pos3);\n _this13.options.positions[_i13] = _this13.cartesian3Towgs84(pos3, _this13.sdk.viewer);\n if (_this13._elms.lng && _this13._elms.lng[_i13]) {\n _this13._elms.lng[_i13].innerHTML = _this13.options.positions[_i13].lng.toFixed(8);\n }\n if (_this13._elms.lat && _this13._elms.lat[_i13]) {\n _this13._elms.lat[_i13].innerHTML = _this13.options.positions[_i13].lat.toFixed(8);\n }\n }\n _this13.positions = newpositions;\n _this13.previous = {\n positions: _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(_this13.positions)\n };\n _this13.positionEditing = false;\n }\n });\n });\n this.entity.polygon.hierarchy = new Cesium.CallbackProperty(function () {\n var position84 = [];\n if (newpositions.length > 0) {\n for (var _i14 = 0; _i14 < newpositions.length; _i14++) {\n position84.push(_this.cartesian3Towgs84(newpositions[_i14], _this.sdk.viewer));\n }\n } else {\n for (var _i15 = 0; _i15 < positions.length; _i15++) {\n position84.push(_this.cartesian3Towgs84(positions[_i15], _this.sdk.viewer));\n }\n }\n _this.renewPositions(position84);\n return new Cesium.PolygonHierarchy(_this.positionsH);\n }, false);\n this.entity.polyline.positions = new Cesium.CallbackProperty(function () {\n return [].concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(_this.positionsH), [_this.positionsH[0], _this.positionsH[1]]);\n }, false);\n } else {\n if (this.label && this.label.entity && this.label.entity.billboard) {\n this.label.entity.billboard.color = Cesium.Color.fromCssColorString(\"rgba(255,255,255,1)\");\n }\n this.picking = true;\n if (this.event) {\n this.event.mouse_move(function () {});\n this.event.mouse_left(function () {});\n this.event.mouse_right(function () {});\n this.event.destroy();\n }\n this.tip && this.tip.destroy();\n if (!this.previous) {\n this.previous = {\n positions: _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(this.positions)\n };\n } else {\n this.positions = _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(this.previous.positions);\n }\n var position84 = [];\n for (var _i16 = 0; _i16 < this.positions.length; _i16++) {\n position84.push(_this.cartesian3Towgs84(this.positions[_i16], _this.sdk.viewer));\n }\n _this.renewPositions(position84);\n this.entity.polygon.hierarchy = new Cesium.CallbackProperty(function () {\n return new Cesium.PolygonHierarchy(_this.positionsH);\n }, true);\n this.entity.polyline.positions = new Cesium.CallbackProperty(function () {\n return [].concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(_this.positionsH), [_this.positionsH[0], _this.positionsH[1]]);\n }, true);\n }\n }\n }, {\n key: \"openPositionEditing\",\n value: function openPositionEditing(cd) {\n this.positionEditing = true;\n this._positionEditingCallback = cd;\n }\n }, {\n key: \"areaChangeCallBack\",\n get: function get() {\n return this._areaChangeCallBack;\n },\n set: function set(cd) {\n this._areaChangeCallBack = cd;\n }\n }, {\n key: \"nodeEdit\",\n value: function nodeEdit() {\n var _this14 = this;\n var cb = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function () {};\n this.positionEditing = false;\n setTimeout(function () {\n if (YJ.Measure.GetMeasureStatus()) {\n cb('上一次测量未结束');\n } else {\n var createNodePoints = /*#__PURE__*/function () {\n var _ref = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee4() {\n var objectsToExclude, _i17, height, entity;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee4$(_context4) {\n while (1) switch (_context4.prev = _context4.next) {\n case 0:\n objectsToExclude = _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(_this15.sdk.viewer.entities.values);\n _i17 = 0;\n case 2:\n if (!(_i17 < _this15.options.positions.length)) {\n _context4.next = 11;\n break;\n }\n _context4.next = 5;\n return _this15.getClampToHeight(_this15.options.positions[_i17], objectsToExclude);\n case 5:\n height = _context4.sent;\n entity = _this15.sdk.viewer.entities.add({\n name: 'node-secondary-edit-point',\n index: _i17,\n position: Cesium.Cartesian3.fromDegrees(_this15.options.positions[_i17].lng, _this15.options.positions[_i17].lat, height),\n billboard: {\n image: _this15.getSourceRootPath() + '/img/point.png',\n width: 15,\n height: 15,\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\n color: Cesium.Color.WHITE.withAlpha(0.99)\n }\n });\n _this15.nodePoints.push(entity);\n case 8:\n _i17++;\n _context4.next = 2;\n break;\n case 11:\n case \"end\":\n return _context4.stop();\n }\n }, _callee4);\n }));\n return function createNodePoints() {\n return _ref.apply(this, arguments);\n };\n }(); // for (let i = 0; i < this.options.positions.length; i++) {\n // let entity = this.sdk.viewer.entities.add({\n // name: 'node-secondary-edit-point',\n // index: i,\n // position: Cesium.Cartesian3.fromDegrees(this.options.positions[i].lng, this.options.positions[i].lat),\n // billboard: {\n // image: this.getSourceRootPath() + '/img/point.png',\n // width: 15,\n // height: 15,\n // disableDepthTestDistance: Number.POSITIVE_INFINITY,\n // },\n // })\n // nodePoints.push(entity)\n // }\n _this14.removeAnimate();\n YJ.Measure.SetMeasureStatus(true);\n var _this15 = _this14;\n _this14.event && _this14.event.destroy();\n _this14.tip && _this14.tip.destroy();\n _this14.tip = new _MouseTip__WEBPACK_IMPORTED_MODULE_16__[\"default\"]('请选择一个顶点,右键取消', _this14.sdk);\n _this14.event = new _Event_index__WEBPACK_IMPORTED_MODULE_15__[\"default\"](_this14.sdk);\n _this14.nodePoints = [];\n var selectPoint;\n var originalPosition;\n var moveEvent = function moveEvent(movement, cartesian) {\n if (selectPoint) {\n _this14.options.positions[selectPoint.index] = _this14.cartesian3Towgs84(cartesian, _this14.sdk.viewer);\n _this14.renewPositions();\n }\n _this14.tip.setPosition(cartesian, movement.position ? movement.position.x : movement.endPosition.x, movement.position ? movement.position.y : movement.endPosition.y);\n };\n var leftEvent = function leftEvent(movement, cartesian) {\n moveEvent(movement, cartesian);\n if (selectPoint) {\n _this14.options.positions[selectPoint.index] = _this14.cartesian3Towgs84(cartesian, _this14.sdk.viewer);\n var index = selectPoint.index;\n if (selectPoint.index === _this14.options.positions.length - 1) {\n index = index + 1;\n }\n var entity = _this14.sdk.viewer.entities.add({\n name: 'node-secondary-edit-point',\n index: index,\n position: Cesium.Cartesian3.fromDegrees(_this14.options.positions[selectPoint.index].lng, _this14.options.positions[selectPoint.index].lat, _this14.options.positions[selectPoint.index].alt),\n billboard: {\n image: _this14.getSourceRootPath() + '/img/point.png',\n width: 15,\n height: 15,\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\n color: Cesium.Color.WHITE.withAlpha(0.99)\n }\n });\n selectPoint = entity;\n originalPosition = _this14.options.positions[selectPoint.index];\n _this14.nodePoints.splice(selectPoint.index, 0, entity);\n if (index < _this14.options.positions.length) {\n selectPoint = null;\n _this14.tip.set_text('请选择一个顶点,右键取消');\n } else {\n _this14.options.positions.splice(selectPoint.index, 0, _this14.options.positions[selectPoint.index]);\n _this14.options.positions[selectPoint.index] = _this14.cartesian3Towgs84(cartesian, _this14.sdk.viewer);\n }\n _this14.renewPositions();\n cb('', _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(_this14.options.positions));\n } else {\n var pick = _this14.sdk.viewer.scene.pick(movement.position || movement.endPosition);\n if (pick && pick.id && pick.id.name && pick.id.name === 'node-secondary-edit-point') {\n selectPoint = pick.id;\n originalPosition = _this14.cartesian3Towgs84(pick.id.position.getValue(), _this14.sdk.viewer);\n _this14.nodePoints.splice(pick.id.index, 1);\n _this14.sdk.viewer.entities.remove(pick.id);\n _this14.tip.set_text('左键确认,右键结束,CTRL+右键撤销');\n }\n }\n };\n var rightEvent = function rightEvent(movement, cartesian) {\n _this14.event.mouse_move(function () {});\n _this14.event.mouse_left(function () {});\n _this14.event.mouse_right(function () {});\n _this14.event.gesture_pinck_start(function () {});\n if (selectPoint) {\n if (!originalPosition) {\n _this14.options.positions.pop();\n } else {\n _this14.options.positions[selectPoint.index] = originalPosition;\n if (_this14.options.positions.length > 3 && selectPoint.index === _this14.options.positions.length - 1) {\n _this14.options.positions.splice(selectPoint.index + 1, 1);\n }\n }\n if (_this14._elms.lng && _this14._elms.lng[selectPoint.index]) {\n _this14._elms.lng[selectPoint.index].innerHTML = _this14.options.positions[selectPoint.index].lng.toFixed(8);\n }\n if (_this14._elms.lat && _this14._elms.lat[selectPoint.index]) {\n _this14._elms.lat[selectPoint.index].innerHTML = _this14.options.positions[selectPoint.index].lat.toFixed(8);\n }\n }\n _this14.heightMode = _this14.heightMode;\n _this14.previous = null;\n };\n _this14.entity.polyline.clampToGround = true;\n _this14.entity.polyline.arcType = Cesium.ArcType.GEODESIC;\n _this14.entity.polygon.perPositionHeight = false;\n _this14.entity.polygon.hierarchy = new Cesium.CallbackProperty(function () {\n return new Cesium.PolygonHierarchy(_this15.positionsH);\n }, false);\n _this14.entity.polyline.positions = new Cesium.CallbackProperty(function () {\n return [].concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(_this15.positionsH), [_this15.positionsH[0], _this15.positionsH[1]]);\n }, false);\n var points = [[]];\n var pos84 = [];\n for (var i = 0; i < _this14.positionsH.length; i++) {\n var _position = _this14.cartesian3Towgs84(_this14.positionsH[i], _this14.sdk.viewer);\n pos84.push(_position);\n points[0].push([_position.lng, _position.lat]);\n }\n var position = _this14.cartesian3Towgs84(_this14.positionsH[0], _this14.sdk.viewer);\n points[0].push([position.lng, position.lat]);\n var polygon = turf.polygon(points);\n var centroid = turf.pointOnFeature(polygon);\n var objectsToExclude = _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(_this14.sdk.viewer.entities.values);\n _this14.getClampToHeight({\n lng: centroid.geometry.coordinates[0],\n lat: centroid.geometry.coordinates[1]\n }, objectsToExclude).then(function (height) {\n _this14.label.position = [centroid.geometry.coordinates[0], centroid.geometry.coordinates[1], height];\n });\n setTimeout(function () {\n _this14.event.mouse_left(leftEvent);\n _this14.event.mouse_right(rightEvent);\n _this14.event.mouse_move(moveEvent);\n _this14.event.mouse_right_keyboard_ctrl(function (movement, cartesian) {\n if (selectPoint) {\n _this14.options.positions.pop();\n _this14.sdk.viewer.entities.remove(_this14.nodePoints[_this14.nodePoints.length - 1]);\n _this14.nodePoints.pop();\n if (!selectPoint.index) {\n // selectPoint = null\n } else if (selectPoint.index === _this14.options.positions.length) {\n if (_this14.nodePoints[selectPoint.index - 1]) {\n selectPoint = _this14.nodePoints[selectPoint.index - 1];\n } else {\n selectPoint.index = selectPoint.index - 1;\n }\n }\n _this14.renewPositions();\n }\n });\n _this14.event.gesture_pinck_start(function (movement, cartesian) {\n var startTime = new Date();\n _this14.event.gesture_pinck_end(function () {\n var endTime = new Date();\n var pos = {\n position: {\n x: (movement.position1.x + movement.position2.x) / 2,\n y: (movement.position1.y + movement.position2.y) / 2\n }\n };\n if (endTime - startTime >= 500) {\n // 长按取消\n rightEvent(pos, cartesian);\n } else {\n leftEvent(pos, cartesian);\n }\n });\n });\n createNodePoints();\n }, 200);\n }\n }, 0);\n }\n }, {\n key: \"closeNodeEdit\",\n value: function closeNodeEdit() {\n YJ.Measure.SetMeasureStatus(false);\n this.event && this.event.destroy();\n this.tip && this.tip.destroy();\n this.tip = null;\n for (var i = 0; i < this.nodePoints.length; i++) {\n this.sdk.viewer.entities.remove(this.nodePoints[i]);\n }\n this.nodePoints = [];\n this.picking = true;\n }\n }, {\n key: \"setPosition\",\n value: function setPosition(v) {\n var _Cesium$Cartesian2;\n var cartesian = Cesium.Cartesian3.fromDegrees(v.position.lng, v.position.lat, v.position.alt);\n var positions = _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(this.positions);\n var array = [];\n var disparity = [];\n for (var i = 0; i < positions.length; i++) {\n var position = this.cartesian3Towgs84(positions[i], this.sdk.viewer);\n array.push([position.lng, position.lat]);\n }\n var firstposition = this.cartesian3Towgs84(positions[0], this.sdk.viewer);\n array.push([firstposition.lng, firstposition.lat]);\n var polygon = turf.polygon([array]);\n var centroid = turf.centroid(polygon);\n var center = (_Cesium$Cartesian2 = Cesium.Cartesian3).fromDegrees.apply(_Cesium$Cartesian2, _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(centroid.geometry.coordinates));\n for (var _i18 = 0; _i18 < positions.length; _i18++) {\n disparity.push({\n x: center.x - positions[_i18].x,\n y: center.y - positions[_i18].y,\n z: center.z - positions[_i18].z\n });\n }\n var newpositions = [];\n for (var _i19 = 0; _i19 < disparity.length; _i19++) {\n newpositions.push({\n x: cartesian.x - disparity[_i19].x,\n y: cartesian.y - disparity[_i19].y,\n z: cartesian.z - disparity[_i19].z\n });\n }\n this.label.position = [v.position.lng, v.position.lat, v.position.alt];\n var positions84 = [];\n if (newpositions.length > 0) {\n for (var _i20 = 0; _i20 < newpositions.length; _i20++) {\n positions84.push(this.cartesian3Towgs84(newpositions[_i20], this.sdk.viewer));\n }\n }\n var arr = this.computeAttackArrow(positions84);\n if (arr.length == 0) {\n return;\n }\n this.entity.polygon.hierarchy = new Cesium.CallbackProperty(function () {\n return new Cesium.PolygonHierarchy(arr);\n }, false);\n this.entity.polyline.positions = new Cesium.CallbackProperty(function () {\n if (arr.length >= 3) {\n return [].concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(arr), [arr[0], arr[1]]);\n } else {\n return _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(arr);\n }\n }, false);\n }\n }, {\n key: \"setDIV\",\n value: function setDIV() {\n var _this16 = this;\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {\n domid: \"\",\n x: 10,\n y: 10\n };\n options.x = options.x || options.x === 0 ? options.x : 10;\n options.y = options.y || options.y === 0 ? options.y : 10;\n var positions = this.computeAttackArrow(this.options.positions);\n if (positions.length == 0) {\n return;\n }\n var points = [[]];\n for (var i = 0; i < positions.length; i++) {\n var _position2 = this.cartesian3Towgs84(positions[i], this.sdk.viewer);\n points[0].push([_position2.lng, _position2.lat]);\n }\n var position = this.cartesian3Towgs84(positions[0], this.sdk.viewer);\n points[0].push([position.lng, position.lat]);\n var polygon = turf.polygon(points);\n // let centroid = turf.centroid(polygon);\n var centroid = turf.pointOnFeature(polygon);\n var siteInfoDom = document.getElementById(options.domid);\n var siteInfoPosition = Cesium.Cartesian3.fromDegrees(centroid.geometry.coordinates[0], centroid.geometry.coordinates[1]);\n this.sdk.viewer.scene.postRender.addEventListener(function (percentage) {\n //转换到屏幕坐标\n if (siteInfoDom.style.display === 'block' || siteInfoDom.style.display === '') {\n var winpos = _this16.sdk.viewer.scene.cartesianToCanvasCoordinates(siteInfoPosition);\n if (winpos) {\n siteInfoDom.style.left = (winpos.x + options.x).toFixed(0) + 'px';\n siteInfoDom.style.top = (winpos.y + options.y).toFixed(0) + 'px';\n }\n }\n });\n }\n }, {\n key: \"spreadTime\",\n get: function get() {\n return this.options.spreadTime;\n },\n set: function set(v) {\n var spreadTime = Number(v);\n if (isNaN(spreadTime)) {\n spreadTime = 3000;\n } else if (spreadTime < 500) {\n spreadTime = 500;\n } else if (spreadTime > 9999999) {\n spreadTime = 9999999;\n }\n this.options.spreadTime = spreadTime;\n if (this.spreadState) {\n this.setSpreadProgressByTime();\n }\n this._elms.spreadTime && this._elms.spreadTime.forEach(function (item) {\n item.value = spreadTime;\n });\n }\n }, {\n key: \"loop\",\n get: function get() {\n return this.options.loop;\n },\n set: function set(v) {\n this.options.loop = v;\n if (this.TweenAnimate) {\n if (v) {\n this.TweenAnimate.repeat(Infinity);\n } else {\n this.TweenAnimate.repeat();\n }\n }\n this._elms.loop && this._elms.loop.forEach(function (item) {\n item.checked = v;\n });\n }\n }, {\n key: \"spreadState\",\n get: function get() {\n return this.options.spreadState;\n },\n set: function set(v) {\n this.options.spreadState = v;\n if (this.TweenAnimate) {\n if (v) {\n this.lineEdit = false;\n this.setSpreadProgressByTime(this.TweenAnimate._object.distance / this.TweenAnimate._valuesEnd.distance * this.spreadTime);\n } else {\n this.TweenAnimate.pause();\n }\n } else {\n if (v) {\n this.setSpreadProgressByTime();\n }\n }\n this._elms.spreadState && this._elms.spreadState.forEach(function (item) {\n item.checked = v;\n });\n }\n }, {\n key: \"setSpreadProgressByTime\",\n value: function setSpreadProgressByTime() {\n var _this17 = this;\n var time = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n if (!this.entity) {\n return;\n }\n var that = this;\n for (var i = 0; i < this.nodePoints.length; i++) {\n this.sdk.viewer.entities.remove(this.nodePoints[i]);\n }\n this.nodePoints = [];\n YJ.Measure.SetMeasureStatus(false);\n this.event && this.event.destroy();\n this.tip && this.tip.destroy();\n var AttackArrowArr = that.computeAttackArrow(that.options.positions);\n var arr;\n var lineArr;\n // if (arr.length >= 3) {\n // lineArr = [...arr, arr[0], arr[1]]\n // }\n // else {\n // lineArr = [...arr]\n // }\n if (this.TweenAnimate) {\n TWEEN.remove(this.TweenAnimate);\n this.TweenAnimate = null;\n }\n var _getSdk = Object(_Global_SplitScreen__WEBPACK_IMPORTED_MODULE_20__[\"getSdk\"])(),\n sdkP = _getSdk.sdkP,\n sdkD = _getSdk.sdkD;\n var thatP;\n if (sdkD && sdkP) {\n if (this.sdk === sdkD) {\n thatP = sdkP.entityMap.get(this.options.id);\n if (thatP && thatP.entity && thatP.entity.polygon && thatP.positionsH) {\n this.entity.polygon.hierarchy = new Cesium.CallbackProperty(function () {\n return new Cesium.PolygonHierarchy(thatP.positionsH);\n }, false);\n this.entity.polyline.positions = new Cesium.CallbackProperty(function () {\n return [].concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(thatP.positionsH), [thatP.positionsH[0], thatP.positionsH[1]]);\n }, false);\n }\n return;\n }\n }\n\n // this.entity.polygon.hierarchy = arr\n // this.entity.polyline.positions = lineArr\n\n var linePos84 = [[(that.options.positions[0].lng + that.options.positions[1].lng) / 2, (that.options.positions[0].lat + that.options.positions[1].lat) / 2]];\n for (var _i21 = 2; _i21 < that.options.positions.length; _i21++) {\n linePos84.push([that.options.positions[_i21].lng, that.options.positions[_i21].lat]);\n }\n var line = turf.lineString(linePos84);\n var distanceArray = [];\n for (var _i22 = 1; _i22 < linePos84.length; _i22++) {\n var from = turf.point(linePos84[_i22]);\n var to = turf.point(linePos84[_i22 - 1]);\n var d = turf.distance(from, to, {\n units: 'kilometers'\n });\n var od = distanceArray[distanceArray.length - 1] || 0;\n distanceArray.push(od + d);\n }\n var distance = turf.length(line, {\n units: 'kilometers'\n });\n var timeRatio = time / this.spreadTime;\n var m = 0;\n this.TweenAnimate = new TWEEN.Tween({\n distance: distance * timeRatio\n }).to({\n distance: distance\n }, this.spreadTime - time).easing(TWEEN.Easing.Linear.None).repeat(this.options.loop ? Infinity : 0).onRepeat(function () {\n if (time) {\n _this17.setSpreadProgressByTime();\n } else {}\n }).onUpdate(/*#__PURE__*/function () {\n var _ref2 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee5(r, a) {\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee5$(_context5) {\n while (1) switch (_context5.prev = _context5.next) {\n case 0:\n if (!(_this17.TweenAnimate._duration == Infinity)) {\n _context5.next = 2;\n break;\n }\n return _context5.abrupt(\"return\");\n case 2:\n m++;\n if (_this17.sdk.viewer) {\n _context5.next = 6;\n break;\n }\n _this17.removeAnimate();\n return _context5.abrupt(\"return\");\n case 6:\n setSpread(r);\n case 7:\n case \"end\":\n return _context5.stop();\n }\n }, _callee5);\n }));\n return function (_x2, _x3) {\n return _ref2.apply(this, arguments);\n };\n }()).onStart(function () {\n _this17.options.spreadState = true;\n _this17._elms.spreadState && _this17._elms.spreadState.forEach(function (item) {\n item.checked = true;\n });\n }).onComplete(function (d) {\n _this17.removeAnimate();\n });\n if (this.spreadState) {\n this.TweenAnimate.start();\n } else {\n setSpread({\n distance: distance * timeRatio\n });\n }\n function setSpread(_x4) {\n return _setSpread.apply(this, arguments);\n }\n function _setSpread() {\n _setSpread = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee6(v) {\n var index, _i23, positions, _i24, sliced, coordinates;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee6$(_context6) {\n while (1) switch (_context6.prev = _context6.next) {\n case 0:\n if (that.show) {\n _context6.next = 2;\n break;\n }\n return _context6.abrupt(\"return\");\n case 2:\n index = 2;\n _i23 = distanceArray.length - 2;\n case 4:\n if (!(_i23 >= 0)) {\n _context6.next = 12;\n break;\n }\n if (!(v.distance >= distanceArray[_i23])) {\n _context6.next = 9;\n break;\n }\n index = index + _i23 + 1;\n if (index > that.options.positions.length - 1) {\n index = that.options.positions.length - 1;\n }\n return _context6.abrupt(\"break\", 12);\n case 9:\n _i23--;\n _context6.next = 4;\n break;\n case 12:\n positions = [];\n for (_i24 = 0; _i24 < index; _i24++) {\n positions[_i24] = _objectSpread({}, that.options.positions[_i24]);\n }\n if (v.distance) {\n _context6.next = 18;\n break;\n }\n positions[index] = {\n lng: positions[1].lng,\n lat: positions[1].lat\n };\n _context6.next = 25;\n break;\n case 18:\n _context6.next = 20;\n return turf.lineSliceAlong(line, 0, v.distance, {\n units: 'kilometers'\n });\n case 20:\n sliced = _context6.sent;\n coordinates = _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(sliced.geometry.coordinates[sliced.geometry.coordinates.length - 1]);\n if (!positions[index]) {\n positions[index] = {};\n }\n positions[index].lng = coordinates[0];\n positions[index].lat = coordinates[1];\n case 25:\n // console.log('positions', positions)\n that.renewPositions(positions);\n case 26:\n case \"end\":\n return _context6.stop();\n }\n }, _callee6);\n }));\n return _setSpread.apply(this, arguments);\n }\n this.entity.polygon.hierarchy = new Cesium.CallbackProperty(function () {\n return new Cesium.PolygonHierarchy(that.positionsH);\n }, false);\n this.entity.polyline.positions = new Cesium.CallbackProperty(function () {\n return [].concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(that.positionsH), [that.positionsH[0], that.positionsH[1]]);\n }, false);\n }\n\n // 移除动画\n }, {\n key: \"removeAnimate\",\n value: function removeAnimate() {\n this.spreadState = false;\n if (this.TweenAnimate) {\n TWEEN.remove(this.TweenAnimate);\n this.TweenAnimate = null;\n this.renewPositions();\n this.entity.polygon.hierarchy = new Cesium.PolygonHierarchy(this.positionsH);\n this.entity.polyline.positions = [].concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(this.positionsH), [this.positionsH[0], this.positionsH[1]]);\n }\n }\n\n // 更新坐标\n }, {\n key: \"renewPositions\",\n value: function renewPositions(position84) {\n var _this18 = this;\n if (this._error || !this.sdk.viewer) {\n return;\n }\n var ground = false;\n var array = [];\n var positions = this.options.positions;\n if (position84) {\n positions = position84;\n }\n var fromDegreesArray = [];\n for (var i = 0; i < positions.length; i++) {\n fromDegreesArray.push(positions[i].lng, positions[i].lat);\n }\n this.positions = Cesium.Cartesian3.fromDegreesArray(fromDegreesArray);\n var positionsA = this.computeAttackArrow(positions);\n if (positionsA.length == 0) {\n return;\n }\n var points = [[]];\n var pos84 = [];\n for (var _i25 = 0; _i25 < positionsA.length; _i25++) {\n var _position3 = this.cartesian3Towgs84(positionsA[_i25], this.sdk.viewer);\n pos84.push(_position3);\n points[0].push([_position3.lng, _position3.lat]);\n }\n var position = this.cartesian3Towgs84(positionsA[0], this.sdk.viewer);\n points[0].push([position.lng, position.lat]);\n var height = 0;\n var polygon = turf.polygon(points);\n var centroid = turf.pointOnFeature(polygon);\n switch (this.options.heightMode) {\n case '0':\n case 0:\n ground = false;\n break;\n case '1':\n case 1:\n height = this.sdk.viewer.scene.globe.getHeight(Cesium.Cartographic.fromDegrees(centroid.geometry.coordinates[0], centroid.geometry.coordinates[1])) || 0;\n ground = false;\n break;\n case '2':\n case 2:\n ground = true;\n break;\n }\n var fromDegreesArray2 = [];\n if (!ground && this.nodePoints.length == 0) {\n for (var _i26 = 0; _i26 < points[0].length; _i26++) {\n fromDegreesArray2.push(points[0][_i26][0], points[0][_i26][1], this.height + height);\n }\n this.positionsH = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray2);\n this.label && (this.label.position = [centroid.geometry.coordinates[0], centroid.geometry.coordinates[1], this.height + height]);\n } else {\n this.positionsH = positionsA;\n setTimeout(function () {\n if (!_this18.sdk.viewer) {\n return;\n }\n var objectsToExclude = _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(_this18.sdk.viewer.entities.values);\n _this18.getClampToHeight({\n lng: centroid.geometry.coordinates[0],\n lat: centroid.geometry.coordinates[1]\n }, objectsToExclude).then(function (height) {\n _this18.label && (_this18.label.position = [centroid.geometry.coordinates[0], centroid.geometry.coordinates[1], height]);\n });\n }, 100);\n }\n\n // 计算投影面积\n if (!this.spreadState) {\n this.areaByMeter = this.computeArea(pos84);\n this.areaChangeCallBack && this.areaChangeCallBack();\n }\n return fromDegreesArray;\n }\n }], [{\n key: \"create\",\n value: function create(that) {\n var positions = that.options.positions;\n var fromDegreesArray = [];\n for (var i = 0; i < positions.length; i++) {\n fromDegreesArray.push(positions[i].lng, positions[i].lat);\n }\n that.positions = Cesium.Cartesian3.fromDegreesArray(fromDegreesArray);\n var positionsA = that.computeAttackArrow(that.options.positions);\n if (positionsA.length == 0) {\n return;\n }\n var points = [[]];\n for (var _i27 = 0; _i27 < positionsA.length; _i27++) {\n var _position4 = that.cartesian3Towgs84(positionsA[_i27], that.sdk.viewer);\n points[0].push([_position4.lng, _position4.lat]);\n }\n var position = that.cartesian3Towgs84(positionsA[0], that.sdk.viewer);\n points[0].push([position.lng, position.lat]);\n var polygon = turf.polygon(points);\n // let centroid = turf.centroid(polygon);\n var centroid = turf.pointOnFeature(polygon);\n var ground;\n var height = 0;\n switch (that.options.heightMode) {\n case '0':\n case 0:\n ground = false;\n break;\n case '1':\n case 1:\n height = that.sdk.viewer.scene.globe.getHeight(Cesium.Cartographic.fromDegrees(centroid.geometry.coordinates[0], centroid.geometry.coordinates[1])) || 0;\n ground = false;\n break;\n case '2':\n case 2:\n ground = true;\n break;\n }\n\n // if (!that.options.label.position) {\n // that.options.label.position = { lng: centroid.geometry.coordinates[0], lat: centroid.geometry.coordinates[1], alt: that.height + height }\n // }\n that.options.label.position = {\n lng: centroid.geometry.coordinates[0],\n lat: centroid.geometry.coordinates[1],\n alt: that.height + height\n };\n // that.options.label.ground = ground\n\n var fromDegreesArray2 = [];\n for (var _i28 = 0; _i28 < points[0].length; _i28++) {\n fromDegreesArray2.push(points[0][_i28][0], points[0][_i28][1], that.height + height);\n }\n var material = Cesium.Color.fromCssColorString(that.options.color);\n if (that.sdk.viewer.scene.mode === 2) {\n ground = false;\n material = new Cesium.CustomColorMaterialSource({\n color: that.options.color\n });\n }\n that.positionsH = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray2);\n that.entity = that.sdk.viewer.entities.add({\n show: that.options.show,\n id: that.options.id,\n polygon: {\n hierarchy: !ground ? new Cesium.PolygonHierarchy(that.positionsH) : new Cesium.PolygonHierarchy(positionsA),\n perPositionHeight: !ground ? true : false,\n material: material,\n zIndex: that.sdk._entityZIndex\n },\n polyline: {\n positions: [].concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(that.positionsH), [that.positionsH[0], that.positionsH[1]]),\n width: that.options.line.width,\n material: Cesium.Color.fromCssColorString(that.options.line.color),\n clampToGround: !ground ? false : true,\n arcType: !ground ? Cesium.ArcType.NONE : Cesium.ArcType.GEODESIC,\n zIndex: that.sdk._entityZIndex\n }\n });\n that.sdk._entityZIndex++;\n AttackArrowObject.createLabel(that);\n var pos84 = [];\n for (var _i29 = 0; _i29 < positionsA.length; _i29++) {\n pos84.push(that.cartesian3Towgs84(positionsA[_i29], that.sdk.viewer));\n }\n that.areaByMeter = that.computeArea(pos84);\n that.areaChangeCallBack && that.areaChangeCallBack();\n Object(_Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_17__[\"syncData\"])(that.sdk, that.options.id);\n if (that.options.show) {\n Object(_Global_SplitScreen__WEBPACK_IMPORTED_MODULE_20__[\"setSplitDirection\"])(0, that.options.id);\n }\n that.spreadState = that.options.spreadState;\n }\n }, {\n key: \"createLabel\",\n value: function () {\n var _createLabel = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee7(that) {\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee7$(_context7) {\n while (1) switch (_context7.prev = _context7.next) {\n case 0:\n // 标签\n that.label = new _LabelObject__WEBPACK_IMPORTED_MODULE_14__[\"default\"](that.sdk, {\n id: that.options.id,\n show: that.options.show ? that.options.label.show : false,\n position: [that.options.label.position.lng, that.options.label.position.lat, that.options.label.position.alt],\n text: that.options.name,\n fontSize: that.options.label.fontSize,\n fontFamily: that.options.label.fontFamily,\n color: that.options.label.color,\n pixelOffset: that.options.label.pixelOffset,\n backgroundColor: that.options.label.backgroundColor,\n lineColor: that.options.label.lineColor,\n lineWidth: that.options.label.lineWidth,\n scaleByDistance: that.options.label.scaleByDistance,\n near: that.options.label.near,\n far: that.options.label.far\n // ground: that.options.label.ground,\n });\n case 1:\n case \"end\":\n return _context7.stop();\n }\n }, _callee7);\n }));\n function createLabel(_x5) {\n return _createLabel.apply(this, arguments);\n }\n return createLabel;\n }()\n }, {\n key: \"EventBinding\",\n value: function EventBinding(that, elements) {\n var _loop2 = function _loop2() {\n var Event = [];\n var isEvent = false;\n var removeName = [];\n if (!elements[i] || !elements[i].attributes) {\n return 1; // continue\n }\n var _iterator = _createForOfIteratorHelper(elements[i].attributes),\n _step;\n try {\n var _loop3 = function _loop3() {\n var m = _step.value;\n switch (m.name) {\n case '@model':\n {\n isEvent = true;\n if (elements[i].type == 'checkbox') {\n Event.push(function (e) {\n that[m.value] = e.target.checked;\n });\n elements[i].checked = that[m.value];\n } else {\n Event.push(function (e) {\n var value = e.target.value;\n if (e.target.type == 'number') {\n if (e.data != '.' && (e.data != '-' || e.target.value)) {\n value = Number(value);\n if (e.target.max && value > Number(e.target.max)) {\n value = Number(e.target.max);\n }\n if (e.target.min && value < Number(e.target.min)) {\n value = Number(e.target.min);\n }\n that[m.value] = value;\n }\n } else {\n that[m.value] = value;\n }\n });\n if (elements[i].nodeName == 'IMG') {\n elements[i].src = that[m.value];\n } else {\n elements[i].value = that[m.value];\n }\n }\n if (that._elms[m.value]) {\n that._elms[m.value].push(elements[i]);\n } else {\n that._elms[m.value] = [elements[i]];\n }\n removeName.push(m.name);\n break;\n }\n case '@click':\n {\n elements[i].addEventListener('click', function (e) {\n if (typeof that[m.value] === 'function') {\n that[m.value](e);\n }\n });\n removeName.push(m.name);\n // elements[i].attributes.removeNamedItem(m.name)\n break;\n }\n case '@change':\n {\n isEvent = true;\n Event.push(function (e) {\n var value = e.target.value;\n if (e.target.type == 'number' && value != '') {\n value = Number(value);\n e.target.value = value;\n }\n if (typeof that[m.value] === 'function') {\n that[m.value](e, value);\n }\n });\n break;\n }\n }\n // elements[i].attributes[m] = undefined\n };\n for (_iterator.s(); !(_step = _iterator.n()).done;) {\n _loop3();\n }\n } catch (err) {\n _iterator.e(err);\n } finally {\n _iterator.f();\n }\n for (var n = 0; n < removeName.length; n++) {\n elements[i].attributes.removeNamedItem(removeName[n]);\n }\n if (isEvent) {\n var ventType = 'input';\n if (elements[i].tagName != 'INPUT' || elements[i].type == 'checkbox') {\n ventType = 'change';\n }\n if (elements[i].className.indexOf('blur') !== -1) {\n ventType = 'blur';\n }\n elements[i].addEventListener(ventType, function (e) {\n for (var t = 0; t < Event.length; t++) {\n Event[t](e);\n }\n });\n }\n };\n for (var i = 0; i < elements.length; i++) {\n if (_loop2()) continue;\n }\n }\n }]);\n}(_index__WEBPACK_IMPORTED_MODULE_13__[\"default\"]);\n/* harmony default export */ __webpack_exports__[\"default\"] = (AttackArrowObject);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvT2JqL0Jhc2UvQXR0YWNrQXJyb3dPYmplY3QvaW5kZXguanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvT2JqL0Jhc2UvQXR0YWNrQXJyb3dPYmplY3QvaW5kZXguanM/N2EyMSJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICog566t5aS0XHJcbiAqL1xyXG5pbXBvcnQgRGlhbG9nIGZyb20gJy4uLy4uL0VsZW1lbnQvRGlhbG9nJztcclxuaW1wb3J0IGN5X3RhYnMgZnJvbSBcIi4uLy4uL0VsZW1lbnQvY3lfaHRtbF90YWJzXCI7XHJcbmltcG9ydCByaWNoVGV4dCBmcm9tIFwiLi4vLi4vRWxlbWVudC9yaWNoVGV4dFwiO1xyXG5pbXBvcnQgeyBodG1sLCBjc3MgfSBmcm9tIFwiLi9fZWxlbWVudFwiO1xyXG5pbXBvcnQgQmFzZSBmcm9tIFwiLi4vaW5kZXhcIjtcclxuaW1wb3J0IExhYmVsT2JqZWN0IGZyb20gJy4uL0xhYmVsT2JqZWN0J1xyXG5pbXBvcnQgTW91c2VFdmVudCBmcm9tICcuLi8uLi8uLi9FdmVudC9pbmRleCdcclxuaW1wb3J0IE1vdXNlVGlwIGZyb20gJy4uLy4uLy4uL01vdXNlVGlwJ1xyXG5pbXBvcnQgeyBzeW5jRGF0YSB9IGZyb20gJy4uLy4uLy4uL0dsb2JhbC9NdWx0aVZpZXdwb3J0TW9kZSdcclxuaW1wb3J0IHsgbGVncCB9IGZyb20gJy4uLy4uL0VsZW1lbnQvZGF0YWxpc3QnO1xyXG5pbXBvcnQgeyBnZXRGb250TGlzdCwgZ2V0Rm9udEZhbWlseU5hbWUgfSBmcm9tICcuLi8uLi9FbGVtZW50L2ZvbnRTZWxlY3QnXHJcbmltcG9ydCB7IHNldFNwbGl0RGlyZWN0aW9uLCBzeW5jU3BsaXREYXRhLCBnZXRTZGsgfSBmcm9tICcuLi8uLi8uLi9HbG9iYWwvU3BsaXRTY3JlZW4nXHJcbmltcG9ydCB7IHNldEFjdGl2ZVZpZXdlciwgY2xvc2VSb3RhdGVBcm91bmQsIGNsb3NlVmlld0ZvbGxvdyB9IGZyb20gJy4uLy4uLy4uL0dsb2JhbC9nbG9iYWwnXHJcbi8vIGltcG9ydCBFZGl0UGFydGljbGUgZnJvbSBcIi4uLy4uL01vZGVsQ29udHJvbGxlci9FZGl0UGFydGljbGVcIjtcclxuXHJcbmNsYXNzIEF0dGFja0Fycm93T2JqZWN0IGV4dGVuZHMgQmFzZSB7XHJcbiAgLyoqXHJcbiAgICogQGNvbnN0cnVjdG9yXHJcbiAgICogQHBhcmFtIHNka1xyXG4gICAqIEBkZXNjcmlwdGlvbiDnrq3lpLTpnaJcclxuICAgKiBAcGFyYW0gb3B0aW9ucyB7b2JqZWN0fSDlsZ7mgKdcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5pZCB7c3RyaW5nfSDllK/kuIDmoIfor4ZcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5zaG93PXRydWUge2Jvb2xlYW59IOaYvuekui/pmpDol49cclxuICAgKiBAcGFyYW0gb3B0aW9ucy5uYW1lIHtzdHJpbmd9IOWQjeensFxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmNvbG9yPSdyZ2JhKDI1NSwgMCwgMCwgMC41KScge3N0cmluZ30g6aKc6ImyXHJcbiAgICogQHBhcmFtIG9wdGlvbnMuaGVpZ2h0IHtudW1iZXJ9IOmrmOW6plxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmhlaWdodE1vZGU9MntudW1iZXJ9IOmrmOW6puaooeW8j++8iDDvvJrmtbfmi5Tpq5jluqbvvJsx77ya55u45a+55Zyw6KGo77ybMu+8muS+nemZhOaooeW8j++8iVxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmFyZWFVbml0PSflubPmlrnnsbMnIHtzdHJpbmd9IOmdouenr+WNleS9jVxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxpbmUge29iamVjdH0g6L655qGGXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGluZS53aWR0aD0yIHtzdHJpbmd9IOi+ueahhuWuvVxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxpbmUuY29sb3I9XCJyZ2JhKDE1NSwgMTU1LCAxMjQsIDAuODkpXCIge3N0cmluZ30g6L655qGG6aKc6ImyXHJcbiAgICogQHBhcmFtIHtBcnJheS48b2JqZWN0Pn0gb3B0aW9ucy5wb3NpdGlvbnMg5b+F5aGr77yM57uP57qs5bqm5ZKM6auY5bqm55qE5YiX6KGo77yM5YC85Lqk5pu/IFt7bG9uLGxhdCxhbHR9LC4uLl1cclxuICAgKiBAcGFyYW0gb3B0aW9ucy5wb3NpdGlvbnNbXS5sbmcge251bWJlcn0g57uP5bqmXHJcbiAgICogQHBhcmFtIG9wdGlvbnMucG9zaXRpb25zW10ubGF0IHtudW1iZXJ9IOe6rOW6plxyXG4gICAqIEBwYXJhbSBvcHRpb25zLnBvc2l0aW9uc1tdLmFsdCB7bnVtYmVyfSDpq5jluqZcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5zcHJlYWRTdGF0ZT1mYWxzZSB7Ym9vbGVhbn0g5Yqo55S7XHJcbiAgICogQHBhcmFtIG9wdGlvbnMubG9vcD1mYWxzZSB7bG9vcH0g5Yqo55S76YeN5aSNXHJcbiAgICogQHBhcmFtIG9wdGlvbnMuc3ByZWFkVGltZT0zMDAwIHtudW1iZXJ9IOWKqOeUu+aMgee7reaXtumVvyjmr6vnp5IpXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwge29iamVjdH0g5qCH562+5a+56LGhXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwudGV4dCB7c3RyaW5nfSDmoIfnrb7mlofmnKxcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5sYWJlbC5zaG93IHtzdHJpbmd9IOagh+etvuaYvumakFxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLnBvc2l0aW9uIHtzdHJpbmd9IOagh+etvuS9jee9rlxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLnBvc2l0aW9uIHtvYmplY3R9IOagh+etvuS9jee9rlxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLnBvc2l0aW9uLmxuZyB7bnVtYmVyfSDnu4/luqZcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5sYWJlbC5wb3NpdGlvbi5sYXQge251bWJlcn0g57qs5bqmXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwucG9zaXRpb24uYWx0IHtudW1iZXJ9IOmrmOW6plxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLmZvbnRTaXplPTIwIHtudW1iZXJ9IOWtl+S9k+Wkp+Wwj1xyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLmZvbnRGYW1pbHk9MCB7bnVtYmVyfSDlrZfkvZPpobkgMO+8mum7keS9k++8mzHvvJrmgJ3mupDpu5HkvZPvvJsy77ya5bqe6Zeo5q2j6YGT5qCH6aKY5L2T77ybM++8muaVsOm7keS9k1xyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLmNvbG9yPSNmZmZmZmYge3N0cmluZ30g5a2X5L2T6aKc6ImyXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwubGluZVdpZHRoPTQge251bWJlcn0g5byV57q/5a69XHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwubGluZUNvbG9yPSMwMGZmZmY4MCB7c3RyaW5nfSDlvJXnur/popzoibJcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5sYWJlbC5waXhlbE9mZnNldD0yMCB7bnVtYmVyfSDlrZfkvZPlgY/np7so5byV57q/6ZW/5bqmKVxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLmJhY2tncm91bmRDb2xvcj1bJyMwMGZmZmY4MCcsICcjMDBmZmZmODAnXSB7YXJyYXl9IOiDjOaZr+minOiJslxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLnNjYWxlQnlEaXN0YW5jZSB7Ym9vbGVhbn0g6Led56a757yp5pS+XHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwubmVhcj0yMDAwIHtudW1iZXJ9IOinhumHjue8qeaUvuacgOi/kei3neemu1xyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLmZhcj0xMDAwMDAge251bWJlcn0g6KeG6YeO57yp5pS+5pyA6L+c6Led56a7XHJcbiAgICogQHBhcmFtIG9wdGlvbnMuYXR0cmlidXRlIHtvYmplY3R9IOWxnuaAp+WGheWuuVxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmF0dHJpYnV0ZS5saW5rPXt9IHtvYmplY3R9IOmTvuaOpVxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnQ9W11dIHthcnJheX0g6ZO+5o6l5YaF5a65XHJcbiAgICogQHBhcmFtIG9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudFtdLm5hbWUge3N0cmluZ30g6ZO+5o6l5ZCN56ewXHJcbiAgICogQHBhcmFtIG9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudFtdLnVybCB7c3RyaW5nfSDpk77mjqXlnLDlnYBcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5yaWNoVGV4dENvbnRlbnQge3N0cmluZ30g5a+M5paH5pys5YaF5a65XHJcbiAgICogQHBhcmFtIG9wdGlvbnMuY3VzdG9tVmlldyB7b2JqZWN0fSDpu5jorqTop4bop5JcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5jdXN0b21WaWV3Lm9yaWVudGF0aW9uIHtvYmplY3R9IOm7mOiupOinhuinkuaWueS9jVxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmN1c3RvbVZpZXcub3JpZW50YXRpb24uaGVhZGluZyB7bnVtYmVyfSDoiKrlkJHop5JcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5jdXN0b21WaWV3Lm9yaWVudGF0aW9uLnBpdGNoIHtudW1iZXJ9IOS/r+S7sOinklxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmN1c3RvbVZpZXcub3JpZW50YXRpb24ucm9sbCB7bnVtYmVyfSDnv7vmu5rop5JcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5jdXN0b21WaWV3LnJlbGF0aXZlUG9zaXRpb24ge29iamVjdH0g6KeG6KeS55u45a+55L2N572uXHJcbiAgICogQHBhcmFtIG9wdGlvbnMuY3VzdG9tVmlldy5yZWxhdGl2ZVBvc2l0aW9uLmxuZyB7bnVtYmVyfSDnu4/luqZcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5jdXN0b21WaWV3LnJlbGF0aXZlUG9zaXRpb24ubGF0IHtudW1iZXJ9IOe6rOW6plxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmN1c3RvbVZpZXcucmVsYXRpdmVQb3NpdGlvbi5hbHQge251bWJlcn0g6auY5bqmXHJcbiAgICogKi9cclxuICBjb25zdHJ1Y3RvcihzZGssIG9wdGlvbnMgPSB7fSwgX0RpYWxvZyA9IHt9KSB7XHJcbiAgICBzdXBlcihzZGssIG9wdGlvbnMpO1xyXG4gICAgdGhpcy5vcHRpb25zLm5hbWUgPSBvcHRpb25zLm5hbWUgfHwgJ+acquWRveWQjeWvueixoSdcclxuICAgIHRoaXMub3B0aW9ucy5jb2xvciA9IG9wdGlvbnMuY29sb3IgfHwgXCIjZmYwMDAwODBcIlxyXG4gICAgdGhpcy5vcHRpb25zLnNob3cgPSAob3B0aW9ucy5zaG93IHx8IG9wdGlvbnMuc2hvdyA9PT0gZmFsc2UpID8gb3B0aW9ucy5zaG93IDogdHJ1ZVxyXG4gICAgdGhpcy5vcHRpb25zLnBvc2l0aW9ucyA9IG9wdGlvbnMucG9zaXRpb25zIHx8IFtdXHJcbiAgICB0aGlzLm9wdGlvbnMuaGVpZ2h0TW9kZSA9IChvcHRpb25zLmhlaWdodE1vZGUgfHwgb3B0aW9ucy5oZWlnaHRNb2RlID09IDApID8gb3B0aW9ucy5oZWlnaHRNb2RlIDogMlxyXG4gICAgdGhpcy5vcHRpb25zLmxpbmUgPSBvcHRpb25zLmxpbmUgfHwge31cclxuICAgIHRoaXMub3B0aW9ucy5saW5lLndpZHRoID0gKCh0aGlzLm9wdGlvbnMubGluZS53aWR0aCB8fCB0aGlzLm9wdGlvbnMubGluZS53aWR0aCA9PT0gMCkgPyB0aGlzLm9wdGlvbnMubGluZS53aWR0aCA6IDMpXHJcbiAgICB0aGlzLm9wdGlvbnMubGluZS5jb2xvciA9IHRoaXMub3B0aW9ucy5saW5lLmNvbG9yIHx8ICdyZ2JhKDI1NSwgMCwgMCwgMSknXHJcbiAgICB0aGlzLmVudGl0eVxyXG4gICAgdGhpcy5ldmVudCA9IG5ldyBNb3VzZUV2ZW50KHRoaXMuc2RrKVxyXG4gICAgdGhpcy5vcGVyYXRlID0ge31cclxuICAgIHRoaXMuX2VsbXMgPSB7fTtcclxuICAgIHRoaXMubm9kZVBvaW50cyA9IFtdXHJcbiAgICB0aGlzLkRpYWxvZyA9IF9EaWFsb2dcclxuICAgIHRoaXMub3B0aW9ucy5sb29wID0gb3B0aW9ucy5sb29wIHx8IGZhbHNlXHJcbiAgICB0aGlzLm9wdGlvbnMuc3ByZWFkU3RhdGUgPSBvcHRpb25zLnNwcmVhZFN0YXRlIHx8IGZhbHNlXHJcbiAgICB0aGlzLnNwcmVhZFRpbWUgPSBvcHRpb25zLnNwcmVhZFRpbWVcclxuICAgIG9wdGlvbnMubGFiZWwgPSBvcHRpb25zLmxhYmVsIHx8IHt9XHJcbiAgICB0aGlzLm9wdGlvbnMubGFiZWwgPSB7XHJcbiAgICAgIHRleHQ6IHRoaXMub3B0aW9ucy5uYW1lLFxyXG4gICAgICBzaG93OiBvcHRpb25zLmxhYmVsLnNob3cgfHwgZmFsc2UsXHJcbiAgICAgIHBvc2l0aW9uOiBvcHRpb25zLmxhYmVsLnBvc2l0aW9uLFxyXG4gICAgICBmb250RmFtaWx5OiBvcHRpb25zLmxhYmVsLmZvbnRGYW1pbHkgPyBvcHRpb25zLmxhYmVsLmZvbnRGYW1pbHkgOiAwLFxyXG4gICAgICBmb250U2l6ZTogKG9wdGlvbnMubGFiZWwuZm9udFNpemUgfHwgb3B0aW9ucy5sYWJlbC5mb250U2l6ZSA9PT0gMCkgPyBvcHRpb25zLmxhYmVsLmZvbnRTaXplIDogMjAsXHJcbiAgICAgIGNvbG9yOiBvcHRpb25zLmxhYmVsLmNvbG9yIHx8ICcjZmZmZmZmJyxcclxuICAgICAgbGluZVdpZHRoOiAob3B0aW9ucy5sYWJlbC5saW5lV2lkdGggfHwgb3B0aW9ucy5sYWJlbC5saW5lV2lkdGggPT09IDApID8gb3B0aW9ucy5sYWJlbC5saW5lV2lkdGggOiA0LFxyXG4gICAgICBwaXhlbE9mZnNldDogKG9wdGlvbnMubGFiZWwucGl4ZWxPZmZzZXQgfHwgb3B0aW9ucy5sYWJlbC5waXhlbE9mZnNldCA9PT0gMCkgPyBvcHRpb25zLmxhYmVsLnBpeGVsT2Zmc2V0IDogMjAsXHJcbiAgICAgIGJhY2tncm91bmRDb2xvcjogb3B0aW9ucy5sYWJlbC5iYWNrZ3JvdW5kQ29sb3IgfHwgWycjMDBmZmZmODAnLCAnIzAwZmZmZjgwJ10sXHJcbiAgICAgIGxpbmVDb2xvcjogb3B0aW9ucy5sYWJlbC5saW5lQ29sb3IgfHwgJyMwMGZmZmY4MCcsXHJcbiAgICAgIHNjYWxlQnlEaXN0YW5jZTogb3B0aW9ucy5sYWJlbC5zY2FsZUJ5RGlzdGFuY2UgfHwgZmFsc2UsXHJcbiAgICAgIG5lYXI6IChvcHRpb25zLmxhYmVsLm5lYXIgfHwgb3B0aW9ucy5sYWJlbC5uZWFyID09PSAwKSA/IG9wdGlvbnMubGFiZWwubmVhciA6IDIwMDAsXHJcbiAgICAgIGZhcjogKG9wdGlvbnMubGFiZWwuZmFyIHx8IG9wdGlvbnMubGFiZWwuZmFyID09PSAwKSA/IG9wdGlvbnMubGFiZWwuZmFyIDogMTAwMDAwLFxyXG4gICAgfVxyXG4gICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZSA9IG9wdGlvbnMuYXR0cmlidXRlIHx8IHt9XHJcbiAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsgfHwge31cclxuICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50ID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnQgfHwgW11cclxuXHJcbiAgICBkZWxldGUgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5jYW1lcmFcclxuICAgIGRlbGV0ZSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyXHJcbiAgICBkZWxldGUgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5nb29kc1xyXG5cclxuXHJcbiAgICBpZiAoIXRoaXMub3B0aW9ucy5wb3NpdGlvbnMgfHwgdGhpcy5vcHRpb25zLnBvc2l0aW9ucy5sZW5ndGggPCAzKSB7XHJcbiAgICAgIHRoaXMuX2Vycm9yID0gJ+eureWktOmdouacgOWwkemcgOimgeS4ieS4quWdkOagh++8gSdcclxuICAgICAgY29uc29sZS53YXJuKHRoaXMuX2Vycm9yKVxyXG4gICAgICB3aW5kb3cuRUxFTUVOVCAmJiB3aW5kb3cuRUxFTUVOVC5NZXNzYWdlKHtcclxuICAgICAgICBtZXNzYWdlOiB0aGlzLl9lcnJvcixcclxuICAgICAgICB0eXBlOiAnd2FybmluZycsXHJcbiAgICAgICAgZHVyYXRpb246IDE1MDBcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuaGVpZ2h0ICYmIHRoaXMub3B0aW9ucy5oZWlnaHQgIT09IDApIHtcclxuICAgICAgICBsZXQgaGVpZ2h0ID0gdGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXS5hbHRcclxuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IHRoaXMub3B0aW9ucy5wb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGlmIChoZWlnaHQgPCB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmFsdCkge1xyXG4gICAgICAgICAgICBoZWlnaHQgPSB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmFsdFxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLm9wdGlvbnMuaGVpZ2h0ID0gaGVpZ2h0XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5zZGsuYWRkSW5jZXRhbmNlKHRoaXMub3B0aW9ucy5pZCwgdGhpcylcclxuICAgICAgQXR0YWNrQXJyb3dPYmplY3QuY3JlYXRlKHRoaXMpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgdHlwZSgpIHtcclxuICAgIHJldHVybiAnQXR0YWNrQXJyb3dPYmplY3QnXHJcbiAgfVxyXG5cclxuICBnZXQgY29sb3IoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmNvbG9yXHJcbiAgfVxyXG4gIHNldCBjb2xvcih2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMuY29sb3IgPSB2IHx8ICdyZ2JhKDI1NSwgMCwgMCwgMC41KSdcclxuICAgIGlmICghdGhpcy5zZGsgfHwgIXRoaXMuc2RrLnZpZXdlciB8fCAhdGhpcy5lbnRpdHkgfHwgIXRoaXMuZW50aXR5LnBvbHlnb24pIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcbiAgICBsZXQgbWF0ZXJpYWwgPSBDZXNpdW0uQ29sb3IuZnJvbUNzc0NvbG9yU3RyaW5nKHRoaXMub3B0aW9ucy5jb2xvcilcclxuICAgIGlmICh0aGlzLnNkay52aWV3ZXIuc2NlbmUubW9kZSA9PT0gMikge1xyXG4gICAgICBtYXRlcmlhbCA9IG5ldyBDZXNpdW0uQ3VzdG9tQ29sb3JNYXRlcmlhbFNvdXJjZSh7XHJcbiAgICAgICAgY29sb3I6IHRoaXMub3B0aW9ucy5jb2xvclxyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gICAgdGhpcy5lbnRpdHkucG9seWdvbi5tYXRlcmlhbCA9IG1hdGVyaWFsXHJcbiAgICBpZiAodGhpcy5fZWxtcy5jb2xvcikge1xyXG4gICAgICB0aGlzLl9lbG1zLmNvbG9yLmZvckVhY2goKGl0ZW0sIGkpID0+IHtcclxuICAgICAgICBsZXQgY29sb3JQaWNrZXIgPSBuZXcgWUpDb2xvclBpY2tlcih7XHJcbiAgICAgICAgICBlbDogaXRlbS5lbCxcclxuICAgICAgICAgIHNpemU6ICdtaW5pJywvL+minOiJsmJveOexu+Wei1xyXG4gICAgICAgICAgYWxwaGE6IHRydWUsLy/mmK/lkKblvIDlkK/pgI/mmI7luqZcclxuICAgICAgICAgIGRlZmF1bHRDb2xvcjogdGhpcy5vcHRpb25zLmNvbG9yLFxyXG4gICAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLC8v5piv5ZCm56aB5q2i5omT5byA6aKc6Imy6YCJ5oup5ZmoXHJcbiAgICAgICAgICBvcGVuUGlja2VyQW5pOiAnb3BhY2l0eScsLy/miZPlvIDpopzoibLpgInmi6nlmajliqjnlLtcclxuICAgICAgICAgIHN1cmU6IChjKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuY29sb3IgPSBjXHJcbiAgICAgICAgICB9LC8v54K55Ye756Gu6K6k5oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgICAgICBjbGVhcjogKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmNvbG9yID0gJ3JnYmEoMjU1LDAsMCwwLjUpJ1xyXG4gICAgICAgICAgfSwvL+eCueWHu+a4heepuuaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgdGhpcy5fZWxtcy5jb2xvcltpXSA9IGNvbG9yUGlja2VyXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgaGVpZ2h0TW9kZSgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuaGVpZ2h0TW9kZSA/IHRoaXMub3B0aW9ucy5oZWlnaHRNb2RlIDogMFxyXG4gIH1cclxuICBzZXQgaGVpZ2h0TW9kZSh2KSB7XHJcbiAgICB0aGlzLmVudGl0eS5wb2x5Z29uLmhpZXJhcmNoeSA9IFtdXHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5vcHRpb25zLmhlaWdodE1vZGUgPSAodiB8fCB2ID09IDApID8gdiA6IDJcclxuICAgICAgdGhpcy5wb3NpdGlvbkVkaXRpbmcgPSBmYWxzZVxyXG4gICAgICBpZiAoIXRoaXMuZW50aXR5KSB7XHJcbiAgICAgICAgcmV0dXJuXHJcbiAgICAgIH1cclxuICAgICAgbGV0IGhlaWdodE1vZGVOYW1lID0gJydcclxuICAgICAgdGhpcy5jbG9zZU5vZGVFZGl0KClcclxuICAgICAgbGV0IGdyb3VuZCA9IGZhbHNlXHJcbiAgICAgIGxldCBkaXNhYmxlZCA9IGZhbHNlXHJcbiAgICAgIHRoaXMucmVuZXdQb3NpdGlvbnMoKVxyXG4gICAgICB0aGlzLmVudGl0eS5wb2x5bGluZS5wb3NpdGlvbnMgPSBbXHJcbiAgICAgICAgLi4udGhpcy5wb3NpdGlvbnNILFxyXG4gICAgICAgIHRoaXMucG9zaXRpb25zSFswXSxcclxuICAgICAgICB0aGlzLnBvc2l0aW9uc0hbMV1cclxuICAgICAgXVxyXG4gICAgICB0aGlzLmVudGl0eS5wb2x5Z29uLmhpZXJhcmNoeSA9IG5ldyBDZXNpdW0uUG9seWdvbkhpZXJhcmNoeShcclxuICAgICAgICB0aGlzLnBvc2l0aW9uc0hcclxuICAgICAgKVxyXG4gICAgICBzd2l0Y2ggKHRoaXMub3B0aW9ucy5oZWlnaHRNb2RlKSB7XHJcbiAgICAgICAgY2FzZSAnMCc6XHJcbiAgICAgICAgY2FzZSAwOlxyXG4gICAgICAgICAgaGVpZ2h0TW9kZU5hbWUgPSAn5rW35ouU6auY5bqmJ1xyXG4gICAgICAgICAgYnJlYWtcclxuICAgICAgICBjYXNlICcxJzpcclxuICAgICAgICBjYXNlIDE6XHJcbiAgICAgICAgICBoZWlnaHRNb2RlTmFtZSA9ICfnm7jlr7nlnLDooagnXHJcbiAgICAgICAgICBicmVha1xyXG4gICAgICAgIGNhc2UgJzInOlxyXG4gICAgICAgIGNhc2UgMjpcclxuICAgICAgICAgIGdyb3VuZCA9IHRydWVcclxuICAgICAgICAgIGRpc2FibGVkID0gdHJ1ZVxyXG4gICAgICAgICAgaGVpZ2h0TW9kZU5hbWUgPSAn5L6d6ZmE5qih5Z6LJ1xyXG4gICAgICAgICAgYnJlYWtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5wcmV2aW91cyA9IG51bGxcclxuICAgICAgdGhpcy5sYWJlbC5ncm91bmQgPSBncm91bmRcclxuICAgICAgdGhpcy5lbnRpdHkucG9seWxpbmUuY2xhbXBUb0dyb3VuZCA9IGdyb3VuZFxyXG4gICAgICB0aGlzLmVudGl0eS5wb2x5bGluZS5hcmNUeXBlID0gIWdyb3VuZCA/IENlc2l1bS5BcmNUeXBlLk5PTkUgOiBDZXNpdW0uQXJjVHlwZS5HRU9ERVNJQyxcclxuICAgICAgICB0aGlzLmVudGl0eS5wb2x5Z29uLnBlclBvc2l0aW9uSGVpZ2h0ID0gIWdyb3VuZCA/IHRydWUgOiBmYWxzZVxyXG4gICAgICB0aGlzLl9lbG1zLmhlaWdodE1vZGUgJiYgKHRoaXMuX2VsbXMuaGVpZ2h0TW9kZS52YWx1ZSA9IGhlaWdodE1vZGVOYW1lKVxyXG4gICAgICB0aGlzLl9lbG1zLmhlaWdodE1vZGVPYmplY3QgJiYgKHRoaXMuX2VsbXMuaGVpZ2h0TW9kZU9iamVjdC5sZWdwX3NlYXJjaEFjdGl2ZShcclxuICAgICAgICBoZWlnaHRNb2RlTmFtZVxyXG4gICAgICApKVxyXG4gICAgICBpZiAoZGlzYWJsZWQpIHtcclxuICAgICAgICB0aGlzLl9lbG1zLmhlaWdodEJveCAmJiAodGhpcy5fZWxtcy5oZWlnaHRCb3guY2xhc3NOYW1lID0gJ2lucHV0LW51bWJlciBpbnB1dC1udW1iZXItdW5pdC0xIGhlaWdodC1ib3ggZGlzYWJsZWQnKTtcclxuICAgICAgICB0aGlzLl9lbG1zLmhlaWdodENvbmZpcm0gJiYgdGhpcy5fZWxtcy5oZWlnaHRDb25maXJtLnNldEF0dHJpYnV0ZSgnZGlzYWJsZWQnLCAnZGlzYWJsZWQnKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICB0aGlzLl9lbG1zLmhlaWdodEJveCAmJiAodGhpcy5fZWxtcy5oZWlnaHRCb3guY2xhc3NOYW1lID0gJ2lucHV0LW51bWJlciBpbnB1dC1udW1iZXItdW5pdC0xIGhlaWdodC1ib3gnKTtcclxuICAgICAgICB0aGlzLl9lbG1zLmhlaWdodENvbmZpcm0gJiYgdGhpcy5fZWxtcy5oZWlnaHRDb25maXJtLnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZWQnKTtcclxuICAgICAgfVxyXG4gICAgfSwgNTApO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGhlaWdodCgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuaGVpZ2h0XHJcbiAgfVxyXG5cclxuICBzZXQgaGVpZ2h0KHYpIHtcclxuICAgIGlmICghdiB8fCBpc05hTihOdW1iZXIodikpKSB7XHJcbiAgICAgIHRoaXMub3B0aW9ucy5oZWlnaHQgPSAwXHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5vcHRpb25zLmhlaWdodCA9IE51bWJlcihOdW1iZXIodikudG9GaXhlZCgyKSlcclxuICAgIH1cclxuICAgIGxldCBncm91bmRcclxuICAgIGlmICh0aGlzLmhlaWdodE1vZGUgPT0gMikge1xyXG4gICAgICBncm91bmQgPSB0cnVlXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBncm91bmQgPSBmYWxzZVxyXG4gICAgfVxyXG4gICAgdGhpcy5yZW5ld1Bvc2l0aW9ucygpXHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5lbnRpdHkucG9seWdvbi5oaWVyYXJjaHkgPSBuZXcgQ2VzaXVtLlBvbHlnb25IaWVyYXJjaHkodGhpcy5wb3NpdGlvbnNIKVxyXG4gICAgICB0aGlzLmVudGl0eS5wb2x5Z29uLnBlclBvc2l0aW9uSGVpZ2h0ID0gIWdyb3VuZCA/IHRydWUgOiBmYWxzZVxyXG4gICAgICB0aGlzLmVudGl0eS5wb2x5bGluZS5wb3NpdGlvbnMgPSBbXHJcbiAgICAgICAgLi4udGhpcy5wb3NpdGlvbnNILFxyXG4gICAgICAgIHRoaXMucG9zaXRpb25zSFswXSxcclxuICAgICAgICB0aGlzLnBvc2l0aW9uc0hbMV1cclxuICAgICAgXVxyXG4gICAgICB0aGlzLmVudGl0eS5wb2x5bGluZS5jbGFtcFRvR3JvdW5kID0gIWdyb3VuZCA/IGZhbHNlIDogdHJ1ZVxyXG4gICAgICB0aGlzLmVudGl0eS5wb2x5bGluZS5hcmNUeXBlID0gIWdyb3VuZCA/IENlc2l1bS5BcmNUeXBlLk5PTkUgOiBDZXNpdW0uQXJjVHlwZS5HRU9ERVNJQ1xyXG4gICAgfSwgMCk7XHJcblxyXG4gICAgdGhpcy5fZWxtcy5hbHQgJiZcclxuICAgICAgdGhpcy5fZWxtcy5hbHQuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICBpdGVtLmlubmVySFRNTCA9IHRoaXMub3B0aW9ucy5oZWlnaHRcclxuICAgICAgfSlcclxuICB9XHJcblxyXG4gIGdldCBsaW5lQ29sb3IoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmxpbmUuY29sb3JcclxuICB9XHJcbiAgc2V0IGxpbmVDb2xvcih2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMubGluZS5jb2xvciA9IHYgfHwgJ3JnYmEoMjU1LCAwLCAwLCAwLjUpJ1xyXG4gICAgaWYgKCF0aGlzLnNkayB8fCAhdGhpcy5zZGsudmlld2VyIHx8ICF0aGlzLmVudGl0eSB8fCAhdGhpcy5lbnRpdHkucG9seWxpbmUpIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcbiAgICB0aGlzLmVudGl0eS5wb2x5bGluZS5tYXRlcmlhbCA9IENlc2l1bS5Db2xvci5mcm9tQ3NzQ29sb3JTdHJpbmcodGhpcy5vcHRpb25zLmxpbmUuY29sb3IpXHJcbiAgICBpZiAodGhpcy5fZWxtcy5saW5lQ29sb3IpIHtcclxuICAgICAgdGhpcy5fZWxtcy5saW5lQ29sb3IuZm9yRWFjaCgoaXRlbSwgaSkgPT4ge1xyXG4gICAgICAgIGxldCBsaW5lQ29sb3JQaWNrZXIgPSBuZXcgWUpDb2xvclBpY2tlcih7XHJcbiAgICAgICAgICBlbDogaXRlbS5lbCxcclxuICAgICAgICAgIHNpemU6ICdtaW5pJywvL+minOiJsmJveOexu+Wei1xyXG4gICAgICAgICAgYWxwaGE6IHRydWUsLy/mmK/lkKblvIDlkK/pgI/mmI7luqZcclxuICAgICAgICAgIGRlZmF1bHRDb2xvcjogdGhpcy5vcHRpb25zLmxpbmUuY29sb3IsXHJcbiAgICAgICAgICBkaXNhYmxlZDogZmFsc2UsLy/mmK/lkKbnpoHmraLmiZPlvIDpopzoibLpgInmi6nlmahcclxuICAgICAgICAgIG9wZW5QaWNrZXJBbmk6ICdvcGFjaXR5JywvL+aJk+W8gOminOiJsumAieaLqeWZqOWKqOeUu1xyXG4gICAgICAgICAgc3VyZTogKGMpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5saW5lQ29sb3IgPSBjXHJcbiAgICAgICAgICB9LC8v54K55Ye756Gu6K6k5oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgICAgICBjbGVhcjogKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxpbmVDb2xvciA9ICdyZ2JhKDI1NSwwLDAsMC41KSdcclxuICAgICAgICAgIH0sLy/ngrnlh7vmuIXnqbrmjInpkq7kuovku7blm57osINcclxuICAgICAgICB9KVxyXG4gICAgICAgIHRoaXMuX2VsbXMubGluZUNvbG9yW2ldID0gbGluZUNvbG9yUGlja2VyXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgbGluZVdpZHRoKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5saW5lLndpZHRoXHJcbiAgfVxyXG4gIHNldCBsaW5lV2lkdGgodikge1xyXG4gICAgdGhpcy5vcHRpb25zLmxpbmUud2lkdGggPSAoKHYgfHwgdiA9PT0gMCkgPyB2IDogMylcclxuICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLndpZHRoID0gdGhpcy5vcHRpb25zLmxpbmUud2lkdGhcclxuICAgIHRoaXMuX2VsbXMubGluZUNvbG9yICYmIHRoaXMuX2VsbXMubGluZUNvbG9yLmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgaXRlbS52YWx1ZSA9IHZcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBnZXQgbGFiZWxTaG93KCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5sYWJlbC5zaG93XHJcbiAgfVxyXG4gIHNldCBsYWJlbFNob3codikge1xyXG4gICAgdGhpcy5vcHRpb25zLmxhYmVsLnNob3cgPSB2XHJcbiAgICBpZiAodGhpcy5zaG93ICYmICF0aGlzLnNob3dWaWV3IHx8IHRoaXMuc2hvd1ZpZXcgPT0gMykge1xyXG4gICAgICB0aGlzLmxhYmVsLnNob3cgPSB2XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5sYWJlbC5zaG93ID0gZmFsc2VcclxuICAgIH1cclxuICAgIHRoaXMuX2VsbXMubGFiZWxTaG93ICYmIHRoaXMuX2VsbXMubGFiZWxTaG93LmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgaXRlbS5jaGVja2VkID0gdlxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGdldCBsYWJlbEZvbnRGYW1pbHkoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmxhYmVsLmZvbnRGYW1pbHlcclxuICB9XHJcblxyXG4gIHNldCBsYWJlbEZvbnRGYW1pbHkodikge1xyXG4gICAgdGhpcy5vcHRpb25zLmxhYmVsLmZvbnRGYW1pbHkgPSB2IHx8IDBcclxuICAgIHRoaXMubGFiZWwgJiYgKHRoaXMubGFiZWwuZm9udEZhbWlseSA9IHRoaXMub3B0aW9ucy5sYWJlbC5mb250RmFtaWx5KVxyXG5cclxuICAgIGxldCBuYW1lID0gZ2V0Rm9udEZhbWlseU5hbWUodGhpcy5sYWJlbEZvbnRGYW1pbHkpIHx8ICcnXHJcbiAgICB0aGlzLl9lbG1zLmxhYmVsRm9udEZhbWlseSAmJlxyXG4gICAgICB0aGlzLl9lbG1zLmxhYmVsRm9udEZhbWlseS5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgIGl0ZW0udmFsdWUgPSBuYW1lXHJcbiAgICAgIH0pXHJcbiAgfVxyXG5cclxuICBnZXQgbGFiZWxDb2xvcigpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubGFiZWwuY29sb3JcclxuICB9XHJcbiAgc2V0IGxhYmVsQ29sb3Iodikge1xyXG4gICAgdGhpcy5vcHRpb25zLmxhYmVsLmNvbG9yID0gdlxyXG4gICAgdGhpcy5sYWJlbC5jb2xvciA9IHZcclxuICAgIGlmICh0aGlzLl9lbG1zLmxhYmVsQ29sb3IpIHtcclxuICAgICAgdGhpcy5fZWxtcy5sYWJlbENvbG9yLmZvckVhY2goKGl0ZW0sIGkpID0+IHtcclxuICAgICAgICBsZXQgbGFiZWxDb2xvclBpY2tlciA9IG5ldyBZSkNvbG9yUGlja2VyKHtcclxuICAgICAgICAgIGVsOiBpdGVtLmVsLFxyXG4gICAgICAgICAgc2l6ZTogJ21pbmknLC8v6aKc6ImyYm9457G75Z6LXHJcbiAgICAgICAgICBhbHBoYTogdHJ1ZSwvL+aYr+WQpuW8gOWQr+mAj+aYjuW6plxyXG4gICAgICAgICAgZGVmYXVsdENvbG9yOiB0aGlzLmxhYmVsQ29sb3IsXHJcbiAgICAgICAgICBkaXNhYmxlZDogZmFsc2UsLy/mmK/lkKbnpoHmraLmiZPlvIDpopzoibLpgInmi6nlmahcclxuICAgICAgICAgIG9wZW5QaWNrZXJBbmk6ICdvcGFjaXR5JywvL+aJk+W8gOminOiJsumAieaLqeWZqOWKqOeUu1xyXG4gICAgICAgICAgc3VyZTogKGNvbG9yKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubGFiZWxDb2xvciA9IGNvbG9yXHJcbiAgICAgICAgICB9LC8v54K55Ye756Gu6K6k5oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgICAgICBjbGVhcjogKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxhYmVsQ29sb3IgPSAncmdiYSgyNTUsMjU1LDI1NSwxKSdcclxuICAgICAgICAgIH0sLy/ngrnlh7vmuIXnqbrmjInpkq7kuovku7blm57osINcclxuICAgICAgICB9KVxyXG4gICAgICAgIHRoaXMuX2VsbXMubGFiZWxDb2xvcltpXSA9IGxhYmVsQ29sb3JQaWNrZXJcclxuICAgICAgfSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCBsYWJlbEZvbnRTaXplKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5sYWJlbC5mb250U2l6ZVxyXG4gIH1cclxuICBzZXQgbGFiZWxGb250U2l6ZSh2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMubGFiZWwuZm9udFNpemUgPSB2XHJcbiAgICB0aGlzLmxhYmVsLmZvbnRTaXplID0gdlxyXG4gICAgdGhpcy5fZWxtcy5sYWJlbEZvbnRTaXplICYmIHRoaXMuX2VsbXMubGFiZWxGb250U2l6ZS5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgIGl0ZW0udmFsdWUgPSB2XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgZ2V0IGxhYmVsU2NhbGVCeURpc3RhbmNlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5sYWJlbC5zY2FsZUJ5RGlzdGFuY2VcclxuICB9XHJcbiAgc2V0IGxhYmVsU2NhbGVCeURpc3RhbmNlKHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5sYWJlbC5zY2FsZUJ5RGlzdGFuY2UgPSB2XHJcbiAgICB0aGlzLmxhYmVsLnNjYWxlQnlEaXN0YW5jZSA9IHZcclxuICAgIHRoaXMuX2VsbXMubGFiZWxTY2FsZUJ5RGlzdGFuY2UgJiYgdGhpcy5fZWxtcy5sYWJlbFNjYWxlQnlEaXN0YW5jZS5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgIGl0ZW0uY2hlY2tlZCA9IHZcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBnZXQgbGFiZWxOZWFyKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5sYWJlbC5uZWFyXHJcbiAgfVxyXG4gIHNldCBsYWJlbE5lYXIodikge1xyXG4gICAgbGV0IG5lYXIgPSB2XHJcbiAgICBpZiAobmVhciA+IHRoaXMubGFiZWxGYXIpIHtcclxuICAgICAgbmVhciA9IHRoaXMubGFiZWxGYXJcclxuICAgIH1cclxuICAgIHRoaXMub3B0aW9ucy5sYWJlbC5uZWFyID0gbmVhclxyXG4gICAgdGhpcy5sYWJlbC5uZWFyID0gbmVhclxyXG4gICAgdGhpcy5fZWxtcy5sYWJlbE5lYXIgJiYgdGhpcy5fZWxtcy5sYWJlbE5lYXIuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICBpdGVtLnZhbHVlID0gbmVhclxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGdldCBsYWJlbEZhcigpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubGFiZWwuZmFyXHJcbiAgfVxyXG4gIHNldCBsYWJlbEZhcih2KSB7XHJcbiAgICBsZXQgZmFyID0gdlxyXG4gICAgaWYgKGZhciA8IHRoaXMubGFiZWxOZWFyKSB7XHJcbiAgICAgIGZhciA9IHRoaXMubGFiZWxOZWFyXHJcbiAgICB9XHJcbiAgICB0aGlzLm9wdGlvbnMubGFiZWwuZmFyID0gZmFyXHJcbiAgICB0aGlzLmxhYmVsLmZhciA9IGZhclxyXG4gICAgdGhpcy5fZWxtcy5sYWJlbEZhciAmJiB0aGlzLl9lbG1zLmxhYmVsRmFyLmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgaXRlbS52YWx1ZSA9IGZhclxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGdldCBsYWJlbExpbmVXaWR0aCgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubGFiZWwubGluZVdpZHRoXHJcbiAgfVxyXG4gIHNldCBsYWJlbExpbmVXaWR0aCh2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMubGFiZWwubGluZVdpZHRoID0gdlxyXG4gICAgdGhpcy5sYWJlbC5saW5lV2lkdGggPSB2XHJcbiAgICB0aGlzLl9lbG1zLmxhYmVsTGluZVdpZHRoICYmIHRoaXMuX2VsbXMubGFiZWxMaW5lV2lkdGguZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICBpdGVtLnZhbHVlID0gdlxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGdldCBsYWJlbFBpeGVsT2Zmc2V0KCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5sYWJlbC5waXhlbE9mZnNldFxyXG4gIH1cclxuICBzZXQgbGFiZWxQaXhlbE9mZnNldCh2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMubGFiZWwucGl4ZWxPZmZzZXQgPSB2XHJcbiAgICB0aGlzLmxhYmVsLnBpeGVsT2Zmc2V0ID0gdlxyXG4gICAgdGhpcy5fZWxtcy5sYWJlbFBpeGVsT2Zmc2V0ICYmIHRoaXMuX2VsbXMubGFiZWxQaXhlbE9mZnNldC5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgIGl0ZW0udmFsdWUgPSB2XHJcbiAgICB9KVxyXG4gIH1cclxuICBnZXQgbGFiZWxMaW5lQ29sb3IoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmxhYmVsLmxpbmVDb2xvclxyXG4gIH1cclxuICBzZXQgbGFiZWxMaW5lQ29sb3Iodikge1xyXG4gICAgdGhpcy5vcHRpb25zLmxhYmVsLmxpbmVDb2xvciA9IHZcclxuICAgIHRoaXMubGFiZWwubGluZUNvbG9yID0gdlxyXG4gICAgaWYgKHRoaXMuX2VsbXMubGFiZWxMaW5lQ29sb3IpIHtcclxuICAgICAgdGhpcy5fZWxtcy5sYWJlbExpbmVDb2xvci5mb3JFYWNoKChpdGVtLCBpKSA9PiB7XHJcbiAgICAgICAgbGV0IGxpbmVDb2xvclBpY2tlciA9IG5ldyBZSkNvbG9yUGlja2VyKHtcclxuICAgICAgICAgIGVsOiBpdGVtLmVsLFxyXG4gICAgICAgICAgc2l6ZTogJ21pbmknLC8v6aKc6ImyYm9457G75Z6LXHJcbiAgICAgICAgICBhbHBoYTogdHJ1ZSwvL+aYr+WQpuW8gOWQr+mAj+aYjuW6plxyXG4gICAgICAgICAgZGVmYXVsdENvbG9yOiB0aGlzLmxhYmVsTGluZUNvbG9yLFxyXG4gICAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLC8v5piv5ZCm56aB5q2i5omT5byA6aKc6Imy6YCJ5oup5ZmoXHJcbiAgICAgICAgICBvcGVuUGlja2VyQW5pOiAnb3BhY2l0eScsLy/miZPlvIDpopzoibLpgInmi6nlmajliqjnlLtcclxuICAgICAgICAgIHN1cmU6IChjb2xvcikgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxhYmVsTGluZUNvbG9yID0gY29sb3JcclxuICAgICAgICAgIH0sLy/ngrnlh7vnoa7orqTmjInpkq7kuovku7blm57osINcclxuICAgICAgICAgIGNsZWFyOiAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubGFiZWxMaW5lQ29sb3IgPSAncmdiYSgwLDI1NSwyNTUsMC41KSdcclxuICAgICAgICAgIH0sLy/ngrnlh7vmuIXnqbrmjInpkq7kuovku7blm57osINcclxuICAgICAgICB9KVxyXG4gICAgICAgIHRoaXMuX2VsbXMubGFiZWxMaW5lQ29sb3JbaV0gPSBsaW5lQ29sb3JQaWNrZXJcclxuICAgICAgfSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCBsYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0KCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5sYWJlbC5iYWNrZ3JvdW5kQ29sb3JbMF1cclxuICB9XHJcbiAgc2V0IGxhYmVsQmFja2dyb3VuZENvbG9yU3RhcnQodikge1xyXG4gICAgdGhpcy5vcHRpb25zLmxhYmVsLmJhY2tncm91bmRDb2xvclswXSA9IHZcclxuICAgIHRoaXMubGFiZWwuYmFja2dyb3VuZENvbG9yID0gW3YsIHRoaXMubGFiZWwuYmFja2dyb3VuZENvbG9yWzFdXVxyXG4gICAgaWYgKHRoaXMuX2VsbXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JTdGFydCkge1xyXG4gICAgICB0aGlzLl9lbG1zLmxhYmVsQmFja2dyb3VuZENvbG9yU3RhcnQuZm9yRWFjaCgoaXRlbSwgaSkgPT4ge1xyXG4gICAgICAgIGxldCBsYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0UGlja2VyID0gbmV3IFlKQ29sb3JQaWNrZXIoe1xyXG4gICAgICAgICAgZWw6IGl0ZW0uZWwsXHJcbiAgICAgICAgICBzaXplOiAnbWluaScsLy/popzoibJib3jnsbvlnotcclxuICAgICAgICAgIGFscGhhOiB0cnVlLC8v5piv5ZCm5byA5ZCv6YCP5piO5bqmXHJcbiAgICAgICAgICBkZWZhdWx0Q29sb3I6IHRoaXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JTdGFydCxcclxuICAgICAgICAgIGRpc2FibGVkOiBmYWxzZSwvL+aYr+WQpuemgeatouaJk+W8gOminOiJsumAieaLqeWZqFxyXG4gICAgICAgICAgb3BlblBpY2tlckFuaTogJ29wYWNpdHknLC8v5omT5byA6aKc6Imy6YCJ5oup5Zmo5Yqo55S7XHJcbiAgICAgICAgICBzdXJlOiAoY29sb3IpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5sYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0ID0gY29sb3JcclxuICAgICAgICAgIH0sLy/ngrnlh7vnoa7orqTmjInpkq7kuovku7blm57osINcclxuICAgICAgICAgIGNsZWFyOiAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JTdGFydCA9ICdyZ2JhKDI1NSwyNTUsMjU1LDEpJ1xyXG4gICAgICAgICAgfSwvL+eCueWHu+a4heepuuaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgdGhpcy5fZWxtcy5sYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0W2ldID0gbGFiZWxCYWNrZ3JvdW5kQ29sb3JTdGFydFBpY2tlclxyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gIH1cclxuICBnZXQgbGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmxhYmVsLmJhY2tncm91bmRDb2xvclsxXVxyXG4gIH1cclxuICBzZXQgbGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmQodikge1xyXG4gICAgdGhpcy5vcHRpb25zLmxhYmVsLmJhY2tncm91bmRDb2xvclsxXSA9IHZcclxuICAgIHRoaXMubGFiZWwuYmFja2dyb3VuZENvbG9yID0gW3RoaXMubGFiZWwuYmFja2dyb3VuZENvbG9yWzBdLCB2XVxyXG4gICAgaWYgKHRoaXMuX2VsbXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmQpIHtcclxuICAgICAgdGhpcy5fZWxtcy5sYWJlbEJhY2tncm91bmRDb2xvckVuZC5mb3JFYWNoKChpdGVtLCBpKSA9PiB7XHJcbiAgICAgICAgbGV0IGxhYmVsQmFja2dyb3VuZENvbG9yRW5kUGlja2VyID0gbmV3IFlKQ29sb3JQaWNrZXIoe1xyXG4gICAgICAgICAgZWw6IGl0ZW0uZWwsXHJcbiAgICAgICAgICBzaXplOiAnbWluaScsLy/popzoibJib3jnsbvlnotcclxuICAgICAgICAgIGFscGhhOiB0cnVlLC8v5piv5ZCm5byA5ZCv6YCP5piO5bqmXHJcbiAgICAgICAgICBkZWZhdWx0Q29sb3I6IHRoaXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmQsXHJcbiAgICAgICAgICBkaXNhYmxlZDogZmFsc2UsLy/mmK/lkKbnpoHmraLmiZPlvIDpopzoibLpgInmi6nlmahcclxuICAgICAgICAgIG9wZW5QaWNrZXJBbmk6ICdvcGFjaXR5JywvL+aJk+W8gOminOiJsumAieaLqeWZqOWKqOeUu1xyXG4gICAgICAgICAgc3VyZTogKGNvbG9yKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmQgPSBjb2xvclxyXG4gICAgICAgICAgfSwvL+eCueWHu+ehruiupOaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICAgICAgY2xlYXI6ICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5sYWJlbEJhY2tncm91bmRDb2xvckVuZCA9ICdyZ2JhKDI1NSwyNTUsMjU1LDEpJ1xyXG4gICAgICAgICAgfSwvL+eCueWHu+a4heepuuaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgdGhpcy5fZWxtcy5sYWJlbEJhY2tncm91bmRDb2xvckVuZFtpXSA9IGxhYmVsQmFja2dyb3VuZENvbG9yRW5kUGlja2VyXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgY3JlYXRlKHRoYXQpIHtcclxuICAgIGxldCBwb3NpdGlvbnMgPSB0aGF0Lm9wdGlvbnMucG9zaXRpb25zXHJcbiAgICBsZXQgZnJvbURlZ3JlZXNBcnJheSA9IFtdXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBmcm9tRGVncmVlc0FycmF5LnB1c2gocG9zaXRpb25zW2ldLmxuZywgcG9zaXRpb25zW2ldLmxhdClcclxuICAgIH1cclxuICAgIHRoYXQucG9zaXRpb25zID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXNBcnJheShmcm9tRGVncmVlc0FycmF5KVxyXG4gICAgbGV0IHBvc2l0aW9uc0EgPSB0aGF0LmNvbXB1dGVBdHRhY2tBcnJvdyh0aGF0Lm9wdGlvbnMucG9zaXRpb25zKVxyXG4gICAgaWYgKHBvc2l0aW9uc0EubGVuZ3RoID09IDApIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHBvaW50cyA9IFtbXV1cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9zaXRpb25zQS5sZW5ndGg7IGkrKykge1xyXG4gICAgICBsZXQgcG9zaXRpb24gPSB0aGF0LmNhcnRlc2lhbjNUb3dnczg0KHBvc2l0aW9uc0FbaV0sIHRoYXQuc2RrLnZpZXdlcilcclxuICAgICAgcG9pbnRzWzBdLnB1c2goW3Bvc2l0aW9uLmxuZywgcG9zaXRpb24ubGF0XSlcclxuICAgIH1cclxuICAgIGxldCBwb3NpdGlvbiA9IHRoYXQuY2FydGVzaWFuM1Rvd2dzODQocG9zaXRpb25zQVswXSwgdGhhdC5zZGsudmlld2VyKVxyXG4gICAgcG9pbnRzWzBdLnB1c2goW3Bvc2l0aW9uLmxuZywgcG9zaXRpb24ubGF0XSlcclxuICAgIGxldCBwb2x5Z29uID0gdHVyZi5wb2x5Z29uKHBvaW50cyk7XHJcbiAgICAvLyBsZXQgY2VudHJvaWQgPSB0dXJmLmNlbnRyb2lkKHBvbHlnb24pO1xyXG4gICAgbGV0IGNlbnRyb2lkID0gdHVyZi5wb2ludE9uRmVhdHVyZShwb2x5Z29uKTtcclxuXHJcblxyXG4gICAgbGV0IGdyb3VuZFxyXG4gICAgbGV0IGhlaWdodCA9IDBcclxuXHJcbiAgICBzd2l0Y2ggKHRoYXQub3B0aW9ucy5oZWlnaHRNb2RlKSB7XHJcbiAgICAgIGNhc2UgJzAnOlxyXG4gICAgICBjYXNlIDA6XHJcbiAgICAgICAgZ3JvdW5kID0gZmFsc2VcclxuICAgICAgICBicmVha1xyXG4gICAgICBjYXNlICcxJzpcclxuICAgICAgY2FzZSAxOlxyXG4gICAgICAgIGhlaWdodCA9IHRoYXQuc2RrLnZpZXdlci5zY2VuZS5nbG9iZS5nZXRIZWlnaHQoQ2VzaXVtLkNhcnRvZ3JhcGhpYy5mcm9tRGVncmVlcyhjZW50cm9pZC5nZW9tZXRyeS5jb29yZGluYXRlc1swXSwgY2VudHJvaWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMV0pKSB8fCAwXHJcbiAgICAgICAgZ3JvdW5kID0gZmFsc2VcclxuICAgICAgICBicmVha1xyXG4gICAgICBjYXNlICcyJzpcclxuICAgICAgY2FzZSAyOlxyXG4gICAgICAgIGdyb3VuZCA9IHRydWVcclxuICAgICAgICBicmVha1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGlmICghdGhhdC5vcHRpb25zLmxhYmVsLnBvc2l0aW9uKSB7XHJcbiAgICAvLyAgIHRoYXQub3B0aW9ucy5sYWJlbC5wb3NpdGlvbiA9IHsgbG5nOiBjZW50cm9pZC5nZW9tZXRyeS5jb29yZGluYXRlc1swXSwgbGF0OiBjZW50cm9pZC5nZW9tZXRyeS5jb29yZGluYXRlc1sxXSwgYWx0OiB0aGF0LmhlaWdodCArIGhlaWdodCB9XHJcbiAgICAvLyB9XHJcbiAgICB0aGF0Lm9wdGlvbnMubGFiZWwucG9zaXRpb24gPSB7IGxuZzogY2VudHJvaWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMF0sIGxhdDogY2VudHJvaWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMV0sIGFsdDogdGhhdC5oZWlnaHQgKyBoZWlnaHQgfVxyXG4gICAgLy8gdGhhdC5vcHRpb25zLmxhYmVsLmdyb3VuZCA9IGdyb3VuZFxyXG5cclxuICAgIGxldCBmcm9tRGVncmVlc0FycmF5MiA9IFtdXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvaW50c1swXS5sZW5ndGg7IGkrKykge1xyXG4gICAgICBmcm9tRGVncmVlc0FycmF5Mi5wdXNoKFxyXG4gICAgICAgIHBvaW50c1swXVtpXVswXSxcclxuICAgICAgICBwb2ludHNbMF1baV1bMV0sXHJcbiAgICAgICAgdGhhdC5oZWlnaHQgKyBoZWlnaHRcclxuICAgICAgKVxyXG4gICAgfVxyXG5cclxuICAgIGxldCBtYXRlcmlhbCA9IENlc2l1bS5Db2xvci5mcm9tQ3NzQ29sb3JTdHJpbmcodGhhdC5vcHRpb25zLmNvbG9yKVxyXG4gICAgaWYgKHRoYXQuc2RrLnZpZXdlci5zY2VuZS5tb2RlID09PSAyKSB7XHJcbiAgICAgIGdyb3VuZCA9IGZhbHNlXHJcbiAgICAgIG1hdGVyaWFsID0gbmV3IENlc2l1bS5DdXN0b21Db2xvck1hdGVyaWFsU291cmNlKHtcclxuICAgICAgICBjb2xvcjogdGhhdC5vcHRpb25zLmNvbG9yXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgdGhhdC5wb3NpdGlvbnNIID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXNBcnJheUhlaWdodHMoZnJvbURlZ3JlZXNBcnJheTIpXHJcblxyXG4gICAgdGhhdC5lbnRpdHkgPSB0aGF0LnNkay52aWV3ZXIuZW50aXRpZXMuYWRkKHtcclxuICAgICAgc2hvdzogdGhhdC5vcHRpb25zLnNob3csXHJcbiAgICAgIGlkOiB0aGF0Lm9wdGlvbnMuaWQsXHJcbiAgICAgIHBvbHlnb246IHtcclxuICAgICAgICBoaWVyYXJjaHk6ICFncm91bmQgPyBuZXcgQ2VzaXVtLlBvbHlnb25IaWVyYXJjaHkodGhhdC5wb3NpdGlvbnNIKSA6IG5ldyBDZXNpdW0uUG9seWdvbkhpZXJhcmNoeShwb3NpdGlvbnNBKSxcclxuICAgICAgICBwZXJQb3NpdGlvbkhlaWdodDogIWdyb3VuZCA/IHRydWUgOiBmYWxzZSxcclxuICAgICAgICBtYXRlcmlhbDogbWF0ZXJpYWwsXHJcbiAgICAgICAgekluZGV4OiB0aGF0LnNkay5fZW50aXR5WkluZGV4XHJcbiAgICAgIH0sXHJcbiAgICAgIHBvbHlsaW5lOiB7XHJcbiAgICAgICAgcG9zaXRpb25zOiBbLi4udGhhdC5wb3NpdGlvbnNILCB0aGF0LnBvc2l0aW9uc0hbMF0sIHRoYXQucG9zaXRpb25zSFsxXV0sXHJcbiAgICAgICAgd2lkdGg6IHRoYXQub3B0aW9ucy5saW5lLndpZHRoLFxyXG4gICAgICAgIG1hdGVyaWFsOiBDZXNpdW0uQ29sb3IuZnJvbUNzc0NvbG9yU3RyaW5nKHRoYXQub3B0aW9ucy5saW5lLmNvbG9yKSxcclxuICAgICAgICBjbGFtcFRvR3JvdW5kOiAhZ3JvdW5kID8gZmFsc2UgOiB0cnVlLFxyXG4gICAgICAgIGFyY1R5cGU6ICFncm91bmQgPyBDZXNpdW0uQXJjVHlwZS5OT05FIDogQ2VzaXVtLkFyY1R5cGUuR0VPREVTSUMsXHJcbiAgICAgICAgekluZGV4OiB0aGF0LnNkay5fZW50aXR5WkluZGV4XHJcbiAgICAgIH0sXHJcbiAgICB9KVxyXG4gICAgdGhhdC5zZGsuX2VudGl0eVpJbmRleCsrXHJcbiAgICBBdHRhY2tBcnJvd09iamVjdC5jcmVhdGVMYWJlbCh0aGF0KVxyXG5cclxuICAgIGxldCBwb3M4NCA9IFtdXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvc2l0aW9uc0EubGVuZ3RoOyBpKyspIHtcclxuICAgICAgcG9zODQucHVzaCh0aGF0LmNhcnRlc2lhbjNUb3dnczg0KHBvc2l0aW9uc0FbaV0sIHRoYXQuc2RrLnZpZXdlcikpXHJcbiAgICB9XHJcbiAgICB0aGF0LmFyZWFCeU1ldGVyID0gdGhhdC5jb21wdXRlQXJlYShwb3M4NCk7XHJcbiAgICB0aGF0LmFyZWFDaGFuZ2VDYWxsQmFjayAmJiB0aGF0LmFyZWFDaGFuZ2VDYWxsQmFjaygpXHJcbiAgICBzeW5jRGF0YSh0aGF0LnNkaywgdGhhdC5vcHRpb25zLmlkKVxyXG4gICAgaWYgKHRoYXQub3B0aW9ucy5zaG93KSB7XHJcblxyXG4gICAgICBzZXRTcGxpdERpcmVjdGlvbigwLCB0aGF0Lm9wdGlvbnMuaWQpXHJcbiAgICB9XHJcblxyXG4gICAgdGhhdC5zcHJlYWRTdGF0ZSA9IHRoYXQub3B0aW9ucy5zcHJlYWRTdGF0ZVxyXG4gIH1cclxuXHJcbiAgc3RhdGljIGFzeW5jIGNyZWF0ZUxhYmVsKHRoYXQpIHtcclxuICAgIC8vIOagh+etvlxyXG4gICAgdGhhdC5sYWJlbCA9IG5ldyBMYWJlbE9iamVjdCh0aGF0LnNkaywge1xyXG4gICAgICBpZDogdGhhdC5vcHRpb25zLmlkLFxyXG4gICAgICBzaG93OiB0aGF0Lm9wdGlvbnMuc2hvdyA/IHRoYXQub3B0aW9ucy5sYWJlbC5zaG93IDogZmFsc2UsXHJcbiAgICAgIHBvc2l0aW9uOiBbdGhhdC5vcHRpb25zLmxhYmVsLnBvc2l0aW9uLmxuZywgdGhhdC5vcHRpb25zLmxhYmVsLnBvc2l0aW9uLmxhdCwgdGhhdC5vcHRpb25zLmxhYmVsLnBvc2l0aW9uLmFsdF0sXHJcbiAgICAgIHRleHQ6IHRoYXQub3B0aW9ucy5uYW1lLFxyXG4gICAgICBmb250U2l6ZTogdGhhdC5vcHRpb25zLmxhYmVsLmZvbnRTaXplLFxyXG4gICAgICBmb250RmFtaWx5OiB0aGF0Lm9wdGlvbnMubGFiZWwuZm9udEZhbWlseSxcclxuICAgICAgY29sb3I6IHRoYXQub3B0aW9ucy5sYWJlbC5jb2xvcixcclxuICAgICAgcGl4ZWxPZmZzZXQ6IHRoYXQub3B0aW9ucy5sYWJlbC5waXhlbE9mZnNldCxcclxuICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGF0Lm9wdGlvbnMubGFiZWwuYmFja2dyb3VuZENvbG9yLFxyXG4gICAgICBsaW5lQ29sb3I6IHRoYXQub3B0aW9ucy5sYWJlbC5saW5lQ29sb3IsXHJcbiAgICAgIGxpbmVXaWR0aDogdGhhdC5vcHRpb25zLmxhYmVsLmxpbmVXaWR0aCxcclxuICAgICAgc2NhbGVCeURpc3RhbmNlOiB0aGF0Lm9wdGlvbnMubGFiZWwuc2NhbGVCeURpc3RhbmNlLFxyXG4gICAgICBuZWFyOiB0aGF0Lm9wdGlvbnMubGFiZWwubmVhcixcclxuICAgICAgZmFyOiB0aGF0Lm9wdGlvbnMubGFiZWwuZmFyLFxyXG4gICAgICAvLyBncm91bmQ6IHRoYXQub3B0aW9ucy5sYWJlbC5ncm91bmQsXHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgLy8g57yW6L6R5qGGXHJcbiAgYXN5bmMgZWRpdChzdGF0ZSkge1xyXG4gICAgcmV0dXJuXHJcbiAgICBpZiAodGhpcy5fZXJyb3IpIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzXHJcbiAgICB0aGlzLm9yaWdpbmFsT3B0aW9ucyA9IHRoaXMuZGVlcENvcHlPYmoodGhpcy5vcHRpb25zKVxyXG5cclxuICAgIGlmICh0aGlzLl9EaWFsb2dPYmplY3QgJiYgdGhpcy5fRGlhbG9nT2JqZWN0LmNsb3NlKSB7XHJcbiAgICAgIHRoaXMuX0RpYWxvZ09iamVjdC5jbG9zZSgpXHJcbiAgICB9XHJcbiAgICBpZiAoc3RhdGUpIHtcclxuICAgICAgZnVuY3Rpb24gY3JlYXRlU3BhdGlhbEluZm9UYWJsZUNvbnRlbnQoKSB7XHJcbiAgICAgICAgbGV0IHRhYmxlRWxtID0gY29udGVudEVsbS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdzcGF0aWFsLWluZm8tdGFibGUnKVswXVxyXG4gICAgICAgIGxldCB0Qm9keUVsbSA9IHRhYmxlRWxtLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RhYmxlLWJvZHknKVswXVxyXG4gICAgICAgIHRCb2R5RWxtLmlubmVySFRNTCA9ICcnXHJcbiAgICAgICAgX3RoaXMuX2VsbXMubG5nID0gW11cclxuICAgICAgICBfdGhpcy5fZWxtcy5sbmdJbnB1dCA9IFtdXHJcbiAgICAgICAgX3RoaXMuX2VsbXMubGF0ID0gW11cclxuICAgICAgICBfdGhpcy5fZWxtcy5sYXRJbnB1dCA9IFtdXHJcbiAgICAgICAgX3RoaXMuX2VsbXMuYWx0ID0gW11cclxuICAgICAgICBfdGhpcy5fZWxtcy5hbHRJbnB1dCA9IFtdXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBfdGhpcy5vcHRpb25zLnBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgbGV0IHRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcclxuICAgICAgICAgIHRyLmNsYXNzTmFtZSA9ICd0cidcclxuICAgICAgICAgIHRyLmlubmVySFRNTCA9IGBcclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZFwiPiR7aSArIDF9PC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidGQgbG5nIGFsaWduLWNlbnRlclwiPjwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRkIGxhdCBhbGlnbi1jZW50ZXJcIj48L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZCBhbHQgYWxpZ24tY2VudGVyXCI+PC9kaXY+XHJcbiAgICAgICAgYFxyXG4gICAgICAgICAgbGV0IGxuZ0JveCA9IHRyLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xuZycpWzBdXHJcbiAgICAgICAgICBsZXQgbG5nID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpXHJcbiAgICAgICAgICBsbmcuaW5uZXJIVE1MID0gKF90aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxuZykudG9GaXhlZCg4KVxyXG4gICAgICAgICAgbG5nQm94LmFwcGVuZENoaWxkKGxuZylcclxuICAgICAgICAgIGxldCBsbmdJbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0JylcclxuICAgICAgICAgIGxuZ0lucHV0LmNsYXNzTmFtZSA9ICdpbnB1dCdcclxuICAgICAgICAgIGxuZ0lucHV0LnR5cGUgPSAnbnVtYmVyJ1xyXG4gICAgICAgICAgbG5nSW5wdXQudGl0bGUgPSAnJ1xyXG4gICAgICAgICAgbG5nSW5wdXQubWluID0gLTE4MFxyXG4gICAgICAgICAgbG5nSW5wdXQubWF4ID0gMTgwXHJcbiAgICAgICAgICBsbmdJbnB1dC52YWx1ZSA9IChfdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sbmcpLnRvRml4ZWQoOClcclxuXHJcbiAgICAgICAgICBsZXQgbGF0Qm94ID0gdHIuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbGF0JylbMF1cclxuICAgICAgICAgIGxldCBsYXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJylcclxuICAgICAgICAgIGxhdC5pbm5lckhUTUwgPSAoX3RoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubGF0KS50b0ZpeGVkKDgpXHJcbiAgICAgICAgICBsYXRCb3guYXBwZW5kQ2hpbGQobGF0KVxyXG4gICAgICAgICAgbGV0IGxhdElucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKVxyXG4gICAgICAgICAgbGF0SW5wdXQuY2xhc3NOYW1lID0gJ2lucHV0J1xyXG4gICAgICAgICAgbGF0SW5wdXQudHlwZSA9ICdudW1iZXInXHJcbiAgICAgICAgICBsYXRJbnB1dC50aXRsZSA9ICcnXHJcbiAgICAgICAgICBsYXRJbnB1dC5taW4gPSAtOTBcclxuICAgICAgICAgIGxhdElucHV0Lm1heCA9IDkwXHJcbiAgICAgICAgICBsYXRJbnB1dC52YWx1ZSA9IChfdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sYXQpLnRvRml4ZWQoOClcclxuXHJcbiAgICAgICAgICBsZXQgYWx0Qm94ID0gdHIuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnYWx0JylbMF1cclxuICAgICAgICAgIGxldCBhbHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJylcclxuICAgICAgICAgIGFsdC5pbm5lckhUTUwgPSAoX3RoaXMuaGVpZ2h0KS50b0ZpeGVkKDIpXHJcbiAgICAgICAgICBhbHRCb3guYXBwZW5kQ2hpbGQoYWx0KVxyXG4gICAgICAgICAgbGV0IGFsdElucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKVxyXG4gICAgICAgICAgYWx0SW5wdXQuY2xhc3NOYW1lID0gJ2lucHV0J1xyXG4gICAgICAgICAgYWx0SW5wdXQudHlwZSA9ICdudW1iZXInXHJcbiAgICAgICAgICBhbHRJbnB1dC50aXRsZSA9ICcnXHJcbiAgICAgICAgICBhbHRJbnB1dC5taW4gPSAtOTk5OTk5OVxyXG4gICAgICAgICAgYWx0SW5wdXQubWF4ID0gOTk5OTk5OTk5XHJcbiAgICAgICAgICBhbHRJbnB1dC52YWx1ZSA9IChfdGhpcy5oZWlnaHQpLnRvRml4ZWQoMilcclxuXHJcbiAgICAgICAgICBsbmdCb3guYWRkRXZlbnRMaXN0ZW5lcignZGJsY2xpY2snLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGxuZ0JveC5pbm5lckhUTUwgPSAnJ1xyXG4gICAgICAgICAgICBsbmdJbnB1dC52YWx1ZSA9IE51bWJlcigoX3RoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubG5nKS50b0ZpeGVkKDgpKVxyXG4gICAgICAgICAgICBsbmdCb3guYXBwZW5kQ2hpbGQobG5nSW5wdXQpXHJcbiAgICAgICAgICAgIGxuZ0lucHV0LmZvY3VzKClcclxuICAgICAgICAgICAgaWYgKF90aGlzLm9wZXJhdGUucG9zaXRpb25FZGl0aW5nKSB7XHJcbiAgICAgICAgICAgICAgX3RoaXMucG9zaXRpb25FZGl0aW5nID0gZmFsc2VcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBBdHRhY2tBcnJvd09iamVjdC5jbG9zZU5vZGVFZGl0KF90aGlzKVxyXG4gICAgICAgICAgICBfdGhpcy5oZWlnaHRNb2RlID0gX3RoaXMuaGVpZ2h0TW9kZVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIGxuZ0lucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2JsdXInLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGxuZ0lucHV0LnZhbHVlID0gTnVtYmVyKChfdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sbmcpLnRvRml4ZWQoOCkpXHJcbiAgICAgICAgICAgIGxuZ0JveC5pbm5lckhUTUwgPSAnJ1xyXG4gICAgICAgICAgICBsbmdCb3guYXBwZW5kQ2hpbGQobG5nKVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIGxuZ0lucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKCkgPT4ge1xyXG4gICAgICAgICAgICBfdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sbmcgPSBOdW1iZXIoTnVtYmVyKGxuZ0lucHV0LnZhbHVlKS50b0ZpeGVkKDgpKVxyXG4gICAgICAgICAgICBsbmcuaW5uZXJIVE1MID0gX3RoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubG5nLnRvRml4ZWQoOClcclxuICAgICAgICAgICAgX3RoaXMuaGVpZ2h0ID0gX3RoaXMuaGVpZ2h0XHJcbiAgICAgICAgICB9KVxyXG5cclxuICAgICAgICAgIGxhdEJveC5hZGRFdmVudExpc3RlbmVyKCdkYmxjbGljaycsICgpID0+IHtcclxuICAgICAgICAgICAgbGF0Qm94LmlubmVySFRNTCA9ICcnXHJcbiAgICAgICAgICAgIGxhdElucHV0LnZhbHVlID0gTnVtYmVyKChfdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sYXQpLnRvRml4ZWQoOCkpXHJcbiAgICAgICAgICAgIGxhdEJveC5hcHBlbmRDaGlsZChsYXRJbnB1dClcclxuICAgICAgICAgICAgbGF0SW5wdXQuZm9jdXMoKVxyXG4gICAgICAgICAgICBpZiAoX3RoaXMub3BlcmF0ZS5wb3NpdGlvbkVkaXRpbmcpIHtcclxuICAgICAgICAgICAgICBfdGhpcy5wb3NpdGlvbkVkaXRpbmcgPSBmYWxzZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIEF0dGFja0Fycm93T2JqZWN0LmNsb3NlTm9kZUVkaXQoX3RoaXMpXHJcbiAgICAgICAgICAgIF90aGlzLmhlaWdodE1vZGUgPSBfdGhpcy5oZWlnaHRNb2RlXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgbGF0SW5wdXQuYWRkRXZlbnRMaXN0ZW5lcignYmx1cicsICgpID0+IHtcclxuICAgICAgICAgICAgbGF0SW5wdXQudmFsdWUgPSBOdW1iZXIoKF90aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxhdCkudG9GaXhlZCg4KSlcclxuICAgICAgICAgICAgbGF0Qm94LmlubmVySFRNTCA9ICcnXHJcbiAgICAgICAgICAgIGxhdEJveC5hcHBlbmRDaGlsZChsYXQpXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgbGF0SW5wdXQuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIF90aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxhdCA9IE51bWJlcihOdW1iZXIobGF0SW5wdXQudmFsdWUpLnRvRml4ZWQoOCkpXHJcbiAgICAgICAgICAgIGxhdC5pbm5lckhUTUwgPSBfdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sYXQudG9GaXhlZCg4KVxyXG4gICAgICAgICAgICBfdGhpcy5oZWlnaHQgPSBfdGhpcy5oZWlnaHRcclxuICAgICAgICAgIH0pXHJcblxyXG4gICAgICAgICAgYWx0Qm94LmFkZEV2ZW50TGlzdGVuZXIoJ2RibGNsaWNrJywgKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoX3RoaXMuaGVpZ2h0TW9kZSA9PSAyKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGFsdEJveC5pbm5lckhUTUwgPSAnJ1xyXG4gICAgICAgICAgICBhbHRJbnB1dC52YWx1ZSA9IE51bWJlcigoX3RoaXMuaGVpZ2h0KS50b0ZpeGVkKDIpKVxyXG4gICAgICAgICAgICBhbHRCb3guYXBwZW5kQ2hpbGQoYWx0SW5wdXQpXHJcbiAgICAgICAgICAgIGFsdElucHV0LmZvY3VzKClcclxuICAgICAgICAgICAgaWYgKF90aGlzLm9wZXJhdGUucG9zaXRpb25FZGl0aW5nKSB7XHJcbiAgICAgICAgICAgICAgX3RoaXMucG9zaXRpb25FZGl0aW5nID0gZmFsc2VcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBBdHRhY2tBcnJvd09iamVjdC5jbG9zZU5vZGVFZGl0KF90aGlzKVxyXG4gICAgICAgICAgICBfdGhpcy5oZWlnaHRNb2RlID0gX3RoaXMuaGVpZ2h0TW9kZVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIGFsdElucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2JsdXInLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGFsdElucHV0LnZhbHVlID0gTnVtYmVyKChfdGhpcy5oZWlnaHQpLnRvRml4ZWQoMikpXHJcbiAgICAgICAgICAgIGFsdEJveC5pbm5lckhUTUwgPSAnJ1xyXG4gICAgICAgICAgICBhbHRCb3guYXBwZW5kQ2hpbGQoYWx0KVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIGFsdElucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKCkgPT4ge1xyXG4gICAgICAgICAgICBfdGhpcy5oZWlnaHQgPSBOdW1iZXIoTnVtYmVyKGFsdElucHV0LnZhbHVlKS50b0ZpeGVkKDIpKVxyXG4gICAgICAgICAgICBhbHQuaW5uZXJIVE1MID0gTnVtYmVyKF90aGlzLmhlaWdodC50b0ZpeGVkKDIpKVxyXG4gICAgICAgICAgfSlcclxuXHJcblxyXG4gICAgICAgICAgX3RoaXMuX2VsbXMubG5nLnB1c2gobG5nKVxyXG4gICAgICAgICAgX3RoaXMuX2VsbXMubG5nSW5wdXQucHVzaChsbmdJbnB1dClcclxuICAgICAgICAgIF90aGlzLl9lbG1zLmxhdC5wdXNoKGxhdClcclxuICAgICAgICAgIF90aGlzLl9lbG1zLmxhdElucHV0LnB1c2gobGF0SW5wdXQpXHJcbiAgICAgICAgICBfdGhpcy5fZWxtcy5hbHQucHVzaChhbHQpXHJcbiAgICAgICAgICBfdGhpcy5fZWxtcy5hbHRJbnB1dC5wdXNoKGFsdElucHV0KVxyXG4gICAgICAgICAgdEJvZHlFbG0uYXBwZW5kQ2hpbGQodHIpXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLl9EaWFsb2dPYmplY3QgPSBhd2FpdCBuZXcgRGlhbG9nKHRoaXMuc2RrLCB0aGlzLm9wdGlvbnMsIHtcclxuICAgICAgICB0aXRsZTogJ+eureWktOWxnuaApycsIGxlZnQ6ICcxODBweCcsIHRvcDogJzEwMHB4JyxcclxuICAgICAgICBjb25maXJtQ2FsbEJhY2s6IChvcHRpb25zKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLm5hbWUgPSB0aGlzLm5hbWUudHJpbSgpXHJcbiAgICAgICAgICBpZiAoIXRoaXMubmFtZSkge1xyXG4gICAgICAgICAgICB0aGlzLm5hbWUgPSAn5pyq5ZG95ZCN5a+56LGhJ1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5vcHRpb25zLmxhYmVsLnBvc2l0aW9uID0geyBsbmc6IHRoaXMubGFiZWwucG9zaXRpb25bMF0sIGxhdDogdGhpcy5sYWJlbC5wb3NpdGlvblsxXSwgYWx0OiB0aGlzLmxhYmVsLnBvc2l0aW9uWzJdIH1cclxuICAgICAgICAgIHRoaXMub3JpZ2luYWxPcHRpb25zID0gdGhpcy5kZWVwQ29weU9iaih0aGlzLm9wdGlvbnMpXHJcbiAgICAgICAgICB0aGlzLl9EaWFsb2dPYmplY3QuY2xvc2UoKVxyXG4gICAgICAgICAgdGhpcy5EaWFsb2cuY29uZmlybUNhbGxCYWNrICYmIHRoaXMuRGlhbG9nLmNvbmZpcm1DYWxsQmFjayh0aGlzLm9yaWdpbmFsT3B0aW9ucylcclxuICAgICAgICB9LFxyXG4gICAgICAgIHJlc2V0Q2FsbEJhY2s6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMucmVzZXQoKVxyXG4gICAgICAgICAgdGhpcy5EaWFsb2cucmVzZXRDYWxsQmFjayAmJiB0aGlzLkRpYWxvZy5yZXNldENhbGxCYWNrKClcclxuICAgICAgICB9LFxyXG4gICAgICAgIHJlbW92ZUNhbGxCYWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLkRpYWxvZy5yZW1vdmVDYWxsQmFjayAmJiB0aGlzLkRpYWxvZy5yZW1vdmVDYWxsQmFjaygpXHJcbiAgICAgICAgfSxcclxuICAgICAgICBjbG9zZUNhbGxCYWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICBsZXQgc3ByZWFkU3RhdGUgPSB0aGlzLm9wdGlvbnMuc3ByZWFkU3RhdGVcclxuICAgICAgICAgIHRoaXMucG9zaXRpb25FZGl0aW5nID0gZmFsc2VcclxuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMuc3ByZWFkU3RhdGUgPSBzcHJlYWRTdGF0ZVxyXG4gICAgICAgICAgICB0aGlzLnJlc2V0KClcclxuICAgICAgICAgIH0sIDEwKTtcclxuICAgICAgICAgIHRoaXMuRGlhbG9nLmNsb3NlQ2FsbEJhY2sgJiYgdGhpcy5EaWFsb2cuY2xvc2VDYWxsQmFjaygpXHJcbiAgICAgICAgfSxcclxuICAgICAgICBzaG93Q2FsbEJhY2s6IChzaG93KSA9PiB7XHJcbiAgICAgICAgICB0aGlzLm9wdGlvbnMuc2hvdyA9IHNob3dcclxuICAgICAgICAgIHRoaXMub3JpZ2luYWxPcHRpb25zLnNob3cgPSBzaG93XHJcbiAgICAgICAgICB0aGlzLnNob3cgPSBzaG93XHJcbiAgICAgICAgICB0aGlzLkRpYWxvZy5zaG93Q2FsbEJhY2sgJiYgdGhpcy5EaWFsb2cuc2hvd0NhbGxCYWNrKClcclxuICAgICAgICB9LFxyXG4gICAgICAgIHRyYW5zbGF0aW9uYWxDYWxsQmFjazogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5wb3NpdGlvbkVkaXRpbmcgPSAhdGhpcy5wb3NpdGlvbkVkaXRpbmdcclxuICAgICAgICB9LFxyXG4gICAgICAgIC8vIOS6jOasoee8lui+keWbnuiwg1xyXG4gICAgICAgIHNlY29uZGFyeUVkaXRDYWxsQmFjazogKCkgPT4ge1xyXG4gICAgICAgICAgQXR0YWNrQXJyb3dPYmplY3Qubm9kZUVkaXQodGhpcywgKCkgPT4ge1xyXG4gICAgICAgICAgICBjcmVhdGVTcGF0aWFsSW5mb1RhYmxlQ29udGVudCgpXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmJvZHkuY2xhc3NOYW1lID0gdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmJvZHkuY2xhc3NOYW1lICsgJyBhdHRhY2tBcnJvdydcclxuICAgICAgbGV0IGNvbnRlbnRFbG0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgY29udGVudEVsbS5pbm5lckhUTUwgPSBodG1sKHRoaXMpXHJcbiAgICAgIHRoaXMuX0RpYWxvZ09iamVjdC5jb250ZW50QXBwQ2hpbGQoY29udGVudEVsbSlcclxuICAgICAgdGhpcy5hdHRyaWJ1dGVUeXBlID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZVR5cGVcclxuICAgICAgdGhpcy5hdHRyaWJ1dGVDYW1lcmEgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmNhbWVyYS5jb250ZW50XHJcblxyXG4gICAgICAvLyDliJvlu7rmoIfnrb7pobVcclxuICAgICAgbGV0IHRhYnNFbG0gPSBuZXcgY3lfdGFicygnYXR0YWNrLWFycm93LW9iamVjdC1lZGl0LXRhYnMnLCB1bmRlZmluZWQsIHRoaXMuc2RrKVxyXG4gICAgICAvLyDpopzoibLnu4Tku7ZcclxuICAgICAgbGV0IGNvbG9yUGlja2VyID0gbmV3IFlKQ29sb3JQaWNrZXIoe1xyXG4gICAgICAgIGVsOiBjb250ZW50RWxtLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXCJjb2xvclwiKVswXSxcclxuICAgICAgICBzaXplOiAnbWluaScsLy/popzoibJib3jnsbvlnotcclxuICAgICAgICBhbHBoYTogdHJ1ZSwvL+aYr+WQpuW8gOWQr+mAj+aYjuW6plxyXG4gICAgICAgIGRlZmF1bHRDb2xvcjogdGhpcy5jb2xvcixcclxuICAgICAgICBkaXNhYmxlZDogZmFsc2UsLy/mmK/lkKbnpoHmraLmiZPlvIDpopzoibLpgInmi6nlmahcclxuICAgICAgICBvcGVuUGlja2VyQW5pOiAnb3BhY2l0eScsLy/miZPlvIDpopzoibLpgInmi6nlmajliqjnlLtcclxuICAgICAgICBzdXJlOiAoY29sb3IpID0+IHtcclxuICAgICAgICAgIHRoaXMuY29sb3IgPSBjb2xvclxyXG4gICAgICAgIH0sLy/ngrnlh7vnoa7orqTmjInpkq7kuovku7blm57osINcclxuICAgICAgICBjbGVhcjogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5jb2xvciA9ICdyZ2JhKDI1NSwyNTUsMjU1LDEpJ1xyXG4gICAgICAgIH0sLy/ngrnlh7vmuIXnqbrmjInpkq7kuovku7blm57osINcclxuICAgICAgfSlcclxuICAgICAgbGV0IGxpbmVjb2xvclBpY2tlciA9IG5ldyBZSkNvbG9yUGlja2VyKHtcclxuICAgICAgICBlbDogY29udGVudEVsbS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFwibGluZUNvbG9yXCIpWzBdLFxyXG4gICAgICAgIHNpemU6ICdtaW5pJywvL+minOiJsmJveOexu+Wei1xyXG4gICAgICAgIGFscGhhOiB0cnVlLC8v5piv5ZCm5byA5ZCv6YCP5piO5bqmXHJcbiAgICAgICAgZGVmYXVsdENvbG9yOiB0aGlzLmxpbmVDb2xvcixcclxuICAgICAgICBkaXNhYmxlZDogZmFsc2UsLy/mmK/lkKbnpoHmraLmiZPlvIDpopzoibLpgInmi6nlmahcclxuICAgICAgICBvcGVuUGlja2VyQW5pOiAnb3BhY2l0eScsLy/miZPlvIDpopzoibLpgInmi6nlmajliqjnlLtcclxuICAgICAgICBzdXJlOiAoY29sb3IpID0+IHtcclxuICAgICAgICAgIHRoaXMubGluZUNvbG9yID0gY29sb3JcclxuICAgICAgICB9LC8v54K55Ye756Gu6K6k5oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgICAgY2xlYXI6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMubGluZUNvbG9yID0gJ3JnYmEoMjU1LDI1NSwyNTUsMSknXHJcbiAgICAgICAgfSwvL+eCueWHu+a4heepuuaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICB9KVxyXG4gICAgICBsZXQgbGFiZWxDb2xvclBpY2tlciA9IG5ldyBZSkNvbG9yUGlja2VyKHtcclxuICAgICAgICBlbDogY29udGVudEVsbS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFwibGFiZWxDb2xvclwiKVswXSxcclxuICAgICAgICBzaXplOiAnbWluaScsLy/popzoibJib3jnsbvlnotcclxuICAgICAgICBhbHBoYTogdHJ1ZSwvL+aYr+WQpuW8gOWQr+mAj+aYjuW6plxyXG4gICAgICAgIGRlZmF1bHRDb2xvcjogdGhpcy5sYWJlbENvbG9yLFxyXG4gICAgICAgIGRpc2FibGVkOiBmYWxzZSwvL+aYr+WQpuemgeatouaJk+W8gOminOiJsumAieaLqeWZqFxyXG4gICAgICAgIG9wZW5QaWNrZXJBbmk6ICdvcGFjaXR5JywvL+aJk+W8gOminOiJsumAieaLqeWZqOWKqOeUu1xyXG4gICAgICAgIHN1cmU6IChjb2xvcikgPT4ge1xyXG4gICAgICAgICAgdGhpcy5sYWJlbENvbG9yID0gY29sb3JcclxuICAgICAgICB9LC8v54K55Ye756Gu6K6k5oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgICAgY2xlYXI6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMubGFiZWxDb2xvciA9ICdyZ2JhKDI1NSwyNTUsMjU1LDEpJ1xyXG4gICAgICAgIH0sLy/ngrnlh7vmuIXnqbrmjInpkq7kuovku7blm57osINcclxuICAgICAgfSlcclxuICAgICAgbGV0IGxhYmVsbGluZUNvbG9yUGlja2VyID0gbmV3IFlKQ29sb3JQaWNrZXIoe1xyXG4gICAgICAgIGVsOiBjb250ZW50RWxtLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXCJsYWJlbExpbmVDb2xvclwiKVswXSxcclxuICAgICAgICBzaXplOiAnbWluaScsLy/popzoibJib3jnsbvlnotcclxuICAgICAgICBhbHBoYTogdHJ1ZSwvL+aYr+WQpuW8gOWQr+mAj+aYjuW6plxyXG4gICAgICAgIGRlZmF1bHRDb2xvcjogdGhpcy5sYWJlbExpbmVDb2xvcixcclxuICAgICAgICBkaXNhYmxlZDogZmFsc2UsLy/mmK/lkKbnpoHmraLmiZPlvIDpopzoibLpgInmi6nlmahcclxuICAgICAgICBvcGVuUGlja2VyQW5pOiAnb3BhY2l0eScsLy/miZPlvIDpopzoibLpgInmi6nlmajliqjnlLtcclxuICAgICAgICBzdXJlOiAoY29sb3IpID0+IHtcclxuICAgICAgICAgIHRoaXMubGFiZWxMaW5lQ29sb3IgPSBjb2xvclxyXG4gICAgICAgIH0sLy/ngrnlh7vnoa7orqTmjInpkq7kuovku7blm57osINcclxuICAgICAgICBjbGVhcjogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5sYWJlbExpbmVDb2xvciA9ICdyZ2JhKDI1NSwyNTUsMjU1LDEpJ1xyXG4gICAgICAgIH0sLy/ngrnlh7vmuIXnqbrmjInpkq7kuovku7blm57osINcclxuICAgICAgfSlcclxuICAgICAgbGV0IGxhYmVsQmFja2dyb3VuZENvbG9yU3RhcnRQaWNrZXIgPSBuZXcgWUpDb2xvclBpY2tlcih7XHJcbiAgICAgICAgZWw6IGNvbnRlbnRFbG0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcImxhYmVsQmFja2dyb3VuZENvbG9yU3RhcnRcIilbMF0sXHJcbiAgICAgICAgc2l6ZTogJ21pbmknLFxyXG4gICAgICAgIGFscGhhOiB0cnVlLFxyXG4gICAgICAgIGRlZmF1bHRDb2xvcjogdGhpcy5sYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0LFxyXG4gICAgICAgIGRpc2FibGVkOiBmYWxzZSxcclxuICAgICAgICBvcGVuUGlja2VyQW5pOiAnb3BhY2l0eScsXHJcbiAgICAgICAgc3VyZTogKGNvbG9yKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmxhYmVsQmFja2dyb3VuZENvbG9yU3RhcnQgPSBjb2xvclxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgY2xlYXI6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JTdGFydCA9ICdyZ2JhKDI1NSwyNTUsMjU1LDEpJ1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pXHJcbiAgICAgIGxldCBsYWJlbEJhY2tncm91bmRDb2xvckVuZFBpY2tlciA9IG5ldyBZSkNvbG9yUGlja2VyKHtcclxuICAgICAgICBlbDogY29udGVudEVsbS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFwibGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmRcIilbMF0sXHJcbiAgICAgICAgc2l6ZTogJ21pbmknLFxyXG4gICAgICAgIGFscGhhOiB0cnVlLFxyXG4gICAgICAgIGRlZmF1bHRDb2xvcjogdGhpcy5sYWJlbEJhY2tncm91bmRDb2xvckVuZCxcclxuICAgICAgICBkaXNhYmxlZDogZmFsc2UsXHJcbiAgICAgICAgb3BlblBpY2tlckFuaTogJ29wYWNpdHknLFxyXG4gICAgICAgIHN1cmU6IChjb2xvcikgPT4ge1xyXG4gICAgICAgICAgdGhpcy5sYWJlbEJhY2tncm91bmRDb2xvckVuZCA9IGNvbG9yXHJcbiAgICAgICAgfSxcclxuICAgICAgICBjbGVhcjogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5sYWJlbEJhY2tncm91bmRDb2xvckVuZCA9ICdyZ2JhKDI1NSwyNTUsMjU1LDEpJ1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pXHJcbiAgICAgIGxldCBhbGxfZWxtID0gY29udGVudEVsbS5nZXRFbGVtZW50c0J5VGFnTmFtZShcIipcIilcclxuICAgICAgQXR0YWNrQXJyb3dPYmplY3QuRXZlbnRCaW5kaW5nKHRoaXMsIGFsbF9lbG0pXHJcbiAgICAgIHRoaXMuX2VsbXMuY29sb3IgPSBbY29sb3JQaWNrZXJdXHJcbiAgICAgIHRoaXMuX2VsbXMubGluZUNvbG9yID0gW2xpbmVjb2xvclBpY2tlcl1cclxuICAgICAgdGhpcy5fZWxtcy5sYWJlbENvbG9yID0gW2xhYmVsQ29sb3JQaWNrZXJdXHJcbiAgICAgIHRoaXMuX2VsbXMubGFiZWxMaW5lQ29sb3IgPSBbbGFiZWxsaW5lQ29sb3JQaWNrZXJdXHJcbiAgICAgIHRoaXMuX2VsbXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JTdGFydCA9IFtsYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0UGlja2VyXVxyXG4gICAgICB0aGlzLl9lbG1zLmxhYmVsQmFja2dyb3VuZENvbG9yRW5kID0gW2xhYmVsQmFja2dyb3VuZENvbG9yRW5kUGlja2VyXVxyXG5cclxuICAgICAgbGV0IGhlaWdodEJveEVsbSA9IHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2hlaWdodC1ib3gnKVswXVxyXG4gICAgICBsZXQgaGVpZ2h0RWxtID0gaGVpZ2h0Qm94RWxtLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2hlaWdodCcpWzBdXHJcbiAgICAgIGxldCBoZWlnaHRDb25maXJtRWxtID0gdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaGVpZ2h0LWNvbmZpcm0nKVswXVxyXG4gICAgICBoZWlnaHRFbG0udmFsdWUgPSAxMFxyXG4gICAgICBpZiAodGhpcy5oZWlnaHRNb2RlID09IDIpIHtcclxuICAgICAgICBoZWlnaHRCb3hFbG0gJiYgKGhlaWdodEJveEVsbS5jbGFzc05hbWUgPSAnaW5wdXQtbnVtYmVyIGlucHV0LW51bWJlci11bml0LTEgaGVpZ2h0LWJveCBkaXNhYmxlZCcpO1xyXG4gICAgICAgIGhlaWdodENvbmZpcm1FbG0gJiYgaGVpZ2h0Q29uZmlybUVsbS5zZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJywgJ2Rpc2FibGVkJyk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgaGVpZ2h0Qm94RWxtICYmIChoZWlnaHRCb3hFbG0uY2xhc3NOYW1lID0gJ2lucHV0LW51bWJlciBpbnB1dC1udW1iZXItdW5pdC0xIGhlaWdodC1ib3gnKTtcclxuICAgICAgICBoZWlnaHRDb25maXJtRWxtICYmIGhlaWdodENvbmZpcm1FbG0ucmVtb3ZlQXR0cmlidXRlKCdkaXNhYmxlZCcpO1xyXG4gICAgICB9XHJcbiAgICAgIGxldCBoZWlnaHRNb2RlRGF0YSA9IFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICBuYW1lOiAn5rW35ouU6auY5bqmJyxcclxuICAgICAgICAgIHZhbHVlOiAn5rW35ouU6auY5bqmJyxcclxuICAgICAgICAgIGtleTogJzAnLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgbmFtZTogJ+ebuOWvueWcsOihqCcsXHJcbiAgICAgICAgICB2YWx1ZTogJ+ebuOWvueWcsOihqCcsXHJcbiAgICAgICAgICBrZXk6ICcxJyxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIG5hbWU6ICfkvp3pmYTmqKHlnosnLFxyXG4gICAgICAgICAgdmFsdWU6ICfkvp3pmYTmqKHlnosnLFxyXG4gICAgICAgICAga2V5OiAnMicsXHJcbiAgICAgICAgfVxyXG4gICAgICBdXHJcbiAgICAgIGxldCBoZWlnaHRNb2RlT2JqZWN0ID0gbGVncChcclxuICAgICAgICB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFxyXG4gICAgICAgICAgJ2hlaWdodC1tb2RlLWJveCdcclxuICAgICAgICApWzBdLFxyXG4gICAgICAgICcuaGVpZ2h0LW1vZGUnXHJcbiAgICAgIClcclxuICAgICAgaWYgKGhlaWdodE1vZGVPYmplY3QpIHtcclxuICAgICAgICBoZWlnaHRNb2RlT2JqZWN0LmxlZ3Bfc2VhcmNoKGhlaWdodE1vZGVEYXRhKVxyXG4gICAgICAgIGxldCBoZWlnaHRNb2RlRGF0YUxlZ3BFbG0gPSB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudFxyXG4gICAgICAgICAgLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2hlaWdodC1tb2RlJylbMF1cclxuICAgICAgICAgIC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaW5wdXQnKVswXVxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaGVpZ2h0TW9kZURhdGEubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGlmIChoZWlnaHRNb2RlRGF0YVtpXS5rZXkgPT0gdGhpcy5oZWlnaHRNb2RlKSB7XHJcbiAgICAgICAgICAgIGhlaWdodE1vZGVEYXRhTGVncEVsbS52YWx1ZSA9IGhlaWdodE1vZGVEYXRhW2ldLnZhbHVlXHJcbiAgICAgICAgICAgIGhlaWdodE1vZGVPYmplY3QubGVncF9zZWFyY2hBY3RpdmUoXHJcbiAgICAgICAgICAgICAgaGVpZ2h0TW9kZURhdGFbaV0udmFsdWVcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBoZWlnaHRNb2RlRGF0YUxlZ3BFbG0uYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7XHJcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhlaWdodE1vZGVEYXRhLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChoZWlnaHRNb2RlRGF0YVtpXS52YWx1ZSA9PT0gaGVpZ2h0TW9kZURhdGFMZWdwRWxtLnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5oZWlnaHRNb2RlID0gaGVpZ2h0TW9kZURhdGFbaV0ua2V5XHJcbiAgICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcblxyXG4gICAgICAgIGhlaWdodEVsbS5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICgpID0+IHtcclxuICAgICAgICAgIHN3aXRjaCAodGhpcy5oZWlnaHRNb2RlKSB7XHJcbiAgICAgICAgICAgIGNhc2UgMDpcclxuICAgICAgICAgICAgY2FzZSAnMCc6XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgMTpcclxuICAgICAgICAgICAgY2FzZSAnMSc6XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgMjpcclxuICAgICAgICAgICAgY2FzZSAnMic6XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuXHJcbiAgICAgICAgdGhpcy5fZWxtcy5oZWlnaHQgPSBoZWlnaHRFbG1cclxuICAgICAgICB0aGlzLl9lbG1zLmhlaWdodEJveCA9IGhlaWdodEJveEVsbVxyXG4gICAgICAgIHRoaXMuX2VsbXMuaGVpZ2h0TW9kZSA9IGhlaWdodE1vZGVEYXRhTGVncEVsbVxyXG4gICAgICAgIHRoaXMuX2VsbXMuaGVpZ2h0Q29uZmlybSA9IGhlaWdodENvbmZpcm1FbG1cclxuICAgICAgICB0aGlzLl9lbG1zLmhlaWdodE1vZGVPYmplY3QgPSBoZWlnaHRNb2RlT2JqZWN0XHJcblxyXG4gICAgICAgIGhlaWdodENvbmZpcm1FbG0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XHJcbiAgICAgICAgICBpZiAodGhpcy5vcGVyYXRlLnBvc2l0aW9uRWRpdGluZykge1xyXG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uRWRpdGluZyA9IGZhbHNlXHJcbiAgICAgICAgICAgIHRoaXMuaGVpZ2h0ID0gdGhpcy5oZWlnaHQgKyBOdW1iZXIoaGVpZ2h0RWxtLnZhbHVlKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIEF0dGFja0Fycm93T2JqZWN0LmNsb3NlTm9kZUVkaXQodGhpcylcclxuICAgICAgICAgICAgdGhpcy5oZWlnaHRNb2RlID0gdGhpcy5oZWlnaHRNb2RlXHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgIHRoaXMuaGVpZ2h0ID0gdGhpcy5oZWlnaHQgKyBOdW1iZXIoaGVpZ2h0RWxtLnZhbHVlKVxyXG4gICAgICAgICAgICB9LCAxMDApO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuYXR0cmlidXRlTGluayA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50XHJcbiAgICAgICAgdGhpcy5hdHRyaWJ1dGVWciA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudFxyXG4gICAgICAgIHRoaXMuY2FtZXJhU2VsZWN0ICYmIHRoaXMuY2FtZXJhU2VsZWN0KClcclxuICAgICAgICB0aGlzLmdvb2RzU2VsZWN0ICYmIHRoaXMuZ29vZHNTZWxlY3QoKVxyXG4gICAgICAgIGxldCB0YWdEYXRhID0gdGhpcy5hdHRyaWJ1dGVTZWxlY3RcclxuICAgICAgICBsZXQgYXR0cmlidXRlRWxtID0gdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnYXR0cmlidXRlLXNlbGVjdC1ib3gnKVswXVxyXG4gICAgICAgIGlmIChhdHRyaWJ1dGVFbG0pIHtcclxuICAgICAgICAgIGxldCBsZWdwT2JqZWN0ID0gbGVncChhdHRyaWJ1dGVFbG0sIFwiLmF0dHJpYnV0ZS1zZWxlY3RcIilcclxuICAgICAgICAgIGxlZ3BPYmplY3QubGVncF9zZWFyY2godGFnRGF0YSlcclxuICAgICAgICAgIGxldCBhdHRyaWJ1dGVTZWxlY3RFbG0gPSB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdhdHRyaWJ1dGUtc2VsZWN0JylbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2lucHV0JylbMF1cclxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGFnRGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAodGFnRGF0YVtpXS5rZXkgPT09IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGVUeXBlKSB7XHJcbiAgICAgICAgICAgICAgYXR0cmlidXRlU2VsZWN0RWxtLnZhbHVlID0gdGFnRGF0YVtpXS52YWx1ZVxyXG4gICAgICAgICAgICAgIGxlZ3BPYmplY3QubGVncF9zZWFyY2hBY3RpdmUodGFnRGF0YVtpXS52YWx1ZSlcclxuICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBhdHRyaWJ1dGVTZWxlY3RFbG0uYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGFnRGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgIGlmICh0YWdEYXRhW2ldLnZhbHVlID09PSBhdHRyaWJ1dGVTZWxlY3RFbG0udmFsdWUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYXR0cmlidXRlVHlwZSA9IHRhZ0RhdGFbaV0ua2V5XHJcbiAgICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICBsZXQgdW5pdERhdGEgPSBbe1xyXG4gICAgICAgICAgbmFtZTogJ+W5s+aWueexsycsXHJcbiAgICAgICAgICB2YWx1ZTogJ+W5s+aWueexsydcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIG5hbWU6ICflubPmlrnljYPnsbMnLFxyXG4gICAgICAgICAgdmFsdWU6ICflubPmlrnljYPnsbMnXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBuYW1lOiAn5LqpJyxcclxuICAgICAgICAgIHZhbHVlOiAn5LqpJ1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgbmFtZTogJ+WFrOmhtycsXHJcbiAgICAgICAgICB2YWx1ZTogJ+WFrOmhtydcclxuICAgICAgICB9LFxyXG4gICAgICAgIF1cclxuICAgICAgICBsZXQgdW5pdERhdGFMZWdwT2JqZWN0ID0gbGVncCh0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdpbnB1dC1zZWxlY3QtdW5pdC1ib3gnKVswXSwgXCIuaW5wdXQtc2VsZWN0LXVuaXRcIilcclxuICAgICAgICBpZiAodW5pdERhdGFMZWdwT2JqZWN0KSB7XHJcbiAgICAgICAgICB1bml0RGF0YUxlZ3BPYmplY3QubGVncF9zZWFyY2godW5pdERhdGEpXHJcbiAgICAgICAgICBsZXQgdW5pdERhdGFMZWdwRWxtID0gdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaW5wdXQtc2VsZWN0LXVuaXQnKVswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaW5wdXQnKVswXVxyXG4gICAgICAgICAgdW5pdERhdGFMZWdwRWxtLnZhbHVlID0gdGhpcy5vcHRpb25zWydhcmVhLXVuaXQnXVxyXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB1bml0RGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAodW5pdERhdGFbaV0udmFsdWUgPT09IHVuaXREYXRhTGVncEVsbS52YWx1ZSkge1xyXG4gICAgICAgICAgICAgIHVuaXREYXRhTGVncE9iamVjdC5sZWdwX3NlYXJjaEFjdGl2ZSh1bml0RGF0YVtpXS52YWx1ZSlcclxuICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB1bml0RGF0YUxlZ3BFbG0uYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdW5pdERhdGEubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICBpZiAodW5pdERhdGFbaV0udmFsdWUgPT09IHVuaXREYXRhTGVncEVsbS52YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hcmVhVW5pdCA9IHVuaXREYXRhW2ldLnZhbHVlXHJcbiAgICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBmb250RGF0YSA9IGdldEZvbnRMaXN0KClcclxuICAgICAgICBsZXQgZm9udE9iamVjdCA9IGxlZ3AoXHJcbiAgICAgICAgICB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFxyXG4gICAgICAgICAgICAnZm9udC1zZWxlY3QtYm94J1xyXG4gICAgICAgICAgKVswXSxcclxuICAgICAgICAgICcuZm9udC1zZWxlY3QnXHJcbiAgICAgICAgKVxyXG4gICAgICAgIGlmIChmb250T2JqZWN0KSB7XHJcbiAgICAgICAgICBmb250T2JqZWN0LmxlZ3Bfc2VhcmNoKGZvbnREYXRhKVxyXG4gICAgICAgICAgbGV0IGZvbnREYXRhTGVncEVsbSA9IHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50XHJcbiAgICAgICAgICAgIC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdmb250LXNlbGVjdCcpWzBdXHJcbiAgICAgICAgICAgIC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaW5wdXQnKVswXVxyXG4gICAgICAgICAgZm9udERhdGFMZWdwRWxtLnZhbHVlID0gZm9udERhdGFbdGhpcy5sYWJlbEZvbnRGYW1pbHldLnZhbHVlXHJcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZvbnREYXRhLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChmb250RGF0YVtpXS52YWx1ZSA9PSBmb250RGF0YUxlZ3BFbG0udmFsdWUpIHtcclxuICAgICAgICAgICAgICBmb250T2JqZWN0LmxlZ3Bfc2VhcmNoQWN0aXZlKGZvbnREYXRhW2ldLnZhbHVlKVxyXG4gICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGZvbnREYXRhTGVncEVsbS5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICgpID0+IHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmb250RGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgIGlmIChmb250RGF0YVtpXS52YWx1ZSA9PT0gZm9udERhdGFMZWdwRWxtLnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxhYmVsRm9udEZhbWlseSA9IGZvbnREYXRhW2ldLmtleVxyXG4gICAgICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICB0aGlzLl9lbG1zLmxhYmVsRm9udEZhbWlseSA9IFtmb250RGF0YUxlZ3BFbG1dXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjcmVhdGVTcGF0aWFsSW5mb1RhYmxlQ29udGVudCgpXHJcblxyXG4gICAgICB9LCAwKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmICh0aGlzLl9EaWFsb2dPYmplY3QgJiYgdGhpcy5fRGlhbG9nT2JqZWN0LmNsb3NlKSB7XHJcbiAgICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0LmNsb3NlKClcclxuICAgICAgICB0aGlzLl9EaWFsb2dPYmplY3QgPSBudWxsXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlc2V0KCkge1xyXG4gICAgaWYgKCF0aGlzLmVudGl0eSkge1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuICAgIHRoaXMub3B0aW9ucyA9IHRoaXMuZGVlcENvcHlPYmoodGhpcy5vcmlnaW5hbE9wdGlvbnMpXHJcbiAgICB0aGlzLm5hbWUgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5uYW1lXHJcbiAgICB0aGlzLmNvbG9yID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMuY29sb3JcclxuICAgIHRoaXMubGluZUNvbG9yID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMubGluZS5jb2xvclxyXG4gICAgdGhpcy5saW5lV2lkdGggPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5saW5lLndpZHRoXHJcbiAgICB0aGlzLmxhYmVsU2hvdyA9IHRoaXMub3JpZ2luYWxPcHRpb25zLmxhYmVsLnNob3dcclxuICAgIHRoaXMubGFiZWxDb2xvciA9IHRoaXMub3JpZ2luYWxPcHRpb25zLmxhYmVsLmNvbG9yXHJcbiAgICB0aGlzLmxhYmVsRm9udFNpemUgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5sYWJlbC5mb250U2l6ZVxyXG4gICAgdGhpcy5sYWJlbEZvbnRGYW1pbHkgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5sYWJlbC5mb250RmFtaWx5XHJcbiAgICB0aGlzLmxhYmVsU2NhbGVCeURpc3RhbmNlID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMubGFiZWwuc2NhbGVCeURpc3RhbmNlXHJcbiAgICB0aGlzLmxhYmVsTmVhciA9IHRoaXMub3JpZ2luYWxPcHRpb25zLmxhYmVsLm5lYXJcclxuICAgIHRoaXMubGFiZWxGYXIgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5sYWJlbC5mYXJcclxuICAgIHRoaXMubGFiZWxMaW5lV2lkdGggPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5sYWJlbC5saW5lV2lkdGhcclxuICAgIHRoaXMubGFiZWxQaXhlbE9mZnNldCA9IHRoaXMub3JpZ2luYWxPcHRpb25zLmxhYmVsLnBpeGVsT2Zmc2V0XHJcbiAgICB0aGlzLmxhYmVsTGluZUNvbG9yID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMubGFiZWwubGluZUNvbG9yXHJcbiAgICB0aGlzLmxhYmVsQmFja2dyb3VuZENvbG9yU3RhcnQgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5sYWJlbC5iYWNrZ3JvdW5kQ29sb3JbMF1cclxuICAgIHRoaXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmQgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5sYWJlbC5iYWNrZ3JvdW5kQ29sb3JbMV1cclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMub3B0aW9ucy5wb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgaWYgKHRoaXMuX2VsbXMubG5nICYmIHRoaXMuX2VsbXMubG5nW2ldKSB7XHJcbiAgICAgICAgdGhpcy5fZWxtcy5sbmdbaV0uaW5uZXJIVE1MID0gdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sbmcudG9GaXhlZCg4KVxyXG4gICAgICB9XHJcbiAgICAgIGlmICh0aGlzLl9lbG1zLmxhdCAmJiB0aGlzLl9lbG1zLmxhdFtpXSkge1xyXG4gICAgICAgIHRoaXMuX2VsbXMubGF0W2ldLmlubmVySFRNTCA9IHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubGF0LnRvRml4ZWQoOClcclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy5fZWxtcy5hbHQgJiYgdGhpcy5fZWxtcy5hbHRbaV0pIHtcclxuICAgICAgICB0aGlzLl9lbG1zLmFsdFtpXS5pbm5lckhUTUwgPSBOdW1iZXIodGhpcy5vcHRpb25zLmhlaWdodC50b0ZpeGVkKDIpKVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5oZWlnaHRNb2RlID0gdGhpcy5oZWlnaHRNb2RlXHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm5vZGVQb2ludHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgdGhpcy5zZGsudmlld2VyLmVudGl0aWVzLnJlbW92ZSh0aGlzLm5vZGVQb2ludHNbaV0pXHJcbiAgICB9XHJcbiAgICB0aGlzLnByZXZpb3VzID0gbnVsbFxyXG4gICAgdGhpcy5ub2RlUG9pbnRzID0gW11cclxuICAgIFlKLk1lYXN1cmUuU2V0TWVhc3VyZVN0YXR1cyhmYWxzZSlcclxuICAgIHRoaXMuZXZlbnQgJiYgdGhpcy5ldmVudC5kZXN0cm95KClcclxuICAgIHRoaXMudGlwICYmIHRoaXMudGlwLmRlc3Ryb3koKVxyXG5cclxuICAgIGxldCBzcHJlYWRTdGF0ZSA9IHRoaXMub3B0aW9ucy5zcHJlYWRTdGF0ZVxyXG4gICAgdGhpcy5yZW1vdmVBbmltYXRlKClcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLmxvb3AgPSB0aGlzLm9wdGlvbnMubG9vcFxyXG4gICAgICB0aGlzLnNwcmVhZFN0YXRlID0gc3ByZWFkU3RhdGVcclxuICAgICAgc3luY0RhdGEodGhpcy5zZGssIHRoaXMub3B0aW9ucy5pZClcclxuICAgICAgc3luY1NwbGl0RGF0YSh0aGlzLnNkaywgdGhpcy5vcHRpb25zLmlkKVxyXG4gICAgfSwgMjAwKTtcclxuICB9XHJcblxyXG5cclxuICBhc3luYyByZW1vdmUoKSB7XHJcbiAgICB0aGlzLnJlbW92ZUFuaW1hdGUoKVxyXG4gICAgdGhpcy5ldmVudCAmJiB0aGlzLmV2ZW50LmRlc3Ryb3koKVxyXG4gICAgdGhpcy50aXAgJiYgdGhpcy50aXAuZGVzdHJveSgpXHJcbiAgICB0aGlzLmVudGl0eSAmJiB0aGlzLnNkay52aWV3ZXIuZW50aXRpZXMucmVtb3ZlKHRoaXMuZW50aXR5KVxyXG4gICAgdGhpcy5sYWJlbCAmJiB0aGlzLmxhYmVsLnJlbW92ZSgpXHJcbiAgICB0aGlzLmVudGl0eSA9IG51bGxcclxuICAgIGlmICh0aGlzLl9EaWFsb2dPYmplY3QgJiYgIXRoaXMuX0RpYWxvZ09iamVjdC5pc0Rlc3Ryb3kpIHtcclxuICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0LmNsb3NlKClcclxuICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0ID0gbnVsbFxyXG4gICAgfVxyXG4gICAgYXdhaXQgdGhpcy5zZGsucmVtb3ZlSW5jZXRhbmNlKHRoaXMub3B0aW9ucy5pZClcclxuICAgIGF3YWl0IHN5bmNEYXRhKHRoaXMuc2RrLCB0aGlzLm9wdGlvbnMuaWQpXHJcbiAgfVxyXG5cclxuICAvKipcclxuICog6aOe5YiwXHJcbiovXHJcbiAgYXN5bmMgZmx5VG8ob3B0aW9ucyA9IHt9KSB7XHJcbiAgICBpZiAodGhpcy5fZXJyb3IpIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcbiAgICBzZXRBY3RpdmVWaWV3ZXIoMClcclxuICAgIGNsb3NlUm90YXRlQXJvdW5kKHRoaXMuc2RrKVxyXG4gICAgY2xvc2VWaWV3Rm9sbG93KHRoaXMuc2RrKVxyXG5cclxuICAgIGlmICh0aGlzLm9wdGlvbnMuY3VzdG9tVmlldyAmJiB0aGlzLm9wdGlvbnMuY3VzdG9tVmlldy5yZWxhdGl2ZVBvc2l0aW9uICYmIHRoaXMub3B0aW9ucy5jdXN0b21WaWV3Lm9yaWVudGF0aW9uKSB7XHJcbiAgICAgIGxldCBvcmllbnRhdGlvbiA9IHtcclxuICAgICAgICBoZWFkaW5nOiBDZXNpdW0uTWF0aC50b1JhZGlhbnModGhpcy5vcHRpb25zLmN1c3RvbVZpZXcub3JpZW50YXRpb24uaGVhZGluZyB8fCAwLjApLFxyXG4gICAgICAgIHBpdGNoOiBDZXNpdW0uTWF0aC50b1JhZGlhbnModGhpcy5vcHRpb25zLmN1c3RvbVZpZXcub3JpZW50YXRpb24ucGl0Y2ggfHwgLTYwLjApLFxyXG4gICAgICAgIHJvbGw6IENlc2l1bS5NYXRoLnRvUmFkaWFucyh0aGlzLm9wdGlvbnMuY3VzdG9tVmlldy5vcmllbnRhdGlvbi5yb2xsIHx8IDAuMClcclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IGxuZyA9IHRoaXMub3B0aW9ucy5jdXN0b21WaWV3LnJlbGF0aXZlUG9zaXRpb24ubG5nXHJcbiAgICAgIGxldCBsYXQgPSB0aGlzLm9wdGlvbnMuY3VzdG9tVmlldy5yZWxhdGl2ZVBvc2l0aW9uLmxhdFxyXG4gICAgICBsZXQgYWx0ID0gdGhpcy5vcHRpb25zLmN1c3RvbVZpZXcucmVsYXRpdmVQb3NpdGlvbi5hbHRcclxuICAgICAgbGV0IGRlc3RpbmF0aW9uID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXMobG5nLCBsYXQsIGFsdClcclxuXHJcbiAgICAgIGxldCBwb3NpdGlvbiA9IHsgbG5nOiAwLCBsYXQ6IDAgfVxyXG4gICAgICBpZiAodGhpcy5vcHRpb25zLnBvc2l0aW9uKSB7XHJcbiAgICAgICAgcG9zaXRpb24gPSB7IC4uLnRoaXMub3B0aW9ucy5wb3NpdGlvbiB9XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAodGhpcy5vcHRpb25zLnBvc2l0aW9ucykge1xyXG4gICAgICAgIHBvc2l0aW9uID0geyAuLi50aGlzLm9wdGlvbnMucG9zaXRpb25zWzBdIH1cclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmICh0aGlzLm9wdGlvbnMuY2VudGVyKSB7XHJcbiAgICAgICAgcG9zaXRpb24gPSB7IC4uLnRoaXMub3B0aW9ucy5jZW50ZXIgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKHRoaXMub3B0aW9ucy5zdGFydCkge1xyXG4gICAgICAgIHBvc2l0aW9uID0geyAuLi50aGlzLm9wdGlvbnMuc3RhcnQgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ2xuZycpKSB7XHJcbiAgICAgICAgICBwb3NpdGlvbi5sbmcgPSB0aGlzLm9wdGlvbnMubG5nXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ2xhdCcpKSB7XHJcbiAgICAgICAgICBwb3NpdGlvbi5sYXQgPSB0aGlzLm9wdGlvbnMubGF0XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ2FsdCcpKSB7XHJcbiAgICAgICAgICBwb3NpdGlvbi5hbHQgPSB0aGlzLm9wdGlvbnMuYWx0XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIC8vIOWmguaenOayoeaciemrmOW6puWAvO+8jOWImeiOt+WPlue0p+i0tOmrmOW6puiuoeeul1xyXG4gICAgICBpZiAoIXBvc2l0aW9uLmhhc093blByb3BlcnR5KCdhbHQnKSkge1xyXG4gICAgICAgIHBvc2l0aW9uLmFsdCA9IGF3YWl0IHRoaXMuZ2V0Q2xhbXBUb0hlaWdodChwb3NpdGlvbilcclxuICAgICAgfVxyXG4gICAgICBsbmcgPSB0aGlzLm9wdGlvbnMuY3VzdG9tVmlldy5yZWxhdGl2ZVBvc2l0aW9uLmxuZyArIHBvc2l0aW9uLmxuZ1xyXG4gICAgICBsYXQgPSB0aGlzLm9wdGlvbnMuY3VzdG9tVmlldy5yZWxhdGl2ZVBvc2l0aW9uLmxhdCArIHBvc2l0aW9uLmxhdFxyXG4gICAgICBhbHQgPSB0aGlzLm9wdGlvbnMuY3VzdG9tVmlldy5yZWxhdGl2ZVBvc2l0aW9uLmFsdCArIHBvc2l0aW9uLmFsdFxyXG4gICAgICBkZXN0aW5hdGlvbiA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzKGxuZywgbGF0LCBhbHQpXHJcbiAgICAgIHRoaXMuc2RrLnZpZXdlci5jYW1lcmEuZmx5VG8oe1xyXG4gICAgICAgIGRlc3RpbmF0aW9uOiBkZXN0aW5hdGlvbixcclxuICAgICAgICBvcmllbnRhdGlvbjogb3JpZW50YXRpb25cclxuICAgICAgfSlcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBsZXQgcG9zaXRpb25BcnJheSA9IFtdXHJcbiAgICAgIGxldCBncm91bmRcclxuICAgICAgc3dpdGNoICh0aGlzLmhlaWdodE1vZGUpIHtcclxuICAgICAgICBjYXNlIDA6XHJcbiAgICAgICAgY2FzZSAnMCc6XHJcbiAgICAgICAgICBncm91bmQgPSBmYWxzZVxyXG4gICAgICAgICAgYnJlYWtcclxuICAgICAgICBjYXNlIDE6XHJcbiAgICAgICAgY2FzZSAnMSc6XHJcbiAgICAgICAgICBncm91bmQgPSBmYWxzZVxyXG4gICAgICAgICAgYnJlYWtcclxuICAgICAgICBjYXNlIDI6XHJcbiAgICAgICAgY2FzZSAnMic6XHJcbiAgICAgICAgICBncm91bmQgPSB0cnVlXHJcbiAgICAgICAgICBicmVha1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChncm91bmQpIHtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMub3B0aW9ucy5wb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGxldCBoZWlnaHQgPSBhd2FpdCB0aGlzLmdldENsYW1wVG9IZWlnaHQodGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXSlcclxuICAgICAgICAgIGxldCBhID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXMoXHJcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubG5nLFxyXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxhdCxcclxuICAgICAgICAgICAgaGVpZ2h0XHJcbiAgICAgICAgICApXHJcbiAgICAgICAgICBwb3NpdGlvbkFycmF5LnB1c2goYS54LCBhLnksIGEueilcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaWYgKHRoaXMucG9zaXRpb25zSCkge1xyXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnBvc2l0aW9uc0gubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgcG9zaXRpb25BcnJheS5wdXNoKHRoaXMucG9zaXRpb25zSFtpXS54LCB0aGlzLnBvc2l0aW9uc0hbaV0ueSwgdGhpcy5wb3NpdGlvbnNIW2ldLnopXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGxldCBCb3VuZGluZ1NwaGVyZSA9IENlc2l1bS5Cb3VuZGluZ1NwaGVyZS5mcm9tVmVydGljZXMocG9zaXRpb25BcnJheSlcclxuICAgICAgdGhpcy5zZGsudmlld2VyLmNhbWVyYS5mbHlUb0JvdW5kaW5nU3BoZXJlKEJvdW5kaW5nU3BoZXJlLCB7XHJcbiAgICAgICAgb2Zmc2V0OiBvcHRpb25zLm9yaWVudGF0aW9uIHx8IHtcclxuICAgICAgICAgIGhlYWRpbmc6IENlc2l1bS5NYXRoLnRvUmFkaWFucygwLjApLFxyXG4gICAgICAgICAgcGl0Y2g6IENlc2l1bS5NYXRoLnRvUmFkaWFucygtOTAuMCksXHJcbiAgICAgICAgICByb2xsOiBDZXNpdW0uTWF0aC50b1JhZGlhbnMoMC4wKVxyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICAvKipAZGVzYyDmiZPlvIDlubPnp7vlip/og71cclxuICAgKlxyXG4gICAqIEBtZW1iZXJPZiBTb3VyY2VcclxuICAgKiBAcGFyYW0gc3RhdHVzIHtib29sZWFufVxyXG4gICAqXHJcbiAgICogKi9cclxuICBzZXQgcG9zaXRpb25FZGl0aW5nKHN0YXR1cykge1xyXG4gICAgaWYgKFlKLk1lYXN1cmUuR2V0TWVhc3VyZVN0YXR1cygpIHx8ICF0aGlzLnNkayB8fCAhdGhpcy5zZGsudmlld2VyIHx8ICF0aGlzLmVudGl0eSkge1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuICAgIHRoaXMucmVtb3ZlQW5pbWF0ZSgpXHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzXHJcbiAgICB0aGlzLmV2ZW50ICYmIHRoaXMuZXZlbnQuZGVzdHJveSgpXHJcbiAgICB0aGlzLmV2ZW50ID0gbmV3IE1vdXNlRXZlbnQodGhpcy5zZGspXHJcbiAgICB0aGlzLm9wZXJhdGUucG9zaXRpb25FZGl0aW5nID0gc3RhdHVzXHJcbiAgICBpZiAoc3RhdHVzID09PSB0cnVlKSB7XHJcbiAgICAgIHRoaXMucHJldmlvdXMgPSB7XHJcbiAgICAgICAgcG9zaXRpb25zOiBbLi4udGhpcy5wb3NpdGlvbnNdXHJcbiAgICAgIH1cclxuICAgICAgdGhpcy50aXAgJiYgdGhpcy50aXAuZGVzdHJveSgpXHJcbiAgICAgIHRoaXMudGlwID0gbmV3IE1vdXNlVGlwKCfngrnlh7vpvKDmoIflt6bplK7noa7orqTvvIzlj7PplK7lj5bmtognLCB0aGlzLnNkaylcclxuICAgICAgdGhpcy5sYWJlbCAmJiAodGhpcy5sYWJlbC5lbnRpdHkuYmlsbGJvYXJkLmNvbG9yID0gQ2VzaXVtLkNvbG9yLmZyb21Dc3NDb2xvclN0cmluZyhgcmdiYSgyNTUsMjU1LDI1NSwwLjkpYCkpXHJcbiAgICAgIHRoaXMucGlja2luZyA9IGZhbHNlXHJcbiAgICAgIGxldCBhcnJheSA9IFtdXHJcbiAgICAgIGxldCBwb3NpdGlvbnMgPSBbLi4udGhpcy5wb3NpdGlvbnNdXHJcbiAgICAgIGxldCBkaXNwYXJpdHkgPSBbXVxyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGxldCBwb3NpdGlvbiA9IHRoaXMuY2FydGVzaWFuM1Rvd2dzODQocG9zaXRpb25zW2ldLCB0aGlzLnNkay52aWV3ZXIpXHJcbiAgICAgICAgYXJyYXkucHVzaChbcG9zaXRpb24ubG5nLCBwb3NpdGlvbi5sYXRdKVxyXG4gICAgICB9XHJcbiAgICAgIGxldCBmaXJzdHBvc2l0aW9uID0gdGhpcy5jYXJ0ZXNpYW4zVG93Z3M4NChwb3NpdGlvbnNbMF0sIHRoaXMuc2RrLnZpZXdlcilcclxuICAgICAgYXJyYXkucHVzaChbZmlyc3Rwb3NpdGlvbi5sbmcsIGZpcnN0cG9zaXRpb24ubGF0XSlcclxuICAgICAgdmFyIHBvbHlnb24gPSB0dXJmLnBvbHlnb24oW2FycmF5XSk7XHJcbiAgICAgIHZhciBjZW50cm9pZCA9IHR1cmYuY2VudHJvaWQocG9seWdvbik7XHJcbiAgICAgIGxldCBjZW50ZXIgPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlcyguLi5jZW50cm9pZC5nZW9tZXRyeS5jb29yZGluYXRlcylcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBjZW50ZXIueCAtIHBvc2l0aW9uc1tpXS54XHJcbiAgICAgICAgZGlzcGFyaXR5LnB1c2goe1xyXG4gICAgICAgICAgeDogY2VudGVyLnggLSBwb3NpdGlvbnNbaV0ueCxcclxuICAgICAgICAgIHk6IGNlbnRlci55IC0gcG9zaXRpb25zW2ldLnksXHJcbiAgICAgICAgICB6OiBjZW50ZXIueiAtIHBvc2l0aW9uc1tpXS56LFxyXG4gICAgICAgIH0pXHJcbiAgICAgIH1cclxuICAgICAgbGV0IG5ld3Bvc2l0aW9ucyA9IFtdXHJcbiAgICAgIHRoaXMuZXZlbnQubW91c2VfbW92ZSgobW92ZW1lbnQsIGNhcnRlc2lhbikgPT4ge1xyXG4gICAgICAgIG5ld3Bvc2l0aW9ucyA9IFtdXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkaXNwYXJpdHkubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIG5ld3Bvc2l0aW9ucy5wdXNoKHtcclxuICAgICAgICAgICAgeDogY2FydGVzaWFuLnggLSBkaXNwYXJpdHlbaV0ueCxcclxuICAgICAgICAgICAgeTogY2FydGVzaWFuLnkgLSBkaXNwYXJpdHlbaV0ueSxcclxuICAgICAgICAgICAgejogY2FydGVzaWFuLnogLSBkaXNwYXJpdHlbaV0ueixcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIHRoaXMubGFiZWwucG9zaXRpb24gPSBbcG9zaXRpb244NC5sbmcsIHBvc2l0aW9uODQubGF0LCBwb3NpdGlvbjg0LmFsdF1cclxuICAgICAgICB0aGlzLnRpcC5zZXRQb3NpdGlvbihcclxuICAgICAgICAgIGNhcnRlc2lhbixcclxuICAgICAgICAgIG1vdmVtZW50LmVuZFBvc2l0aW9uLngsXHJcbiAgICAgICAgICBtb3ZlbWVudC5lbmRQb3NpdGlvbi55XHJcbiAgICAgICAgKVxyXG4gICAgICB9KVxyXG4gICAgICB0aGlzLmV2ZW50Lm1vdXNlX2xlZnQoKG1vdmVtZW50LCBjYXJ0ZXNpYW4pID0+IHtcclxuICAgICAgICB0aGlzLmV2ZW50Lm1vdXNlX21vdmUoKCkgPT4geyB9KVxyXG4gICAgICAgIHRoaXMuZXZlbnQubW91c2VfbGVmdCgoKSA9PiB7IH0pXHJcbiAgICAgICAgdGhpcy5ldmVudC5tb3VzZV9yaWdodCgoKSA9PiB7IH0pXHJcbiAgICAgICAgdGhpcy5ldmVudC5nZXN0dXJlX3BpbmNrX3N0YXJ0KCgpID0+IHsgfSlcclxuICAgICAgICBuZXdwb3NpdGlvbnMgPSBbXVxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGlzcGFyaXR5Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBsZXQgcG9zMyA9IHtcclxuICAgICAgICAgICAgeDogY2FydGVzaWFuLnggLSBkaXNwYXJpdHlbaV0ueCxcclxuICAgICAgICAgICAgeTogY2FydGVzaWFuLnkgLSBkaXNwYXJpdHlbaV0ueSxcclxuICAgICAgICAgICAgejogY2FydGVzaWFuLnogLSBkaXNwYXJpdHlbaV0ueixcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIG5ld3Bvc2l0aW9ucy5wdXNoKHBvczMpXHJcbiAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldID0gdGhpcy5jYXJ0ZXNpYW4zVG93Z3M4NChwb3MzLCB0aGlzLnNkay52aWV3ZXIpXHJcbiAgICAgICAgICBpZiAodGhpcy5fZWxtcy5sbmcgJiYgdGhpcy5fZWxtcy5sbmdbaV0pIHtcclxuICAgICAgICAgICAgdGhpcy5fZWxtcy5sbmdbaV0uaW5uZXJIVE1MID0gdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sbmcudG9GaXhlZCg4KVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKHRoaXMuX2VsbXMubGF0ICYmIHRoaXMuX2VsbXMubGF0W2ldKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2VsbXMubGF0W2ldLmlubmVySFRNTCA9IHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubGF0LnRvRml4ZWQoOClcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5wb3NpdGlvbnMgPSBuZXdwb3NpdGlvbnNcclxuICAgICAgICB0aGlzLnByZXZpb3VzID0ge1xyXG4gICAgICAgICAgcG9zaXRpb25zOiBbLi4udGhpcy5wb3NpdGlvbnNdXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMucG9zaXRpb25FZGl0aW5nID0gZmFsc2VcclxuXHJcbiAgICAgICAgaWYodGhpcy5fcG9zaXRpb25FZGl0aW5nQ2FsbGJhY2spIHtcclxuICAgICAgICAgIHRoaXMuX3Bvc2l0aW9uRWRpdGluZ0NhbGxiYWNrKClcclxuICAgICAgICAgIHRoaXMuX3Bvc2l0aW9uRWRpdGluZ0NhbGxiYWNrID0gbnVsbFxyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgICAgdGhpcy5ldmVudC5tb3VzZV9yaWdodCgobW92ZW1lbnQsIGNhcnRlc2lhbikgPT4ge1xyXG4gICAgICAgIHRoaXMucG9zaXRpb25FZGl0aW5nID0gZmFsc2VcclxuICAgICAgfSlcclxuXHJcbiAgICAgIHRoaXMuZXZlbnQuZ2VzdHVyZV9waW5ja19zdGFydCgobW92ZW1lbnQsIGNhcnRlc2lhbikgPT4ge1xyXG4gICAgICAgIGxldCBzdGFydFRpbWUgPSBuZXcgRGF0ZSgpXHJcbiAgICAgICAgdGhpcy5ldmVudC5nZXN0dXJlX3BpbmNrX2VuZCgoKSA9PiB7XHJcbiAgICAgICAgICBsZXQgZW5kVGltZSA9IG5ldyBEYXRlKClcclxuICAgICAgICAgIGlmIChlbmRUaW1lIC0gc3RhcnRUaW1lID49IDUwMCkge1xyXG4gICAgICAgICAgICAvLyDplb/mjInlj5bmtohcclxuICAgICAgICAgICAgdGhpcy5wb3NpdGlvbkVkaXRpbmcgPSBmYWxzZVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuZXZlbnQubW91c2VfbW92ZSgoKSA9PiB7IH0pXHJcbiAgICAgICAgICAgIHRoaXMuZXZlbnQubW91c2VfbGVmdCgoKSA9PiB7IH0pXHJcbiAgICAgICAgICAgIHRoaXMuZXZlbnQubW91c2VfcmlnaHQoKCkgPT4geyB9KVxyXG4gICAgICAgICAgICB0aGlzLmV2ZW50Lmdlc3R1cmVfcGluY2tfc3RhcnQoKCkgPT4geyB9KVxyXG4gICAgICAgICAgICBuZXdwb3NpdGlvbnMgPSBbXVxyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRpc3Bhcml0eS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgIGxldCBwb3MzID0ge1xyXG4gICAgICAgICAgICAgICAgeDogY2FydGVzaWFuLnggLSBkaXNwYXJpdHlbaV0ueCxcclxuICAgICAgICAgICAgICAgIHk6IGNhcnRlc2lhbi55IC0gZGlzcGFyaXR5W2ldLnksXHJcbiAgICAgICAgICAgICAgICB6OiBjYXJ0ZXNpYW4ueiAtIGRpc3Bhcml0eVtpXS56LFxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBuZXdwb3NpdGlvbnMucHVzaChwb3MzKVxyXG4gICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0gPSB0aGlzLmNhcnRlc2lhbjNUb3dnczg0KHBvczMsIHRoaXMuc2RrLnZpZXdlcilcclxuICAgICAgICAgICAgICBpZiAodGhpcy5fZWxtcy5sbmcgJiYgdGhpcy5fZWxtcy5sbmdbaV0pIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2VsbXMubG5nW2ldLmlubmVySFRNTCA9IHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubG5nLnRvRml4ZWQoOClcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgaWYgKHRoaXMuX2VsbXMubGF0ICYmIHRoaXMuX2VsbXMubGF0W2ldKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9lbG1zLmxhdFtpXS5pbm5lckhUTUwgPSB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxhdC50b0ZpeGVkKDgpXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb25zID0gbmV3cG9zaXRpb25zXHJcbiAgICAgICAgICAgIHRoaXMucHJldmlvdXMgPSB7XHJcbiAgICAgICAgICAgICAgcG9zaXRpb25zOiBbLi4udGhpcy5wb3NpdGlvbnNdXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5wb3NpdGlvbkVkaXRpbmcgPSBmYWxzZVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgIH0pXHJcblxyXG4gICAgICB0aGlzLmVudGl0eS5wb2x5Z29uLmhpZXJhcmNoeSA9IG5ldyBDZXNpdW0uQ2FsbGJhY2tQcm9wZXJ0eShmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgbGV0IHBvc2l0aW9uODQgPSBbXVxyXG4gICAgICAgIGlmIChuZXdwb3NpdGlvbnMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuZXdwb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgcG9zaXRpb244NC5wdXNoKF90aGlzLmNhcnRlc2lhbjNUb3dnczg0KG5ld3Bvc2l0aW9uc1tpXSwgX3RoaXMuc2RrLnZpZXdlcikpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgcG9zaXRpb244NC5wdXNoKF90aGlzLmNhcnRlc2lhbjNUb3dnczg0KHBvc2l0aW9uc1tpXSwgX3RoaXMuc2RrLnZpZXdlcikpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIF90aGlzLnJlbmV3UG9zaXRpb25zKHBvc2l0aW9uODQpXHJcbiAgICAgICAgcmV0dXJuIG5ldyBDZXNpdW0uUG9seWdvbkhpZXJhcmNoeShfdGhpcy5wb3NpdGlvbnNIKVxyXG4gICAgICB9LCBmYWxzZSlcclxuICAgICAgdGhpcy5lbnRpdHkucG9seWxpbmUucG9zaXRpb25zID0gbmV3IENlc2l1bS5DYWxsYmFja1Byb3BlcnR5KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICByZXR1cm4gWy4uLl90aGlzLnBvc2l0aW9uc0gsIF90aGlzLnBvc2l0aW9uc0hbMF0sIF90aGlzLnBvc2l0aW9uc0hbMV1dXHJcbiAgICAgIH0sIGZhbHNlKVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmICh0aGlzLmxhYmVsICYmIHRoaXMubGFiZWwuZW50aXR5ICYmIHRoaXMubGFiZWwuZW50aXR5LmJpbGxib2FyZCkge1xyXG4gICAgICAgIHRoaXMubGFiZWwuZW50aXR5LmJpbGxib2FyZC5jb2xvciA9IENlc2l1bS5Db2xvci5mcm9tQ3NzQ29sb3JTdHJpbmcoYHJnYmEoMjU1LDI1NSwyNTUsMSlgKVxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMucGlja2luZyA9IHRydWVcclxuICAgICAgaWYgKHRoaXMuZXZlbnQpIHtcclxuICAgICAgICB0aGlzLmV2ZW50Lm1vdXNlX21vdmUoKCkgPT4geyB9KVxyXG4gICAgICAgIHRoaXMuZXZlbnQubW91c2VfbGVmdCgoKSA9PiB7IH0pXHJcbiAgICAgICAgdGhpcy5ldmVudC5tb3VzZV9yaWdodCgoKSA9PiB7IH0pXHJcbiAgICAgICAgdGhpcy5ldmVudC5kZXN0cm95KClcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnRpcCAmJiB0aGlzLnRpcC5kZXN0cm95KClcclxuXHJcbiAgICAgIGlmICghdGhpcy5wcmV2aW91cykge1xyXG4gICAgICAgIHRoaXMucHJldmlvdXMgPSB7XHJcbiAgICAgICAgICBwb3NpdGlvbnM6IFsuLi50aGlzLnBvc2l0aW9uc11cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdGhpcy5wb3NpdGlvbnMgPSBbLi4udGhpcy5wcmV2aW91cy5wb3NpdGlvbnNdXHJcbiAgICAgIH1cclxuICAgICAgbGV0IHBvc2l0aW9uODQgPSBbXVxyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgcG9zaXRpb244NC5wdXNoKF90aGlzLmNhcnRlc2lhbjNUb3dnczg0KHRoaXMucG9zaXRpb25zW2ldLCBfdGhpcy5zZGsudmlld2VyKSlcclxuICAgICAgfVxyXG4gICAgICBfdGhpcy5yZW5ld1Bvc2l0aW9ucyhwb3NpdGlvbjg0KVxyXG5cclxuICAgICAgdGhpcy5lbnRpdHkucG9seWdvbi5oaWVyYXJjaHkgPSBuZXcgQ2VzaXVtLkNhbGxiYWNrUHJvcGVydHkoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHJldHVybiBuZXcgQ2VzaXVtLlBvbHlnb25IaWVyYXJjaHkoX3RoaXMucG9zaXRpb25zSClcclxuICAgICAgfSwgdHJ1ZSlcclxuICAgICAgdGhpcy5lbnRpdHkucG9seWxpbmUucG9zaXRpb25zID0gbmV3IENlc2l1bS5DYWxsYmFja1Byb3BlcnR5KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICByZXR1cm4gWy4uLl90aGlzLnBvc2l0aW9uc0gsIF90aGlzLnBvc2l0aW9uc0hbMF0sIF90aGlzLnBvc2l0aW9uc0hbMV1dXHJcbiAgICAgIH0sIHRydWUpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgcG9zaXRpb25FZGl0aW5nKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3BlcmF0ZS5wb3NpdGlvbkVkaXRpbmdcclxuICB9XHJcblxyXG4gIG9wZW5Qb3NpdGlvbkVkaXRpbmcoY2QpIHtcclxuICAgIHRoaXMucG9zaXRpb25FZGl0aW5nID0gdHJ1ZVxyXG4gICAgdGhpcy5fcG9zaXRpb25FZGl0aW5nQ2FsbGJhY2sgPSBjZFxyXG4gIH1cclxuICBnZXQgYXJlYUNoYW5nZUNhbGxCYWNrKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2FyZWFDaGFuZ2VDYWxsQmFja1xyXG4gIH1cclxuXHJcbiAgc2V0IGFyZWFDaGFuZ2VDYWxsQmFjayAoY2QpIHtcclxuICAgIHRoaXMuX2FyZWFDaGFuZ2VDYWxsQmFjayA9IGNkXHJcbiAgfVxyXG5cclxuICBzdGF0aWMgRXZlbnRCaW5kaW5nKHRoYXQsIGVsZW1lbnRzKSB7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGxldCBFdmVudCA9IFtdXHJcbiAgICAgIGxldCBpc0V2ZW50ID0gZmFsc2VcclxuICAgICAgbGV0IHJlbW92ZU5hbWUgPSBbXVxyXG4gICAgICBpZiAoIWVsZW1lbnRzW2ldIHx8ICFlbGVtZW50c1tpXS5hdHRyaWJ1dGVzKSB7XHJcbiAgICAgICAgY29udGludWU7XHJcbiAgICAgIH1cclxuICAgICAgZm9yIChsZXQgbSBvZiBlbGVtZW50c1tpXS5hdHRyaWJ1dGVzKSB7XHJcbiAgICAgICAgc3dpdGNoIChtLm5hbWUpIHtcclxuICAgICAgICAgIGNhc2UgJ0Btb2RlbCc6IHtcclxuICAgICAgICAgICAgaXNFdmVudCA9IHRydWVcclxuICAgICAgICAgICAgaWYgKGVsZW1lbnRzW2ldLnR5cGUgPT0gJ2NoZWNrYm94Jykge1xyXG4gICAgICAgICAgICAgIEV2ZW50LnB1c2goKGUpID0+IHsgdGhhdFttLnZhbHVlXSA9IGUudGFyZ2V0LmNoZWNrZWQgfSlcclxuICAgICAgICAgICAgICBlbGVtZW50c1tpXS5jaGVja2VkID0gdGhhdFttLnZhbHVlXVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgIEV2ZW50LnB1c2goKGUpID0+IHtcclxuICAgICAgICAgICAgICAgIGxldCB2YWx1ZSA9IGUudGFyZ2V0LnZhbHVlXHJcbiAgICAgICAgICAgICAgICBpZiAoZS50YXJnZXQudHlwZSA9PSAnbnVtYmVyJykge1xyXG4gICAgICAgICAgICAgICAgICBpZiAoZS5kYXRhICE9ICcuJyAmJiAoZS5kYXRhICE9ICctJyB8fCBlLnRhcmdldC52YWx1ZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IE51bWJlcih2YWx1ZSlcclxuICAgICAgICAgICAgICAgICAgICBpZiAoKGUudGFyZ2V0Lm1heCkgJiYgdmFsdWUgPiBOdW1iZXIoZS50YXJnZXQubWF4KSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBOdW1iZXIoZS50YXJnZXQubWF4KVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAoKGUudGFyZ2V0Lm1pbikgJiYgdmFsdWUgPCBOdW1iZXIoZS50YXJnZXQubWluKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBOdW1iZXIoZS50YXJnZXQubWluKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGF0W20udmFsdWVdID0gdmFsdWVcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIHRoYXRbbS52YWx1ZV0gPSB2YWx1ZVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgaWYgKGVsZW1lbnRzW2ldLm5vZGVOYW1lID09ICdJTUcnKSB7XHJcbiAgICAgICAgICAgICAgICBlbGVtZW50c1tpXS5zcmMgPSB0aGF0W20udmFsdWVdXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZWxlbWVudHNbaV0udmFsdWUgPSB0aGF0W20udmFsdWVdXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh0aGF0Ll9lbG1zW20udmFsdWVdKSB7XHJcbiAgICAgICAgICAgICAgdGhhdC5fZWxtc1ttLnZhbHVlXS5wdXNoKGVsZW1lbnRzW2ldKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgIHRoYXQuX2VsbXNbbS52YWx1ZV0gPSBbZWxlbWVudHNbaV1dXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmVtb3ZlTmFtZS5wdXNoKG0ubmFtZSlcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBjYXNlICdAY2xpY2snOiB7XHJcbiAgICAgICAgICAgIGVsZW1lbnRzW2ldLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcclxuICAgICAgICAgICAgICBpZiAodHlwZW9mICh0aGF0W20udmFsdWVdKSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgdGhhdFttLnZhbHVlXShlKVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHJlbW92ZU5hbWUucHVzaChtLm5hbWUpXHJcbiAgICAgICAgICAgIC8vIGVsZW1lbnRzW2ldLmF0dHJpYnV0ZXMucmVtb3ZlTmFtZWRJdGVtKG0ubmFtZSlcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBjYXNlICdAY2hhbmdlJzoge1xyXG4gICAgICAgICAgICBpc0V2ZW50ID0gdHJ1ZVxyXG4gICAgICAgICAgICBFdmVudC5wdXNoKChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgbGV0IHZhbHVlID0gZS50YXJnZXQudmFsdWVcclxuICAgICAgICAgICAgICBpZiAoZS50YXJnZXQudHlwZSA9PSAnbnVtYmVyJyAmJiB2YWx1ZSAhPSAnJykge1xyXG4gICAgICAgICAgICAgICAgdmFsdWUgPSBOdW1iZXIodmFsdWUpXHJcbiAgICAgICAgICAgICAgICBlLnRhcmdldC52YWx1ZSA9IHZhbHVlXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgKHRoYXRbbS52YWx1ZV0pID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgICAgICB0aGF0W20udmFsdWVdKGUsIHZhbHVlKVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGVsZW1lbnRzW2ldLmF0dHJpYnV0ZXNbbV0gPSB1bmRlZmluZWRcclxuICAgICAgfVxyXG4gICAgICBmb3IgKGxldCBuID0gMDsgbiA8IHJlbW92ZU5hbWUubGVuZ3RoOyBuKyspIHtcclxuICAgICAgICBlbGVtZW50c1tpXS5hdHRyaWJ1dGVzLnJlbW92ZU5hbWVkSXRlbShyZW1vdmVOYW1lW25dKVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoaXNFdmVudCkge1xyXG4gICAgICAgIGxldCB2ZW50VHlwZSA9ICdpbnB1dCdcclxuICAgICAgICBpZiAoZWxlbWVudHNbaV0udGFnTmFtZSAhPSAnSU5QVVQnIHx8IGVsZW1lbnRzW2ldLnR5cGUgPT0gJ2NoZWNrYm94Jykge1xyXG4gICAgICAgICAgdmVudFR5cGUgPSAnY2hhbmdlJ1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZWxlbWVudHNbaV0uY2xhc3NOYW1lLmluZGV4T2YoJ2JsdXInKSAhPT0gLTEpIHtcclxuICAgICAgICAgIHZlbnRUeXBlID0gJ2JsdXInXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsZW1lbnRzW2ldLmFkZEV2ZW50TGlzdGVuZXIodmVudFR5cGUsIChlKSA9PiB7XHJcbiAgICAgICAgICBmb3IgKGxldCB0ID0gMDsgdCA8IEV2ZW50Lmxlbmd0aDsgdCsrKSB7XHJcbiAgICAgICAgICAgIEV2ZW50W3RdKGUpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5vZGVFZGl0KGNiID0gKCkgPT4geyB9KSB7XHJcbiAgICB0aGlzLnBvc2l0aW9uRWRpdGluZyA9IGZhbHNlXHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgaWYgKFlKLk1lYXN1cmUuR2V0TWVhc3VyZVN0YXR1cygpKSB7XHJcbiAgICAgICAgY2IoJ+S4iuS4gOasoea1i+mHj+acque7k+adnycpXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5yZW1vdmVBbmltYXRlKClcclxuICAgICAgICBZSi5NZWFzdXJlLlNldE1lYXN1cmVTdGF0dXModHJ1ZSlcclxuICAgICAgICBsZXQgX3RoaXMgPSB0aGlzXHJcbiAgICAgICAgdGhpcy5ldmVudCAmJiB0aGlzLmV2ZW50LmRlc3Ryb3koKVxyXG4gICAgICAgIHRoaXMudGlwICYmIHRoaXMudGlwLmRlc3Ryb3koKVxyXG4gICAgICAgIHRoaXMudGlwID0gbmV3IE1vdXNlVGlwKCfor7fpgInmi6nkuIDkuKrpobbngrnvvIzlj7PplK7lj5bmtognLCB0aGlzLnNkaylcclxuICAgICAgICB0aGlzLmV2ZW50ID0gbmV3IE1vdXNlRXZlbnQodGhpcy5zZGspXHJcbiAgICAgICAgdGhpcy5ub2RlUG9pbnRzID0gW11cclxuICAgICAgICBsZXQgc2VsZWN0UG9pbnRcclxuICAgICAgICBsZXQgb3JpZ2luYWxQb3NpdGlvblxyXG5cclxuICAgICAgICBsZXQgbW92ZUV2ZW50ID0gKG1vdmVtZW50LCBjYXJ0ZXNpYW4pID0+IHtcclxuICAgICAgICAgIGlmIChzZWxlY3RQb2ludCkge1xyXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zW3NlbGVjdFBvaW50LmluZGV4XSA9IHRoaXMuY2FydGVzaWFuM1Rvd2dzODQoY2FydGVzaWFuLCB0aGlzLnNkay52aWV3ZXIpXHJcbiAgICAgICAgICAgIHRoaXMucmVuZXdQb3NpdGlvbnMoKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy50aXAuc2V0UG9zaXRpb24oXHJcbiAgICAgICAgICAgIGNhcnRlc2lhbixcclxuICAgICAgICAgICAgbW92ZW1lbnQucG9zaXRpb24gPyBtb3ZlbWVudC5wb3NpdGlvbi54IDogbW92ZW1lbnQuZW5kUG9zaXRpb24ueCxcclxuICAgICAgICAgICAgbW92ZW1lbnQucG9zaXRpb24gPyBtb3ZlbWVudC5wb3NpdGlvbi55IDogbW92ZW1lbnQuZW5kUG9zaXRpb24ueVxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgbGVmdEV2ZW50ID0gKG1vdmVtZW50LCBjYXJ0ZXNpYW4pID0+IHtcclxuICAgICAgICAgIG1vdmVFdmVudChtb3ZlbWVudCwgY2FydGVzaWFuKVxyXG4gICAgICAgICAgaWYgKHNlbGVjdFBvaW50KSB7XHJcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbc2VsZWN0UG9pbnQuaW5kZXhdID0gdGhpcy5jYXJ0ZXNpYW4zVG93Z3M4NChjYXJ0ZXNpYW4sIHRoaXMuc2RrLnZpZXdlcilcclxuICAgICAgICAgICAgbGV0IGluZGV4ID0gc2VsZWN0UG9pbnQuaW5kZXhcclxuICAgICAgICAgICAgaWYgKHNlbGVjdFBvaW50LmluZGV4ID09PSB0aGlzLm9wdGlvbnMucG9zaXRpb25zLmxlbmd0aCAtIDEpIHtcclxuICAgICAgICAgICAgICBpbmRleCA9IGluZGV4ICsgMVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGxldCBlbnRpdHkgPSB0aGlzLnNkay52aWV3ZXIuZW50aXRpZXMuYWRkKHtcclxuICAgICAgICAgICAgICBuYW1lOiAnbm9kZS1zZWNvbmRhcnktZWRpdC1wb2ludCcsXHJcbiAgICAgICAgICAgICAgaW5kZXg6IGluZGV4LFxyXG4gICAgICAgICAgICAgIHBvc2l0aW9uOiBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlcyh0aGlzLm9wdGlvbnMucG9zaXRpb25zW3NlbGVjdFBvaW50LmluZGV4XS5sbmcsIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbc2VsZWN0UG9pbnQuaW5kZXhdLmxhdCwgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tzZWxlY3RQb2ludC5pbmRleF0uYWx0KSxcclxuICAgICAgICAgICAgICBiaWxsYm9hcmQ6IHtcclxuICAgICAgICAgICAgICAgIGltYWdlOiB0aGlzLmdldFNvdXJjZVJvb3RQYXRoKCkgKyAnL2ltZy9wb2ludC5wbmcnLFxyXG4gICAgICAgICAgICAgICAgd2lkdGg6IDE1LFxyXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiAxNSxcclxuICAgICAgICAgICAgICAgIGRpc2FibGVEZXB0aFRlc3REaXN0YW5jZTogTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLFxyXG4gICAgICAgICAgICAgICAgY29sb3I6IENlc2l1bS5Db2xvci5XSElURS53aXRoQWxwaGEoMC45OSlcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICBzZWxlY3RQb2ludCA9IGVudGl0eVxyXG5cclxuICAgICAgICAgICAgb3JpZ2luYWxQb3NpdGlvbiA9IHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbc2VsZWN0UG9pbnQuaW5kZXhdXHJcbiAgICAgICAgICAgIHRoaXMubm9kZVBvaW50cy5zcGxpY2Uoc2VsZWN0UG9pbnQuaW5kZXgsIDAsIGVudGl0eSlcclxuXHJcbiAgICAgICAgICAgIGlmIChpbmRleCA8IHRoaXMub3B0aW9ucy5wb3NpdGlvbnMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgc2VsZWN0UG9pbnQgPSBudWxsXHJcbiAgICAgICAgICAgICAgdGhpcy50aXAuc2V0X3RleHQoJ+ivt+mAieaLqeS4gOS4qumhtueCue+8jOWPs+mUruWPlua2iCcpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9ucy5zcGxpY2Uoc2VsZWN0UG9pbnQuaW5kZXgsIDAsIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbc2VsZWN0UG9pbnQuaW5kZXhdKVxyXG4gICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbc2VsZWN0UG9pbnQuaW5kZXhdID0gdGhpcy5jYXJ0ZXNpYW4zVG93Z3M4NChjYXJ0ZXNpYW4sIHRoaXMuc2RrLnZpZXdlcilcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLnJlbmV3UG9zaXRpb25zKClcclxuICAgICAgICAgICAgY2IoJycsIFsuLi50aGlzLm9wdGlvbnMucG9zaXRpb25zXSlcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB2YXIgcGljayA9IHRoaXMuc2RrLnZpZXdlci5zY2VuZS5waWNrKG1vdmVtZW50LnBvc2l0aW9uIHx8IG1vdmVtZW50LmVuZFBvc2l0aW9uKTtcclxuICAgICAgICAgICAgaWYgKHBpY2sgJiYgcGljay5pZCAmJiBwaWNrLmlkLm5hbWUgJiYgcGljay5pZC5uYW1lID09PSAnbm9kZS1zZWNvbmRhcnktZWRpdC1wb2ludCcpIHtcclxuICAgICAgICAgICAgICBzZWxlY3RQb2ludCA9IHBpY2suaWRcclxuICAgICAgICAgICAgICBvcmlnaW5hbFBvc2l0aW9uID0gdGhpcy5jYXJ0ZXNpYW4zVG93Z3M4NChwaWNrLmlkLnBvc2l0aW9uLmdldFZhbHVlKCksIHRoaXMuc2RrLnZpZXdlcilcclxuICAgICAgICAgICAgICB0aGlzLm5vZGVQb2ludHMuc3BsaWNlKHBpY2suaWQuaW5kZXgsIDEpXHJcbiAgICAgICAgICAgICAgdGhpcy5zZGsudmlld2VyLmVudGl0aWVzLnJlbW92ZShwaWNrLmlkKVxyXG4gICAgICAgICAgICAgIHRoaXMudGlwLnNldF90ZXh0KCflt6bplK7noa7orqTvvIzlj7PplK7nu5PmnZ/vvIxDVFJMK+WPs+mUruaSpOmUgCcpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IHJpZ2h0RXZlbnQgPSAobW92ZW1lbnQsIGNhcnRlc2lhbikgPT4ge1xyXG4gICAgICAgICAgdGhpcy5ldmVudC5tb3VzZV9tb3ZlKCgpID0+IHsgfSlcclxuICAgICAgICAgIHRoaXMuZXZlbnQubW91c2VfbGVmdCgoKSA9PiB7IH0pXHJcbiAgICAgICAgICB0aGlzLmV2ZW50Lm1vdXNlX3JpZ2h0KCgpID0+IHsgfSlcclxuICAgICAgICAgIHRoaXMuZXZlbnQuZ2VzdHVyZV9waW5ja19zdGFydCgoKSA9PiB7IH0pXHJcbiAgICAgICAgICBpZiAoc2VsZWN0UG9pbnQpIHtcclxuICAgICAgICAgICAgaWYgKCFvcmlnaW5hbFBvc2l0aW9uKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9ucy5wb3AoKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbc2VsZWN0UG9pbnQuaW5kZXhdID0gb3JpZ2luYWxQb3NpdGlvblxyXG4gICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMucG9zaXRpb25zLmxlbmd0aCA+IDMgJiYgc2VsZWN0UG9pbnQuaW5kZXggPT09IHRoaXMub3B0aW9ucy5wb3NpdGlvbnMubGVuZ3RoIC0gMSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9ucy5zcGxpY2Uoc2VsZWN0UG9pbnQuaW5kZXggKyAxLCAxKVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodGhpcy5fZWxtcy5sbmcgJiYgdGhpcy5fZWxtcy5sbmdbc2VsZWN0UG9pbnQuaW5kZXhdKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5fZWxtcy5sbmdbc2VsZWN0UG9pbnQuaW5kZXhdLmlubmVySFRNTCA9IHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbc2VsZWN0UG9pbnQuaW5kZXhdLmxuZy50b0ZpeGVkKDgpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHRoaXMuX2VsbXMubGF0ICYmIHRoaXMuX2VsbXMubGF0W3NlbGVjdFBvaW50LmluZGV4XSkge1xyXG4gICAgICAgICAgICAgIHRoaXMuX2VsbXMubGF0W3NlbGVjdFBvaW50LmluZGV4XS5pbm5lckhUTUwgPSB0aGlzLm9wdGlvbnMucG9zaXRpb25zW3NlbGVjdFBvaW50LmluZGV4XS5sYXQudG9GaXhlZCg4KVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLmhlaWdodE1vZGUgPSB0aGlzLmhlaWdodE1vZGVcclxuICAgICAgICAgIHRoaXMucHJldmlvdXMgPSBudWxsXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmVudGl0eS5wb2x5bGluZS5jbGFtcFRvR3JvdW5kID0gdHJ1ZVxyXG4gICAgICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLmFyY1R5cGUgPSBDZXNpdW0uQXJjVHlwZS5HRU9ERVNJQ1xyXG4gICAgICAgIHRoaXMuZW50aXR5LnBvbHlnb24ucGVyUG9zaXRpb25IZWlnaHQgPSBmYWxzZVxyXG4gICAgICAgIHRoaXMuZW50aXR5LnBvbHlnb24uaGllcmFyY2h5ID0gbmV3IENlc2l1bS5DYWxsYmFja1Byb3BlcnR5KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgIHJldHVybiBuZXcgQ2VzaXVtLlBvbHlnb25IaWVyYXJjaHkoX3RoaXMucG9zaXRpb25zSClcclxuICAgICAgICB9LCBmYWxzZSlcclxuICAgICAgICB0aGlzLmVudGl0eS5wb2x5bGluZS5wb3NpdGlvbnMgPSBuZXcgQ2VzaXVtLkNhbGxiYWNrUHJvcGVydHkoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgcmV0dXJuIFsuLi5fdGhpcy5wb3NpdGlvbnNILCBfdGhpcy5wb3NpdGlvbnNIWzBdLCBfdGhpcy5wb3NpdGlvbnNIWzFdXVxyXG4gICAgICAgIH0sIGZhbHNlKVxyXG5cclxuXHJcbiAgICAgICAgbGV0IHBvaW50cyA9IFtbXV1cclxuICAgICAgICBsZXQgcG9zODQgPSBbXVxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5wb3NpdGlvbnNILmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBsZXQgcG9zaXRpb24gPSB0aGlzLmNhcnRlc2lhbjNUb3dnczg0KHRoaXMucG9zaXRpb25zSFtpXSwgdGhpcy5zZGsudmlld2VyKVxyXG4gICAgICAgICAgcG9zODQucHVzaChwb3NpdGlvbilcclxuICAgICAgICAgIHBvaW50c1swXS5wdXNoKFtwb3NpdGlvbi5sbmcsIHBvc2l0aW9uLmxhdF0pXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBwb3NpdGlvbiA9IHRoaXMuY2FydGVzaWFuM1Rvd2dzODQodGhpcy5wb3NpdGlvbnNIWzBdLCB0aGlzLnNkay52aWV3ZXIpXHJcbiAgICAgICAgcG9pbnRzWzBdLnB1c2goW3Bvc2l0aW9uLmxuZywgcG9zaXRpb24ubGF0XSlcclxuICAgICAgICBsZXQgcG9seWdvbiA9IHR1cmYucG9seWdvbihwb2ludHMpXHJcbiAgICAgICAgbGV0IGNlbnRyb2lkID0gdHVyZi5wb2ludE9uRmVhdHVyZShwb2x5Z29uKVxyXG4gICAgICAgIGxldCBvYmplY3RzVG9FeGNsdWRlID0gWy4uLnRoaXMuc2RrLnZpZXdlci5lbnRpdGllcy52YWx1ZXNdXHJcbiAgICAgICAgdGhpc1xyXG4gICAgICAgICAgLmdldENsYW1wVG9IZWlnaHQoe1xyXG4gICAgICAgICAgICBsbmc6IGNlbnRyb2lkLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzBdLFxyXG4gICAgICAgICAgICBsYXQ6IGNlbnRyb2lkLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzFdXHJcbiAgICAgICAgICB9LCBvYmplY3RzVG9FeGNsdWRlKVxyXG4gICAgICAgICAgLnRoZW4oaGVpZ2h0ID0+IHtcclxuICAgICAgICAgICAgdGhpcy5sYWJlbC5wb3NpdGlvbiA9IFtcclxuICAgICAgICAgICAgICBjZW50cm9pZC5nZW9tZXRyeS5jb29yZGluYXRlc1swXSxcclxuICAgICAgICAgICAgICBjZW50cm9pZC5nZW9tZXRyeS5jb29yZGluYXRlc1sxXSxcclxuICAgICAgICAgICAgICBoZWlnaHRcclxuICAgICAgICAgICAgXVxyXG4gICAgICAgICAgfSlcclxuXHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmV2ZW50Lm1vdXNlX2xlZnQobGVmdEV2ZW50KVxyXG5cclxuICAgICAgICAgIHRoaXMuZXZlbnQubW91c2VfcmlnaHQocmlnaHRFdmVudClcclxuXHJcbiAgICAgICAgICB0aGlzLmV2ZW50Lm1vdXNlX21vdmUobW92ZUV2ZW50KVxyXG5cclxuICAgICAgICAgIHRoaXMuZXZlbnQubW91c2VfcmlnaHRfa2V5Ym9hcmRfY3RybCgobW92ZW1lbnQsIGNhcnRlc2lhbikgPT4ge1xyXG4gICAgICAgICAgICBpZiAoc2VsZWN0UG9pbnQpIHtcclxuICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zLnBvcCgpXHJcbiAgICAgICAgICAgICAgdGhpcy5zZGsudmlld2VyLmVudGl0aWVzLnJlbW92ZSh0aGlzLm5vZGVQb2ludHNbdGhpcy5ub2RlUG9pbnRzLmxlbmd0aCAtIDFdKVxyXG4gICAgICAgICAgICAgIHRoaXMubm9kZVBvaW50cy5wb3AoKVxyXG4gICAgICAgICAgICAgIGlmICghc2VsZWN0UG9pbnQuaW5kZXgpIHtcclxuICAgICAgICAgICAgICAgIC8vIHNlbGVjdFBvaW50ID0gbnVsbFxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBlbHNlIGlmIChzZWxlY3RQb2ludC5pbmRleCA9PT0gdGhpcy5vcHRpb25zLnBvc2l0aW9ucy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLm5vZGVQb2ludHNbc2VsZWN0UG9pbnQuaW5kZXggLSAxXSkge1xyXG4gICAgICAgICAgICAgICAgICBzZWxlY3RQb2ludCA9IHRoaXMubm9kZVBvaW50c1tzZWxlY3RQb2ludC5pbmRleCAtIDFdXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgc2VsZWN0UG9pbnQuaW5kZXggPSBzZWxlY3RQb2ludC5pbmRleCAtIDFcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgIHRoaXMucmVuZXdQb3NpdGlvbnMoKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KVxyXG5cclxuICAgICAgICAgIHRoaXMuZXZlbnQuZ2VzdHVyZV9waW5ja19zdGFydCgobW92ZW1lbnQsIGNhcnRlc2lhbikgPT4ge1xyXG4gICAgICAgICAgICBsZXQgc3RhcnRUaW1lID0gbmV3IERhdGUoKVxyXG4gICAgICAgICAgICB0aGlzLmV2ZW50Lmdlc3R1cmVfcGluY2tfZW5kKCgpID0+IHtcclxuICAgICAgICAgICAgICBsZXQgZW5kVGltZSA9IG5ldyBEYXRlKClcclxuICAgICAgICAgICAgICBsZXQgcG9zID0ge1xyXG4gICAgICAgICAgICAgICAgcG9zaXRpb246IHtcclxuICAgICAgICAgICAgICAgICAgeDogKG1vdmVtZW50LnBvc2l0aW9uMS54ICsgbW92ZW1lbnQucG9zaXRpb24yLngpIC8gMixcclxuICAgICAgICAgICAgICAgICAgeTogKG1vdmVtZW50LnBvc2l0aW9uMS55ICsgbW92ZW1lbnQucG9zaXRpb24yLnkpIC8gMlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBpZiAoZW5kVGltZSAtIHN0YXJ0VGltZSA+PSA1MDApIHtcclxuICAgICAgICAgICAgICAgIC8vIOmVv+aMieWPlua2iFxyXG4gICAgICAgICAgICAgICAgcmlnaHRFdmVudChwb3MsIGNhcnRlc2lhbilcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBsZWZ0RXZlbnQocG9zLCBjYXJ0ZXNpYW4pXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIGNyZWF0ZU5vZGVQb2ludHMoKVxyXG4gICAgICAgIH0sIDIwMCk7XHJcbiAgICAgICAgYXN5bmMgZnVuY3Rpb24gY3JlYXRlTm9kZVBvaW50cygpIHtcclxuICAgICAgICAgIGxldCBvYmplY3RzVG9FeGNsdWRlID0gWy4uLl90aGlzLnNkay52aWV3ZXIuZW50aXRpZXMudmFsdWVzXVxyXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBfdGhpcy5vcHRpb25zLnBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBsZXQgaGVpZ2h0ID0gYXdhaXQgX3RoaXMuZ2V0Q2xhbXBUb0hlaWdodChfdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXSwgb2JqZWN0c1RvRXhjbHVkZSlcclxuICAgICAgICAgICAgbGV0IGVudGl0eSA9IF90aGlzLnNkay52aWV3ZXIuZW50aXRpZXMuYWRkKHtcclxuICAgICAgICAgICAgICBuYW1lOiAnbm9kZS1zZWNvbmRhcnktZWRpdC1wb2ludCcsXHJcbiAgICAgICAgICAgICAgaW5kZXg6IGksXHJcbiAgICAgICAgICAgICAgcG9zaXRpb246IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzKF90aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxuZywgX3RoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubGF0LCBoZWlnaHQpLFxyXG4gICAgICAgICAgICAgIGJpbGxib2FyZDoge1xyXG4gICAgICAgICAgICAgICAgaW1hZ2U6IF90aGlzLmdldFNvdXJjZVJvb3RQYXRoKCkgKyAnL2ltZy9wb2ludC5wbmcnLFxyXG4gICAgICAgICAgICAgICAgd2lkdGg6IDE1LFxyXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiAxNSxcclxuICAgICAgICAgICAgICAgIGRpc2FibGVEZXB0aFRlc3REaXN0YW5jZTogTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLFxyXG4gICAgICAgICAgICAgICAgY29sb3I6IENlc2l1bS5Db2xvci5XSElURS53aXRoQWxwaGEoMC45OSlcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICBfdGhpcy5ub2RlUG9pbnRzLnB1c2goZW50aXR5KVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMub3B0aW9ucy5wb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAvLyAgIGxldCBlbnRpdHkgPSB0aGlzLnNkay52aWV3ZXIuZW50aXRpZXMuYWRkKHtcclxuICAgICAgICAvLyAgICAgbmFtZTogJ25vZGUtc2Vjb25kYXJ5LWVkaXQtcG9pbnQnLFxyXG4gICAgICAgIC8vICAgICBpbmRleDogaSxcclxuICAgICAgICAvLyAgICAgcG9zaXRpb246IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzKHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubG5nLCB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxhdCksXHJcbiAgICAgICAgLy8gICAgIGJpbGxib2FyZDoge1xyXG4gICAgICAgIC8vICAgICAgIGltYWdlOiB0aGlzLmdldFNvdXJjZVJvb3RQYXRoKCkgKyAnL2ltZy9wb2ludC5wbmcnLFxyXG4gICAgICAgIC8vICAgICAgIHdpZHRoOiAxNSxcclxuICAgICAgICAvLyAgICAgICBoZWlnaHQ6IDE1LFxyXG4gICAgICAgIC8vICAgICAgIGRpc2FibGVEZXB0aFRlc3REaXN0YW5jZTogTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLFxyXG4gICAgICAgIC8vICAgICB9LFxyXG4gICAgICAgIC8vICAgfSlcclxuICAgICAgICAvLyAgIG5vZGVQb2ludHMucHVzaChlbnRpdHkpXHJcbiAgICAgICAgLy8gfVxyXG4gICAgICB9XHJcbiAgICB9LCAwKTtcclxuICB9XHJcblxyXG4gIGNsb3NlTm9kZUVkaXQoKSB7XHJcbiAgICBZSi5NZWFzdXJlLlNldE1lYXN1cmVTdGF0dXMoZmFsc2UpXHJcbiAgICB0aGlzLmV2ZW50ICYmIHRoaXMuZXZlbnQuZGVzdHJveSgpXHJcbiAgICB0aGlzLnRpcCAmJiB0aGlzLnRpcC5kZXN0cm95KClcclxuICAgIHRoaXMudGlwID0gbnVsbFxyXG5cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5ub2RlUG9pbnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIHRoaXMuc2RrLnZpZXdlci5lbnRpdGllcy5yZW1vdmUodGhpcy5ub2RlUG9pbnRzW2ldKVxyXG4gICAgfVxyXG4gICAgdGhpcy5ub2RlUG9pbnRzID0gW11cclxuICAgIHRoaXMucGlja2luZyA9IHRydWVcclxuICB9XHJcblxyXG4gIHNldFBvc2l0aW9uKHYpIHtcclxuICAgIGxldCBjYXJ0ZXNpYW4gPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlcyh2LnBvc2l0aW9uLmxuZywgdi5wb3NpdGlvbi5sYXQsIHYucG9zaXRpb24uYWx0KVxyXG4gICAgbGV0IHBvc2l0aW9ucyA9IFsuLi50aGlzLnBvc2l0aW9uc11cclxuICAgIGxldCBhcnJheSA9IFtdXHJcbiAgICBsZXQgZGlzcGFyaXR5ID0gW11cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGxldCBwb3NpdGlvbiA9IHRoaXMuY2FydGVzaWFuM1Rvd2dzODQocG9zaXRpb25zW2ldLCB0aGlzLnNkay52aWV3ZXIpXHJcbiAgICAgIGFycmF5LnB1c2goW3Bvc2l0aW9uLmxuZywgcG9zaXRpb24ubGF0XSlcclxuICAgIH1cclxuICAgIGxldCBmaXJzdHBvc2l0aW9uID0gdGhpcy5jYXJ0ZXNpYW4zVG93Z3M4NChwb3NpdGlvbnNbMF0sIHRoaXMuc2RrLnZpZXdlcilcclxuICAgIGFycmF5LnB1c2goW2ZpcnN0cG9zaXRpb24ubG5nLCBmaXJzdHBvc2l0aW9uLmxhdF0pXHJcbiAgICB2YXIgcG9seWdvbiA9IHR1cmYucG9seWdvbihbYXJyYXldKTtcclxuICAgIHZhciBjZW50cm9pZCA9IHR1cmYuY2VudHJvaWQocG9seWdvbik7XHJcbiAgICBsZXQgY2VudGVyID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXMoLi4uY2VudHJvaWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXMpXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBkaXNwYXJpdHkucHVzaCh7XHJcbiAgICAgICAgeDogY2VudGVyLnggLSBwb3NpdGlvbnNbaV0ueCxcclxuICAgICAgICB5OiBjZW50ZXIueSAtIHBvc2l0aW9uc1tpXS55LFxyXG4gICAgICAgIHo6IGNlbnRlci56IC0gcG9zaXRpb25zW2ldLnosXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgICBsZXQgbmV3cG9zaXRpb25zID0gW11cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGlzcGFyaXR5Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIG5ld3Bvc2l0aW9ucy5wdXNoKHtcclxuICAgICAgICB4OiBjYXJ0ZXNpYW4ueCAtIGRpc3Bhcml0eVtpXS54LFxyXG4gICAgICAgIHk6IGNhcnRlc2lhbi55IC0gZGlzcGFyaXR5W2ldLnksXHJcbiAgICAgICAgejogY2FydGVzaWFuLnogLSBkaXNwYXJpdHlbaV0ueixcclxuICAgICAgfSlcclxuICAgIH1cclxuICAgIHRoaXMubGFiZWwucG9zaXRpb24gPSBbdi5wb3NpdGlvbi5sbmcsIHYucG9zaXRpb24ubGF0LCB2LnBvc2l0aW9uLmFsdF1cclxuXHJcbiAgICBsZXQgcG9zaXRpb25zODQgPSBbXVxyXG4gICAgaWYgKG5ld3Bvc2l0aW9ucy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmV3cG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgcG9zaXRpb25zODQucHVzaCh0aGlzLmNhcnRlc2lhbjNUb3dnczg0KG5ld3Bvc2l0aW9uc1tpXSwgdGhpcy5zZGsudmlld2VyKSlcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgbGV0IGFyciA9IHRoaXMuY29tcHV0ZUF0dGFja0Fycm93KHBvc2l0aW9uczg0KVxyXG4gICAgaWYgKGFyci5sZW5ndGggPT0gMCkge1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuICAgIHRoaXMuZW50aXR5LnBvbHlnb24uaGllcmFyY2h5ID0gbmV3IENlc2l1bS5DYWxsYmFja1Byb3BlcnR5KGZ1bmN0aW9uICgpIHtcclxuICAgICAgcmV0dXJuIG5ldyBDZXNpdW0uUG9seWdvbkhpZXJhcmNoeShhcnIpXHJcbiAgICB9LCBmYWxzZSlcclxuICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLnBvc2l0aW9ucyA9IG5ldyBDZXNpdW0uQ2FsbGJhY2tQcm9wZXJ0eShmdW5jdGlvbiAoKSB7XHJcbiAgICAgIGlmIChhcnIubGVuZ3RoID49IDMpIHtcclxuICAgICAgICByZXR1cm4gWy4uLmFyciwgYXJyWzBdLCBhcnJbMV1dXHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIFsuLi5hcnJdXHJcbiAgICAgIH1cclxuICAgIH0sIGZhbHNlKVxyXG4gIH1cclxuXHJcbiAgc2V0RElWKG9wdGlvbnMgPSB7IGRvbWlkOiBcIlwiLCB4OiAxMCwgeTogMTAgfSkge1xyXG4gICAgb3B0aW9ucy54ID0gKG9wdGlvbnMueCB8fCBvcHRpb25zLnggPT09IDApID8gb3B0aW9ucy54IDogMTBcclxuICAgIG9wdGlvbnMueSA9IChvcHRpb25zLnkgfHwgb3B0aW9ucy55ID09PSAwKSA/IG9wdGlvbnMueSA6IDEwXHJcblxyXG4gICAgbGV0IHBvc2l0aW9ucyA9IHRoaXMuY29tcHV0ZUF0dGFja0Fycm93KHRoaXMub3B0aW9ucy5wb3NpdGlvbnMpXHJcbiAgICBpZiAocG9zaXRpb25zLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG4gICAgbGV0IHBvaW50cyA9IFtbXV1cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGxldCBwb3NpdGlvbiA9IHRoaXMuY2FydGVzaWFuM1Rvd2dzODQocG9zaXRpb25zW2ldLCB0aGlzLnNkay52aWV3ZXIpXHJcbiAgICAgIHBvaW50c1swXS5wdXNoKFtwb3NpdGlvbi5sbmcsIHBvc2l0aW9uLmxhdF0pXHJcbiAgICB9XHJcbiAgICBsZXQgcG9zaXRpb24gPSB0aGlzLmNhcnRlc2lhbjNUb3dnczg0KHBvc2l0aW9uc1swXSwgdGhpcy5zZGsudmlld2VyKVxyXG4gICAgcG9pbnRzWzBdLnB1c2goW3Bvc2l0aW9uLmxuZywgcG9zaXRpb24ubGF0XSlcclxuICAgIGxldCBwb2x5Z29uID0gdHVyZi5wb2x5Z29uKHBvaW50cyk7XHJcbiAgICAvLyBsZXQgY2VudHJvaWQgPSB0dXJmLmNlbnRyb2lkKHBvbHlnb24pO1xyXG4gICAgbGV0IGNlbnRyb2lkID0gdHVyZi5wb2ludE9uRmVhdHVyZShwb2x5Z29uKTtcclxuICAgIGxldCBzaXRlSW5mb0RvbSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKG9wdGlvbnMuZG9taWQpXHJcbiAgICBsZXQgc2l0ZUluZm9Qb3NpdGlvbiA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzKGNlbnRyb2lkLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzBdLCBjZW50cm9pZC5nZW9tZXRyeS5jb29yZGluYXRlc1sxXSlcclxuXHJcbiAgICB0aGlzLnNkay52aWV3ZXIuc2NlbmUucG9zdFJlbmRlci5hZGRFdmVudExpc3RlbmVyKChwZXJjZW50YWdlKSA9PiB7XHJcbiAgICAgIC8v6L2s5o2i5Yiw5bGP5bmV5Z2Q5qCHXHJcbiAgICAgIGlmIChzaXRlSW5mb0RvbS5zdHlsZS5kaXNwbGF5ID09PSAnYmxvY2snIHx8IHNpdGVJbmZvRG9tLnN0eWxlLmRpc3BsYXkgPT09ICcnKSB7XHJcbiAgICAgICAgbGV0IHdpbnBvcyA9IHRoaXMuc2RrLnZpZXdlci5zY2VuZS5jYXJ0ZXNpYW5Ub0NhbnZhc0Nvb3JkaW5hdGVzKHNpdGVJbmZvUG9zaXRpb24pO1xyXG4gICAgICAgIGlmICh3aW5wb3MpIHtcclxuICAgICAgICAgIHNpdGVJbmZvRG9tLnN0eWxlLmxlZnQgPSAod2lucG9zLnggKyBvcHRpb25zLngpLnRvRml4ZWQoMCkgKyAncHgnO1xyXG4gICAgICAgICAgc2l0ZUluZm9Eb20uc3R5bGUudG9wID0gKHdpbnBvcy55ICsgb3B0aW9ucy55KS50b0ZpeGVkKDApICsgJ3B4JztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHNwcmVhZFRpbWUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLnNwcmVhZFRpbWVcclxuICB9XHJcblxyXG4gIHNldCBzcHJlYWRUaW1lKHYpIHtcclxuICAgIGxldCBzcHJlYWRUaW1lID0gTnVtYmVyKHYpXHJcbiAgICBpZiAoaXNOYU4oc3ByZWFkVGltZSkpIHtcclxuICAgICAgc3ByZWFkVGltZSA9IDMwMDBcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHNwcmVhZFRpbWUgPCA1MDApIHtcclxuICAgICAgc3ByZWFkVGltZSA9IDUwMFxyXG4gICAgfSBlbHNlIGlmIChzcHJlYWRUaW1lID4gOTk5OTk5OSkge1xyXG4gICAgICBzcHJlYWRUaW1lID0gOTk5OTk5OVxyXG4gICAgfVxyXG4gICAgdGhpcy5vcHRpb25zLnNwcmVhZFRpbWUgPSBzcHJlYWRUaW1lXHJcbiAgICBpZiAodGhpcy5zcHJlYWRTdGF0ZSkge1xyXG4gICAgICB0aGlzLnNldFNwcmVhZFByb2dyZXNzQnlUaW1lKClcclxuICAgIH1cclxuICAgIHRoaXMuX2VsbXMuc3ByZWFkVGltZSAmJiB0aGlzLl9lbG1zLnNwcmVhZFRpbWUuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICBpdGVtLnZhbHVlID0gc3ByZWFkVGltZVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGdldCBsb29wKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5sb29wXHJcbiAgfVxyXG4gIHNldCBsb29wKHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5sb29wID0gdlxyXG4gICAgaWYgKHRoaXMuVHdlZW5BbmltYXRlKSB7XHJcbiAgICAgIGlmICh2KSB7XHJcbiAgICAgICAgdGhpcy5Ud2VlbkFuaW1hdGUucmVwZWF0KEluZmluaXR5KVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRoaXMuVHdlZW5BbmltYXRlLnJlcGVhdCgpXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuX2VsbXMubG9vcCAmJiB0aGlzLl9lbG1zLmxvb3AuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICBpdGVtLmNoZWNrZWQgPSB2XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgZ2V0IHNwcmVhZFN0YXRlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5zcHJlYWRTdGF0ZVxyXG4gIH1cclxuICBzZXQgc3ByZWFkU3RhdGUodikge1xyXG4gICAgdGhpcy5vcHRpb25zLnNwcmVhZFN0YXRlID0gdlxyXG4gICAgaWYgKHRoaXMuVHdlZW5BbmltYXRlKSB7XHJcbiAgICAgIGlmICh2KSB7XHJcbiAgICAgICAgdGhpcy5saW5lRWRpdCA9IGZhbHNlXHJcbiAgICAgICAgdGhpcy5zZXRTcHJlYWRQcm9ncmVzc0J5VGltZSh0aGlzLlR3ZWVuQW5pbWF0ZS5fb2JqZWN0LmRpc3RhbmNlIC8gdGhpcy5Ud2VlbkFuaW1hdGUuX3ZhbHVlc0VuZC5kaXN0YW5jZSAqIHRoaXMuc3ByZWFkVGltZSlcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICB0aGlzLlR3ZWVuQW5pbWF0ZS5wYXVzZSgpXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBpZiAodikge1xyXG4gICAgICAgIHRoaXMuc2V0U3ByZWFkUHJvZ3Jlc3NCeVRpbWUoKVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLl9lbG1zLnNwcmVhZFN0YXRlICYmIHRoaXMuX2VsbXMuc3ByZWFkU3RhdGUuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICBpdGVtLmNoZWNrZWQgPSB2XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgc2V0U3ByZWFkUHJvZ3Jlc3NCeVRpbWUodGltZSA9IDApIHtcclxuICAgIGlmICghdGhpcy5lbnRpdHkpIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcbiAgICBsZXQgdGhhdCA9IHRoaXNcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5ub2RlUG9pbnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIHRoaXMuc2RrLnZpZXdlci5lbnRpdGllcy5yZW1vdmUodGhpcy5ub2RlUG9pbnRzW2ldKVxyXG4gICAgfVxyXG4gICAgdGhpcy5ub2RlUG9pbnRzID0gW11cclxuICAgIFlKLk1lYXN1cmUuU2V0TWVhc3VyZVN0YXR1cyhmYWxzZSlcclxuICAgIHRoaXMuZXZlbnQgJiYgdGhpcy5ldmVudC5kZXN0cm95KClcclxuICAgIHRoaXMudGlwICYmIHRoaXMudGlwLmRlc3Ryb3koKVxyXG5cclxuXHJcblxyXG4gICAgbGV0IEF0dGFja0Fycm93QXJyID0gdGhhdC5jb21wdXRlQXR0YWNrQXJyb3codGhhdC5vcHRpb25zLnBvc2l0aW9ucylcclxuICAgIGxldCBhcnJcclxuICAgIGxldCBsaW5lQXJyXHJcbiAgICAvLyBpZiAoYXJyLmxlbmd0aCA+PSAzKSB7XHJcbiAgICAvLyAgIGxpbmVBcnIgPSBbLi4uYXJyLCBhcnJbMF0sIGFyclsxXV1cclxuICAgIC8vIH1cclxuICAgIC8vIGVsc2Uge1xyXG4gICAgLy8gICBsaW5lQXJyID0gWy4uLmFycl1cclxuICAgIC8vIH1cclxuICAgIGlmICh0aGlzLlR3ZWVuQW5pbWF0ZSkge1xyXG4gICAgICBUV0VFTi5yZW1vdmUodGhpcy5Ud2VlbkFuaW1hdGUpXHJcbiAgICAgIHRoaXMuVHdlZW5BbmltYXRlID0gbnVsbFxyXG4gICAgfVxyXG5cclxuICAgIGxldCB7IHNka1AsIHNka0QgfSA9IGdldFNkaygpXHJcbiAgICBsZXQgdGhhdFBcclxuICAgIGlmIChzZGtEICYmIHNka1ApIHtcclxuICAgICAgaWYgKHRoaXMuc2RrID09PSBzZGtEKSB7XHJcbiAgICAgICAgdGhhdFAgPSBzZGtQLmVudGl0eU1hcC5nZXQodGhpcy5vcHRpb25zLmlkKVxyXG4gICAgICAgIGlmICh0aGF0UCAmJiB0aGF0UC5lbnRpdHkgJiYgdGhhdFAuZW50aXR5LnBvbHlnb24gJiYgdGhhdFAucG9zaXRpb25zSCkge1xyXG4gICAgICAgICAgdGhpcy5lbnRpdHkucG9seWdvbi5oaWVyYXJjaHkgPSBuZXcgQ2VzaXVtLkNhbGxiYWNrUHJvcGVydHkoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IENlc2l1bS5Qb2x5Z29uSGllcmFyY2h5KHRoYXRQLnBvc2l0aW9uc0gpXHJcbiAgICAgICAgICB9LCBmYWxzZSlcclxuICAgICAgICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLnBvc2l0aW9ucyA9IG5ldyBDZXNpdW0uQ2FsbGJhY2tQcm9wZXJ0eShmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBbLi4udGhhdFAucG9zaXRpb25zSCwgdGhhdFAucG9zaXRpb25zSFswXSwgdGhhdFAucG9zaXRpb25zSFsxXV1cclxuICAgICAgICAgIH0sIGZhbHNlKVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm5cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIHRoaXMuZW50aXR5LnBvbHlnb24uaGllcmFyY2h5ID0gYXJyXHJcbiAgICAvLyB0aGlzLmVudGl0eS5wb2x5bGluZS5wb3NpdGlvbnMgPSBsaW5lQXJyXHJcblxyXG4gICAgbGV0IGxpbmVQb3M4NCA9IFtbKHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbMF0ubG5nICsgdGhhdC5vcHRpb25zLnBvc2l0aW9uc1sxXS5sbmcpIC8gMiwgKHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbMF0ubGF0ICsgdGhhdC5vcHRpb25zLnBvc2l0aW9uc1sxXS5sYXQpIC8gMl1dXHJcbiAgICBmb3IgKGxldCBpID0gMjsgaSA8IHRoYXQub3B0aW9ucy5wb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgbGluZVBvczg0LnB1c2goW3RoYXQub3B0aW9ucy5wb3NpdGlvbnNbaV0ubG5nLCB0aGF0Lm9wdGlvbnMucG9zaXRpb25zW2ldLmxhdF0pXHJcbiAgICB9XHJcblxyXG5cclxuICAgIGxldCBsaW5lID0gdHVyZi5saW5lU3RyaW5nKGxpbmVQb3M4NCk7XHJcblxyXG4gICAgbGV0IGRpc3RhbmNlQXJyYXkgPSBbXVxyXG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBsaW5lUG9zODQubGVuZ3RoOyBpKyspIHtcclxuICAgICAgbGV0IGZyb20gPSB0dXJmLnBvaW50KGxpbmVQb3M4NFtpXSk7XHJcbiAgICAgIGxldCB0byA9IHR1cmYucG9pbnQobGluZVBvczg0W2kgLSAxXSk7XHJcbiAgICAgIGxldCBkID0gdHVyZi5kaXN0YW5jZShmcm9tLCB0bywgeyB1bml0czogJ2tpbG9tZXRlcnMnIH0pO1xyXG4gICAgICBsZXQgb2QgPSBkaXN0YW5jZUFycmF5W2Rpc3RhbmNlQXJyYXkubGVuZ3RoIC0gMV0gfHwgMFxyXG4gICAgICBkaXN0YW5jZUFycmF5LnB1c2gob2QgKyBkKVxyXG4gICAgfVxyXG5cclxuICAgIGxldCBkaXN0YW5jZSA9IHR1cmYubGVuZ3RoKGxpbmUsIHsgdW5pdHM6ICdraWxvbWV0ZXJzJyB9KTtcclxuICAgIGxldCB0aW1lUmF0aW8gPSB0aW1lIC8gdGhpcy5zcHJlYWRUaW1lXHJcbiAgICBsZXQgbSA9IDBcclxuICAgIHRoaXMuVHdlZW5BbmltYXRlID0gbmV3IFRXRUVOLlR3ZWVuKHsgZGlzdGFuY2U6IGRpc3RhbmNlICogdGltZVJhdGlvIH0pLnRvKHsgZGlzdGFuY2U6IGRpc3RhbmNlIH0sIHRoaXMuc3ByZWFkVGltZSAtIHRpbWUpLmVhc2luZyhUV0VFTi5FYXNpbmcuTGluZWFyLk5vbmUpLnJlcGVhdCh0aGlzLm9wdGlvbnMubG9vcCA/IEluZmluaXR5IDogMCkub25SZXBlYXQoKCkgPT4ge1xyXG4gICAgICBpZiAodGltZSkge1xyXG4gICAgICAgIHRoaXMuc2V0U3ByZWFkUHJvZ3Jlc3NCeVRpbWUoKVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG5cclxuICAgICAgfVxyXG4gICAgfSkub25VcGRhdGUoYXN5bmMgKHIsIGEpID0+IHtcclxuICAgICAgaWYgKHRoaXMuVHdlZW5BbmltYXRlLl9kdXJhdGlvbiA9PSBJbmZpbml0eSkge1xyXG4gICAgICAgIHJldHVyblxyXG4gICAgICB9XHJcbiAgICAgIG0rK1xyXG4gICAgICBpZiAoIXRoaXMuc2RrLnZpZXdlcikge1xyXG4gICAgICAgIHRoaXMucmVtb3ZlQW5pbWF0ZSgpXHJcbiAgICAgICAgcmV0dXJuXHJcbiAgICAgIH1cclxuICAgICAgc2V0U3ByZWFkKHIpXHJcbiAgICB9KS5vblN0YXJ0KCgpID0+IHtcclxuICAgICAgdGhpcy5vcHRpb25zLnNwcmVhZFN0YXRlID0gdHJ1ZVxyXG4gICAgICB0aGlzLl9lbG1zLnNwcmVhZFN0YXRlICYmIHRoaXMuX2VsbXMuc3ByZWFkU3RhdGUuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICAgIGl0ZW0uY2hlY2tlZCA9IHRydWVcclxuICAgICAgfSlcclxuICAgIH0pLm9uQ29tcGxldGUoKGQpID0+IHtcclxuICAgICAgdGhpcy5yZW1vdmVBbmltYXRlKClcclxuICAgIH0pXHJcbiAgICBpZiAodGhpcy5zcHJlYWRTdGF0ZSkge1xyXG4gICAgICB0aGlzLlR3ZWVuQW5pbWF0ZS5zdGFydCgpXHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgc2V0U3ByZWFkKHsgZGlzdGFuY2U6IGRpc3RhbmNlICogdGltZVJhdGlvIH0pXHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgZnVuY3Rpb24gc2V0U3ByZWFkKHYpIHtcclxuICAgICAgaWYgKCF0aGF0LnNob3cpIHtcclxuICAgICAgICByZXR1cm5cclxuICAgICAgfVxyXG4gICAgICBsZXQgaW5kZXggPSAyXHJcbiAgICAgIGZvciAobGV0IGkgPSBkaXN0YW5jZUFycmF5Lmxlbmd0aCAtIDI7IGkgPj0gMDsgaS0tKSB7XHJcbiAgICAgICAgaWYgKHYuZGlzdGFuY2UgPj0gZGlzdGFuY2VBcnJheVtpXSkge1xyXG4gICAgICAgICAgaW5kZXggPSBpbmRleCArIGkgKyAxXHJcbiAgICAgICAgICBpZiAoaW5kZXggPiB0aGF0Lm9wdGlvbnMucG9zaXRpb25zLmxlbmd0aCAtIDEpIHtcclxuICAgICAgICAgICAgaW5kZXggPSB0aGF0Lm9wdGlvbnMucG9zaXRpb25zLmxlbmd0aCAtIDFcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGxldCBwb3NpdGlvbnMgPSBbXVxyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGluZGV4OyBpKyspIHtcclxuICAgICAgICBwb3NpdGlvbnNbaV0gPSB7IC4uLnRoYXQub3B0aW9ucy5wb3NpdGlvbnNbaV0gfVxyXG4gICAgICB9XHJcbiAgICAgIGlmICghdi5kaXN0YW5jZSkge1xyXG4gICAgICAgIHBvc2l0aW9uc1tpbmRleF0gPSB7XHJcbiAgICAgICAgICBsbmc6IHBvc2l0aW9uc1sxXS5sbmcsXHJcbiAgICAgICAgICBsYXQ6IHBvc2l0aW9uc1sxXS5sYXRcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgbGV0IHNsaWNlZCA9IGF3YWl0IHR1cmYubGluZVNsaWNlQWxvbmcobGluZSwgMCwgdi5kaXN0YW5jZSwgeyB1bml0czogJ2tpbG9tZXRlcnMnIH0pO1xyXG4gICAgICAgIGxldCBjb29yZGluYXRlcyA9IFsuLi5zbGljZWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbc2xpY2VkLmdlb21ldHJ5LmNvb3JkaW5hdGVzLmxlbmd0aCAtIDFdXVxyXG4gICAgICAgIGlmICghcG9zaXRpb25zW2luZGV4XSkge1xyXG4gICAgICAgICAgcG9zaXRpb25zW2luZGV4XSA9IHt9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHBvc2l0aW9uc1tpbmRleF0ubG5nID0gY29vcmRpbmF0ZXNbMF1cclxuICAgICAgICBwb3NpdGlvbnNbaW5kZXhdLmxhdCA9IGNvb3JkaW5hdGVzWzFdXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIGNvbnNvbGUubG9nKCdwb3NpdGlvbnMnLCBwb3NpdGlvbnMpXHJcbiAgICAgIHRoYXQucmVuZXdQb3NpdGlvbnMocG9zaXRpb25zKVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZW50aXR5LnBvbHlnb24uaGllcmFyY2h5ID0gbmV3IENlc2l1bS5DYWxsYmFja1Byb3BlcnR5KGZ1bmN0aW9uICgpIHtcclxuICAgICAgcmV0dXJuIG5ldyBDZXNpdW0uUG9seWdvbkhpZXJhcmNoeSh0aGF0LnBvc2l0aW9uc0gpXHJcbiAgICB9LCBmYWxzZSlcclxuICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLnBvc2l0aW9ucyA9IG5ldyBDZXNpdW0uQ2FsbGJhY2tQcm9wZXJ0eShmdW5jdGlvbiAoKSB7XHJcbiAgICAgIHJldHVybiBbLi4udGhhdC5wb3NpdGlvbnNILCB0aGF0LnBvc2l0aW9uc0hbMF0sIHRoYXQucG9zaXRpb25zSFsxXV1cclxuICAgIH0sIGZhbHNlKVxyXG4gIH1cclxuXHJcbiAgLy8g56e76Zmk5Yqo55S7XHJcbiAgcmVtb3ZlQW5pbWF0ZSgpIHtcclxuICAgIHRoaXMuc3ByZWFkU3RhdGUgPSBmYWxzZVxyXG4gICAgaWYgKHRoaXMuVHdlZW5BbmltYXRlKSB7XHJcbiAgICAgIFRXRUVOLnJlbW92ZSh0aGlzLlR3ZWVuQW5pbWF0ZSlcclxuICAgICAgdGhpcy5Ud2VlbkFuaW1hdGUgPSBudWxsXHJcbiAgICAgIHRoaXMucmVuZXdQb3NpdGlvbnMoKVxyXG4gICAgICB0aGlzLmVudGl0eS5wb2x5Z29uLmhpZXJhcmNoeSA9IG5ldyBDZXNpdW0uUG9seWdvbkhpZXJhcmNoeSh0aGlzLnBvc2l0aW9uc0gpXHJcbiAgICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLnBvc2l0aW9ucyA9IFsuLi50aGlzLnBvc2l0aW9uc0gsIHRoaXMucG9zaXRpb25zSFswXSwgdGhpcy5wb3NpdGlvbnNIWzFdXVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8g5pu05paw5Z2Q5qCHXHJcbiAgcmVuZXdQb3NpdGlvbnMocG9zaXRpb244NCkge1xyXG4gICAgaWYgKHRoaXMuX2Vycm9yIHx8ICF0aGlzLnNkay52aWV3ZXIpIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcbiAgICBsZXQgZ3JvdW5kID0gZmFsc2VcclxuXHJcbiAgICBsZXQgYXJyYXkgPSBbXVxyXG4gICAgbGV0IHBvc2l0aW9ucyA9IHRoaXMub3B0aW9ucy5wb3NpdGlvbnNcclxuICAgIGlmIChwb3NpdGlvbjg0KSB7XHJcbiAgICAgIHBvc2l0aW9ucyA9IHBvc2l0aW9uODRcclxuICAgIH1cclxuICAgIGxldCBmcm9tRGVncmVlc0FycmF5ID0gW11cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGZyb21EZWdyZWVzQXJyYXkucHVzaChwb3NpdGlvbnNbaV0ubG5nLCBwb3NpdGlvbnNbaV0ubGF0KVxyXG4gICAgfVxyXG4gICAgdGhpcy5wb3NpdGlvbnMgPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlc0FycmF5KGZyb21EZWdyZWVzQXJyYXkpXHJcblxyXG4gICAgbGV0IHBvc2l0aW9uc0EgPSB0aGlzLmNvbXB1dGVBdHRhY2tBcnJvdyhwb3NpdGlvbnMpXHJcbiAgICBpZiAocG9zaXRpb25zQS5sZW5ndGggPT0gMCkge1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuICAgIGxldCBwb2ludHMgPSBbW11dXHJcbiAgICBsZXQgcG9zODQgPSBbXVxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb3NpdGlvbnNBLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGxldCBwb3NpdGlvbiA9IHRoaXMuY2FydGVzaWFuM1Rvd2dzODQocG9zaXRpb25zQVtpXSwgdGhpcy5zZGsudmlld2VyKVxyXG4gICAgICBwb3M4NC5wdXNoKHBvc2l0aW9uKVxyXG4gICAgICBwb2ludHNbMF0ucHVzaChbcG9zaXRpb24ubG5nLCBwb3NpdGlvbi5sYXRdKVxyXG4gICAgfVxyXG4gICAgbGV0IHBvc2l0aW9uID0gdGhpcy5jYXJ0ZXNpYW4zVG93Z3M4NChwb3NpdGlvbnNBWzBdLCB0aGlzLnNkay52aWV3ZXIpXHJcbiAgICBwb2ludHNbMF0ucHVzaChbcG9zaXRpb24ubG5nLCBwb3NpdGlvbi5sYXRdKVxyXG4gICAgbGV0IGhlaWdodCA9IDBcclxuICAgIGxldCBwb2x5Z29uID0gdHVyZi5wb2x5Z29uKHBvaW50cylcclxuICAgIGxldCBjZW50cm9pZCA9IHR1cmYucG9pbnRPbkZlYXR1cmUocG9seWdvbilcclxuICAgIHN3aXRjaCAodGhpcy5vcHRpb25zLmhlaWdodE1vZGUpIHtcclxuICAgICAgY2FzZSAnMCc6XHJcbiAgICAgIGNhc2UgMDpcclxuICAgICAgICBncm91bmQgPSBmYWxzZVxyXG4gICAgICAgIGJyZWFrXHJcbiAgICAgIGNhc2UgJzEnOlxyXG4gICAgICBjYXNlIDE6XHJcbiAgICAgICAgaGVpZ2h0ID0gdGhpcy5zZGsudmlld2VyLnNjZW5lLmdsb2JlLmdldEhlaWdodChDZXNpdW0uQ2FydG9ncmFwaGljLmZyb21EZWdyZWVzKGNlbnRyb2lkLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzBdLCBjZW50cm9pZC5nZW9tZXRyeS5jb29yZGluYXRlc1sxXSkpIHx8IDBcclxuICAgICAgICBncm91bmQgPSBmYWxzZVxyXG4gICAgICAgIGJyZWFrXHJcbiAgICAgIGNhc2UgJzInOlxyXG4gICAgICBjYXNlIDI6XHJcbiAgICAgICAgZ3JvdW5kID0gdHJ1ZVxyXG4gICAgICAgIGJyZWFrXHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGZyb21EZWdyZWVzQXJyYXkyID0gW11cclxuICAgIGlmICghZ3JvdW5kICYmIHRoaXMubm9kZVBvaW50cy5sZW5ndGggPT0gMCkge1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvaW50c1swXS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGZyb21EZWdyZWVzQXJyYXkyLnB1c2goXHJcbiAgICAgICAgICBwb2ludHNbMF1baV1bMF0sXHJcbiAgICAgICAgICBwb2ludHNbMF1baV1bMV0sXHJcbiAgICAgICAgICB0aGlzLmhlaWdodCArIGhlaWdodFxyXG4gICAgICAgIClcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnBvc2l0aW9uc0ggPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlc0FycmF5SGVpZ2h0cyhmcm9tRGVncmVlc0FycmF5MilcclxuXHJcbiAgICAgIHRoaXMubGFiZWwgJiYgKHRoaXMubGFiZWwucG9zaXRpb24gPSBbXHJcbiAgICAgICAgY2VudHJvaWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMF0sXHJcbiAgICAgICAgY2VudHJvaWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMV0sXHJcbiAgICAgICAgdGhpcy5oZWlnaHQgKyBoZWlnaHRcclxuICAgICAgXSlcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMucG9zaXRpb25zSCA9IHBvc2l0aW9uc0FcclxuXHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIGlmICghdGhpcy5zZGsudmlld2VyKSB7XHJcbiAgICAgICAgICByZXR1cm5cclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IG9iamVjdHNUb0V4Y2x1ZGUgPSBbLi4udGhpcy5zZGsudmlld2VyLmVudGl0aWVzLnZhbHVlc11cclxuICAgICAgICB0aGlzLmdldENsYW1wVG9IZWlnaHQoe1xyXG4gICAgICAgICAgbG5nOiBjZW50cm9pZC5nZW9tZXRyeS5jb29yZGluYXRlc1swXSxcclxuICAgICAgICAgIGxhdDogY2VudHJvaWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMV1cclxuICAgICAgICB9LCBvYmplY3RzVG9FeGNsdWRlKS50aGVuKGhlaWdodCA9PiB7XHJcbiAgICAgICAgICB0aGlzLmxhYmVsICYmICh0aGlzLmxhYmVsLnBvc2l0aW9uID0gW1xyXG4gICAgICAgICAgICBjZW50cm9pZC5nZW9tZXRyeS5jb29yZGluYXRlc1swXSxcclxuICAgICAgICAgICAgY2VudHJvaWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMV0sXHJcbiAgICAgICAgICAgIGhlaWdodFxyXG4gICAgICAgICAgXSlcclxuICAgICAgICB9KVxyXG4gICAgICB9LCAxMDApXHJcbiAgICB9XHJcblxyXG4gICAgLy8g6K6h566X5oqV5b2x6Z2i56evXHJcbiAgICBpZiAoIXRoaXMuc3ByZWFkU3RhdGUpIHtcclxuICAgICAgdGhpcy5hcmVhQnlNZXRlciA9IHRoaXMuY29tcHV0ZUFyZWEocG9zODQpXHJcbiAgICAgIHRoaXMuYXJlYUNoYW5nZUNhbGxCYWNrICYmIHRoaXMuYXJlYUNoYW5nZUNhbGxCYWNrKClcclxuICAgIH1cclxuICAgIHJldHVybiBmcm9tRGVncmVlc0FycmF5XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBBdHRhY2tBcnJvd09iamVjdFxyXG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQStIQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFLQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUF6SEE7QUFBQTtBQUFBO0FBMEhBO0FBQUE7QUFBQTtBQUdBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUEzQ0E7QUE0Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUtBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUdBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFMQTtBQUFBO0FBQUE7QUFBQTtBQVNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFNQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUE1ZUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUE4ZUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFiQTtBQUFBO0FBQUE7QUFBQTtBQWVBO0FBQ0E7QUFDQTtBQUZBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUFBO0FBRUE7QUFVQTtBQUFBO0FBUEE7QUFBQTtBQUFBO0FBSUE7QUFBQTtBQUFBO0FBSUE7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBS0E7QUFBQTtBQVBBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBVUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBcEdBO0FBQUE7QUFBQTtBQUFBO0FBdUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUxBO0FBQUE7QUFBQTtBQUFBO0FBOExBO0FBQ0E7QUFBQTtBQXpMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBT0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQXFHQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBcUxBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQWRBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQWdCQTtBQWxCQTtBQUFBO0FBQUE7QUFvQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFwTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUtBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQWtDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBR0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBTEE7QUFBQTtBQUFBO0FBQUE7QUFTQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBRUE7QUFLQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBNXNEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQW5CQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQWs0QkE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFyRUE7QUFBQTtBQUFBO0FBcUVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUEvRkE7QUFBQTtBQUtBO0FBMkZBO0FBQUE7QUFBQTtBQXFvQkEiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/Obj/Base/AttackArrowObject/index.js\n"); /***/ }), @@ -1811,7 +1811,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) * /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ \"./node_modules/@babel/runtime/helpers/asyncToGenerator.js\");\n/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _babel_runtime_helpers_readOnlyError__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/readOnlyError */ \"./node_modules/@babel/runtime/helpers/readOnlyError.js\");\n/* harmony import */ var _babel_runtime_helpers_readOnlyError__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_readOnlyError__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/slicedToArray */ \"./node_modules/@babel/runtime/helpers/slicedToArray.js\");\n/* harmony import */ var _babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ \"./node_modules/@babel/runtime/helpers/defineProperty.js\");\n/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ \"./node_modules/@babel/runtime/helpers/classCallCheck.js\");\n/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ \"./node_modules/@babel/runtime/helpers/createClass.js\");\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ \"./node_modules/@babel/runtime/helpers/possibleConstructorReturn.js\");\n/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ \"./node_modules/@babel/runtime/helpers/getPrototypeOf.js\");\n/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ \"./node_modules/@babel/runtime/helpers/inherits.js\");\n/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_8__);\n/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @babel/runtime/regenerator */ \"./node_modules/@babel/runtime/regenerator/index.js\");\n/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_9__);\n/* harmony import */ var _on__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../../on */ \"./src/on/index.js\");\n/* harmony import */ var _Element_Dialog__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../Element/Dialog */ \"./src/Obj/Element/Dialog/index.js\");\n/* harmony import */ var _Element_Dialog_eventBinding__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../../Element/Dialog/eventBinding */ \"./src/Obj/Element/Dialog/eventBinding.js\");\n/* harmony import */ var _Element_cy_html_slider__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../../Element/cy_html_slider */ \"./src/Obj/Element/cy_html_slider.js\");\n/* harmony import */ var _Element_cy_html_tabs__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../../Element/cy_html_tabs */ \"./src/Obj/Element/cy_html_tabs.js\");\n/* harmony import */ var _Element_richText__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../../Element/richText */ \"./src/Obj/Element/richText.js\");\n/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./_element */ \"./src/Obj/Base/BillboardObject/_element.js\");\n/* harmony import */ var _index__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../index */ \"./src/Obj/Base/index.js\");\n/* harmony import */ var _Event_index__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../../../Event/index */ \"./src/Event/index.js\");\n/* harmony import */ var _Global_cluster_cluster__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../../../Global/cluster/cluster */ \"./src/Global/cluster/cluster.js\");\n/* harmony import */ var _CircleDiffuse__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../CircleDiffuse */ \"./src/Obj/Base/CircleDiffuse/index.js\");\n/* harmony import */ var _RadarScan__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../RadarScan */ \"./src/Obj/Base/RadarScan/index.js\");\n/* harmony import */ var _Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ../../../Global/MultiViewportMode */ \"./src/Global/MultiViewportMode/index.js\");\n/* harmony import */ var _Global_global__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ../../../Global/global */ \"./src/Global/global.js\");\n/* harmony import */ var _Tools_proj__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ../../../Tools/proj */ \"./src/Tools/proj.js\");\n/* harmony import */ var _Element_datalist__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ../../Element/datalist */ \"./src/Obj/Element/datalist.js\");\n/* harmony import */ var _Element_fontSelect__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ../../Element/fontSelect */ \"./src/Obj/Element/fontSelect.js\");\n/* harmony import */ var _MouseTip__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ../../../MouseTip */ \"./src/MouseTip/index.js\");\n/* harmony import */ var _Global_SplitScreen__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ../../../Global/SplitScreen */ \"./src/Global/SplitScreen/index.js\");\n/* harmony import */ var _Tools_getGoodsList__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ../../../Tools/getGoodsList */ \"./src/Tools/getGoodsList.js\");\n\n\n\n\n\n\n\n\n\n\nfunction _createForOfIteratorHelper(r, e) { var t = \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && \"number\" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t.return || t.return(); } finally { if (u) throw o; } } }; }\nfunction _unsupportedIterableToArray(r, a) { if (r) { if (\"string\" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }\nfunction _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_3___default()(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nfunction _callSuper(t, o, e) { return o = _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_7___default()(o), _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_6___default()(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_7___default()(t).constructor) : o.apply(t, e)); }\nfunction _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }\nfunction _classPrivateFieldInitSpec(e, t, a) { _checkPrivateRedeclaration(e, t), t.set(e, a); }\nfunction _checkPrivateRedeclaration(e, t) { if (t.has(e)) throw new TypeError(\"Cannot initialize the same private elements twice on an object\"); }\nfunction _classPrivateFieldSet(s, a, r) { return s.set(_assertClassBrand(s, a), r), r; }\nfunction _classPrivateFieldGet(s, a) { return s.get(_assertClassBrand(s, a)); }\nfunction _assertClassBrand(e, t, n) { if (\"function\" == typeof e ? e === t : e.has(t)) return arguments.length < 3 ? t : n; throw new TypeError(\"Private element is not present on this object\"); }\n/**\r\n * 点\r\n */\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nvar _positionEditingCallback = /*#__PURE__*/new WeakMap();\nvar BillboardObject = /*#__PURE__*/function (_Base) {\n /**\r\n * @constructor\r\n * @description 点标注\r\n * @param options {object} 属性\r\n * @param options.id {string} 标注id\r\n * @param options.show=true {boolean} 标注整体的显隐\r\n * @param options.name {string} 名称\r\n * @param {object} options.position={} 必填,位置\r\n * @param {number} options.position.lng 经度\r\n * @param {number} options.position.lat 纬度\r\n * @param {number} options.position.alt 高度\r\n * @param {number} options.heightMode=3 高度模式(0:海拔高度;1:相对地表;2:依附地表; 3:依附模型)\r\n * @param [options.scaleByDistance=true] {boolean} 是否开启跟随视野缩放\r\n * @param [options.near=2000] {number} 视野缩放最近距离\r\n * @param [options.far=100000] {number} 视野缩放最远距离\r\n * @param options.billboard {object} 图标参数\r\n * @param [options.billboard.show=true] {boolean} 图标显隐\r\n * @param options.billboard.image {string} 图标路径\r\n * @param options.billboard.defaultImage {string} 默认图标的唯一标识\r\n * @param [options.billboard.scale=3] {number} 图标放大倍数\r\n * @param options.label {object} 文字参数\r\n * @param [options.label.text] {string} 文字内容\r\n * @param [options.label.show=true] {boolean} 文字显隐\r\n * @param [options.label.fontFamily=0] {number} 文字字体项 0:黑体;1:思源黑体;2:庞门正道标题体;3:数黑体\r\n * @param [options.label.fontSize=39] {number} 文字大小, 单位px\r\n * @param [options.label.color=#00ffff] {string} 文字颜色\r\n * @param options.attribute {object} 属性内容\r\n * @param {object} options.attribute.link={} 链接\r\n * @param options.attribute.link.content=[]] {array} 链接内容\r\n * @param options.attribute.link.content[].name {string} 链接名称\r\n * @param options.attribute.link.content[].url {string} 链接地址\r\n * @param {object} options.attribute.vr={} 全景图\r\n * @param options.attribute.vr.content=[]] {array} 全景图内容\r\n * @param options.attribute.vr.content[].name {string} 名称\r\n * @param options.attribute.vr.content[].url {string} 地址\r\n * @param {object} ptions.attribute.camera={} 摄像头\r\n * @param options.attribute.camera.content=[]] {array} 摄像头内容\r\n * @param {object} options.attribute.isc={} isc\r\n * @param options.attribute.isc.content=[]] {array} ISC内容\r\n * @param {object} options.attribute.goods={} 物资\r\n * @param options.attribute.goods.content=[]] {array} 物资内容\r\n * @param options.attribute.goods.content[].ID {string} ID\r\n * @param options.attribute.goods.content[].name {string} 名称\r\n * @param options.attribute.goods.content[].cnt {string} 数量\r\n * @param options.richTextContent {string} 富文本内容\r\n * @param options.customView {object} 默认视角\r\n * @param options.customView.orientation {object} 默认视角方位\r\n * @param options.customView.orientation.heading {number} 航向角\r\n * @param options.customView.orientation.pitch {number} 俯仰角\r\n * @param options.customView.orientation.roll {number} 翻滚角\r\n * @param options.customView.relativePosition {object} 视角相对位置\r\n * @param options.customView.relativePosition.lng {number} 经度\r\n * @param options.customView.relativePosition.lat {number} 纬度\r\n * @param options.customView.relativePosition.alt {number} 高度\r\n * \r\n \r\n \r\n *@param _Dialog {object} 弹框事件\r\n *@param _Dialog.confirmCallBack {function} 弹框确认时的回调\r\n * */\n function BillboardObject(sdk) {\n var _this2;\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var _Dialog = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_4___default()(this, BillboardObject);\n _this2 = _callSuper(this, BillboardObject, [sdk, options]);\n _classPrivateFieldInitSpec(_this2, _positionEditingCallback, null);\n _this2.options.near = options.near || options.near === 0 ? options.near : 2000;\n _this2.options.far = options.far || options.far === 0 ? options.far : 100000;\n _this2.options.scaleByDistance = options.scaleByDistance || options.scaleByDistance === false ? options.scaleByDistance : true;\n _this2.options.show = options.show || options.show === false ? options.show : true;\n _this2.options.heightMode = options.heightMode || options.heightMode == 0 ? options.heightMode : 3;\n _this2.options.billboard = options.billboard = options.billboard || {};\n // this.options.billboard.isSelect = options.billboard.isSelect || false\n _this2.options.billboard.show = options.billboard.show || options.billboard.show === false ? options.billboard.show : true;\n _this2.options.billboard.image = options.billboard.image || Object(_Global_global__WEBPACK_IMPORTED_MODULE_23__[\"getBillboardDefaultUrl\"])(options.billboard.defaultImage) || _this2.getSourceRootPath() + '/img/A-ablu-blank.png';\n _this2.options.billboard.defaultImage = options.billboard.defaultImage;\n _this2.options.billboard.scale = options.billboard.scale || options.billboard.scale === 0 ? options.billboard.scale : 3;\n options.label = options.label || {};\n _this2.options.label = options.label || {};\n _this2.options.label.text = options.label.text || _this2.options.name;\n _this2.options.name = _this2.options.label.text;\n _this2.options.label.show = options.label.show || options.label.show === false ? options.label.show : true;\n _this2.options.label.fontFamily = options.label.fontFamily || 0;\n _this2.options.label.fontSize = options.label.fontSize || 39;\n _this2.options.label.color = options.label.color || '#00ffff';\n _this2.options.position = options.position = options.position || {};\n _this2.options.position.lng = Number(Number(options.position.lng || 0).toFixed(8));\n _this2.options.position.lat = Number(Number(options.position.lat || 0).toFixed(8));\n _this2.options.position.alt = Number(Number(options.position.alt || 0).toFixed(2));\n // this.options.diffuseShow = options.diffuseShow || false\n // this.options.diffuseRadius = (options.diffuseRadius || options.diffuseRadius === 0) ? options.diffuseRadius : 10\n // this.options.diffuseDuration = (options.diffuseDuration || options.diffuseDuration === 0) ? options.diffuseDuration : 2000\n // this.options.diffuseColor = options.diffuseColor || \"#FF0000\"\n // this.options.scanShow = options.scanShow || false\n // this.options.scanRadius = (options.scanRadius || options.scanRadius === 0) ? options.scanRadius : 10\n // this.options.scanDuration = (options.scanDuration || options.scanDuration === 0) ? options.scanDuration : 2000\n // this.options.scanColor = options.scanColor || \"#FF0000\"\n _this2.options.attribute = options.attribute || {};\n _this2.options.attribute.link = _this2.options.attribute.link || {};\n _this2.options.attribute.link.content = _this2.options.attribute.link.content || [];\n _this2.options.attribute.vr = _this2.options.attribute.vr || {};\n _this2.options.attribute.vr.content = _this2.options.attribute.vr.content || [];\n _this2.options.attribute.camera = _this2.options.attribute.camera || {};\n _this2.options.attribute.camera.content = _this2.options.attribute.camera.content || [];\n _this2.options.attribute.isc = _this2.options.attribute.isc || {};\n _this2.options.attribute.isc.content = _this2.options.attribute.isc.content || [];\n _this2.options.attribute.goods = _this2.options.attribute.goods || {};\n _this2.options.attribute.goods.content = _this2.options.attribute.goods.content || [];\n // this.options.coordinate = options.coordinate || ''\n _this2.operate = {};\n _this2._elms = {};\n _this2.previous = {\n position: _objectSpread({}, _this2.options.position)\n };\n // this.options.attributePos = options.attributePos || {\n // x: 60,\n // y: 60,\n // width: 200,\n // height: 120\n // }\n _this2.entity;\n _this2._proj = _this2.sdk.proj;\n\n // // 验证物资\n // let goodsContent = []\n // if(options.attribute && options.attribute.goods && options.attribute.goods.content && Array.isArray(options.attribute.goods.content)) {\n // goodsContent = [...options.attribute.goods.content]\n // }\n // this.options.attribute.goods.content = []\n // if (goodsContent.length > 0) {\n // getGoodsList().then((list)=>{\n // for (let i = goodsContent.length-1; i >= 0; i--) {\n // let falg = false\n // for (let j = 0; j < list.length; j++) {\n // if (goodsContent[i].ID === list[j].ID) {\n // falg = true\n // break\n // }\n // }\n // if(!falg) {\n // goodsContent.splice(i, 1)\n // }\n // }\n // this.options.attribute.goods.content = [...goodsContent]\n // })\n // }\n\n _this2.sdk.addIncetance(_this2.options.id, _this2);\n BillboardObject.create(_this2);\n _this2.picking = true;\n _this2.Dialog = _Dialog;\n _this2._EventBinding = new _Element_Dialog_eventBinding__WEBPACK_IMPORTED_MODULE_12__[\"default\"]();\n return _this2;\n }\n _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_8___default()(BillboardObject, _Base);\n return _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_5___default()(BillboardObject, [{\n key: \"type\",\n get: function get() {\n return 'BillboardObject';\n }\n }, {\n key: \"selectBillboard\",\n value:\n // 选中效果\n function selectBillboard() {\n var that = this;\n this.sdk.viewer.screenSpaceEventHandler.setInputAction(function (click) {\n var pickedObject = that.sdk.viewer.scene.pick(click.position);\n if (Cesium.defined(pickedObject) && pickedObject.id && pickedObject.id.id === 'airportBillboard') {\n if (that.entity.billboard) {\n // 如果点击的是Billboard,给它添加选中效果\n that.entity.billboard.color = Cesium.Color.YELLOW; // 改变颜色\n }\n // 可以添加更多选中效果,例如边框等\n } else {\n if (that.entity.billboard) {\n that.entity.billboard.color = Cesium.Color.WHITE;\n }\n }\n }, Cesium.ScreenSpaceEventType.LEFT_CLICK);\n }\n }, {\n key: \"attributeSelect\",\n get: function get() {\n return [{\n name: '富文本',\n value: '富文本',\n key: 'richText'\n }, {\n name: '链接',\n value: '链接',\n key: 'link'\n }, {\n name: 'IP摄像头',\n value: 'IP摄像头',\n key: 'camera'\n },\n // {\n // name: 'ISC摄像头',\n // value: 'ISC摄像头',\n // key: 'isc'\n // },\n // {\n // name: '传感器',\n // value: '传感器',\n // key: 'sensor'\n // },\n {\n name: '全景图',\n value: '全景图',\n key: 'vr'\n }, {\n name: '物资',\n value: '物资',\n key: 'goods'\n }];\n }\n }, {\n key: \"show\",\n get: function get() {\n return this.options.show;\n },\n set: function set(v) {\n if (!this.isShowView) {\n this.options.show = v;\n this.originalOptions.show = v;\n }\n if (!this.showView || this.showView == 3) {\n this.entity && (this.entity.show = this.options.show);\n } else {\n this.entity && (this.entity.show = false);\n }\n Object(_Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_22__[\"syncData\"])(this.sdk, this.options.id);\n Object(_Global_SplitScreen__WEBPACK_IMPORTED_MODULE_28__[\"syncSplitData\"])(this.sdk, this.options.id);\n if (this._DialogObject && this._DialogObject.showBtn) {\n this._DialogObject.showBtn.checked = this.options.show;\n }\n this.isShowView = false;\n // if (v) {\n // if (this.diffuseShow) {\n // this.diffuseShow = true\n // }\n // if (this.scanShow) {\n // this.scanShow = true\n // }\n // }\n // else {\n // if (this.diffuse) {\n // this.diffuse.show = v\n // }\n // if (this.scan) {\n // this.scan.show = v\n // }\n // }\n }\n }, {\n key: \"heightMode\",\n get: function get() {\n return this.options.heightMode ? this.options.heightMode : 0;\n },\n set: function set(v) {\n var _this3 = this;\n this.options.heightMode = v ? v : 0;\n this.options.heightMode = v || v == 0 ? v : 3;\n var heightMode;\n var heightModeName = '';\n switch (this.options.heightMode) {\n case '0':\n case 0:\n heightMode = Cesium.HeightReference.NONE;\n break;\n case '1':\n case 1:\n heightMode = Cesium.HeightReference.NONE;\n break;\n case '2':\n case 2:\n heightMode = Cesium.HeightReference.CLAMP_TO_GROUND;\n break;\n case '3':\n case 3:\n heightMode = Cesium.HeightReference.NONE;\n var objectsToExclude = [];\n var _iterator = _createForOfIteratorHelper(this.sdk.entityMap),\n _step;\n try {\n for (_iterator.s(); !(_step = _iterator.n()).done;) {\n var _step$value = _babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_2___default()(_step.value, 2),\n key = _step$value[0],\n value = _step$value[1];\n if (value.type === 'RadarScanStereoscopic' && value.entity) {\n objectsToExclude.push(value.entity);\n }\n }\n } catch (err) {\n _iterator.e(err);\n } finally {\n _iterator.f();\n }\n this.getClampToHeight(this.options.position, objectsToExclude).then(function (h) {\n _this3.alt = Number(h.toFixed(2));\n });\n break;\n }\n if (this.entity) {\n this.entity.billboard.heightReference = heightMode;\n this.entity.label.heightReference = heightMode;\n }\n }\n }, {\n key: \"labelText\",\n get: function get() {\n return this.options.label.text;\n },\n set: function set(v) {\n this.options.label.text = v;\n this.options.name = v;\n this.entity && (this.entity.label.text = v + '');\n this._elms.labelText && this._elms.labelText.forEach(function (item) {\n item.value = v;\n });\n }\n }, {\n key: \"lng\",\n get: function get() {\n return this.options.position.lng;\n },\n set: function set(v) {\n this.options.position.lng = Number(Number(v).toFixed(8));\n // this.scan && (this.scan.lng = v)\n // this.diffuse && (this.diffuse.lng = v)\n this.renewPoint();\n this.coordinate = this.options.coordinate;\n this._projConvert && this._projConvert();\n this._elms.lng && this._elms.lng.forEach(function (item) {\n item.value = v;\n });\n }\n }, {\n key: \"lat\",\n get: function get() {\n return this.options.position.lat;\n },\n set: function set(v) {\n this.options.position.lat = Number(Number(v).toFixed(8));\n // this.scan && (this.scan.lat = v)\n // this.diffuse && (this.diffuse.lat = v)\n this.renewPoint();\n this.coordinate = this.options.coordinate;\n this._projConvert && this._projConvert();\n this._elms.lat && this._elms.lat.forEach(function (item) {\n item.value = v;\n });\n }\n }, {\n key: \"alt\",\n get: function get() {\n return this.options.position.alt;\n },\n set: function set(v) {\n this.options.position.alt = Number(Number(v).toFixed(2));\n // this.scan && (this.scan.alt = v)\n // this.diffuse && (this.diffuse.alt = v)\n this.renewPoint();\n this.coordinate = this.options.coordinate;\n }\n }, {\n key: \"near\",\n get: function get() {\n return this.options.near;\n },\n set: function set(v) {\n var near = v;\n if (near > this.far) {\n near = this.far;\n }\n this.options.near = near;\n this.renewPoint();\n this._elms.near && this._elms.near.forEach(function (item) {\n item.value = near;\n });\n }\n }, {\n key: \"far\",\n get: function get() {\n return this.options.far;\n },\n set: function set(v) {\n var far = v;\n if (far < this.near) {\n far = this.near;\n }\n this.options.far = far;\n this.renewPoint();\n this._elms.far && this._elms.far.forEach(function (item) {\n item.value = far;\n });\n }\n }, {\n key: \"scaleByDistance\",\n get: function get() {\n return this.options.scaleByDistance;\n },\n set: function set(v) {\n this.options.scaleByDistance = v;\n this.renewPoint();\n this._elms.scaleByDistance && this._elms.scaleByDistance.forEach(function (item) {\n item.checked = v;\n });\n }\n }, {\n key: \"billboardShow\",\n get: function get() {\n return this.options.billboard.show;\n },\n set: function set(v) {\n this.options.billboard.show = v;\n this.entity && (this.entity.billboard.color = this.options.billboard.show ? undefined : new Cesium.Color(1.0, 1.0, 1.0, 0));\n this._elms.billboardShow && this._elms.billboardShow.forEach(function (item) {\n item.value = v;\n });\n }\n }, {\n key: \"billboardImage\",\n get: function get() {\n var url = this.options.billboard.image;\n if (url && !url.startsWith(\"http\")) {\n //说明是本地的json,在磁盘中存在的\n if (!url.includes(\":\")) {\n if (this.options.host) {\n var o = new URL(url, this.options.host);\n url = o.href;\n }\n }\n }\n return url;\n },\n set: function set(v) {\n var _this = this;\n this.options.billboard.image = this.replaceHost(v, this.options.host);\n var url = this.options.billboard.image || Object(_Global_global__WEBPACK_IMPORTED_MODULE_23__[\"getBillboardDefaultUrl\"])(this.options.billboard.defaultImage) || this.getSourceRootPath() + '/img/A-ablu-blank.png';\n this._elms.billboardImage && this._elms.billboardImage.forEach(function (item) {\n item.src = url;\n });\n var isGlf = false;\n var superGif;\n if (_this.entity.billboard.image && _this.entity.billboard.image.getVa) {}\n if (url && url.endsWith('gif')) {\n isGlf = true;\n var gifImg = document.createElement('img');\n gifImg.setAttribute('rel:animated_src', url);\n gifImg.setAttribute('rel:auto_play', '1');\n var imgDiv = document.createElement('div');\n imgDiv.appendChild(gifImg);\n var id = Cesium.createGuid();\n superGif = new SuperGif({\n gif: gifImg\n });\n this._superGif = superGif;\n this._superGif.id = id;\n var billboardH = 36;\n var index = 0;\n _this._frameImages = [];\n superGif.load(function (status) {\n if (status == 404) {\n var _width = 31;\n var _height = 36;\n document.createElement('canvas'), _babel_runtime_helpers_readOnlyError__WEBPACK_IMPORTED_MODULE_1___default()(\"canvas\");\n canvas.width = 0;\n canvas.height = 0;\n billboardH = 0;\n _this.entity.billboard.imgWidth = 0;\n _this.entity.billboard.imgHeight = 0;\n _this.entity && (_this.entity.billboard.image = canvas);\n _this.entity.billboard.height = new Cesium.CallbackProperty(function () {\n return 0;\n }, false);\n _this.entity.label.pixelOffset = new Cesium.CallbackProperty(function () {\n return new Cesium.Cartesian2(0, 0);\n }, false);\n billboardH = _height * (31 / _width);\n return;\n }\n if (_this._superGif.id != id) {\n return;\n }\n var length = superGif.get_length();\n for (var i = 1; i <= length; i++) {\n superGif.move_to(i);\n _this._frameImages.push(superGif.get_canvas().toDataURL());\n }\n var canvas = superGif.get_canvas();\n var width = canvas.width;\n var height = canvas.height;\n billboardH = height * (31 / width);\n _this.entity.billboard.imgWidth = width;\n _this.entity.billboard.imgHeight = height;\n _this.entity && (_this.entity.billboard.image = new Cesium.CallbackProperty(function () {\n var img = _this._frameImages[index];\n index = index >= _this._frameImages.length - 1 ? 0 : index + 1;\n return img;\n }, false));\n _this.entity.billboard.height = new Cesium.CallbackProperty(function () {\n return billboardH;\n }, false);\n _this.entity.label.pixelOffset = new Cesium.CallbackProperty(function () {\n if (_this.options.billboard.show) {\n return new Cesium.Cartesian2(0, -billboardH * _this.options.billboard.scale - _this.options.label.fontSize / 2 - 5);\n } else {\n return new Cesium.Cartesian2(0, -_this.options.label.fontSize / 2 - 5);\n }\n }, false);\n });\n } else {\n var image = new Image();\n image.src = url;\n var _billboardH = 36;\n var canvas = document.createElement('canvas');\n image.onload = function () {\n var ratio = image.width / image.height;\n image.width = 100;\n image.height = 100 / ratio;\n var width = image.width;\n var height = image.height;\n var ctx = canvas.getContext('2d', {\n willReadFrequently: true\n });\n canvas.width = width;\n canvas.height = height;\n ctx.drawImage(image, 0, 0, width, height);\n _billboardH = height * (31 / width);\n _this.entity.billboard.imgWidth = width;\n _this.entity.billboard.imgHeight = height;\n _this.entity && (_this.entity.billboard.image = canvas);\n _this.entity.billboard.height = new Cesium.CallbackProperty(function () {\n return _billboardH;\n }, false);\n _this.entity.label.pixelOffset = new Cesium.CallbackProperty(function () {\n if (_this.options.billboard.show) {\n return new Cesium.Cartesian2(0, -_billboardH * _this.options.billboard.scale - _this.options.label.fontSize / 2 - 5);\n } else {\n return new Cesium.Cartesian2(0, -_this.options.label.fontSize / 2 - 5);\n }\n }, false);\n _billboardH = height * (31 / width);\n };\n image.onerror = function (err) {\n var width = 31;\n var height = 36;\n canvas.width = 0;\n canvas.height = 0;\n _billboardH = 0;\n _this.entity.billboard.imgWidth = 0;\n _this.entity.billboard.imgHeight = 0;\n _this.entity && (_this.entity.billboard.image = canvas);\n _this.entity.billboard.height = new Cesium.CallbackProperty(function () {\n return 0;\n }, false);\n _this.entity.label.pixelOffset = new Cesium.CallbackProperty(function () {\n return new Cesium.Cartesian2(0, 0);\n }, false);\n _billboardH = height * (31 / width);\n };\n }\n }\n }, {\n key: \"billboardScale\",\n get: function get() {\n return this.options.billboard.scale;\n },\n set: function set(v) {\n this.options.billboard.scale = v;\n this.renewPoint();\n this._elms.billboardScale && this._elms.billboardScale.forEach(function (item) {\n item.value = v;\n });\n }\n }, {\n key: \"labelShow\",\n get: function get() {\n return this.options.label.show;\n },\n set: function set(v) {\n this.options.label.show = v;\n this.entity && (this.entity.label.show = v);\n this._elms.labelShow && this._elms.labelShow.forEach(function (item) {\n item.value = v;\n });\n }\n }, {\n key: \"labelFontFamily\",\n get: function get() {\n return this.options.label.fontFamily;\n },\n set: function set(v) {\n this.options.label.fontFamily = v || 0;\n this.renewPoint();\n var name = Object(_Element_fontSelect__WEBPACK_IMPORTED_MODULE_26__[\"getFontFamilyName\"])(this.labelFontFamily) || '';\n this._elms.labelFontFamily && this._elms.labelFontFamily.forEach(function (item) {\n item.value = name;\n });\n }\n }, {\n key: \"labelFontSize\",\n get: function get() {\n return this.options.label.fontSize;\n },\n set: function set(v) {\n this.options.label.fontSize = v;\n this.renewPoint();\n this._elms.labelFontSize && this._elms.labelFontSize.forEach(function (item) {\n item.value = v;\n });\n }\n }, {\n key: \"labelColor\",\n get: function get() {\n return this.options.label.color;\n },\n set: function set(v) {\n var _this4 = this;\n this.options.label.color = v || '#00ffff';\n this.renewPoint();\n if (this._elms.labelColor) {\n this._elms.labelColor.forEach(function (item, i) {\n var colorPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: _this4.options.label.color,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(c) {\n _this4.labelColor = c;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this4.labelColor = 'rgba(0,255,255,1)';\n } //点击清空按钮事件回调\n });\n _this4._elms.labelColor[i] = colorPicker;\n });\n }\n }\n\n // get diffuseShow() {\n // return this.options.diffuseShow\n // }\n // set diffuseShow(v) {\n // this.options.diffuseShow = v\n // this._elms.diffuseShow && this._elms.diffuseShow.forEach((item) => {\n // item.checked = v\n // })\n // if (v && this.scanShow) {\n // this.scanShow = false\n // }\n // if (this.diffuse) {\n // if (this.show) {\n // this.diffuse.show = this.options.diffuseShow\n // }\n // }\n // else {\n // this.diffuse = new CircleDiffuse(this.sdk, { show: this.diffuseShow, lng: this.lng, lat: this.lat, radius: this.diffuseRadius, duration: this.diffuseDuration, color: this.diffuseColor })\n // }\n // }\n\n // get diffuseRadius() {\n // return this.options.diffuseRadius\n // }\n // set diffuseRadius(v) {\n // this.options.diffuseRadius = v\n // this._elms.diffuseRadius && this._elms.diffuseRadius.forEach((item) => {\n // item.value = v\n // })\n // if (this.diffuse) {\n // this.diffuse.radius = this.options.diffuseRadius\n // }\n // }\n\n // get diffuseDuration() {\n // return this.options.diffuseDuration\n // }\n // set diffuseDuration(v) {\n // this.options.diffuseDuration = v\n // this._elms.diffuseDuration && this._elms.diffuseDuration.forEach((item) => {\n // item.value = v\n // })\n // if (this.diffuse) {\n // this.diffuse.duration = this.options.diffuseDuration\n // }\n // }\n\n // get diffuseColor() {\n // return this.options.diffuseColor\n // }\n // set diffuseColor(v) {\n // this.options.diffuseColor = v\n // if (this._elms.diffuseColor) {\n // this._elms.diffuseColor.forEach((item, i) => {\n // let diffuseColorPicker = new YJColorPicker({\n // el: item.el,\n // size: 'mini',//颜色box类型\n // alpha: false,//是否开启透明度\n // defaultColor: v,\n // disabled: false,//是否禁止打开颜色选择器\n // openPickerAni: 'opacity',//打开颜色选择器动画\n // sure: (c) => {\n // this.diffuseColor = c\n // },//点击确认按钮事件回调\n // clear: () => {\n // this.diffuseColor = 'rgba(255,255,255,1)'\n // },//点击清空按钮事件回调\n // })\n // this._elms.diffuseColor[i] = diffuseColorPicker\n // })\n // }\n // if (this.diffuse) {\n // this.diffuse.color = this.options.diffuseColor\n // }\n // }\n\n // get scanShow() {\n // return this.options.scanShow\n // }\n // set scanShow(v) {\n // this.options.scanShow = v\n // this._elms.scanShow && this._elms.scanShow.forEach((item) => {\n // item.checked = v\n // })\n // if (v && this.diffuseShow) {\n // this.diffuseShow = false\n // }\n // if (this.scan) {\n // if (this.show) {\n // this.scan.show = this.options.scanShow\n // }\n // }\n // else {\n // this.scan = new RadarScan(this.sdk, { show: this.scanShow, lng: this.lng, lat: this.lat, radius: this.scanRadius, duration: this.scanDuration, color: this.scanColor })\n // }\n // }\n\n // get scanRadius() {\n // return this.options.scanRadius\n // }\n // set scanRadius(v) {\n // this.options.scanRadius = v\n // this._elms.scanRadius && this._elms.scanRadius.forEach((item) => {\n // item.value = v\n // })\n // if (this.scan) {\n // this.scan.radius = this.options.scanRadius\n // }\n // }\n\n // get scanDuration() {\n // return this.options.scanDuration\n // }\n // set scanDuration(v) {\n // this.options.scanDuration = v\n // this._elms.scanDuration && this._elms.scanDuration.forEach((item) => {\n // item.value = v\n // })\n // if (this.scan) {\n // this.scan.duration = this.options.scanDuration\n // }\n // }\n\n // get scanColor() {\n // return this.options.scanColor\n // }\n // set scanColor(v) {\n // this.options.scanColor = v\n // if (this._elms.scanColor) {\n // this._elms.scanColor.forEach((item, i) => {\n // let scanColorPicker = new YJColorPicker({\n // el: item.el,\n // size: 'mini',//颜色box类型\n // alpha: false,//是否开启透明度\n // defaultColor: v,\n // disabled: false,//是否禁止打开颜色选择器\n // openPickerAni: 'opacity',//打开颜色选择器动画\n // sure: (c) => {\n // this.scanColor = c\n // },//点击确认按钮事件回调\n // clear: () => {\n // this.scanColor = 'rgba(255,255,255,1)'\n // },//点击清空按钮事件回调\n // })\n // this._elms.scanColor[i] = scanColorPicker\n // })\n // }\n // if (this.scan) {\n // this.scan.color = this.options.scanColor\n // }\n // }\n }, {\n key: \"attributeLink\",\n get: function get() {\n return this.options.attribute.link.content;\n },\n set: function set(v) {\n var _this5 = this;\n this.options.attribute.link.content = v;\n if (!this._DialogObject || !this._DialogObject._element || !this._DialogObject._element.content || this._DialogObject._element.content.getElementsByClassName('attribute-content-link').length == 0) {\n return;\n }\n var table = this._DialogObject._element.content.getElementsByClassName('attribute-content-link')[1].getElementsByClassName('table')[0];\n var tableContent = table.getElementsByClassName('table-body')[0];\n tableContent.innerHTML = '';\n if (this.options.attribute.link.content.length > 0) {\n table.getElementsByClassName('table-empty')[0].style.display = 'none';\n } else {\n table.getElementsByClassName('table-empty')[0].style.display = 'flex';\n }\n for (var i = 0; i < this.options.attribute.link.content.length; i++) {\n var tr = \"\\n
\\n
\" + this.options.attribute.link.content[i].name + \"
\\n
\" + this.options.attribute.link.content[i].url + \"
\\n
\\n \\n \\n
\\n
\";\n var trElm = document.createRange().createContextualFragment(tr);\n tableContent.appendChild(trElm);\n }\n var item = tableContent.getElementsByClassName('tr');\n var fun = {\n linkEdit: function () {\n var _linkEdit = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_9___default.a.mark(function _callee(index) {\n var table, tableContent, item, _loop, _i;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_9___default.a.wrap(function _callee$(_context3) {\n while (1) switch (_context3.prev = _context3.next) {\n case 0:\n _context3.next = 2;\n return _this5.options.attribute.link.content;\n case 2:\n _this5.attributeLink = _context3.sent;\n table = _this5._DialogObject._element.content.getElementsByClassName('attribute-content-link')[1].getElementsByClassName('table')[0];\n tableContent = table.getElementsByClassName('table-body')[0];\n item = tableContent.getElementsByClassName('tr');\n _loop = /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_9___default.a.mark(function _loop(_i) {\n var height, _html, textareaElm, td, btn, n, _iterator2, _step2, _loop2;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_9___default.a.wrap(function _loop$(_context2) {\n while (1) switch (_context2.prev = _context2.next) {\n case 0:\n if (!(index === _i)) {\n _context2.next = 36;\n break;\n }\n height = item[_i].offsetHeight;\n _html = \"\\n
\\n \\n
\\n
\\n \\n
\\n
\\n \\n \\n
\";\n item[_i].innerHTML = _html;\n textareaElm = item[_i].getElementsByClassName('link-edit')[0];\n textareaElm.style.height = height - 10 + 'px';\n td = item[_i].getElementsByClassName('td');\n td[0].getElementsByClassName('input')[0].value = _this5.options.attribute.link.content[index].name;\n td[1].getElementsByClassName('input')[0].value = _this5.options.attribute.link.content[index].url;\n btn = item[_i].getElementsByTagName('button');\n n = 0;\n case 11:\n if (!(n < btn.length)) {\n _context2.next = 35;\n break;\n }\n if (!(!btn[n] || !btn[n].attributes)) {\n _context2.next = 14;\n break;\n }\n return _context2.abrupt(\"continue\", 32);\n case 14:\n _iterator2 = _createForOfIteratorHelper(btn[n].attributes);\n _context2.prev = 15;\n _loop2 = /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_9___default.a.mark(function _loop2() {\n var m;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_9___default.a.wrap(function _loop2$(_context) {\n while (1) switch (_context.prev = _context.next) {\n case 0:\n m = _step2.value;\n if (!(m.name === '@click')) {\n _context.next = 5;\n break;\n }\n btn[n].addEventListener('click', function (e) {\n if (typeof fun[m.value] === 'function') {\n fun[m.value]({\n name: td[0].getElementsByClassName('input')[0].value,\n url: td[1].getElementsByClassName('input')[0].value\n }, _i);\n }\n });\n btn[n].attributes.removeNamedItem(m.name);\n return _context.abrupt(\"return\", 1);\n case 5:\n case \"end\":\n return _context.stop();\n }\n }, _loop2);\n });\n _iterator2.s();\n case 18:\n if ((_step2 = _iterator2.n()).done) {\n _context2.next = 24;\n break;\n }\n return _context2.delegateYield(_loop2(), \"t0\", 20);\n case 20:\n if (!_context2.t0) {\n _context2.next = 22;\n break;\n }\n return _context2.abrupt(\"break\", 24);\n case 22:\n _context2.next = 18;\n break;\n case 24:\n _context2.next = 29;\n break;\n case 26:\n _context2.prev = 26;\n _context2.t1 = _context2[\"catch\"](15);\n _iterator2.e(_context2.t1);\n case 29:\n _context2.prev = 29;\n _iterator2.f();\n return _context2.finish(29);\n case 32:\n n++;\n _context2.next = 11;\n break;\n case 35:\n return _context2.abrupt(\"return\", 1);\n case 36:\n case \"end\":\n return _context2.stop();\n }\n }, _loop, null, [[15, 26, 29, 32]]);\n });\n _i = 0;\n case 8:\n if (!(_i < item.length)) {\n _context3.next = 15;\n break;\n }\n return _context3.delegateYield(_loop(_i), \"t0\", 10);\n case 10:\n if (!_context3.t0) {\n _context3.next = 12;\n break;\n }\n return _context3.abrupt(\"break\", 15);\n case 12:\n _i++;\n _context3.next = 8;\n break;\n case 15:\n case \"end\":\n return _context3.stop();\n }\n }, _callee);\n }));\n function linkEdit(_x) {\n return _linkEdit.apply(this, arguments);\n }\n return linkEdit;\n }(),\n linkDelete: function linkDelete(i) {\n _this5.options.attribute.link.content.splice(i, 1);\n _this5.attributeLink = _this5.options.attribute.link.content;\n },\n confirmEdit: function confirmEdit(value, i) {\n var name = value.name && value.name.replace(/\\s/g, '');\n var url = value.url && value.url.replace(/\\s/g, '');\n if (name && url) {\n _this5.options.attribute.link.content[i] = value;\n } else {\n window.ELEMENT && window.ELEMENT.Message({\n message: '名称或链接不能为空!',\n type: 'warning',\n duration: 1500\n });\n }\n _this5.attributeLink = _this5.options.attribute.link.content;\n },\n cancelEdit: function cancelEdit() {\n _this5.attributeLink = _this5.options.attribute.link.content;\n },\n fileSelect: function fileSelect(value, i) {\n var fileElm = item[i].getElementsByClassName('file-select')[0];\n fileElm.click();\n fileElm.removeEventListener('change', _fileSelect);\n fileElm.addEventListener('change', _fileSelect);\n }\n };\n var _fileSelect = function _fileSelect(event) {\n if (event.target.value) {\n var td = item[event.target.getAttribute('index')].getElementsByClassName('td');\n td[1].getElementsByClassName('input')[0].value = event.target.value;\n event.target.value = null;\n }\n };\n var _loop3 = function _loop3(_i2) {\n var btn = item[_i2].getElementsByTagName('button');\n for (var n = 0; n < btn.length; n++) {\n if (!btn[n] || !btn[n].attributes) {\n continue;\n }\n var _iterator3 = _createForOfIteratorHelper(btn[n].attributes),\n _step3;\n try {\n var _loop4 = function _loop4() {\n var m = _step3.value;\n if (m.name === '@click') {\n btn[n].addEventListener('click', function (e) {\n if (typeof fun[m.value] === 'function') {\n fun[m.value](_i2);\n }\n });\n btn[n].attributes.removeNamedItem(m.name);\n return 1; // break\n }\n };\n for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {\n if (_loop4()) break;\n }\n } catch (err) {\n _iterator3.e(err);\n } finally {\n _iterator3.f();\n }\n }\n };\n for (var _i2 = 0; _i2 < item.length; _i2++) {\n _loop3(_i2);\n }\n }\n }, {\n key: \"attributeCamera\",\n get: function get() {\n return this.options.attribute.camera.content;\n },\n set: function set(v) {\n this.options.attribute.camera.content = v;\n }\n }, {\n key: \"attributeISC\",\n get: function get() {\n return this.options.attribute.isc.content;\n },\n set: function set(v) {\n this.options.attribute.isc.content = v;\n }\n }, {\n key: \"attributeVr\",\n get: function get() {\n return this.options.attribute.vr.content;\n },\n set: function set(v) {\n var _this6 = this;\n this.options.attribute.vr.content = v;\n if (!this._DialogObject || !this._DialogObject._element || !this._DialogObject._element.content || this._DialogObject._element.content.getElementsByClassName('attribute-content-vr').length == 0) {\n return;\n }\n var table = this._DialogObject._element.content.getElementsByClassName('attribute-content-vr')[1].getElementsByClassName('table')[0];\n var tableContent = table.getElementsByClassName('table-body')[0];\n tableContent.innerHTML = '';\n if (this.options.attribute.vr.content.length > 0) {\n table.getElementsByClassName('table-empty')[0].style.display = 'none';\n } else {\n table.getElementsByClassName('table-empty')[0].style.display = 'flex';\n }\n for (var i = 0; i < this.options.attribute.vr.content.length; i++) {\n var tr = \"\\n
\\n
\" + this.options.attribute.vr.content[i].name + \"
\\n
\" + this.options.attribute.vr.content[i].url + \"
\\n
\\n \\n \\n
\\n
\";\n var trElm = document.createRange().createContextualFragment(tr);\n tableContent.appendChild(trElm);\n }\n var item = tableContent.getElementsByClassName('tr');\n var fun = {\n vrEdit: function () {\n var _vrEdit = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_9___default.a.mark(function _callee2(index) {\n var table, tableContent, item, _loop5, _i3;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_9___default.a.wrap(function _callee2$(_context6) {\n while (1) switch (_context6.prev = _context6.next) {\n case 0:\n _context6.next = 2;\n return _this6.options.attribute.vr.content;\n case 2:\n _this6.attributeVr = _context6.sent;\n table = _this6._DialogObject._element.content.getElementsByClassName('attribute-content-vr')[1].getElementsByClassName('table')[0];\n tableContent = table.getElementsByClassName('table-body')[0];\n item = tableContent.getElementsByClassName('tr');\n _loop5 = /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_9___default.a.mark(function _loop5(_i3) {\n var height, _html2, textareaElm, td, btn, n, _iterator4, _step4, _loop6;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_9___default.a.wrap(function _loop5$(_context5) {\n while (1) switch (_context5.prev = _context5.next) {\n case 0:\n if (!(index === _i3)) {\n _context5.next = 36;\n break;\n }\n height = item[_i3].offsetHeight;\n _html2 = \"\\n
\\n \\n
\\n
\\n \\n
\\n
\\n \\n \\n
\";\n item[_i3].innerHTML = _html2;\n textareaElm = item[_i3].getElementsByClassName('link-edit')[0];\n textareaElm.style.height = height - 10 + 'px';\n td = item[_i3].getElementsByClassName('td');\n td[0].getElementsByClassName('input')[0].value = _this6.options.attribute.vr.content[index].name;\n td[1].getElementsByClassName('input')[0].value = _this6.options.attribute.vr.content[index].url;\n btn = item[_i3].getElementsByTagName('button');\n n = 0;\n case 11:\n if (!(n < btn.length)) {\n _context5.next = 35;\n break;\n }\n if (!(!btn[n] || !btn[n].attributes)) {\n _context5.next = 14;\n break;\n }\n return _context5.abrupt(\"continue\", 32);\n case 14:\n _iterator4 = _createForOfIteratorHelper(btn[n].attributes);\n _context5.prev = 15;\n _loop6 = /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_9___default.a.mark(function _loop6() {\n var m;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_9___default.a.wrap(function _loop6$(_context4) {\n while (1) switch (_context4.prev = _context4.next) {\n case 0:\n m = _step4.value;\n if (!(m.name === '@click')) {\n _context4.next = 5;\n break;\n }\n btn[n].addEventListener('click', function (e) {\n if (typeof fun[m.value] === 'function') {\n fun[m.value]({\n name: td[0].getElementsByClassName('input')[0].value,\n url: td[1].getElementsByClassName('input')[0].value\n }, _i3);\n }\n });\n btn[n].attributes.removeNamedItem(m.name);\n return _context4.abrupt(\"return\", 1);\n case 5:\n case \"end\":\n return _context4.stop();\n }\n }, _loop6);\n });\n _iterator4.s();\n case 18:\n if ((_step4 = _iterator4.n()).done) {\n _context5.next = 24;\n break;\n }\n return _context5.delegateYield(_loop6(), \"t0\", 20);\n case 20:\n if (!_context5.t0) {\n _context5.next = 22;\n break;\n }\n return _context5.abrupt(\"break\", 24);\n case 22:\n _context5.next = 18;\n break;\n case 24:\n _context5.next = 29;\n break;\n case 26:\n _context5.prev = 26;\n _context5.t1 = _context5[\"catch\"](15);\n _iterator4.e(_context5.t1);\n case 29:\n _context5.prev = 29;\n _iterator4.f();\n return _context5.finish(29);\n case 32:\n n++;\n _context5.next = 11;\n break;\n case 35:\n return _context5.abrupt(\"return\", 1);\n case 36:\n case \"end\":\n return _context5.stop();\n }\n }, _loop5, null, [[15, 26, 29, 32]]);\n });\n _i3 = 0;\n case 8:\n if (!(_i3 < item.length)) {\n _context6.next = 15;\n break;\n }\n return _context6.delegateYield(_loop5(_i3), \"t0\", 10);\n case 10:\n if (!_context6.t0) {\n _context6.next = 12;\n break;\n }\n return _context6.abrupt(\"break\", 15);\n case 12:\n _i3++;\n _context6.next = 8;\n break;\n case 15:\n case \"end\":\n return _context6.stop();\n }\n }, _callee2);\n }));\n function vrEdit(_x2) {\n return _vrEdit.apply(this, arguments);\n }\n return vrEdit;\n }(),\n vrDelete: function vrDelete(i) {\n _this6.options.attribute.vr.content.splice(i, 1);\n _this6.attributeVr = _this6.options.attribute.vr.content;\n },\n confirmEdit: function confirmEdit(value, i) {\n var name = value.name && value.name.replace(/\\s/g, '');\n var url = value.url && value.url.replace(/\\s/g, '');\n if (name && url) {\n _this6.options.attribute.vr.content[i] = value;\n } else {\n window.ELEMENT && window.ELEMENT.Message({\n message: '名称或链接不能为空!',\n type: 'warning',\n duration: 1500\n });\n }\n _this6.attributeVr = _this6.options.attribute.vr.content;\n },\n cancelEdit: function cancelEdit() {\n _this6.attributeVr = _this6.options.attribute.vr.content;\n },\n fileSelect: function fileSelect(value, i) {\n var fileElm = item[i].getElementsByClassName('file-select')[0];\n fileElm.click();\n fileElm.removeEventListener('change', _fileSelect2);\n fileElm.addEventListener('change', _fileSelect2);\n }\n };\n var _fileSelect2 = function _fileSelect2(event) {\n if (event.target.value) {\n var td = item[event.target.getAttribute('index')].getElementsByClassName('td');\n td[1].getElementsByClassName('input')[0].value = event.target.value;\n event.target.value = null;\n }\n };\n var _loop7 = function _loop7(_i4) {\n var btn = item[_i4].getElementsByTagName('button');\n for (var n = 0; n < btn.length; n++) {\n if (!btn[n] || !btn[n].attributes) {\n continue;\n }\n var _iterator5 = _createForOfIteratorHelper(btn[n].attributes),\n _step5;\n try {\n var _loop8 = function _loop8() {\n var m = _step5.value;\n if (m.name === '@click') {\n btn[n].addEventListener('click', function (e) {\n if (typeof fun[m.value] === 'function') {\n fun[m.value](_i4);\n }\n });\n btn[n].attributes.removeNamedItem(m.name);\n return 1; // break\n }\n };\n for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {\n if (_loop8()) break;\n }\n } catch (err) {\n _iterator5.e(err);\n } finally {\n _iterator5.f();\n }\n }\n };\n for (var _i4 = 0; _i4 < item.length; _i4++) {\n _loop7(_i4);\n }\n }\n }, {\n key: \"attributeGoods\",\n get: function get() {\n return this.options.attribute.goods.content;\n },\n set: function set(v) {\n this.options.attribute.goods.content = v;\n }\n }, {\n key: \"billboardDefaultImage\",\n get: function get() {\n return Object(_Global_global__WEBPACK_IMPORTED_MODULE_23__[\"getBillboardDefaultUrl\"])(this.options.billboard.defaultImage) || this.getSourceRootPath() + '/img/A-ablu-blank.png';\n },\n set: function set(v) {\n var url = this.replaceHost(v, this.options.host);\n Object(_Global_global__WEBPACK_IMPORTED_MODULE_23__[\"setBillboardDefaultUrl\"])(url, this.options.billboard.defaultImage);\n this._elms.billboardDefaultImage && this._elms.billboardDefaultImage.forEach(function (item) {\n item.src = url;\n });\n }\n }, {\n key: \"coordinate\",\n get: function get() {\n return this.options.coordinate;\n },\n set: function set(v) {\n return;\n this.options.coordinate = v;\n var position = this._proj.convert([{\n x: this.options.position.lng,\n y: this.options.position.lat,\n z: this.options.position.alt\n }], 'EPSG:4326', v).points;\n if (this._DialogObject && this._DialogObject._element && this._DialogObject._element.content && position[0]) {\n this._DialogObject._element.content.getElementsByClassName('convert-x')[0].value = position[0].x;\n this._DialogObject._element.content.getElementsByClassName('convert-y')[0].value = position[0].y;\n this._DialogObject._element.content.getElementsByClassName('convert-z')[0].value = position[0].z;\n }\n this._elms.coordinate && this._elms.coordinate.forEach(function (item) {\n item.value = v;\n });\n }\n\n /**\r\n * @description 编辑框\r\n * @param state=false {boolean} 状态: true打开, false关闭\r\n */\n }, {\n key: \"edit\",\n value: (function () {\n var _edit = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_9___default.a.mark(function _callee4() {\n var _this7 = this;\n var state,\n _this,\n contentElm,\n tabsElm,\n colorPicker,\n all_elm,\n lngEln,\n latEln,\n projCheckboxBoxElms,\n projCheckboxElms,\n projInputBoxElms,\n _args8 = arguments;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_9___default.a.wrap(function _callee4$(_context8) {\n while (1) switch (_context8.prev = _context8.next) {\n case 0:\n state = _args8.length > 0 && _args8[0] !== undefined ? _args8[0] : false;\n return _context8.abrupt(\"return\");\n case 8:\n this._DialogObject = _context8.sent;\n this._DialogObject._element.body.className = this._DialogObject._element.body.className + ' billboard-object';\n contentElm = document.createElement('div');\n contentElm.innerHTML = Object(_element__WEBPACK_IMPORTED_MODULE_16__[\"html\"])(this);\n this._DialogObject.contentAppChild(contentElm);\n this.attributeCamera = this.options.attribute.camera.content;\n this.attributeISC = this.options.attribute.isc.content;\n\n // let coordinateElm = contentElm.getElementsByClassName('coordinate-select')[0]\n // let option = ''\n // this._proj.epsg_map.forEach((value, key) => {\n // if (!this.options.coordinate) {\n // this.options.coordinate = key\n // this.originalOptions.coordinate = key\n // }\n // option += ``\n // })\n // coordinateElm.innerHTML = option\n // this.coordinate = this.options.coordinate\n\n // 创建标签页\n tabsElm = new _Element_cy_html_tabs__WEBPACK_IMPORTED_MODULE_14__[\"default\"]('point-object-edit-tabs', undefined, this.sdk); // 颜色组件\n colorPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName('labelColor')[0],\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: this.labelColor,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this7.labelColor = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this7.labelColor = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n }); // let diffuseColorPicker = new YJColorPicker({\n // el: contentElm.getElementsByClassName(\"diffuseColor\")[0],\n // size: 'mini',//颜色box类型\n // alpha: false,//是否开启透明度\n // defaultColor: this.diffuseColor,\n // disabled: false,//是否禁止打开颜色选择器\n // openPickerAni: 'opacity',//打开颜色选择器动画\n // sure: (color) => {\n // this.diffuseColor = color\n // },//点击确认按钮事件回调\n // clear: () => {\n // this.diffuseColor = 'rgba(255,255,255,1)'\n // },//点击清空按钮事件回调\n // })\n // let scanColorPicker = new YJColorPicker({\n // el: contentElm.getElementsByClassName(\"scanColor\")[0],\n // size: 'mini',//颜色box类型\n // alpha: false,//是否开启透明度\n // defaultColor: this.scanColor,\n // disabled: false,//是否禁止打开颜色选择器\n // openPickerAni: 'opacity',//打开颜色选择器动画\n // sure: (color) => {\n // this.scanColor = color\n // },//点击确认按钮事件回调\n // clear: () => {\n // this.scanColor = 'rgba(255,255,255,1)'\n // },//点击清空按钮事件回调\n // })\n all_elm = contentElm.getElementsByTagName('*');\n this._EventBinding.on(this, all_elm);\n this._elms = this._EventBinding.element;\n this._elms.labelColor = [colorPicker];\n // this._elms.diffuseColor = [diffuseColorPicker]\n // this._elms.scanColor = [scanColorPicker]\n\n setTimeout(/*#__PURE__*/_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_9___default.a.mark(function _callee3() {\n var col, row, tagData, attributeElm, legpObject, attributeSelectElm, i, coordinateData, coordinateDataLegpObject, coordinateDataLegpElm, _i6, heightBoxElm, heightElm, heightModeData, heightMode, objectsToExclude, _iterator6, _step6, _step6$value, key, value, heightModeObject, heightModeDataLegpElm, _i8, fontData, fontObject, fontDataLegpElm, _i10;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_9___default.a.wrap(function _callee3$(_context7) {\n while (1) switch (_context7.prev = _context7.next) {\n case 0:\n _this7.attributeLink = _this7.options.attribute.link.content;\n _this7.attributeVr = _this7.options.attribute.vr.content;\n // this.attributeCamera = this.options.attribute.camera\n _this7.cameraSelect && _this7.cameraSelect();\n _this7.ISCSelect && _this7.ISCSelect();\n _this7.goodsSelect && _this7.goodsSelect();\n col = document.createElement('div');\n col.className = 'col';\n col.style.flex = '0 0 110px';\n col.innerHTML = \"\\n \\u5C5E\\u6027\\u6846\\n \\n \";\n row = _this7._DialogObject._element.content.getElementsByClassName('attribute')[0].getElementsByClassName('row')[0];\n row.appendChild(col);\n tagData = _this7.attributeSelect;\n attributeElm = _this7._DialogObject._element.content.getElementsByClassName('attribute-select-box')[0];\n if (!attributeElm) {\n _context7.next = 27;\n break;\n }\n legpObject = Object(_Element_datalist__WEBPACK_IMPORTED_MODULE_25__[\"legp\"])(attributeElm, '.attribute-select');\n legpObject.legp_search(tagData);\n attributeSelectElm = _this7._DialogObject._element.content.getElementsByClassName('attribute-select')[0].getElementsByTagName('input')[0];\n i = 0;\n case 18:\n if (!(i < tagData.length)) {\n _context7.next = 26;\n break;\n }\n if (!(tagData[i].key === _this7.options.attributeType)) {\n _context7.next = 23;\n break;\n }\n attributeSelectElm.value = tagData[i].value;\n legpObject.legp_searchActive(tagData[i].value);\n return _context7.abrupt(\"break\", 26);\n case 23:\n i++;\n _context7.next = 18;\n break;\n case 26:\n attributeSelectElm.addEventListener('input', function () {\n for (var _i5 = 0; _i5 < tagData.length; _i5++) {\n if (tagData[_i5].value === attributeSelectElm.value) {\n _this7.attributeType = tagData[_i5].key;\n break;\n }\n }\n });\n case 27:\n coordinateData = [];\n _this7.epsg_map.forEach(function (value, key) {\n coordinateData.push({\n name: \"\".concat(value.name, \"(\").concat(value.epsg, \")\"),\n value: key\n });\n });\n coordinateDataLegpObject = Object(_Element_datalist__WEBPACK_IMPORTED_MODULE_25__[\"legp\"])(_this7._DialogObject._element.content.getElementsByClassName('coordinate-select-box')[0], '.coordinate-select');\n if (!coordinateDataLegpObject) {\n _context7.next = 44;\n break;\n }\n coordinateDataLegpObject.legp_search(coordinateData);\n coordinateDataLegpElm = _this7._DialogObject._element.content.getElementsByClassName('coordinate-select')[0].getElementsByTagName('input')[0];\n if (!_this7.coordinate) {\n _this7.coordinate = coordinateData[0].value;\n } else {\n _this7.coordinate = _this7.coordinate;\n }\n coordinateDataLegpElm.value = _this7.coordinate;\n _i6 = 0;\n case 36:\n if (!(_i6 < coordinateData.length)) {\n _context7.next = 43;\n break;\n }\n if (!(coordinateData[_i6].value === coordinateData.value)) {\n _context7.next = 40;\n break;\n }\n coordinateDataLegpObject.legp_searchActive(coordinateData[_i6].value);\n return _context7.abrupt(\"break\", 43);\n case 40:\n _i6++;\n _context7.next = 36;\n break;\n case 43:\n coordinateDataLegpElm.addEventListener('input', function () {\n for (var _i7 = 0; _i7 < coordinateData.length; _i7++) {\n if (coordinateData[_i7].value === coordinateDataLegpElm.value) {\n _this7.coordinate = coordinateData[_i7].value;\n break;\n }\n }\n });\n case 44:\n heightBoxElm = document.getElementsByClassName('height-box')[0];\n heightElm = heightBoxElm.getElementsByClassName('height')[0];\n heightModeData = [{\n name: '海拔高度',\n value: '海拔高度',\n key: '0'\n }, {\n name: '相对地表',\n value: '相对地表',\n key: '1'\n }, {\n name: '依附地表',\n value: '依附地表',\n key: '2'\n }, {\n name: '依附模型',\n value: '依附模型',\n key: '3'\n }];\n heightMode = _this7.heightMode;\n _context7.t0 = heightMode;\n _context7.next = _context7.t0 === 0 ? 51 : _context7.t0 === '0' ? 51 : _context7.t0 === 1 ? 53 : _context7.t0 === '1' ? 53 : _context7.t0 === 2 ? 55 : _context7.t0 === '2' ? 55 : _context7.t0 === 3 ? 55 : _context7.t0 === '3' ? 55 : 60;\n break;\n case 51:\n heightElm.value = _this7.alt;\n return _context7.abrupt(\"break\", 60);\n case 53:\n if (_this7.sdk.viewer.scene.terrainProvider.availability) {\n Cesium.sampleTerrainMostDetailed(_this7.sdk.viewer.scene.terrainProvider, [Cesium.Cartographic.fromDegrees(_this7.options.position.lng, _this7.options.position.lat)]).then(function (position) {\n heightElm.value = Number((_this7.alt - Number(position[0].height.toFixed(2))).toFixed(2));\n });\n } else {\n heightElm.value = Number(_this7.alt.toFixed(2));\n }\n return _context7.abrupt(\"break\", 60);\n case 55:\n objectsToExclude = [];\n _iterator6 = _createForOfIteratorHelper(_this7.sdk.entityMap);\n try {\n for (_iterator6.s(); !(_step6 = _iterator6.n()).done;) {\n _step6$value = _babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_2___default()(_step6.value, 2), key = _step6$value[0], value = _step6$value[1];\n if (value.type === 'RadarScanStereoscopic' && value.entity) {\n objectsToExclude.push(value.entity);\n }\n }\n } catch (err) {\n _iterator6.e(err);\n } finally {\n _iterator6.f();\n }\n _this7.getClampToHeight(_this7.options.position, objectsToExclude).then(function (h) {\n _this7.alt = Number(h.toFixed(2));\n heightElm.value = _this7.alt;\n });\n return _context7.abrupt(\"break\", 60);\n case 60:\n heightModeObject = Object(_Element_datalist__WEBPACK_IMPORTED_MODULE_25__[\"legp\"])(_this7._DialogObject._element.content.getElementsByClassName('height-mode-box')[0], '.height-mode');\n if (!heightModeObject) {\n _context7.next = 78;\n break;\n }\n heightModeObject.legp_search(heightModeData);\n heightModeDataLegpElm = _this7._DialogObject._element.content.getElementsByClassName('height-mode')[0].getElementsByTagName('input')[0];\n heightModeDataLegpElm.value = heightModeData[_this7.heightMode].value;\n _i8 = 0;\n case 66:\n if (!(_i8 < heightModeData.length)) {\n _context7.next = 73;\n break;\n }\n if (!(heightModeData[_i8].value == heightModeDataLegpElm.value)) {\n _context7.next = 70;\n break;\n }\n heightModeObject.legp_searchActive(heightModeData[_i8].value);\n return _context7.abrupt(\"break\", 73);\n case 70:\n _i8++;\n _context7.next = 66;\n break;\n case 73:\n heightModeDataLegpElm.addEventListener('input', function () {\n for (var _i9 = 0; _i9 < heightModeData.length; _i9++) {\n if (heightModeData[_i9].value === heightModeDataLegpElm.value) {\n heightMode = heightModeData[_i9].key;\n switch (heightMode) {\n case 0:\n case '0':\n _this7.alt = Number(heightElm.value);\n heightBoxElm.style.display = 'flex';\n _this7.heightMode = 0;\n break;\n case 1:\n case '1':\n if (_this7.sdk.viewer.scene.terrainProvider.availability) {\n Cesium.sampleTerrainMostDetailed(_this7.sdk.viewer.scene.terrainProvider, [Cesium.Cartographic.fromDegrees(_this7.options.position.lng, _this7.options.position.lat)]).then(function (position) {\n _this7.alt = Number(heightElm.value) + Number(position[0].height.toFixed(2));\n });\n } else {\n _this7.alt = Number(heightElm.value);\n }\n heightBoxElm.style.display = 'flex';\n _this7.heightMode = 1;\n break;\n case 2:\n case '2':\n _this7.heightMode = 2;\n break;\n case 3:\n case '3':\n var _objectsToExclude = [];\n var _iterator7 = _createForOfIteratorHelper(_this7.sdk.entityMap),\n _step7;\n try {\n for (_iterator7.s(); !(_step7 = _iterator7.n()).done;) {\n var _step7$value = _babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_2___default()(_step7.value, 2),\n _key = _step7$value[0],\n _value = _step7$value[1];\n if (_value.type === 'RadarScanStereoscopic' && _value.entity) {\n _objectsToExclude.push(_value.entity);\n }\n }\n } catch (err) {\n _iterator7.e(err);\n } finally {\n _iterator7.f();\n }\n _this7.getClampToHeight(_this7.options.position, _objectsToExclude).then(function (h) {\n _this7.alt = Number(h.toFixed(2));\n });\n _this7.heightMode = 3;\n break;\n }\n break;\n }\n }\n });\n heightElm.addEventListener('input', function () {\n switch (heightMode) {\n case 0:\n case '0':\n _this7.options.position.alt = Number(Number(heightElm.value).toFixed(2));\n break;\n case 1:\n case '1':\n if (_this7.sdk.viewer.scene.terrainProvider.availability) {\n Cesium.sampleTerrainMostDetailed(_this7.sdk.viewer.scene.terrainProvider, [Cesium.Cartographic.fromDegrees(_this7.options.position.lng, _this7.options.position.lat)]).then(function (position) {\n _this7.alt = Number(heightElm.value) + Number(position[0].height.toFixed(2));\n });\n } else {\n _this7.alt = Number(heightElm.value);\n }\n break;\n case 2:\n case '2':\n break;\n }\n _this7.renewPoint();\n _this7.coordinate = _this7.options.coordinate;\n _this7._elms.alt && _this7._elms.alt.forEach(function (item) {\n item.value = _this7.options.position.alt;\n });\n });\n _this7._elms.height = heightBoxElm;\n _this7._elms.heightMode = heightModeDataLegpElm;\n _this7.heightMode = _this7.heightMode;\n case 78:\n fontData = Object(_Element_fontSelect__WEBPACK_IMPORTED_MODULE_26__[\"getFontList\"])();\n fontObject = Object(_Element_datalist__WEBPACK_IMPORTED_MODULE_25__[\"legp\"])(_this7._DialogObject._element.content.getElementsByClassName('font-select-box')[0], '.font-select');\n if (!fontObject) {\n _context7.next = 94;\n break;\n }\n fontObject.legp_search(fontData);\n fontDataLegpElm = _this7._DialogObject._element.content.getElementsByClassName('font-select')[0].getElementsByTagName('input')[0];\n fontDataLegpElm.value = fontData[_this7.labelFontFamily].value;\n _i10 = 0;\n case 85:\n if (!(_i10 < fontData.length)) {\n _context7.next = 92;\n break;\n }\n if (!(fontData[_i10].value == fontDataLegpElm.value)) {\n _context7.next = 89;\n break;\n }\n fontObject.legp_searchActive(fontData[_i10].value);\n return _context7.abrupt(\"break\", 92);\n case 89:\n _i10++;\n _context7.next = 85;\n break;\n case 92:\n fontDataLegpElm.addEventListener('input', function () {\n for (var _i11 = 0; _i11 < fontData.length; _i11++) {\n if (fontData[_i11].value === fontDataLegpElm.value) {\n _this7.labelFontFamily = fontData[_i11].key;\n break;\n }\n }\n });\n _this7._elms.labelFontFamily = [fontDataLegpElm];\n case 94:\n case \"end\":\n return _context7.stop();\n }\n }, _callee3);\n })), 0);\n lngEln = contentElm.getElementsByClassName('lng')[0];\n latEln = contentElm.getElementsByClassName('lat')[0];\n lngEln.value = this.lng;\n latEln.value = this.lat;\n this._elms.lng.push(lngEln);\n this._elms.lat.push(latEln);\n projCheckboxBoxElms = this._DialogObject._element.content.getElementsByClassName('YJ-custom-checkbox-box');\n projCheckboxElms = this._DialogObject._element.content.getElementsByClassName('YJ-custom-checkbox');\n projInputBoxElms = this._DialogObject._element.content.getElementsByClassName('proj-input-box');\n projCheckboxElms[0].checked = true;\n projInputBoxElms[1].style.display = 'none';\n projInputBoxElms[2].style.display = 'none';\n projCheckboxBoxElms[0].addEventListener('click', function () {\n projCheckboxElms[0].checked = true;\n projInputBoxElms[0].style.display = 'block';\n projCheckboxElms[1].checked = false;\n projInputBoxElms[1].style.display = 'none';\n projCheckboxElms[2].checked = false;\n projInputBoxElms[2].style.display = 'none';\n });\n projCheckboxBoxElms[1].addEventListener('click', function () {\n projCheckboxElms[1].checked = true;\n projInputBoxElms[1].style.display = 'block';\n projCheckboxElms[0].checked = false;\n projInputBoxElms[0].style.display = 'none';\n projCheckboxElms[2].checked = false;\n projInputBoxElms[2].style.display = 'none';\n });\n projCheckboxBoxElms[2].addEventListener('click', function () {\n projCheckboxElms[2].checked = true;\n projInputBoxElms[2].style.display = 'block';\n projCheckboxElms[0].checked = false;\n projInputBoxElms[0].style.display = 'none';\n projCheckboxElms[1].checked = false;\n projInputBoxElms[1].style.display = 'none';\n });\n _this._projConvert = function () {\n if (!_this7._DialogObject || _this7._DialogObject.isDestroy) {\n return;\n }\n var lng, lat, lngD, lngM, lngS, latD, latM, latS, lngDM, latDM, lngDMS, latDMS, lngdnArr1, lngdnArr2, latdnArr1, latdnArr2, lngdnsArr1, lngdnsArr2, lngdnsArr3, latdnsArr1, latdnsArr2, latdnsArr3;\n lng = _this.lng;\n lat = _this.lat;\n lngDM = _this._proj.degreesToDMS(lng, true);\n latDM = _this._proj.degreesToDMS(lat, true);\n lngdnArr1 = lngDM.split('°');\n lngdnArr2 = lngdnArr1[1].split(\"'\");\n latdnArr1 = latDM.split('°');\n latdnArr2 = latdnArr1[1].split(\"'\");\n contentElm.getElementsByClassName('lng-dm-d')[0].value = lngdnArr1[0];\n contentElm.getElementsByClassName('lng-dm-m')[0].value = lngdnArr2[0];\n contentElm.getElementsByClassName('lat-dm-d')[0].value = latdnArr1[0];\n contentElm.getElementsByClassName('lat-dm-m')[0].value = latdnArr2[0];\n lngDMS = _this._proj.degreesToDMS(lng);\n latDMS = _this._proj.degreesToDMS(lat);\n lngdnsArr1 = lngDMS.split('°');\n lngdnsArr2 = lngdnsArr1[1].split(\"'\");\n lngdnsArr3 = lngdnsArr2[1].split('\"');\n latdnsArr1 = latDMS.split('°');\n latdnsArr2 = latdnsArr1[1].split(\"'\");\n latdnsArr3 = latdnsArr2[1].split('\"');\n contentElm.getElementsByClassName('lng-dms-d')[0].value = lngdnsArr1[0];\n contentElm.getElementsByClassName('lng-dms-m')[0].value = lngdnsArr2[0];\n contentElm.getElementsByClassName('lng-dms-s')[0].value = lngdnsArr3[0];\n contentElm.getElementsByClassName('lat-dms-d')[0].value = latdnsArr1[0];\n contentElm.getElementsByClassName('lat-dms-m')[0].value = latdnsArr2[0];\n contentElm.getElementsByClassName('lat-dms-s')[0].value = latdnsArr3[0];\n };\n _this._projConvert();\n _context8.next = 41;\n break;\n case 41:\n case \"end\":\n return _context8.stop();\n }\n }, _callee4, this);\n }));\n function edit() {\n return _edit.apply(this, arguments);\n }\n return edit;\n }())\n }, {\n key: \"renewPoint\",\n value: function renewPoint() {\n var _this = this;\n var font = Object(_Element_fontSelect__WEBPACK_IMPORTED_MODULE_26__[\"getFontFamily\"])(this.labelFontFamily) || 'Helvetica';\n if (this.entity) {\n this.entity.position = Cesium.Cartesian3.fromDegrees(this.options.position.lng, this.options.position.lat, this.options.position.alt);\n if (this.options.scaleByDistance) {\n this.entity.billboard.scaleByDistance = new Cesium.NearFarScalar(this.options.near, 1, this.options.far, 0);\n this.entity.billboard.pixelOffsetScaleByDistance = new Cesium.NearFarScalar(this.options.near, 1, this.options.far, 0);\n this.entity.label.scaleByDistance = new Cesium.NearFarScalar(this.options.near, 1, this.options.far, 0);\n this.entity.label.pixelOffsetScaleByDistance = new Cesium.NearFarScalar(this.options.near, 1, this.options.far, 0);\n } else {\n this.entity.billboard.scaleByDistance = undefined;\n this.entity.billboard.pixelOffsetScaleByDistance = undefined;\n this.entity.label.scaleByDistance = undefined;\n this.entity.label.pixelOffsetScaleByDistance = undefined;\n }\n // this.entity.billboard.pixelOffset = new Cesium.CallbackProperty(\n // function () {\n // let billboardH =\n // _this.entity.billboard.imgHeight *\n // (31 / _this.entity.billboard.imgWidth)\n // return new Cesium.Cartesian2(\n // 0,\n // -(billboardH / 2) * _this.options.billboard.scale\n // )\n // },\n // false\n // )\n this.entity.label.pixelOffset = new Cesium.CallbackProperty(function () {\n if (_this.options.billboard.show) {\n var billboardH = _this.entity.billboard.imgHeight ? _this.entity.billboard.imgHeight * (31 / _this.entity.billboard.imgWidth) : 0;\n return new Cesium.Cartesian2(0, -billboardH * _this.options.billboard.scale - _this.options.label.fontSize / 2 - 5);\n } else {\n return new Cesium.Cartesian2(0, -_this.options.label.fontSize / 2 - 5);\n }\n }, false);\n this.entity.label.font = this.options.label.fontSize + 'px ' + font;\n this.entity.label.fillColor = Cesium.Color.fromCssColorString(this.options.label.color);\n this.entity.billboard.scale = this.options.billboard.scale;\n }\n }\n }, {\n key: \"reset\",\n value: function reset() {\n if (!this.entity) {\n return;\n }\n this.options = this.deepCopyObj(this.originalOptions);\n this.near = this.originalOptions.near;\n this.far = this.originalOptions.far;\n this.scaleByDistance = this.originalOptions.scaleByDistance;\n this.billboardShow = this.originalOptions.billboard.show;\n this.billboardImage = this.originalOptions.billboard.image;\n this.billboardScale = this.originalOptions.billboard.scale;\n this.labelText = this.originalOptions.label.text;\n this.labelShow = this.originalOptions.label.show;\n this.labelFontSize = this.originalOptions.label.fontSize;\n this.labelColor = this.originalOptions.label.color;\n this.lng = this.originalOptions.position.lng;\n this.lat = this.originalOptions.position.lat;\n this.alt = this.originalOptions.position.alt;\n this.attributeLink = this.options.attribute.link.content;\n this.attributeVr = this.options.attribute.vr.content;\n this.attributeCamera = this.options.attribute.camera.content;\n this.attributeGoods = this.options.attribute.goods.content;\n this.attributeISC = this.options.attribute.isc.content;\n this.cameraSelect && this.cameraSelect();\n this.goodsSelect && this.goodsSelect();\n }\n }, {\n key: \"remove\",\n value: function () {\n var _remove = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_9___default.a.mark(function _callee5() {\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_9___default.a.wrap(function _callee5$(_context9) {\n while (1) switch (_context9.prev = _context9.next) {\n case 0:\n _context9.next = 2;\n return Object(_Global_cluster_cluster__WEBPACK_IMPORTED_MODULE_19__[\"remove_entity_from_cluster\"])(this.sdk.viewer, this.entity);\n case 2:\n this.entity = null;\n if (!(!this.sdk.viewer || !this.sdk.viewer.entities)) {\n _context9.next = 5;\n break;\n }\n return _context9.abrupt(\"return\");\n case 5:\n // if (this.diffuse) {\n // this.diffuse.remove()\n // this.diffuse = null\n // }\n // if (this.scan) {\n // this.scan.remove()\n // this.scan = null\n // }\n if (this._DialogObject && !this._DialogObject.isDestroy) {\n this._DialogObject.close();\n this._DialogObject = null;\n }\n this.event && this.event.destroy();\n this.tip && this.tip.destroy();\n _context9.next = 10;\n return this.sdk.removeIncetance(this.options.id);\n case 10:\n _context9.next = 12;\n return Object(_Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_22__[\"syncData\"])(this.sdk, this.options.id);\n case 12:\n case \"end\":\n return _context9.stop();\n }\n }, _callee5, this);\n }));\n function remove() {\n return _remove.apply(this, arguments);\n }\n return remove;\n }() // 点击弹框内图标切换\n }, {\n key: \"clickChangeImage\",\n value: function clickChangeImage() {\n this.Dialog.clickChangeImage && this.Dialog.clickChangeImage();\n }\n // 点击弹框内默认图标切换\n }, {\n key: \"clickChangeDefaultImage\",\n value: function clickChangeDefaultImage() {\n this.Dialog.clickChangeDefaultImage && this.Dialog.clickChangeDefaultImage();\n }\n }, {\n key: \"_addLink\",\n value: function _addLink() {\n // document.getElementsByClassName\n if (this._DialogObject._element.content.getElementsByClassName('link_add')[0].value) {\n this.options.attribute.link.content.push({\n name: '链接',\n url: this._DialogObject._element.content.getElementsByClassName('link_add')[0].value\n });\n this._DialogObject._element.content.getElementsByClassName('link_add')[0].value = '';\n this.attributeLink = this.options.attribute.link.content;\n } else {\n this.Dialog.clickAddLink && this.Dialog.clickAddLink();\n }\n }\n }, {\n key: \"addAttributeLink\",\n value: function addAttributeLink(link) {\n this.options.attribute.link.content.push({\n name: '链接',\n url: link\n });\n this.attributeLink = this.options.attribute.link.content;\n }\n }, {\n key: \"_addRr\",\n value: function _addRr() {\n if (this._DialogObject._element.content.getElementsByClassName('vr_add')[0].value) {\n this.options.attribute.vr.content.push({\n name: '全景图',\n url: this._DialogObject._element.content.getElementsByClassName('vr_add')[0].value\n });\n this._DialogObject._element.content.getElementsByClassName('vr_add')[0].value = '';\n this.attributeVr = this.options.attribute.vr.content;\n } else {\n this.Dialog.clickAddVr && this.Dialog.clickAddVr();\n }\n }\n }, {\n key: \"addAttributeRr\",\n value: function addAttributeRr(vr) {\n this.options.attribute.vr.content.push({\n name: '全景图',\n url: vr\n });\n this.attributeVr = this.options.attribute.vr.content;\n }\n\n /**\r\n * 打开富文本框\r\n */\n }, {\n key: \"openRichTextEditor\",\n value: function openRichTextEditor(e) {\n var _this8 = this;\n // var ue = UE.getEditor('app');\n _Element_richText__WEBPACK_IMPORTED_MODULE_15__[\"default\"].open(this.options.id, this.options.name, this.options.richTextContent);\n _Element_richText__WEBPACK_IMPORTED_MODULE_15__[\"default\"].primaryCallBack = function (content) {\n _this8.options.richTextContent = content;\n };\n }\n }, {\n key: \"updateHeight\",\n value: function () {\n var _updateHeight = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_9___default.a.mark(function _callee6() {\n var height, height2, point1, point2, objectsToExclude, _iterator8, _step8, _step8$value, key, value, updatedCartesians, direction, c, ray, r, pickedObjects, i, promise;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_9___default.a.wrap(function _callee6$(_context10) {\n while (1) switch (_context10.prev = _context10.next) {\n case 0:\n if (!(!this.sdk || !this.sdk.viewer || !this.sdk.viewer.scene)) {\n _context10.next = 2;\n break;\n }\n return _context10.abrupt(\"return\");\n case 2:\n point1 = new Cesium.Cartesian3.fromDegrees(this.options.position.lng, this.options.position.lat, 0);\n point2 = new Cesium.Cartesian3.fromDegrees(this.options.position.lng, this.options.position.lat, 10000000000000);\n objectsToExclude = [];\n _iterator8 = _createForOfIteratorHelper(this.sdk.entityMap);\n try {\n for (_iterator8.s(); !(_step8 = _iterator8.n()).done;) {\n _step8$value = _babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_2___default()(_step8.value, 2), key = _step8$value[0], value = _step8$value[1];\n if (value.type === 'RadarScanStereoscopic' && value.entity) {\n objectsToExclude.push(value.entity);\n }\n }\n } catch (err) {\n _iterator8.e(err);\n } finally {\n _iterator8.f();\n }\n _context10.next = 9;\n return this.sdk.viewer.scene.clampToHeightMostDetailed([point1], objectsToExclude);\n case 9:\n updatedCartesians = _context10.sent;\n if (updatedCartesians && updatedCartesians[0]) {\n height = this.cartesian3Towgs84(updatedCartesians[0], this.sdk.viewer).alt;\n }\n direction = Cesium.Cartesian3.subtract(point1, point2, new Cesium.Cartesian3());\n c = Cesium.Cartesian3.normalize(direction, new Cesium.Cartesian3());\n ray = new Cesium.Ray(point2, c);\n r = {};\n pickedObjects = this.sdk.viewer.scene.drillPickFromRay(ray);\n i = pickedObjects.length - 1;\n case 17:\n if (!(i >= 0)) {\n _context10.next = 24;\n break;\n }\n if (!pickedObjects[i].position) {\n _context10.next = 21;\n break;\n }\n r = pickedObjects[i];\n return _context10.abrupt(\"break\", 24);\n case 21:\n i--;\n _context10.next = 17;\n break;\n case 24:\n if (r && r.position) {\n height2 = this.cartesian3Towgs84(r.position, this.sdk.viewer).alt;\n }\n _context10.prev = 25;\n _context10.next = 28;\n return Cesium.sampleTerrainMostDetailed(this.sdk.viewer.terrainProvider, [Cesium.Cartographic.fromDegrees(this.options.position.lng, this.options.position.lat)]);\n case 28:\n promise = _context10.sent;\n _context10.next = 33;\n break;\n case 31:\n _context10.prev = 31;\n _context10.t0 = _context10[\"catch\"](25);\n case 33:\n if ((height2 === void 0 || height2 < promise[0].height) && promise) {\n height2 = promise[0].height;\n }\n if (height === void 0 || height < height2) {\n height = height2;\n }\n if (!(height !== undefined)) {\n _context10.next = 40;\n break;\n }\n this.options.position.alt = Number(Number(height).toFixed(2));\n this.renewPoint();\n this.coordinate = this.options.coordinate;\n return _context10.abrupt(\"return\", true);\n case 40:\n case \"end\":\n return _context10.stop();\n }\n }, _callee6, this, [[25, 31]]);\n }));\n function updateHeight() {\n return _updateHeight.apply(this, arguments);\n }\n return updateHeight;\n }()\n }, {\n key: \"flyTo\",\n value: function () {\n var _flyTo = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_9___default.a.mark(function _callee7() {\n var options,\n orientation,\n lng,\n lat,\n alt,\n destination,\n position,\n objectsToExclude,\n _iterator9,\n _step9,\n _step9$value,\n key,\n value,\n _objectsToExclude2,\n _iterator10,\n _step10,\n _step10$value,\n _key2,\n _value2,\n height,\n _args11 = arguments;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_9___default.a.wrap(function _callee7$(_context11) {\n while (1) switch (_context11.prev = _context11.next) {\n case 0:\n options = _args11.length > 0 && _args11[0] !== undefined ? _args11[0] : {};\n Object(_Global_global__WEBPACK_IMPORTED_MODULE_23__[\"setActiveViewer\"])(0);\n Object(_Global_global__WEBPACK_IMPORTED_MODULE_23__[\"closeRotateAround\"])(this.sdk);\n Object(_Global_global__WEBPACK_IMPORTED_MODULE_23__[\"closeViewFollow\"])(this.sdk);\n if (!(this.options.customView && this.options.customView.relativePosition && this.options.customView.orientation)) {\n _context11.next = 26;\n break;\n }\n orientation = {\n heading: Cesium.Math.toRadians(this.options.customView.orientation.heading || 0.0),\n pitch: Cesium.Math.toRadians(this.options.customView.orientation.pitch || -60.0),\n roll: Cesium.Math.toRadians(this.options.customView.orientation.roll || 0.0)\n };\n lng = this.options.customView.relativePosition.lng;\n lat = this.options.customView.relativePosition.lat;\n alt = this.options.customView.relativePosition.alt;\n destination = Cesium.Cartesian3.fromDegrees(lng, lat, alt);\n position = {\n lng: 0,\n lat: 0\n };\n if (this.options.position) {\n position = _objectSpread({}, this.options.position);\n } else if (this.options.position) {\n position = _objectSpread({}, this.options.position);\n } else if (this.options.center) {\n position = _objectSpread({}, this.options.center);\n } else if (this.options.start) {\n position = _objectSpread({}, this.options.start);\n } else {\n if (this.options.hasOwnProperty('lng')) {\n position.lng = this.options.lng;\n }\n if (this.options.hasOwnProperty('lat')) {\n position.lat = this.options.lat;\n }\n if (this.options.hasOwnProperty('alt')) {\n position.alt = this.options.alt;\n }\n }\n // 如果没有高度值,则获取紧贴高度计算\n if (position.hasOwnProperty('alt')) {\n _context11.next = 19;\n break;\n }\n objectsToExclude = [];\n _iterator9 = _createForOfIteratorHelper(this.sdk.entityMap);\n try {\n for (_iterator9.s(); !(_step9 = _iterator9.n()).done;) {\n _step9$value = _babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_2___default()(_step9.value, 2), key = _step9$value[0], value = _step9$value[1];\n if (value.type === 'RadarScanStereoscopic' && value.entity) {\n objectsToExclude.push(value.entity);\n }\n }\n } catch (err) {\n _iterator9.e(err);\n } finally {\n _iterator9.f();\n }\n _context11.next = 18;\n return this.getClampToHeight(position, objectsToExclude);\n case 18:\n position.alt = _context11.sent;\n case 19:\n lng = this.options.customView.relativePosition.lng + position.lng;\n lat = this.options.customView.relativePosition.lat + position.lat;\n alt = this.options.customView.relativePosition.alt + position.alt;\n destination = Cesium.Cartesian3.fromDegrees(lng, lat, alt);\n this.sdk.viewer.camera.flyTo({\n destination: destination,\n orientation: orientation\n });\n _context11.next = 33;\n break;\n case 26:\n _objectsToExclude2 = [];\n _iterator10 = _createForOfIteratorHelper(this.sdk.entityMap);\n try {\n for (_iterator10.s(); !(_step10 = _iterator10.n()).done;) {\n _step10$value = _babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_2___default()(_step10.value, 2), _key2 = _step10$value[0], _value2 = _step10$value[1];\n if (_value2.type === 'RadarScanStereoscopic' && _value2.entity) {\n _objectsToExclude2.push(_value2.entity);\n }\n }\n } catch (err) {\n _iterator10.e(err);\n } finally {\n _iterator10.f();\n }\n _context11.next = 31;\n return this.getClampToHeight(this.options.position, _objectsToExclude2);\n case 31:\n height = _context11.sent;\n this.sdk.viewer.camera.flyTo({\n orientation: options.orientation,\n destination: Cesium.Cartesian3.fromDegrees(this.options.position.lng, this.options.position.lat, height + (options.height || 500))\n });\n case 33:\n case \"end\":\n return _context11.stop();\n }\n }, _callee7, this);\n }));\n function flyTo() {\n return _flyTo.apply(this, arguments);\n }\n return flyTo;\n }()\n }, {\n key: \"setPosition\",\n value: function setPosition(v) {\n this.options.position.lng = v.position.lng;\n this.options.position.lat = v.position.lat;\n this.options.position.alt = v.position.alt;\n this.renewPoint();\n }\n\n /**@desc 打开平移功能\r\n *\r\n * @memberOf Source\r\n * @param status {boolean}\r\n *\r\n * */\n }, {\n key: \"positionEditing\",\n get: function get() {\n return this.operate.positionEditing;\n },\n set: function set(status) {\n var _this9 = this;\n if (!this.sdk || !this.sdk.viewer || !this.entity) {\n return;\n }\n this.operate.positionEditing = status;\n this.event && this.event.destroy();\n this.event = new _Event_index__WEBPACK_IMPORTED_MODULE_18__[\"default\"](this.sdk);\n if (status === true) {\n this.picking = false;\n this.tip && this.tip.destroy();\n this.tip = new _MouseTip__WEBPACK_IMPORTED_MODULE_27__[\"default\"]('点击鼠标左键确认,右键取消', this.sdk);\n this.previous = {\n position: _objectSpread({}, this.options.position)\n };\n var moveEvent = function moveEvent(movement, cartesian) {\n _this9.entity.position = new Cesium.CallbackProperty(function () {\n return cartesian;\n }, false);\n _this9.tip.setPosition(cartesian, movement.endPosition.x, movement.endPosition.y);\n };\n var leftEvent = function leftEvent(movement, cartesian) {\n var positions = _this9.cartesian3Towgs84(cartesian, _this9.sdk.viewer);\n _this9.lng = positions.lng;\n _this9.lat = positions.lat;\n _this9.alt = positions.alt;\n _this9.previous = {\n position: _objectSpread({}, _this9.options.position)\n };\n _this9.event.mouse_move(function () {});\n _this9.event.mouse_left(function () {});\n _this9.event.mouse_right(function () {});\n _this9.event.gesture_pinck_start(function () {});\n _this9.event.gesture_pinck_end(function () {});\n _this9.entity.position = new Cesium.CallbackProperty(function () {\n return cartesian;\n }, false);\n if (_classPrivateFieldGet(_positionEditingCallback, _this9)) {\n _classPrivateFieldGet(_positionEditingCallback, _this9).call(_this9);\n _classPrivateFieldSet(_positionEditingCallback, _this9, null);\n }\n _this9.positionEditing = false;\n };\n this.event.mouse_move(moveEvent);\n this.event.mouse_left(leftEvent);\n this.event.mouse_right(function (movement, cartesian) {\n _this9.positionEditing = false;\n });\n this.event.gesture_pinck_start(function (movement, cartesian) {\n var startTime = new Date();\n _this9.event.gesture_pinck_end(function () {\n var endTime = new Date();\n var pos = {\n position: {\n x: (movement.position1.x + movement.position2.x) / 2,\n y: (movement.position1.y + movement.position2.y) / 2\n }\n };\n if (endTime - startTime >= 500) {\n // 长按取消\n _this9.positionEditing = false;\n } else {\n leftEvent(pos, cartesian);\n }\n });\n });\n } else {\n _classPrivateFieldSet(_positionEditingCallback, this, null);\n this.picking = true;\n if (this.event) {\n this.event.mouse_move(function () {});\n this.event.mouse_left(function () {});\n this.event.mouse_right(function () {});\n this.event.gesture_pinck_start(function () {});\n this.event.gesture_pinck_end(function () {});\n this.event.destroy();\n this.event = null;\n }\n this.tip && this.tip.destroy();\n this.lng = this.previous.position.lng;\n this.lat = this.previous.position.lat;\n this.alt = this.previous.position.alt;\n this.renewPoint();\n }\n }\n }, {\n key: \"openPositionEditing\",\n value: function openPositionEditing(cd) {\n this.positionEditing = true;\n _classPrivateFieldSet(_positionEditingCallback, this, cd);\n }\n }, {\n key: \"setDIV\",\n value: function setDIV() {\n var _this10 = this;\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {\n domid: '',\n x: 10,\n y: 10\n };\n options.x = options.x || options.x === 0 ? options.x : 10;\n options.y = options.y || options.y === 0 ? options.y : 10;\n var siteInfoDom = document.getElementById(options.domid);\n var siteInfoPosition = Cesium.Cartesian3.fromDegrees(this.options.position.lng, this.options.position.lat);\n this.sdk.viewer.scene.postRender.addEventListener(function (percentage) {\n //转换到屏幕坐标\n if (siteInfoDom.style.display === 'block' || siteInfoDom.style.display === '') {\n var winpos = _this10.sdk.viewer.scene.cartesianToCanvasCoordinates(siteInfoPosition);\n if (winpos) {\n siteInfoDom.style.left = (winpos.x + options.x).toFixed(0) + 'px';\n siteInfoDom.style.top = (winpos.y + options.y).toFixed(0) + 'px';\n }\n }\n });\n }\n }, {\n key: \"setCustomView\",\n value: function () {\n var _setCustomView = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_9___default.a.mark(function _callee8(val) {\n var camera, cameraPosition84, position, relativePosition, objectsToExclude, _iterator11, _step11, _step11$value, key, value;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_9___default.a.wrap(function _callee8$(_context12) {\n while (1) switch (_context12.prev = _context12.next) {\n case 0:\n if (!val) {\n _context12.next = 4;\n break;\n }\n this.options.customView = val;\n _context12.next = 19;\n break;\n case 4:\n camera = this.sdk.viewer.camera;\n cameraPosition84 = this.cartesian3Towgs84(camera.position, this.sdk.viewer);\n position = {\n lng: 0,\n lat: 0\n };\n relativePosition = _objectSpread({}, cameraPosition84);\n if (this.options.position) {\n position = _objectSpread({}, this.options.position);\n } else {\n if (this.options.hasOwnProperty('lng')) {\n position.lng = this.options.lng;\n }\n if (this.options.hasOwnProperty('lat')) {\n position.lat = this.options.lat;\n }\n if (this.options.hasOwnProperty('alt')) {\n position.alt = this.options.alt;\n }\n }\n // 如果没有高度值,则获取紧贴高度计算\n if (position.hasOwnProperty('alt')) {\n _context12.next = 16;\n break;\n }\n objectsToExclude = [];\n _iterator11 = _createForOfIteratorHelper(this.sdk.entityMap);\n try {\n for (_iterator11.s(); !(_step11 = _iterator11.n()).done;) {\n _step11$value = _babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_2___default()(_step11.value, 2), key = _step11$value[0], value = _step11$value[1];\n if (value.type === 'RadarScanStereoscopic' && value.entity) {\n objectsToExclude.push(value.entity);\n }\n }\n } catch (err) {\n _iterator11.e(err);\n } finally {\n _iterator11.f();\n }\n _context12.next = 15;\n return this.getClampToHeight(position, objectsToExclude);\n case 15:\n position.alt = _context12.sent;\n case 16:\n relativePosition = {\n lng: cameraPosition84.lng - position.lng,\n lat: cameraPosition84.lat - position.lat,\n alt: cameraPosition84.alt - position.alt\n };\n this.options.customView = {\n orientation: {\n heading: Cesium.Math.toDegrees(camera.heading),\n pitch: Cesium.Math.toDegrees(camera.pitch),\n roll: Cesium.Math.toDegrees(camera.roll)\n },\n relativePosition: relativePosition\n };\n this.originalOptions && (this.originalOptions.customView = this.options.customView);\n case 19:\n case \"end\":\n return _context12.stop();\n }\n }, _callee8, this);\n }));\n function setCustomView(_x3) {\n return _setCustomView.apply(this, arguments);\n }\n return setCustomView;\n }()\n }], [{\n key: \"create\",\n value: function create(that) {\n var canvas;\n var billboardH = 36;\n var heightMode;\n var position = that.options.position;\n that.originalOptions = that.deepCopyObj(that.options);\n var isGlf = false;\n var superGif;\n var index = 0;\n var font = Object(_Element_fontSelect__WEBPACK_IMPORTED_MODULE_26__[\"getFontFamily\"])(that.labelFontFamily) || 'Helvetica';\n var url = that.replaceHost(that.options.billboard.image, that.options.host);\n that._frameImages = [];\n if (url && url.endsWith('gif')) {\n isGlf = true;\n switch (that.options.heightMode) {\n case 2:\n case '2':\n heightMode = Cesium.HeightReference.CLAMP_TO_GROUND;\n break;\n }\n var gifImg = document.createElement('img');\n gifImg.setAttribute('rel:animated_src', url);\n gifImg.setAttribute('rel:auto_play', '1');\n var imgDiv = document.createElement('div');\n imgDiv.appendChild(gifImg);\n var id = Cesium.createGuid();\n superGif = new SuperGif({\n gif: gifImg\n });\n that._superGif = superGif;\n that._superGif.id = id; // 自定义id,用于判断gif实例是否改变\n\n superGif.load(function (status) {\n if (status == 404) {\n canvas = document.createElement('canvas');\n canvas.width = 0;\n canvas.height = 0;\n billboardH = 0;\n if (that.entity) {\n that.entity.billboard.imgWidth = 0;\n that.entity.billboard.imgHeight = 0;\n that.entity.billboard.image = canvas;\n Object(_Global_cluster_cluster__WEBPACK_IMPORTED_MODULE_19__[\"addCluster\"])(that.sdk, that.entity);\n }\n return;\n }\n if (that._superGif.id != id) {\n return;\n }\n var length = superGif.get_length();\n for (var i = 1; i <= length; i++) {\n superGif.move_to(i);\n that._frameImages.push(superGif.get_canvas().toDataURL());\n }\n canvas = superGif.get_canvas();\n var width = canvas.width;\n var height = canvas.height;\n billboardH = height * (31 / width);\n if (that.entity) {\n that.entity.billboard.imgWidth = width;\n that.entity.billboard.imgHeight = height;\n that.entity.billboard.image = new Cesium.CallbackProperty(function () {\n var img = that._frameImages[index];\n index = index >= that._frameImages.length - 1 ? 0 : index + 1;\n return img;\n }, false);\n Object(_Global_cluster_cluster__WEBPACK_IMPORTED_MODULE_19__[\"addCluster\"])(that.sdk, that.entity);\n }\n });\n } else {\n var image = new Image();\n image.src = url || that.getSourceRootPath() + '/img/A-ablu-blank.png';\n switch (that.options.heightMode) {\n case 2:\n case '2':\n heightMode = Cesium.HeightReference.CLAMP_TO_GROUND;\n break;\n }\n canvas = document.createElement('canvas');\n image.onload = function () {\n var ratio = image.width / image.height;\n image.width = 100;\n image.height = 100 / ratio;\n var width = image.width;\n var height = image.height;\n var ctx = canvas.getContext('2d', {\n willReadFrequently: true\n });\n canvas.width = width;\n canvas.height = height;\n ctx.drawImage(image, 0, 0, width, height);\n billboardH = height * (31 / width);\n if (that.entity) {\n that.entity.billboard.imgWidth = width;\n that.entity.billboard.imgHeight = height;\n that.entity.billboard.image = canvas;\n Object(_Global_cluster_cluster__WEBPACK_IMPORTED_MODULE_19__[\"addCluster\"])(that.sdk, that.entity);\n }\n };\n image.onerror = function (err) {\n canvas.width = 0;\n canvas.height = 0;\n billboardH = 0;\n if (that.entity) {\n that.entity.billboard.imgWidth = 0;\n that.entity.billboard.imgHeight = 0;\n that.entity.billboard.image = canvas;\n Object(_Global_cluster_cluster__WEBPACK_IMPORTED_MODULE_19__[\"addCluster\"])(that.sdk, that.entity);\n }\n };\n }\n that.entity = new Cesium.Entity({\n show: that.options.show,\n id: that.options.id,\n position: Cesium.Cartesian3.fromDegrees(position.lng, position.lat, position.alt),\n billboard: {\n image: isGlf ? new Cesium.CallbackProperty(function () {\n var img = that._frameImages[index];\n index = index >= that._frameImages.length - 1 ? 0 : index + 1;\n return img;\n }, false) : canvas,\n scale: that.options.billboard.scale,\n disableDepthTestDistance: new Cesium.CallbackProperty(function () {\n return Object(_Global_global__WEBPACK_IMPORTED_MODULE_23__[\"getGroundCover\"])() ? undefined : Number.POSITIVE_INFINITY;\n }, false),\n heightReference: heightMode,\n color: that.options.billboard.show ? undefined : new Cesium.Color(1.0, 1.0, 1.0, 0),\n width: 31,\n height: new Cesium.CallbackProperty(function () {\n return billboardH;\n }, false),\n verticalOrigin: Cesium.VerticalOrigin.BOTTOM\n // pixelOffset: new Cesium.CallbackProperty(function () {\n // return new Cesium.Cartesian2(\n // 0,\n // -(billboardH / 2) * that.options.billboard.scale\n // )\n // }, false)\n },\n label: {\n show: that.options.label.show,\n text: that.options.label.text,\n disableDepthTestDistance: new Cesium.CallbackProperty(function () {\n return Object(_Global_global__WEBPACK_IMPORTED_MODULE_23__[\"getGroundCover\"])() ? undefined : Number.POSITIVE_INFINITY;\n }, false),\n heightReference: heightMode,\n font: that.options.label.fontSize + 'px ' + font,\n fillColor: Cesium.Color.fromCssColorString(that.options.label.color),\n // verticalOrigin : Cesium.VerticalOrigin.BOTTOM,\n pixelOffset: new Cesium.CallbackProperty(function () {\n if (that.options.billboard.show) {\n return new Cesium.Cartesian2(0, -billboardH * that.options.billboard.scale - that.options.label.fontSize / 2 - 5);\n } else {\n return new Cesium.Cartesian2(0, -that.options.label.fontSize / 2 - 5);\n }\n }, false),\n outlineColor: Cesium.Color.BLACK,\n outlineWidth: 1,\n style: Cesium.LabelStyle.FILL_AND_OUTLINE\n }\n });\n that.entity.billboard.imgWidth = 31;\n that.entity.billboard.imgHeight = 36;\n that.entity.position = Cesium.Cartesian3.fromDegrees(position.lng, position.lat, position.alt);\n if (that.options.heightMode == 3) {\n that.updateHeight();\n }\n that.renewPoint();\n // that.diffuseShow = that.options.diffuseShow\n // that.scanShow = that.options.scanShow\n Object(_Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_22__[\"syncData\"])(that.sdk, that.options.id);\n if (that.options.show) {\n Object(_Global_SplitScreen__WEBPACK_IMPORTED_MODULE_28__[\"setSplitDirection\"])(0, that.options.id);\n }\n if (that.options.billboard.isSelect) {\n that.selectBillboard();\n }\n }\n }]);\n}(_index__WEBPACK_IMPORTED_MODULE_17__[\"default\"]);\n/* harmony default export */ __webpack_exports__[\"default\"] = (BillboardObject);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvT2JqL0Jhc2UvQmlsbGJvYXJkT2JqZWN0L2luZGV4LmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL09iai9CYXNlL0JpbGxib2FyZE9iamVjdC9pbmRleC5qcz9hNTRmIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiDngrlcclxuICovXHJcbmltcG9ydCB7IGdldEhvc3QsIGdldFRva2VuIH0gZnJvbSBcIi4uLy4uLy4uL29uXCI7XHJcbmltcG9ydCBEaWFsb2cgZnJvbSAnLi4vLi4vRWxlbWVudC9EaWFsb2cnXHJcbmltcG9ydCBFdmVudEJpbmRpbmcgZnJvbSAnLi4vLi4vRWxlbWVudC9EaWFsb2cvZXZlbnRCaW5kaW5nJ1xyXG5pbXBvcnQgY3lfc2xpZGVyIGZyb20gJy4uLy4uL0VsZW1lbnQvY3lfaHRtbF9zbGlkZXInXHJcbmltcG9ydCBjeV90YWJzIGZyb20gJy4uLy4uL0VsZW1lbnQvY3lfaHRtbF90YWJzJ1xyXG5pbXBvcnQgcmljaFRleHQgZnJvbSAnLi4vLi4vRWxlbWVudC9yaWNoVGV4dCdcclxuaW1wb3J0IHsgaHRtbCB9IGZyb20gJy4vX2VsZW1lbnQnXHJcbmltcG9ydCBCYXNlIGZyb20gJy4uL2luZGV4J1xyXG5pbXBvcnQgTW91c2VFdmVudCBmcm9tICcuLi8uLi8uLi9FdmVudC9pbmRleCdcclxuaW1wb3J0IHtcclxuICBhZGRDbHVzdGVyLFxyXG4gIHJlbW92ZV9lbnRpdHlfZnJvbV9jbHVzdGVyXHJcbn0gZnJvbSAnLi4vLi4vLi4vR2xvYmFsL2NsdXN0ZXIvY2x1c3RlcidcclxuaW1wb3J0IENpcmNsZURpZmZ1c2UgZnJvbSAnLi4vQ2lyY2xlRGlmZnVzZSdcclxuaW1wb3J0IFJhZGFyU2NhbiBmcm9tICcuLi9SYWRhclNjYW4nXHJcbmltcG9ydCB7IHN5bmNEYXRhIH0gZnJvbSAnLi4vLi4vLi4vR2xvYmFsL011bHRpVmlld3BvcnRNb2RlJ1xyXG5pbXBvcnQge1xyXG4gIGdldEJpbGxib2FyZERlZmF1bHRVcmwsXHJcbiAgc2V0QmlsbGJvYXJkRGVmYXVsdFVybCxcclxuICBnZXRHcm91bmRDb3ZlclxyXG59IGZyb20gJy4uLy4uLy4uL0dsb2JhbC9nbG9iYWwnXHJcbmltcG9ydCB7IFByb2ogfSBmcm9tICcuLi8uLi8uLi9Ub29scy9wcm9qJ1xyXG5pbXBvcnQgeyBsZWdwIH0gZnJvbSAnLi4vLi4vRWxlbWVudC9kYXRhbGlzdCdcclxuaW1wb3J0IHsgZ2V0Rm9udExpc3QsIGdldEZvbnRGYW1pbHksIGdldEZvbnRGYW1pbHlOYW1lIH0gZnJvbSAnLi4vLi4vRWxlbWVudC9mb250U2VsZWN0J1xyXG5pbXBvcnQgTW91c2VUaXAgZnJvbSAnLi4vLi4vLi4vTW91c2VUaXAnXHJcbmltcG9ydCB7XHJcbiAgc2V0U3BsaXREaXJlY3Rpb24sXHJcbiAgc3luY1NwbGl0RGF0YSxcclxuICBzZXRBY3RpdmVJZCxcclxuICBnZXRTdGF0ZVxyXG59IGZyb20gJy4uLy4uLy4uL0dsb2JhbC9TcGxpdFNjcmVlbidcclxuaW1wb3J0IHtcclxuICBzZXRBY3RpdmVWaWV3ZXIsXHJcbiAgY2xvc2VSb3RhdGVBcm91bmQsXHJcbiAgY2xvc2VWaWV3Rm9sbG93XHJcbn0gZnJvbSAnLi4vLi4vLi4vR2xvYmFsL2dsb2JhbCdcclxuXHJcbmltcG9ydCB7IGdldEdvb2RzTGlzdCB9IGZyb20gJy4uLy4uLy4uL1Rvb2xzL2dldEdvb2RzTGlzdCdcclxuXHJcbmNsYXNzIEJpbGxib2FyZE9iamVjdCBleHRlbmRzIEJhc2Uge1xyXG4gICNfcG9zaXRpb25FZGl0aW5nQ2FsbGJhY2sgPSBudWxsXHJcbiAgLyoqXHJcbiAgICogQGNvbnN0cnVjdG9yXHJcbiAgICogQGRlc2NyaXB0aW9uIOeCueagh+azqFxyXG4gICAqIEBwYXJhbSBvcHRpb25zIHtvYmplY3R9IOWxnuaAp1xyXG4gICAqIEBwYXJhbSBvcHRpb25zLmlkIHtzdHJpbmd9IOagh+azqGlkXHJcbiAgICogQHBhcmFtIG9wdGlvbnMuc2hvdz10cnVlIHtib29sZWFufSDmoIfms6jmlbTkvZPnmoTmmL7pmpBcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5uYW1lIHtzdHJpbmd9IOWQjeensFxyXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zLnBvc2l0aW9uPXt9IOW/heWhq++8jOS9jee9rlxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvcHRpb25zLnBvc2l0aW9uLmxuZyDnu4/luqZcclxuICAgKiBAcGFyYW0ge251bWJlcn0gb3B0aW9ucy5wb3NpdGlvbi5sYXQg57qs5bqmXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9wdGlvbnMucG9zaXRpb24uYWx0IOmrmOW6plxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvcHRpb25zLmhlaWdodE1vZGU9MyDpq5jluqbmqKHlvI/vvIgw77ya5rW35ouU6auY5bqm77ybMe+8muebuOWvueWcsOihqO+8mzLvvJrkvp3pmYTlnLDooag7IDPvvJrkvp3pmYTmqKHlnovvvIlcclxuICAgKiBAcGFyYW0gW29wdGlvbnMuc2NhbGVCeURpc3RhbmNlPXRydWVdIHtib29sZWFufSDmmK/lkKblvIDlkK/ot5/pmo/op4bph47nvKnmlL5cclxuICAgKiBAcGFyYW0gW29wdGlvbnMubmVhcj0yMDAwXSB7bnVtYmVyfSDop4bph47nvKnmlL7mnIDov5Hot53nprtcclxuICAgKiBAcGFyYW0gW29wdGlvbnMuZmFyPTEwMDAwMF0gIHtudW1iZXJ9IOinhumHjue8qeaUvuacgOi/nOi3neemu1xyXG4gICAqIEBwYXJhbSBvcHRpb25zLmJpbGxib2FyZCB7b2JqZWN0fSDlm77moIflj4LmlbBcclxuICAgKiBAcGFyYW0gW29wdGlvbnMuYmlsbGJvYXJkLnNob3c9dHJ1ZV0ge2Jvb2xlYW59IOWbvuagh+aYvumakFxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmJpbGxib2FyZC5pbWFnZSB7c3RyaW5nfSDlm77moIfot6/lvoRcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5iaWxsYm9hcmQuZGVmYXVsdEltYWdlIHtzdHJpbmd9IOm7mOiupOWbvuagh+eahOWUr+S4gOagh+ivhlxyXG4gICAqIEBwYXJhbSBbb3B0aW9ucy5iaWxsYm9hcmQuc2NhbGU9M10ge251bWJlcn0g5Zu+5qCH5pS+5aSn5YCN5pWwXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwge29iamVjdH0g5paH5a2X5Y+C5pWwXHJcbiAgICogQHBhcmFtIFtvcHRpb25zLmxhYmVsLnRleHRdIHtzdHJpbmd9IOaWh+Wtl+WGheWuuVxyXG4gICAqIEBwYXJhbSBbb3B0aW9ucy5sYWJlbC5zaG93PXRydWVdIHtib29sZWFufSDmloflrZfmmL7pmpBcclxuICAgKiBAcGFyYW0gW29wdGlvbnMubGFiZWwuZm9udEZhbWlseT0wXSB7bnVtYmVyfSDmloflrZflrZfkvZPpobkgMO+8mum7keS9k++8mzHvvJrmgJ3mupDpu5HkvZPvvJsy77ya5bqe6Zeo5q2j6YGT5qCH6aKY5L2T77ybM++8muaVsOm7keS9k1xyXG4gICAqIEBwYXJhbSBbb3B0aW9ucy5sYWJlbC5mb250U2l6ZT0zOV0ge251bWJlcn0g5paH5a2X5aSn5bCPLCDljZXkvY1weFxyXG4gICAqIEBwYXJhbSBbb3B0aW9ucy5sYWJlbC5jb2xvcj0jMDBmZmZmXSB7c3RyaW5nfSDmloflrZfpopzoibJcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5hdHRyaWJ1dGUge29iamVjdH0g5bGe5oCn5YaF5a65XHJcbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMuYXR0cmlidXRlLmxpbms9e30gIOmTvuaOpVxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnQ9W11dIHthcnJheX0g6ZO+5o6l5YaF5a65XHJcbiAgICogQHBhcmFtIG9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudFtdLm5hbWUge3N0cmluZ30g6ZO+5o6l5ZCN56ewXHJcbiAgICogQHBhcmFtIG9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudFtdLnVybCB7c3RyaW5nfSDpk77mjqXlnLDlnYBcclxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucy5hdHRyaWJ1dGUudnI9e30g5YWo5pmv5Zu+XHJcbiAgICogQHBhcmFtIG9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnQ9W11dIHthcnJheX0g5YWo5pmv5Zu+5YaF5a65XHJcbiAgICogQHBhcmFtIG9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnRbXS5uYW1lIHtzdHJpbmd9IOWQjeensFxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmF0dHJpYnV0ZS52ci5jb250ZW50W10udXJsIHtzdHJpbmd9IOWcsOWdgFxyXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBwdGlvbnMuYXR0cmlidXRlLmNhbWVyYT17fSDmkYTlg4/lpLRcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5hdHRyaWJ1dGUuY2FtZXJhLmNvbnRlbnQ9W11dIHthcnJheX0g5pGE5YOP5aS05YaF5a65XHJcbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMuYXR0cmlidXRlLmlzYz17fSBpc2NcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5hdHRyaWJ1dGUuaXNjLmNvbnRlbnQ9W11dIHthcnJheX0gSVND5YaF5a65XHJcbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMuYXR0cmlidXRlLmdvb2RzPXt9IOeJqei1hFxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmF0dHJpYnV0ZS5nb29kcy5jb250ZW50PVtdXSB7YXJyYXl9IOeJqei1hOWGheWuuVxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmF0dHJpYnV0ZS5nb29kcy5jb250ZW50W10uSUQge3N0cmluZ30gSURcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5hdHRyaWJ1dGUuZ29vZHMuY29udGVudFtdLm5hbWUge3N0cmluZ30g5ZCN56ewXHJcbiAgICogQHBhcmFtIG9wdGlvbnMuYXR0cmlidXRlLmdvb2RzLmNvbnRlbnRbXS5jbnQge3N0cmluZ30g5pWw6YePXHJcbiAgICogQHBhcmFtIG9wdGlvbnMucmljaFRleHRDb250ZW50IHtzdHJpbmd9IOWvjOaWh+acrOWGheWuuVxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmN1c3RvbVZpZXcge29iamVjdH0g6buY6K6k6KeG6KeSXHJcbiAgICogQHBhcmFtIG9wdGlvbnMuY3VzdG9tVmlldy5vcmllbnRhdGlvbiB7b2JqZWN0fSDpu5jorqTop4bop5LmlrnkvY1cclxuICAgKiBAcGFyYW0gb3B0aW9ucy5jdXN0b21WaWV3Lm9yaWVudGF0aW9uLmhlYWRpbmcge251bWJlcn0g6Iiq5ZCR6KeSXHJcbiAgICogQHBhcmFtIG9wdGlvbnMuY3VzdG9tVmlldy5vcmllbnRhdGlvbi5waXRjaCB7bnVtYmVyfSDkv6/ku7Dop5JcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5jdXN0b21WaWV3Lm9yaWVudGF0aW9uLnJvbGwge251bWJlcn0g57+75rua6KeSXHJcbiAgICogQHBhcmFtIG9wdGlvbnMuY3VzdG9tVmlldy5yZWxhdGl2ZVBvc2l0aW9uIHtvYmplY3R9IOinhuinkuebuOWvueS9jee9rlxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmN1c3RvbVZpZXcucmVsYXRpdmVQb3NpdGlvbi5sbmcge251bWJlcn0g57uP5bqmXHJcbiAgICogQHBhcmFtIG9wdGlvbnMuY3VzdG9tVmlldy5yZWxhdGl2ZVBvc2l0aW9uLmxhdCB7bnVtYmVyfSDnuqzluqZcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5jdXN0b21WaWV3LnJlbGF0aXZlUG9zaXRpb24uYWx0IHtudW1iZXJ9IOmrmOW6plxyXG4gICAqIFxyXG5cclxuXHJcblxyXG5cclxuXHJcbiAgICpAcGFyYW0gX0RpYWxvZyB7b2JqZWN0fSDlvLnmoYbkuovku7ZcclxuICAgKkBwYXJhbSBfRGlhbG9nLmNvbmZpcm1DYWxsQmFjayB7ZnVuY3Rpb259IOW8ueahhuehruiupOaXtueahOWbnuiwg1xyXG4gICAqICovXHJcbiAgY29uc3RydWN0b3Ioc2RrLCBvcHRpb25zID0ge30sIF9EaWFsb2cgPSB7fSkge1xyXG4gICAgc3VwZXIoc2RrLCBvcHRpb25zKVxyXG4gICAgdGhpcy5vcHRpb25zLm5lYXIgPSBvcHRpb25zLm5lYXIgfHwgb3B0aW9ucy5uZWFyID09PSAwID8gb3B0aW9ucy5uZWFyIDogMjAwMFxyXG4gICAgdGhpcy5vcHRpb25zLmZhciA9IG9wdGlvbnMuZmFyIHx8IG9wdGlvbnMuZmFyID09PSAwID8gb3B0aW9ucy5mYXIgOiAxMDAwMDBcclxuICAgIHRoaXMub3B0aW9ucy5zY2FsZUJ5RGlzdGFuY2UgPVxyXG4gICAgICBvcHRpb25zLnNjYWxlQnlEaXN0YW5jZSB8fCBvcHRpb25zLnNjYWxlQnlEaXN0YW5jZSA9PT0gZmFsc2VcclxuICAgICAgICA/IG9wdGlvbnMuc2NhbGVCeURpc3RhbmNlXHJcbiAgICAgICAgOiB0cnVlXHJcbiAgICB0aGlzLm9wdGlvbnMuc2hvdyA9XHJcbiAgICAgIG9wdGlvbnMuc2hvdyB8fCBvcHRpb25zLnNob3cgPT09IGZhbHNlID8gb3B0aW9ucy5zaG93IDogdHJ1ZVxyXG4gICAgdGhpcy5vcHRpb25zLmhlaWdodE1vZGUgPVxyXG4gICAgICBvcHRpb25zLmhlaWdodE1vZGUgfHwgb3B0aW9ucy5oZWlnaHRNb2RlID09IDAgPyBvcHRpb25zLmhlaWdodE1vZGUgOiAzXHJcbiAgICB0aGlzLm9wdGlvbnMuYmlsbGJvYXJkID0gb3B0aW9ucy5iaWxsYm9hcmQgPSBvcHRpb25zLmJpbGxib2FyZCB8fCB7fVxyXG4gICAgLy8gdGhpcy5vcHRpb25zLmJpbGxib2FyZC5pc1NlbGVjdCA9IG9wdGlvbnMuYmlsbGJvYXJkLmlzU2VsZWN0IHx8IGZhbHNlXHJcbiAgICB0aGlzLm9wdGlvbnMuYmlsbGJvYXJkLnNob3cgPVxyXG4gICAgICBvcHRpb25zLmJpbGxib2FyZC5zaG93IHx8IG9wdGlvbnMuYmlsbGJvYXJkLnNob3cgPT09IGZhbHNlXHJcbiAgICAgICAgPyBvcHRpb25zLmJpbGxib2FyZC5zaG93XHJcbiAgICAgICAgOiB0cnVlXHJcbiAgICB0aGlzLm9wdGlvbnMuYmlsbGJvYXJkLmltYWdlID1cclxuICAgICAgb3B0aW9ucy5iaWxsYm9hcmQuaW1hZ2UgfHxcclxuICAgICAgZ2V0QmlsbGJvYXJkRGVmYXVsdFVybChvcHRpb25zLmJpbGxib2FyZC5kZWZhdWx0SW1hZ2UpIHx8IHRoaXMuZ2V0U291cmNlUm9vdFBhdGgoKSArICcvaW1nL0EtYWJsdS1ibGFuay5wbmcnXHJcbiAgICB0aGlzLm9wdGlvbnMuYmlsbGJvYXJkLmRlZmF1bHRJbWFnZSA9IG9wdGlvbnMuYmlsbGJvYXJkLmRlZmF1bHRJbWFnZVxyXG4gICAgdGhpcy5vcHRpb25zLmJpbGxib2FyZC5zY2FsZSA9XHJcbiAgICAgIG9wdGlvbnMuYmlsbGJvYXJkLnNjYWxlIHx8IG9wdGlvbnMuYmlsbGJvYXJkLnNjYWxlID09PSAwXHJcbiAgICAgICAgPyBvcHRpb25zLmJpbGxib2FyZC5zY2FsZVxyXG4gICAgICAgIDogM1xyXG4gICAgb3B0aW9ucy5sYWJlbCA9IG9wdGlvbnMubGFiZWwgfHwge31cclxuICAgIHRoaXMub3B0aW9ucy5sYWJlbCA9IG9wdGlvbnMubGFiZWwgfHwge31cclxuICAgIHRoaXMub3B0aW9ucy5sYWJlbC50ZXh0ID0gb3B0aW9ucy5sYWJlbC50ZXh0IHx8IHRoaXMub3B0aW9ucy5uYW1lXHJcbiAgICB0aGlzLm9wdGlvbnMubmFtZSA9IHRoaXMub3B0aW9ucy5sYWJlbC50ZXh0XHJcbiAgICB0aGlzLm9wdGlvbnMubGFiZWwuc2hvdyA9XHJcbiAgICAgIG9wdGlvbnMubGFiZWwuc2hvdyB8fCBvcHRpb25zLmxhYmVsLnNob3cgPT09IGZhbHNlXHJcbiAgICAgICAgPyBvcHRpb25zLmxhYmVsLnNob3dcclxuICAgICAgICA6IHRydWVcclxuICAgIHRoaXMub3B0aW9ucy5sYWJlbC5mb250RmFtaWx5ID0gb3B0aW9ucy5sYWJlbC5mb250RmFtaWx5IHx8IDBcclxuICAgIHRoaXMub3B0aW9ucy5sYWJlbC5mb250U2l6ZSA9IG9wdGlvbnMubGFiZWwuZm9udFNpemUgfHwgMzlcclxuICAgIHRoaXMub3B0aW9ucy5sYWJlbC5jb2xvciA9IG9wdGlvbnMubGFiZWwuY29sb3IgfHwgJyMwMGZmZmYnXHJcbiAgICB0aGlzLm9wdGlvbnMucG9zaXRpb24gPSBvcHRpb25zLnBvc2l0aW9uID0gb3B0aW9ucy5wb3NpdGlvbiB8fCB7fVxyXG4gICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uLmxuZyA9IE51bWJlcihcclxuICAgICAgTnVtYmVyKG9wdGlvbnMucG9zaXRpb24ubG5nIHx8IDApLnRvRml4ZWQoOClcclxuICAgIClcclxuICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbi5sYXQgPSBOdW1iZXIoXHJcbiAgICAgIE51bWJlcihvcHRpb25zLnBvc2l0aW9uLmxhdCB8fCAwKS50b0ZpeGVkKDgpXHJcbiAgICApXHJcbiAgICB0aGlzLm9wdGlvbnMucG9zaXRpb24uYWx0ID0gTnVtYmVyKFxyXG4gICAgICBOdW1iZXIob3B0aW9ucy5wb3NpdGlvbi5hbHQgfHwgMCkudG9GaXhlZCgyKVxyXG4gICAgKVxyXG4gICAgLy8gdGhpcy5vcHRpb25zLmRpZmZ1c2VTaG93ID0gb3B0aW9ucy5kaWZmdXNlU2hvdyB8fCBmYWxzZVxyXG4gICAgLy8gdGhpcy5vcHRpb25zLmRpZmZ1c2VSYWRpdXMgPSAob3B0aW9ucy5kaWZmdXNlUmFkaXVzIHx8IG9wdGlvbnMuZGlmZnVzZVJhZGl1cyA9PT0gMCkgPyBvcHRpb25zLmRpZmZ1c2VSYWRpdXMgOiAxMFxyXG4gICAgLy8gdGhpcy5vcHRpb25zLmRpZmZ1c2VEdXJhdGlvbiA9IChvcHRpb25zLmRpZmZ1c2VEdXJhdGlvbiB8fCBvcHRpb25zLmRpZmZ1c2VEdXJhdGlvbiA9PT0gMCkgPyBvcHRpb25zLmRpZmZ1c2VEdXJhdGlvbiA6IDIwMDBcclxuICAgIC8vIHRoaXMub3B0aW9ucy5kaWZmdXNlQ29sb3IgPSBvcHRpb25zLmRpZmZ1c2VDb2xvciB8fCBcIiNGRjAwMDBcIlxyXG4gICAgLy8gdGhpcy5vcHRpb25zLnNjYW5TaG93ID0gb3B0aW9ucy5zY2FuU2hvdyB8fCBmYWxzZVxyXG4gICAgLy8gdGhpcy5vcHRpb25zLnNjYW5SYWRpdXMgPSAob3B0aW9ucy5zY2FuUmFkaXVzIHx8IG9wdGlvbnMuc2NhblJhZGl1cyA9PT0gMCkgPyBvcHRpb25zLnNjYW5SYWRpdXMgOiAxMFxyXG4gICAgLy8gdGhpcy5vcHRpb25zLnNjYW5EdXJhdGlvbiA9IChvcHRpb25zLnNjYW5EdXJhdGlvbiB8fCBvcHRpb25zLnNjYW5EdXJhdGlvbiA9PT0gMCkgPyBvcHRpb25zLnNjYW5EdXJhdGlvbiA6IDIwMDBcclxuICAgIC8vIHRoaXMub3B0aW9ucy5zY2FuQ29sb3IgPSBvcHRpb25zLnNjYW5Db2xvciB8fCBcIiNGRjAwMDBcIlxyXG4gICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZSA9IG9wdGlvbnMuYXR0cmlidXRlIHx8IHt9XHJcbiAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsgfHwge31cclxuICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50ID1cclxuICAgICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnQgfHwgW11cclxuICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyIHx8IHt9XHJcbiAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnQgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnQgfHwgW11cclxuICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUuY2FtZXJhID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5jYW1lcmEgfHwge31cclxuICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUuY2FtZXJhLmNvbnRlbnQgPVxyXG4gICAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmNhbWVyYS5jb250ZW50IHx8IFtdXHJcbiAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmlzYyA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUuaXNjIHx8IHt9XHJcbiAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmlzYy5jb250ZW50ID1cclxuICAgICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5pc2MuY29udGVudCB8fCBbXVxyXG4gICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5nb29kcyA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUuZ29vZHMgfHwge31cclxuICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUuZ29vZHMuY29udGVudCA9XHJcbiAgICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUuZ29vZHMuY29udGVudCB8fCBbXVxyXG4gICAgLy8gdGhpcy5vcHRpb25zLmNvb3JkaW5hdGUgPSBvcHRpb25zLmNvb3JkaW5hdGUgfHwgJydcclxuICAgIHRoaXMub3BlcmF0ZSA9IHt9XHJcbiAgICB0aGlzLl9lbG1zID0ge31cclxuICAgIHRoaXMucHJldmlvdXMgPSB7XHJcbiAgICAgIHBvc2l0aW9uOiB7IC4uLnRoaXMub3B0aW9ucy5wb3NpdGlvbiB9XHJcbiAgICB9XHJcbiAgICAvLyB0aGlzLm9wdGlvbnMuYXR0cmlidXRlUG9zID0gb3B0aW9ucy5hdHRyaWJ1dGVQb3MgfHwge1xyXG4gICAgLy8gICB4OiA2MCxcclxuICAgIC8vICAgeTogNjAsXHJcbiAgICAvLyAgIHdpZHRoOiAyMDAsXHJcbiAgICAvLyAgIGhlaWdodDogMTIwXHJcbiAgICAvLyB9XHJcbiAgICB0aGlzLmVudGl0eVxyXG4gICAgdGhpcy5fcHJvaiA9IHRoaXMuc2RrLnByb2pcclxuXHJcblxyXG5cclxuXHJcbiAgICAvLyAvLyDpqozor4HnianotYRcclxuICAgIC8vIGxldCBnb29kc0NvbnRlbnQgPSBbXVxyXG4gICAgLy8gaWYob3B0aW9ucy5hdHRyaWJ1dGUgJiYgb3B0aW9ucy5hdHRyaWJ1dGUuZ29vZHMgJiYgb3B0aW9ucy5hdHRyaWJ1dGUuZ29vZHMuY29udGVudCAmJiBBcnJheS5pc0FycmF5KG9wdGlvbnMuYXR0cmlidXRlLmdvb2RzLmNvbnRlbnQpKSB7XHJcbiAgICAvLyAgIGdvb2RzQ29udGVudCA9IFsuLi5vcHRpb25zLmF0dHJpYnV0ZS5nb29kcy5jb250ZW50XVxyXG4gICAgLy8gfVxyXG4gICAgLy8gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5nb29kcy5jb250ZW50ID0gW11cclxuICAgIC8vIGlmIChnb29kc0NvbnRlbnQubGVuZ3RoID4gMCkge1xyXG4gICAgLy8gICBnZXRHb29kc0xpc3QoKS50aGVuKChsaXN0KT0+e1xyXG4gICAgLy8gICAgIGZvciAobGV0IGkgPSBnb29kc0NvbnRlbnQubGVuZ3RoLTE7IGkgPj0gMDsgaS0tKSB7XHJcbiAgICAvLyAgICAgICBsZXQgZmFsZyA9IGZhbHNlXHJcbiAgICAvLyAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGxpc3QubGVuZ3RoOyBqKyspIHtcclxuICAgIC8vICAgICAgICAgaWYgKGdvb2RzQ29udGVudFtpXS5JRCA9PT0gbGlzdFtqXS5JRCkge1xyXG4gICAgLy8gICAgICAgICAgIGZhbGcgPSB0cnVlXHJcbiAgICAvLyAgICAgICAgICAgYnJlYWtcclxuICAgIC8vICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgfVxyXG4gICAgLy8gICAgICAgaWYoIWZhbGcpIHtcclxuICAgIC8vICAgICAgICAgZ29vZHNDb250ZW50LnNwbGljZShpLCAxKVxyXG4gICAgLy8gICAgICAgfVxyXG4gICAgLy8gICAgIH1cclxuICAgIC8vICAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmdvb2RzLmNvbnRlbnQgPSBbLi4uZ29vZHNDb250ZW50XVxyXG4gICAgLy8gICB9KVxyXG4gICAgLy8gfVxyXG5cclxuXHJcbiAgICB0aGlzLnNkay5hZGRJbmNldGFuY2UodGhpcy5vcHRpb25zLmlkLCB0aGlzKVxyXG4gICAgQmlsbGJvYXJkT2JqZWN0LmNyZWF0ZSh0aGlzKVxyXG4gICAgdGhpcy5waWNraW5nID0gdHJ1ZVxyXG5cclxuICAgIHRoaXMuRGlhbG9nID0gX0RpYWxvZ1xyXG4gICAgdGhpcy5fRXZlbnRCaW5kaW5nID0gbmV3IEV2ZW50QmluZGluZygpXHJcbiAgfVxyXG5cclxuICBnZXQgdHlwZSgpIHtcclxuICAgIHJldHVybiAnQmlsbGJvYXJkT2JqZWN0J1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGNyZWF0ZSh0aGF0KSB7XHJcbiAgICBsZXQgY2FudmFzXHJcbiAgICBsZXQgYmlsbGJvYXJkSCA9IDM2XHJcbiAgICBsZXQgaGVpZ2h0TW9kZVxyXG4gICAgbGV0IHBvc2l0aW9uID0gdGhhdC5vcHRpb25zLnBvc2l0aW9uXHJcbiAgICB0aGF0Lm9yaWdpbmFsT3B0aW9ucyA9IHRoYXQuZGVlcENvcHlPYmoodGhhdC5vcHRpb25zKVxyXG4gICAgbGV0IGlzR2xmID0gZmFsc2VcclxuICAgIGxldCBzdXBlckdpZlxyXG4gICAgbGV0IGluZGV4ID0gMFxyXG5cclxuICAgIGxldCBmb250ID0gZ2V0Rm9udEZhbWlseSh0aGF0LmxhYmVsRm9udEZhbWlseSkgfHwgJ0hlbHZldGljYSdcclxuICAgIGxldCB1cmwgPSB0aGF0LnJlcGxhY2VIb3N0KHRoYXQub3B0aW9ucy5iaWxsYm9hcmQuaW1hZ2UsIHRoYXQub3B0aW9ucy5ob3N0KVxyXG4gICAgdGhhdC5fZnJhbWVJbWFnZXMgPSBbXVxyXG4gICAgaWYgKHVybCAmJiB1cmwuZW5kc1dpdGgoJ2dpZicpKSB7XHJcbiAgICAgIGlzR2xmID0gdHJ1ZVxyXG4gICAgICBzd2l0Y2ggKHRoYXQub3B0aW9ucy5oZWlnaHRNb2RlKSB7XHJcbiAgICAgICAgY2FzZSAyOlxyXG4gICAgICAgIGNhc2UgJzInOlxyXG4gICAgICAgICAgaGVpZ2h0TW9kZSA9IENlc2l1bS5IZWlnaHRSZWZlcmVuY2UuQ0xBTVBfVE9fR1JPVU5EXHJcbiAgICAgICAgICBicmVha1xyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgZ2lmSW1nID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJylcclxuICAgICAgZ2lmSW1nLnNldEF0dHJpYnV0ZSgncmVsOmFuaW1hdGVkX3NyYycsIHVybClcclxuICAgICAgZ2lmSW1nLnNldEF0dHJpYnV0ZSgncmVsOmF1dG9fcGxheScsICcxJylcclxuICAgICAgY29uc3QgaW1nRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcclxuICAgICAgaW1nRGl2LmFwcGVuZENoaWxkKGdpZkltZylcclxuICAgICAgbGV0IGlkID0gQ2VzaXVtLmNyZWF0ZUd1aWQoKVxyXG4gICAgICBzdXBlckdpZiA9IG5ldyBTdXBlckdpZih7IGdpZjogZ2lmSW1nIH0pXHJcbiAgICAgIHRoYXQuX3N1cGVyR2lmID0gc3VwZXJHaWZcclxuICAgICAgdGhhdC5fc3VwZXJHaWYuaWQgPSBpZCAgLy8g6Ieq5a6a5LmJaWTvvIznlKjkuo7liKTmlq1naWblrp7kvovmmK/lkKbmlLnlj5hcclxuXHJcbiAgICAgIHN1cGVyR2lmLmxvYWQoZnVuY3Rpb24gKHN0YXR1cykge1xyXG4gICAgICAgIGlmIChzdGF0dXMgPT0gNDA0KSB7XHJcbiAgICAgICAgICBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKVxyXG4gICAgICAgICAgY2FudmFzLndpZHRoID0gMFxyXG4gICAgICAgICAgY2FudmFzLmhlaWdodCA9IDBcclxuICAgICAgICAgIGJpbGxib2FyZEggPSAwXHJcbiAgICAgICAgICBpZiAodGhhdC5lbnRpdHkpIHtcclxuICAgICAgICAgICAgdGhhdC5lbnRpdHkuYmlsbGJvYXJkLmltZ1dpZHRoID0gMFxyXG4gICAgICAgICAgICB0aGF0LmVudGl0eS5iaWxsYm9hcmQuaW1nSGVpZ2h0ID0gMFxyXG4gICAgICAgICAgICB0aGF0LmVudGl0eS5iaWxsYm9hcmQuaW1hZ2UgPSBjYW52YXNcclxuICAgICAgICAgICAgYWRkQ2x1c3Rlcih0aGF0LnNkaywgdGhhdC5lbnRpdHkpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm5cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoYXQuX3N1cGVyR2lmLmlkICE9IGlkKSB7XHJcbiAgICAgICAgICByZXR1cm5cclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IGxlbmd0aCA9IHN1cGVyR2lmLmdldF9sZW5ndGgoKVxyXG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IGxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBzdXBlckdpZi5tb3ZlX3RvKGkpXHJcbiAgICAgICAgICB0aGF0Ll9mcmFtZUltYWdlcy5wdXNoKHN1cGVyR2lmLmdldF9jYW52YXMoKS50b0RhdGFVUkwoKSlcclxuICAgICAgICB9XHJcbiAgICAgICAgY2FudmFzID0gc3VwZXJHaWYuZ2V0X2NhbnZhcygpXHJcbiAgICAgICAgbGV0IHdpZHRoID0gY2FudmFzLndpZHRoXHJcbiAgICAgICAgbGV0IGhlaWdodCA9IGNhbnZhcy5oZWlnaHRcclxuICAgICAgICBiaWxsYm9hcmRIID0gaGVpZ2h0ICogKDMxIC8gd2lkdGgpXHJcbiAgICAgICAgaWYgKHRoYXQuZW50aXR5KSB7XHJcbiAgICAgICAgICB0aGF0LmVudGl0eS5iaWxsYm9hcmQuaW1nV2lkdGggPSB3aWR0aFxyXG4gICAgICAgICAgdGhhdC5lbnRpdHkuYmlsbGJvYXJkLmltZ0hlaWdodCA9IGhlaWdodFxyXG4gICAgICAgICAgdGhhdC5lbnRpdHkuYmlsbGJvYXJkLmltYWdlID0gbmV3IENlc2l1bS5DYWxsYmFja1Byb3BlcnR5KCgpID0+IHtcclxuICAgICAgICAgICAgbGV0IGltZyA9IHRoYXQuX2ZyYW1lSW1hZ2VzW2luZGV4XVxyXG4gICAgICAgICAgICBpbmRleCA9IGluZGV4ID49IHRoYXQuX2ZyYW1lSW1hZ2VzLmxlbmd0aCAtIDEgPyAwIDogaW5kZXggKyAxXHJcbiAgICAgICAgICAgIHJldHVybiBpbWdcclxuICAgICAgICAgIH0sIGZhbHNlKVxyXG4gICAgICAgICAgYWRkQ2x1c3Rlcih0aGF0LnNkaywgdGhhdC5lbnRpdHkpXHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGxldCBpbWFnZSA9IG5ldyBJbWFnZSgpXHJcbiAgICAgIGltYWdlLnNyYyA9XHJcbiAgICAgICAgdXJsIHx8XHJcbiAgICAgICAgdGhhdC5nZXRTb3VyY2VSb290UGF0aCgpICsgJy9pbWcvQS1hYmx1LWJsYW5rLnBuZydcclxuICAgICAgc3dpdGNoICh0aGF0Lm9wdGlvbnMuaGVpZ2h0TW9kZSkge1xyXG4gICAgICAgIGNhc2UgMjpcclxuICAgICAgICBjYXNlICcyJzpcclxuICAgICAgICAgIGhlaWdodE1vZGUgPSBDZXNpdW0uSGVpZ2h0UmVmZXJlbmNlLkNMQU1QX1RPX0dST1VORFxyXG4gICAgICAgICAgYnJlYWtcclxuICAgICAgfVxyXG4gICAgICBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKVxyXG4gICAgICBpbWFnZS5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgbGV0IHJhdGlvID0gaW1hZ2Uud2lkdGggLyBpbWFnZS5oZWlnaHRcclxuICAgICAgICBpbWFnZS53aWR0aCA9IDEwMFxyXG4gICAgICAgIGltYWdlLmhlaWdodCA9IDEwMCAvIHJhdGlvXHJcbiAgICAgICAgbGV0IHdpZHRoID0gaW1hZ2Uud2lkdGhcclxuICAgICAgICBsZXQgaGVpZ2h0ID0gaW1hZ2UuaGVpZ2h0XHJcbiAgICAgICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJywgeyB3aWxsUmVhZEZyZXF1ZW50bHk6IHRydWUgfSlcclxuICAgICAgICBjYW52YXMud2lkdGggPSB3aWR0aFxyXG4gICAgICAgIGNhbnZhcy5oZWlnaHQgPSBoZWlnaHRcclxuICAgICAgICBjdHguZHJhd0ltYWdlKGltYWdlLCAwLCAwLCB3aWR0aCwgaGVpZ2h0KVxyXG4gICAgICAgIGJpbGxib2FyZEggPSBoZWlnaHQgKiAoMzEgLyB3aWR0aClcclxuICAgICAgICBpZiAodGhhdC5lbnRpdHkpIHtcclxuICAgICAgICAgIHRoYXQuZW50aXR5LmJpbGxib2FyZC5pbWdXaWR0aCA9IHdpZHRoXHJcbiAgICAgICAgICB0aGF0LmVudGl0eS5iaWxsYm9hcmQuaW1nSGVpZ2h0ID0gaGVpZ2h0XHJcbiAgICAgICAgICB0aGF0LmVudGl0eS5iaWxsYm9hcmQuaW1hZ2UgPSBjYW52YXNcclxuICAgICAgICAgIGFkZENsdXN0ZXIodGhhdC5zZGssIHRoYXQuZW50aXR5KVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBpbWFnZS5vbmVycm9yID0gZnVuY3Rpb24gKGVycikge1xyXG4gICAgICAgIGNhbnZhcy53aWR0aCA9IDBcclxuICAgICAgICBjYW52YXMuaGVpZ2h0ID0gMFxyXG4gICAgICAgIGJpbGxib2FyZEggPSAwXHJcbiAgICAgICAgaWYgKHRoYXQuZW50aXR5KSB7XHJcbiAgICAgICAgICB0aGF0LmVudGl0eS5iaWxsYm9hcmQuaW1nV2lkdGggPSAwXHJcbiAgICAgICAgICB0aGF0LmVudGl0eS5iaWxsYm9hcmQuaW1nSGVpZ2h0ID0gMFxyXG4gICAgICAgICAgdGhhdC5lbnRpdHkuYmlsbGJvYXJkLmltYWdlID0gY2FudmFzXHJcbiAgICAgICAgICBhZGRDbHVzdGVyKHRoYXQuc2RrLCB0aGF0LmVudGl0eSlcclxuICAgICAgICB9XHJcbiAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgdGhhdC5lbnRpdHkgPSBuZXcgQ2VzaXVtLkVudGl0eSh7XHJcbiAgICAgIHNob3c6IHRoYXQub3B0aW9ucy5zaG93LFxyXG4gICAgICBpZDogdGhhdC5vcHRpb25zLmlkLFxyXG4gICAgICBwb3NpdGlvbjogQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXMoXHJcbiAgICAgICAgcG9zaXRpb24ubG5nLFxyXG4gICAgICAgIHBvc2l0aW9uLmxhdCxcclxuICAgICAgICBwb3NpdGlvbi5hbHRcclxuICAgICAgKSxcclxuICAgICAgYmlsbGJvYXJkOiB7XHJcbiAgICAgICAgaW1hZ2U6IGlzR2xmID8gbmV3IENlc2l1bS5DYWxsYmFja1Byb3BlcnR5KCgpID0+IHtcclxuICAgICAgICAgIGxldCBpbWcgPSB0aGF0Ll9mcmFtZUltYWdlc1tpbmRleF1cclxuICAgICAgICAgIGluZGV4ID0gaW5kZXggPj0gdGhhdC5fZnJhbWVJbWFnZXMubGVuZ3RoIC0gMSA/IDAgOiBpbmRleCArIDFcclxuICAgICAgICAgIHJldHVybiBpbWdcclxuICAgICAgICB9LCBmYWxzZSkgOiBjYW52YXMsXHJcbiAgICAgICAgc2NhbGU6IHRoYXQub3B0aW9ucy5iaWxsYm9hcmQuc2NhbGUsXHJcbiAgICAgICAgZGlzYWJsZURlcHRoVGVzdERpc3RhbmNlOiBuZXcgQ2VzaXVtLkNhbGxiYWNrUHJvcGVydHkoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgcmV0dXJuIGdldEdyb3VuZENvdmVyKCkgPyB1bmRlZmluZWQgOiBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFlcclxuICAgICAgICB9LCBmYWxzZSksXHJcbiAgICAgICAgaGVpZ2h0UmVmZXJlbmNlOiBoZWlnaHRNb2RlLFxyXG4gICAgICAgIGNvbG9yOiB0aGF0Lm9wdGlvbnMuYmlsbGJvYXJkLnNob3dcclxuICAgICAgICAgID8gdW5kZWZpbmVkXHJcbiAgICAgICAgICA6IG5ldyBDZXNpdW0uQ29sb3IoMS4wLCAxLjAsIDEuMCwgMCksXHJcbiAgICAgICAgd2lkdGg6IDMxLFxyXG4gICAgICAgIGhlaWdodDogbmV3IENlc2l1bS5DYWxsYmFja1Byb3BlcnR5KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgIHJldHVybiBiaWxsYm9hcmRIXHJcbiAgICAgICAgfSwgZmFsc2UpLFxyXG4gICAgICAgIHZlcnRpY2FsT3JpZ2luOiBDZXNpdW0uVmVydGljYWxPcmlnaW4uQk9UVE9NXHJcbiAgICAgICAgLy8gcGl4ZWxPZmZzZXQ6IG5ldyBDZXNpdW0uQ2FsbGJhY2tQcm9wZXJ0eShmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgLy8gICByZXR1cm4gbmV3IENlc2l1bS5DYXJ0ZXNpYW4yKFxyXG4gICAgICAgIC8vICAgICAwLFxyXG4gICAgICAgIC8vICAgICAtKGJpbGxib2FyZEggLyAyKSAqIHRoYXQub3B0aW9ucy5iaWxsYm9hcmQuc2NhbGVcclxuICAgICAgICAvLyAgIClcclxuICAgICAgICAvLyB9LCBmYWxzZSlcclxuICAgICAgfSxcclxuICAgICAgbGFiZWw6IHtcclxuICAgICAgICBzaG93OiB0aGF0Lm9wdGlvbnMubGFiZWwuc2hvdyxcclxuICAgICAgICB0ZXh0OiB0aGF0Lm9wdGlvbnMubGFiZWwudGV4dCxcclxuICAgICAgICBkaXNhYmxlRGVwdGhUZXN0RGlzdGFuY2U6IG5ldyBDZXNpdW0uQ2FsbGJhY2tQcm9wZXJ0eShmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICByZXR1cm4gZ2V0R3JvdW5kQ292ZXIoKSA/IHVuZGVmaW5lZCA6IE51bWJlci5QT1NJVElWRV9JTkZJTklUWVxyXG4gICAgICAgIH0sIGZhbHNlKSxcclxuICAgICAgICBoZWlnaHRSZWZlcmVuY2U6IGhlaWdodE1vZGUsXHJcbiAgICAgICAgZm9udDogdGhhdC5vcHRpb25zLmxhYmVsLmZvbnRTaXplICsgJ3B4ICcgKyBmb250LFxyXG4gICAgICAgIGZpbGxDb2xvcjogQ2VzaXVtLkNvbG9yLmZyb21Dc3NDb2xvclN0cmluZyh0aGF0Lm9wdGlvbnMubGFiZWwuY29sb3IpLFxyXG4gICAgICAgIC8vIHZlcnRpY2FsT3JpZ2luIDogQ2VzaXVtLlZlcnRpY2FsT3JpZ2luLkJPVFRPTSxcclxuICAgICAgICBwaXhlbE9mZnNldDogbmV3IENlc2l1bS5DYWxsYmFja1Byb3BlcnR5KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgIGlmICh0aGF0Lm9wdGlvbnMuYmlsbGJvYXJkLnNob3cpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBDZXNpdW0uQ2FydGVzaWFuMihcclxuICAgICAgICAgICAgICAwLFxyXG4gICAgICAgICAgICAgIC1iaWxsYm9hcmRIICogdGhhdC5vcHRpb25zLmJpbGxib2FyZC5zY2FsZSAtXHJcbiAgICAgICAgICAgICAgdGhhdC5vcHRpb25zLmxhYmVsLmZvbnRTaXplIC8gMiAtXHJcbiAgICAgICAgICAgICAgNVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IENlc2l1bS5DYXJ0ZXNpYW4yKFxyXG4gICAgICAgICAgICAgIDAsXHJcbiAgICAgICAgICAgICAgLXRoYXQub3B0aW9ucy5sYWJlbC5mb250U2l6ZSAvIDIgLSA1XHJcbiAgICAgICAgICAgIClcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LCBmYWxzZSksXHJcbiAgICAgICAgb3V0bGluZUNvbG9yOiBDZXNpdW0uQ29sb3IuQkxBQ0ssXHJcbiAgICAgICAgb3V0bGluZVdpZHRoOiAxLFxyXG4gICAgICAgIHN0eWxlOiBDZXNpdW0uTGFiZWxTdHlsZS5GSUxMX0FORF9PVVRMSU5FXHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgICB0aGF0LmVudGl0eS5iaWxsYm9hcmQuaW1nV2lkdGggPSAzMVxyXG4gICAgdGhhdC5lbnRpdHkuYmlsbGJvYXJkLmltZ0hlaWdodCA9IDM2XHJcbiAgICB0aGF0LmVudGl0eS5wb3NpdGlvbiA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzKFxyXG4gICAgICBwb3NpdGlvbi5sbmcsXHJcbiAgICAgIHBvc2l0aW9uLmxhdCxcclxuICAgICAgcG9zaXRpb24uYWx0XHJcbiAgICApXHJcbiAgICBpZiAodGhhdC5vcHRpb25zLmhlaWdodE1vZGUgPT0gMykge1xyXG4gICAgICB0aGF0LnVwZGF0ZUhlaWdodCgpXHJcbiAgICB9XHJcblxyXG4gICAgdGhhdC5yZW5ld1BvaW50KClcclxuICAgIC8vIHRoYXQuZGlmZnVzZVNob3cgPSB0aGF0Lm9wdGlvbnMuZGlmZnVzZVNob3dcclxuICAgIC8vIHRoYXQuc2NhblNob3cgPSB0aGF0Lm9wdGlvbnMuc2NhblNob3dcclxuICAgIHN5bmNEYXRhKHRoYXQuc2RrLCB0aGF0Lm9wdGlvbnMuaWQpXHJcbiAgICBpZiAodGhhdC5vcHRpb25zLnNob3cpIHtcclxuICAgICAgc2V0U3BsaXREaXJlY3Rpb24oMCwgdGhhdC5vcHRpb25zLmlkKVxyXG4gICAgfVxyXG4gICAgaWYgKHRoYXQub3B0aW9ucy5iaWxsYm9hcmQuaXNTZWxlY3QpIHtcclxuICAgICAgdGhhdC5zZWxlY3RCaWxsYm9hcmQoKVxyXG4gICAgfVxyXG4gIH1cclxuICAvLyDpgInkuK3mlYjmnpxcclxuICBzZWxlY3RCaWxsYm9hcmQoKSB7XHJcbiAgICBsZXQgdGhhdCA9IHRoaXNcclxuICAgIHRoaXMuc2RrLnZpZXdlci5zY3JlZW5TcGFjZUV2ZW50SGFuZGxlci5zZXRJbnB1dEFjdGlvbihmdW5jdGlvbiAoY2xpY2spIHtcclxuICAgICAgdmFyIHBpY2tlZE9iamVjdCA9IHRoYXQuc2RrLnZpZXdlci5zY2VuZS5waWNrKGNsaWNrLnBvc2l0aW9uKVxyXG4gICAgICBpZiAoXHJcbiAgICAgICAgQ2VzaXVtLmRlZmluZWQocGlja2VkT2JqZWN0KSAmJlxyXG4gICAgICAgIHBpY2tlZE9iamVjdC5pZCAmJlxyXG4gICAgICAgIHBpY2tlZE9iamVjdC5pZC5pZCA9PT0gJ2FpcnBvcnRCaWxsYm9hcmQnXHJcbiAgICAgICkge1xyXG4gICAgICAgIGlmICh0aGF0LmVudGl0eS5iaWxsYm9hcmQpIHtcclxuICAgICAgICAgIC8vIOWmguaenOeCueWHu+eahOaYr0JpbGxib2FyZO+8jOe7meWug+a3u+WKoOmAieS4reaViOaenFxyXG4gICAgICAgICAgdGhhdC5lbnRpdHkuYmlsbGJvYXJkLmNvbG9yID0gQ2VzaXVtLkNvbG9yLllFTExPVyAvLyDmlLnlj5jpopzoibJcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8g5Y+v5Lul5re75Yqg5pu05aSa6YCJ5Lit5pWI5p6c77yM5L6L5aaC6L655qGG562JXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaWYgKHRoYXQuZW50aXR5LmJpbGxib2FyZCkge1xyXG4gICAgICAgICAgdGhhdC5lbnRpdHkuYmlsbGJvYXJkLmNvbG9yID0gQ2VzaXVtLkNvbG9yLldISVRFXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9LCBDZXNpdW0uU2NyZWVuU3BhY2VFdmVudFR5cGUuTEVGVF9DTElDSylcclxuICB9XHJcbiAgZ2V0IGF0dHJpYnV0ZVNlbGVjdCgpIHtcclxuICAgIHJldHVybiBbXHJcbiAgICAgIHtcclxuICAgICAgICBuYW1lOiAn5a+M5paH5pysJyxcclxuICAgICAgICB2YWx1ZTogJ+WvjOaWh+acrCcsXHJcbiAgICAgICAga2V5OiAncmljaFRleHQnXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBuYW1lOiAn6ZO+5o6lJyxcclxuICAgICAgICB2YWx1ZTogJ+mTvuaOpScsXHJcbiAgICAgICAga2V5OiAnbGluaydcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIG5hbWU6ICdJUOaRhOWDj+WktCcsXHJcbiAgICAgICAgdmFsdWU6ICdJUOaRhOWDj+WktCcsXHJcbiAgICAgICAga2V5OiAnY2FtZXJhJ1xyXG4gICAgICB9LFxyXG4gICAgICAvLyB7XHJcbiAgICAgIC8vICAgbmFtZTogJ0lTQ+aRhOWDj+WktCcsXHJcbiAgICAgIC8vICAgdmFsdWU6ICdJU0PmkYTlg4/lpLQnLFxyXG4gICAgICAvLyAgIGtleTogJ2lzYydcclxuICAgICAgLy8gfSxcclxuICAgICAgLy8ge1xyXG4gICAgICAvLyAgIG5hbWU6ICfkvKDmhJ/lmagnLFxyXG4gICAgICAvLyAgIHZhbHVlOiAn5Lyg5oSf5ZmoJyxcclxuICAgICAgLy8gICBrZXk6ICdzZW5zb3InXHJcbiAgICAgIC8vIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBuYW1lOiAn5YWo5pmv5Zu+JyxcclxuICAgICAgICB2YWx1ZTogJ+WFqOaZr+WbvicsXHJcbiAgICAgICAga2V5OiAndnInXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBuYW1lOiAn54mp6LWEJyxcclxuICAgICAgICB2YWx1ZTogJ+eJqei1hCcsXHJcbiAgICAgICAga2V5OiAnZ29vZHMnXHJcbiAgICAgIH1cclxuICAgIF1cclxuICB9XHJcblxyXG4gIGdldCBzaG93KCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5zaG93XHJcbiAgfVxyXG4gIHNldCBzaG93KHYpIHtcclxuICAgIGlmICghdGhpcy5pc1Nob3dWaWV3KSB7XHJcbiAgICAgIHRoaXMub3B0aW9ucy5zaG93ID0gdlxyXG4gICAgICB0aGlzLm9yaWdpbmFsT3B0aW9ucy5zaG93ID0gdlxyXG4gICAgfVxyXG4gICAgaWYgKCF0aGlzLnNob3dWaWV3IHx8IHRoaXMuc2hvd1ZpZXcgPT0gMykge1xyXG4gICAgICB0aGlzLmVudGl0eSAmJiAodGhpcy5lbnRpdHkuc2hvdyA9IHRoaXMub3B0aW9ucy5zaG93KVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMuZW50aXR5ICYmICh0aGlzLmVudGl0eS5zaG93ID0gZmFsc2UpXHJcbiAgICB9XHJcbiAgICBzeW5jRGF0YSh0aGlzLnNkaywgdGhpcy5vcHRpb25zLmlkKVxyXG4gICAgc3luY1NwbGl0RGF0YSh0aGlzLnNkaywgdGhpcy5vcHRpb25zLmlkKVxyXG5cclxuICAgIGlmICh0aGlzLl9EaWFsb2dPYmplY3QgJiYgdGhpcy5fRGlhbG9nT2JqZWN0LnNob3dCdG4pIHtcclxuICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0LnNob3dCdG4uY2hlY2tlZCA9IHRoaXMub3B0aW9ucy5zaG93XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5pc1Nob3dWaWV3ID0gZmFsc2VcclxuICAgIC8vIGlmICh2KSB7XHJcbiAgICAvLyAgIGlmICh0aGlzLmRpZmZ1c2VTaG93KSB7XHJcbiAgICAvLyAgICAgdGhpcy5kaWZmdXNlU2hvdyA9IHRydWVcclxuICAgIC8vICAgfVxyXG4gICAgLy8gICBpZiAodGhpcy5zY2FuU2hvdykge1xyXG4gICAgLy8gICAgIHRoaXMuc2NhblNob3cgPSB0cnVlXHJcbiAgICAvLyAgIH1cclxuICAgIC8vIH1cclxuICAgIC8vIGVsc2Uge1xyXG4gICAgLy8gICBpZiAodGhpcy5kaWZmdXNlKSB7XHJcbiAgICAvLyAgICAgdGhpcy5kaWZmdXNlLnNob3cgPSB2XHJcbiAgICAvLyAgIH1cclxuICAgIC8vICAgaWYgKHRoaXMuc2Nhbikge1xyXG4gICAgLy8gICAgIHRoaXMuc2Nhbi5zaG93ID0gdlxyXG4gICAgLy8gICB9XHJcbiAgICAvLyB9XHJcbiAgfVxyXG5cclxuICBnZXQgaGVpZ2h0TW9kZSgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuaGVpZ2h0TW9kZSA/IHRoaXMub3B0aW9ucy5oZWlnaHRNb2RlIDogMFxyXG4gIH1cclxuICBzZXQgaGVpZ2h0TW9kZSh2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMuaGVpZ2h0TW9kZSA9IHYgPyB2IDogMFxyXG4gICAgdGhpcy5vcHRpb25zLmhlaWdodE1vZGUgPSB2IHx8IHYgPT0gMCA/IHYgOiAzXHJcbiAgICBsZXQgaGVpZ2h0TW9kZVxyXG4gICAgbGV0IGhlaWdodE1vZGVOYW1lID0gJydcclxuICAgIHN3aXRjaCAodGhpcy5vcHRpb25zLmhlaWdodE1vZGUpIHtcclxuICAgICAgY2FzZSAnMCc6XHJcbiAgICAgIGNhc2UgMDpcclxuICAgICAgICBoZWlnaHRNb2RlID0gQ2VzaXVtLkhlaWdodFJlZmVyZW5jZS5OT05FXHJcbiAgICAgICAgYnJlYWtcclxuICAgICAgY2FzZSAnMSc6XHJcbiAgICAgIGNhc2UgMTpcclxuICAgICAgICBoZWlnaHRNb2RlID0gQ2VzaXVtLkhlaWdodFJlZmVyZW5jZS5OT05FXHJcbiAgICAgICAgYnJlYWtcclxuICAgICAgY2FzZSAnMic6XHJcbiAgICAgIGNhc2UgMjpcclxuICAgICAgICBoZWlnaHRNb2RlID0gQ2VzaXVtLkhlaWdodFJlZmVyZW5jZS5DTEFNUF9UT19HUk9VTkRcclxuICAgICAgICBicmVha1xyXG4gICAgICBjYXNlICczJzpcclxuICAgICAgY2FzZSAzOlxyXG4gICAgICAgIGhlaWdodE1vZGUgPSBDZXNpdW0uSGVpZ2h0UmVmZXJlbmNlLk5PTkVcclxuICAgICAgICBsZXQgb2JqZWN0c1RvRXhjbHVkZSA9IFtdXHJcbiAgICAgICAgZm9yIChsZXQgW2tleSwgdmFsdWVdIG9mIHRoaXMuc2RrLmVudGl0eU1hcCkge1xyXG4gICAgICAgICAgaWYgKHZhbHVlLnR5cGUgPT09ICdSYWRhclNjYW5TdGVyZW9zY29waWMnICYmIHZhbHVlLmVudGl0eSkge1xyXG4gICAgICAgICAgICBvYmplY3RzVG9FeGNsdWRlLnB1c2godmFsdWUuZW50aXR5KVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmdldENsYW1wVG9IZWlnaHQodGhpcy5vcHRpb25zLnBvc2l0aW9uLCBvYmplY3RzVG9FeGNsdWRlKS50aGVuKGggPT4ge1xyXG4gICAgICAgICAgdGhpcy5hbHQgPSBOdW1iZXIoaC50b0ZpeGVkKDIpKVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgYnJlYWtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmVudGl0eSkge1xyXG4gICAgICB0aGlzLmVudGl0eS5iaWxsYm9hcmQuaGVpZ2h0UmVmZXJlbmNlID0gaGVpZ2h0TW9kZVxyXG4gICAgICB0aGlzLmVudGl0eS5sYWJlbC5oZWlnaHRSZWZlcmVuY2UgPSBoZWlnaHRNb2RlXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgbGFiZWxUZXh0KCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5sYWJlbC50ZXh0XHJcbiAgfVxyXG4gIHNldCBsYWJlbFRleHQodikge1xyXG4gICAgdGhpcy5vcHRpb25zLmxhYmVsLnRleHQgPSB2XHJcbiAgICB0aGlzLm9wdGlvbnMubmFtZSA9IHZcclxuICAgIHRoaXMuZW50aXR5ICYmICh0aGlzLmVudGl0eS5sYWJlbC50ZXh0ID0gdiArICcnKVxyXG4gICAgdGhpcy5fZWxtcy5sYWJlbFRleHQgJiZcclxuICAgICAgdGhpcy5fZWxtcy5sYWJlbFRleHQuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICBpdGVtLnZhbHVlID0gdlxyXG4gICAgICB9KVxyXG4gIH1cclxuXHJcbiAgZ2V0IGxuZygpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMucG9zaXRpb24ubG5nXHJcbiAgfVxyXG4gIHNldCBsbmcodikge1xyXG4gICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uLmxuZyA9IE51bWJlcihOdW1iZXIodikudG9GaXhlZCg4KSlcclxuICAgIC8vIHRoaXMuc2NhbiAmJiAodGhpcy5zY2FuLmxuZyA9IHYpXHJcbiAgICAvLyB0aGlzLmRpZmZ1c2UgJiYgKHRoaXMuZGlmZnVzZS5sbmcgPSB2KVxyXG4gICAgdGhpcy5yZW5ld1BvaW50KClcclxuICAgIHRoaXMuY29vcmRpbmF0ZSA9IHRoaXMub3B0aW9ucy5jb29yZGluYXRlXHJcbiAgICB0aGlzLl9wcm9qQ29udmVydCAmJiB0aGlzLl9wcm9qQ29udmVydCgpXHJcbiAgICB0aGlzLl9lbG1zLmxuZyAmJlxyXG4gICAgICB0aGlzLl9lbG1zLmxuZy5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgIGl0ZW0udmFsdWUgPSB2XHJcbiAgICAgIH0pXHJcbiAgfVxyXG5cclxuICBnZXQgbGF0KCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5wb3NpdGlvbi5sYXRcclxuICB9XHJcbiAgc2V0IGxhdCh2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMucG9zaXRpb24ubGF0ID0gTnVtYmVyKE51bWJlcih2KS50b0ZpeGVkKDgpKVxyXG4gICAgLy8gdGhpcy5zY2FuICYmICh0aGlzLnNjYW4ubGF0ID0gdilcclxuICAgIC8vIHRoaXMuZGlmZnVzZSAmJiAodGhpcy5kaWZmdXNlLmxhdCA9IHYpXHJcbiAgICB0aGlzLnJlbmV3UG9pbnQoKVxyXG4gICAgdGhpcy5jb29yZGluYXRlID0gdGhpcy5vcHRpb25zLmNvb3JkaW5hdGVcclxuICAgIHRoaXMuX3Byb2pDb252ZXJ0ICYmIHRoaXMuX3Byb2pDb252ZXJ0KClcclxuICAgIHRoaXMuX2VsbXMubGF0ICYmXHJcbiAgICAgIHRoaXMuX2VsbXMubGF0LmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgaXRlbS52YWx1ZSA9IHZcclxuICAgICAgfSlcclxuICB9XHJcblxyXG4gIGdldCBhbHQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLnBvc2l0aW9uLmFsdFxyXG4gIH1cclxuICBzZXQgYWx0KHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbi5hbHQgPSBOdW1iZXIoTnVtYmVyKHYpLnRvRml4ZWQoMikpXHJcbiAgICAvLyB0aGlzLnNjYW4gJiYgKHRoaXMuc2Nhbi5hbHQgPSB2KVxyXG4gICAgLy8gdGhpcy5kaWZmdXNlICYmICh0aGlzLmRpZmZ1c2UuYWx0ID0gdilcclxuICAgIHRoaXMucmVuZXdQb2ludCgpXHJcbiAgICB0aGlzLmNvb3JkaW5hdGUgPSB0aGlzLm9wdGlvbnMuY29vcmRpbmF0ZVxyXG4gIH1cclxuXHJcbiAgZ2V0IG5lYXIoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLm5lYXJcclxuICB9XHJcbiAgc2V0IG5lYXIodikge1xyXG4gICAgbGV0IG5lYXIgPSB2XHJcbiAgICBpZiAobmVhciA+IHRoaXMuZmFyKSB7XHJcbiAgICAgIG5lYXIgPSB0aGlzLmZhclxyXG4gICAgfVxyXG4gICAgdGhpcy5vcHRpb25zLm5lYXIgPSBuZWFyXHJcbiAgICB0aGlzLnJlbmV3UG9pbnQoKVxyXG4gICAgdGhpcy5fZWxtcy5uZWFyICYmXHJcbiAgICAgIHRoaXMuX2VsbXMubmVhci5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgIGl0ZW0udmFsdWUgPSBuZWFyXHJcbiAgICAgIH0pXHJcbiAgfVxyXG5cclxuICBnZXQgZmFyKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5mYXJcclxuICB9XHJcbiAgc2V0IGZhcih2KSB7XHJcbiAgICBsZXQgZmFyID0gdlxyXG4gICAgaWYgKGZhciA8IHRoaXMubmVhcikge1xyXG4gICAgICBmYXIgPSB0aGlzLm5lYXJcclxuICAgIH1cclxuICAgIHRoaXMub3B0aW9ucy5mYXIgPSBmYXJcclxuICAgIHRoaXMucmVuZXdQb2ludCgpXHJcbiAgICB0aGlzLl9lbG1zLmZhciAmJlxyXG4gICAgICB0aGlzLl9lbG1zLmZhci5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgIGl0ZW0udmFsdWUgPSBmYXJcclxuICAgICAgfSlcclxuICB9XHJcblxyXG4gIGdldCBzY2FsZUJ5RGlzdGFuY2UoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLnNjYWxlQnlEaXN0YW5jZVxyXG4gIH1cclxuICBzZXQgc2NhbGVCeURpc3RhbmNlKHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5zY2FsZUJ5RGlzdGFuY2UgPSB2XHJcbiAgICB0aGlzLnJlbmV3UG9pbnQoKVxyXG4gICAgdGhpcy5fZWxtcy5zY2FsZUJ5RGlzdGFuY2UgJiZcclxuICAgICAgdGhpcy5fZWxtcy5zY2FsZUJ5RGlzdGFuY2UuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICBpdGVtLmNoZWNrZWQgPSB2XHJcbiAgICAgIH0pXHJcbiAgfVxyXG5cclxuICBnZXQgYmlsbGJvYXJkU2hvdygpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuYmlsbGJvYXJkLnNob3dcclxuICB9XHJcbiAgc2V0IGJpbGxib2FyZFNob3codikge1xyXG4gICAgdGhpcy5vcHRpb25zLmJpbGxib2FyZC5zaG93ID0gdlxyXG4gICAgdGhpcy5lbnRpdHkgJiZcclxuICAgICAgKHRoaXMuZW50aXR5LmJpbGxib2FyZC5jb2xvciA9IHRoaXMub3B0aW9ucy5iaWxsYm9hcmQuc2hvd1xyXG4gICAgICAgID8gdW5kZWZpbmVkXHJcbiAgICAgICAgOiBuZXcgQ2VzaXVtLkNvbG9yKDEuMCwgMS4wLCAxLjAsIDApKVxyXG4gICAgdGhpcy5fZWxtcy5iaWxsYm9hcmRTaG93ICYmXHJcbiAgICAgIHRoaXMuX2VsbXMuYmlsbGJvYXJkU2hvdy5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgIGl0ZW0udmFsdWUgPSB2XHJcbiAgICAgIH0pXHJcbiAgfVxyXG5cclxuICBnZXQgYmlsbGJvYXJkSW1hZ2UoKSB7XHJcbiAgICBsZXQgdXJsID0gdGhpcy5vcHRpb25zLmJpbGxib2FyZC5pbWFnZVxyXG4gICAgaWYgKHVybCAmJiAhdXJsLnN0YXJ0c1dpdGgoXCJodHRwXCIpKSB7XHJcbiAgICAgIC8v6K+05piO5piv5pys5Zyw55qEanNvbu+8jOWcqOejgeebmOS4reWtmOWcqOeahFxyXG4gICAgICBpZiAoIXVybC5pbmNsdWRlcyhcIjpcIikpIHtcclxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmhvc3QpIHtcclxuICAgICAgICAgIGxldCBvID0gbmV3IFVSTCh1cmwsIHRoaXMub3B0aW9ucy5ob3N0KVxyXG4gICAgICAgICAgdXJsID0gby5ocmVmXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdXJsXHJcbiAgfVxyXG4gIHNldCBiaWxsYm9hcmRJbWFnZSh2KSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzXHJcbiAgICB0aGlzLm9wdGlvbnMuYmlsbGJvYXJkLmltYWdlID0gdGhpcy5yZXBsYWNlSG9zdCh2LCB0aGlzLm9wdGlvbnMuaG9zdClcclxuICAgIGxldCB1cmwgPVxyXG4gICAgICB0aGlzLm9wdGlvbnMuYmlsbGJvYXJkLmltYWdlIHx8XHJcbiAgICAgIGdldEJpbGxib2FyZERlZmF1bHRVcmwodGhpcy5vcHRpb25zLmJpbGxib2FyZC5kZWZhdWx0SW1hZ2UpIHx8XHJcbiAgICAgIHRoaXMuZ2V0U291cmNlUm9vdFBhdGgoKSArICcvaW1nL0EtYWJsdS1ibGFuay5wbmcnXHJcblxyXG4gICAgdGhpcy5fZWxtcy5iaWxsYm9hcmRJbWFnZSAmJlxyXG4gICAgICB0aGlzLl9lbG1zLmJpbGxib2FyZEltYWdlLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgaXRlbS5zcmMgPSB1cmxcclxuICAgICAgfSlcclxuXHJcbiAgICBsZXQgaXNHbGYgPSBmYWxzZVxyXG4gICAgbGV0IHN1cGVyR2lmXHJcbiAgICBpZiAoX3RoaXMuZW50aXR5LmJpbGxib2FyZC5pbWFnZSAmJiBfdGhpcy5lbnRpdHkuYmlsbGJvYXJkLmltYWdlLmdldFZhKSB7IH1cclxuICAgIGlmICh1cmwgJiYgdXJsLmVuZHNXaXRoKCdnaWYnKSkge1xyXG4gICAgICBpc0dsZiA9IHRydWVcclxuXHJcbiAgICAgIGxldCBnaWZJbWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKVxyXG4gICAgICBnaWZJbWcuc2V0QXR0cmlidXRlKCdyZWw6YW5pbWF0ZWRfc3JjJywgdXJsKVxyXG4gICAgICBnaWZJbWcuc2V0QXR0cmlidXRlKCdyZWw6YXV0b19wbGF5JywgJzEnKVxyXG4gICAgICBjb25zdCBpbWdEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKVxyXG4gICAgICBpbWdEaXYuYXBwZW5kQ2hpbGQoZ2lmSW1nKVxyXG4gICAgICBsZXQgaWQgPSBDZXNpdW0uY3JlYXRlR3VpZCgpXHJcbiAgICAgIHN1cGVyR2lmID0gbmV3IFN1cGVyR2lmKHsgZ2lmOiBnaWZJbWcgfSlcclxuICAgICAgdGhpcy5fc3VwZXJHaWYgPSBzdXBlckdpZlxyXG4gICAgICB0aGlzLl9zdXBlckdpZi5pZCA9IGlkXHJcbiAgICAgIGxldCBiaWxsYm9hcmRIID0gMzZcclxuICAgICAgbGV0IGluZGV4ID0gMFxyXG4gICAgICBfdGhpcy5fZnJhbWVJbWFnZXMgPSBbXVxyXG4gICAgICBzdXBlckdpZi5sb2FkKGZ1bmN0aW9uIChzdGF0dXMpIHtcclxuICAgICAgICBpZiAoc3RhdHVzID09IDQwNCkge1xyXG4gICAgICAgICAgbGV0IHdpZHRoID0gMzFcclxuICAgICAgICAgIGxldCBoZWlnaHQgPSAzNlxyXG4gICAgICAgICAgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJylcclxuICAgICAgICAgIGNhbnZhcy53aWR0aCA9IDBcclxuICAgICAgICAgIGNhbnZhcy5oZWlnaHQgPSAwXHJcbiAgICAgICAgICBiaWxsYm9hcmRIID0gMFxyXG4gICAgICAgICAgX3RoaXMuZW50aXR5LmJpbGxib2FyZC5pbWdXaWR0aCA9IDBcclxuICAgICAgICAgIF90aGlzLmVudGl0eS5iaWxsYm9hcmQuaW1nSGVpZ2h0ID0gMFxyXG4gICAgICAgICAgX3RoaXMuZW50aXR5ICYmIChfdGhpcy5lbnRpdHkuYmlsbGJvYXJkLmltYWdlID0gY2FudmFzKVxyXG4gICAgICAgICAgX3RoaXMuZW50aXR5LmJpbGxib2FyZC5oZWlnaHQgPSBuZXcgQ2VzaXVtLkNhbGxiYWNrUHJvcGVydHkoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gMFxyXG4gICAgICAgICAgfSwgZmFsc2UpXHJcbiAgICAgICAgICBfdGhpcy5lbnRpdHkubGFiZWwucGl4ZWxPZmZzZXQgPSBuZXcgQ2VzaXVtLkNhbGxiYWNrUHJvcGVydHkoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IENlc2l1bS5DYXJ0ZXNpYW4yKDAsIDApXHJcbiAgICAgICAgICB9LCBmYWxzZSlcclxuICAgICAgICAgIGJpbGxib2FyZEggPSBoZWlnaHQgKiAoMzEgLyB3aWR0aClcclxuICAgICAgICAgIHJldHVyblxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoX3RoaXMuX3N1cGVyR2lmLmlkICE9IGlkKSB7XHJcbiAgICAgICAgICByZXR1cm5cclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IGxlbmd0aCA9IHN1cGVyR2lmLmdldF9sZW5ndGgoKVxyXG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IGxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBzdXBlckdpZi5tb3ZlX3RvKGkpXHJcbiAgICAgICAgICBfdGhpcy5fZnJhbWVJbWFnZXMucHVzaChzdXBlckdpZi5nZXRfY2FudmFzKCkudG9EYXRhVVJMKCkpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGNhbnZhcyA9IHN1cGVyR2lmLmdldF9jYW52YXMoKVxyXG4gICAgICAgIGxldCB3aWR0aCA9IGNhbnZhcy53aWR0aFxyXG4gICAgICAgIGxldCBoZWlnaHQgPSBjYW52YXMuaGVpZ2h0XHJcbiAgICAgICAgYmlsbGJvYXJkSCA9IGhlaWdodCAqICgzMSAvIHdpZHRoKVxyXG4gICAgICAgIF90aGlzLmVudGl0eS5iaWxsYm9hcmQuaW1nV2lkdGggPSB3aWR0aFxyXG4gICAgICAgIF90aGlzLmVudGl0eS5iaWxsYm9hcmQuaW1nSGVpZ2h0ID0gaGVpZ2h0XHJcbiAgICAgICAgX3RoaXMuZW50aXR5ICYmIChfdGhpcy5lbnRpdHkuYmlsbGJvYXJkLmltYWdlID0gbmV3IENlc2l1bS5DYWxsYmFja1Byb3BlcnR5KCgpID0+IHtcclxuICAgICAgICAgIGxldCBpbWcgPSBfdGhpcy5fZnJhbWVJbWFnZXNbaW5kZXhdXHJcbiAgICAgICAgICBpbmRleCA9IGluZGV4ID49IF90aGlzLl9mcmFtZUltYWdlcy5sZW5ndGggLSAxID8gMCA6IGluZGV4ICsgMVxyXG4gICAgICAgICAgcmV0dXJuIGltZ1xyXG4gICAgICAgIH0sIGZhbHNlKSlcclxuICAgICAgICBfdGhpcy5lbnRpdHkuYmlsbGJvYXJkLmhlaWdodCA9IG5ldyBDZXNpdW0uQ2FsbGJhY2tQcm9wZXJ0eShmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICByZXR1cm4gYmlsbGJvYXJkSFxyXG4gICAgICAgIH0sIGZhbHNlKVxyXG4gICAgICAgIF90aGlzLmVudGl0eS5sYWJlbC5waXhlbE9mZnNldCA9IG5ldyBDZXNpdW0uQ2FsbGJhY2tQcm9wZXJ0eShmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICBpZiAoX3RoaXMub3B0aW9ucy5iaWxsYm9hcmQuc2hvdykge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IENlc2l1bS5DYXJ0ZXNpYW4yKFxyXG4gICAgICAgICAgICAgIDAsXHJcbiAgICAgICAgICAgICAgLWJpbGxib2FyZEggKiBfdGhpcy5vcHRpb25zLmJpbGxib2FyZC5zY2FsZSAtXHJcbiAgICAgICAgICAgICAgX3RoaXMub3B0aW9ucy5sYWJlbC5mb250U2l6ZSAvIDIgLVxyXG4gICAgICAgICAgICAgIDVcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBDZXNpdW0uQ2FydGVzaWFuMigwLCAtX3RoaXMub3B0aW9ucy5sYWJlbC5mb250U2l6ZSAvIDIgLSA1KVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sIGZhbHNlKVxyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGxldCBpbWFnZSA9IG5ldyBJbWFnZSgpXHJcbiAgICAgIGltYWdlLnNyYyA9IHVybFxyXG4gICAgICBsZXQgYmlsbGJvYXJkSCA9IDM2XHJcbiAgICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpXHJcbiAgICAgIGltYWdlLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBsZXQgcmF0aW8gPSBpbWFnZS53aWR0aCAvIGltYWdlLmhlaWdodFxyXG4gICAgICAgIGltYWdlLndpZHRoID0gMTAwXHJcbiAgICAgICAgaW1hZ2UuaGVpZ2h0ID0gMTAwIC8gcmF0aW9cclxuICAgICAgICBsZXQgd2lkdGggPSBpbWFnZS53aWR0aFxyXG4gICAgICAgIGxldCBoZWlnaHQgPSBpbWFnZS5oZWlnaHRcclxuICAgICAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnLCB7IHdpbGxSZWFkRnJlcXVlbnRseTogdHJ1ZSB9KVxyXG4gICAgICAgIGNhbnZhcy53aWR0aCA9IHdpZHRoXHJcbiAgICAgICAgY2FudmFzLmhlaWdodCA9IGhlaWdodFxyXG4gICAgICAgIGN0eC5kcmF3SW1hZ2UoaW1hZ2UsIDAsIDAsIHdpZHRoLCBoZWlnaHQpXHJcbiAgICAgICAgYmlsbGJvYXJkSCA9IGhlaWdodCAqICgzMSAvIHdpZHRoKVxyXG4gICAgICAgIF90aGlzLmVudGl0eS5iaWxsYm9hcmQuaW1nV2lkdGggPSB3aWR0aFxyXG4gICAgICAgIF90aGlzLmVudGl0eS5iaWxsYm9hcmQuaW1nSGVpZ2h0ID0gaGVpZ2h0XHJcbiAgICAgICAgX3RoaXMuZW50aXR5ICYmIChfdGhpcy5lbnRpdHkuYmlsbGJvYXJkLmltYWdlID0gY2FudmFzKVxyXG4gICAgICAgIF90aGlzLmVudGl0eS5iaWxsYm9hcmQuaGVpZ2h0ID0gbmV3IENlc2l1bS5DYWxsYmFja1Byb3BlcnR5KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgIHJldHVybiBiaWxsYm9hcmRIXHJcbiAgICAgICAgfSwgZmFsc2UpXHJcbiAgICAgICAgX3RoaXMuZW50aXR5LmxhYmVsLnBpeGVsT2Zmc2V0ID0gbmV3IENlc2l1bS5DYWxsYmFja1Byb3BlcnR5KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgIGlmIChfdGhpcy5vcHRpb25zLmJpbGxib2FyZC5zaG93KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgQ2VzaXVtLkNhcnRlc2lhbjIoXHJcbiAgICAgICAgICAgICAgMCxcclxuICAgICAgICAgICAgICAtYmlsbGJvYXJkSCAqIF90aGlzLm9wdGlvbnMuYmlsbGJvYXJkLnNjYWxlIC1cclxuICAgICAgICAgICAgICBfdGhpcy5vcHRpb25zLmxhYmVsLmZvbnRTaXplIC8gMiAtXHJcbiAgICAgICAgICAgICAgNVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IENlc2l1bS5DYXJ0ZXNpYW4yKDAsIC1fdGhpcy5vcHRpb25zLmxhYmVsLmZvbnRTaXplIC8gMiAtIDUpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSwgZmFsc2UpXHJcbiAgICAgICAgYmlsbGJvYXJkSCA9IGhlaWdodCAqICgzMSAvIHdpZHRoKVxyXG4gICAgICB9XHJcbiAgICAgIGltYWdlLm9uZXJyb3IgPSBmdW5jdGlvbiAoZXJyKSB7XHJcbiAgICAgICAgbGV0IHdpZHRoID0gMzFcclxuICAgICAgICBsZXQgaGVpZ2h0ID0gMzZcclxuICAgICAgICBjYW52YXMud2lkdGggPSAwXHJcbiAgICAgICAgY2FudmFzLmhlaWdodCA9IDBcclxuICAgICAgICBiaWxsYm9hcmRIID0gMFxyXG4gICAgICAgIF90aGlzLmVudGl0eS5iaWxsYm9hcmQuaW1nV2lkdGggPSAwXHJcbiAgICAgICAgX3RoaXMuZW50aXR5LmJpbGxib2FyZC5pbWdIZWlnaHQgPSAwXHJcbiAgICAgICAgX3RoaXMuZW50aXR5ICYmIChfdGhpcy5lbnRpdHkuYmlsbGJvYXJkLmltYWdlID0gY2FudmFzKVxyXG4gICAgICAgIF90aGlzLmVudGl0eS5iaWxsYm9hcmQuaGVpZ2h0ID0gbmV3IENlc2l1bS5DYWxsYmFja1Byb3BlcnR5KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgIHJldHVybiAwXHJcbiAgICAgICAgfSwgZmFsc2UpXHJcbiAgICAgICAgX3RoaXMuZW50aXR5LmxhYmVsLnBpeGVsT2Zmc2V0ID0gbmV3IENlc2l1bS5DYWxsYmFja1Byb3BlcnR5KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgIHJldHVybiBuZXcgQ2VzaXVtLkNhcnRlc2lhbjIoMCwgMClcclxuICAgICAgICB9LCBmYWxzZSlcclxuICAgICAgICBiaWxsYm9hcmRIID0gaGVpZ2h0ICogKDMxIC8gd2lkdGgpXHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgYmlsbGJvYXJkU2NhbGUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmJpbGxib2FyZC5zY2FsZVxyXG4gIH1cclxuICBzZXQgYmlsbGJvYXJkU2NhbGUodikge1xyXG4gICAgdGhpcy5vcHRpb25zLmJpbGxib2FyZC5zY2FsZSA9IHZcclxuICAgIHRoaXMucmVuZXdQb2ludCgpXHJcbiAgICB0aGlzLl9lbG1zLmJpbGxib2FyZFNjYWxlICYmXHJcbiAgICAgIHRoaXMuX2VsbXMuYmlsbGJvYXJkU2NhbGUuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICBpdGVtLnZhbHVlID0gdlxyXG4gICAgICB9KVxyXG4gIH1cclxuXHJcbiAgZ2V0IGxhYmVsU2hvdygpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubGFiZWwuc2hvd1xyXG4gIH1cclxuICBzZXQgbGFiZWxTaG93KHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5sYWJlbC5zaG93ID0gdlxyXG4gICAgdGhpcy5lbnRpdHkgJiYgKHRoaXMuZW50aXR5LmxhYmVsLnNob3cgPSB2KVxyXG4gICAgdGhpcy5fZWxtcy5sYWJlbFNob3cgJiZcclxuICAgICAgdGhpcy5fZWxtcy5sYWJlbFNob3cuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICBpdGVtLnZhbHVlID0gdlxyXG4gICAgICB9KVxyXG4gIH1cclxuXHJcbiAgZ2V0IGxhYmVsRm9udEZhbWlseSgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubGFiZWwuZm9udEZhbWlseVxyXG4gIH1cclxuXHJcbiAgc2V0IGxhYmVsRm9udEZhbWlseSh2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMubGFiZWwuZm9udEZhbWlseSA9IHYgfHwgMFxyXG4gICAgdGhpcy5yZW5ld1BvaW50KClcclxuXHJcbiAgICBsZXQgbmFtZSA9IGdldEZvbnRGYW1pbHlOYW1lKHRoaXMubGFiZWxGb250RmFtaWx5KSB8fCAnJ1xyXG4gICAgdGhpcy5fZWxtcy5sYWJlbEZvbnRGYW1pbHkgJiZcclxuICAgICAgdGhpcy5fZWxtcy5sYWJlbEZvbnRGYW1pbHkuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICBpdGVtLnZhbHVlID0gbmFtZVxyXG4gICAgICB9KVxyXG4gIH1cclxuXHJcbiAgZ2V0IGxhYmVsRm9udFNpemUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmxhYmVsLmZvbnRTaXplXHJcbiAgfVxyXG4gIHNldCBsYWJlbEZvbnRTaXplKHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5sYWJlbC5mb250U2l6ZSA9IHZcclxuICAgIHRoaXMucmVuZXdQb2ludCgpXHJcbiAgICB0aGlzLl9lbG1zLmxhYmVsRm9udFNpemUgJiZcclxuICAgICAgdGhpcy5fZWxtcy5sYWJlbEZvbnRTaXplLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgaXRlbS52YWx1ZSA9IHZcclxuICAgICAgfSlcclxuICB9XHJcblxyXG4gIGdldCBsYWJlbENvbG9yKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5sYWJlbC5jb2xvclxyXG4gIH1cclxuICBzZXQgbGFiZWxDb2xvcih2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMubGFiZWwuY29sb3IgPSB2IHx8ICcjMDBmZmZmJ1xyXG4gICAgdGhpcy5yZW5ld1BvaW50KClcclxuICAgIGlmICh0aGlzLl9lbG1zLmxhYmVsQ29sb3IpIHtcclxuICAgICAgdGhpcy5fZWxtcy5sYWJlbENvbG9yLmZvckVhY2goKGl0ZW0sIGkpID0+IHtcclxuICAgICAgICBsZXQgY29sb3JQaWNrZXIgPSBuZXcgWUpDb2xvclBpY2tlcih7XHJcbiAgICAgICAgICBlbDogaXRlbS5lbCxcclxuICAgICAgICAgIHNpemU6ICdtaW5pJywgLy/popzoibJib3jnsbvlnotcclxuICAgICAgICAgIGFscGhhOiB0cnVlLCAvL+aYr+WQpuW8gOWQr+mAj+aYjuW6plxyXG4gICAgICAgICAgZGVmYXVsdENvbG9yOiB0aGlzLm9wdGlvbnMubGFiZWwuY29sb3IsXHJcbiAgICAgICAgICBkaXNhYmxlZDogZmFsc2UsIC8v5piv5ZCm56aB5q2i5omT5byA6aKc6Imy6YCJ5oup5ZmoXHJcbiAgICAgICAgICBvcGVuUGlja2VyQW5pOiAnb3BhY2l0eScsIC8v5omT5byA6aKc6Imy6YCJ5oup5Zmo5Yqo55S7XHJcbiAgICAgICAgICBzdXJlOiBjID0+IHtcclxuICAgICAgICAgICAgdGhpcy5sYWJlbENvbG9yID0gY1xyXG4gICAgICAgICAgfSwgLy/ngrnlh7vnoa7orqTmjInpkq7kuovku7blm57osINcclxuICAgICAgICAgIGNsZWFyOiAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubGFiZWxDb2xvciA9ICdyZ2JhKDAsMjU1LDI1NSwxKSdcclxuICAgICAgICAgIH0gLy/ngrnlh7vmuIXnqbrmjInpkq7kuovku7blm57osINcclxuICAgICAgICB9KVxyXG4gICAgICAgIHRoaXMuX2VsbXMubGFiZWxDb2xvcltpXSA9IGNvbG9yUGlja2VyXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBnZXQgZGlmZnVzZVNob3coKSB7XHJcbiAgLy8gICByZXR1cm4gdGhpcy5vcHRpb25zLmRpZmZ1c2VTaG93XHJcbiAgLy8gfVxyXG4gIC8vIHNldCBkaWZmdXNlU2hvdyh2KSB7XHJcbiAgLy8gICB0aGlzLm9wdGlvbnMuZGlmZnVzZVNob3cgPSB2XHJcbiAgLy8gICB0aGlzLl9lbG1zLmRpZmZ1c2VTaG93ICYmIHRoaXMuX2VsbXMuZGlmZnVzZVNob3cuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gIC8vICAgICBpdGVtLmNoZWNrZWQgPSB2XHJcbiAgLy8gICB9KVxyXG4gIC8vICAgaWYgKHYgJiYgdGhpcy5zY2FuU2hvdykge1xyXG4gIC8vICAgICB0aGlzLnNjYW5TaG93ID0gZmFsc2VcclxuICAvLyAgIH1cclxuICAvLyAgIGlmICh0aGlzLmRpZmZ1c2UpIHtcclxuICAvLyAgICAgaWYgKHRoaXMuc2hvdykge1xyXG4gIC8vICAgICAgIHRoaXMuZGlmZnVzZS5zaG93ID0gdGhpcy5vcHRpb25zLmRpZmZ1c2VTaG93XHJcbiAgLy8gICAgIH1cclxuICAvLyAgIH1cclxuICAvLyAgIGVsc2Uge1xyXG4gIC8vICAgICB0aGlzLmRpZmZ1c2UgPSBuZXcgQ2lyY2xlRGlmZnVzZSh0aGlzLnNkaywgeyBzaG93OiB0aGlzLmRpZmZ1c2VTaG93LCBsbmc6IHRoaXMubG5nLCBsYXQ6IHRoaXMubGF0LCByYWRpdXM6IHRoaXMuZGlmZnVzZVJhZGl1cywgZHVyYXRpb246IHRoaXMuZGlmZnVzZUR1cmF0aW9uLCBjb2xvcjogdGhpcy5kaWZmdXNlQ29sb3IgfSlcclxuICAvLyAgIH1cclxuICAvLyB9XHJcblxyXG4gIC8vIGdldCBkaWZmdXNlUmFkaXVzKCkge1xyXG4gIC8vICAgcmV0dXJuIHRoaXMub3B0aW9ucy5kaWZmdXNlUmFkaXVzXHJcbiAgLy8gfVxyXG4gIC8vIHNldCBkaWZmdXNlUmFkaXVzKHYpIHtcclxuICAvLyAgIHRoaXMub3B0aW9ucy5kaWZmdXNlUmFkaXVzID0gdlxyXG4gIC8vICAgdGhpcy5fZWxtcy5kaWZmdXNlUmFkaXVzICYmIHRoaXMuX2VsbXMuZGlmZnVzZVJhZGl1cy5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgLy8gICAgIGl0ZW0udmFsdWUgPSB2XHJcbiAgLy8gICB9KVxyXG4gIC8vICAgaWYgKHRoaXMuZGlmZnVzZSkge1xyXG4gIC8vICAgICB0aGlzLmRpZmZ1c2UucmFkaXVzID0gdGhpcy5vcHRpb25zLmRpZmZ1c2VSYWRpdXNcclxuICAvLyAgIH1cclxuICAvLyB9XHJcblxyXG4gIC8vIGdldCBkaWZmdXNlRHVyYXRpb24oKSB7XHJcbiAgLy8gICByZXR1cm4gdGhpcy5vcHRpb25zLmRpZmZ1c2VEdXJhdGlvblxyXG4gIC8vIH1cclxuICAvLyBzZXQgZGlmZnVzZUR1cmF0aW9uKHYpIHtcclxuICAvLyAgIHRoaXMub3B0aW9ucy5kaWZmdXNlRHVyYXRpb24gPSB2XHJcbiAgLy8gICB0aGlzLl9lbG1zLmRpZmZ1c2VEdXJhdGlvbiAmJiB0aGlzLl9lbG1zLmRpZmZ1c2VEdXJhdGlvbi5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgLy8gICAgIGl0ZW0udmFsdWUgPSB2XHJcbiAgLy8gICB9KVxyXG4gIC8vICAgaWYgKHRoaXMuZGlmZnVzZSkge1xyXG4gIC8vICAgICB0aGlzLmRpZmZ1c2UuZHVyYXRpb24gPSB0aGlzLm9wdGlvbnMuZGlmZnVzZUR1cmF0aW9uXHJcbiAgLy8gICB9XHJcbiAgLy8gfVxyXG5cclxuICAvLyBnZXQgZGlmZnVzZUNvbG9yKCkge1xyXG4gIC8vICAgcmV0dXJuIHRoaXMub3B0aW9ucy5kaWZmdXNlQ29sb3JcclxuICAvLyB9XHJcbiAgLy8gc2V0IGRpZmZ1c2VDb2xvcih2KSB7XHJcbiAgLy8gICB0aGlzLm9wdGlvbnMuZGlmZnVzZUNvbG9yID0gdlxyXG4gIC8vICAgaWYgKHRoaXMuX2VsbXMuZGlmZnVzZUNvbG9yKSB7XHJcbiAgLy8gICAgIHRoaXMuX2VsbXMuZGlmZnVzZUNvbG9yLmZvckVhY2goKGl0ZW0sIGkpID0+IHtcclxuICAvLyAgICAgICBsZXQgZGlmZnVzZUNvbG9yUGlja2VyID0gbmV3IFlKQ29sb3JQaWNrZXIoe1xyXG4gIC8vICAgICAgICAgZWw6IGl0ZW0uZWwsXHJcbiAgLy8gICAgICAgICBzaXplOiAnbWluaScsLy/popzoibJib3jnsbvlnotcclxuICAvLyAgICAgICAgIGFscGhhOiBmYWxzZSwvL+aYr+WQpuW8gOWQr+mAj+aYjuW6plxyXG4gIC8vICAgICAgICAgZGVmYXVsdENvbG9yOiB2LFxyXG4gIC8vICAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLC8v5piv5ZCm56aB5q2i5omT5byA6aKc6Imy6YCJ5oup5ZmoXHJcbiAgLy8gICAgICAgICBvcGVuUGlja2VyQW5pOiAnb3BhY2l0eScsLy/miZPlvIDpopzoibLpgInmi6nlmajliqjnlLtcclxuICAvLyAgICAgICAgIHN1cmU6IChjKSA9PiB7XHJcbiAgLy8gICAgICAgICAgIHRoaXMuZGlmZnVzZUNvbG9yID0gY1xyXG4gIC8vICAgICAgICAgfSwvL+eCueWHu+ehruiupOaMiemSruS6i+S7tuWbnuiwg1xyXG4gIC8vICAgICAgICAgY2xlYXI6ICgpID0+IHtcclxuICAvLyAgICAgICAgICAgdGhpcy5kaWZmdXNlQ29sb3IgPSAncmdiYSgyNTUsMjU1LDI1NSwxKSdcclxuICAvLyAgICAgICAgIH0sLy/ngrnlh7vmuIXnqbrmjInpkq7kuovku7blm57osINcclxuICAvLyAgICAgICB9KVxyXG4gIC8vICAgICAgIHRoaXMuX2VsbXMuZGlmZnVzZUNvbG9yW2ldID0gZGlmZnVzZUNvbG9yUGlja2VyXHJcbiAgLy8gICAgIH0pXHJcbiAgLy8gICB9XHJcbiAgLy8gICBpZiAodGhpcy5kaWZmdXNlKSB7XHJcbiAgLy8gICAgIHRoaXMuZGlmZnVzZS5jb2xvciA9IHRoaXMub3B0aW9ucy5kaWZmdXNlQ29sb3JcclxuICAvLyAgIH1cclxuICAvLyB9XHJcblxyXG4gIC8vIGdldCBzY2FuU2hvdygpIHtcclxuICAvLyAgIHJldHVybiB0aGlzLm9wdGlvbnMuc2NhblNob3dcclxuICAvLyB9XHJcbiAgLy8gc2V0IHNjYW5TaG93KHYpIHtcclxuICAvLyAgIHRoaXMub3B0aW9ucy5zY2FuU2hvdyA9IHZcclxuICAvLyAgIHRoaXMuX2VsbXMuc2NhblNob3cgJiYgdGhpcy5fZWxtcy5zY2FuU2hvdy5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgLy8gICAgIGl0ZW0uY2hlY2tlZCA9IHZcclxuICAvLyAgIH0pXHJcbiAgLy8gICBpZiAodiAmJiB0aGlzLmRpZmZ1c2VTaG93KSB7XHJcbiAgLy8gICAgIHRoaXMuZGlmZnVzZVNob3cgPSBmYWxzZVxyXG4gIC8vICAgfVxyXG4gIC8vICAgaWYgKHRoaXMuc2Nhbikge1xyXG4gIC8vICAgICBpZiAodGhpcy5zaG93KSB7XHJcbiAgLy8gICAgICAgdGhpcy5zY2FuLnNob3cgPSB0aGlzLm9wdGlvbnMuc2NhblNob3dcclxuICAvLyAgICAgfVxyXG4gIC8vICAgfVxyXG4gIC8vICAgZWxzZSB7XHJcbiAgLy8gICAgIHRoaXMuc2NhbiA9IG5ldyBSYWRhclNjYW4odGhpcy5zZGssIHsgc2hvdzogdGhpcy5zY2FuU2hvdywgbG5nOiB0aGlzLmxuZywgbGF0OiB0aGlzLmxhdCwgcmFkaXVzOiB0aGlzLnNjYW5SYWRpdXMsIGR1cmF0aW9uOiB0aGlzLnNjYW5EdXJhdGlvbiwgY29sb3I6IHRoaXMuc2NhbkNvbG9yIH0pXHJcbiAgLy8gICB9XHJcbiAgLy8gfVxyXG5cclxuICAvLyBnZXQgc2NhblJhZGl1cygpIHtcclxuICAvLyAgIHJldHVybiB0aGlzLm9wdGlvbnMuc2NhblJhZGl1c1xyXG4gIC8vIH1cclxuICAvLyBzZXQgc2NhblJhZGl1cyh2KSB7XHJcbiAgLy8gICB0aGlzLm9wdGlvbnMuc2NhblJhZGl1cyA9IHZcclxuICAvLyAgIHRoaXMuX2VsbXMuc2NhblJhZGl1cyAmJiB0aGlzLl9lbG1zLnNjYW5SYWRpdXMuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gIC8vICAgICBpdGVtLnZhbHVlID0gdlxyXG4gIC8vICAgfSlcclxuICAvLyAgIGlmICh0aGlzLnNjYW4pIHtcclxuICAvLyAgICAgdGhpcy5zY2FuLnJhZGl1cyA9IHRoaXMub3B0aW9ucy5zY2FuUmFkaXVzXHJcbiAgLy8gICB9XHJcbiAgLy8gfVxyXG5cclxuICAvLyBnZXQgc2NhbkR1cmF0aW9uKCkge1xyXG4gIC8vICAgcmV0dXJuIHRoaXMub3B0aW9ucy5zY2FuRHVyYXRpb25cclxuICAvLyB9XHJcbiAgLy8gc2V0IHNjYW5EdXJhdGlvbih2KSB7XHJcbiAgLy8gICB0aGlzLm9wdGlvbnMuc2NhbkR1cmF0aW9uID0gdlxyXG4gIC8vICAgdGhpcy5fZWxtcy5zY2FuRHVyYXRpb24gJiYgdGhpcy5fZWxtcy5zY2FuRHVyYXRpb24uZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gIC8vICAgICBpdGVtLnZhbHVlID0gdlxyXG4gIC8vICAgfSlcclxuICAvLyAgIGlmICh0aGlzLnNjYW4pIHtcclxuICAvLyAgICAgdGhpcy5zY2FuLmR1cmF0aW9uID0gdGhpcy5vcHRpb25zLnNjYW5EdXJhdGlvblxyXG4gIC8vICAgfVxyXG4gIC8vIH1cclxuXHJcbiAgLy8gZ2V0IHNjYW5Db2xvcigpIHtcclxuICAvLyAgIHJldHVybiB0aGlzLm9wdGlvbnMuc2NhbkNvbG9yXHJcbiAgLy8gfVxyXG4gIC8vIHNldCBzY2FuQ29sb3Iodikge1xyXG4gIC8vICAgdGhpcy5vcHRpb25zLnNjYW5Db2xvciA9IHZcclxuICAvLyAgIGlmICh0aGlzLl9lbG1zLnNjYW5Db2xvcikge1xyXG4gIC8vICAgICB0aGlzLl9lbG1zLnNjYW5Db2xvci5mb3JFYWNoKChpdGVtLCBpKSA9PiB7XHJcbiAgLy8gICAgICAgbGV0IHNjYW5Db2xvclBpY2tlciA9IG5ldyBZSkNvbG9yUGlja2VyKHtcclxuICAvLyAgICAgICAgIGVsOiBpdGVtLmVsLFxyXG4gIC8vICAgICAgICAgc2l6ZTogJ21pbmknLC8v6aKc6ImyYm9457G75Z6LXHJcbiAgLy8gICAgICAgICBhbHBoYTogZmFsc2UsLy/mmK/lkKblvIDlkK/pgI/mmI7luqZcclxuICAvLyAgICAgICAgIGRlZmF1bHRDb2xvcjogdixcclxuICAvLyAgICAgICAgIGRpc2FibGVkOiBmYWxzZSwvL+aYr+WQpuemgeatouaJk+W8gOminOiJsumAieaLqeWZqFxyXG4gIC8vICAgICAgICAgb3BlblBpY2tlckFuaTogJ29wYWNpdHknLC8v5omT5byA6aKc6Imy6YCJ5oup5Zmo5Yqo55S7XHJcbiAgLy8gICAgICAgICBzdXJlOiAoYykgPT4ge1xyXG4gIC8vICAgICAgICAgICB0aGlzLnNjYW5Db2xvciA9IGNcclxuICAvLyAgICAgICAgIH0sLy/ngrnlh7vnoa7orqTmjInpkq7kuovku7blm57osINcclxuICAvLyAgICAgICAgIGNsZWFyOiAoKSA9PiB7XHJcbiAgLy8gICAgICAgICAgIHRoaXMuc2NhbkNvbG9yID0gJ3JnYmEoMjU1LDI1NSwyNTUsMSknXHJcbiAgLy8gICAgICAgICB9LC8v54K55Ye75riF56m65oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgLy8gICAgICAgfSlcclxuICAvLyAgICAgICB0aGlzLl9lbG1zLnNjYW5Db2xvcltpXSA9IHNjYW5Db2xvclBpY2tlclxyXG4gIC8vICAgICB9KVxyXG4gIC8vICAgfVxyXG4gIC8vICAgaWYgKHRoaXMuc2Nhbikge1xyXG4gIC8vICAgICB0aGlzLnNjYW4uY29sb3IgPSB0aGlzLm9wdGlvbnMuc2NhbkNvbG9yXHJcbiAgLy8gICB9XHJcbiAgLy8gfVxyXG5cclxuXHJcbiAgZ2V0IGF0dHJpYnV0ZUxpbmsoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnRcclxuICB9XHJcblxyXG4gIHNldCBhdHRyaWJ1dGVMaW5rKHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50ID0gdlxyXG4gICAgaWYgKFxyXG4gICAgICAhdGhpcy5fRGlhbG9nT2JqZWN0IHx8XHJcbiAgICAgICF0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQgfHxcclxuICAgICAgIXRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50IHx8XHJcbiAgICAgIHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXHJcbiAgICAgICAgJ2F0dHJpYnV0ZS1jb250ZW50LWxpbmsnXHJcbiAgICAgICkubGVuZ3RoID09IDBcclxuICAgICkge1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuICAgIGxldCB0YWJsZSA9IHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50XHJcbiAgICAgIC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdhdHRyaWJ1dGUtY29udGVudC1saW5rJylbMV1cclxuICAgICAgLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RhYmxlJylbMF1cclxuICAgIGxldCB0YWJsZUNvbnRlbnQgPSB0YWJsZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0YWJsZS1ib2R5JylbMF1cclxuICAgIHRhYmxlQ29udGVudC5pbm5lckhUTUwgPSAnJ1xyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50Lmxlbmd0aCA+IDApIHtcclxuICAgICAgdGFibGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndGFibGUtZW1wdHknKVswXS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0YWJsZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0YWJsZS1lbXB0eScpWzBdLnN0eWxlLmRpc3BsYXkgPSAnZmxleCdcclxuICAgIH1cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnQubGVuZ3RoOyBpKyspIHtcclxuICAgICAgbGV0IHRyID1cclxuICAgICAgICBgXHJcbiAgICAgIDxkaXYgY2xhc3M9XCJ0clwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRkXCI+YCArXHJcbiAgICAgICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnRbaV0ubmFtZSArXHJcbiAgICAgICAgYDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRkXCI+YCArXHJcbiAgICAgICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnRbaV0udXJsICtcclxuICAgICAgICBgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidGRcIj5cclxuICAgICAgICAgICAgICA8YnV0dG9uIEBjbGljaz1cImxpbmtFZGl0XCI+57yW6L6RPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvbiBAY2xpY2s9XCJsaW5rRGVsZXRlXCI+5Yig6ZmkPC9idXR0b24+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+YFxyXG4gICAgICBsZXQgdHJFbG0gPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpLmNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudCh0cilcclxuICAgICAgdGFibGVDb250ZW50LmFwcGVuZENoaWxkKHRyRWxtKVxyXG4gICAgfVxyXG4gICAgbGV0IGl0ZW0gPSB0YWJsZUNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndHInKVxyXG4gICAgbGV0IGZ1biA9IHtcclxuICAgICAgbGlua0VkaXQ6IGFzeW5jIGluZGV4ID0+IHtcclxuICAgICAgICB0aGlzLmF0dHJpYnV0ZUxpbmsgPSBhd2FpdCB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudFxyXG4gICAgICAgIGxldCB0YWJsZSA9IHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50XHJcbiAgICAgICAgICAuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnYXR0cmlidXRlLWNvbnRlbnQtbGluaycpWzFdXHJcbiAgICAgICAgICAuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndGFibGUnKVswXVxyXG4gICAgICAgIGxldCB0YWJsZUNvbnRlbnQgPSB0YWJsZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0YWJsZS1ib2R5JylbMF1cclxuICAgICAgICBsZXQgaXRlbSA9IHRhYmxlQ29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0cicpXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpdGVtLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBpZiAoaW5kZXggPT09IGkpIHtcclxuICAgICAgICAgICAgbGV0IGhlaWdodCA9IGl0ZW1baV0ub2Zmc2V0SGVpZ2h0XHJcbiAgICAgICAgICAgIGxldCBodG1sID0gYFxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZFwiPlxyXG4gICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiaW5wdXRcIiB0eXBlPVwidGV4dFwiPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZFwiPlxyXG4gICAgICAgICAgICAgICAgPHRleHRhcmVhIGNsYXNzPVwiaW5wdXQgbGluay1lZGl0XCIgdHlwZT1cInRleHRcIj48L3RleHRhcmVhPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZFwiPlxyXG4gICAgICAgICAgICAgICAgICA8YnV0dG9uIEBjbGljaz1cImNvbmZpcm1FZGl0XCI+56Gu6K6kPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgIDxidXR0b24gQGNsaWNrPVwiY2FuY2VsRWRpdFwiPuWPlua2iDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDwvZGl2PmBcclxuICAgICAgICAgICAgaXRlbVtpXS5pbm5lckhUTUwgPSBodG1sXHJcbiAgICAgICAgICAgIGxldCB0ZXh0YXJlYUVsbSA9IGl0ZW1baV0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbGluay1lZGl0JylbMF1cclxuICAgICAgICAgICAgdGV4dGFyZWFFbG0uc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0IC0gMTAgKyAncHgnXHJcbiAgICAgICAgICAgIGxldCB0ZCA9IGl0ZW1baV0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndGQnKVxyXG4gICAgICAgICAgICB0ZFswXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFxyXG4gICAgICAgICAgICAgICdpbnB1dCdcclxuICAgICAgICAgICAgKVswXS52YWx1ZSA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50W2luZGV4XS5uYW1lXHJcbiAgICAgICAgICAgIHRkWzFdLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXHJcbiAgICAgICAgICAgICAgJ2lucHV0J1xyXG4gICAgICAgICAgICApWzBdLnZhbHVlID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnRbaW5kZXhdLnVybFxyXG4gICAgICAgICAgICBsZXQgYnRuID0gaXRlbVtpXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnYnV0dG9uJylcclxuICAgICAgICAgICAgZm9yIChsZXQgbiA9IDA7IG4gPCBidG4ubGVuZ3RoOyBuKyspIHtcclxuICAgICAgICAgICAgICBpZiAoIWJ0bltuXSB8fCAhYnRuW25dLmF0dHJpYnV0ZXMpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGZvciAobGV0IG0gb2YgYnRuW25dLmF0dHJpYnV0ZXMpIHtcclxuICAgICAgICAgICAgICAgIGlmIChtLm5hbWUgPT09ICdAY2xpY2snKSB7XHJcbiAgICAgICAgICAgICAgICAgIGJ0bltuXS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGUgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZnVuW20udmFsdWVdID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBmdW5bbS52YWx1ZV0oXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiB0ZFswXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdpbnB1dCcpWzBdLnZhbHVlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogdGRbMV0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaW5wdXQnKVswXS52YWx1ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpXHJcbiAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICBidG5bbl0uYXR0cmlidXRlcy5yZW1vdmVOYW1lZEl0ZW0obS5uYW1lKVxyXG4gICAgICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgbGlua0RlbGV0ZTogaSA9PiB7XHJcbiAgICAgICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnQuc3BsaWNlKGksIDEpXHJcbiAgICAgICAgdGhpcy5hdHRyaWJ1dGVMaW5rID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnRcclxuICAgICAgfSxcclxuXHJcbiAgICAgIGNvbmZpcm1FZGl0OiAodmFsdWUsIGkpID0+IHtcclxuICAgICAgICBsZXQgbmFtZSA9IHZhbHVlLm5hbWUgJiYgdmFsdWUubmFtZS5yZXBsYWNlKC9cXHMvZywgJycpXHJcbiAgICAgICAgbGV0IHVybCA9IHZhbHVlLnVybCAmJiB2YWx1ZS51cmwucmVwbGFjZSgvXFxzL2csICcnKVxyXG4gICAgICAgIGlmIChuYW1lICYmIHVybCkge1xyXG4gICAgICAgICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnRbaV0gPSB2YWx1ZVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB3aW5kb3cuRUxFTUVOVCAmJlxyXG4gICAgICAgICAgICB3aW5kb3cuRUxFTUVOVC5NZXNzYWdlKHtcclxuICAgICAgICAgICAgICBtZXNzYWdlOiAn5ZCN56ew5oiW6ZO+5o6l5LiN6IO95Li656m677yBJyxcclxuICAgICAgICAgICAgICB0eXBlOiAnd2FybmluZycsXHJcbiAgICAgICAgICAgICAgZHVyYXRpb246IDE1MDBcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5hdHRyaWJ1dGVMaW5rID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnRcclxuICAgICAgfSxcclxuICAgICAgY2FuY2VsRWRpdDogKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuYXR0cmlidXRlTGluayA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50XHJcbiAgICAgIH0sXHJcbiAgICAgIGZpbGVTZWxlY3Q6ICh2YWx1ZSwgaSkgPT4ge1xyXG4gICAgICAgIGxldCBmaWxlRWxtID0gaXRlbVtpXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdmaWxlLXNlbGVjdCcpWzBdXHJcbiAgICAgICAgZmlsZUVsbS5jbGljaygpXHJcbiAgICAgICAgZmlsZUVsbS5yZW1vdmVFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBmaWxlU2VsZWN0KVxyXG4gICAgICAgIGZpbGVFbG0uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgZmlsZVNlbGVjdClcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgbGV0IGZpbGVTZWxlY3QgPSBldmVudCA9PiB7XHJcbiAgICAgIGlmIChldmVudC50YXJnZXQudmFsdWUpIHtcclxuICAgICAgICBsZXQgdGQgPSBpdGVtW1xyXG4gICAgICAgICAgZXZlbnQudGFyZ2V0LmdldEF0dHJpYnV0ZSgnaW5kZXgnKVxyXG4gICAgICAgIF0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndGQnKVxyXG4gICAgICAgIHRkWzFdLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2lucHV0JylbMF0udmFsdWUgPSBldmVudC50YXJnZXQudmFsdWVcclxuICAgICAgICBldmVudC50YXJnZXQudmFsdWUgPSBudWxsXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbS5sZW5ndGg7IGkrKykge1xyXG4gICAgICBsZXQgYnRuID0gaXRlbVtpXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnYnV0dG9uJylcclxuICAgICAgZm9yIChsZXQgbiA9IDA7IG4gPCBidG4ubGVuZ3RoOyBuKyspIHtcclxuICAgICAgICBpZiAoIWJ0bltuXSB8fCAhYnRuW25dLmF0dHJpYnV0ZXMpIHtcclxuICAgICAgICAgIGNvbnRpbnVlXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvciAobGV0IG0gb2YgYnRuW25dLmF0dHJpYnV0ZXMpIHtcclxuICAgICAgICAgIGlmIChtLm5hbWUgPT09ICdAY2xpY2snKSB7XHJcbiAgICAgICAgICAgIGJ0bltuXS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGUgPT4ge1xyXG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgZnVuW20udmFsdWVdID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgICAgICBmdW5bbS52YWx1ZV0oaSlcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIGJ0bltuXS5hdHRyaWJ1dGVzLnJlbW92ZU5hbWVkSXRlbShtLm5hbWUpXHJcbiAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgYXR0cmlidXRlQ2FtZXJhKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUuY2FtZXJhLmNvbnRlbnRcclxuICB9XHJcblxyXG4gIHNldCBhdHRyaWJ1dGVDYW1lcmEodikge1xyXG4gICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5jYW1lcmEuY29udGVudCA9IHZcclxuICB9XHJcblxyXG4gIGdldCBhdHRyaWJ1dGVJU0MoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5pc2MuY29udGVudFxyXG4gIH1cclxuXHJcbiAgc2V0IGF0dHJpYnV0ZUlTQyh2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmlzYy5jb250ZW50ID0gdlxyXG4gIH1cclxuXHJcbiAgZ2V0IGF0dHJpYnV0ZVZyKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudFxyXG4gIH1cclxuXHJcbiAgc2V0IGF0dHJpYnV0ZVZyKHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudCA9IHZcclxuICAgIGlmIChcclxuICAgICAgIXRoaXMuX0RpYWxvZ09iamVjdCB8fFxyXG4gICAgICAhdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50IHx8XHJcbiAgICAgICF0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudCB8fFxyXG4gICAgICB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFxyXG4gICAgICAgICdhdHRyaWJ1dGUtY29udGVudC12cidcclxuICAgICAgKS5sZW5ndGggPT0gMFxyXG4gICAgKSB7XHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG4gICAgbGV0IHRhYmxlID0gdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnRcclxuICAgICAgLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2F0dHJpYnV0ZS1jb250ZW50LXZyJylbMV1cclxuICAgICAgLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RhYmxlJylbMF1cclxuICAgIGxldCB0YWJsZUNvbnRlbnQgPSB0YWJsZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0YWJsZS1ib2R5JylbMF1cclxuICAgIHRhYmxlQ29udGVudC5pbm5lckhUTUwgPSAnJ1xyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudC5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRhYmxlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RhYmxlLWVtcHR5JylbMF0uc3R5bGUuZGlzcGxheSA9ICdub25lJ1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGFibGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndGFibGUtZW1wdHknKVswXS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnXHJcbiAgICB9XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudC5sZW5ndGg7IGkrKykge1xyXG4gICAgICBsZXQgdHIgPVxyXG4gICAgICAgIGBcclxuICAgICAgPGRpdiBjbGFzcz1cInRyXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidGRcIj5gICtcclxuICAgICAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnRbaV0ubmFtZSArXHJcbiAgICAgICAgYDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRkXCI+YCArXHJcbiAgICAgICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52ci5jb250ZW50W2ldLnVybCArXHJcbiAgICAgICAgYDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRkXCI+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvbiBAY2xpY2s9XCJ2ckVkaXRcIj7nvJbovpE8L2J1dHRvbj5cclxuICAgICAgICAgICAgICA8YnV0dG9uIEBjbGljaz1cInZyRGVsZXRlXCI+5Yig6ZmkPC9idXR0b24+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+YFxyXG4gICAgICBsZXQgdHJFbG0gPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpLmNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudCh0cilcclxuICAgICAgdGFibGVDb250ZW50LmFwcGVuZENoaWxkKHRyRWxtKVxyXG4gICAgfVxyXG4gICAgbGV0IGl0ZW0gPSB0YWJsZUNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndHInKVxyXG4gICAgbGV0IGZ1biA9IHtcclxuICAgICAgdnJFZGl0OiBhc3luYyBpbmRleCA9PiB7XHJcbiAgICAgICAgdGhpcy5hdHRyaWJ1dGVWciA9IGF3YWl0IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudFxyXG4gICAgICAgIGxldCB0YWJsZSA9IHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50XHJcbiAgICAgICAgICAuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnYXR0cmlidXRlLWNvbnRlbnQtdnInKVsxXVxyXG4gICAgICAgICAgLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RhYmxlJylbMF1cclxuICAgICAgICBsZXQgdGFibGVDb250ZW50ID0gdGFibGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndGFibGUtYm9keScpWzBdXHJcbiAgICAgICAgbGV0IGl0ZW0gPSB0YWJsZUNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndHInKVxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgaWYgKGluZGV4ID09PSBpKSB7XHJcbiAgICAgICAgICAgIGxldCBoZWlnaHQgPSBpdGVtW2ldLm9mZnNldEhlaWdodFxyXG4gICAgICAgICAgICBsZXQgaHRtbCA9IGBcclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGRcIj5cclxuICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImlucHV0XCIgdHlwZT1cInRleHRcIj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGRcIj5cclxuICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBjbGFzcz1cImlucHV0IGxpbmstZWRpdFwiIHR5cGU9XCJ0ZXh0XCI+PC90ZXh0YXJlYT5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGRcIj5cclxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBAY2xpY2s9XCJjb25maXJtRWRpdFwiPuehruiupDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICA8YnV0dG9uIEBjbGljaz1cImNhbmNlbEVkaXRcIj7lj5bmtog8L2J1dHRvbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5gXHJcbiAgICAgICAgICAgIGl0ZW1baV0uaW5uZXJIVE1MID0gaHRtbFxyXG4gICAgICAgICAgICBsZXQgdGV4dGFyZWFFbG0gPSBpdGVtW2ldLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xpbmstZWRpdCcpWzBdXHJcbiAgICAgICAgICAgIHRleHRhcmVhRWxtLnN0eWxlLmhlaWdodCA9IGhlaWdodCAtIDEwICsgJ3B4J1xyXG4gICAgICAgICAgICBsZXQgdGQgPSBpdGVtW2ldLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RkJylcclxuICAgICAgICAgICAgdGRbMF0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcclxuICAgICAgICAgICAgICAnaW5wdXQnXHJcbiAgICAgICAgICAgIClbMF0udmFsdWUgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnRbaW5kZXhdLm5hbWVcclxuICAgICAgICAgICAgdGRbMV0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcclxuICAgICAgICAgICAgICAnaW5wdXQnXHJcbiAgICAgICAgICAgIClbMF0udmFsdWUgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnRbaW5kZXhdLnVybFxyXG4gICAgICAgICAgICBsZXQgYnRuID0gaXRlbVtpXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnYnV0dG9uJylcclxuICAgICAgICAgICAgZm9yIChsZXQgbiA9IDA7IG4gPCBidG4ubGVuZ3RoOyBuKyspIHtcclxuICAgICAgICAgICAgICBpZiAoIWJ0bltuXSB8fCAhYnRuW25dLmF0dHJpYnV0ZXMpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGZvciAobGV0IG0gb2YgYnRuW25dLmF0dHJpYnV0ZXMpIHtcclxuICAgICAgICAgICAgICAgIGlmIChtLm5hbWUgPT09ICdAY2xpY2snKSB7XHJcbiAgICAgICAgICAgICAgICAgIGJ0bltuXS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGUgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZnVuW20udmFsdWVdID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBmdW5bbS52YWx1ZV0oXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiB0ZFswXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdpbnB1dCcpWzBdLnZhbHVlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogdGRbMV0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaW5wdXQnKVswXS52YWx1ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpXHJcbiAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICBidG5bbl0uYXR0cmlidXRlcy5yZW1vdmVOYW1lZEl0ZW0obS5uYW1lKVxyXG4gICAgICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgdnJEZWxldGU6IGkgPT4ge1xyXG4gICAgICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudC5zcGxpY2UoaSwgMSlcclxuICAgICAgICB0aGlzLmF0dHJpYnV0ZVZyID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52ci5jb250ZW50XHJcbiAgICAgIH0sXHJcblxyXG4gICAgICBjb25maXJtRWRpdDogKHZhbHVlLCBpKSA9PiB7XHJcbiAgICAgICAgbGV0IG5hbWUgPSB2YWx1ZS5uYW1lICYmIHZhbHVlLm5hbWUucmVwbGFjZSgvXFxzL2csICcnKVxyXG4gICAgICAgIGxldCB1cmwgPSB2YWx1ZS51cmwgJiYgdmFsdWUudXJsLnJlcGxhY2UoL1xccy9nLCAnJylcclxuICAgICAgICBpZiAobmFtZSAmJiB1cmwpIHtcclxuICAgICAgICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudFtpXSA9IHZhbHVlXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHdpbmRvdy5FTEVNRU5UICYmXHJcbiAgICAgICAgICAgIHdpbmRvdy5FTEVNRU5ULk1lc3NhZ2Uoe1xyXG4gICAgICAgICAgICAgIG1lc3NhZ2U6ICflkI3np7DmiJbpk77mjqXkuI3og73kuLrnqbrvvIEnLFxyXG4gICAgICAgICAgICAgIHR5cGU6ICd3YXJuaW5nJyxcclxuICAgICAgICAgICAgICBkdXJhdGlvbjogMTUwMFxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmF0dHJpYnV0ZVZyID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52ci5jb250ZW50XHJcbiAgICAgIH0sXHJcbiAgICAgIGNhbmNlbEVkaXQ6ICgpID0+IHtcclxuICAgICAgICB0aGlzLmF0dHJpYnV0ZVZyID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52ci5jb250ZW50XHJcbiAgICAgIH0sXHJcbiAgICAgIGZpbGVTZWxlY3Q6ICh2YWx1ZSwgaSkgPT4ge1xyXG4gICAgICAgIGxldCBmaWxlRWxtID0gaXRlbVtpXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdmaWxlLXNlbGVjdCcpWzBdXHJcbiAgICAgICAgZmlsZUVsbS5jbGljaygpXHJcbiAgICAgICAgZmlsZUVsbS5yZW1vdmVFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBmaWxlU2VsZWN0KVxyXG4gICAgICAgIGZpbGVFbG0uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgZmlsZVNlbGVjdClcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgbGV0IGZpbGVTZWxlY3QgPSBldmVudCA9PiB7XHJcbiAgICAgIGlmIChldmVudC50YXJnZXQudmFsdWUpIHtcclxuICAgICAgICBsZXQgdGQgPSBpdGVtW1xyXG4gICAgICAgICAgZXZlbnQudGFyZ2V0LmdldEF0dHJpYnV0ZSgnaW5kZXgnKVxyXG4gICAgICAgIF0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndGQnKVxyXG4gICAgICAgIHRkWzFdLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2lucHV0JylbMF0udmFsdWUgPSBldmVudC50YXJnZXQudmFsdWVcclxuICAgICAgICBldmVudC50YXJnZXQudmFsdWUgPSBudWxsXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbS5sZW5ndGg7IGkrKykge1xyXG4gICAgICBsZXQgYnRuID0gaXRlbVtpXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnYnV0dG9uJylcclxuICAgICAgZm9yIChsZXQgbiA9IDA7IG4gPCBidG4ubGVuZ3RoOyBuKyspIHtcclxuICAgICAgICBpZiAoIWJ0bltuXSB8fCAhYnRuW25dLmF0dHJpYnV0ZXMpIHtcclxuICAgICAgICAgIGNvbnRpbnVlXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvciAobGV0IG0gb2YgYnRuW25dLmF0dHJpYnV0ZXMpIHtcclxuICAgICAgICAgIGlmIChtLm5hbWUgPT09ICdAY2xpY2snKSB7XHJcbiAgICAgICAgICAgIGJ0bltuXS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGUgPT4ge1xyXG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgZnVuW20udmFsdWVdID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgICAgICBmdW5bbS52YWx1ZV0oaSlcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIGJ0bltuXS5hdHRyaWJ1dGVzLnJlbW92ZU5hbWVkSXRlbShtLm5hbWUpXHJcbiAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgYXR0cmlidXRlR29vZHMoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5nb29kcy5jb250ZW50XHJcbiAgfVxyXG5cclxuICBzZXQgYXR0cmlidXRlR29vZHModikge1xyXG4gICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5nb29kcy5jb250ZW50ID0gdlxyXG4gIH1cclxuXHJcbiAgZ2V0IGJpbGxib2FyZERlZmF1bHRJbWFnZSgpIHtcclxuICAgIHJldHVybiAoXHJcbiAgICAgIGdldEJpbGxib2FyZERlZmF1bHRVcmwodGhpcy5vcHRpb25zLmJpbGxib2FyZC5kZWZhdWx0SW1hZ2UpIHx8XHJcbiAgICAgIHRoaXMuZ2V0U291cmNlUm9vdFBhdGgoKSArICcvaW1nL0EtYWJsdS1ibGFuay5wbmcnXHJcbiAgICApXHJcbiAgfVxyXG5cclxuICBzZXQgYmlsbGJvYXJkRGVmYXVsdEltYWdlKHYpIHtcclxuICAgIGxldCB1cmwgPSB0aGlzLnJlcGxhY2VIb3N0KHYsIHRoaXMub3B0aW9ucy5ob3N0KVxyXG4gICAgc2V0QmlsbGJvYXJkRGVmYXVsdFVybCh1cmwsIHRoaXMub3B0aW9ucy5iaWxsYm9hcmQuZGVmYXVsdEltYWdlKVxyXG4gICAgdGhpcy5fZWxtcy5iaWxsYm9hcmREZWZhdWx0SW1hZ2UgJiZcclxuICAgICAgdGhpcy5fZWxtcy5iaWxsYm9hcmREZWZhdWx0SW1hZ2UuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICBpdGVtLnNyYyA9IHVybFxyXG4gICAgICB9KVxyXG4gIH1cclxuXHJcbiAgZ2V0IGNvb3JkaW5hdGUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmNvb3JkaW5hdGVcclxuICB9XHJcbiAgc2V0IGNvb3JkaW5hdGUodikge1xyXG4gICAgcmV0dXJuXHJcbiAgICB0aGlzLm9wdGlvbnMuY29vcmRpbmF0ZSA9IHZcclxuICAgIGxldCBwb3NpdGlvbiA9IHRoaXMuX3Byb2ouY29udmVydChcclxuICAgICAgW1xyXG4gICAgICAgIHtcclxuICAgICAgICAgIHg6IHRoaXMub3B0aW9ucy5wb3NpdGlvbi5sbmcsXHJcbiAgICAgICAgICB5OiB0aGlzLm9wdGlvbnMucG9zaXRpb24ubGF0LFxyXG4gICAgICAgICAgejogdGhpcy5vcHRpb25zLnBvc2l0aW9uLmFsdFxyXG4gICAgICAgIH1cclxuICAgICAgXSxcclxuICAgICAgJ0VQU0c6NDMyNicsXHJcbiAgICAgIHZcclxuICAgICkucG9pbnRzXHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMuX0RpYWxvZ09iamVjdCAmJlxyXG4gICAgICB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQgJiZcclxuICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQgJiZcclxuICAgICAgcG9zaXRpb25bMF1cclxuICAgICkge1xyXG4gICAgICB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFxyXG4gICAgICAgICdjb252ZXJ0LXgnXHJcbiAgICAgIClbMF0udmFsdWUgPSBwb3NpdGlvblswXS54XHJcbiAgICAgIHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXHJcbiAgICAgICAgJ2NvbnZlcnQteSdcclxuICAgICAgKVswXS52YWx1ZSA9IHBvc2l0aW9uWzBdLnlcclxuICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcclxuICAgICAgICAnY29udmVydC16J1xyXG4gICAgICApWzBdLnZhbHVlID0gcG9zaXRpb25bMF0uelxyXG4gICAgfVxyXG4gICAgdGhpcy5fZWxtcy5jb29yZGluYXRlICYmXHJcbiAgICAgIHRoaXMuX2VsbXMuY29vcmRpbmF0ZS5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgIGl0ZW0udmFsdWUgPSB2XHJcbiAgICAgIH0pXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAZGVzY3JpcHRpb24g57yW6L6R5qGGXHJcbiAgICogQHBhcmFtIHN0YXRlPWZhbHNlIHtib29sZWFufSDnirbmgIE6IHRydWXmiZPlvIAsIGZhbHNl5YWz6ZetXHJcbiAgICovXHJcbiAgYXN5bmMgZWRpdChzdGF0ZSA9IGZhbHNlKSB7XHJcbiAgICByZXR1cm5cclxuICAgIGxldCBfdGhpcyA9IHRoaXNcclxuICAgIHRoaXMub3JpZ2luYWxPcHRpb25zID0gdGhpcy5kZWVwQ29weU9iaih0aGlzLm9wdGlvbnMpXHJcblxyXG4gICAgLy8gbGV0IGVsbXMgPSB0aGlzLnNkay52aWV3ZXIuX2NvbnRhaW5lci5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdZSi1jdXN0b20tYmFzZS1kaWFsb2cnKVxyXG4gICAgLy8gZm9yIChsZXQgaSA9IGVsbXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuICAgIC8vICAgdGhpcy5zZGsudmlld2VyLl9jb250YWluZXIucmVtb3ZlQ2hpbGQoZWxtc1tpXSlcclxuICAgIC8vIH1cclxuXHJcbiAgICBpZiAodGhpcy5fRGlhbG9nT2JqZWN0ICYmIHRoaXMuX0RpYWxvZ09iamVjdC5jbG9zZSkge1xyXG4gICAgICB0aGlzLl9EaWFsb2dPYmplY3QuY2xvc2UoKVxyXG4gICAgICB0aGlzLl9EaWFsb2dPYmplY3QgPSBudWxsXHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHN0YXRlKSB7XHJcbiAgICAgIHRoaXMuX0RpYWxvZ09iamVjdCA9IGF3YWl0IG5ldyBEaWFsb2coXHJcbiAgICAgICAgdGhpcy5zZGssXHJcbiAgICAgICAgdGhpcy5vcHRpb25zLFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIHRpdGxlOiAn54K55bGe5oCnJyxcclxuICAgICAgICAgIGxlZnQ6ICcxODBweCcsXHJcbiAgICAgICAgICB0b3A6ICcxMDBweCcsXHJcbiAgICAgICAgICBjb25maXJtQ2FsbEJhY2s6IG9wdGlvbnMgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxhYmVsVGV4dCA9IHRoaXMubGFiZWxUZXh0LnRyaW0oKVxyXG4gICAgICAgICAgICBpZiAoIXRoaXMubGFiZWxUZXh0KSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5sYWJlbFRleHQgPSAn5pyq5ZG95ZCN5a+56LGhJ1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMub3JpZ2luYWxPcHRpb25zID0gdGhpcy5kZWVwQ29weU9iaih0aGlzLm9wdGlvbnMpXHJcbiAgICAgICAgICAgIHRoaXMuX0RpYWxvZ09iamVjdC5jbG9zZSgpXHJcbiAgICAgICAgICAgIGxldCBjZG9wdGlvbnMgPSB0aGlzLmRlZXBDb3B5T2JqKHRoaXMub3B0aW9ucylcclxuICAgICAgICAgICAgY2RvcHRpb25zLmhvc3QgPSAnJ1xyXG4gICAgICAgICAgICB0aGlzLkRpYWxvZy5jb25maXJtQ2FsbEJhY2sgJiZcclxuICAgICAgICAgICAgICB0aGlzLkRpYWxvZy5jb25maXJtQ2FsbEJhY2soY2RvcHRpb25zKVxyXG4gICAgICAgICAgICBzeW5jRGF0YSh0aGlzLnNkaywgdGhpcy5vcHRpb25zLmlkKVxyXG4gICAgICAgICAgICBzeW5jU3BsaXREYXRhKHRoaXMuc2RrLCB0aGlzLm9wdGlvbnMuaWQpXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgcmVzZXRDYWxsQmFjazogKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnJlc2V0KClcclxuICAgICAgICAgICAgdGhpcy5EaWFsb2cucmVzZXRDYWxsQmFjayAmJiB0aGlzLkRpYWxvZy5yZXNldENhbGxCYWNrKClcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICByZW1vdmVDYWxsQmFjazogKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLkRpYWxvZy5yZW1vdmVDYWxsQmFjayAmJiB0aGlzLkRpYWxvZy5yZW1vdmVDYWxsQmFjaygpXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgY2xvc2VDYWxsQmFjazogKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uRWRpdGluZyA9IGZhbHNlXHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgIHRoaXMucmVzZXQoKVxyXG4gICAgICAgICAgICAgIHRoaXMuRGlhbG9nLmNsb3NlQ2FsbEJhY2sgJiYgdGhpcy5EaWFsb2cuY2xvc2VDYWxsQmFjaygpXHJcbiAgICAgICAgICAgIH0sIDApXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgc2hvd0NhbGxCYWNrOiBzaG93ID0+IHtcclxuICAgICAgICAgICAgdGhpcy5zaG93ID0gc2hvd1xyXG4gICAgICAgICAgICB0aGlzLkRpYWxvZy5zaG93Q2FsbEJhY2sgJiYgdGhpcy5EaWFsb2cuc2hvd0NhbGxCYWNrKClcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB0cmFuc2xhdGlvbmFsQ2FsbEJhY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5wb3NpdGlvbkVkaXRpbmcgPSAhdGhpcy5wb3NpdGlvbkVkaXRpbmdcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB1cGRhdGVIZWlnaHRDYWxsQmFjazogKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUhlaWdodCgpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICB0cnVlXHJcbiAgICAgIClcclxuICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmJvZHkuY2xhc3NOYW1lID1cclxuICAgICAgICB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuYm9keS5jbGFzc05hbWUgKyAnIGJpbGxib2FyZC1vYmplY3QnXHJcbiAgICAgIGxldCBjb250ZW50RWxtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcclxuICAgICAgY29udGVudEVsbS5pbm5lckhUTUwgPSBodG1sKHRoaXMpXHJcbiAgICAgIHRoaXMuX0RpYWxvZ09iamVjdC5jb250ZW50QXBwQ2hpbGQoY29udGVudEVsbSlcclxuICAgICAgdGhpcy5hdHRyaWJ1dGVDYW1lcmEgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmNhbWVyYS5jb250ZW50XHJcbiAgICAgIHRoaXMuYXR0cmlidXRlSVNDID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5pc2MuY29udGVudFxyXG5cclxuICAgICAgLy8gbGV0IGNvb3JkaW5hdGVFbG0gPSBjb250ZW50RWxtLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2Nvb3JkaW5hdGUtc2VsZWN0JylbMF1cclxuICAgICAgLy8gbGV0IG9wdGlvbiA9ICcnXHJcbiAgICAgIC8vIHRoaXMuX3Byb2ouZXBzZ19tYXAuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xyXG4gICAgICAvLyAgIGlmICghdGhpcy5vcHRpb25zLmNvb3JkaW5hdGUpIHtcclxuICAgICAgLy8gICAgIHRoaXMub3B0aW9ucy5jb29yZGluYXRlID0ga2V5XHJcbiAgICAgIC8vICAgICB0aGlzLm9yaWdpbmFsT3B0aW9ucy5jb29yZGluYXRlID0ga2V5XHJcbiAgICAgIC8vICAgfVxyXG4gICAgICAvLyAgIG9wdGlvbiArPSBgPG9wdGlvbiB2YWx1ZT1cIiR7a2V5fVwiPiR7dmFsdWUubmFtZX0gKCR7dmFsdWUuZXBzZ30pPC9vcHRpb24+YFxyXG4gICAgICAvLyB9KVxyXG4gICAgICAvLyBjb29yZGluYXRlRWxtLmlubmVySFRNTCA9IG9wdGlvblxyXG4gICAgICAvLyB0aGlzLmNvb3JkaW5hdGUgPSB0aGlzLm9wdGlvbnMuY29vcmRpbmF0ZVxyXG5cclxuICAgICAgLy8g5Yib5bu65qCH562+6aG1XHJcbiAgICAgIGxldCB0YWJzRWxtID0gbmV3IGN5X3RhYnMoJ3BvaW50LW9iamVjdC1lZGl0LXRhYnMnLCB1bmRlZmluZWQsIHRoaXMuc2RrKVxyXG4gICAgICAvLyDpopzoibLnu4Tku7ZcclxuICAgICAgbGV0IGNvbG9yUGlja2VyID0gbmV3IFlKQ29sb3JQaWNrZXIoe1xyXG4gICAgICAgIGVsOiBjb250ZW50RWxtLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xhYmVsQ29sb3InKVswXSxcclxuICAgICAgICBzaXplOiAnbWluaScsIC8v6aKc6ImyYm9457G75Z6LXHJcbiAgICAgICAgYWxwaGE6IHRydWUsIC8v5piv5ZCm5byA5ZCv6YCP5piO5bqmXHJcbiAgICAgICAgZGVmYXVsdENvbG9yOiB0aGlzLmxhYmVsQ29sb3IsXHJcbiAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLCAvL+aYr+WQpuemgeatouaJk+W8gOminOiJsumAieaLqeWZqFxyXG4gICAgICAgIG9wZW5QaWNrZXJBbmk6ICdvcGFjaXR5JywgLy/miZPlvIDpopzoibLpgInmi6nlmajliqjnlLtcclxuICAgICAgICBzdXJlOiBjb2xvciA9PiB7XHJcbiAgICAgICAgICB0aGlzLmxhYmVsQ29sb3IgPSBjb2xvclxyXG4gICAgICAgIH0sIC8v54K55Ye756Gu6K6k5oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgICAgY2xlYXI6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMubGFiZWxDb2xvciA9ICdyZ2JhKDI1NSwyNTUsMjU1LDEpJ1xyXG4gICAgICAgIH0gLy/ngrnlh7vmuIXnqbrmjInpkq7kuovku7blm57osINcclxuICAgICAgfSlcclxuXHJcbiAgICAgIC8vIGxldCBkaWZmdXNlQ29sb3JQaWNrZXIgPSBuZXcgWUpDb2xvclBpY2tlcih7XHJcbiAgICAgIC8vICAgZWw6IGNvbnRlbnRFbG0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcImRpZmZ1c2VDb2xvclwiKVswXSxcclxuICAgICAgLy8gICBzaXplOiAnbWluaScsLy/popzoibJib3jnsbvlnotcclxuICAgICAgLy8gICBhbHBoYTogZmFsc2UsLy/mmK/lkKblvIDlkK/pgI/mmI7luqZcclxuICAgICAgLy8gICBkZWZhdWx0Q29sb3I6IHRoaXMuZGlmZnVzZUNvbG9yLFxyXG4gICAgICAvLyAgIGRpc2FibGVkOiBmYWxzZSwvL+aYr+WQpuemgeatouaJk+W8gOminOiJsumAieaLqeWZqFxyXG4gICAgICAvLyAgIG9wZW5QaWNrZXJBbmk6ICdvcGFjaXR5JywvL+aJk+W8gOminOiJsumAieaLqeWZqOWKqOeUu1xyXG4gICAgICAvLyAgIHN1cmU6IChjb2xvcikgPT4ge1xyXG4gICAgICAvLyAgICAgdGhpcy5kaWZmdXNlQ29sb3IgPSBjb2xvclxyXG4gICAgICAvLyAgIH0sLy/ngrnlh7vnoa7orqTmjInpkq7kuovku7blm57osINcclxuICAgICAgLy8gICBjbGVhcjogKCkgPT4ge1xyXG4gICAgICAvLyAgICAgdGhpcy5kaWZmdXNlQ29sb3IgPSAncmdiYSgyNTUsMjU1LDI1NSwxKSdcclxuICAgICAgLy8gICB9LC8v54K55Ye75riF56m65oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgIC8vIH0pXHJcbiAgICAgIC8vIGxldCBzY2FuQ29sb3JQaWNrZXIgPSBuZXcgWUpDb2xvclBpY2tlcih7XHJcbiAgICAgIC8vICAgZWw6IGNvbnRlbnRFbG0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcInNjYW5Db2xvclwiKVswXSxcclxuICAgICAgLy8gICBzaXplOiAnbWluaScsLy/popzoibJib3jnsbvlnotcclxuICAgICAgLy8gICBhbHBoYTogZmFsc2UsLy/mmK/lkKblvIDlkK/pgI/mmI7luqZcclxuICAgICAgLy8gICBkZWZhdWx0Q29sb3I6IHRoaXMuc2NhbkNvbG9yLFxyXG4gICAgICAvLyAgIGRpc2FibGVkOiBmYWxzZSwvL+aYr+WQpuemgeatouaJk+W8gOminOiJsumAieaLqeWZqFxyXG4gICAgICAvLyAgIG9wZW5QaWNrZXJBbmk6ICdvcGFjaXR5JywvL+aJk+W8gOminOiJsumAieaLqeWZqOWKqOeUu1xyXG4gICAgICAvLyAgIHN1cmU6IChjb2xvcikgPT4ge1xyXG4gICAgICAvLyAgICAgdGhpcy5zY2FuQ29sb3IgPSBjb2xvclxyXG4gICAgICAvLyAgIH0sLy/ngrnlh7vnoa7orqTmjInpkq7kuovku7blm57osINcclxuICAgICAgLy8gICBjbGVhcjogKCkgPT4ge1xyXG4gICAgICAvLyAgICAgdGhpcy5zY2FuQ29sb3IgPSAncmdiYSgyNTUsMjU1LDI1NSwxKSdcclxuICAgICAgLy8gICB9LC8v54K55Ye75riF56m65oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgIC8vIH0pXHJcbiAgICAgIGxldCBhbGxfZWxtID0gY29udGVudEVsbS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnKicpXHJcbiAgICAgIHRoaXMuX0V2ZW50QmluZGluZy5vbih0aGlzLCBhbGxfZWxtKVxyXG4gICAgICB0aGlzLl9lbG1zID0gdGhpcy5fRXZlbnRCaW5kaW5nLmVsZW1lbnRcclxuICAgICAgdGhpcy5fZWxtcy5sYWJlbENvbG9yID0gW2NvbG9yUGlja2VyXVxyXG4gICAgICAvLyB0aGlzLl9lbG1zLmRpZmZ1c2VDb2xvciA9IFtkaWZmdXNlQ29sb3JQaWNrZXJdXHJcbiAgICAgIC8vIHRoaXMuX2VsbXMuc2NhbkNvbG9yID0gW3NjYW5Db2xvclBpY2tlcl1cclxuXHJcbiAgICAgIHNldFRpbWVvdXQoYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuYXR0cmlidXRlTGluayA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50XHJcbiAgICAgICAgdGhpcy5hdHRyaWJ1dGVWciA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudFxyXG4gICAgICAgIC8vIHRoaXMuYXR0cmlidXRlQ2FtZXJhID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5jYW1lcmFcclxuICAgICAgICB0aGlzLmNhbWVyYVNlbGVjdCAmJiB0aGlzLmNhbWVyYVNlbGVjdCgpXHJcbiAgICAgICAgdGhpcy5JU0NTZWxlY3QgJiYgdGhpcy5JU0NTZWxlY3QoKVxyXG4gICAgICAgIHRoaXMuZ29vZHNTZWxlY3QgJiYgdGhpcy5nb29kc1NlbGVjdCgpXHJcblxyXG4gICAgICAgIGxldCBjb2wgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKVxyXG4gICAgICAgIGNvbC5jbGFzc05hbWUgPSAnY29sJ1xyXG4gICAgICAgIGNvbC5zdHlsZS5mbGV4ID0gJzAgMCAxMTBweCdcclxuICAgICAgICBjb2wuaW5uZXJIVE1MID0gYFxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJsYWJlbFwiPuWxnuaAp+ahhjwvc3Bhbj5cclxuICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImJ0bi1zd2l0Y2hcIiB0eXBlPVwiY2hlY2tib3hcIj5cclxuICAgICAgICBgXHJcblxyXG4gICAgICAgIGxldCByb3cgPSB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdhdHRyaWJ1dGUnKVswXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdyb3cnKVswXVxyXG4gICAgICAgIHJvdy5hcHBlbmRDaGlsZChjb2wpXHJcbiAgICAgICAgbGV0IHRhZ0RhdGEgPSB0aGlzLmF0dHJpYnV0ZVNlbGVjdFxyXG4gICAgICAgIGxldCBhdHRyaWJ1dGVFbG0gPSB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFxyXG4gICAgICAgICAgJ2F0dHJpYnV0ZS1zZWxlY3QtYm94J1xyXG4gICAgICAgIClbMF1cclxuICAgICAgICBpZiAoYXR0cmlidXRlRWxtKSB7XHJcbiAgICAgICAgICBsZXQgbGVncE9iamVjdCA9IGxlZ3AoYXR0cmlidXRlRWxtLCAnLmF0dHJpYnV0ZS1zZWxlY3QnKVxyXG4gICAgICAgICAgbGVncE9iamVjdC5sZWdwX3NlYXJjaCh0YWdEYXRhKVxyXG4gICAgICAgICAgbGV0IGF0dHJpYnV0ZVNlbGVjdEVsbSA9IHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50XHJcbiAgICAgICAgICAgIC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdhdHRyaWJ1dGUtc2VsZWN0JylbMF1cclxuICAgICAgICAgICAgLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdpbnB1dCcpWzBdXHJcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhZ0RhdGEubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKHRhZ0RhdGFbaV0ua2V5ID09PSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlVHlwZSkge1xyXG4gICAgICAgICAgICAgIGF0dHJpYnV0ZVNlbGVjdEVsbS52YWx1ZSA9IHRhZ0RhdGFbaV0udmFsdWVcclxuICAgICAgICAgICAgICBsZWdwT2JqZWN0LmxlZ3Bfc2VhcmNoQWN0aXZlKHRhZ0RhdGFbaV0udmFsdWUpXHJcbiAgICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYXR0cmlidXRlU2VsZWN0RWxtLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKCkgPT4ge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhZ0RhdGEubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICBpZiAodGFnRGF0YVtpXS52YWx1ZSA9PT0gYXR0cmlidXRlU2VsZWN0RWxtLnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmF0dHJpYnV0ZVR5cGUgPSB0YWdEYXRhW2ldLmtleVxyXG4gICAgICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgY29vcmRpbmF0ZURhdGEgPSBbXVxyXG4gICAgICAgIHRoaXMuZXBzZ19tYXAuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xyXG4gICAgICAgICAgY29vcmRpbmF0ZURhdGEucHVzaCh7XHJcbiAgICAgICAgICAgIG5hbWU6IGAke3ZhbHVlLm5hbWV9KCR7dmFsdWUuZXBzZ30pYCxcclxuICAgICAgICAgICAgdmFsdWU6IGtleVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICB9KVxyXG4gICAgICAgIGxldCBjb29yZGluYXRlRGF0YUxlZ3BPYmplY3QgPSBsZWdwKFxyXG4gICAgICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcclxuICAgICAgICAgICAgJ2Nvb3JkaW5hdGUtc2VsZWN0LWJveCdcclxuICAgICAgICAgIClbMF0sXHJcbiAgICAgICAgICAnLmNvb3JkaW5hdGUtc2VsZWN0J1xyXG4gICAgICAgIClcclxuICAgICAgICBpZiAoY29vcmRpbmF0ZURhdGFMZWdwT2JqZWN0KSB7XHJcbiAgICAgICAgICBjb29yZGluYXRlRGF0YUxlZ3BPYmplY3QubGVncF9zZWFyY2goY29vcmRpbmF0ZURhdGEpXHJcbiAgICAgICAgICBsZXQgY29vcmRpbmF0ZURhdGFMZWdwRWxtID0gdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnRcclxuICAgICAgICAgICAgLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2Nvb3JkaW5hdGUtc2VsZWN0JylbMF1cclxuICAgICAgICAgICAgLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdpbnB1dCcpWzBdXHJcbiAgICAgICAgICBpZiAoIXRoaXMuY29vcmRpbmF0ZSkge1xyXG4gICAgICAgICAgICB0aGlzLmNvb3JkaW5hdGUgPSBjb29yZGluYXRlRGF0YVswXS52YWx1ZVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5jb29yZGluYXRlID0gdGhpcy5jb29yZGluYXRlXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBjb29yZGluYXRlRGF0YUxlZ3BFbG0udmFsdWUgPSB0aGlzLmNvb3JkaW5hdGVcclxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29vcmRpbmF0ZURhdGEubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKGNvb3JkaW5hdGVEYXRhW2ldLnZhbHVlID09PSBjb29yZGluYXRlRGF0YS52YWx1ZSkge1xyXG4gICAgICAgICAgICAgIGNvb3JkaW5hdGVEYXRhTGVncE9iamVjdC5sZWdwX3NlYXJjaEFjdGl2ZShcclxuICAgICAgICAgICAgICAgIGNvb3JkaW5hdGVEYXRhW2ldLnZhbHVlXHJcbiAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGNvb3JkaW5hdGVEYXRhTGVncEVsbS5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICgpID0+IHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb29yZGluYXRlRGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgIGlmIChjb29yZGluYXRlRGF0YVtpXS52YWx1ZSA9PT0gY29vcmRpbmF0ZURhdGFMZWdwRWxtLnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvb3JkaW5hdGUgPSBjb29yZGluYXRlRGF0YVtpXS52YWx1ZVxyXG4gICAgICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgaGVpZ2h0Qm94RWxtID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaGVpZ2h0LWJveCcpWzBdXHJcbiAgICAgICAgbGV0IGhlaWdodEVsbSA9IGhlaWdodEJveEVsbS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdoZWlnaHQnKVswXVxyXG4gICAgICAgIGxldCBoZWlnaHRNb2RlRGF0YSA9IFtcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJ+a1t+aLlOmrmOW6picsXHJcbiAgICAgICAgICAgIHZhbHVlOiAn5rW35ouU6auY5bqmJyxcclxuICAgICAgICAgICAga2V5OiAnMCdcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIG5hbWU6ICfnm7jlr7nlnLDooagnLFxyXG4gICAgICAgICAgICB2YWx1ZTogJ+ebuOWvueWcsOihqCcsXHJcbiAgICAgICAgICAgIGtleTogJzEnXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lOiAn5L6d6ZmE5Zyw6KGoJyxcclxuICAgICAgICAgICAgdmFsdWU6ICfkvp3pmYTlnLDooagnLFxyXG4gICAgICAgICAgICBrZXk6ICcyJ1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJ+S+nemZhOaooeWeiycsXHJcbiAgICAgICAgICAgIHZhbHVlOiAn5L6d6ZmE5qih5Z6LJyxcclxuICAgICAgICAgICAga2V5OiAnMydcclxuICAgICAgICAgIH1cclxuICAgICAgICBdXHJcbiAgICAgICAgbGV0IGhlaWdodE1vZGUgPSB0aGlzLmhlaWdodE1vZGVcclxuXHJcbiAgICAgICAgc3dpdGNoIChoZWlnaHRNb2RlKSB7XHJcbiAgICAgICAgICBjYXNlIDA6XHJcbiAgICAgICAgICBjYXNlICcwJzpcclxuICAgICAgICAgICAgaGVpZ2h0RWxtLnZhbHVlID0gdGhpcy5hbHRcclxuICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgIGNhc2UgMTpcclxuICAgICAgICAgIGNhc2UgJzEnOlxyXG4gICAgICAgICAgICBpZiAodGhpcy5zZGsudmlld2VyLnNjZW5lLnRlcnJhaW5Qcm92aWRlci5hdmFpbGFiaWxpdHkpIHtcclxuICAgICAgICAgICAgICBDZXNpdW0uc2FtcGxlVGVycmFpbk1vc3REZXRhaWxlZChcclxuICAgICAgICAgICAgICAgIHRoaXMuc2RrLnZpZXdlci5zY2VuZS50ZXJyYWluUHJvdmlkZXIsXHJcbiAgICAgICAgICAgICAgICBbXHJcbiAgICAgICAgICAgICAgICAgIENlc2l1bS5DYXJ0b2dyYXBoaWMuZnJvbURlZ3JlZXMoXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uLmxuZyxcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb24ubGF0XHJcbiAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIF1cclxuICAgICAgICAgICAgICApLnRoZW4ocG9zaXRpb24gPT4ge1xyXG4gICAgICAgICAgICAgICAgaGVpZ2h0RWxtLnZhbHVlID0gTnVtYmVyKFxyXG4gICAgICAgICAgICAgICAgICAodGhpcy5hbHQgLSBOdW1iZXIocG9zaXRpb25bMF0uaGVpZ2h0LnRvRml4ZWQoMikpKS50b0ZpeGVkKDIpXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBoZWlnaHRFbG0udmFsdWUgPSBOdW1iZXIodGhpcy5hbHQudG9GaXhlZCgyKSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgY2FzZSAyOlxyXG4gICAgICAgICAgY2FzZSAnMic6XHJcbiAgICAgICAgICBjYXNlIDM6XHJcbiAgICAgICAgICBjYXNlICczJzpcclxuICAgICAgICAgICAgbGV0IG9iamVjdHNUb0V4Y2x1ZGUgPSBbXVxyXG4gICAgICAgICAgICBmb3IgKGxldCBba2V5LCB2YWx1ZV0gb2YgdGhpcy5zZGsuZW50aXR5TWFwKSB7XHJcbiAgICAgICAgICAgICAgaWYgKHZhbHVlLnR5cGUgPT09ICdSYWRhclNjYW5TdGVyZW9zY29waWMnICYmIHZhbHVlLmVudGl0eSkge1xyXG4gICAgICAgICAgICAgICAgb2JqZWN0c1RvRXhjbHVkZS5wdXNoKHZhbHVlLmVudGl0eSlcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5nZXRDbGFtcFRvSGVpZ2h0KHRoaXMub3B0aW9ucy5wb3NpdGlvbiwgb2JqZWN0c1RvRXhjbHVkZSkudGhlbihoID0+IHtcclxuICAgICAgICAgICAgICB0aGlzLmFsdCA9IE51bWJlcihoLnRvRml4ZWQoMikpXHJcbiAgICAgICAgICAgICAgaGVpZ2h0RWxtLnZhbHVlID0gdGhpcy5hbHRcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBoZWlnaHRNb2RlT2JqZWN0ID0gbGVncChcclxuICAgICAgICAgIHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXHJcbiAgICAgICAgICAgICdoZWlnaHQtbW9kZS1ib3gnXHJcbiAgICAgICAgICApWzBdLFxyXG4gICAgICAgICAgJy5oZWlnaHQtbW9kZSdcclxuICAgICAgICApXHJcbiAgICAgICAgaWYgKGhlaWdodE1vZGVPYmplY3QpIHtcclxuICAgICAgICAgIGhlaWdodE1vZGVPYmplY3QubGVncF9zZWFyY2goaGVpZ2h0TW9kZURhdGEpXHJcbiAgICAgICAgICBsZXQgaGVpZ2h0TW9kZURhdGFMZWdwRWxtID0gdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnRcclxuICAgICAgICAgICAgLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2hlaWdodC1tb2RlJylbMF1cclxuICAgICAgICAgICAgLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdpbnB1dCcpWzBdXHJcbiAgICAgICAgICBoZWlnaHRNb2RlRGF0YUxlZ3BFbG0udmFsdWUgPSBoZWlnaHRNb2RlRGF0YVt0aGlzLmhlaWdodE1vZGVdLnZhbHVlXHJcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhlaWdodE1vZGVEYXRhLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChoZWlnaHRNb2RlRGF0YVtpXS52YWx1ZSA9PSBoZWlnaHRNb2RlRGF0YUxlZ3BFbG0udmFsdWUpIHtcclxuICAgICAgICAgICAgICBoZWlnaHRNb2RlT2JqZWN0LmxlZ3Bfc2VhcmNoQWN0aXZlKGhlaWdodE1vZGVEYXRhW2ldLnZhbHVlKVxyXG4gICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGhlaWdodE1vZGVEYXRhTGVncEVsbS5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICgpID0+IHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoZWlnaHRNb2RlRGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgIGlmIChoZWlnaHRNb2RlRGF0YVtpXS52YWx1ZSA9PT0gaGVpZ2h0TW9kZURhdGFMZWdwRWxtLnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICBoZWlnaHRNb2RlID0gaGVpZ2h0TW9kZURhdGFbaV0ua2V5XHJcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGhlaWdodE1vZGUpIHtcclxuICAgICAgICAgICAgICAgICAgY2FzZSAwOlxyXG4gICAgICAgICAgICAgICAgICBjYXNlICcwJzpcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFsdCA9IE51bWJlcihoZWlnaHRFbG0udmFsdWUpXHJcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0Qm94RWxtLnN0eWxlLmRpc3BsYXkgPSAnZmxleCdcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmhlaWdodE1vZGUgPSAwXHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgICAgICAgICAgY2FzZSAxOlxyXG4gICAgICAgICAgICAgICAgICBjYXNlICcxJzpcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zZGsudmlld2VyLnNjZW5lLnRlcnJhaW5Qcm92aWRlci5hdmFpbGFiaWxpdHkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIENlc2l1bS5zYW1wbGVUZXJyYWluTW9zdERldGFpbGVkKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNkay52aWV3ZXIuc2NlbmUudGVycmFpblByb3ZpZGVyLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgQ2VzaXVtLkNhcnRvZ3JhcGhpYy5mcm9tRGVncmVlcyhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbi5sbmcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb24ubGF0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBdXHJcbiAgICAgICAgICAgICAgICAgICAgICApLnRoZW4ocG9zaXRpb24gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFsdCA9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtYmVyKGhlaWdodEVsbS52YWx1ZSkgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIE51bWJlcihwb3NpdGlvblswXS5oZWlnaHQudG9GaXhlZCgyKSlcclxuICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWx0ID0gTnVtYmVyKGhlaWdodEVsbS52YWx1ZSlcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0Qm94RWxtLnN0eWxlLmRpc3BsYXkgPSAnZmxleCdcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmhlaWdodE1vZGUgPSAxXHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgICAgICAgICAgY2FzZSAyOlxyXG4gICAgICAgICAgICAgICAgICBjYXNlICcyJzpcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmhlaWdodE1vZGUgPSAyXHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgICAgICAgICAgY2FzZSAzOlxyXG4gICAgICAgICAgICAgICAgICBjYXNlICczJzpcclxuICAgICAgICAgICAgICAgICAgICBsZXQgb2JqZWN0c1RvRXhjbHVkZSA9IFtdXHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgW2tleSwgdmFsdWVdIG9mIHRoaXMuc2RrLmVudGl0eU1hcCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlLnR5cGUgPT09ICdSYWRhclNjYW5TdGVyZW9zY29waWMnICYmIHZhbHVlLmVudGl0eSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RzVG9FeGNsdWRlLnB1c2godmFsdWUuZW50aXR5KVxyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdldENsYW1wVG9IZWlnaHQodGhpcy5vcHRpb25zLnBvc2l0aW9uLCBvYmplY3RzVG9FeGNsdWRlKS50aGVuKGggPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5hbHQgPSBOdW1iZXIoaC50b0ZpeGVkKDIpKVxyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oZWlnaHRNb2RlID0gM1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSlcclxuXHJcbiAgICAgICAgICBoZWlnaHRFbG0uYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIHN3aXRjaCAoaGVpZ2h0TW9kZSkge1xyXG4gICAgICAgICAgICAgIGNhc2UgMDpcclxuICAgICAgICAgICAgICBjYXNlICcwJzpcclxuICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbi5hbHQgPSBOdW1iZXIoXHJcbiAgICAgICAgICAgICAgICAgIE51bWJlcihoZWlnaHRFbG0udmFsdWUpLnRvRml4ZWQoMilcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgICAgY2FzZSAxOlxyXG4gICAgICAgICAgICAgIGNhc2UgJzEnOlxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2RrLnZpZXdlci5zY2VuZS50ZXJyYWluUHJvdmlkZXIuYXZhaWxhYmlsaXR5KSB7XHJcbiAgICAgICAgICAgICAgICAgIENlc2l1bS5zYW1wbGVUZXJyYWluTW9zdERldGFpbGVkKFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2RrLnZpZXdlci5zY2VuZS50ZXJyYWluUHJvdmlkZXIsXHJcbiAgICAgICAgICAgICAgICAgICAgW1xyXG4gICAgICAgICAgICAgICAgICAgICAgQ2VzaXVtLkNhcnRvZ3JhcGhpYy5mcm9tRGVncmVlcyhcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uLmxuZyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uLmxhdFxyXG4gICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgIF1cclxuICAgICAgICAgICAgICAgICAgKS50aGVuKHBvc2l0aW9uID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFsdCA9XHJcbiAgICAgICAgICAgICAgICAgICAgICBOdW1iZXIoaGVpZ2h0RWxtLnZhbHVlKSArXHJcbiAgICAgICAgICAgICAgICAgICAgICBOdW1iZXIocG9zaXRpb25bMF0uaGVpZ2h0LnRvRml4ZWQoMikpXHJcbiAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLmFsdCA9IE51bWJlcihoZWlnaHRFbG0udmFsdWUpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICAgIGNhc2UgMjpcclxuICAgICAgICAgICAgICBjYXNlICcyJzpcclxuICAgICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5yZW5ld1BvaW50KClcclxuICAgICAgICAgICAgdGhpcy5jb29yZGluYXRlID0gdGhpcy5vcHRpb25zLmNvb3JkaW5hdGVcclxuICAgICAgICAgICAgdGhpcy5fZWxtcy5hbHQgJiZcclxuICAgICAgICAgICAgICB0aGlzLl9lbG1zLmFsdC5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICAgICAgaXRlbS52YWx1ZSA9IHRoaXMub3B0aW9ucy5wb3NpdGlvbi5hbHRcclxuICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIHRoaXMuX2VsbXMuaGVpZ2h0ID0gaGVpZ2h0Qm94RWxtXHJcbiAgICAgICAgICB0aGlzLl9lbG1zLmhlaWdodE1vZGUgPSBoZWlnaHRNb2RlRGF0YUxlZ3BFbG1cclxuXHJcbiAgICAgICAgICB0aGlzLmhlaWdodE1vZGUgPSB0aGlzLmhlaWdodE1vZGVcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBmb250RGF0YSA9IGdldEZvbnRMaXN0KClcclxuICAgICAgICBsZXQgZm9udE9iamVjdCA9IGxlZ3AoXHJcbiAgICAgICAgICB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFxyXG4gICAgICAgICAgICAnZm9udC1zZWxlY3QtYm94J1xyXG4gICAgICAgICAgKVswXSxcclxuICAgICAgICAgICcuZm9udC1zZWxlY3QnXHJcbiAgICAgICAgKVxyXG4gICAgICAgIGlmIChmb250T2JqZWN0KSB7XHJcbiAgICAgICAgICBmb250T2JqZWN0LmxlZ3Bfc2VhcmNoKGZvbnREYXRhKVxyXG4gICAgICAgICAgbGV0IGZvbnREYXRhTGVncEVsbSA9IHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50XHJcbiAgICAgICAgICAgIC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdmb250LXNlbGVjdCcpWzBdXHJcbiAgICAgICAgICAgIC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaW5wdXQnKVswXVxyXG4gICAgICAgICAgZm9udERhdGFMZWdwRWxtLnZhbHVlID0gZm9udERhdGFbdGhpcy5sYWJlbEZvbnRGYW1pbHldLnZhbHVlXHJcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZvbnREYXRhLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChmb250RGF0YVtpXS52YWx1ZSA9PSBmb250RGF0YUxlZ3BFbG0udmFsdWUpIHtcclxuICAgICAgICAgICAgICBmb250T2JqZWN0LmxlZ3Bfc2VhcmNoQWN0aXZlKGZvbnREYXRhW2ldLnZhbHVlKVxyXG4gICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGZvbnREYXRhTGVncEVsbS5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICgpID0+IHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmb250RGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgIGlmIChmb250RGF0YVtpXS52YWx1ZSA9PT0gZm9udERhdGFMZWdwRWxtLnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxhYmVsRm9udEZhbWlseSA9IGZvbnREYXRhW2ldLmtleVxyXG4gICAgICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICB0aGlzLl9lbG1zLmxhYmVsRm9udEZhbWlseSA9IFtmb250RGF0YUxlZ3BFbG1dXHJcbiAgICAgICAgfVxyXG4gICAgICB9LCAwKVxyXG5cclxuICAgICAgbGV0IGxuZ0VsbiA9IGNvbnRlbnRFbG0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbG5nJylbMF1cclxuICAgICAgbGV0IGxhdEVsbiA9IGNvbnRlbnRFbG0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbGF0JylbMF1cclxuICAgICAgbG5nRWxuLnZhbHVlID0gdGhpcy5sbmdcclxuICAgICAgbGF0RWxuLnZhbHVlID0gdGhpcy5sYXRcclxuICAgICAgdGhpcy5fZWxtcy5sbmcucHVzaChsbmdFbG4pXHJcbiAgICAgIHRoaXMuX2VsbXMubGF0LnB1c2gobGF0RWxuKVxyXG5cclxuICAgICAgbGV0IHByb2pDaGVja2JveEJveEVsbXMgPSB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFxyXG4gICAgICAgICdZSi1jdXN0b20tY2hlY2tib3gtYm94J1xyXG4gICAgICApXHJcbiAgICAgIGxldCBwcm9qQ2hlY2tib3hFbG1zID0gdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcclxuICAgICAgICAnWUotY3VzdG9tLWNoZWNrYm94J1xyXG4gICAgICApXHJcbiAgICAgIGxldCBwcm9qSW5wdXRCb3hFbG1zID0gdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcclxuICAgICAgICAncHJvai1pbnB1dC1ib3gnXHJcbiAgICAgIClcclxuXHJcbiAgICAgIHByb2pDaGVja2JveEVsbXNbMF0uY2hlY2tlZCA9IHRydWVcclxuICAgICAgcHJvaklucHV0Qm94RWxtc1sxXS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnXHJcbiAgICAgIHByb2pJbnB1dEJveEVsbXNbMl0uc3R5bGUuZGlzcGxheSA9ICdub25lJ1xyXG5cclxuICAgICAgcHJvakNoZWNrYm94Qm94RWxtc1swXS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcclxuICAgICAgICBwcm9qQ2hlY2tib3hFbG1zWzBdLmNoZWNrZWQgPSB0cnVlXHJcbiAgICAgICAgcHJvaklucHV0Qm94RWxtc1swXS5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJ1xyXG4gICAgICAgIHByb2pDaGVja2JveEVsbXNbMV0uY2hlY2tlZCA9IGZhbHNlXHJcbiAgICAgICAgcHJvaklucHV0Qm94RWxtc1sxXS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnXHJcbiAgICAgICAgcHJvakNoZWNrYm94RWxtc1syXS5jaGVja2VkID0gZmFsc2VcclxuICAgICAgICBwcm9qSW5wdXRCb3hFbG1zWzJdLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSdcclxuICAgICAgfSlcclxuICAgICAgcHJvakNoZWNrYm94Qm94RWxtc1sxXS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcclxuICAgICAgICBwcm9qQ2hlY2tib3hFbG1zWzFdLmNoZWNrZWQgPSB0cnVlXHJcbiAgICAgICAgcHJvaklucHV0Qm94RWxtc1sxXS5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJ1xyXG4gICAgICAgIHByb2pDaGVja2JveEVsbXNbMF0uY2hlY2tlZCA9IGZhbHNlXHJcbiAgICAgICAgcHJvaklucHV0Qm94RWxtc1swXS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnXHJcbiAgICAgICAgcHJvakNoZWNrYm94RWxtc1syXS5jaGVja2VkID0gZmFsc2VcclxuICAgICAgICBwcm9qSW5wdXRCb3hFbG1zWzJdLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSdcclxuICAgICAgfSlcclxuICAgICAgcHJvakNoZWNrYm94Qm94RWxtc1syXS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcclxuICAgICAgICBwcm9qQ2hlY2tib3hFbG1zWzJdLmNoZWNrZWQgPSB0cnVlXHJcbiAgICAgICAgcHJvaklucHV0Qm94RWxtc1syXS5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJ1xyXG4gICAgICAgIHByb2pDaGVja2JveEVsbXNbMF0uY2hlY2tlZCA9IGZhbHNlXHJcbiAgICAgICAgcHJvaklucHV0Qm94RWxtc1swXS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnXHJcbiAgICAgICAgcHJvakNoZWNrYm94RWxtc1sxXS5jaGVja2VkID0gZmFsc2VcclxuICAgICAgICBwcm9qSW5wdXRCb3hFbG1zWzFdLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSdcclxuICAgICAgfSlcclxuXHJcbiAgICAgIF90aGlzLl9wcm9qQ29udmVydCA9ICgpID0+IHtcclxuICAgICAgICBpZiAoIXRoaXMuX0RpYWxvZ09iamVjdCB8fCB0aGlzLl9EaWFsb2dPYmplY3QuaXNEZXN0cm95KSB7XHJcbiAgICAgICAgICByZXR1cm5cclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IGxuZyxcclxuICAgICAgICAgIGxhdCxcclxuICAgICAgICAgIGxuZ0QsXHJcbiAgICAgICAgICBsbmdNLFxyXG4gICAgICAgICAgbG5nUyxcclxuICAgICAgICAgIGxhdEQsXHJcbiAgICAgICAgICBsYXRNLFxyXG4gICAgICAgICAgbGF0UyxcclxuICAgICAgICAgIGxuZ0RNLFxyXG4gICAgICAgICAgbGF0RE0sXHJcbiAgICAgICAgICBsbmdETVMsXHJcbiAgICAgICAgICBsYXRETVMsXHJcbiAgICAgICAgICBsbmdkbkFycjEsXHJcbiAgICAgICAgICBsbmdkbkFycjIsXHJcbiAgICAgICAgICBsYXRkbkFycjEsXHJcbiAgICAgICAgICBsYXRkbkFycjIsXHJcbiAgICAgICAgICBsbmdkbnNBcnIxLFxyXG4gICAgICAgICAgbG5nZG5zQXJyMixcclxuICAgICAgICAgIGxuZ2Ruc0FycjMsXHJcbiAgICAgICAgICBsYXRkbnNBcnIxLFxyXG4gICAgICAgICAgbGF0ZG5zQXJyMixcclxuICAgICAgICAgIGxhdGRuc0FycjNcclxuICAgICAgICBsbmcgPSBfdGhpcy5sbmdcclxuICAgICAgICBsYXQgPSBfdGhpcy5sYXRcclxuICAgICAgICBsbmdETSA9IF90aGlzLl9wcm9qLmRlZ3JlZXNUb0RNUyhsbmcsIHRydWUpXHJcbiAgICAgICAgbGF0RE0gPSBfdGhpcy5fcHJvai5kZWdyZWVzVG9ETVMobGF0LCB0cnVlKVxyXG4gICAgICAgIGxuZ2RuQXJyMSA9IGxuZ0RNLnNwbGl0KCfCsCcpXHJcbiAgICAgICAgbG5nZG5BcnIyID0gbG5nZG5BcnIxWzFdLnNwbGl0KFwiJ1wiKVxyXG4gICAgICAgIGxhdGRuQXJyMSA9IGxhdERNLnNwbGl0KCfCsCcpXHJcbiAgICAgICAgbGF0ZG5BcnIyID0gbGF0ZG5BcnIxWzFdLnNwbGl0KFwiJ1wiKVxyXG4gICAgICAgIGNvbnRlbnRFbG0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbG5nLWRtLWQnKVswXS52YWx1ZSA9IGxuZ2RuQXJyMVswXVxyXG4gICAgICAgIGNvbnRlbnRFbG0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbG5nLWRtLW0nKVswXS52YWx1ZSA9IGxuZ2RuQXJyMlswXVxyXG4gICAgICAgIGNvbnRlbnRFbG0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbGF0LWRtLWQnKVswXS52YWx1ZSA9IGxhdGRuQXJyMVswXVxyXG4gICAgICAgIGNvbnRlbnRFbG0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbGF0LWRtLW0nKVswXS52YWx1ZSA9IGxhdGRuQXJyMlswXVxyXG5cclxuICAgICAgICBsbmdETVMgPSBfdGhpcy5fcHJvai5kZWdyZWVzVG9ETVMobG5nKVxyXG4gICAgICAgIGxhdERNUyA9IF90aGlzLl9wcm9qLmRlZ3JlZXNUb0RNUyhsYXQpXHJcbiAgICAgICAgbG5nZG5zQXJyMSA9IGxuZ0RNUy5zcGxpdCgnwrAnKVxyXG4gICAgICAgIGxuZ2Ruc0FycjIgPSBsbmdkbnNBcnIxWzFdLnNwbGl0KFwiJ1wiKVxyXG4gICAgICAgIGxuZ2Ruc0FycjMgPSBsbmdkbnNBcnIyWzFdLnNwbGl0KCdcIicpXHJcbiAgICAgICAgbGF0ZG5zQXJyMSA9IGxhdERNUy5zcGxpdCgnwrAnKVxyXG4gICAgICAgIGxhdGRuc0FycjIgPSBsYXRkbnNBcnIxWzFdLnNwbGl0KFwiJ1wiKVxyXG4gICAgICAgIGxhdGRuc0FycjMgPSBsYXRkbnNBcnIyWzFdLnNwbGl0KCdcIicpXHJcbiAgICAgICAgY29udGVudEVsbS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdsbmctZG1zLWQnKVswXS52YWx1ZSA9IGxuZ2Ruc0FycjFbMF1cclxuICAgICAgICBjb250ZW50RWxtLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xuZy1kbXMtbScpWzBdLnZhbHVlID0gbG5nZG5zQXJyMlswXVxyXG4gICAgICAgIGNvbnRlbnRFbG0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbG5nLWRtcy1zJylbMF0udmFsdWUgPSBsbmdkbnNBcnIzWzBdXHJcbiAgICAgICAgY29udGVudEVsbS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdsYXQtZG1zLWQnKVswXS52YWx1ZSA9IGxhdGRuc0FycjFbMF1cclxuICAgICAgICBjb250ZW50RWxtLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xhdC1kbXMtbScpWzBdLnZhbHVlID0gbGF0ZG5zQXJyMlswXVxyXG4gICAgICAgIGNvbnRlbnRFbG0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbGF0LWRtcy1zJylbMF0udmFsdWUgPSBsYXRkbnNBcnIzWzBdXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIF90aGlzLl9wcm9qQ29udmVydCgpXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBpZiAodGhpcy5fZWxlbWVudF9zdHlsZSkge1xyXG4gICAgICAvLyAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdoZWFkJylbMF0ucmVtb3ZlQ2hpbGQodGhpcy5fZWxlbWVudF9zdHlsZSlcclxuICAgICAgLy8gICB0aGlzLl9lbGVtZW50X3N0eWxlID0gbnVsbFxyXG4gICAgICAvLyB9XHJcbiAgICAgIC8vIGlmICh0aGlzLl9EaWFsb2dPYmplY3QgJiYgdGhpcy5fRGlhbG9nT2JqZWN0LnJlbW92ZSkge1xyXG4gICAgICAvLyAgIHRoaXMuX0RpYWxvZ09iamVjdC5yZW1vdmUoKVxyXG4gICAgICAvLyAgIHRoaXMuX0RpYWxvZ09iamVjdCA9IG51bGxcclxuICAgICAgLy8gfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVuZXdQb2ludCgpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXNcclxuXHJcbiAgICBsZXQgZm9udCA9IGdldEZvbnRGYW1pbHkodGhpcy5sYWJlbEZvbnRGYW1pbHkpIHx8ICdIZWx2ZXRpY2EnXHJcblxyXG4gICAgaWYgKHRoaXMuZW50aXR5KSB7XHJcbiAgICAgIHRoaXMuZW50aXR5LnBvc2l0aW9uID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXMoXHJcbiAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uLmxuZyxcclxuICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb24ubGF0LFxyXG4gICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbi5hbHRcclxuICAgICAgKVxyXG4gICAgICBpZiAodGhpcy5vcHRpb25zLnNjYWxlQnlEaXN0YW5jZSkge1xyXG4gICAgICAgIHRoaXMuZW50aXR5LmJpbGxib2FyZC5zY2FsZUJ5RGlzdGFuY2UgPSBuZXcgQ2VzaXVtLk5lYXJGYXJTY2FsYXIoXHJcbiAgICAgICAgICB0aGlzLm9wdGlvbnMubmVhcixcclxuICAgICAgICAgIDEsXHJcbiAgICAgICAgICB0aGlzLm9wdGlvbnMuZmFyLFxyXG4gICAgICAgICAgMFxyXG4gICAgICAgIClcclxuICAgICAgICB0aGlzLmVudGl0eS5iaWxsYm9hcmQucGl4ZWxPZmZzZXRTY2FsZUJ5RGlzdGFuY2UgPSBuZXcgQ2VzaXVtLk5lYXJGYXJTY2FsYXIoXHJcbiAgICAgICAgICB0aGlzLm9wdGlvbnMubmVhcixcclxuICAgICAgICAgIDEsXHJcbiAgICAgICAgICB0aGlzLm9wdGlvbnMuZmFyLFxyXG4gICAgICAgICAgMFxyXG4gICAgICAgIClcclxuICAgICAgICB0aGlzLmVudGl0eS5sYWJlbC5zY2FsZUJ5RGlzdGFuY2UgPSBuZXcgQ2VzaXVtLk5lYXJGYXJTY2FsYXIoXHJcbiAgICAgICAgICB0aGlzLm9wdGlvbnMubmVhcixcclxuICAgICAgICAgIDEsXHJcbiAgICAgICAgICB0aGlzLm9wdGlvbnMuZmFyLFxyXG4gICAgICAgICAgMFxyXG4gICAgICAgIClcclxuICAgICAgICB0aGlzLmVudGl0eS5sYWJlbC5waXhlbE9mZnNldFNjYWxlQnlEaXN0YW5jZSA9IG5ldyBDZXNpdW0uTmVhckZhclNjYWxhcihcclxuICAgICAgICAgIHRoaXMub3B0aW9ucy5uZWFyLFxyXG4gICAgICAgICAgMSxcclxuICAgICAgICAgIHRoaXMub3B0aW9ucy5mYXIsXHJcbiAgICAgICAgICAwXHJcbiAgICAgICAgKVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuZW50aXR5LmJpbGxib2FyZC5zY2FsZUJ5RGlzdGFuY2UgPSB1bmRlZmluZWRcclxuICAgICAgICB0aGlzLmVudGl0eS5iaWxsYm9hcmQucGl4ZWxPZmZzZXRTY2FsZUJ5RGlzdGFuY2UgPSB1bmRlZmluZWRcclxuICAgICAgICB0aGlzLmVudGl0eS5sYWJlbC5zY2FsZUJ5RGlzdGFuY2UgPSB1bmRlZmluZWRcclxuICAgICAgICB0aGlzLmVudGl0eS5sYWJlbC5waXhlbE9mZnNldFNjYWxlQnlEaXN0YW5jZSA9IHVuZGVmaW5lZFxyXG4gICAgICB9XHJcbiAgICAgIC8vIHRoaXMuZW50aXR5LmJpbGxib2FyZC5waXhlbE9mZnNldCA9IG5ldyBDZXNpdW0uQ2FsbGJhY2tQcm9wZXJ0eShcclxuICAgICAgLy8gICBmdW5jdGlvbiAoKSB7XHJcbiAgICAgIC8vICAgICBsZXQgYmlsbGJvYXJkSCA9XHJcbiAgICAgIC8vICAgICAgIF90aGlzLmVudGl0eS5iaWxsYm9hcmQuaW1nSGVpZ2h0ICpcclxuICAgICAgLy8gICAgICAgKDMxIC8gX3RoaXMuZW50aXR5LmJpbGxib2FyZC5pbWdXaWR0aClcclxuICAgICAgLy8gICAgIHJldHVybiBuZXcgQ2VzaXVtLkNhcnRlc2lhbjIoXHJcbiAgICAgIC8vICAgICAgIDAsXHJcbiAgICAgIC8vICAgICAgIC0oYmlsbGJvYXJkSCAvIDIpICogX3RoaXMub3B0aW9ucy5iaWxsYm9hcmQuc2NhbGVcclxuICAgICAgLy8gICAgIClcclxuICAgICAgLy8gICB9LFxyXG4gICAgICAvLyAgIGZhbHNlXHJcbiAgICAgIC8vIClcclxuICAgICAgdGhpcy5lbnRpdHkubGFiZWwucGl4ZWxPZmZzZXQgPSBuZXcgQ2VzaXVtLkNhbGxiYWNrUHJvcGVydHkoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGlmIChfdGhpcy5vcHRpb25zLmJpbGxib2FyZC5zaG93KSB7XHJcbiAgICAgICAgICBsZXQgYmlsbGJvYXJkSCA9IF90aGlzLmVudGl0eS5iaWxsYm9hcmQuaW1nSGVpZ2h0ID9cclxuICAgICAgICAgICAgX3RoaXMuZW50aXR5LmJpbGxib2FyZC5pbWdIZWlnaHQgKlxyXG4gICAgICAgICAgICAoMzEgLyBfdGhpcy5lbnRpdHkuYmlsbGJvYXJkLmltZ1dpZHRoKSA6IDBcclxuICAgICAgICAgIHJldHVybiBuZXcgQ2VzaXVtLkNhcnRlc2lhbjIoXHJcbiAgICAgICAgICAgIDAsXHJcbiAgICAgICAgICAgIC1iaWxsYm9hcmRIICogX3RoaXMub3B0aW9ucy5iaWxsYm9hcmQuc2NhbGUgLVxyXG4gICAgICAgICAgICBfdGhpcy5vcHRpb25zLmxhYmVsLmZvbnRTaXplIC8gMiAtXHJcbiAgICAgICAgICAgIDVcclxuICAgICAgICAgIClcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmV0dXJuIG5ldyBDZXNpdW0uQ2FydGVzaWFuMigwLCAtX3RoaXMub3B0aW9ucy5sYWJlbC5mb250U2l6ZSAvIDIgLSA1KVxyXG4gICAgICAgIH1cclxuICAgICAgfSwgZmFsc2UpXHJcbiAgICAgIHRoaXMuZW50aXR5LmxhYmVsLmZvbnQgPSB0aGlzLm9wdGlvbnMubGFiZWwuZm9udFNpemUgKyAncHggJyArIGZvbnRcclxuICAgICAgdGhpcy5lbnRpdHkubGFiZWwuZmlsbENvbG9yID0gQ2VzaXVtLkNvbG9yLmZyb21Dc3NDb2xvclN0cmluZyhcclxuICAgICAgICB0aGlzLm9wdGlvbnMubGFiZWwuY29sb3JcclxuICAgICAgKVxyXG4gICAgICB0aGlzLmVudGl0eS5iaWxsYm9hcmQuc2NhbGUgPSB0aGlzLm9wdGlvbnMuYmlsbGJvYXJkLnNjYWxlXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZXNldCgpIHtcclxuICAgIGlmICghdGhpcy5lbnRpdHkpIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcbiAgICB0aGlzLm9wdGlvbnMgPSB0aGlzLmRlZXBDb3B5T2JqKHRoaXMub3JpZ2luYWxPcHRpb25zKVxyXG4gICAgdGhpcy5uZWFyID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMubmVhclxyXG4gICAgdGhpcy5mYXIgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5mYXJcclxuICAgIHRoaXMuc2NhbGVCeURpc3RhbmNlID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMuc2NhbGVCeURpc3RhbmNlXHJcbiAgICB0aGlzLmJpbGxib2FyZFNob3cgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5iaWxsYm9hcmQuc2hvd1xyXG4gICAgdGhpcy5iaWxsYm9hcmRJbWFnZSA9IHRoaXMub3JpZ2luYWxPcHRpb25zLmJpbGxib2FyZC5pbWFnZVxyXG4gICAgdGhpcy5iaWxsYm9hcmRTY2FsZSA9IHRoaXMub3JpZ2luYWxPcHRpb25zLmJpbGxib2FyZC5zY2FsZVxyXG4gICAgdGhpcy5sYWJlbFRleHQgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5sYWJlbC50ZXh0XHJcbiAgICB0aGlzLmxhYmVsU2hvdyA9IHRoaXMub3JpZ2luYWxPcHRpb25zLmxhYmVsLnNob3dcclxuICAgIHRoaXMubGFiZWxGb250U2l6ZSA9IHRoaXMub3JpZ2luYWxPcHRpb25zLmxhYmVsLmZvbnRTaXplXHJcbiAgICB0aGlzLmxhYmVsQ29sb3IgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5sYWJlbC5jb2xvclxyXG4gICAgdGhpcy5sbmcgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5wb3NpdGlvbi5sbmdcclxuICAgIHRoaXMubGF0ID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMucG9zaXRpb24ubGF0XHJcbiAgICB0aGlzLmFsdCA9IHRoaXMub3JpZ2luYWxPcHRpb25zLnBvc2l0aW9uLmFsdFxyXG4gICAgdGhpcy5hdHRyaWJ1dGVMaW5rID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnRcclxuICAgIHRoaXMuYXR0cmlidXRlVnIgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnRcclxuICAgIHRoaXMuYXR0cmlidXRlQ2FtZXJhID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5jYW1lcmEuY29udGVudFxyXG4gICAgdGhpcy5hdHRyaWJ1dGVHb29kcyA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUuZ29vZHMuY29udGVudFxyXG4gICAgdGhpcy5hdHRyaWJ1dGVJU0MgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmlzYy5jb250ZW50XHJcbiAgICB0aGlzLmNhbWVyYVNlbGVjdCAmJiB0aGlzLmNhbWVyYVNlbGVjdCgpXHJcbiAgICB0aGlzLmdvb2RzU2VsZWN0ICYmIHRoaXMuZ29vZHNTZWxlY3QoKVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgcmVtb3ZlKCkge1xyXG4gICAgYXdhaXQgcmVtb3ZlX2VudGl0eV9mcm9tX2NsdXN0ZXIodGhpcy5zZGsudmlld2VyLCB0aGlzLmVudGl0eSlcclxuICAgIHRoaXMuZW50aXR5ID0gbnVsbFxyXG4gICAgaWYgKCF0aGlzLnNkay52aWV3ZXIgfHwgIXRoaXMuc2RrLnZpZXdlci5lbnRpdGllcykge1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuICAgIC8vIGlmICh0aGlzLmRpZmZ1c2UpIHtcclxuICAgIC8vICAgdGhpcy5kaWZmdXNlLnJlbW92ZSgpXHJcbiAgICAvLyAgIHRoaXMuZGlmZnVzZSA9IG51bGxcclxuICAgIC8vIH1cclxuICAgIC8vIGlmICh0aGlzLnNjYW4pIHtcclxuICAgIC8vICAgdGhpcy5zY2FuLnJlbW92ZSgpXHJcbiAgICAvLyAgIHRoaXMuc2NhbiA9IG51bGxcclxuICAgIC8vIH1cclxuICAgIGlmICh0aGlzLl9EaWFsb2dPYmplY3QgJiYgIXRoaXMuX0RpYWxvZ09iamVjdC5pc0Rlc3Ryb3kpIHtcclxuICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0LmNsb3NlKClcclxuICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0ID0gbnVsbFxyXG4gICAgfVxyXG4gICAgdGhpcy5ldmVudCAmJiB0aGlzLmV2ZW50LmRlc3Ryb3koKVxyXG4gICAgdGhpcy50aXAgJiYgdGhpcy50aXAuZGVzdHJveSgpXHJcbiAgICBhd2FpdCB0aGlzLnNkay5yZW1vdmVJbmNldGFuY2UodGhpcy5vcHRpb25zLmlkKVxyXG4gICAgYXdhaXQgc3luY0RhdGEodGhpcy5zZGssIHRoaXMub3B0aW9ucy5pZClcclxuICAgIC8vIHRoaXMuZW50aXR5ID0gbnVsbFxyXG4gIH1cclxuXHJcbiAgLy8g54K55Ye75by55qGG5YaF5Zu+5qCH5YiH5o2iXHJcbiAgY2xpY2tDaGFuZ2VJbWFnZSgpIHtcclxuICAgIHRoaXMuRGlhbG9nLmNsaWNrQ2hhbmdlSW1hZ2UgJiYgdGhpcy5EaWFsb2cuY2xpY2tDaGFuZ2VJbWFnZSgpXHJcbiAgfVxyXG4gIC8vIOeCueWHu+W8ueahhuWGhem7mOiupOWbvuagh+WIh+aNolxyXG4gIGNsaWNrQ2hhbmdlRGVmYXVsdEltYWdlKCkge1xyXG4gICAgdGhpcy5EaWFsb2cuY2xpY2tDaGFuZ2VEZWZhdWx0SW1hZ2UgJiYgdGhpcy5EaWFsb2cuY2xpY2tDaGFuZ2VEZWZhdWx0SW1hZ2UoKVxyXG4gIH1cclxuXHJcbiAgX2FkZExpbmsoKSB7XHJcbiAgICAvLyBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lXHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xpbmtfYWRkJylbMF1cclxuICAgICAgICAudmFsdWVcclxuICAgICkge1xyXG4gICAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudC5wdXNoKHtcclxuICAgICAgICBuYW1lOiAn6ZO+5o6lJyxcclxuICAgICAgICB1cmw6IHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXHJcbiAgICAgICAgICAnbGlua19hZGQnXHJcbiAgICAgICAgKVswXS52YWx1ZVxyXG4gICAgICB9KVxyXG4gICAgICB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFxyXG4gICAgICAgICdsaW5rX2FkZCdcclxuICAgICAgKVswXS52YWx1ZSA9ICcnXHJcbiAgICAgIHRoaXMuYXR0cmlidXRlTGluayA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLkRpYWxvZy5jbGlja0FkZExpbmsgJiYgdGhpcy5EaWFsb2cuY2xpY2tBZGRMaW5rKClcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFkZEF0dHJpYnV0ZUxpbmsobGluaykge1xyXG4gICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnQucHVzaCh7XHJcbiAgICAgIG5hbWU6ICfpk77mjqUnLFxyXG4gICAgICB1cmw6IGxpbmtcclxuICAgIH0pXHJcbiAgICB0aGlzLmF0dHJpYnV0ZUxpbmsgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudFxyXG4gIH1cclxuXHJcbiAgX2FkZFJyKCkge1xyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd2cl9hZGQnKVswXVxyXG4gICAgICAgIC52YWx1ZVxyXG4gICAgKSB7XHJcbiAgICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudC5wdXNoKHtcclxuICAgICAgICBuYW1lOiAn5YWo5pmv5Zu+JyxcclxuICAgICAgICB1cmw6IHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXHJcbiAgICAgICAgICAndnJfYWRkJ1xyXG4gICAgICAgIClbMF0udmFsdWVcclxuICAgICAgfSlcclxuICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcclxuICAgICAgICAndnJfYWRkJ1xyXG4gICAgICApWzBdLnZhbHVlID0gJydcclxuICAgICAgdGhpcy5hdHRyaWJ1dGVWciA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudFxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5EaWFsb2cuY2xpY2tBZGRWciAmJiB0aGlzLkRpYWxvZy5jbGlja0FkZFZyKClcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFkZEF0dHJpYnV0ZVJyKHZyKSB7XHJcbiAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnQucHVzaCh7XHJcbiAgICAgIG5hbWU6ICflhajmma/lm74nLFxyXG4gICAgICB1cmw6IHZyXHJcbiAgICB9KVxyXG4gICAgdGhpcy5hdHRyaWJ1dGVWciA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudFxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICog5omT5byA5a+M5paH5pys5qGGXHJcbiAgICovXHJcbiAgb3BlblJpY2hUZXh0RWRpdG9yKGUpIHtcclxuICAgIC8vIHZhciB1ZSA9IFVFLmdldEVkaXRvcignYXBwJyk7XHJcbiAgICByaWNoVGV4dC5vcGVuKFxyXG4gICAgICB0aGlzLm9wdGlvbnMuaWQsXHJcbiAgICAgIHRoaXMub3B0aW9ucy5uYW1lLFxyXG4gICAgICB0aGlzLm9wdGlvbnMucmljaFRleHRDb250ZW50XHJcbiAgICApXHJcbiAgICByaWNoVGV4dC5wcmltYXJ5Q2FsbEJhY2sgPSBjb250ZW50ID0+IHtcclxuICAgICAgdGhpcy5vcHRpb25zLnJpY2hUZXh0Q29udGVudCA9IGNvbnRlbnRcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIHVwZGF0ZUhlaWdodCgpIHtcclxuICAgIGlmICghdGhpcy5zZGsgfHwgIXRoaXMuc2RrLnZpZXdlciB8fCAhdGhpcy5zZGsudmlld2VyLnNjZW5lKSB7XHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG4gICAgbGV0IGhlaWdodFxyXG4gICAgbGV0IGhlaWdodDJcclxuICAgIGxldCBwb2ludDEgPSBuZXcgQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXMoXHJcbiAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbi5sbmcsXHJcbiAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbi5sYXQsXHJcbiAgICAgIDBcclxuICAgIClcclxuICAgIGxldCBwb2ludDIgPSBuZXcgQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXMoXHJcbiAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbi5sbmcsXHJcbiAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbi5sYXQsXHJcbiAgICAgIDEwMDAwMDAwMDAwMDAwXHJcbiAgICApXHJcblxyXG4gICAgbGV0IG9iamVjdHNUb0V4Y2x1ZGUgPSBbXVxyXG4gICAgZm9yIChsZXQgW2tleSwgdmFsdWVdIG9mIHRoaXMuc2RrLmVudGl0eU1hcCkge1xyXG4gICAgICBpZiAodmFsdWUudHlwZSA9PT0gJ1JhZGFyU2NhblN0ZXJlb3Njb3BpYycgJiYgdmFsdWUuZW50aXR5KSB7XHJcbiAgICAgICAgb2JqZWN0c1RvRXhjbHVkZS5wdXNoKHZhbHVlLmVudGl0eSlcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgbGV0IHVwZGF0ZWRDYXJ0ZXNpYW5zID0gYXdhaXQgdGhpcy5zZGsudmlld2VyLnNjZW5lLmNsYW1wVG9IZWlnaHRNb3N0RGV0YWlsZWQoW3BvaW50MV0sIG9iamVjdHNUb0V4Y2x1ZGUpXHJcbiAgICBpZiAodXBkYXRlZENhcnRlc2lhbnMgJiYgdXBkYXRlZENhcnRlc2lhbnNbMF0pIHtcclxuICAgICAgaGVpZ2h0ID0gdGhpcy5jYXJ0ZXNpYW4zVG93Z3M4NCh1cGRhdGVkQ2FydGVzaWFuc1swXSwgdGhpcy5zZGsudmlld2VyKS5hbHRcclxuICAgIH1cclxuXHJcbiAgICBsZXQgZGlyZWN0aW9uID0gQ2VzaXVtLkNhcnRlc2lhbjMuc3VidHJhY3QoXHJcbiAgICAgIHBvaW50MSxcclxuICAgICAgcG9pbnQyLFxyXG4gICAgICBuZXcgQ2VzaXVtLkNhcnRlc2lhbjMoKVxyXG4gICAgKVxyXG4gICAgbGV0IGMgPSBDZXNpdW0uQ2FydGVzaWFuMy5ub3JtYWxpemUoZGlyZWN0aW9uLCBuZXcgQ2VzaXVtLkNhcnRlc2lhbjMoKSlcclxuICAgIGxldCByYXkgPSBuZXcgQ2VzaXVtLlJheShwb2ludDIsIGMpXHJcbiAgICBsZXQgciA9IHt9XHJcbiAgICBsZXQgcGlja2VkT2JqZWN0cyA9IHRoaXMuc2RrLnZpZXdlci5zY2VuZS5kcmlsbFBpY2tGcm9tUmF5KHJheSlcclxuICAgIGZvciAobGV0IGkgPSBwaWNrZWRPYmplY3RzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XHJcbiAgICAgIGlmIChwaWNrZWRPYmplY3RzW2ldLnBvc2l0aW9uKSB7XHJcbiAgICAgICAgciA9IHBpY2tlZE9iamVjdHNbaV1cclxuICAgICAgICBicmVha1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAociAmJiByLnBvc2l0aW9uKSB7XHJcbiAgICAgIGhlaWdodDIgPSB0aGlzLmNhcnRlc2lhbjNUb3dnczg0KHIucG9zaXRpb24sIHRoaXMuc2RrLnZpZXdlcikuYWx0XHJcbiAgICB9XHJcbiAgICBsZXQgcHJvbWlzZVxyXG4gICAgdHJ5IHtcclxuICAgICAgcHJvbWlzZSA9IGF3YWl0IENlc2l1bS5zYW1wbGVUZXJyYWluTW9zdERldGFpbGVkKFxyXG4gICAgICAgIHRoaXMuc2RrLnZpZXdlci50ZXJyYWluUHJvdmlkZXIsXHJcbiAgICAgICAgW1xyXG4gICAgICAgICAgQ2VzaXVtLkNhcnRvZ3JhcGhpYy5mcm9tRGVncmVlcyhcclxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uLmxuZyxcclxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uLmxhdFxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIF1cclxuICAgICAgKVxyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHsgfVxyXG5cclxuICAgIGlmICgoaGVpZ2h0MiA9PT0gdm9pZCAwIHx8IGhlaWdodDIgPCBwcm9taXNlWzBdLmhlaWdodCkgJiYgcHJvbWlzZSkge1xyXG4gICAgICBoZWlnaHQyID0gcHJvbWlzZVswXS5oZWlnaHRcclxuICAgIH1cclxuICAgIGlmIChoZWlnaHQgPT09IHZvaWQgMCB8fCBoZWlnaHQgPCBoZWlnaHQyKSB7XHJcbiAgICAgIGhlaWdodCA9IGhlaWdodDJcclxuICAgIH1cclxuICAgIGlmIChoZWlnaHQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb24uYWx0ID0gTnVtYmVyKE51bWJlcihoZWlnaHQpLnRvRml4ZWQoMikpXHJcbiAgICAgIHRoaXMucmVuZXdQb2ludCgpXHJcbiAgICAgIHRoaXMuY29vcmRpbmF0ZSA9IHRoaXMub3B0aW9ucy5jb29yZGluYXRlXHJcbiAgICAgIHJldHVybiB0cnVlXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyBmbHlUbyhvcHRpb25zID0ge30pIHtcclxuICAgIHNldEFjdGl2ZVZpZXdlcigwKVxyXG4gICAgY2xvc2VSb3RhdGVBcm91bmQodGhpcy5zZGspXHJcbiAgICBjbG9zZVZpZXdGb2xsb3codGhpcy5zZGspXHJcblxyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLm9wdGlvbnMuY3VzdG9tVmlldyAmJlxyXG4gICAgICB0aGlzLm9wdGlvbnMuY3VzdG9tVmlldy5yZWxhdGl2ZVBvc2l0aW9uICYmXHJcbiAgICAgIHRoaXMub3B0aW9ucy5jdXN0b21WaWV3Lm9yaWVudGF0aW9uXHJcbiAgICApIHtcclxuICAgICAgbGV0IG9yaWVudGF0aW9uID0ge1xyXG4gICAgICAgIGhlYWRpbmc6IENlc2l1bS5NYXRoLnRvUmFkaWFucyhcclxuICAgICAgICAgIHRoaXMub3B0aW9ucy5jdXN0b21WaWV3Lm9yaWVudGF0aW9uLmhlYWRpbmcgfHwgMC4wXHJcbiAgICAgICAgKSxcclxuICAgICAgICBwaXRjaDogQ2VzaXVtLk1hdGgudG9SYWRpYW5zKFxyXG4gICAgICAgICAgdGhpcy5vcHRpb25zLmN1c3RvbVZpZXcub3JpZW50YXRpb24ucGl0Y2ggfHwgLTYwLjBcclxuICAgICAgICApLFxyXG4gICAgICAgIHJvbGw6IENlc2l1bS5NYXRoLnRvUmFkaWFucyhcclxuICAgICAgICAgIHRoaXMub3B0aW9ucy5jdXN0b21WaWV3Lm9yaWVudGF0aW9uLnJvbGwgfHwgMC4wXHJcbiAgICAgICAgKVxyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgbG5nID0gdGhpcy5vcHRpb25zLmN1c3RvbVZpZXcucmVsYXRpdmVQb3NpdGlvbi5sbmdcclxuICAgICAgbGV0IGxhdCA9IHRoaXMub3B0aW9ucy5jdXN0b21WaWV3LnJlbGF0aXZlUG9zaXRpb24ubGF0XHJcbiAgICAgIGxldCBhbHQgPSB0aGlzLm9wdGlvbnMuY3VzdG9tVmlldy5yZWxhdGl2ZVBvc2l0aW9uLmFsdFxyXG4gICAgICBsZXQgZGVzdGluYXRpb24gPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlcyhsbmcsIGxhdCwgYWx0KVxyXG5cclxuICAgICAgbGV0IHBvc2l0aW9uID0geyBsbmc6IDAsIGxhdDogMCB9XHJcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMucG9zaXRpb24pIHtcclxuICAgICAgICBwb3NpdGlvbiA9IHsgLi4udGhpcy5vcHRpb25zLnBvc2l0aW9uIH1cclxuICAgICAgfSBlbHNlIGlmICh0aGlzLm9wdGlvbnMucG9zaXRpb24pIHtcclxuICAgICAgICBwb3NpdGlvbiA9IHsgLi4udGhpcy5vcHRpb25zLnBvc2l0aW9uIH1cclxuICAgICAgfSBlbHNlIGlmICh0aGlzLm9wdGlvbnMuY2VudGVyKSB7XHJcbiAgICAgICAgcG9zaXRpb24gPSB7IC4uLnRoaXMub3B0aW9ucy5jZW50ZXIgfVxyXG4gICAgICB9IGVsc2UgaWYgKHRoaXMub3B0aW9ucy5zdGFydCkge1xyXG4gICAgICAgIHBvc2l0aW9uID0geyAuLi50aGlzLm9wdGlvbnMuc3RhcnQgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ2xuZycpKSB7XHJcbiAgICAgICAgICBwb3NpdGlvbi5sbmcgPSB0aGlzLm9wdGlvbnMubG5nXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ2xhdCcpKSB7XHJcbiAgICAgICAgICBwb3NpdGlvbi5sYXQgPSB0aGlzLm9wdGlvbnMubGF0XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ2FsdCcpKSB7XHJcbiAgICAgICAgICBwb3NpdGlvbi5hbHQgPSB0aGlzLm9wdGlvbnMuYWx0XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIC8vIOWmguaenOayoeaciemrmOW6puWAvO+8jOWImeiOt+WPlue0p+i0tOmrmOW6puiuoeeul1xyXG4gICAgICBpZiAoIXBvc2l0aW9uLmhhc093blByb3BlcnR5KCdhbHQnKSkge1xyXG4gICAgICAgIGxldCBvYmplY3RzVG9FeGNsdWRlID0gW11cclxuICAgICAgICBmb3IgKGxldCBba2V5LCB2YWx1ZV0gb2YgdGhpcy5zZGsuZW50aXR5TWFwKSB7XHJcbiAgICAgICAgICBpZiAodmFsdWUudHlwZSA9PT0gJ1JhZGFyU2NhblN0ZXJlb3Njb3BpYycgJiYgdmFsdWUuZW50aXR5KSB7XHJcbiAgICAgICAgICAgIG9iamVjdHNUb0V4Y2x1ZGUucHVzaCh2YWx1ZS5lbnRpdHkpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHBvc2l0aW9uLmFsdCA9IGF3YWl0IHRoaXMuZ2V0Q2xhbXBUb0hlaWdodChwb3NpdGlvbiwgb2JqZWN0c1RvRXhjbHVkZSlcclxuICAgICAgfVxyXG4gICAgICBsbmcgPSB0aGlzLm9wdGlvbnMuY3VzdG9tVmlldy5yZWxhdGl2ZVBvc2l0aW9uLmxuZyArIHBvc2l0aW9uLmxuZ1xyXG4gICAgICBsYXQgPSB0aGlzLm9wdGlvbnMuY3VzdG9tVmlldy5yZWxhdGl2ZVBvc2l0aW9uLmxhdCArIHBvc2l0aW9uLmxhdFxyXG4gICAgICBhbHQgPSB0aGlzLm9wdGlvbnMuY3VzdG9tVmlldy5yZWxhdGl2ZVBvc2l0aW9uLmFsdCArIHBvc2l0aW9uLmFsdFxyXG4gICAgICBkZXN0aW5hdGlvbiA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzKGxuZywgbGF0LCBhbHQpXHJcbiAgICAgIHRoaXMuc2RrLnZpZXdlci5jYW1lcmEuZmx5VG8oe1xyXG4gICAgICAgIGRlc3RpbmF0aW9uOiBkZXN0aW5hdGlvbixcclxuICAgICAgICBvcmllbnRhdGlvbjogb3JpZW50YXRpb25cclxuICAgICAgfSlcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGxldCBvYmplY3RzVG9FeGNsdWRlID0gW11cclxuICAgICAgZm9yIChsZXQgW2tleSwgdmFsdWVdIG9mIHRoaXMuc2RrLmVudGl0eU1hcCkge1xyXG4gICAgICAgIGlmICh2YWx1ZS50eXBlID09PSAnUmFkYXJTY2FuU3RlcmVvc2NvcGljJyAmJiB2YWx1ZS5lbnRpdHkpIHtcclxuICAgICAgICAgIG9iamVjdHNUb0V4Y2x1ZGUucHVzaCh2YWx1ZS5lbnRpdHkpXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGxldCBoZWlnaHQgPSBhd2FpdCB0aGlzLmdldENsYW1wVG9IZWlnaHQodGhpcy5vcHRpb25zLnBvc2l0aW9uLCBvYmplY3RzVG9FeGNsdWRlKVxyXG4gICAgICB0aGlzLnNkay52aWV3ZXIuY2FtZXJhLmZseVRvKHtcclxuICAgICAgICBvcmllbnRhdGlvbjogb3B0aW9ucy5vcmllbnRhdGlvbixcclxuICAgICAgICBkZXN0aW5hdGlvbjogQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXMoXHJcbiAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb24ubG5nLFxyXG4gICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uLmxhdCxcclxuICAgICAgICAgIGhlaWdodCArIChvcHRpb25zLmhlaWdodCB8fCA1MDApXHJcbiAgICAgICAgKVxyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2V0UG9zaXRpb24odikge1xyXG4gICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uLmxuZyA9IHYucG9zaXRpb24ubG5nXHJcbiAgICB0aGlzLm9wdGlvbnMucG9zaXRpb24ubGF0ID0gdi5wb3NpdGlvbi5sYXRcclxuICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbi5hbHQgPSB2LnBvc2l0aW9uLmFsdFxyXG4gICAgdGhpcy5yZW5ld1BvaW50KClcclxuICB9XHJcblxyXG4gIC8qKkBkZXNjIOaJk+W8gOW5s+enu+WKn+iDvVxyXG4gICAqXHJcbiAgICogQG1lbWJlck9mIFNvdXJjZVxyXG4gICAqIEBwYXJhbSBzdGF0dXMge2Jvb2xlYW59XHJcbiAgICpcclxuICAgKiAqL1xyXG4gIHNldCBwb3NpdGlvbkVkaXRpbmcoc3RhdHVzKSB7XHJcbiAgICBpZiAoIXRoaXMuc2RrIHx8ICF0aGlzLnNkay52aWV3ZXIgfHwgIXRoaXMuZW50aXR5KSB7XHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG4gICAgdGhpcy5vcGVyYXRlLnBvc2l0aW9uRWRpdGluZyA9IHN0YXR1c1xyXG4gICAgdGhpcy5ldmVudCAmJiB0aGlzLmV2ZW50LmRlc3Ryb3koKVxyXG4gICAgdGhpcy5ldmVudCA9IG5ldyBNb3VzZUV2ZW50KHRoaXMuc2RrKVxyXG4gICAgaWYgKHN0YXR1cyA9PT0gdHJ1ZSkge1xyXG4gICAgICB0aGlzLnBpY2tpbmcgPSBmYWxzZVxyXG4gICAgICB0aGlzLnRpcCAmJiB0aGlzLnRpcC5kZXN0cm95KClcclxuICAgICAgdGhpcy50aXAgPSBuZXcgTW91c2VUaXAoJ+eCueWHu+m8oOagh+W3pumUruehruiupO+8jOWPs+mUruWPlua2iCcsIHRoaXMuc2RrKVxyXG4gICAgICB0aGlzLnByZXZpb3VzID0ge1xyXG4gICAgICAgIHBvc2l0aW9uOiB7IC4uLnRoaXMub3B0aW9ucy5wb3NpdGlvbiB9XHJcbiAgICAgIH1cclxuICAgICAgbGV0IG1vdmVFdmVudCA9IChtb3ZlbWVudCwgY2FydGVzaWFuKSA9PiB7XHJcbiAgICAgICAgdGhpcy5lbnRpdHkucG9zaXRpb24gPSBuZXcgQ2VzaXVtLkNhbGxiYWNrUHJvcGVydHkoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgcmV0dXJuIGNhcnRlc2lhblxyXG4gICAgICAgIH0sIGZhbHNlKVxyXG5cclxuICAgICAgICB0aGlzLnRpcC5zZXRQb3NpdGlvbihcclxuICAgICAgICAgIGNhcnRlc2lhbixcclxuICAgICAgICAgIG1vdmVtZW50LmVuZFBvc2l0aW9uLngsXHJcbiAgICAgICAgICBtb3ZlbWVudC5lbmRQb3NpdGlvbi55XHJcbiAgICAgICAgKVxyXG4gICAgICB9XHJcbiAgICAgIGxldCBsZWZ0RXZlbnQgPSAobW92ZW1lbnQsIGNhcnRlc2lhbikgPT4ge1xyXG4gICAgICAgIGxldCBwb3NpdGlvbnMgPSB0aGlzLmNhcnRlc2lhbjNUb3dnczg0KGNhcnRlc2lhbiwgdGhpcy5zZGsudmlld2VyKVxyXG4gICAgICAgIHRoaXMubG5nID0gcG9zaXRpb25zLmxuZ1xyXG4gICAgICAgIHRoaXMubGF0ID0gcG9zaXRpb25zLmxhdFxyXG4gICAgICAgIHRoaXMuYWx0ID0gcG9zaXRpb25zLmFsdFxyXG4gICAgICAgIHRoaXMucHJldmlvdXMgPSB7XHJcbiAgICAgICAgICBwb3NpdGlvbjogeyAuLi50aGlzLm9wdGlvbnMucG9zaXRpb24gfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmV2ZW50Lm1vdXNlX21vdmUoKCkgPT4geyB9KVxyXG4gICAgICAgIHRoaXMuZXZlbnQubW91c2VfbGVmdCgoKSA9PiB7IH0pXHJcbiAgICAgICAgdGhpcy5ldmVudC5tb3VzZV9yaWdodCgoKSA9PiB7IH0pXHJcbiAgICAgICAgdGhpcy5ldmVudC5nZXN0dXJlX3BpbmNrX3N0YXJ0KCgpID0+IHsgfSlcclxuICAgICAgICB0aGlzLmV2ZW50Lmdlc3R1cmVfcGluY2tfZW5kKCgpID0+IHsgfSlcclxuICAgICAgICB0aGlzLmVudGl0eS5wb3NpdGlvbiA9IG5ldyBDZXNpdW0uQ2FsbGJhY2tQcm9wZXJ0eShmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICByZXR1cm4gY2FydGVzaWFuXHJcbiAgICAgICAgfSwgZmFsc2UpXHJcbiAgICAgICAgaWYodGhpcy4jX3Bvc2l0aW9uRWRpdGluZ0NhbGxiYWNrKSB7XHJcbiAgICAgICAgICB0aGlzLiNfcG9zaXRpb25FZGl0aW5nQ2FsbGJhY2soKVxyXG4gICAgICAgICAgdGhpcy4jX3Bvc2l0aW9uRWRpdGluZ0NhbGxiYWNrID0gbnVsbFxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnBvc2l0aW9uRWRpdGluZyA9IGZhbHNlXHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5ldmVudC5tb3VzZV9tb3ZlKG1vdmVFdmVudClcclxuICAgICAgdGhpcy5ldmVudC5tb3VzZV9sZWZ0KGxlZnRFdmVudClcclxuICAgICAgdGhpcy5ldmVudC5tb3VzZV9yaWdodCgobW92ZW1lbnQsIGNhcnRlc2lhbikgPT4ge1xyXG4gICAgICAgIHRoaXMucG9zaXRpb25FZGl0aW5nID0gZmFsc2VcclxuICAgICAgfSlcclxuXHJcbiAgICAgIHRoaXMuZXZlbnQuZ2VzdHVyZV9waW5ja19zdGFydCgobW92ZW1lbnQsIGNhcnRlc2lhbikgPT4ge1xyXG4gICAgICAgIGxldCBzdGFydFRpbWUgPSBuZXcgRGF0ZSgpXHJcbiAgICAgICAgdGhpcy5ldmVudC5nZXN0dXJlX3BpbmNrX2VuZCgoKSA9PiB7XHJcbiAgICAgICAgICBsZXQgZW5kVGltZSA9IG5ldyBEYXRlKClcclxuICAgICAgICAgIGxldCBwb3MgPSB7XHJcbiAgICAgICAgICAgIHBvc2l0aW9uOiB7XHJcbiAgICAgICAgICAgICAgeDogKG1vdmVtZW50LnBvc2l0aW9uMS54ICsgbW92ZW1lbnQucG9zaXRpb24yLngpIC8gMixcclxuICAgICAgICAgICAgICB5OiAobW92ZW1lbnQucG9zaXRpb24xLnkgKyBtb3ZlbWVudC5wb3NpdGlvbjIueSkgLyAyXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChlbmRUaW1lIC0gc3RhcnRUaW1lID49IDUwMCkge1xyXG4gICAgICAgICAgICAvLyDplb/mjInlj5bmtohcclxuICAgICAgICAgICAgdGhpcy5wb3NpdGlvbkVkaXRpbmcgPSBmYWxzZVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbGVmdEV2ZW50KHBvcywgY2FydGVzaWFuKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgIH0pXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLiNfcG9zaXRpb25FZGl0aW5nQ2FsbGJhY2sgPSBudWxsXHJcbiAgICAgIHRoaXMucGlja2luZyA9IHRydWVcclxuICAgICAgaWYgKHRoaXMuZXZlbnQpIHtcclxuICAgICAgICB0aGlzLmV2ZW50Lm1vdXNlX21vdmUoKCkgPT4geyB9KVxyXG4gICAgICAgIHRoaXMuZXZlbnQubW91c2VfbGVmdCgoKSA9PiB7IH0pXHJcbiAgICAgICAgdGhpcy5ldmVudC5tb3VzZV9yaWdodCgoKSA9PiB7IH0pXHJcbiAgICAgICAgdGhpcy5ldmVudC5nZXN0dXJlX3BpbmNrX3N0YXJ0KCgpID0+IHsgfSlcclxuICAgICAgICB0aGlzLmV2ZW50Lmdlc3R1cmVfcGluY2tfZW5kKCgpID0+IHsgfSlcclxuICAgICAgICB0aGlzLmV2ZW50LmRlc3Ryb3koKVxyXG4gICAgICAgIHRoaXMuZXZlbnQgPSBudWxsXHJcbiAgICAgIH1cclxuICAgICAgdGhpcy50aXAgJiYgdGhpcy50aXAuZGVzdHJveSgpXHJcbiAgICAgIHRoaXMubG5nID0gdGhpcy5wcmV2aW91cy5wb3NpdGlvbi5sbmdcclxuICAgICAgdGhpcy5sYXQgPSB0aGlzLnByZXZpb3VzLnBvc2l0aW9uLmxhdFxyXG4gICAgICB0aGlzLmFsdCA9IHRoaXMucHJldmlvdXMucG9zaXRpb24uYWx0XHJcbiAgICAgIHRoaXMucmVuZXdQb2ludCgpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgcG9zaXRpb25FZGl0aW5nKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3BlcmF0ZS5wb3NpdGlvbkVkaXRpbmdcclxuICB9XHJcblxyXG4gIG9wZW5Qb3NpdGlvbkVkaXRpbmcoY2QpIHtcclxuICAgIHRoaXMucG9zaXRpb25FZGl0aW5nID0gdHJ1ZVxyXG4gICAgdGhpcy4jX3Bvc2l0aW9uRWRpdGluZ0NhbGxiYWNrID0gY2RcclxuICB9XHJcblxyXG4gIHNldERJVihvcHRpb25zID0geyBkb21pZDogJycsIHg6IDEwLCB5OiAxMCB9KSB7XHJcbiAgICBvcHRpb25zLnggPSBvcHRpb25zLnggfHwgb3B0aW9ucy54ID09PSAwID8gb3B0aW9ucy54IDogMTBcclxuICAgIG9wdGlvbnMueSA9IG9wdGlvbnMueSB8fCBvcHRpb25zLnkgPT09IDAgPyBvcHRpb25zLnkgOiAxMFxyXG4gICAgbGV0IHNpdGVJbmZvRG9tID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQob3B0aW9ucy5kb21pZClcclxuICAgIGxldCBzaXRlSW5mb1Bvc2l0aW9uID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXMoXHJcbiAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbi5sbmcsXHJcbiAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbi5sYXRcclxuICAgIClcclxuXHJcbiAgICB0aGlzLnNkay52aWV3ZXIuc2NlbmUucG9zdFJlbmRlci5hZGRFdmVudExpc3RlbmVyKHBlcmNlbnRhZ2UgPT4ge1xyXG4gICAgICAvL+i9rOaNouWIsOWxj+W5leWdkOagh1xyXG4gICAgICBpZiAoXHJcbiAgICAgICAgc2l0ZUluZm9Eb20uc3R5bGUuZGlzcGxheSA9PT0gJ2Jsb2NrJyB8fFxyXG4gICAgICAgIHNpdGVJbmZvRG9tLnN0eWxlLmRpc3BsYXkgPT09ICcnXHJcbiAgICAgICkge1xyXG4gICAgICAgIGxldCB3aW5wb3MgPSB0aGlzLnNkay52aWV3ZXIuc2NlbmUuY2FydGVzaWFuVG9DYW52YXNDb29yZGluYXRlcyhcclxuICAgICAgICAgIHNpdGVJbmZvUG9zaXRpb25cclxuICAgICAgICApXHJcbiAgICAgICAgaWYgKHdpbnBvcykge1xyXG4gICAgICAgICAgc2l0ZUluZm9Eb20uc3R5bGUubGVmdCA9ICh3aW5wb3MueCArIG9wdGlvbnMueCkudG9GaXhlZCgwKSArICdweCdcclxuICAgICAgICAgIHNpdGVJbmZvRG9tLnN0eWxlLnRvcCA9ICh3aW5wb3MueSArIG9wdGlvbnMueSkudG9GaXhlZCgwKSArICdweCdcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBhc3luYyBzZXRDdXN0b21WaWV3KHZhbCkge1xyXG4gICAgaWYgKHZhbCkge1xyXG4gICAgICB0aGlzLm9wdGlvbnMuY3VzdG9tVmlldyA9IHZhbFxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbGV0IGNhbWVyYSA9IHRoaXMuc2RrLnZpZXdlci5jYW1lcmFcclxuICAgICAgbGV0IGNhbWVyYVBvc2l0aW9uODQgPSB0aGlzLmNhcnRlc2lhbjNUb3dnczg0KFxyXG4gICAgICAgIGNhbWVyYS5wb3NpdGlvbixcclxuICAgICAgICB0aGlzLnNkay52aWV3ZXJcclxuICAgICAgKVxyXG5cclxuICAgICAgbGV0IHBvc2l0aW9uID0geyBsbmc6IDAsIGxhdDogMCB9XHJcbiAgICAgIGxldCByZWxhdGl2ZVBvc2l0aW9uID0geyAuLi5jYW1lcmFQb3NpdGlvbjg0IH1cclxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5wb3NpdGlvbikge1xyXG4gICAgICAgIHBvc2l0aW9uID0geyAuLi50aGlzLm9wdGlvbnMucG9zaXRpb24gfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ2xuZycpKSB7XHJcbiAgICAgICAgICBwb3NpdGlvbi5sbmcgPSB0aGlzLm9wdGlvbnMubG5nXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ2xhdCcpKSB7XHJcbiAgICAgICAgICBwb3NpdGlvbi5sYXQgPSB0aGlzLm9wdGlvbnMubGF0XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ2FsdCcpKSB7XHJcbiAgICAgICAgICBwb3NpdGlvbi5hbHQgPSB0aGlzLm9wdGlvbnMuYWx0XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIC8vIOWmguaenOayoeaciemrmOW6puWAvO+8jOWImeiOt+WPlue0p+i0tOmrmOW6puiuoeeul1xyXG4gICAgICBpZiAoIXBvc2l0aW9uLmhhc093blByb3BlcnR5KCdhbHQnKSkge1xyXG4gICAgICAgIGxldCBvYmplY3RzVG9FeGNsdWRlID0gW11cclxuICAgICAgICBmb3IgKGxldCBba2V5LCB2YWx1ZV0gb2YgdGhpcy5zZGsuZW50aXR5TWFwKSB7XHJcbiAgICAgICAgICBpZiAodmFsdWUudHlwZSA9PT0gJ1JhZGFyU2NhblN0ZXJlb3Njb3BpYycgJiYgdmFsdWUuZW50aXR5KSB7XHJcbiAgICAgICAgICAgIG9iamVjdHNUb0V4Y2x1ZGUucHVzaCh2YWx1ZS5lbnRpdHkpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHBvc2l0aW9uLmFsdCA9IGF3YWl0IHRoaXMuZ2V0Q2xhbXBUb0hlaWdodChwb3NpdGlvbiwgb2JqZWN0c1RvRXhjbHVkZSlcclxuICAgICAgfVxyXG4gICAgICByZWxhdGl2ZVBvc2l0aW9uID0ge1xyXG4gICAgICAgIGxuZzogY2FtZXJhUG9zaXRpb244NC5sbmcgLSBwb3NpdGlvbi5sbmcsXHJcbiAgICAgICAgbGF0OiBjYW1lcmFQb3NpdGlvbjg0LmxhdCAtIHBvc2l0aW9uLmxhdCxcclxuICAgICAgICBhbHQ6IGNhbWVyYVBvc2l0aW9uODQuYWx0IC0gcG9zaXRpb24uYWx0XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMub3B0aW9ucy5jdXN0b21WaWV3ID0ge1xyXG4gICAgICAgIG9yaWVudGF0aW9uOiB7XHJcbiAgICAgICAgICBoZWFkaW5nOiBDZXNpdW0uTWF0aC50b0RlZ3JlZXMoY2FtZXJhLmhlYWRpbmcpLFxyXG4gICAgICAgICAgcGl0Y2g6IENlc2l1bS5NYXRoLnRvRGVncmVlcyhjYW1lcmEucGl0Y2gpLFxyXG4gICAgICAgICAgcm9sbDogQ2VzaXVtLk1hdGgudG9EZWdyZWVzKGNhbWVyYS5yb2xsKVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgcmVsYXRpdmVQb3NpdGlvbjogcmVsYXRpdmVQb3NpdGlvblxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMub3JpZ2luYWxPcHRpb25zICYmXHJcbiAgICAgICAgKHRoaXMub3JpZ2luYWxPcHRpb25zLmN1c3RvbVZpZXcgPSB0aGlzLm9wdGlvbnMuY3VzdG9tVmlldylcclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IEJpbGxib2FyZE9iamVjdFxyXG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTUE7QUFNQTtBQUFBO0FBQUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFqRUE7QUFrRUE7QUFDQTtBQUNBO0FBSUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUlBO0FBR0E7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFHQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUF5TUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBSUE7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUtBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFJQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFRQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFjQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUdBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBV0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBR0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBakJBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUF6QkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQWtEQTtBQXpEQTtBQUFBO0FBQUE7QUFBQTtBQTBEQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBVkE7QUFBQTtBQVFBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFsQkE7QUFBQTtBQUFBO0FBbUJBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFRQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFjQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUdBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBV0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBR0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBakJBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUF6QkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQWtEQTtBQXpEQTtBQUFBO0FBQUE7QUFBQTtBQTBEQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBVkE7QUFBQTtBQVFBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFsQkE7QUFBQTtBQUFBO0FBbUJBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBSUE7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFNQTtBQUdBO0FBR0E7QUFHQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBQUE7QUFBQTtBQUFBO0FBSUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFnQkE7QUFnREE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBSEE7QUFBQTtBQUFBO0FBQUE7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQUE7QUFKQTtBQUFBO0FBQUE7QUFBQTtBQVFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUVBO0FBNEJBO0FBQUE7QUF6QkE7QUFBQTtBQUFBO0FBSUE7QUFDQTtBQVNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBTUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUlBO0FBS0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUZBO0FBQUE7QUFBQTtBQUFBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBU0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBU0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUdBO0FBQ0E7QUFLQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBRkE7QUFBQTtBQUFBO0FBQUE7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUdBO0FBR0E7QUFJQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBc0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQVdBO0FBMWlCQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQTZpQkE7QUFFQTtBQUVBO0FBQ0E7QUFLQTtBQUNBO0FBTUE7QUFNQTtBQU1BO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBdkJBO0FBQUE7QUFBQTtBQUFBO0FBeUJBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUlBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFLQTtBQUtBO0FBTUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBRkE7QUFBQTtBQUFBO0FBQUE7QUFNQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFXQTtBQVJBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBV0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBdkVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUF5RUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUtBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFHQTtBQUdBO0FBR0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQWxGQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQXFGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFMQTtBQUFBO0FBQUE7QUFrR0E7QUFDQTtBQUFBO0FBN0ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQU9BO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBSUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUtBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQXBEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQTV3RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFNQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQThuRUEiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/Obj/Base/BillboardObject/index.js\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ \"./node_modules/@babel/runtime/helpers/asyncToGenerator.js\");\n/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _babel_runtime_helpers_readOnlyError__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/readOnlyError */ \"./node_modules/@babel/runtime/helpers/readOnlyError.js\");\n/* harmony import */ var _babel_runtime_helpers_readOnlyError__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_readOnlyError__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/slicedToArray */ \"./node_modules/@babel/runtime/helpers/slicedToArray.js\");\n/* harmony import */ var _babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ \"./node_modules/@babel/runtime/helpers/defineProperty.js\");\n/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ \"./node_modules/@babel/runtime/helpers/classCallCheck.js\");\n/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ \"./node_modules/@babel/runtime/helpers/createClass.js\");\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ \"./node_modules/@babel/runtime/helpers/possibleConstructorReturn.js\");\n/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ \"./node_modules/@babel/runtime/helpers/getPrototypeOf.js\");\n/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ \"./node_modules/@babel/runtime/helpers/inherits.js\");\n/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_8__);\n/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @babel/runtime/regenerator */ \"./node_modules/@babel/runtime/regenerator/index.js\");\n/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_9__);\n/* harmony import */ var _on__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../../on */ \"./src/on/index.js\");\n/* harmony import */ var _Element_Dialog__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../Element/Dialog */ \"./src/Obj/Element/Dialog/index.js\");\n/* harmony import */ var _Element_Dialog_eventBinding__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../../Element/Dialog/eventBinding */ \"./src/Obj/Element/Dialog/eventBinding.js\");\n/* harmony import */ var _Element_cy_html_slider__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../../Element/cy_html_slider */ \"./src/Obj/Element/cy_html_slider.js\");\n/* harmony import */ var _Element_cy_html_tabs__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../../Element/cy_html_tabs */ \"./src/Obj/Element/cy_html_tabs.js\");\n/* harmony import */ var _Element_richText__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../../Element/richText */ \"./src/Obj/Element/richText.js\");\n/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./_element */ \"./src/Obj/Base/BillboardObject/_element.js\");\n/* harmony import */ var _index__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../index */ \"./src/Obj/Base/index.js\");\n/* harmony import */ var _Event_index__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../../../Event/index */ \"./src/Event/index.js\");\n/* harmony import */ var _Global_cluster_cluster__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../../../Global/cluster/cluster */ \"./src/Global/cluster/cluster.js\");\n/* harmony import */ var _CircleDiffuse__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../CircleDiffuse */ \"./src/Obj/Base/CircleDiffuse/index.js\");\n/* harmony import */ var _RadarScan__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../RadarScan */ \"./src/Obj/Base/RadarScan/index.js\");\n/* harmony import */ var _Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ../../../Global/MultiViewportMode */ \"./src/Global/MultiViewportMode/index.js\");\n/* harmony import */ var _Global_global__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ../../../Global/global */ \"./src/Global/global.js\");\n/* harmony import */ var _Tools_proj__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ../../../Tools/proj */ \"./src/Tools/proj.js\");\n/* harmony import */ var _Element_datalist__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ../../Element/datalist */ \"./src/Obj/Element/datalist.js\");\n/* harmony import */ var _Element_fontSelect__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ../../Element/fontSelect */ \"./src/Obj/Element/fontSelect.js\");\n/* harmony import */ var _MouseTip__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ../../../MouseTip */ \"./src/MouseTip/index.js\");\n/* harmony import */ var _Global_SplitScreen__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ../../../Global/SplitScreen */ \"./src/Global/SplitScreen/index.js\");\n/* harmony import */ var _Tools_getGoodsList__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ../../../Tools/getGoodsList */ \"./src/Tools/getGoodsList.js\");\n\n\n\n\n\n\n\n\n\n\nfunction _createForOfIteratorHelper(r, e) { var t = \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && \"number\" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t.return || t.return(); } finally { if (u) throw o; } } }; }\nfunction _unsupportedIterableToArray(r, a) { if (r) { if (\"string\" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }\nfunction _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_3___default()(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nfunction _callSuper(t, o, e) { return o = _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_7___default()(o), _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_6___default()(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_7___default()(t).constructor) : o.apply(t, e)); }\nfunction _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }\nfunction _classPrivateFieldInitSpec(e, t, a) { _checkPrivateRedeclaration(e, t), t.set(e, a); }\nfunction _checkPrivateRedeclaration(e, t) { if (t.has(e)) throw new TypeError(\"Cannot initialize the same private elements twice on an object\"); }\nfunction _classPrivateFieldSet(s, a, r) { return s.set(_assertClassBrand(s, a), r), r; }\nfunction _classPrivateFieldGet(s, a) { return s.get(_assertClassBrand(s, a)); }\nfunction _assertClassBrand(e, t, n) { if (\"function\" == typeof e ? e === t : e.has(t)) return arguments.length < 3 ? t : n; throw new TypeError(\"Private element is not present on this object\"); }\n/**\r\n * 点\r\n */\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nvar _positionEditingCallback = /*#__PURE__*/new WeakMap();\nvar BillboardObject = /*#__PURE__*/function (_Base) {\n /**\r\n * @constructor\r\n * @description 点标注\r\n * @param options {object} 属性\r\n * @param options.id {string} 标注id\r\n * @param options.show=true {boolean} 标注整体的显隐\r\n * @param options.name {string} 名称\r\n * @param {object} options.position={} 必填,位置\r\n * @param {number} options.position.lng 经度\r\n * @param {number} options.position.lat 纬度\r\n * @param {number} options.position.alt 高度\r\n * @param {number} options.heightMode=3 高度模式(0:海拔高度;1:相对地表;2:依附地表; 3:依附模型)\r\n * @param [options.scaleByDistance=true] {boolean} 是否开启跟随视野缩放\r\n * @param [options.near=2000] {number} 视野缩放最近距离\r\n * @param [options.far=100000] {number} 视野缩放最远距离\r\n * @param options.billboard {object} 图标参数\r\n * @param [options.billboard.show=true] {boolean} 图标显隐\r\n * @param options.billboard.image {string} 图标路径\r\n * @param options.billboard.defaultImage {string} 默认图标的唯一标识\r\n * @param [options.billboard.scale=3] {number} 图标放大倍数\r\n * @param options.label {object} 文字参数\r\n * @param [options.label.text] {string} 文字内容\r\n * @param [options.label.show=true] {boolean} 文字显隐\r\n * @param [options.label.fontFamily=0] {number} 文字字体项 0:黑体;1:思源黑体;2:庞门正道标题体;3:数黑体\r\n * @param [options.label.fontSize=39] {number} 文字大小, 单位px\r\n * @param [options.label.color=#00ffff] {string} 文字颜色\r\n * @param options.attribute {object} 属性内容\r\n * @param {object} options.attribute.link={} 链接\r\n * @param options.attribute.link.content=[]] {array} 链接内容\r\n * @param options.attribute.link.content[].name {string} 链接名称\r\n * @param options.attribute.link.content[].url {string} 链接地址\r\n * @param {object} options.attribute.vr={} 全景图\r\n * @param options.attribute.vr.content=[]] {array} 全景图内容\r\n * @param options.attribute.vr.content[].name {string} 名称\r\n * @param options.attribute.vr.content[].url {string} 地址\r\n * @param {object} ptions.attribute.camera={} 摄像头\r\n * @param options.attribute.camera.content=[]] {array} 摄像头内容\r\n * @param {object} options.attribute.isc={} isc\r\n * @param options.attribute.isc.content=[]] {array} ISC内容\r\n * @param {object} options.attribute.goods={} 物资\r\n * @param options.attribute.goods.content=[]] {array} 物资内容\r\n * @param options.attribute.goods.content[].ID {string} ID\r\n * @param options.attribute.goods.content[].name {string} 名称\r\n * @param options.attribute.goods.content[].cnt {string} 数量\r\n * @param options.richTextContent {string} 富文本内容\r\n * @param options.customView {object} 默认视角\r\n * @param options.customView.orientation {object} 默认视角方位\r\n * @param options.customView.orientation.heading {number} 航向角\r\n * @param options.customView.orientation.pitch {number} 俯仰角\r\n * @param options.customView.orientation.roll {number} 翻滚角\r\n * @param options.customView.relativePosition {object} 视角相对位置\r\n * @param options.customView.relativePosition.lng {number} 经度\r\n * @param options.customView.relativePosition.lat {number} 纬度\r\n * @param options.customView.relativePosition.alt {number} 高度\r\n * \r\n \r\n \r\n *@param _Dialog {object} 弹框事件\r\n *@param _Dialog.confirmCallBack {function} 弹框确认时的回调\r\n * */\n function BillboardObject(sdk) {\n var _this2;\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var _Dialog = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_4___default()(this, BillboardObject);\n _this2 = _callSuper(this, BillboardObject, [sdk, options]);\n _classPrivateFieldInitSpec(_this2, _positionEditingCallback, null);\n _this2.options.near = options.near || options.near === 0 ? options.near : 2000;\n _this2.options.far = options.far || options.far === 0 ? options.far : 100000;\n _this2.options.scaleByDistance = options.scaleByDistance || options.scaleByDistance === false ? options.scaleByDistance : true;\n _this2.options.show = options.show || options.show === false ? options.show : true;\n _this2.options.heightMode = options.heightMode || options.heightMode == 0 ? options.heightMode : 3;\n _this2.options.billboard = options.billboard = options.billboard || {};\n // this.options.billboard.isSelect = options.billboard.isSelect || false\n _this2.options.billboard.show = options.billboard.show || options.billboard.show === false ? options.billboard.show : true;\n _this2.options.billboard.image = options.billboard.image || Object(_Global_global__WEBPACK_IMPORTED_MODULE_23__[\"getBillboardDefaultUrl\"])(options.billboard.defaultImage) || _this2.getSourceRootPath() + '/img/A-ablu-blank.png';\n _this2.options.billboard.defaultImage = options.billboard.defaultImage;\n _this2.options.billboard.scale = options.billboard.scale || options.billboard.scale === 0 ? options.billboard.scale : 3;\n options.label = options.label || {};\n _this2.options.label = options.label || {};\n _this2.options.label.text = options.label.text || _this2.options.name;\n _this2.options.name = _this2.options.label.text;\n _this2.options.label.show = options.label.show || options.label.show === false ? options.label.show : true;\n _this2.options.label.fontFamily = options.label.fontFamily || 0;\n _this2.options.label.fontSize = options.label.fontSize || 39;\n _this2.options.label.color = options.label.color || '#00ffff';\n _this2.options.position = options.position = options.position || {};\n _this2.options.position.lng = Number(Number(options.position.lng || 0).toFixed(8));\n _this2.options.position.lat = Number(Number(options.position.lat || 0).toFixed(8));\n _this2.options.position.alt = Number(Number(options.position.alt || 0).toFixed(2));\n // this.options.diffuseShow = options.diffuseShow || false\n // this.options.diffuseRadius = (options.diffuseRadius || options.diffuseRadius === 0) ? options.diffuseRadius : 10\n // this.options.diffuseDuration = (options.diffuseDuration || options.diffuseDuration === 0) ? options.diffuseDuration : 2000\n // this.options.diffuseColor = options.diffuseColor || \"#FF0000\"\n // this.options.scanShow = options.scanShow || false\n // this.options.scanRadius = (options.scanRadius || options.scanRadius === 0) ? options.scanRadius : 10\n // this.options.scanDuration = (options.scanDuration || options.scanDuration === 0) ? options.scanDuration : 2000\n // this.options.scanColor = options.scanColor || \"#FF0000\"\n _this2.options.attribute = options.attribute || {};\n _this2.options.attribute.link = _this2.options.attribute.link || {};\n _this2.options.attribute.link.content = _this2.options.attribute.link.content || [];\n _this2.options.attribute.vr = _this2.options.attribute.vr || {};\n _this2.options.attribute.vr.content = _this2.options.attribute.vr.content || [];\n _this2.options.attribute.camera = _this2.options.attribute.camera || {};\n _this2.options.attribute.camera.content = _this2.options.attribute.camera.content || [];\n _this2.options.attribute.isc = _this2.options.attribute.isc || {};\n _this2.options.attribute.isc.content = _this2.options.attribute.isc.content || [];\n _this2.options.attribute.goods = _this2.options.attribute.goods || {};\n _this2.options.attribute.goods.content = _this2.options.attribute.goods.content || [];\n // this.options.coordinate = options.coordinate || ''\n _this2.operate = {};\n _this2._elms = {};\n _this2.previous = {\n position: _objectSpread({}, _this2.options.position)\n };\n // this.options.attributePos = options.attributePos || {\n // x: 60,\n // y: 60,\n // width: 200,\n // height: 120\n // }\n _this2.entity;\n _this2._proj = _this2.sdk.proj;\n\n // // 验证物资\n // let goodsContent = []\n // if(options.attribute && options.attribute.goods && options.attribute.goods.content && Array.isArray(options.attribute.goods.content)) {\n // goodsContent = [...options.attribute.goods.content]\n // }\n // this.options.attribute.goods.content = []\n // if (goodsContent.length > 0) {\n // getGoodsList().then((list)=>{\n // for (let i = goodsContent.length-1; i >= 0; i--) {\n // let falg = false\n // for (let j = 0; j < list.length; j++) {\n // if (goodsContent[i].ID === list[j].ID) {\n // falg = true\n // break\n // }\n // }\n // if(!falg) {\n // goodsContent.splice(i, 1)\n // }\n // }\n // this.options.attribute.goods.content = [...goodsContent]\n // })\n // }\n\n _this2.sdk.addIncetance(_this2.options.id, _this2);\n BillboardObject.create(_this2);\n _this2.picking = true;\n _this2.Dialog = _Dialog;\n _this2._EventBinding = new _Element_Dialog_eventBinding__WEBPACK_IMPORTED_MODULE_12__[\"default\"]();\n return _this2;\n }\n _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_8___default()(BillboardObject, _Base);\n return _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_5___default()(BillboardObject, [{\n key: \"type\",\n get: function get() {\n return 'BillboardObject';\n }\n }, {\n key: \"selectBillboard\",\n value:\n // 选中效果\n function selectBillboard() {\n var that = this;\n this.sdk.viewer.screenSpaceEventHandler.setInputAction(function (click) {\n var pickedObject = that.sdk.viewer.scene.pick(click.position);\n if (Cesium.defined(pickedObject) && pickedObject.id && pickedObject.id.id === 'airportBillboard') {\n if (that.entity.billboard) {\n // 如果点击的是Billboard,给它添加选中效果\n that.entity.billboard.color = Cesium.Color.YELLOW; // 改变颜色\n }\n // 可以添加更多选中效果,例如边框等\n } else {\n if (that.entity.billboard) {\n that.entity.billboard.color = Cesium.Color.WHITE;\n }\n }\n }, Cesium.ScreenSpaceEventType.LEFT_CLICK);\n }\n }, {\n key: \"attributeSelect\",\n get: function get() {\n return [{\n name: '富文本',\n value: '富文本',\n key: 'richText'\n }, {\n name: '链接',\n value: '链接',\n key: 'link'\n }, {\n name: 'IP摄像头',\n value: 'IP摄像头',\n key: 'camera'\n },\n // {\n // name: 'ISC摄像头',\n // value: 'ISC摄像头',\n // key: 'isc'\n // },\n // {\n // name: '传感器',\n // value: '传感器',\n // key: 'sensor'\n // },\n {\n name: '全景图',\n value: '全景图',\n key: 'vr'\n }, {\n name: '物资',\n value: '物资',\n key: 'goods'\n }];\n }\n }, {\n key: \"show\",\n get: function get() {\n return this.options.show;\n },\n set: function set(v) {\n if (!this.isShowView) {\n this.options.show = v;\n this.originalOptions.show = v;\n }\n if (!this.showView || this.showView == 3) {\n this.entity && (this.entity.show = this.options.show);\n } else {\n this.entity && (this.entity.show = false);\n }\n Object(_Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_22__[\"syncData\"])(this.sdk, this.options.id);\n Object(_Global_SplitScreen__WEBPACK_IMPORTED_MODULE_28__[\"syncSplitData\"])(this.sdk, this.options.id);\n if (this._DialogObject && this._DialogObject.showBtn) {\n this._DialogObject.showBtn.checked = this.options.show;\n }\n this.isShowView = false;\n // if (v) {\n // if (this.diffuseShow) {\n // this.diffuseShow = true\n // }\n // if (this.scanShow) {\n // this.scanShow = true\n // }\n // }\n // else {\n // if (this.diffuse) {\n // this.diffuse.show = v\n // }\n // if (this.scan) {\n // this.scan.show = v\n // }\n // }\n }\n }, {\n key: \"heightMode\",\n get: function get() {\n return this.options.heightMode ? this.options.heightMode : 0;\n },\n set: function set(v) {\n var _this3 = this;\n this.options.heightMode = v ? v : 0;\n this.options.heightMode = v || v == 0 ? v : 3;\n var heightMode;\n var heightModeName = '';\n switch (this.options.heightMode) {\n case '0':\n case 0:\n heightMode = Cesium.HeightReference.NONE;\n break;\n case '1':\n case 1:\n heightMode = Cesium.HeightReference.NONE;\n break;\n case '2':\n case 2:\n heightMode = Cesium.HeightReference.CLAMP_TO_GROUND;\n break;\n case '3':\n case 3:\n heightMode = Cesium.HeightReference.NONE;\n var objectsToExclude = [];\n var _iterator = _createForOfIteratorHelper(this.sdk.entityMap),\n _step;\n try {\n for (_iterator.s(); !(_step = _iterator.n()).done;) {\n var _step$value = _babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_2___default()(_step.value, 2),\n key = _step$value[0],\n value = _step$value[1];\n if (value.type === 'RadarScanStereoscopic' && value.entity) {\n objectsToExclude.push(value.entity);\n }\n }\n } catch (err) {\n _iterator.e(err);\n } finally {\n _iterator.f();\n }\n this.getClampToHeight(this.options.position, objectsToExclude).then(function (h) {\n _this3.alt = Number(h.toFixed(2));\n });\n break;\n }\n if (this.entity) {\n this.entity.billboard.heightReference = heightMode;\n this.entity.label.heightReference = heightMode;\n }\n }\n }, {\n key: \"labelText\",\n get: function get() {\n return this.options.label.text;\n },\n set: function set(v) {\n this.options.label.text = v;\n this.options.name = v;\n this.entity && (this.entity.label.text = v + '');\n this._elms.labelText && this._elms.labelText.forEach(function (item) {\n item.value = v;\n });\n }\n }, {\n key: \"lng\",\n get: function get() {\n return this.options.position.lng;\n },\n set: function set(v) {\n this.options.position.lng = Number(Number(v).toFixed(8));\n // this.scan && (this.scan.lng = v)\n // this.diffuse && (this.diffuse.lng = v)\n this.renewPoint();\n this.coordinate = this.options.coordinate;\n this._projConvert && this._projConvert();\n this._elms.lng && this._elms.lng.forEach(function (item) {\n item.value = v;\n });\n }\n }, {\n key: \"lat\",\n get: function get() {\n return this.options.position.lat;\n },\n set: function set(v) {\n this.options.position.lat = Number(Number(v).toFixed(8));\n // this.scan && (this.scan.lat = v)\n // this.diffuse && (this.diffuse.lat = v)\n this.renewPoint();\n this.coordinate = this.options.coordinate;\n this._projConvert && this._projConvert();\n this._elms.lat && this._elms.lat.forEach(function (item) {\n item.value = v;\n });\n }\n }, {\n key: \"alt\",\n get: function get() {\n return this.options.position.alt;\n },\n set: function set(v) {\n this.options.position.alt = Number(Number(v).toFixed(2));\n // this.scan && (this.scan.alt = v)\n // this.diffuse && (this.diffuse.alt = v)\n this.renewPoint();\n this.coordinate = this.options.coordinate;\n }\n }, {\n key: \"near\",\n get: function get() {\n return this.options.near;\n },\n set: function set(v) {\n var near = v;\n if (near > this.far) {\n near = this.far;\n }\n this.options.near = near;\n this.renewPoint();\n this._elms.near && this._elms.near.forEach(function (item) {\n item.value = near;\n });\n }\n }, {\n key: \"far\",\n get: function get() {\n return this.options.far;\n },\n set: function set(v) {\n var far = v;\n if (far < this.near) {\n far = this.near;\n }\n this.options.far = far;\n this.renewPoint();\n this._elms.far && this._elms.far.forEach(function (item) {\n item.value = far;\n });\n }\n }, {\n key: \"scaleByDistance\",\n get: function get() {\n return this.options.scaleByDistance;\n },\n set: function set(v) {\n this.options.scaleByDistance = v;\n this.renewPoint();\n this._elms.scaleByDistance && this._elms.scaleByDistance.forEach(function (item) {\n item.checked = v;\n });\n }\n }, {\n key: \"billboardShow\",\n get: function get() {\n return this.options.billboard.show;\n },\n set: function set(v) {\n this.options.billboard.show = v;\n this.entity && (this.entity.billboard.color = this.options.billboard.show ? undefined : new Cesium.Color(1.0, 1.0, 1.0, 0));\n this._elms.billboardShow && this._elms.billboardShow.forEach(function (item) {\n item.value = v;\n });\n }\n }, {\n key: \"billboardImage\",\n get: function get() {\n var url = this.options.billboard.image;\n if (url && !url.startsWith(\"http\")) {\n //说明是本地的json,在磁盘中存在的\n if (!url.includes(\":\")) {\n if (this.options.host) {\n var o = new URL(url, this.options.host);\n url = o.href;\n }\n }\n }\n return url;\n },\n set: function set(v) {\n var _this = this;\n this.options.billboard.image = this.replaceHost(v, this.options.host);\n var url = this.options.billboard.image || Object(_Global_global__WEBPACK_IMPORTED_MODULE_23__[\"getBillboardDefaultUrl\"])(this.options.billboard.defaultImage) || this.getSourceRootPath() + '/img/A-ablu-blank.png';\n this._elms.billboardImage && this._elms.billboardImage.forEach(function (item) {\n item.src = url;\n });\n var isGlf = false;\n var superGif;\n if (_this.entity.billboard.image && _this.entity.billboard.image.getVa) {}\n if (url && url.endsWith('gif')) {\n isGlf = true;\n var gifImg = document.createElement('img');\n gifImg.setAttribute('rel:animated_src', url);\n gifImg.setAttribute('rel:auto_play', '1');\n var imgDiv = document.createElement('div');\n imgDiv.appendChild(gifImg);\n var id = Cesium.createGuid();\n superGif = new SuperGif({\n gif: gifImg\n });\n this._superGif = superGif;\n this._superGif.id = id;\n var billboardH = 36;\n var index = 0;\n _this._frameImages = [];\n superGif.load(function (status) {\n if (status == 404) {\n var _width = 31;\n var _height = 36;\n document.createElement('canvas'), _babel_runtime_helpers_readOnlyError__WEBPACK_IMPORTED_MODULE_1___default()(\"canvas\");\n canvas.width = 0;\n canvas.height = 0;\n billboardH = 0;\n _this.entity.billboard.imgWidth = 0;\n _this.entity.billboard.imgHeight = 0;\n _this.entity && (_this.entity.billboard.image = canvas);\n _this.entity.billboard.height = new Cesium.CallbackProperty(function () {\n return 0;\n }, false);\n _this.entity.label.pixelOffset = new Cesium.CallbackProperty(function () {\n return new Cesium.Cartesian2(0, 0);\n }, false);\n billboardH = _height * (31 / _width);\n return;\n }\n if (_this._superGif.id != id) {\n return;\n }\n var length = superGif.get_length();\n for (var i = 1; i <= length; i++) {\n superGif.move_to(i);\n _this._frameImages.push(superGif.get_canvas().toDataURL());\n }\n var canvas = superGif.get_canvas();\n var width = canvas.width;\n var height = canvas.height;\n billboardH = height * (31 / width);\n _this.entity.billboard.imgWidth = width;\n _this.entity.billboard.imgHeight = height;\n _this.entity && (_this.entity.billboard.image = new Cesium.CallbackProperty(function () {\n var img = _this._frameImages[index];\n index = index >= _this._frameImages.length - 1 ? 0 : index + 1;\n return img;\n }, false));\n _this.entity.billboard.height = new Cesium.CallbackProperty(function () {\n return billboardH;\n }, false);\n _this.entity.label.pixelOffset = new Cesium.CallbackProperty(function () {\n if (_this.options.billboard.show) {\n return new Cesium.Cartesian2(0, -billboardH * _this.options.billboard.scale - _this.options.label.fontSize / 2 - 5);\n } else {\n return new Cesium.Cartesian2(0, -_this.options.label.fontSize / 2 - 5);\n }\n }, false);\n });\n } else {\n var image = new Image();\n image.src = url;\n var _billboardH = 36;\n var canvas = document.createElement('canvas');\n image.onload = function () {\n var ratio = image.width / image.height;\n image.width = 100;\n image.height = 100 / ratio;\n var width = image.width;\n var height = image.height;\n var ctx = canvas.getContext('2d', {\n willReadFrequently: true\n });\n canvas.width = width;\n canvas.height = height;\n ctx.drawImage(image, 0, 0, width, height);\n _billboardH = height * (31 / width);\n _this.entity.billboard.imgWidth = width;\n _this.entity.billboard.imgHeight = height;\n _this.entity && (_this.entity.billboard.image = canvas);\n _this.entity.billboard.height = new Cesium.CallbackProperty(function () {\n return _billboardH;\n }, false);\n _this.entity.label.pixelOffset = new Cesium.CallbackProperty(function () {\n if (_this.options.billboard.show) {\n return new Cesium.Cartesian2(0, -_billboardH * _this.options.billboard.scale - _this.options.label.fontSize / 2 - 5);\n } else {\n return new Cesium.Cartesian2(0, -_this.options.label.fontSize / 2 - 5);\n }\n }, false);\n _billboardH = height * (31 / width);\n };\n image.onerror = function (err) {\n var width = 31;\n var height = 36;\n canvas.width = 0;\n canvas.height = 0;\n _billboardH = 0;\n _this.entity.billboard.imgWidth = 0;\n _this.entity.billboard.imgHeight = 0;\n _this.entity && (_this.entity.billboard.image = canvas);\n _this.entity.billboard.height = new Cesium.CallbackProperty(function () {\n return 0;\n }, false);\n _this.entity.label.pixelOffset = new Cesium.CallbackProperty(function () {\n return new Cesium.Cartesian2(0, 0);\n }, false);\n _billboardH = height * (31 / width);\n };\n }\n }\n }, {\n key: \"billboardScale\",\n get: function get() {\n return this.options.billboard.scale;\n },\n set: function set(v) {\n this.options.billboard.scale = v;\n this.renewPoint();\n this._elms.billboardScale && this._elms.billboardScale.forEach(function (item) {\n item.value = v;\n });\n }\n }, {\n key: \"labelShow\",\n get: function get() {\n return this.options.label.show;\n },\n set: function set(v) {\n this.options.label.show = v;\n this.entity && (this.entity.label.show = v);\n this._elms.labelShow && this._elms.labelShow.forEach(function (item) {\n item.value = v;\n });\n }\n }, {\n key: \"labelFontFamily\",\n get: function get() {\n return this.options.label.fontFamily;\n },\n set: function set(v) {\n this.options.label.fontFamily = v || 0;\n this.renewPoint();\n var name = Object(_Element_fontSelect__WEBPACK_IMPORTED_MODULE_26__[\"getFontFamilyName\"])(this.labelFontFamily) || '';\n this._elms.labelFontFamily && this._elms.labelFontFamily.forEach(function (item) {\n item.value = name;\n });\n }\n }, {\n key: \"labelFontSize\",\n get: function get() {\n return this.options.label.fontSize;\n },\n set: function set(v) {\n this.options.label.fontSize = v;\n this.renewPoint();\n this._elms.labelFontSize && this._elms.labelFontSize.forEach(function (item) {\n item.value = v;\n });\n }\n }, {\n key: \"labelColor\",\n get: function get() {\n return this.options.label.color;\n },\n set: function set(v) {\n var _this4 = this;\n this.options.label.color = v || '#00ffff';\n this.renewPoint();\n if (this._elms.labelColor) {\n this._elms.labelColor.forEach(function (item, i) {\n var colorPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: _this4.options.label.color,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(c) {\n _this4.labelColor = c;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this4.labelColor = 'rgba(0,255,255,1)';\n } //点击清空按钮事件回调\n });\n _this4._elms.labelColor[i] = colorPicker;\n });\n }\n }\n\n // get diffuseShow() {\n // return this.options.diffuseShow\n // }\n // set diffuseShow(v) {\n // this.options.diffuseShow = v\n // this._elms.diffuseShow && this._elms.diffuseShow.forEach((item) => {\n // item.checked = v\n // })\n // if (v && this.scanShow) {\n // this.scanShow = false\n // }\n // if (this.diffuse) {\n // if (this.show) {\n // this.diffuse.show = this.options.diffuseShow\n // }\n // }\n // else {\n // this.diffuse = new CircleDiffuse(this.sdk, { show: this.diffuseShow, lng: this.lng, lat: this.lat, radius: this.diffuseRadius, duration: this.diffuseDuration, color: this.diffuseColor })\n // }\n // }\n\n // get diffuseRadius() {\n // return this.options.diffuseRadius\n // }\n // set diffuseRadius(v) {\n // this.options.diffuseRadius = v\n // this._elms.diffuseRadius && this._elms.diffuseRadius.forEach((item) => {\n // item.value = v\n // })\n // if (this.diffuse) {\n // this.diffuse.radius = this.options.diffuseRadius\n // }\n // }\n\n // get diffuseDuration() {\n // return this.options.diffuseDuration\n // }\n // set diffuseDuration(v) {\n // this.options.diffuseDuration = v\n // this._elms.diffuseDuration && this._elms.diffuseDuration.forEach((item) => {\n // item.value = v\n // })\n // if (this.diffuse) {\n // this.diffuse.duration = this.options.diffuseDuration\n // }\n // }\n\n // get diffuseColor() {\n // return this.options.diffuseColor\n // }\n // set diffuseColor(v) {\n // this.options.diffuseColor = v\n // if (this._elms.diffuseColor) {\n // this._elms.diffuseColor.forEach((item, i) => {\n // let diffuseColorPicker = new YJColorPicker({\n // el: item.el,\n // size: 'mini',//颜色box类型\n // alpha: false,//是否开启透明度\n // defaultColor: v,\n // disabled: false,//是否禁止打开颜色选择器\n // openPickerAni: 'opacity',//打开颜色选择器动画\n // sure: (c) => {\n // this.diffuseColor = c\n // },//点击确认按钮事件回调\n // clear: () => {\n // this.diffuseColor = 'rgba(255,255,255,1)'\n // },//点击清空按钮事件回调\n // })\n // this._elms.diffuseColor[i] = diffuseColorPicker\n // })\n // }\n // if (this.diffuse) {\n // this.diffuse.color = this.options.diffuseColor\n // }\n // }\n\n // get scanShow() {\n // return this.options.scanShow\n // }\n // set scanShow(v) {\n // this.options.scanShow = v\n // this._elms.scanShow && this._elms.scanShow.forEach((item) => {\n // item.checked = v\n // })\n // if (v && this.diffuseShow) {\n // this.diffuseShow = false\n // }\n // if (this.scan) {\n // if (this.show) {\n // this.scan.show = this.options.scanShow\n // }\n // }\n // else {\n // this.scan = new RadarScan(this.sdk, { show: this.scanShow, lng: this.lng, lat: this.lat, radius: this.scanRadius, duration: this.scanDuration, color: this.scanColor })\n // }\n // }\n\n // get scanRadius() {\n // return this.options.scanRadius\n // }\n // set scanRadius(v) {\n // this.options.scanRadius = v\n // this._elms.scanRadius && this._elms.scanRadius.forEach((item) => {\n // item.value = v\n // })\n // if (this.scan) {\n // this.scan.radius = this.options.scanRadius\n // }\n // }\n\n // get scanDuration() {\n // return this.options.scanDuration\n // }\n // set scanDuration(v) {\n // this.options.scanDuration = v\n // this._elms.scanDuration && this._elms.scanDuration.forEach((item) => {\n // item.value = v\n // })\n // if (this.scan) {\n // this.scan.duration = this.options.scanDuration\n // }\n // }\n\n // get scanColor() {\n // return this.options.scanColor\n // }\n // set scanColor(v) {\n // this.options.scanColor = v\n // if (this._elms.scanColor) {\n // this._elms.scanColor.forEach((item, i) => {\n // let scanColorPicker = new YJColorPicker({\n // el: item.el,\n // size: 'mini',//颜色box类型\n // alpha: false,//是否开启透明度\n // defaultColor: v,\n // disabled: false,//是否禁止打开颜色选择器\n // openPickerAni: 'opacity',//打开颜色选择器动画\n // sure: (c) => {\n // this.scanColor = c\n // },//点击确认按钮事件回调\n // clear: () => {\n // this.scanColor = 'rgba(255,255,255,1)'\n // },//点击清空按钮事件回调\n // })\n // this._elms.scanColor[i] = scanColorPicker\n // })\n // }\n // if (this.scan) {\n // this.scan.color = this.options.scanColor\n // }\n // }\n }, {\n key: \"attributeLink\",\n get: function get() {\n return this.options.attribute.link.content;\n },\n set: function set(v) {\n var _this5 = this;\n this.options.attribute.link.content = v;\n if (!this._DialogObject || !this._DialogObject._element || !this._DialogObject._element.content || this._DialogObject._element.content.getElementsByClassName('attribute-content-link').length == 0) {\n return;\n }\n var table = this._DialogObject._element.content.getElementsByClassName('attribute-content-link')[1].getElementsByClassName('table')[0];\n var tableContent = table.getElementsByClassName('table-body')[0];\n tableContent.innerHTML = '';\n if (this.options.attribute.link.content.length > 0) {\n table.getElementsByClassName('table-empty')[0].style.display = 'none';\n } else {\n table.getElementsByClassName('table-empty')[0].style.display = 'flex';\n }\n for (var i = 0; i < this.options.attribute.link.content.length; i++) {\n var tr = \"\\n
\\n
\" + this.options.attribute.link.content[i].name + \"
\\n
\" + this.options.attribute.link.content[i].url + \"
\\n
\\n \\n \\n
\\n
\";\n var trElm = document.createRange().createContextualFragment(tr);\n tableContent.appendChild(trElm);\n }\n var item = tableContent.getElementsByClassName('tr');\n var fun = {\n linkEdit: function () {\n var _linkEdit = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_9___default.a.mark(function _callee(index) {\n var table, tableContent, item, _loop, _i;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_9___default.a.wrap(function _callee$(_context3) {\n while (1) switch (_context3.prev = _context3.next) {\n case 0:\n _context3.next = 2;\n return _this5.options.attribute.link.content;\n case 2:\n _this5.attributeLink = _context3.sent;\n table = _this5._DialogObject._element.content.getElementsByClassName('attribute-content-link')[1].getElementsByClassName('table')[0];\n tableContent = table.getElementsByClassName('table-body')[0];\n item = tableContent.getElementsByClassName('tr');\n _loop = /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_9___default.a.mark(function _loop(_i) {\n var height, _html, textareaElm, td, btn, n, _iterator2, _step2, _loop2;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_9___default.a.wrap(function _loop$(_context2) {\n while (1) switch (_context2.prev = _context2.next) {\n case 0:\n if (!(index === _i)) {\n _context2.next = 36;\n break;\n }\n height = item[_i].offsetHeight;\n _html = \"\\n
\\n \\n
\\n
\\n \\n
\\n
\\n \\n \\n
\";\n item[_i].innerHTML = _html;\n textareaElm = item[_i].getElementsByClassName('link-edit')[0];\n textareaElm.style.height = height - 10 + 'px';\n td = item[_i].getElementsByClassName('td');\n td[0].getElementsByClassName('input')[0].value = _this5.options.attribute.link.content[index].name;\n td[1].getElementsByClassName('input')[0].value = _this5.options.attribute.link.content[index].url;\n btn = item[_i].getElementsByTagName('button');\n n = 0;\n case 11:\n if (!(n < btn.length)) {\n _context2.next = 35;\n break;\n }\n if (!(!btn[n] || !btn[n].attributes)) {\n _context2.next = 14;\n break;\n }\n return _context2.abrupt(\"continue\", 32);\n case 14:\n _iterator2 = _createForOfIteratorHelper(btn[n].attributes);\n _context2.prev = 15;\n _loop2 = /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_9___default.a.mark(function _loop2() {\n var m;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_9___default.a.wrap(function _loop2$(_context) {\n while (1) switch (_context.prev = _context.next) {\n case 0:\n m = _step2.value;\n if (!(m.name === '@click')) {\n _context.next = 5;\n break;\n }\n btn[n].addEventListener('click', function (e) {\n if (typeof fun[m.value] === 'function') {\n fun[m.value]({\n name: td[0].getElementsByClassName('input')[0].value,\n url: td[1].getElementsByClassName('input')[0].value\n }, _i);\n }\n });\n btn[n].attributes.removeNamedItem(m.name);\n return _context.abrupt(\"return\", 1);\n case 5:\n case \"end\":\n return _context.stop();\n }\n }, _loop2);\n });\n _iterator2.s();\n case 18:\n if ((_step2 = _iterator2.n()).done) {\n _context2.next = 24;\n break;\n }\n return _context2.delegateYield(_loop2(), \"t0\", 20);\n case 20:\n if (!_context2.t0) {\n _context2.next = 22;\n break;\n }\n return _context2.abrupt(\"break\", 24);\n case 22:\n _context2.next = 18;\n break;\n case 24:\n _context2.next = 29;\n break;\n case 26:\n _context2.prev = 26;\n _context2.t1 = _context2[\"catch\"](15);\n _iterator2.e(_context2.t1);\n case 29:\n _context2.prev = 29;\n _iterator2.f();\n return _context2.finish(29);\n case 32:\n n++;\n _context2.next = 11;\n break;\n case 35:\n return _context2.abrupt(\"return\", 1);\n case 36:\n case \"end\":\n return _context2.stop();\n }\n }, _loop, null, [[15, 26, 29, 32]]);\n });\n _i = 0;\n case 8:\n if (!(_i < item.length)) {\n _context3.next = 15;\n break;\n }\n return _context3.delegateYield(_loop(_i), \"t0\", 10);\n case 10:\n if (!_context3.t0) {\n _context3.next = 12;\n break;\n }\n return _context3.abrupt(\"break\", 15);\n case 12:\n _i++;\n _context3.next = 8;\n break;\n case 15:\n case \"end\":\n return _context3.stop();\n }\n }, _callee);\n }));\n function linkEdit(_x) {\n return _linkEdit.apply(this, arguments);\n }\n return linkEdit;\n }(),\n linkDelete: function linkDelete(i) {\n _this5.options.attribute.link.content.splice(i, 1);\n _this5.attributeLink = _this5.options.attribute.link.content;\n },\n confirmEdit: function confirmEdit(value, i) {\n var name = value.name && value.name.replace(/\\s/g, '');\n var url = value.url && value.url.replace(/\\s/g, '');\n if (name && url) {\n _this5.options.attribute.link.content[i] = value;\n } else {\n window.ELEMENT && window.ELEMENT.Message({\n message: '名称或链接不能为空!',\n type: 'warning',\n duration: 1500\n });\n }\n _this5.attributeLink = _this5.options.attribute.link.content;\n },\n cancelEdit: function cancelEdit() {\n _this5.attributeLink = _this5.options.attribute.link.content;\n },\n fileSelect: function fileSelect(value, i) {\n var fileElm = item[i].getElementsByClassName('file-select')[0];\n fileElm.click();\n fileElm.removeEventListener('change', _fileSelect);\n fileElm.addEventListener('change', _fileSelect);\n }\n };\n var _fileSelect = function _fileSelect(event) {\n if (event.target.value) {\n var td = item[event.target.getAttribute('index')].getElementsByClassName('td');\n td[1].getElementsByClassName('input')[0].value = event.target.value;\n event.target.value = null;\n }\n };\n var _loop3 = function _loop3(_i2) {\n var btn = item[_i2].getElementsByTagName('button');\n for (var n = 0; n < btn.length; n++) {\n if (!btn[n] || !btn[n].attributes) {\n continue;\n }\n var _iterator3 = _createForOfIteratorHelper(btn[n].attributes),\n _step3;\n try {\n var _loop4 = function _loop4() {\n var m = _step3.value;\n if (m.name === '@click') {\n btn[n].addEventListener('click', function (e) {\n if (typeof fun[m.value] === 'function') {\n fun[m.value](_i2);\n }\n });\n btn[n].attributes.removeNamedItem(m.name);\n return 1; // break\n }\n };\n for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {\n if (_loop4()) break;\n }\n } catch (err) {\n _iterator3.e(err);\n } finally {\n _iterator3.f();\n }\n }\n };\n for (var _i2 = 0; _i2 < item.length; _i2++) {\n _loop3(_i2);\n }\n }\n }, {\n key: \"attributeCamera\",\n get: function get() {\n return this.options.attribute.camera.content;\n },\n set: function set(v) {\n this.options.attribute.camera.content = v;\n }\n }, {\n key: \"attributeISC\",\n get: function get() {\n return this.options.attribute.isc.content;\n },\n set: function set(v) {\n this.options.attribute.isc.content = v;\n }\n }, {\n key: \"attributeVr\",\n get: function get() {\n return this.options.attribute.vr.content;\n },\n set: function set(v) {\n var _this6 = this;\n this.options.attribute.vr.content = v;\n if (!this._DialogObject || !this._DialogObject._element || !this._DialogObject._element.content || this._DialogObject._element.content.getElementsByClassName('attribute-content-vr').length == 0) {\n return;\n }\n var table = this._DialogObject._element.content.getElementsByClassName('attribute-content-vr')[1].getElementsByClassName('table')[0];\n var tableContent = table.getElementsByClassName('table-body')[0];\n tableContent.innerHTML = '';\n if (this.options.attribute.vr.content.length > 0) {\n table.getElementsByClassName('table-empty')[0].style.display = 'none';\n } else {\n table.getElementsByClassName('table-empty')[0].style.display = 'flex';\n }\n for (var i = 0; i < this.options.attribute.vr.content.length; i++) {\n var tr = \"\\n
\\n
\" + this.options.attribute.vr.content[i].name + \"
\\n
\" + this.options.attribute.vr.content[i].url + \"
\\n
\\n \\n \\n
\\n
\";\n var trElm = document.createRange().createContextualFragment(tr);\n tableContent.appendChild(trElm);\n }\n var item = tableContent.getElementsByClassName('tr');\n var fun = {\n vrEdit: function () {\n var _vrEdit = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_9___default.a.mark(function _callee2(index) {\n var table, tableContent, item, _loop5, _i3;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_9___default.a.wrap(function _callee2$(_context6) {\n while (1) switch (_context6.prev = _context6.next) {\n case 0:\n _context6.next = 2;\n return _this6.options.attribute.vr.content;\n case 2:\n _this6.attributeVr = _context6.sent;\n table = _this6._DialogObject._element.content.getElementsByClassName('attribute-content-vr')[1].getElementsByClassName('table')[0];\n tableContent = table.getElementsByClassName('table-body')[0];\n item = tableContent.getElementsByClassName('tr');\n _loop5 = /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_9___default.a.mark(function _loop5(_i3) {\n var height, _html2, textareaElm, td, btn, n, _iterator4, _step4, _loop6;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_9___default.a.wrap(function _loop5$(_context5) {\n while (1) switch (_context5.prev = _context5.next) {\n case 0:\n if (!(index === _i3)) {\n _context5.next = 36;\n break;\n }\n height = item[_i3].offsetHeight;\n _html2 = \"\\n
\\n \\n
\\n
\\n \\n
\\n
\\n \\n \\n
\";\n item[_i3].innerHTML = _html2;\n textareaElm = item[_i3].getElementsByClassName('link-edit')[0];\n textareaElm.style.height = height - 10 + 'px';\n td = item[_i3].getElementsByClassName('td');\n td[0].getElementsByClassName('input')[0].value = _this6.options.attribute.vr.content[index].name;\n td[1].getElementsByClassName('input')[0].value = _this6.options.attribute.vr.content[index].url;\n btn = item[_i3].getElementsByTagName('button');\n n = 0;\n case 11:\n if (!(n < btn.length)) {\n _context5.next = 35;\n break;\n }\n if (!(!btn[n] || !btn[n].attributes)) {\n _context5.next = 14;\n break;\n }\n return _context5.abrupt(\"continue\", 32);\n case 14:\n _iterator4 = _createForOfIteratorHelper(btn[n].attributes);\n _context5.prev = 15;\n _loop6 = /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_9___default.a.mark(function _loop6() {\n var m;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_9___default.a.wrap(function _loop6$(_context4) {\n while (1) switch (_context4.prev = _context4.next) {\n case 0:\n m = _step4.value;\n if (!(m.name === '@click')) {\n _context4.next = 5;\n break;\n }\n btn[n].addEventListener('click', function (e) {\n if (typeof fun[m.value] === 'function') {\n fun[m.value]({\n name: td[0].getElementsByClassName('input')[0].value,\n url: td[1].getElementsByClassName('input')[0].value\n }, _i3);\n }\n });\n btn[n].attributes.removeNamedItem(m.name);\n return _context4.abrupt(\"return\", 1);\n case 5:\n case \"end\":\n return _context4.stop();\n }\n }, _loop6);\n });\n _iterator4.s();\n case 18:\n if ((_step4 = _iterator4.n()).done) {\n _context5.next = 24;\n break;\n }\n return _context5.delegateYield(_loop6(), \"t0\", 20);\n case 20:\n if (!_context5.t0) {\n _context5.next = 22;\n break;\n }\n return _context5.abrupt(\"break\", 24);\n case 22:\n _context5.next = 18;\n break;\n case 24:\n _context5.next = 29;\n break;\n case 26:\n _context5.prev = 26;\n _context5.t1 = _context5[\"catch\"](15);\n _iterator4.e(_context5.t1);\n case 29:\n _context5.prev = 29;\n _iterator4.f();\n return _context5.finish(29);\n case 32:\n n++;\n _context5.next = 11;\n break;\n case 35:\n return _context5.abrupt(\"return\", 1);\n case 36:\n case \"end\":\n return _context5.stop();\n }\n }, _loop5, null, [[15, 26, 29, 32]]);\n });\n _i3 = 0;\n case 8:\n if (!(_i3 < item.length)) {\n _context6.next = 15;\n break;\n }\n return _context6.delegateYield(_loop5(_i3), \"t0\", 10);\n case 10:\n if (!_context6.t0) {\n _context6.next = 12;\n break;\n }\n return _context6.abrupt(\"break\", 15);\n case 12:\n _i3++;\n _context6.next = 8;\n break;\n case 15:\n case \"end\":\n return _context6.stop();\n }\n }, _callee2);\n }));\n function vrEdit(_x2) {\n return _vrEdit.apply(this, arguments);\n }\n return vrEdit;\n }(),\n vrDelete: function vrDelete(i) {\n _this6.options.attribute.vr.content.splice(i, 1);\n _this6.attributeVr = _this6.options.attribute.vr.content;\n },\n confirmEdit: function confirmEdit(value, i) {\n var name = value.name && value.name.replace(/\\s/g, '');\n var url = value.url && value.url.replace(/\\s/g, '');\n if (name && url) {\n _this6.options.attribute.vr.content[i] = value;\n } else {\n window.ELEMENT && window.ELEMENT.Message({\n message: '名称或链接不能为空!',\n type: 'warning',\n duration: 1500\n });\n }\n _this6.attributeVr = _this6.options.attribute.vr.content;\n },\n cancelEdit: function cancelEdit() {\n _this6.attributeVr = _this6.options.attribute.vr.content;\n },\n fileSelect: function fileSelect(value, i) {\n var fileElm = item[i].getElementsByClassName('file-select')[0];\n fileElm.click();\n fileElm.removeEventListener('change', _fileSelect2);\n fileElm.addEventListener('change', _fileSelect2);\n }\n };\n var _fileSelect2 = function _fileSelect2(event) {\n if (event.target.value) {\n var td = item[event.target.getAttribute('index')].getElementsByClassName('td');\n td[1].getElementsByClassName('input')[0].value = event.target.value;\n event.target.value = null;\n }\n };\n var _loop7 = function _loop7(_i4) {\n var btn = item[_i4].getElementsByTagName('button');\n for (var n = 0; n < btn.length; n++) {\n if (!btn[n] || !btn[n].attributes) {\n continue;\n }\n var _iterator5 = _createForOfIteratorHelper(btn[n].attributes),\n _step5;\n try {\n var _loop8 = function _loop8() {\n var m = _step5.value;\n if (m.name === '@click') {\n btn[n].addEventListener('click', function (e) {\n if (typeof fun[m.value] === 'function') {\n fun[m.value](_i4);\n }\n });\n btn[n].attributes.removeNamedItem(m.name);\n return 1; // break\n }\n };\n for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {\n if (_loop8()) break;\n }\n } catch (err) {\n _iterator5.e(err);\n } finally {\n _iterator5.f();\n }\n }\n };\n for (var _i4 = 0; _i4 < item.length; _i4++) {\n _loop7(_i4);\n }\n }\n }, {\n key: \"attributeGoods\",\n get: function get() {\n return this.options.attribute.goods.content;\n },\n set: function set(v) {\n this.options.attribute.goods.content = v;\n }\n }, {\n key: \"billboardDefaultImage\",\n get: function get() {\n return Object(_Global_global__WEBPACK_IMPORTED_MODULE_23__[\"getBillboardDefaultUrl\"])(this.options.billboard.defaultImage) || this.getSourceRootPath() + '/img/A-ablu-blank.png';\n },\n set: function set(v) {\n var url = this.replaceHost(v, this.options.host);\n Object(_Global_global__WEBPACK_IMPORTED_MODULE_23__[\"setBillboardDefaultUrl\"])(url, this.options.billboard.defaultImage);\n this._elms.billboardDefaultImage && this._elms.billboardDefaultImage.forEach(function (item) {\n item.src = url;\n });\n }\n }, {\n key: \"coordinate\",\n get: function get() {\n return this.options.coordinate;\n },\n set: function set(v) {\n return;\n this.options.coordinate = v;\n var position = this._proj.convert([{\n x: this.options.position.lng,\n y: this.options.position.lat,\n z: this.options.position.alt\n }], 'EPSG:4326', v).points;\n if (this._DialogObject && this._DialogObject._element && this._DialogObject._element.content && position[0]) {\n this._DialogObject._element.content.getElementsByClassName('convert-x')[0].value = position[0].x;\n this._DialogObject._element.content.getElementsByClassName('convert-y')[0].value = position[0].y;\n this._DialogObject._element.content.getElementsByClassName('convert-z')[0].value = position[0].z;\n }\n this._elms.coordinate && this._elms.coordinate.forEach(function (item) {\n item.value = v;\n });\n }\n\n /**\r\n * @description 编辑框\r\n * @param state=false {boolean} 状态: true打开, false关闭\r\n */\n }, {\n key: \"edit\",\n value: (function () {\n var _edit = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_9___default.a.mark(function _callee4() {\n var _this7 = this;\n var state,\n _this,\n contentElm,\n tabsElm,\n colorPicker,\n all_elm,\n lngEln,\n latEln,\n projCheckboxBoxElms,\n projCheckboxElms,\n projInputBoxElms,\n _args8 = arguments;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_9___default.a.wrap(function _callee4$(_context8) {\n while (1) switch (_context8.prev = _context8.next) {\n case 0:\n state = _args8.length > 0 && _args8[0] !== undefined ? _args8[0] : false;\n return _context8.abrupt(\"return\");\n case 8:\n this._DialogObject = _context8.sent;\n this._DialogObject._element.body.className = this._DialogObject._element.body.className + ' billboard-object';\n contentElm = document.createElement('div');\n contentElm.innerHTML = Object(_element__WEBPACK_IMPORTED_MODULE_16__[\"html\"])(this);\n this._DialogObject.contentAppChild(contentElm);\n this.attributeCamera = this.options.attribute.camera.content;\n this.attributeISC = this.options.attribute.isc.content;\n\n // let coordinateElm = contentElm.getElementsByClassName('coordinate-select')[0]\n // let option = ''\n // this._proj.epsg_map.forEach((value, key) => {\n // if (!this.options.coordinate) {\n // this.options.coordinate = key\n // this.originalOptions.coordinate = key\n // }\n // option += ``\n // })\n // coordinateElm.innerHTML = option\n // this.coordinate = this.options.coordinate\n\n // 创建标签页\n tabsElm = new _Element_cy_html_tabs__WEBPACK_IMPORTED_MODULE_14__[\"default\"]('point-object-edit-tabs', undefined, this.sdk); // 颜色组件\n colorPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName('labelColor')[0],\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: this.labelColor,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this7.labelColor = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this7.labelColor = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n }); // let diffuseColorPicker = new YJColorPicker({\n // el: contentElm.getElementsByClassName(\"diffuseColor\")[0],\n // size: 'mini',//颜色box类型\n // alpha: false,//是否开启透明度\n // defaultColor: this.diffuseColor,\n // disabled: false,//是否禁止打开颜色选择器\n // openPickerAni: 'opacity',//打开颜色选择器动画\n // sure: (color) => {\n // this.diffuseColor = color\n // },//点击确认按钮事件回调\n // clear: () => {\n // this.diffuseColor = 'rgba(255,255,255,1)'\n // },//点击清空按钮事件回调\n // })\n // let scanColorPicker = new YJColorPicker({\n // el: contentElm.getElementsByClassName(\"scanColor\")[0],\n // size: 'mini',//颜色box类型\n // alpha: false,//是否开启透明度\n // defaultColor: this.scanColor,\n // disabled: false,//是否禁止打开颜色选择器\n // openPickerAni: 'opacity',//打开颜色选择器动画\n // sure: (color) => {\n // this.scanColor = color\n // },//点击确认按钮事件回调\n // clear: () => {\n // this.scanColor = 'rgba(255,255,255,1)'\n // },//点击清空按钮事件回调\n // })\n all_elm = contentElm.getElementsByTagName('*');\n this._EventBinding.on(this, all_elm);\n this._elms = this._EventBinding.element;\n this._elms.labelColor = [colorPicker];\n // this._elms.diffuseColor = [diffuseColorPicker]\n // this._elms.scanColor = [scanColorPicker]\n\n setTimeout(/*#__PURE__*/_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_9___default.a.mark(function _callee3() {\n var col, row, tagData, attributeElm, legpObject, attributeSelectElm, i, coordinateData, coordinateDataLegpObject, coordinateDataLegpElm, _i6, heightBoxElm, heightElm, heightModeData, heightMode, objectsToExclude, _iterator6, _step6, _step6$value, key, value, heightModeObject, heightModeDataLegpElm, _i8, fontData, fontObject, fontDataLegpElm, _i10;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_9___default.a.wrap(function _callee3$(_context7) {\n while (1) switch (_context7.prev = _context7.next) {\n case 0:\n _this7.attributeLink = _this7.options.attribute.link.content;\n _this7.attributeVr = _this7.options.attribute.vr.content;\n // this.attributeCamera = this.options.attribute.camera\n _this7.cameraSelect && _this7.cameraSelect();\n _this7.ISCSelect && _this7.ISCSelect();\n _this7.goodsSelect && _this7.goodsSelect();\n col = document.createElement('div');\n col.className = 'col';\n col.style.flex = '0 0 110px';\n col.innerHTML = \"\\n \\u5C5E\\u6027\\u6846\\n \\n \";\n row = _this7._DialogObject._element.content.getElementsByClassName('attribute')[0].getElementsByClassName('row')[0];\n row.appendChild(col);\n tagData = _this7.attributeSelect;\n attributeElm = _this7._DialogObject._element.content.getElementsByClassName('attribute-select-box')[0];\n if (!attributeElm) {\n _context7.next = 27;\n break;\n }\n legpObject = Object(_Element_datalist__WEBPACK_IMPORTED_MODULE_25__[\"legp\"])(attributeElm, '.attribute-select');\n legpObject.legp_search(tagData);\n attributeSelectElm = _this7._DialogObject._element.content.getElementsByClassName('attribute-select')[0].getElementsByTagName('input')[0];\n i = 0;\n case 18:\n if (!(i < tagData.length)) {\n _context7.next = 26;\n break;\n }\n if (!(tagData[i].key === _this7.options.attributeType)) {\n _context7.next = 23;\n break;\n }\n attributeSelectElm.value = tagData[i].value;\n legpObject.legp_searchActive(tagData[i].value);\n return _context7.abrupt(\"break\", 26);\n case 23:\n i++;\n _context7.next = 18;\n break;\n case 26:\n attributeSelectElm.addEventListener('input', function () {\n for (var _i5 = 0; _i5 < tagData.length; _i5++) {\n if (tagData[_i5].value === attributeSelectElm.value) {\n _this7.attributeType = tagData[_i5].key;\n break;\n }\n }\n });\n case 27:\n coordinateData = [];\n _this7.epsg_map.forEach(function (value, key) {\n coordinateData.push({\n name: \"\".concat(value.name, \"(\").concat(value.epsg, \")\"),\n value: key\n });\n });\n coordinateDataLegpObject = Object(_Element_datalist__WEBPACK_IMPORTED_MODULE_25__[\"legp\"])(_this7._DialogObject._element.content.getElementsByClassName('coordinate-select-box')[0], '.coordinate-select');\n if (!coordinateDataLegpObject) {\n _context7.next = 44;\n break;\n }\n coordinateDataLegpObject.legp_search(coordinateData);\n coordinateDataLegpElm = _this7._DialogObject._element.content.getElementsByClassName('coordinate-select')[0].getElementsByTagName('input')[0];\n if (!_this7.coordinate) {\n _this7.coordinate = coordinateData[0].value;\n } else {\n _this7.coordinate = _this7.coordinate;\n }\n coordinateDataLegpElm.value = _this7.coordinate;\n _i6 = 0;\n case 36:\n if (!(_i6 < coordinateData.length)) {\n _context7.next = 43;\n break;\n }\n if (!(coordinateData[_i6].value === coordinateData.value)) {\n _context7.next = 40;\n break;\n }\n coordinateDataLegpObject.legp_searchActive(coordinateData[_i6].value);\n return _context7.abrupt(\"break\", 43);\n case 40:\n _i6++;\n _context7.next = 36;\n break;\n case 43:\n coordinateDataLegpElm.addEventListener('input', function () {\n for (var _i7 = 0; _i7 < coordinateData.length; _i7++) {\n if (coordinateData[_i7].value === coordinateDataLegpElm.value) {\n _this7.coordinate = coordinateData[_i7].value;\n break;\n }\n }\n });\n case 44:\n heightBoxElm = document.getElementsByClassName('height-box')[0];\n heightElm = heightBoxElm.getElementsByClassName('height')[0];\n heightModeData = [{\n name: '海拔高度',\n value: '海拔高度',\n key: '0'\n }, {\n name: '相对地表',\n value: '相对地表',\n key: '1'\n }, {\n name: '依附地表',\n value: '依附地表',\n key: '2'\n }, {\n name: '依附模型',\n value: '依附模型',\n key: '3'\n }];\n heightMode = _this7.heightMode;\n _context7.t0 = heightMode;\n _context7.next = _context7.t0 === 0 ? 51 : _context7.t0 === '0' ? 51 : _context7.t0 === 1 ? 53 : _context7.t0 === '1' ? 53 : _context7.t0 === 2 ? 55 : _context7.t0 === '2' ? 55 : _context7.t0 === 3 ? 55 : _context7.t0 === '3' ? 55 : 60;\n break;\n case 51:\n heightElm.value = _this7.alt;\n return _context7.abrupt(\"break\", 60);\n case 53:\n if (_this7.sdk.viewer.scene.terrainProvider.availability) {\n Cesium.sampleTerrainMostDetailed(_this7.sdk.viewer.scene.terrainProvider, [Cesium.Cartographic.fromDegrees(_this7.options.position.lng, _this7.options.position.lat)]).then(function (position) {\n heightElm.value = Number((_this7.alt - Number(position[0].height.toFixed(2))).toFixed(2));\n });\n } else {\n heightElm.value = Number(_this7.alt.toFixed(2));\n }\n return _context7.abrupt(\"break\", 60);\n case 55:\n objectsToExclude = [];\n _iterator6 = _createForOfIteratorHelper(_this7.sdk.entityMap);\n try {\n for (_iterator6.s(); !(_step6 = _iterator6.n()).done;) {\n _step6$value = _babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_2___default()(_step6.value, 2), key = _step6$value[0], value = _step6$value[1];\n if (value.type === 'RadarScanStereoscopic' && value.entity) {\n objectsToExclude.push(value.entity);\n }\n }\n } catch (err) {\n _iterator6.e(err);\n } finally {\n _iterator6.f();\n }\n _this7.getClampToHeight(_this7.options.position, objectsToExclude).then(function (h) {\n _this7.alt = Number(h.toFixed(2));\n heightElm.value = _this7.alt;\n });\n return _context7.abrupt(\"break\", 60);\n case 60:\n heightModeObject = Object(_Element_datalist__WEBPACK_IMPORTED_MODULE_25__[\"legp\"])(_this7._DialogObject._element.content.getElementsByClassName('height-mode-box')[0], '.height-mode');\n if (!heightModeObject) {\n _context7.next = 78;\n break;\n }\n heightModeObject.legp_search(heightModeData);\n heightModeDataLegpElm = _this7._DialogObject._element.content.getElementsByClassName('height-mode')[0].getElementsByTagName('input')[0];\n heightModeDataLegpElm.value = heightModeData[_this7.heightMode].value;\n _i8 = 0;\n case 66:\n if (!(_i8 < heightModeData.length)) {\n _context7.next = 73;\n break;\n }\n if (!(heightModeData[_i8].value == heightModeDataLegpElm.value)) {\n _context7.next = 70;\n break;\n }\n heightModeObject.legp_searchActive(heightModeData[_i8].value);\n return _context7.abrupt(\"break\", 73);\n case 70:\n _i8++;\n _context7.next = 66;\n break;\n case 73:\n heightModeDataLegpElm.addEventListener('input', function () {\n for (var _i9 = 0; _i9 < heightModeData.length; _i9++) {\n if (heightModeData[_i9].value === heightModeDataLegpElm.value) {\n heightMode = heightModeData[_i9].key;\n switch (heightMode) {\n case 0:\n case '0':\n _this7.alt = Number(heightElm.value);\n heightBoxElm.style.display = 'flex';\n _this7.heightMode = 0;\n break;\n case 1:\n case '1':\n if (_this7.sdk.viewer.scene.terrainProvider.availability) {\n Cesium.sampleTerrainMostDetailed(_this7.sdk.viewer.scene.terrainProvider, [Cesium.Cartographic.fromDegrees(_this7.options.position.lng, _this7.options.position.lat)]).then(function (position) {\n _this7.alt = Number(heightElm.value) + Number(position[0].height.toFixed(2));\n });\n } else {\n _this7.alt = Number(heightElm.value);\n }\n heightBoxElm.style.display = 'flex';\n _this7.heightMode = 1;\n break;\n case 2:\n case '2':\n _this7.heightMode = 2;\n break;\n case 3:\n case '3':\n var _objectsToExclude = [];\n var _iterator7 = _createForOfIteratorHelper(_this7.sdk.entityMap),\n _step7;\n try {\n for (_iterator7.s(); !(_step7 = _iterator7.n()).done;) {\n var _step7$value = _babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_2___default()(_step7.value, 2),\n _key = _step7$value[0],\n _value = _step7$value[1];\n if (_value.type === 'RadarScanStereoscopic' && _value.entity) {\n _objectsToExclude.push(_value.entity);\n }\n }\n } catch (err) {\n _iterator7.e(err);\n } finally {\n _iterator7.f();\n }\n _this7.getClampToHeight(_this7.options.position, _objectsToExclude).then(function (h) {\n _this7.alt = Number(h.toFixed(2));\n });\n _this7.heightMode = 3;\n break;\n }\n break;\n }\n }\n });\n heightElm.addEventListener('input', function () {\n switch (heightMode) {\n case 0:\n case '0':\n _this7.options.position.alt = Number(Number(heightElm.value).toFixed(2));\n break;\n case 1:\n case '1':\n if (_this7.sdk.viewer.scene.terrainProvider.availability) {\n Cesium.sampleTerrainMostDetailed(_this7.sdk.viewer.scene.terrainProvider, [Cesium.Cartographic.fromDegrees(_this7.options.position.lng, _this7.options.position.lat)]).then(function (position) {\n _this7.alt = Number(heightElm.value) + Number(position[0].height.toFixed(2));\n });\n } else {\n _this7.alt = Number(heightElm.value);\n }\n break;\n case 2:\n case '2':\n break;\n }\n _this7.renewPoint();\n _this7.coordinate = _this7.options.coordinate;\n _this7._elms.alt && _this7._elms.alt.forEach(function (item) {\n item.value = _this7.options.position.alt;\n });\n });\n _this7._elms.height = heightBoxElm;\n _this7._elms.heightMode = heightModeDataLegpElm;\n _this7.heightMode = _this7.heightMode;\n case 78:\n fontData = Object(_Element_fontSelect__WEBPACK_IMPORTED_MODULE_26__[\"getFontList\"])();\n fontObject = Object(_Element_datalist__WEBPACK_IMPORTED_MODULE_25__[\"legp\"])(_this7._DialogObject._element.content.getElementsByClassName('font-select-box')[0], '.font-select');\n if (!fontObject) {\n _context7.next = 94;\n break;\n }\n fontObject.legp_search(fontData);\n fontDataLegpElm = _this7._DialogObject._element.content.getElementsByClassName('font-select')[0].getElementsByTagName('input')[0];\n fontDataLegpElm.value = fontData[_this7.labelFontFamily].value;\n _i10 = 0;\n case 85:\n if (!(_i10 < fontData.length)) {\n _context7.next = 92;\n break;\n }\n if (!(fontData[_i10].value == fontDataLegpElm.value)) {\n _context7.next = 89;\n break;\n }\n fontObject.legp_searchActive(fontData[_i10].value);\n return _context7.abrupt(\"break\", 92);\n case 89:\n _i10++;\n _context7.next = 85;\n break;\n case 92:\n fontDataLegpElm.addEventListener('input', function () {\n for (var _i11 = 0; _i11 < fontData.length; _i11++) {\n if (fontData[_i11].value === fontDataLegpElm.value) {\n _this7.labelFontFamily = fontData[_i11].key;\n break;\n }\n }\n });\n _this7._elms.labelFontFamily = [fontDataLegpElm];\n case 94:\n case \"end\":\n return _context7.stop();\n }\n }, _callee3);\n })), 0);\n lngEln = contentElm.getElementsByClassName('lng')[0];\n latEln = contentElm.getElementsByClassName('lat')[0];\n lngEln.value = this.lng;\n latEln.value = this.lat;\n this._elms.lng.push(lngEln);\n this._elms.lat.push(latEln);\n projCheckboxBoxElms = this._DialogObject._element.content.getElementsByClassName('YJ-custom-checkbox-box');\n projCheckboxElms = this._DialogObject._element.content.getElementsByClassName('YJ-custom-checkbox');\n projInputBoxElms = this._DialogObject._element.content.getElementsByClassName('proj-input-box');\n projCheckboxElms[0].checked = true;\n projInputBoxElms[1].style.display = 'none';\n projInputBoxElms[2].style.display = 'none';\n projCheckboxBoxElms[0].addEventListener('click', function () {\n projCheckboxElms[0].checked = true;\n projInputBoxElms[0].style.display = 'block';\n projCheckboxElms[1].checked = false;\n projInputBoxElms[1].style.display = 'none';\n projCheckboxElms[2].checked = false;\n projInputBoxElms[2].style.display = 'none';\n });\n projCheckboxBoxElms[1].addEventListener('click', function () {\n projCheckboxElms[1].checked = true;\n projInputBoxElms[1].style.display = 'block';\n projCheckboxElms[0].checked = false;\n projInputBoxElms[0].style.display = 'none';\n projCheckboxElms[2].checked = false;\n projInputBoxElms[2].style.display = 'none';\n });\n projCheckboxBoxElms[2].addEventListener('click', function () {\n projCheckboxElms[2].checked = true;\n projInputBoxElms[2].style.display = 'block';\n projCheckboxElms[0].checked = false;\n projInputBoxElms[0].style.display = 'none';\n projCheckboxElms[1].checked = false;\n projInputBoxElms[1].style.display = 'none';\n });\n _this._projConvert = function () {\n if (!_this7._DialogObject || _this7._DialogObject.isDestroy) {\n return;\n }\n var lng, lat, lngD, lngM, lngS, latD, latM, latS, lngDM, latDM, lngDMS, latDMS, lngdnArr1, lngdnArr2, latdnArr1, latdnArr2, lngdnsArr1, lngdnsArr2, lngdnsArr3, latdnsArr1, latdnsArr2, latdnsArr3;\n lng = _this.lng;\n lat = _this.lat;\n lngDM = _this._proj.degreesToDMS(lng, true);\n latDM = _this._proj.degreesToDMS(lat, true);\n lngdnArr1 = lngDM.split('°');\n lngdnArr2 = lngdnArr1[1].split(\"'\");\n latdnArr1 = latDM.split('°');\n latdnArr2 = latdnArr1[1].split(\"'\");\n contentElm.getElementsByClassName('lng-dm-d')[0].value = lngdnArr1[0];\n contentElm.getElementsByClassName('lng-dm-m')[0].value = lngdnArr2[0];\n contentElm.getElementsByClassName('lat-dm-d')[0].value = latdnArr1[0];\n contentElm.getElementsByClassName('lat-dm-m')[0].value = latdnArr2[0];\n lngDMS = _this._proj.degreesToDMS(lng);\n latDMS = _this._proj.degreesToDMS(lat);\n lngdnsArr1 = lngDMS.split('°');\n lngdnsArr2 = lngdnsArr1[1].split(\"'\");\n lngdnsArr3 = lngdnsArr2[1].split('\"');\n latdnsArr1 = latDMS.split('°');\n latdnsArr2 = latdnsArr1[1].split(\"'\");\n latdnsArr3 = latdnsArr2[1].split('\"');\n contentElm.getElementsByClassName('lng-dms-d')[0].value = lngdnsArr1[0];\n contentElm.getElementsByClassName('lng-dms-m')[0].value = lngdnsArr2[0];\n contentElm.getElementsByClassName('lng-dms-s')[0].value = lngdnsArr3[0];\n contentElm.getElementsByClassName('lat-dms-d')[0].value = latdnsArr1[0];\n contentElm.getElementsByClassName('lat-dms-m')[0].value = latdnsArr2[0];\n contentElm.getElementsByClassName('lat-dms-s')[0].value = latdnsArr3[0];\n };\n _this._projConvert();\n _context8.next = 41;\n break;\n case 41:\n case \"end\":\n return _context8.stop();\n }\n }, _callee4, this);\n }));\n function edit() {\n return _edit.apply(this, arguments);\n }\n return edit;\n }())\n }, {\n key: \"renewPoint\",\n value: function renewPoint() {\n var _this = this;\n var font = Object(_Element_fontSelect__WEBPACK_IMPORTED_MODULE_26__[\"getFontFamily\"])(this.labelFontFamily) || 'Helvetica';\n if (this.entity) {\n this.entity.position = Cesium.Cartesian3.fromDegrees(this.options.position.lng, this.options.position.lat, this.options.position.alt);\n if (this.options.scaleByDistance) {\n this.entity.billboard.scaleByDistance = new Cesium.NearFarScalar(this.options.near, 1, this.options.far, 0);\n this.entity.billboard.pixelOffsetScaleByDistance = new Cesium.NearFarScalar(this.options.near, 1, this.options.far, 0);\n this.entity.label.scaleByDistance = new Cesium.NearFarScalar(this.options.near, 1, this.options.far, 0);\n this.entity.label.pixelOffsetScaleByDistance = new Cesium.NearFarScalar(this.options.near, 1, this.options.far, 0);\n } else {\n this.entity.billboard.scaleByDistance = undefined;\n this.entity.billboard.pixelOffsetScaleByDistance = undefined;\n this.entity.label.scaleByDistance = undefined;\n this.entity.label.pixelOffsetScaleByDistance = undefined;\n }\n // this.entity.billboard.pixelOffset = new Cesium.CallbackProperty(\n // function () {\n // let billboardH =\n // _this.entity.billboard.imgHeight *\n // (31 / _this.entity.billboard.imgWidth)\n // return new Cesium.Cartesian2(\n // 0,\n // -(billboardH / 2) * _this.options.billboard.scale\n // )\n // },\n // false\n // )\n this.entity.label.pixelOffset = new Cesium.CallbackProperty(function () {\n if (_this.options.billboard.show) {\n var billboardH = _this.entity.billboard.imgHeight ? _this.entity.billboard.imgHeight * (31 / _this.entity.billboard.imgWidth) : 0;\n return new Cesium.Cartesian2(0, -billboardH * _this.options.billboard.scale - _this.options.label.fontSize / 2 - 5);\n } else {\n return new Cesium.Cartesian2(0, -_this.options.label.fontSize / 2 - 5);\n }\n }, false);\n this.entity.label.font = this.options.label.fontSize + 'px ' + font;\n this.entity.label.fillColor = Cesium.Color.fromCssColorString(this.options.label.color);\n this.entity.billboard.scale = this.options.billboard.scale;\n }\n }\n }, {\n key: \"reset\",\n value: function reset() {\n if (!this.entity) {\n return;\n }\n this.options = this.deepCopyObj(this.originalOptions);\n this.near = this.originalOptions.near;\n this.far = this.originalOptions.far;\n this.scaleByDistance = this.originalOptions.scaleByDistance;\n this.billboardShow = this.originalOptions.billboard.show;\n this.billboardImage = this.originalOptions.billboard.image;\n this.billboardScale = this.originalOptions.billboard.scale;\n this.labelText = this.originalOptions.label.text;\n this.labelShow = this.originalOptions.label.show;\n this.labelFontSize = this.originalOptions.label.fontSize;\n this.labelColor = this.originalOptions.label.color;\n this.lng = this.originalOptions.position.lng;\n this.lat = this.originalOptions.position.lat;\n this.alt = this.originalOptions.position.alt;\n this.attributeLink = this.options.attribute.link.content;\n this.attributeVr = this.options.attribute.vr.content;\n this.attributeCamera = this.options.attribute.camera.content;\n this.attributeGoods = this.options.attribute.goods.content;\n this.attributeISC = this.options.attribute.isc.content;\n this.cameraSelect && this.cameraSelect();\n this.goodsSelect && this.goodsSelect();\n }\n }, {\n key: \"remove\",\n value: function () {\n var _remove = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_9___default.a.mark(function _callee5() {\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_9___default.a.wrap(function _callee5$(_context9) {\n while (1) switch (_context9.prev = _context9.next) {\n case 0:\n _context9.next = 2;\n return Object(_Global_cluster_cluster__WEBPACK_IMPORTED_MODULE_19__[\"remove_entity_from_cluster\"])(this.sdk.viewer, this.entity);\n case 2:\n this.entity = null;\n if (!(!this.sdk.viewer || !this.sdk.viewer.entities)) {\n _context9.next = 5;\n break;\n }\n return _context9.abrupt(\"return\");\n case 5:\n // if (this.diffuse) {\n // this.diffuse.remove()\n // this.diffuse = null\n // }\n // if (this.scan) {\n // this.scan.remove()\n // this.scan = null\n // }\n if (this._DialogObject && !this._DialogObject.isDestroy) {\n this._DialogObject.close();\n this._DialogObject = null;\n }\n this.event && this.event.destroy();\n this.tip && this.tip.destroy();\n _context9.next = 10;\n return this.sdk.removeIncetance(this.options.id);\n case 10:\n _context9.next = 12;\n return Object(_Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_22__[\"syncData\"])(this.sdk, this.options.id);\n case 12:\n case \"end\":\n return _context9.stop();\n }\n }, _callee5, this);\n }));\n function remove() {\n return _remove.apply(this, arguments);\n }\n return remove;\n }() // 点击弹框内图标切换\n }, {\n key: \"clickChangeImage\",\n value: function clickChangeImage() {\n this.Dialog.clickChangeImage && this.Dialog.clickChangeImage();\n }\n // 点击弹框内默认图标切换\n }, {\n key: \"clickChangeDefaultImage\",\n value: function clickChangeDefaultImage() {\n this.Dialog.clickChangeDefaultImage && this.Dialog.clickChangeDefaultImage();\n }\n }, {\n key: \"updateHeight\",\n value: function () {\n var _updateHeight = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_9___default.a.mark(function _callee6() {\n var height, height2, point1, point2, objectsToExclude, _iterator8, _step8, _step8$value, key, value, updatedCartesians, direction, c, ray, r, pickedObjects, i, promise;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_9___default.a.wrap(function _callee6$(_context10) {\n while (1) switch (_context10.prev = _context10.next) {\n case 0:\n if (!(!this.sdk || !this.sdk.viewer || !this.sdk.viewer.scene)) {\n _context10.next = 2;\n break;\n }\n return _context10.abrupt(\"return\");\n case 2:\n point1 = new Cesium.Cartesian3.fromDegrees(this.options.position.lng, this.options.position.lat, 0);\n point2 = new Cesium.Cartesian3.fromDegrees(this.options.position.lng, this.options.position.lat, 10000000000000);\n objectsToExclude = [];\n _iterator8 = _createForOfIteratorHelper(this.sdk.entityMap);\n try {\n for (_iterator8.s(); !(_step8 = _iterator8.n()).done;) {\n _step8$value = _babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_2___default()(_step8.value, 2), key = _step8$value[0], value = _step8$value[1];\n if (value.type === 'RadarScanStereoscopic' && value.entity) {\n objectsToExclude.push(value.entity);\n }\n }\n } catch (err) {\n _iterator8.e(err);\n } finally {\n _iterator8.f();\n }\n _context10.next = 9;\n return this.sdk.viewer.scene.clampToHeightMostDetailed([point1], objectsToExclude);\n case 9:\n updatedCartesians = _context10.sent;\n if (updatedCartesians && updatedCartesians[0]) {\n height = this.cartesian3Towgs84(updatedCartesians[0], this.sdk.viewer).alt;\n }\n direction = Cesium.Cartesian3.subtract(point1, point2, new Cesium.Cartesian3());\n c = Cesium.Cartesian3.normalize(direction, new Cesium.Cartesian3());\n ray = new Cesium.Ray(point2, c);\n r = {};\n pickedObjects = this.sdk.viewer.scene.drillPickFromRay(ray);\n i = pickedObjects.length - 1;\n case 17:\n if (!(i >= 0)) {\n _context10.next = 24;\n break;\n }\n if (!pickedObjects[i].position) {\n _context10.next = 21;\n break;\n }\n r = pickedObjects[i];\n return _context10.abrupt(\"break\", 24);\n case 21:\n i--;\n _context10.next = 17;\n break;\n case 24:\n if (r && r.position) {\n height2 = this.cartesian3Towgs84(r.position, this.sdk.viewer).alt;\n }\n _context10.prev = 25;\n _context10.next = 28;\n return Cesium.sampleTerrainMostDetailed(this.sdk.viewer.terrainProvider, [Cesium.Cartographic.fromDegrees(this.options.position.lng, this.options.position.lat)]);\n case 28:\n promise = _context10.sent;\n _context10.next = 33;\n break;\n case 31:\n _context10.prev = 31;\n _context10.t0 = _context10[\"catch\"](25);\n case 33:\n if ((height2 === void 0 || height2 < promise[0].height) && promise) {\n height2 = promise[0].height;\n }\n if (height === void 0 || height < height2) {\n height = height2;\n }\n if (!(height !== undefined)) {\n _context10.next = 40;\n break;\n }\n this.options.position.alt = Number(Number(height).toFixed(2));\n this.renewPoint();\n this.coordinate = this.options.coordinate;\n return _context10.abrupt(\"return\", true);\n case 40:\n case \"end\":\n return _context10.stop();\n }\n }, _callee6, this, [[25, 31]]);\n }));\n function updateHeight() {\n return _updateHeight.apply(this, arguments);\n }\n return updateHeight;\n }()\n }, {\n key: \"flyTo\",\n value: function () {\n var _flyTo = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_9___default.a.mark(function _callee7() {\n var options,\n orientation,\n lng,\n lat,\n alt,\n destination,\n position,\n objectsToExclude,\n _iterator9,\n _step9,\n _step9$value,\n key,\n value,\n _objectsToExclude2,\n _iterator10,\n _step10,\n _step10$value,\n _key2,\n _value2,\n height,\n _args11 = arguments;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_9___default.a.wrap(function _callee7$(_context11) {\n while (1) switch (_context11.prev = _context11.next) {\n case 0:\n options = _args11.length > 0 && _args11[0] !== undefined ? _args11[0] : {};\n Object(_Global_global__WEBPACK_IMPORTED_MODULE_23__[\"setActiveViewer\"])(0);\n Object(_Global_global__WEBPACK_IMPORTED_MODULE_23__[\"closeRotateAround\"])(this.sdk);\n Object(_Global_global__WEBPACK_IMPORTED_MODULE_23__[\"closeViewFollow\"])(this.sdk);\n if (!(this.options.customView && this.options.customView.relativePosition && this.options.customView.orientation)) {\n _context11.next = 26;\n break;\n }\n orientation = {\n heading: Cesium.Math.toRadians(this.options.customView.orientation.heading || 0.0),\n pitch: Cesium.Math.toRadians(this.options.customView.orientation.pitch || -60.0),\n roll: Cesium.Math.toRadians(this.options.customView.orientation.roll || 0.0)\n };\n lng = this.options.customView.relativePosition.lng;\n lat = this.options.customView.relativePosition.lat;\n alt = this.options.customView.relativePosition.alt;\n destination = Cesium.Cartesian3.fromDegrees(lng, lat, alt);\n position = {\n lng: 0,\n lat: 0\n };\n if (this.options.position) {\n position = _objectSpread({}, this.options.position);\n } else if (this.options.position) {\n position = _objectSpread({}, this.options.position);\n } else if (this.options.center) {\n position = _objectSpread({}, this.options.center);\n } else if (this.options.start) {\n position = _objectSpread({}, this.options.start);\n } else {\n if (this.options.hasOwnProperty('lng')) {\n position.lng = this.options.lng;\n }\n if (this.options.hasOwnProperty('lat')) {\n position.lat = this.options.lat;\n }\n if (this.options.hasOwnProperty('alt')) {\n position.alt = this.options.alt;\n }\n }\n // 如果没有高度值,则获取紧贴高度计算\n if (position.hasOwnProperty('alt')) {\n _context11.next = 19;\n break;\n }\n objectsToExclude = [];\n _iterator9 = _createForOfIteratorHelper(this.sdk.entityMap);\n try {\n for (_iterator9.s(); !(_step9 = _iterator9.n()).done;) {\n _step9$value = _babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_2___default()(_step9.value, 2), key = _step9$value[0], value = _step9$value[1];\n if (value.type === 'RadarScanStereoscopic' && value.entity) {\n objectsToExclude.push(value.entity);\n }\n }\n } catch (err) {\n _iterator9.e(err);\n } finally {\n _iterator9.f();\n }\n _context11.next = 18;\n return this.getClampToHeight(position, objectsToExclude);\n case 18:\n position.alt = _context11.sent;\n case 19:\n lng = this.options.customView.relativePosition.lng + position.lng;\n lat = this.options.customView.relativePosition.lat + position.lat;\n alt = this.options.customView.relativePosition.alt + position.alt;\n destination = Cesium.Cartesian3.fromDegrees(lng, lat, alt);\n this.sdk.viewer.camera.flyTo({\n destination: destination,\n orientation: orientation\n });\n _context11.next = 33;\n break;\n case 26:\n _objectsToExclude2 = [];\n _iterator10 = _createForOfIteratorHelper(this.sdk.entityMap);\n try {\n for (_iterator10.s(); !(_step10 = _iterator10.n()).done;) {\n _step10$value = _babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_2___default()(_step10.value, 2), _key2 = _step10$value[0], _value2 = _step10$value[1];\n if (_value2.type === 'RadarScanStereoscopic' && _value2.entity) {\n _objectsToExclude2.push(_value2.entity);\n }\n }\n } catch (err) {\n _iterator10.e(err);\n } finally {\n _iterator10.f();\n }\n _context11.next = 31;\n return this.getClampToHeight(this.options.position, _objectsToExclude2);\n case 31:\n height = _context11.sent;\n this.sdk.viewer.camera.flyTo({\n orientation: options.orientation,\n destination: Cesium.Cartesian3.fromDegrees(this.options.position.lng, this.options.position.lat, height + (options.height || 500))\n });\n case 33:\n case \"end\":\n return _context11.stop();\n }\n }, _callee7, this);\n }));\n function flyTo() {\n return _flyTo.apply(this, arguments);\n }\n return flyTo;\n }()\n }, {\n key: \"setPosition\",\n value: function setPosition(v) {\n this.options.position.lng = v.position.lng;\n this.options.position.lat = v.position.lat;\n this.options.position.alt = v.position.alt;\n this.renewPoint();\n }\n\n /**@desc 打开平移功能\r\n *\r\n * @memberOf Source\r\n * @param status {boolean}\r\n *\r\n * */\n }, {\n key: \"positionEditing\",\n get: function get() {\n return this.operate.positionEditing;\n },\n set: function set(status) {\n var _this8 = this;\n if (!this.sdk || !this.sdk.viewer || !this.entity) {\n return;\n }\n this.operate.positionEditing = status;\n this.event && this.event.destroy();\n this.event = new _Event_index__WEBPACK_IMPORTED_MODULE_18__[\"default\"](this.sdk);\n if (status === true) {\n this.picking = false;\n this.tip && this.tip.destroy();\n this.tip = new _MouseTip__WEBPACK_IMPORTED_MODULE_27__[\"default\"]('点击鼠标左键确认,右键取消', this.sdk);\n this.previous = {\n position: _objectSpread({}, this.options.position)\n };\n var moveEvent = function moveEvent(movement, cartesian) {\n _this8.entity.position = new Cesium.CallbackProperty(function () {\n return cartesian;\n }, false);\n _this8.tip.setPosition(cartesian, movement.endPosition.x, movement.endPosition.y);\n };\n var leftEvent = function leftEvent(movement, cartesian) {\n var positions = _this8.cartesian3Towgs84(cartesian, _this8.sdk.viewer);\n _this8.lng = positions.lng;\n _this8.lat = positions.lat;\n _this8.alt = positions.alt;\n _this8.previous = {\n position: _objectSpread({}, _this8.options.position)\n };\n _this8.event.mouse_move(function () {});\n _this8.event.mouse_left(function () {});\n _this8.event.mouse_right(function () {});\n _this8.event.gesture_pinck_start(function () {});\n _this8.event.gesture_pinck_end(function () {});\n _this8.entity.position = new Cesium.CallbackProperty(function () {\n return cartesian;\n }, false);\n if (_classPrivateFieldGet(_positionEditingCallback, _this8)) {\n _classPrivateFieldGet(_positionEditingCallback, _this8).call(_this8);\n _classPrivateFieldSet(_positionEditingCallback, _this8, null);\n }\n _this8.positionEditing = false;\n };\n this.event.mouse_move(moveEvent);\n this.event.mouse_left(leftEvent);\n this.event.mouse_right(function (movement, cartesian) {\n _this8.positionEditing = false;\n });\n this.event.gesture_pinck_start(function (movement, cartesian) {\n var startTime = new Date();\n _this8.event.gesture_pinck_end(function () {\n var endTime = new Date();\n var pos = {\n position: {\n x: (movement.position1.x + movement.position2.x) / 2,\n y: (movement.position1.y + movement.position2.y) / 2\n }\n };\n if (endTime - startTime >= 500) {\n // 长按取消\n _this8.positionEditing = false;\n } else {\n leftEvent(pos, cartesian);\n }\n });\n });\n } else {\n _classPrivateFieldSet(_positionEditingCallback, this, null);\n this.picking = true;\n if (this.event) {\n this.event.mouse_move(function () {});\n this.event.mouse_left(function () {});\n this.event.mouse_right(function () {});\n this.event.gesture_pinck_start(function () {});\n this.event.gesture_pinck_end(function () {});\n this.event.destroy();\n this.event = null;\n }\n this.tip && this.tip.destroy();\n this.lng = this.previous.position.lng;\n this.lat = this.previous.position.lat;\n this.alt = this.previous.position.alt;\n this.renewPoint();\n }\n }\n }, {\n key: \"openPositionEditing\",\n value: function openPositionEditing(cd) {\n this.positionEditing = true;\n _classPrivateFieldSet(_positionEditingCallback, this, cd);\n }\n }, {\n key: \"setDIV\",\n value: function setDIV() {\n var _this9 = this;\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {\n domid: '',\n x: 10,\n y: 10\n };\n options.x = options.x || options.x === 0 ? options.x : 10;\n options.y = options.y || options.y === 0 ? options.y : 10;\n var siteInfoDom = document.getElementById(options.domid);\n var siteInfoPosition = Cesium.Cartesian3.fromDegrees(this.options.position.lng, this.options.position.lat);\n this.sdk.viewer.scene.postRender.addEventListener(function (percentage) {\n //转换到屏幕坐标\n if (siteInfoDom.style.display === 'block' || siteInfoDom.style.display === '') {\n var winpos = _this9.sdk.viewer.scene.cartesianToCanvasCoordinates(siteInfoPosition);\n if (winpos) {\n siteInfoDom.style.left = (winpos.x + options.x).toFixed(0) + 'px';\n siteInfoDom.style.top = (winpos.y + options.y).toFixed(0) + 'px';\n }\n }\n });\n }\n }, {\n key: \"setCustomView\",\n value: function () {\n var _setCustomView = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_9___default.a.mark(function _callee8(val) {\n var camera, cameraPosition84, position, relativePosition, objectsToExclude, _iterator11, _step11, _step11$value, key, value;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_9___default.a.wrap(function _callee8$(_context12) {\n while (1) switch (_context12.prev = _context12.next) {\n case 0:\n if (!val) {\n _context12.next = 4;\n break;\n }\n this.options.customView = val;\n _context12.next = 19;\n break;\n case 4:\n camera = this.sdk.viewer.camera;\n cameraPosition84 = this.cartesian3Towgs84(camera.position, this.sdk.viewer);\n position = {\n lng: 0,\n lat: 0\n };\n relativePosition = _objectSpread({}, cameraPosition84);\n if (this.options.position) {\n position = _objectSpread({}, this.options.position);\n } else {\n if (this.options.hasOwnProperty('lng')) {\n position.lng = this.options.lng;\n }\n if (this.options.hasOwnProperty('lat')) {\n position.lat = this.options.lat;\n }\n if (this.options.hasOwnProperty('alt')) {\n position.alt = this.options.alt;\n }\n }\n // 如果没有高度值,则获取紧贴高度计算\n if (position.hasOwnProperty('alt')) {\n _context12.next = 16;\n break;\n }\n objectsToExclude = [];\n _iterator11 = _createForOfIteratorHelper(this.sdk.entityMap);\n try {\n for (_iterator11.s(); !(_step11 = _iterator11.n()).done;) {\n _step11$value = _babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_2___default()(_step11.value, 2), key = _step11$value[0], value = _step11$value[1];\n if (value.type === 'RadarScanStereoscopic' && value.entity) {\n objectsToExclude.push(value.entity);\n }\n }\n } catch (err) {\n _iterator11.e(err);\n } finally {\n _iterator11.f();\n }\n _context12.next = 15;\n return this.getClampToHeight(position, objectsToExclude);\n case 15:\n position.alt = _context12.sent;\n case 16:\n relativePosition = {\n lng: cameraPosition84.lng - position.lng,\n lat: cameraPosition84.lat - position.lat,\n alt: cameraPosition84.alt - position.alt\n };\n this.options.customView = {\n orientation: {\n heading: Cesium.Math.toDegrees(camera.heading),\n pitch: Cesium.Math.toDegrees(camera.pitch),\n roll: Cesium.Math.toDegrees(camera.roll)\n },\n relativePosition: relativePosition\n };\n this.originalOptions && (this.originalOptions.customView = this.options.customView);\n case 19:\n case \"end\":\n return _context12.stop();\n }\n }, _callee8, this);\n }));\n function setCustomView(_x3) {\n return _setCustomView.apply(this, arguments);\n }\n return setCustomView;\n }()\n }], [{\n key: \"create\",\n value: function create(that) {\n var canvas;\n var billboardH = 36;\n var heightMode;\n var position = that.options.position;\n that.originalOptions = that.deepCopyObj(that.options);\n var isGlf = false;\n var superGif;\n var index = 0;\n var font = Object(_Element_fontSelect__WEBPACK_IMPORTED_MODULE_26__[\"getFontFamily\"])(that.labelFontFamily) || 'Helvetica';\n var url = that.replaceHost(that.options.billboard.image, that.options.host);\n that._frameImages = [];\n if (url && url.endsWith('gif')) {\n isGlf = true;\n switch (that.options.heightMode) {\n case 2:\n case '2':\n heightMode = Cesium.HeightReference.CLAMP_TO_GROUND;\n break;\n }\n var gifImg = document.createElement('img');\n gifImg.setAttribute('rel:animated_src', url);\n gifImg.setAttribute('rel:auto_play', '1');\n var imgDiv = document.createElement('div');\n imgDiv.appendChild(gifImg);\n var id = Cesium.createGuid();\n superGif = new SuperGif({\n gif: gifImg\n });\n that._superGif = superGif;\n that._superGif.id = id; // 自定义id,用于判断gif实例是否改变\n\n superGif.load(function (status) {\n if (status == 404) {\n canvas = document.createElement('canvas');\n canvas.width = 0;\n canvas.height = 0;\n billboardH = 0;\n if (that.entity) {\n that.entity.billboard.imgWidth = 0;\n that.entity.billboard.imgHeight = 0;\n that.entity.billboard.image = canvas;\n Object(_Global_cluster_cluster__WEBPACK_IMPORTED_MODULE_19__[\"addCluster\"])(that.sdk, that.entity);\n }\n return;\n }\n if (that._superGif.id != id) {\n return;\n }\n var length = superGif.get_length();\n for (var i = 1; i <= length; i++) {\n superGif.move_to(i);\n that._frameImages.push(superGif.get_canvas().toDataURL());\n }\n canvas = superGif.get_canvas();\n var width = canvas.width;\n var height = canvas.height;\n billboardH = height * (31 / width);\n if (that.entity) {\n that.entity.billboard.imgWidth = width;\n that.entity.billboard.imgHeight = height;\n that.entity.billboard.image = new Cesium.CallbackProperty(function () {\n var img = that._frameImages[index];\n index = index >= that._frameImages.length - 1 ? 0 : index + 1;\n return img;\n }, false);\n Object(_Global_cluster_cluster__WEBPACK_IMPORTED_MODULE_19__[\"addCluster\"])(that.sdk, that.entity);\n }\n });\n } else {\n var image = new Image();\n image.src = url || that.getSourceRootPath() + '/img/A-ablu-blank.png';\n switch (that.options.heightMode) {\n case 2:\n case '2':\n heightMode = Cesium.HeightReference.CLAMP_TO_GROUND;\n break;\n }\n canvas = document.createElement('canvas');\n image.onload = function () {\n var ratio = image.width / image.height;\n image.width = 100;\n image.height = 100 / ratio;\n var width = image.width;\n var height = image.height;\n var ctx = canvas.getContext('2d', {\n willReadFrequently: true\n });\n canvas.width = width;\n canvas.height = height;\n ctx.drawImage(image, 0, 0, width, height);\n billboardH = height * (31 / width);\n if (that.entity) {\n that.entity.billboard.imgWidth = width;\n that.entity.billboard.imgHeight = height;\n that.entity.billboard.image = canvas;\n Object(_Global_cluster_cluster__WEBPACK_IMPORTED_MODULE_19__[\"addCluster\"])(that.sdk, that.entity);\n }\n };\n image.onerror = function (err) {\n canvas.width = 0;\n canvas.height = 0;\n billboardH = 0;\n if (that.entity) {\n that.entity.billboard.imgWidth = 0;\n that.entity.billboard.imgHeight = 0;\n that.entity.billboard.image = canvas;\n Object(_Global_cluster_cluster__WEBPACK_IMPORTED_MODULE_19__[\"addCluster\"])(that.sdk, that.entity);\n }\n };\n }\n that.entity = new Cesium.Entity({\n show: that.options.show,\n id: that.options.id,\n position: Cesium.Cartesian3.fromDegrees(position.lng, position.lat, position.alt),\n billboard: {\n image: isGlf ? new Cesium.CallbackProperty(function () {\n var img = that._frameImages[index];\n index = index >= that._frameImages.length - 1 ? 0 : index + 1;\n return img;\n }, false) : canvas,\n scale: that.options.billboard.scale,\n disableDepthTestDistance: new Cesium.CallbackProperty(function () {\n return Object(_Global_global__WEBPACK_IMPORTED_MODULE_23__[\"getGroundCover\"])() ? undefined : Number.POSITIVE_INFINITY;\n }, false),\n heightReference: heightMode,\n color: that.options.billboard.show ? undefined : new Cesium.Color(1.0, 1.0, 1.0, 0),\n width: 31,\n height: new Cesium.CallbackProperty(function () {\n return billboardH;\n }, false),\n verticalOrigin: Cesium.VerticalOrigin.BOTTOM\n // pixelOffset: new Cesium.CallbackProperty(function () {\n // return new Cesium.Cartesian2(\n // 0,\n // -(billboardH / 2) * that.options.billboard.scale\n // )\n // }, false)\n },\n label: {\n show: that.options.label.show,\n text: that.options.label.text,\n disableDepthTestDistance: new Cesium.CallbackProperty(function () {\n return Object(_Global_global__WEBPACK_IMPORTED_MODULE_23__[\"getGroundCover\"])() ? undefined : Number.POSITIVE_INFINITY;\n }, false),\n heightReference: heightMode,\n font: that.options.label.fontSize + 'px ' + font,\n fillColor: Cesium.Color.fromCssColorString(that.options.label.color),\n // verticalOrigin : Cesium.VerticalOrigin.BOTTOM,\n pixelOffset: new Cesium.CallbackProperty(function () {\n if (that.options.billboard.show) {\n return new Cesium.Cartesian2(0, -billboardH * that.options.billboard.scale - that.options.label.fontSize / 2 - 5);\n } else {\n return new Cesium.Cartesian2(0, -that.options.label.fontSize / 2 - 5);\n }\n }, false),\n outlineColor: Cesium.Color.BLACK,\n outlineWidth: 1,\n style: Cesium.LabelStyle.FILL_AND_OUTLINE\n }\n });\n that.entity.billboard.imgWidth = 31;\n that.entity.billboard.imgHeight = 36;\n that.entity.position = Cesium.Cartesian3.fromDegrees(position.lng, position.lat, position.alt);\n if (that.options.heightMode == 3) {\n that.updateHeight();\n }\n that.renewPoint();\n // that.diffuseShow = that.options.diffuseShow\n // that.scanShow = that.options.scanShow\n Object(_Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_22__[\"syncData\"])(that.sdk, that.options.id);\n if (that.options.show) {\n Object(_Global_SplitScreen__WEBPACK_IMPORTED_MODULE_28__[\"setSplitDirection\"])(0, that.options.id);\n }\n if (that.options.billboard.isSelect) {\n that.selectBillboard();\n }\n }\n }]);\n}(_index__WEBPACK_IMPORTED_MODULE_17__[\"default\"]);\n/* harmony default export */ __webpack_exports__[\"default\"] = (BillboardObject);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvT2JqL0Jhc2UvQmlsbGJvYXJkT2JqZWN0L2luZGV4LmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL09iai9CYXNlL0JpbGxib2FyZE9iamVjdC9pbmRleC5qcz9hNTRmIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiDngrlcclxuICovXHJcbmltcG9ydCB7IGdldEhvc3QsIGdldFRva2VuIH0gZnJvbSBcIi4uLy4uLy4uL29uXCI7XHJcbmltcG9ydCBEaWFsb2cgZnJvbSAnLi4vLi4vRWxlbWVudC9EaWFsb2cnXHJcbmltcG9ydCBFdmVudEJpbmRpbmcgZnJvbSAnLi4vLi4vRWxlbWVudC9EaWFsb2cvZXZlbnRCaW5kaW5nJ1xyXG5pbXBvcnQgY3lfc2xpZGVyIGZyb20gJy4uLy4uL0VsZW1lbnQvY3lfaHRtbF9zbGlkZXInXHJcbmltcG9ydCBjeV90YWJzIGZyb20gJy4uLy4uL0VsZW1lbnQvY3lfaHRtbF90YWJzJ1xyXG5pbXBvcnQgcmljaFRleHQgZnJvbSAnLi4vLi4vRWxlbWVudC9yaWNoVGV4dCdcclxuaW1wb3J0IHsgaHRtbCB9IGZyb20gJy4vX2VsZW1lbnQnXHJcbmltcG9ydCBCYXNlIGZyb20gJy4uL2luZGV4J1xyXG5pbXBvcnQgTW91c2VFdmVudCBmcm9tICcuLi8uLi8uLi9FdmVudC9pbmRleCdcclxuaW1wb3J0IHtcclxuICBhZGRDbHVzdGVyLFxyXG4gIHJlbW92ZV9lbnRpdHlfZnJvbV9jbHVzdGVyXHJcbn0gZnJvbSAnLi4vLi4vLi4vR2xvYmFsL2NsdXN0ZXIvY2x1c3RlcidcclxuaW1wb3J0IENpcmNsZURpZmZ1c2UgZnJvbSAnLi4vQ2lyY2xlRGlmZnVzZSdcclxuaW1wb3J0IFJhZGFyU2NhbiBmcm9tICcuLi9SYWRhclNjYW4nXHJcbmltcG9ydCB7IHN5bmNEYXRhIH0gZnJvbSAnLi4vLi4vLi4vR2xvYmFsL011bHRpVmlld3BvcnRNb2RlJ1xyXG5pbXBvcnQge1xyXG4gIGdldEJpbGxib2FyZERlZmF1bHRVcmwsXHJcbiAgc2V0QmlsbGJvYXJkRGVmYXVsdFVybCxcclxuICBnZXRHcm91bmRDb3ZlclxyXG59IGZyb20gJy4uLy4uLy4uL0dsb2JhbC9nbG9iYWwnXHJcbmltcG9ydCB7IFByb2ogfSBmcm9tICcuLi8uLi8uLi9Ub29scy9wcm9qJ1xyXG5pbXBvcnQgeyBsZWdwIH0gZnJvbSAnLi4vLi4vRWxlbWVudC9kYXRhbGlzdCdcclxuaW1wb3J0IHsgZ2V0Rm9udExpc3QsIGdldEZvbnRGYW1pbHksIGdldEZvbnRGYW1pbHlOYW1lIH0gZnJvbSAnLi4vLi4vRWxlbWVudC9mb250U2VsZWN0J1xyXG5pbXBvcnQgTW91c2VUaXAgZnJvbSAnLi4vLi4vLi4vTW91c2VUaXAnXHJcbmltcG9ydCB7XHJcbiAgc2V0U3BsaXREaXJlY3Rpb24sXHJcbiAgc3luY1NwbGl0RGF0YSxcclxuICBzZXRBY3RpdmVJZCxcclxuICBnZXRTdGF0ZVxyXG59IGZyb20gJy4uLy4uLy4uL0dsb2JhbC9TcGxpdFNjcmVlbidcclxuaW1wb3J0IHtcclxuICBzZXRBY3RpdmVWaWV3ZXIsXHJcbiAgY2xvc2VSb3RhdGVBcm91bmQsXHJcbiAgY2xvc2VWaWV3Rm9sbG93XHJcbn0gZnJvbSAnLi4vLi4vLi4vR2xvYmFsL2dsb2JhbCdcclxuXHJcbmltcG9ydCB7IGdldEdvb2RzTGlzdCB9IGZyb20gJy4uLy4uLy4uL1Rvb2xzL2dldEdvb2RzTGlzdCdcclxuXHJcbmNsYXNzIEJpbGxib2FyZE9iamVjdCBleHRlbmRzIEJhc2Uge1xyXG4gICNfcG9zaXRpb25FZGl0aW5nQ2FsbGJhY2sgPSBudWxsXHJcbiAgLyoqXHJcbiAgICogQGNvbnN0cnVjdG9yXHJcbiAgICogQGRlc2NyaXB0aW9uIOeCueagh+azqFxyXG4gICAqIEBwYXJhbSBvcHRpb25zIHtvYmplY3R9IOWxnuaAp1xyXG4gICAqIEBwYXJhbSBvcHRpb25zLmlkIHtzdHJpbmd9IOagh+azqGlkXHJcbiAgICogQHBhcmFtIG9wdGlvbnMuc2hvdz10cnVlIHtib29sZWFufSDmoIfms6jmlbTkvZPnmoTmmL7pmpBcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5uYW1lIHtzdHJpbmd9IOWQjeensFxyXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zLnBvc2l0aW9uPXt9IOW/heWhq++8jOS9jee9rlxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvcHRpb25zLnBvc2l0aW9uLmxuZyDnu4/luqZcclxuICAgKiBAcGFyYW0ge251bWJlcn0gb3B0aW9ucy5wb3NpdGlvbi5sYXQg57qs5bqmXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9wdGlvbnMucG9zaXRpb24uYWx0IOmrmOW6plxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvcHRpb25zLmhlaWdodE1vZGU9MyDpq5jluqbmqKHlvI/vvIgw77ya5rW35ouU6auY5bqm77ybMe+8muebuOWvueWcsOihqO+8mzLvvJrkvp3pmYTlnLDooag7IDPvvJrkvp3pmYTmqKHlnovvvIlcclxuICAgKiBAcGFyYW0gW29wdGlvbnMuc2NhbGVCeURpc3RhbmNlPXRydWVdIHtib29sZWFufSDmmK/lkKblvIDlkK/ot5/pmo/op4bph47nvKnmlL5cclxuICAgKiBAcGFyYW0gW29wdGlvbnMubmVhcj0yMDAwXSB7bnVtYmVyfSDop4bph47nvKnmlL7mnIDov5Hot53nprtcclxuICAgKiBAcGFyYW0gW29wdGlvbnMuZmFyPTEwMDAwMF0gIHtudW1iZXJ9IOinhumHjue8qeaUvuacgOi/nOi3neemu1xyXG4gICAqIEBwYXJhbSBvcHRpb25zLmJpbGxib2FyZCB7b2JqZWN0fSDlm77moIflj4LmlbBcclxuICAgKiBAcGFyYW0gW29wdGlvbnMuYmlsbGJvYXJkLnNob3c9dHJ1ZV0ge2Jvb2xlYW59IOWbvuagh+aYvumakFxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmJpbGxib2FyZC5pbWFnZSB7c3RyaW5nfSDlm77moIfot6/lvoRcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5iaWxsYm9hcmQuZGVmYXVsdEltYWdlIHtzdHJpbmd9IOm7mOiupOWbvuagh+eahOWUr+S4gOagh+ivhlxyXG4gICAqIEBwYXJhbSBbb3B0aW9ucy5iaWxsYm9hcmQuc2NhbGU9M10ge251bWJlcn0g5Zu+5qCH5pS+5aSn5YCN5pWwXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwge29iamVjdH0g5paH5a2X5Y+C5pWwXHJcbiAgICogQHBhcmFtIFtvcHRpb25zLmxhYmVsLnRleHRdIHtzdHJpbmd9IOaWh+Wtl+WGheWuuVxyXG4gICAqIEBwYXJhbSBbb3B0aW9ucy5sYWJlbC5zaG93PXRydWVdIHtib29sZWFufSDmloflrZfmmL7pmpBcclxuICAgKiBAcGFyYW0gW29wdGlvbnMubGFiZWwuZm9udEZhbWlseT0wXSB7bnVtYmVyfSDmloflrZflrZfkvZPpobkgMO+8mum7keS9k++8mzHvvJrmgJ3mupDpu5HkvZPvvJsy77ya5bqe6Zeo5q2j6YGT5qCH6aKY5L2T77ybM++8muaVsOm7keS9k1xyXG4gICAqIEBwYXJhbSBbb3B0aW9ucy5sYWJlbC5mb250U2l6ZT0zOV0ge251bWJlcn0g5paH5a2X5aSn5bCPLCDljZXkvY1weFxyXG4gICAqIEBwYXJhbSBbb3B0aW9ucy5sYWJlbC5jb2xvcj0jMDBmZmZmXSB7c3RyaW5nfSDmloflrZfpopzoibJcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5hdHRyaWJ1dGUge29iamVjdH0g5bGe5oCn5YaF5a65XHJcbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMuYXR0cmlidXRlLmxpbms9e30gIOmTvuaOpVxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnQ9W11dIHthcnJheX0g6ZO+5o6l5YaF5a65XHJcbiAgICogQHBhcmFtIG9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudFtdLm5hbWUge3N0cmluZ30g6ZO+5o6l5ZCN56ewXHJcbiAgICogQHBhcmFtIG9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudFtdLnVybCB7c3RyaW5nfSDpk77mjqXlnLDlnYBcclxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucy5hdHRyaWJ1dGUudnI9e30g5YWo5pmv5Zu+XHJcbiAgICogQHBhcmFtIG9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnQ9W11dIHthcnJheX0g5YWo5pmv5Zu+5YaF5a65XHJcbiAgICogQHBhcmFtIG9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnRbXS5uYW1lIHtzdHJpbmd9IOWQjeensFxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmF0dHJpYnV0ZS52ci5jb250ZW50W10udXJsIHtzdHJpbmd9IOWcsOWdgFxyXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBwdGlvbnMuYXR0cmlidXRlLmNhbWVyYT17fSDmkYTlg4/lpLRcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5hdHRyaWJ1dGUuY2FtZXJhLmNvbnRlbnQ9W11dIHthcnJheX0g5pGE5YOP5aS05YaF5a65XHJcbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMuYXR0cmlidXRlLmlzYz17fSBpc2NcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5hdHRyaWJ1dGUuaXNjLmNvbnRlbnQ9W11dIHthcnJheX0gSVND5YaF5a65XHJcbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMuYXR0cmlidXRlLmdvb2RzPXt9IOeJqei1hFxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmF0dHJpYnV0ZS5nb29kcy5jb250ZW50PVtdXSB7YXJyYXl9IOeJqei1hOWGheWuuVxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmF0dHJpYnV0ZS5nb29kcy5jb250ZW50W10uSUQge3N0cmluZ30gSURcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5hdHRyaWJ1dGUuZ29vZHMuY29udGVudFtdLm5hbWUge3N0cmluZ30g5ZCN56ewXHJcbiAgICogQHBhcmFtIG9wdGlvbnMuYXR0cmlidXRlLmdvb2RzLmNvbnRlbnRbXS5jbnQge3N0cmluZ30g5pWw6YePXHJcbiAgICogQHBhcmFtIG9wdGlvbnMucmljaFRleHRDb250ZW50IHtzdHJpbmd9IOWvjOaWh+acrOWGheWuuVxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmN1c3RvbVZpZXcge29iamVjdH0g6buY6K6k6KeG6KeSXHJcbiAgICogQHBhcmFtIG9wdGlvbnMuY3VzdG9tVmlldy5vcmllbnRhdGlvbiB7b2JqZWN0fSDpu5jorqTop4bop5LmlrnkvY1cclxuICAgKiBAcGFyYW0gb3B0aW9ucy5jdXN0b21WaWV3Lm9yaWVudGF0aW9uLmhlYWRpbmcge251bWJlcn0g6Iiq5ZCR6KeSXHJcbiAgICogQHBhcmFtIG9wdGlvbnMuY3VzdG9tVmlldy5vcmllbnRhdGlvbi5waXRjaCB7bnVtYmVyfSDkv6/ku7Dop5JcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5jdXN0b21WaWV3Lm9yaWVudGF0aW9uLnJvbGwge251bWJlcn0g57+75rua6KeSXHJcbiAgICogQHBhcmFtIG9wdGlvbnMuY3VzdG9tVmlldy5yZWxhdGl2ZVBvc2l0aW9uIHtvYmplY3R9IOinhuinkuebuOWvueS9jee9rlxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmN1c3RvbVZpZXcucmVsYXRpdmVQb3NpdGlvbi5sbmcge251bWJlcn0g57uP5bqmXHJcbiAgICogQHBhcmFtIG9wdGlvbnMuY3VzdG9tVmlldy5yZWxhdGl2ZVBvc2l0aW9uLmxhdCB7bnVtYmVyfSDnuqzluqZcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5jdXN0b21WaWV3LnJlbGF0aXZlUG9zaXRpb24uYWx0IHtudW1iZXJ9IOmrmOW6plxyXG4gICAqIFxyXG5cclxuXHJcblxyXG5cclxuXHJcbiAgICpAcGFyYW0gX0RpYWxvZyB7b2JqZWN0fSDlvLnmoYbkuovku7ZcclxuICAgKkBwYXJhbSBfRGlhbG9nLmNvbmZpcm1DYWxsQmFjayB7ZnVuY3Rpb259IOW8ueahhuehruiupOaXtueahOWbnuiwg1xyXG4gICAqICovXHJcbiAgY29uc3RydWN0b3Ioc2RrLCBvcHRpb25zID0ge30sIF9EaWFsb2cgPSB7fSkge1xyXG4gICAgc3VwZXIoc2RrLCBvcHRpb25zKVxyXG4gICAgdGhpcy5vcHRpb25zLm5lYXIgPSBvcHRpb25zLm5lYXIgfHwgb3B0aW9ucy5uZWFyID09PSAwID8gb3B0aW9ucy5uZWFyIDogMjAwMFxyXG4gICAgdGhpcy5vcHRpb25zLmZhciA9IG9wdGlvbnMuZmFyIHx8IG9wdGlvbnMuZmFyID09PSAwID8gb3B0aW9ucy5mYXIgOiAxMDAwMDBcclxuICAgIHRoaXMub3B0aW9ucy5zY2FsZUJ5RGlzdGFuY2UgPVxyXG4gICAgICBvcHRpb25zLnNjYWxlQnlEaXN0YW5jZSB8fCBvcHRpb25zLnNjYWxlQnlEaXN0YW5jZSA9PT0gZmFsc2VcclxuICAgICAgICA/IG9wdGlvbnMuc2NhbGVCeURpc3RhbmNlXHJcbiAgICAgICAgOiB0cnVlXHJcbiAgICB0aGlzLm9wdGlvbnMuc2hvdyA9XHJcbiAgICAgIG9wdGlvbnMuc2hvdyB8fCBvcHRpb25zLnNob3cgPT09IGZhbHNlID8gb3B0aW9ucy5zaG93IDogdHJ1ZVxyXG4gICAgdGhpcy5vcHRpb25zLmhlaWdodE1vZGUgPVxyXG4gICAgICBvcHRpb25zLmhlaWdodE1vZGUgfHwgb3B0aW9ucy5oZWlnaHRNb2RlID09IDAgPyBvcHRpb25zLmhlaWdodE1vZGUgOiAzXHJcbiAgICB0aGlzLm9wdGlvbnMuYmlsbGJvYXJkID0gb3B0aW9ucy5iaWxsYm9hcmQgPSBvcHRpb25zLmJpbGxib2FyZCB8fCB7fVxyXG4gICAgLy8gdGhpcy5vcHRpb25zLmJpbGxib2FyZC5pc1NlbGVjdCA9IG9wdGlvbnMuYmlsbGJvYXJkLmlzU2VsZWN0IHx8IGZhbHNlXHJcbiAgICB0aGlzLm9wdGlvbnMuYmlsbGJvYXJkLnNob3cgPVxyXG4gICAgICBvcHRpb25zLmJpbGxib2FyZC5zaG93IHx8IG9wdGlvbnMuYmlsbGJvYXJkLnNob3cgPT09IGZhbHNlXHJcbiAgICAgICAgPyBvcHRpb25zLmJpbGxib2FyZC5zaG93XHJcbiAgICAgICAgOiB0cnVlXHJcbiAgICB0aGlzLm9wdGlvbnMuYmlsbGJvYXJkLmltYWdlID1cclxuICAgICAgb3B0aW9ucy5iaWxsYm9hcmQuaW1hZ2UgfHxcclxuICAgICAgZ2V0QmlsbGJvYXJkRGVmYXVsdFVybChvcHRpb25zLmJpbGxib2FyZC5kZWZhdWx0SW1hZ2UpIHx8IHRoaXMuZ2V0U291cmNlUm9vdFBhdGgoKSArICcvaW1nL0EtYWJsdS1ibGFuay5wbmcnXHJcbiAgICB0aGlzLm9wdGlvbnMuYmlsbGJvYXJkLmRlZmF1bHRJbWFnZSA9IG9wdGlvbnMuYmlsbGJvYXJkLmRlZmF1bHRJbWFnZVxyXG4gICAgdGhpcy5vcHRpb25zLmJpbGxib2FyZC5zY2FsZSA9XHJcbiAgICAgIG9wdGlvbnMuYmlsbGJvYXJkLnNjYWxlIHx8IG9wdGlvbnMuYmlsbGJvYXJkLnNjYWxlID09PSAwXHJcbiAgICAgICAgPyBvcHRpb25zLmJpbGxib2FyZC5zY2FsZVxyXG4gICAgICAgIDogM1xyXG4gICAgb3B0aW9ucy5sYWJlbCA9IG9wdGlvbnMubGFiZWwgfHwge31cclxuICAgIHRoaXMub3B0aW9ucy5sYWJlbCA9IG9wdGlvbnMubGFiZWwgfHwge31cclxuICAgIHRoaXMub3B0aW9ucy5sYWJlbC50ZXh0ID0gb3B0aW9ucy5sYWJlbC50ZXh0IHx8IHRoaXMub3B0aW9ucy5uYW1lXHJcbiAgICB0aGlzLm9wdGlvbnMubmFtZSA9IHRoaXMub3B0aW9ucy5sYWJlbC50ZXh0XHJcbiAgICB0aGlzLm9wdGlvbnMubGFiZWwuc2hvdyA9XHJcbiAgICAgIG9wdGlvbnMubGFiZWwuc2hvdyB8fCBvcHRpb25zLmxhYmVsLnNob3cgPT09IGZhbHNlXHJcbiAgICAgICAgPyBvcHRpb25zLmxhYmVsLnNob3dcclxuICAgICAgICA6IHRydWVcclxuICAgIHRoaXMub3B0aW9ucy5sYWJlbC5mb250RmFtaWx5ID0gb3B0aW9ucy5sYWJlbC5mb250RmFtaWx5IHx8IDBcclxuICAgIHRoaXMub3B0aW9ucy5sYWJlbC5mb250U2l6ZSA9IG9wdGlvbnMubGFiZWwuZm9udFNpemUgfHwgMzlcclxuICAgIHRoaXMub3B0aW9ucy5sYWJlbC5jb2xvciA9IG9wdGlvbnMubGFiZWwuY29sb3IgfHwgJyMwMGZmZmYnXHJcbiAgICB0aGlzLm9wdGlvbnMucG9zaXRpb24gPSBvcHRpb25zLnBvc2l0aW9uID0gb3B0aW9ucy5wb3NpdGlvbiB8fCB7fVxyXG4gICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uLmxuZyA9IE51bWJlcihcclxuICAgICAgTnVtYmVyKG9wdGlvbnMucG9zaXRpb24ubG5nIHx8IDApLnRvRml4ZWQoOClcclxuICAgIClcclxuICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbi5sYXQgPSBOdW1iZXIoXHJcbiAgICAgIE51bWJlcihvcHRpb25zLnBvc2l0aW9uLmxhdCB8fCAwKS50b0ZpeGVkKDgpXHJcbiAgICApXHJcbiAgICB0aGlzLm9wdGlvbnMucG9zaXRpb24uYWx0ID0gTnVtYmVyKFxyXG4gICAgICBOdW1iZXIob3B0aW9ucy5wb3NpdGlvbi5hbHQgfHwgMCkudG9GaXhlZCgyKVxyXG4gICAgKVxyXG4gICAgLy8gdGhpcy5vcHRpb25zLmRpZmZ1c2VTaG93ID0gb3B0aW9ucy5kaWZmdXNlU2hvdyB8fCBmYWxzZVxyXG4gICAgLy8gdGhpcy5vcHRpb25zLmRpZmZ1c2VSYWRpdXMgPSAob3B0aW9ucy5kaWZmdXNlUmFkaXVzIHx8IG9wdGlvbnMuZGlmZnVzZVJhZGl1cyA9PT0gMCkgPyBvcHRpb25zLmRpZmZ1c2VSYWRpdXMgOiAxMFxyXG4gICAgLy8gdGhpcy5vcHRpb25zLmRpZmZ1c2VEdXJhdGlvbiA9IChvcHRpb25zLmRpZmZ1c2VEdXJhdGlvbiB8fCBvcHRpb25zLmRpZmZ1c2VEdXJhdGlvbiA9PT0gMCkgPyBvcHRpb25zLmRpZmZ1c2VEdXJhdGlvbiA6IDIwMDBcclxuICAgIC8vIHRoaXMub3B0aW9ucy5kaWZmdXNlQ29sb3IgPSBvcHRpb25zLmRpZmZ1c2VDb2xvciB8fCBcIiNGRjAwMDBcIlxyXG4gICAgLy8gdGhpcy5vcHRpb25zLnNjYW5TaG93ID0gb3B0aW9ucy5zY2FuU2hvdyB8fCBmYWxzZVxyXG4gICAgLy8gdGhpcy5vcHRpb25zLnNjYW5SYWRpdXMgPSAob3B0aW9ucy5zY2FuUmFkaXVzIHx8IG9wdGlvbnMuc2NhblJhZGl1cyA9PT0gMCkgPyBvcHRpb25zLnNjYW5SYWRpdXMgOiAxMFxyXG4gICAgLy8gdGhpcy5vcHRpb25zLnNjYW5EdXJhdGlvbiA9IChvcHRpb25zLnNjYW5EdXJhdGlvbiB8fCBvcHRpb25zLnNjYW5EdXJhdGlvbiA9PT0gMCkgPyBvcHRpb25zLnNjYW5EdXJhdGlvbiA6IDIwMDBcclxuICAgIC8vIHRoaXMub3B0aW9ucy5zY2FuQ29sb3IgPSBvcHRpb25zLnNjYW5Db2xvciB8fCBcIiNGRjAwMDBcIlxyXG4gICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZSA9IG9wdGlvbnMuYXR0cmlidXRlIHx8IHt9XHJcbiAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsgfHwge31cclxuICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50ID1cclxuICAgICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnQgfHwgW11cclxuICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyIHx8IHt9XHJcbiAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnQgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnQgfHwgW11cclxuICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUuY2FtZXJhID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5jYW1lcmEgfHwge31cclxuICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUuY2FtZXJhLmNvbnRlbnQgPVxyXG4gICAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmNhbWVyYS5jb250ZW50IHx8IFtdXHJcbiAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmlzYyA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUuaXNjIHx8IHt9XHJcbiAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmlzYy5jb250ZW50ID1cclxuICAgICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5pc2MuY29udGVudCB8fCBbXVxyXG4gICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5nb29kcyA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUuZ29vZHMgfHwge31cclxuICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUuZ29vZHMuY29udGVudCA9XHJcbiAgICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUuZ29vZHMuY29udGVudCB8fCBbXVxyXG4gICAgLy8gdGhpcy5vcHRpb25zLmNvb3JkaW5hdGUgPSBvcHRpb25zLmNvb3JkaW5hdGUgfHwgJydcclxuICAgIHRoaXMub3BlcmF0ZSA9IHt9XHJcbiAgICB0aGlzLl9lbG1zID0ge31cclxuICAgIHRoaXMucHJldmlvdXMgPSB7XHJcbiAgICAgIHBvc2l0aW9uOiB7IC4uLnRoaXMub3B0aW9ucy5wb3NpdGlvbiB9XHJcbiAgICB9XHJcbiAgICAvLyB0aGlzLm9wdGlvbnMuYXR0cmlidXRlUG9zID0gb3B0aW9ucy5hdHRyaWJ1dGVQb3MgfHwge1xyXG4gICAgLy8gICB4OiA2MCxcclxuICAgIC8vICAgeTogNjAsXHJcbiAgICAvLyAgIHdpZHRoOiAyMDAsXHJcbiAgICAvLyAgIGhlaWdodDogMTIwXHJcbiAgICAvLyB9XHJcbiAgICB0aGlzLmVudGl0eVxyXG4gICAgdGhpcy5fcHJvaiA9IHRoaXMuc2RrLnByb2pcclxuXHJcblxyXG5cclxuXHJcbiAgICAvLyAvLyDpqozor4HnianotYRcclxuICAgIC8vIGxldCBnb29kc0NvbnRlbnQgPSBbXVxyXG4gICAgLy8gaWYob3B0aW9ucy5hdHRyaWJ1dGUgJiYgb3B0aW9ucy5hdHRyaWJ1dGUuZ29vZHMgJiYgb3B0aW9ucy5hdHRyaWJ1dGUuZ29vZHMuY29udGVudCAmJiBBcnJheS5pc0FycmF5KG9wdGlvbnMuYXR0cmlidXRlLmdvb2RzLmNvbnRlbnQpKSB7XHJcbiAgICAvLyAgIGdvb2RzQ29udGVudCA9IFsuLi5vcHRpb25zLmF0dHJpYnV0ZS5nb29kcy5jb250ZW50XVxyXG4gICAgLy8gfVxyXG4gICAgLy8gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5nb29kcy5jb250ZW50ID0gW11cclxuICAgIC8vIGlmIChnb29kc0NvbnRlbnQubGVuZ3RoID4gMCkge1xyXG4gICAgLy8gICBnZXRHb29kc0xpc3QoKS50aGVuKChsaXN0KT0+e1xyXG4gICAgLy8gICAgIGZvciAobGV0IGkgPSBnb29kc0NvbnRlbnQubGVuZ3RoLTE7IGkgPj0gMDsgaS0tKSB7XHJcbiAgICAvLyAgICAgICBsZXQgZmFsZyA9IGZhbHNlXHJcbiAgICAvLyAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGxpc3QubGVuZ3RoOyBqKyspIHtcclxuICAgIC8vICAgICAgICAgaWYgKGdvb2RzQ29udGVudFtpXS5JRCA9PT0gbGlzdFtqXS5JRCkge1xyXG4gICAgLy8gICAgICAgICAgIGZhbGcgPSB0cnVlXHJcbiAgICAvLyAgICAgICAgICAgYnJlYWtcclxuICAgIC8vICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgfVxyXG4gICAgLy8gICAgICAgaWYoIWZhbGcpIHtcclxuICAgIC8vICAgICAgICAgZ29vZHNDb250ZW50LnNwbGljZShpLCAxKVxyXG4gICAgLy8gICAgICAgfVxyXG4gICAgLy8gICAgIH1cclxuICAgIC8vICAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmdvb2RzLmNvbnRlbnQgPSBbLi4uZ29vZHNDb250ZW50XVxyXG4gICAgLy8gICB9KVxyXG4gICAgLy8gfVxyXG5cclxuXHJcbiAgICB0aGlzLnNkay5hZGRJbmNldGFuY2UodGhpcy5vcHRpb25zLmlkLCB0aGlzKVxyXG4gICAgQmlsbGJvYXJkT2JqZWN0LmNyZWF0ZSh0aGlzKVxyXG4gICAgdGhpcy5waWNraW5nID0gdHJ1ZVxyXG5cclxuICAgIHRoaXMuRGlhbG9nID0gX0RpYWxvZ1xyXG4gICAgdGhpcy5fRXZlbnRCaW5kaW5nID0gbmV3IEV2ZW50QmluZGluZygpXHJcbiAgfVxyXG5cclxuICBnZXQgdHlwZSgpIHtcclxuICAgIHJldHVybiAnQmlsbGJvYXJkT2JqZWN0J1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGNyZWF0ZSh0aGF0KSB7XHJcbiAgICBsZXQgY2FudmFzXHJcbiAgICBsZXQgYmlsbGJvYXJkSCA9IDM2XHJcbiAgICBsZXQgaGVpZ2h0TW9kZVxyXG4gICAgbGV0IHBvc2l0aW9uID0gdGhhdC5vcHRpb25zLnBvc2l0aW9uXHJcbiAgICB0aGF0Lm9yaWdpbmFsT3B0aW9ucyA9IHRoYXQuZGVlcENvcHlPYmoodGhhdC5vcHRpb25zKVxyXG4gICAgbGV0IGlzR2xmID0gZmFsc2VcclxuICAgIGxldCBzdXBlckdpZlxyXG4gICAgbGV0IGluZGV4ID0gMFxyXG5cclxuICAgIGxldCBmb250ID0gZ2V0Rm9udEZhbWlseSh0aGF0LmxhYmVsRm9udEZhbWlseSkgfHwgJ0hlbHZldGljYSdcclxuICAgIGxldCB1cmwgPSB0aGF0LnJlcGxhY2VIb3N0KHRoYXQub3B0aW9ucy5iaWxsYm9hcmQuaW1hZ2UsIHRoYXQub3B0aW9ucy5ob3N0KVxyXG4gICAgdGhhdC5fZnJhbWVJbWFnZXMgPSBbXVxyXG4gICAgaWYgKHVybCAmJiB1cmwuZW5kc1dpdGgoJ2dpZicpKSB7XHJcbiAgICAgIGlzR2xmID0gdHJ1ZVxyXG4gICAgICBzd2l0Y2ggKHRoYXQub3B0aW9ucy5oZWlnaHRNb2RlKSB7XHJcbiAgICAgICAgY2FzZSAyOlxyXG4gICAgICAgIGNhc2UgJzInOlxyXG4gICAgICAgICAgaGVpZ2h0TW9kZSA9IENlc2l1bS5IZWlnaHRSZWZlcmVuY2UuQ0xBTVBfVE9fR1JPVU5EXHJcbiAgICAgICAgICBicmVha1xyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgZ2lmSW1nID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJylcclxuICAgICAgZ2lmSW1nLnNldEF0dHJpYnV0ZSgncmVsOmFuaW1hdGVkX3NyYycsIHVybClcclxuICAgICAgZ2lmSW1nLnNldEF0dHJpYnV0ZSgncmVsOmF1dG9fcGxheScsICcxJylcclxuICAgICAgY29uc3QgaW1nRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcclxuICAgICAgaW1nRGl2LmFwcGVuZENoaWxkKGdpZkltZylcclxuICAgICAgbGV0IGlkID0gQ2VzaXVtLmNyZWF0ZUd1aWQoKVxyXG4gICAgICBzdXBlckdpZiA9IG5ldyBTdXBlckdpZih7IGdpZjogZ2lmSW1nIH0pXHJcbiAgICAgIHRoYXQuX3N1cGVyR2lmID0gc3VwZXJHaWZcclxuICAgICAgdGhhdC5fc3VwZXJHaWYuaWQgPSBpZCAgLy8g6Ieq5a6a5LmJaWTvvIznlKjkuo7liKTmlq1naWblrp7kvovmmK/lkKbmlLnlj5hcclxuXHJcbiAgICAgIHN1cGVyR2lmLmxvYWQoZnVuY3Rpb24gKHN0YXR1cykge1xyXG4gICAgICAgIGlmIChzdGF0dXMgPT0gNDA0KSB7XHJcbiAgICAgICAgICBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKVxyXG4gICAgICAgICAgY2FudmFzLndpZHRoID0gMFxyXG4gICAgICAgICAgY2FudmFzLmhlaWdodCA9IDBcclxuICAgICAgICAgIGJpbGxib2FyZEggPSAwXHJcbiAgICAgICAgICBpZiAodGhhdC5lbnRpdHkpIHtcclxuICAgICAgICAgICAgdGhhdC5lbnRpdHkuYmlsbGJvYXJkLmltZ1dpZHRoID0gMFxyXG4gICAgICAgICAgICB0aGF0LmVudGl0eS5iaWxsYm9hcmQuaW1nSGVpZ2h0ID0gMFxyXG4gICAgICAgICAgICB0aGF0LmVudGl0eS5iaWxsYm9hcmQuaW1hZ2UgPSBjYW52YXNcclxuICAgICAgICAgICAgYWRkQ2x1c3Rlcih0aGF0LnNkaywgdGhhdC5lbnRpdHkpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm5cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoYXQuX3N1cGVyR2lmLmlkICE9IGlkKSB7XHJcbiAgICAgICAgICByZXR1cm5cclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IGxlbmd0aCA9IHN1cGVyR2lmLmdldF9sZW5ndGgoKVxyXG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IGxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBzdXBlckdpZi5tb3ZlX3RvKGkpXHJcbiAgICAgICAgICB0aGF0Ll9mcmFtZUltYWdlcy5wdXNoKHN1cGVyR2lmLmdldF9jYW52YXMoKS50b0RhdGFVUkwoKSlcclxuICAgICAgICB9XHJcbiAgICAgICAgY2FudmFzID0gc3VwZXJHaWYuZ2V0X2NhbnZhcygpXHJcbiAgICAgICAgbGV0IHdpZHRoID0gY2FudmFzLndpZHRoXHJcbiAgICAgICAgbGV0IGhlaWdodCA9IGNhbnZhcy5oZWlnaHRcclxuICAgICAgICBiaWxsYm9hcmRIID0gaGVpZ2h0ICogKDMxIC8gd2lkdGgpXHJcbiAgICAgICAgaWYgKHRoYXQuZW50aXR5KSB7XHJcbiAgICAgICAgICB0aGF0LmVudGl0eS5iaWxsYm9hcmQuaW1nV2lkdGggPSB3aWR0aFxyXG4gICAgICAgICAgdGhhdC5lbnRpdHkuYmlsbGJvYXJkLmltZ0hlaWdodCA9IGhlaWdodFxyXG4gICAgICAgICAgdGhhdC5lbnRpdHkuYmlsbGJvYXJkLmltYWdlID0gbmV3IENlc2l1bS5DYWxsYmFja1Byb3BlcnR5KCgpID0+IHtcclxuICAgICAgICAgICAgbGV0IGltZyA9IHRoYXQuX2ZyYW1lSW1hZ2VzW2luZGV4XVxyXG4gICAgICAgICAgICBpbmRleCA9IGluZGV4ID49IHRoYXQuX2ZyYW1lSW1hZ2VzLmxlbmd0aCAtIDEgPyAwIDogaW5kZXggKyAxXHJcbiAgICAgICAgICAgIHJldHVybiBpbWdcclxuICAgICAgICAgIH0sIGZhbHNlKVxyXG4gICAgICAgICAgYWRkQ2x1c3Rlcih0aGF0LnNkaywgdGhhdC5lbnRpdHkpXHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGxldCBpbWFnZSA9IG5ldyBJbWFnZSgpXHJcbiAgICAgIGltYWdlLnNyYyA9XHJcbiAgICAgICAgdXJsIHx8XHJcbiAgICAgICAgdGhhdC5nZXRTb3VyY2VSb290UGF0aCgpICsgJy9pbWcvQS1hYmx1LWJsYW5rLnBuZydcclxuICAgICAgc3dpdGNoICh0aGF0Lm9wdGlvbnMuaGVpZ2h0TW9kZSkge1xyXG4gICAgICAgIGNhc2UgMjpcclxuICAgICAgICBjYXNlICcyJzpcclxuICAgICAgICAgIGhlaWdodE1vZGUgPSBDZXNpdW0uSGVpZ2h0UmVmZXJlbmNlLkNMQU1QX1RPX0dST1VORFxyXG4gICAgICAgICAgYnJlYWtcclxuICAgICAgfVxyXG4gICAgICBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKVxyXG4gICAgICBpbWFnZS5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgbGV0IHJhdGlvID0gaW1hZ2Uud2lkdGggLyBpbWFnZS5oZWlnaHRcclxuICAgICAgICBpbWFnZS53aWR0aCA9IDEwMFxyXG4gICAgICAgIGltYWdlLmhlaWdodCA9IDEwMCAvIHJhdGlvXHJcbiAgICAgICAgbGV0IHdpZHRoID0gaW1hZ2Uud2lkdGhcclxuICAgICAgICBsZXQgaGVpZ2h0ID0gaW1hZ2UuaGVpZ2h0XHJcbiAgICAgICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJywgeyB3aWxsUmVhZEZyZXF1ZW50bHk6IHRydWUgfSlcclxuICAgICAgICBjYW52YXMud2lkdGggPSB3aWR0aFxyXG4gICAgICAgIGNhbnZhcy5oZWlnaHQgPSBoZWlnaHRcclxuICAgICAgICBjdHguZHJhd0ltYWdlKGltYWdlLCAwLCAwLCB3aWR0aCwgaGVpZ2h0KVxyXG4gICAgICAgIGJpbGxib2FyZEggPSBoZWlnaHQgKiAoMzEgLyB3aWR0aClcclxuICAgICAgICBpZiAodGhhdC5lbnRpdHkpIHtcclxuICAgICAgICAgIHRoYXQuZW50aXR5LmJpbGxib2FyZC5pbWdXaWR0aCA9IHdpZHRoXHJcbiAgICAgICAgICB0aGF0LmVudGl0eS5iaWxsYm9hcmQuaW1nSGVpZ2h0ID0gaGVpZ2h0XHJcbiAgICAgICAgICB0aGF0LmVudGl0eS5iaWxsYm9hcmQuaW1hZ2UgPSBjYW52YXNcclxuICAgICAgICAgIGFkZENsdXN0ZXIodGhhdC5zZGssIHRoYXQuZW50aXR5KVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBpbWFnZS5vbmVycm9yID0gZnVuY3Rpb24gKGVycikge1xyXG4gICAgICAgIGNhbnZhcy53aWR0aCA9IDBcclxuICAgICAgICBjYW52YXMuaGVpZ2h0ID0gMFxyXG4gICAgICAgIGJpbGxib2FyZEggPSAwXHJcbiAgICAgICAgaWYgKHRoYXQuZW50aXR5KSB7XHJcbiAgICAgICAgICB0aGF0LmVudGl0eS5iaWxsYm9hcmQuaW1nV2lkdGggPSAwXHJcbiAgICAgICAgICB0aGF0LmVudGl0eS5iaWxsYm9hcmQuaW1nSGVpZ2h0ID0gMFxyXG4gICAgICAgICAgdGhhdC5lbnRpdHkuYmlsbGJvYXJkLmltYWdlID0gY2FudmFzXHJcbiAgICAgICAgICBhZGRDbHVzdGVyKHRoYXQuc2RrLCB0aGF0LmVudGl0eSlcclxuICAgICAgICB9XHJcbiAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgdGhhdC5lbnRpdHkgPSBuZXcgQ2VzaXVtLkVudGl0eSh7XHJcbiAgICAgIHNob3c6IHRoYXQub3B0aW9ucy5zaG93LFxyXG4gICAgICBpZDogdGhhdC5vcHRpb25zLmlkLFxyXG4gICAgICBwb3NpdGlvbjogQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXMoXHJcbiAgICAgICAgcG9zaXRpb24ubG5nLFxyXG4gICAgICAgIHBvc2l0aW9uLmxhdCxcclxuICAgICAgICBwb3NpdGlvbi5hbHRcclxuICAgICAgKSxcclxuICAgICAgYmlsbGJvYXJkOiB7XHJcbiAgICAgICAgaW1hZ2U6IGlzR2xmID8gbmV3IENlc2l1bS5DYWxsYmFja1Byb3BlcnR5KCgpID0+IHtcclxuICAgICAgICAgIGxldCBpbWcgPSB0aGF0Ll9mcmFtZUltYWdlc1tpbmRleF1cclxuICAgICAgICAgIGluZGV4ID0gaW5kZXggPj0gdGhhdC5fZnJhbWVJbWFnZXMubGVuZ3RoIC0gMSA/IDAgOiBpbmRleCArIDFcclxuICAgICAgICAgIHJldHVybiBpbWdcclxuICAgICAgICB9LCBmYWxzZSkgOiBjYW52YXMsXHJcbiAgICAgICAgc2NhbGU6IHRoYXQub3B0aW9ucy5iaWxsYm9hcmQuc2NhbGUsXHJcbiAgICAgICAgZGlzYWJsZURlcHRoVGVzdERpc3RhbmNlOiBuZXcgQ2VzaXVtLkNhbGxiYWNrUHJvcGVydHkoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgcmV0dXJuIGdldEdyb3VuZENvdmVyKCkgPyB1bmRlZmluZWQgOiBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFlcclxuICAgICAgICB9LCBmYWxzZSksXHJcbiAgICAgICAgaGVpZ2h0UmVmZXJlbmNlOiBoZWlnaHRNb2RlLFxyXG4gICAgICAgIGNvbG9yOiB0aGF0Lm9wdGlvbnMuYmlsbGJvYXJkLnNob3dcclxuICAgICAgICAgID8gdW5kZWZpbmVkXHJcbiAgICAgICAgICA6IG5ldyBDZXNpdW0uQ29sb3IoMS4wLCAxLjAsIDEuMCwgMCksXHJcbiAgICAgICAgd2lkdGg6IDMxLFxyXG4gICAgICAgIGhlaWdodDogbmV3IENlc2l1bS5DYWxsYmFja1Byb3BlcnR5KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgIHJldHVybiBiaWxsYm9hcmRIXHJcbiAgICAgICAgfSwgZmFsc2UpLFxyXG4gICAgICAgIHZlcnRpY2FsT3JpZ2luOiBDZXNpdW0uVmVydGljYWxPcmlnaW4uQk9UVE9NXHJcbiAgICAgICAgLy8gcGl4ZWxPZmZzZXQ6IG5ldyBDZXNpdW0uQ2FsbGJhY2tQcm9wZXJ0eShmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgLy8gICByZXR1cm4gbmV3IENlc2l1bS5DYXJ0ZXNpYW4yKFxyXG4gICAgICAgIC8vICAgICAwLFxyXG4gICAgICAgIC8vICAgICAtKGJpbGxib2FyZEggLyAyKSAqIHRoYXQub3B0aW9ucy5iaWxsYm9hcmQuc2NhbGVcclxuICAgICAgICAvLyAgIClcclxuICAgICAgICAvLyB9LCBmYWxzZSlcclxuICAgICAgfSxcclxuICAgICAgbGFiZWw6IHtcclxuICAgICAgICBzaG93OiB0aGF0Lm9wdGlvbnMubGFiZWwuc2hvdyxcclxuICAgICAgICB0ZXh0OiB0aGF0Lm9wdGlvbnMubGFiZWwudGV4dCxcclxuICAgICAgICBkaXNhYmxlRGVwdGhUZXN0RGlzdGFuY2U6IG5ldyBDZXNpdW0uQ2FsbGJhY2tQcm9wZXJ0eShmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICByZXR1cm4gZ2V0R3JvdW5kQ292ZXIoKSA/IHVuZGVmaW5lZCA6IE51bWJlci5QT1NJVElWRV9JTkZJTklUWVxyXG4gICAgICAgIH0sIGZhbHNlKSxcclxuICAgICAgICBoZWlnaHRSZWZlcmVuY2U6IGhlaWdodE1vZGUsXHJcbiAgICAgICAgZm9udDogdGhhdC5vcHRpb25zLmxhYmVsLmZvbnRTaXplICsgJ3B4ICcgKyBmb250LFxyXG4gICAgICAgIGZpbGxDb2xvcjogQ2VzaXVtLkNvbG9yLmZyb21Dc3NDb2xvclN0cmluZyh0aGF0Lm9wdGlvbnMubGFiZWwuY29sb3IpLFxyXG4gICAgICAgIC8vIHZlcnRpY2FsT3JpZ2luIDogQ2VzaXVtLlZlcnRpY2FsT3JpZ2luLkJPVFRPTSxcclxuICAgICAgICBwaXhlbE9mZnNldDogbmV3IENlc2l1bS5DYWxsYmFja1Byb3BlcnR5KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgIGlmICh0aGF0Lm9wdGlvbnMuYmlsbGJvYXJkLnNob3cpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBDZXNpdW0uQ2FydGVzaWFuMihcclxuICAgICAgICAgICAgICAwLFxyXG4gICAgICAgICAgICAgIC1iaWxsYm9hcmRIICogdGhhdC5vcHRpb25zLmJpbGxib2FyZC5zY2FsZSAtXHJcbiAgICAgICAgICAgICAgdGhhdC5vcHRpb25zLmxhYmVsLmZvbnRTaXplIC8gMiAtXHJcbiAgICAgICAgICAgICAgNVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IENlc2l1bS5DYXJ0ZXNpYW4yKFxyXG4gICAgICAgICAgICAgIDAsXHJcbiAgICAgICAgICAgICAgLXRoYXQub3B0aW9ucy5sYWJlbC5mb250U2l6ZSAvIDIgLSA1XHJcbiAgICAgICAgICAgIClcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LCBmYWxzZSksXHJcbiAgICAgICAgb3V0bGluZUNvbG9yOiBDZXNpdW0uQ29sb3IuQkxBQ0ssXHJcbiAgICAgICAgb3V0bGluZVdpZHRoOiAxLFxyXG4gICAgICAgIHN0eWxlOiBDZXNpdW0uTGFiZWxTdHlsZS5GSUxMX0FORF9PVVRMSU5FXHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgICB0aGF0LmVudGl0eS5iaWxsYm9hcmQuaW1nV2lkdGggPSAzMVxyXG4gICAgdGhhdC5lbnRpdHkuYmlsbGJvYXJkLmltZ0hlaWdodCA9IDM2XHJcbiAgICB0aGF0LmVudGl0eS5wb3NpdGlvbiA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzKFxyXG4gICAgICBwb3NpdGlvbi5sbmcsXHJcbiAgICAgIHBvc2l0aW9uLmxhdCxcclxuICAgICAgcG9zaXRpb24uYWx0XHJcbiAgICApXHJcbiAgICBpZiAodGhhdC5vcHRpb25zLmhlaWdodE1vZGUgPT0gMykge1xyXG4gICAgICB0aGF0LnVwZGF0ZUhlaWdodCgpXHJcbiAgICB9XHJcblxyXG4gICAgdGhhdC5yZW5ld1BvaW50KClcclxuICAgIC8vIHRoYXQuZGlmZnVzZVNob3cgPSB0aGF0Lm9wdGlvbnMuZGlmZnVzZVNob3dcclxuICAgIC8vIHRoYXQuc2NhblNob3cgPSB0aGF0Lm9wdGlvbnMuc2NhblNob3dcclxuICAgIHN5bmNEYXRhKHRoYXQuc2RrLCB0aGF0Lm9wdGlvbnMuaWQpXHJcbiAgICBpZiAodGhhdC5vcHRpb25zLnNob3cpIHtcclxuICAgICAgc2V0U3BsaXREaXJlY3Rpb24oMCwgdGhhdC5vcHRpb25zLmlkKVxyXG4gICAgfVxyXG4gICAgaWYgKHRoYXQub3B0aW9ucy5iaWxsYm9hcmQuaXNTZWxlY3QpIHtcclxuICAgICAgdGhhdC5zZWxlY3RCaWxsYm9hcmQoKVxyXG4gICAgfVxyXG4gIH1cclxuICAvLyDpgInkuK3mlYjmnpxcclxuICBzZWxlY3RCaWxsYm9hcmQoKSB7XHJcbiAgICBsZXQgdGhhdCA9IHRoaXNcclxuICAgIHRoaXMuc2RrLnZpZXdlci5zY3JlZW5TcGFjZUV2ZW50SGFuZGxlci5zZXRJbnB1dEFjdGlvbihmdW5jdGlvbiAoY2xpY2spIHtcclxuICAgICAgdmFyIHBpY2tlZE9iamVjdCA9IHRoYXQuc2RrLnZpZXdlci5zY2VuZS5waWNrKGNsaWNrLnBvc2l0aW9uKVxyXG4gICAgICBpZiAoXHJcbiAgICAgICAgQ2VzaXVtLmRlZmluZWQocGlja2VkT2JqZWN0KSAmJlxyXG4gICAgICAgIHBpY2tlZE9iamVjdC5pZCAmJlxyXG4gICAgICAgIHBpY2tlZE9iamVjdC5pZC5pZCA9PT0gJ2FpcnBvcnRCaWxsYm9hcmQnXHJcbiAgICAgICkge1xyXG4gICAgICAgIGlmICh0aGF0LmVudGl0eS5iaWxsYm9hcmQpIHtcclxuICAgICAgICAgIC8vIOWmguaenOeCueWHu+eahOaYr0JpbGxib2FyZO+8jOe7meWug+a3u+WKoOmAieS4reaViOaenFxyXG4gICAgICAgICAgdGhhdC5lbnRpdHkuYmlsbGJvYXJkLmNvbG9yID0gQ2VzaXVtLkNvbG9yLllFTExPVyAvLyDmlLnlj5jpopzoibJcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8g5Y+v5Lul5re75Yqg5pu05aSa6YCJ5Lit5pWI5p6c77yM5L6L5aaC6L655qGG562JXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaWYgKHRoYXQuZW50aXR5LmJpbGxib2FyZCkge1xyXG4gICAgICAgICAgdGhhdC5lbnRpdHkuYmlsbGJvYXJkLmNvbG9yID0gQ2VzaXVtLkNvbG9yLldISVRFXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9LCBDZXNpdW0uU2NyZWVuU3BhY2VFdmVudFR5cGUuTEVGVF9DTElDSylcclxuICB9XHJcbiAgZ2V0IGF0dHJpYnV0ZVNlbGVjdCgpIHtcclxuICAgIHJldHVybiBbXHJcbiAgICAgIHtcclxuICAgICAgICBuYW1lOiAn5a+M5paH5pysJyxcclxuICAgICAgICB2YWx1ZTogJ+WvjOaWh+acrCcsXHJcbiAgICAgICAga2V5OiAncmljaFRleHQnXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBuYW1lOiAn6ZO+5o6lJyxcclxuICAgICAgICB2YWx1ZTogJ+mTvuaOpScsXHJcbiAgICAgICAga2V5OiAnbGluaydcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIG5hbWU6ICdJUOaRhOWDj+WktCcsXHJcbiAgICAgICAgdmFsdWU6ICdJUOaRhOWDj+WktCcsXHJcbiAgICAgICAga2V5OiAnY2FtZXJhJ1xyXG4gICAgICB9LFxyXG4gICAgICAvLyB7XHJcbiAgICAgIC8vICAgbmFtZTogJ0lTQ+aRhOWDj+WktCcsXHJcbiAgICAgIC8vICAgdmFsdWU6ICdJU0PmkYTlg4/lpLQnLFxyXG4gICAgICAvLyAgIGtleTogJ2lzYydcclxuICAgICAgLy8gfSxcclxuICAgICAgLy8ge1xyXG4gICAgICAvLyAgIG5hbWU6ICfkvKDmhJ/lmagnLFxyXG4gICAgICAvLyAgIHZhbHVlOiAn5Lyg5oSf5ZmoJyxcclxuICAgICAgLy8gICBrZXk6ICdzZW5zb3InXHJcbiAgICAgIC8vIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBuYW1lOiAn5YWo5pmv5Zu+JyxcclxuICAgICAgICB2YWx1ZTogJ+WFqOaZr+WbvicsXHJcbiAgICAgICAga2V5OiAndnInXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBuYW1lOiAn54mp6LWEJyxcclxuICAgICAgICB2YWx1ZTogJ+eJqei1hCcsXHJcbiAgICAgICAga2V5OiAnZ29vZHMnXHJcbiAgICAgIH1cclxuICAgIF1cclxuICB9XHJcblxyXG4gIGdldCBzaG93KCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5zaG93XHJcbiAgfVxyXG4gIHNldCBzaG93KHYpIHtcclxuICAgIGlmICghdGhpcy5pc1Nob3dWaWV3KSB7XHJcbiAgICAgIHRoaXMub3B0aW9ucy5zaG93ID0gdlxyXG4gICAgICB0aGlzLm9yaWdpbmFsT3B0aW9ucy5zaG93ID0gdlxyXG4gICAgfVxyXG4gICAgaWYgKCF0aGlzLnNob3dWaWV3IHx8IHRoaXMuc2hvd1ZpZXcgPT0gMykge1xyXG4gICAgICB0aGlzLmVudGl0eSAmJiAodGhpcy5lbnRpdHkuc2hvdyA9IHRoaXMub3B0aW9ucy5zaG93KVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMuZW50aXR5ICYmICh0aGlzLmVudGl0eS5zaG93ID0gZmFsc2UpXHJcbiAgICB9XHJcbiAgICBzeW5jRGF0YSh0aGlzLnNkaywgdGhpcy5vcHRpb25zLmlkKVxyXG4gICAgc3luY1NwbGl0RGF0YSh0aGlzLnNkaywgdGhpcy5vcHRpb25zLmlkKVxyXG5cclxuICAgIGlmICh0aGlzLl9EaWFsb2dPYmplY3QgJiYgdGhpcy5fRGlhbG9nT2JqZWN0LnNob3dCdG4pIHtcclxuICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0LnNob3dCdG4uY2hlY2tlZCA9IHRoaXMub3B0aW9ucy5zaG93XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5pc1Nob3dWaWV3ID0gZmFsc2VcclxuICAgIC8vIGlmICh2KSB7XHJcbiAgICAvLyAgIGlmICh0aGlzLmRpZmZ1c2VTaG93KSB7XHJcbiAgICAvLyAgICAgdGhpcy5kaWZmdXNlU2hvdyA9IHRydWVcclxuICAgIC8vICAgfVxyXG4gICAgLy8gICBpZiAodGhpcy5zY2FuU2hvdykge1xyXG4gICAgLy8gICAgIHRoaXMuc2NhblNob3cgPSB0cnVlXHJcbiAgICAvLyAgIH1cclxuICAgIC8vIH1cclxuICAgIC8vIGVsc2Uge1xyXG4gICAgLy8gICBpZiAodGhpcy5kaWZmdXNlKSB7XHJcbiAgICAvLyAgICAgdGhpcy5kaWZmdXNlLnNob3cgPSB2XHJcbiAgICAvLyAgIH1cclxuICAgIC8vICAgaWYgKHRoaXMuc2Nhbikge1xyXG4gICAgLy8gICAgIHRoaXMuc2Nhbi5zaG93ID0gdlxyXG4gICAgLy8gICB9XHJcbiAgICAvLyB9XHJcbiAgfVxyXG5cclxuICBnZXQgaGVpZ2h0TW9kZSgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuaGVpZ2h0TW9kZSA/IHRoaXMub3B0aW9ucy5oZWlnaHRNb2RlIDogMFxyXG4gIH1cclxuICBzZXQgaGVpZ2h0TW9kZSh2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMuaGVpZ2h0TW9kZSA9IHYgPyB2IDogMFxyXG4gICAgdGhpcy5vcHRpb25zLmhlaWdodE1vZGUgPSB2IHx8IHYgPT0gMCA/IHYgOiAzXHJcbiAgICBsZXQgaGVpZ2h0TW9kZVxyXG4gICAgbGV0IGhlaWdodE1vZGVOYW1lID0gJydcclxuICAgIHN3aXRjaCAodGhpcy5vcHRpb25zLmhlaWdodE1vZGUpIHtcclxuICAgICAgY2FzZSAnMCc6XHJcbiAgICAgIGNhc2UgMDpcclxuICAgICAgICBoZWlnaHRNb2RlID0gQ2VzaXVtLkhlaWdodFJlZmVyZW5jZS5OT05FXHJcbiAgICAgICAgYnJlYWtcclxuICAgICAgY2FzZSAnMSc6XHJcbiAgICAgIGNhc2UgMTpcclxuICAgICAgICBoZWlnaHRNb2RlID0gQ2VzaXVtLkhlaWdodFJlZmVyZW5jZS5OT05FXHJcbiAgICAgICAgYnJlYWtcclxuICAgICAgY2FzZSAnMic6XHJcbiAgICAgIGNhc2UgMjpcclxuICAgICAgICBoZWlnaHRNb2RlID0gQ2VzaXVtLkhlaWdodFJlZmVyZW5jZS5DTEFNUF9UT19HUk9VTkRcclxuICAgICAgICBicmVha1xyXG4gICAgICBjYXNlICczJzpcclxuICAgICAgY2FzZSAzOlxyXG4gICAgICAgIGhlaWdodE1vZGUgPSBDZXNpdW0uSGVpZ2h0UmVmZXJlbmNlLk5PTkVcclxuICAgICAgICBsZXQgb2JqZWN0c1RvRXhjbHVkZSA9IFtdXHJcbiAgICAgICAgZm9yIChsZXQgW2tleSwgdmFsdWVdIG9mIHRoaXMuc2RrLmVudGl0eU1hcCkge1xyXG4gICAgICAgICAgaWYgKHZhbHVlLnR5cGUgPT09ICdSYWRhclNjYW5TdGVyZW9zY29waWMnICYmIHZhbHVlLmVudGl0eSkge1xyXG4gICAgICAgICAgICBvYmplY3RzVG9FeGNsdWRlLnB1c2godmFsdWUuZW50aXR5KVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmdldENsYW1wVG9IZWlnaHQodGhpcy5vcHRpb25zLnBvc2l0aW9uLCBvYmplY3RzVG9FeGNsdWRlKS50aGVuKGggPT4ge1xyXG4gICAgICAgICAgdGhpcy5hbHQgPSBOdW1iZXIoaC50b0ZpeGVkKDIpKVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgYnJlYWtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmVudGl0eSkge1xyXG4gICAgICB0aGlzLmVudGl0eS5iaWxsYm9hcmQuaGVpZ2h0UmVmZXJlbmNlID0gaGVpZ2h0TW9kZVxyXG4gICAgICB0aGlzLmVudGl0eS5sYWJlbC5oZWlnaHRSZWZlcmVuY2UgPSBoZWlnaHRNb2RlXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgbGFiZWxUZXh0KCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5sYWJlbC50ZXh0XHJcbiAgfVxyXG4gIHNldCBsYWJlbFRleHQodikge1xyXG4gICAgdGhpcy5vcHRpb25zLmxhYmVsLnRleHQgPSB2XHJcbiAgICB0aGlzLm9wdGlvbnMubmFtZSA9IHZcclxuICAgIHRoaXMuZW50aXR5ICYmICh0aGlzLmVudGl0eS5sYWJlbC50ZXh0ID0gdiArICcnKVxyXG4gICAgdGhpcy5fZWxtcy5sYWJlbFRleHQgJiZcclxuICAgICAgdGhpcy5fZWxtcy5sYWJlbFRleHQuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICBpdGVtLnZhbHVlID0gdlxyXG4gICAgICB9KVxyXG4gIH1cclxuXHJcbiAgZ2V0IGxuZygpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMucG9zaXRpb24ubG5nXHJcbiAgfVxyXG4gIHNldCBsbmcodikge1xyXG4gICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uLmxuZyA9IE51bWJlcihOdW1iZXIodikudG9GaXhlZCg4KSlcclxuICAgIC8vIHRoaXMuc2NhbiAmJiAodGhpcy5zY2FuLmxuZyA9IHYpXHJcbiAgICAvLyB0aGlzLmRpZmZ1c2UgJiYgKHRoaXMuZGlmZnVzZS5sbmcgPSB2KVxyXG4gICAgdGhpcy5yZW5ld1BvaW50KClcclxuICAgIHRoaXMuY29vcmRpbmF0ZSA9IHRoaXMub3B0aW9ucy5jb29yZGluYXRlXHJcbiAgICB0aGlzLl9wcm9qQ29udmVydCAmJiB0aGlzLl9wcm9qQ29udmVydCgpXHJcbiAgICB0aGlzLl9lbG1zLmxuZyAmJlxyXG4gICAgICB0aGlzLl9lbG1zLmxuZy5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgIGl0ZW0udmFsdWUgPSB2XHJcbiAgICAgIH0pXHJcbiAgfVxyXG5cclxuICBnZXQgbGF0KCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5wb3NpdGlvbi5sYXRcclxuICB9XHJcbiAgc2V0IGxhdCh2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMucG9zaXRpb24ubGF0ID0gTnVtYmVyKE51bWJlcih2KS50b0ZpeGVkKDgpKVxyXG4gICAgLy8gdGhpcy5zY2FuICYmICh0aGlzLnNjYW4ubGF0ID0gdilcclxuICAgIC8vIHRoaXMuZGlmZnVzZSAmJiAodGhpcy5kaWZmdXNlLmxhdCA9IHYpXHJcbiAgICB0aGlzLnJlbmV3UG9pbnQoKVxyXG4gICAgdGhpcy5jb29yZGluYXRlID0gdGhpcy5vcHRpb25zLmNvb3JkaW5hdGVcclxuICAgIHRoaXMuX3Byb2pDb252ZXJ0ICYmIHRoaXMuX3Byb2pDb252ZXJ0KClcclxuICAgIHRoaXMuX2VsbXMubGF0ICYmXHJcbiAgICAgIHRoaXMuX2VsbXMubGF0LmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgaXRlbS52YWx1ZSA9IHZcclxuICAgICAgfSlcclxuICB9XHJcblxyXG4gIGdldCBhbHQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLnBvc2l0aW9uLmFsdFxyXG4gIH1cclxuICBzZXQgYWx0KHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbi5hbHQgPSBOdW1iZXIoTnVtYmVyKHYpLnRvRml4ZWQoMikpXHJcbiAgICAvLyB0aGlzLnNjYW4gJiYgKHRoaXMuc2Nhbi5hbHQgPSB2KVxyXG4gICAgLy8gdGhpcy5kaWZmdXNlICYmICh0aGlzLmRpZmZ1c2UuYWx0ID0gdilcclxuICAgIHRoaXMucmVuZXdQb2ludCgpXHJcbiAgICB0aGlzLmNvb3JkaW5hdGUgPSB0aGlzLm9wdGlvbnMuY29vcmRpbmF0ZVxyXG4gIH1cclxuXHJcbiAgZ2V0IG5lYXIoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLm5lYXJcclxuICB9XHJcbiAgc2V0IG5lYXIodikge1xyXG4gICAgbGV0IG5lYXIgPSB2XHJcbiAgICBpZiAobmVhciA+IHRoaXMuZmFyKSB7XHJcbiAgICAgIG5lYXIgPSB0aGlzLmZhclxyXG4gICAgfVxyXG4gICAgdGhpcy5vcHRpb25zLm5lYXIgPSBuZWFyXHJcbiAgICB0aGlzLnJlbmV3UG9pbnQoKVxyXG4gICAgdGhpcy5fZWxtcy5uZWFyICYmXHJcbiAgICAgIHRoaXMuX2VsbXMubmVhci5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgIGl0ZW0udmFsdWUgPSBuZWFyXHJcbiAgICAgIH0pXHJcbiAgfVxyXG5cclxuICBnZXQgZmFyKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5mYXJcclxuICB9XHJcbiAgc2V0IGZhcih2KSB7XHJcbiAgICBsZXQgZmFyID0gdlxyXG4gICAgaWYgKGZhciA8IHRoaXMubmVhcikge1xyXG4gICAgICBmYXIgPSB0aGlzLm5lYXJcclxuICAgIH1cclxuICAgIHRoaXMub3B0aW9ucy5mYXIgPSBmYXJcclxuICAgIHRoaXMucmVuZXdQb2ludCgpXHJcbiAgICB0aGlzLl9lbG1zLmZhciAmJlxyXG4gICAgICB0aGlzLl9lbG1zLmZhci5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgIGl0ZW0udmFsdWUgPSBmYXJcclxuICAgICAgfSlcclxuICB9XHJcblxyXG4gIGdldCBzY2FsZUJ5RGlzdGFuY2UoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLnNjYWxlQnlEaXN0YW5jZVxyXG4gIH1cclxuICBzZXQgc2NhbGVCeURpc3RhbmNlKHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5zY2FsZUJ5RGlzdGFuY2UgPSB2XHJcbiAgICB0aGlzLnJlbmV3UG9pbnQoKVxyXG4gICAgdGhpcy5fZWxtcy5zY2FsZUJ5RGlzdGFuY2UgJiZcclxuICAgICAgdGhpcy5fZWxtcy5zY2FsZUJ5RGlzdGFuY2UuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICBpdGVtLmNoZWNrZWQgPSB2XHJcbiAgICAgIH0pXHJcbiAgfVxyXG5cclxuICBnZXQgYmlsbGJvYXJkU2hvdygpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuYmlsbGJvYXJkLnNob3dcclxuICB9XHJcbiAgc2V0IGJpbGxib2FyZFNob3codikge1xyXG4gICAgdGhpcy5vcHRpb25zLmJpbGxib2FyZC5zaG93ID0gdlxyXG4gICAgdGhpcy5lbnRpdHkgJiZcclxuICAgICAgKHRoaXMuZW50aXR5LmJpbGxib2FyZC5jb2xvciA9IHRoaXMub3B0aW9ucy5iaWxsYm9hcmQuc2hvd1xyXG4gICAgICAgID8gdW5kZWZpbmVkXHJcbiAgICAgICAgOiBuZXcgQ2VzaXVtLkNvbG9yKDEuMCwgMS4wLCAxLjAsIDApKVxyXG4gICAgdGhpcy5fZWxtcy5iaWxsYm9hcmRTaG93ICYmXHJcbiAgICAgIHRoaXMuX2VsbXMuYmlsbGJvYXJkU2hvdy5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgIGl0ZW0udmFsdWUgPSB2XHJcbiAgICAgIH0pXHJcbiAgfVxyXG5cclxuICBnZXQgYmlsbGJvYXJkSW1hZ2UoKSB7XHJcbiAgICBsZXQgdXJsID0gdGhpcy5vcHRpb25zLmJpbGxib2FyZC5pbWFnZVxyXG4gICAgaWYgKHVybCAmJiAhdXJsLnN0YXJ0c1dpdGgoXCJodHRwXCIpKSB7XHJcbiAgICAgIC8v6K+05piO5piv5pys5Zyw55qEanNvbu+8jOWcqOejgeebmOS4reWtmOWcqOeahFxyXG4gICAgICBpZiAoIXVybC5pbmNsdWRlcyhcIjpcIikpIHtcclxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmhvc3QpIHtcclxuICAgICAgICAgIGxldCBvID0gbmV3IFVSTCh1cmwsIHRoaXMub3B0aW9ucy5ob3N0KVxyXG4gICAgICAgICAgdXJsID0gby5ocmVmXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdXJsXHJcbiAgfVxyXG4gIHNldCBiaWxsYm9hcmRJbWFnZSh2KSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzXHJcbiAgICB0aGlzLm9wdGlvbnMuYmlsbGJvYXJkLmltYWdlID0gdGhpcy5yZXBsYWNlSG9zdCh2LCB0aGlzLm9wdGlvbnMuaG9zdClcclxuICAgIGxldCB1cmwgPVxyXG4gICAgICB0aGlzLm9wdGlvbnMuYmlsbGJvYXJkLmltYWdlIHx8XHJcbiAgICAgIGdldEJpbGxib2FyZERlZmF1bHRVcmwodGhpcy5vcHRpb25zLmJpbGxib2FyZC5kZWZhdWx0SW1hZ2UpIHx8XHJcbiAgICAgIHRoaXMuZ2V0U291cmNlUm9vdFBhdGgoKSArICcvaW1nL0EtYWJsdS1ibGFuay5wbmcnXHJcblxyXG4gICAgdGhpcy5fZWxtcy5iaWxsYm9hcmRJbWFnZSAmJlxyXG4gICAgICB0aGlzLl9lbG1zLmJpbGxib2FyZEltYWdlLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgaXRlbS5zcmMgPSB1cmxcclxuICAgICAgfSlcclxuXHJcbiAgICBsZXQgaXNHbGYgPSBmYWxzZVxyXG4gICAgbGV0IHN1cGVyR2lmXHJcbiAgICBpZiAoX3RoaXMuZW50aXR5LmJpbGxib2FyZC5pbWFnZSAmJiBfdGhpcy5lbnRpdHkuYmlsbGJvYXJkLmltYWdlLmdldFZhKSB7IH1cclxuICAgIGlmICh1cmwgJiYgdXJsLmVuZHNXaXRoKCdnaWYnKSkge1xyXG4gICAgICBpc0dsZiA9IHRydWVcclxuXHJcbiAgICAgIGxldCBnaWZJbWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKVxyXG4gICAgICBnaWZJbWcuc2V0QXR0cmlidXRlKCdyZWw6YW5pbWF0ZWRfc3JjJywgdXJsKVxyXG4gICAgICBnaWZJbWcuc2V0QXR0cmlidXRlKCdyZWw6YXV0b19wbGF5JywgJzEnKVxyXG4gICAgICBjb25zdCBpbWdEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKVxyXG4gICAgICBpbWdEaXYuYXBwZW5kQ2hpbGQoZ2lmSW1nKVxyXG4gICAgICBsZXQgaWQgPSBDZXNpdW0uY3JlYXRlR3VpZCgpXHJcbiAgICAgIHN1cGVyR2lmID0gbmV3IFN1cGVyR2lmKHsgZ2lmOiBnaWZJbWcgfSlcclxuICAgICAgdGhpcy5fc3VwZXJHaWYgPSBzdXBlckdpZlxyXG4gICAgICB0aGlzLl9zdXBlckdpZi5pZCA9IGlkXHJcbiAgICAgIGxldCBiaWxsYm9hcmRIID0gMzZcclxuICAgICAgbGV0IGluZGV4ID0gMFxyXG4gICAgICBfdGhpcy5fZnJhbWVJbWFnZXMgPSBbXVxyXG4gICAgICBzdXBlckdpZi5sb2FkKGZ1bmN0aW9uIChzdGF0dXMpIHtcclxuICAgICAgICBpZiAoc3RhdHVzID09IDQwNCkge1xyXG4gICAgICAgICAgbGV0IHdpZHRoID0gMzFcclxuICAgICAgICAgIGxldCBoZWlnaHQgPSAzNlxyXG4gICAgICAgICAgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJylcclxuICAgICAgICAgIGNhbnZhcy53aWR0aCA9IDBcclxuICAgICAgICAgIGNhbnZhcy5oZWlnaHQgPSAwXHJcbiAgICAgICAgICBiaWxsYm9hcmRIID0gMFxyXG4gICAgICAgICAgX3RoaXMuZW50aXR5LmJpbGxib2FyZC5pbWdXaWR0aCA9IDBcclxuICAgICAgICAgIF90aGlzLmVudGl0eS5iaWxsYm9hcmQuaW1nSGVpZ2h0ID0gMFxyXG4gICAgICAgICAgX3RoaXMuZW50aXR5ICYmIChfdGhpcy5lbnRpdHkuYmlsbGJvYXJkLmltYWdlID0gY2FudmFzKVxyXG4gICAgICAgICAgX3RoaXMuZW50aXR5LmJpbGxib2FyZC5oZWlnaHQgPSBuZXcgQ2VzaXVtLkNhbGxiYWNrUHJvcGVydHkoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gMFxyXG4gICAgICAgICAgfSwgZmFsc2UpXHJcbiAgICAgICAgICBfdGhpcy5lbnRpdHkubGFiZWwucGl4ZWxPZmZzZXQgPSBuZXcgQ2VzaXVtLkNhbGxiYWNrUHJvcGVydHkoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IENlc2l1bS5DYXJ0ZXNpYW4yKDAsIDApXHJcbiAgICAgICAgICB9LCBmYWxzZSlcclxuICAgICAgICAgIGJpbGxib2FyZEggPSBoZWlnaHQgKiAoMzEgLyB3aWR0aClcclxuICAgICAgICAgIHJldHVyblxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoX3RoaXMuX3N1cGVyR2lmLmlkICE9IGlkKSB7XHJcbiAgICAgICAgICByZXR1cm5cclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IGxlbmd0aCA9IHN1cGVyR2lmLmdldF9sZW5ndGgoKVxyXG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IGxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBzdXBlckdpZi5tb3ZlX3RvKGkpXHJcbiAgICAgICAgICBfdGhpcy5fZnJhbWVJbWFnZXMucHVzaChzdXBlckdpZi5nZXRfY2FudmFzKCkudG9EYXRhVVJMKCkpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGNhbnZhcyA9IHN1cGVyR2lmLmdldF9jYW52YXMoKVxyXG4gICAgICAgIGxldCB3aWR0aCA9IGNhbnZhcy53aWR0aFxyXG4gICAgICAgIGxldCBoZWlnaHQgPSBjYW52YXMuaGVpZ2h0XHJcbiAgICAgICAgYmlsbGJvYXJkSCA9IGhlaWdodCAqICgzMSAvIHdpZHRoKVxyXG4gICAgICAgIF90aGlzLmVudGl0eS5iaWxsYm9hcmQuaW1nV2lkdGggPSB3aWR0aFxyXG4gICAgICAgIF90aGlzLmVudGl0eS5iaWxsYm9hcmQuaW1nSGVpZ2h0ID0gaGVpZ2h0XHJcbiAgICAgICAgX3RoaXMuZW50aXR5ICYmIChfdGhpcy5lbnRpdHkuYmlsbGJvYXJkLmltYWdlID0gbmV3IENlc2l1bS5DYWxsYmFja1Byb3BlcnR5KCgpID0+IHtcclxuICAgICAgICAgIGxldCBpbWcgPSBfdGhpcy5fZnJhbWVJbWFnZXNbaW5kZXhdXHJcbiAgICAgICAgICBpbmRleCA9IGluZGV4ID49IF90aGlzLl9mcmFtZUltYWdlcy5sZW5ndGggLSAxID8gMCA6IGluZGV4ICsgMVxyXG4gICAgICAgICAgcmV0dXJuIGltZ1xyXG4gICAgICAgIH0sIGZhbHNlKSlcclxuICAgICAgICBfdGhpcy5lbnRpdHkuYmlsbGJvYXJkLmhlaWdodCA9IG5ldyBDZXNpdW0uQ2FsbGJhY2tQcm9wZXJ0eShmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICByZXR1cm4gYmlsbGJvYXJkSFxyXG4gICAgICAgIH0sIGZhbHNlKVxyXG4gICAgICAgIF90aGlzLmVudGl0eS5sYWJlbC5waXhlbE9mZnNldCA9IG5ldyBDZXNpdW0uQ2FsbGJhY2tQcm9wZXJ0eShmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICBpZiAoX3RoaXMub3B0aW9ucy5iaWxsYm9hcmQuc2hvdykge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IENlc2l1bS5DYXJ0ZXNpYW4yKFxyXG4gICAgICAgICAgICAgIDAsXHJcbiAgICAgICAgICAgICAgLWJpbGxib2FyZEggKiBfdGhpcy5vcHRpb25zLmJpbGxib2FyZC5zY2FsZSAtXHJcbiAgICAgICAgICAgICAgX3RoaXMub3B0aW9ucy5sYWJlbC5mb250U2l6ZSAvIDIgLVxyXG4gICAgICAgICAgICAgIDVcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBDZXNpdW0uQ2FydGVzaWFuMigwLCAtX3RoaXMub3B0aW9ucy5sYWJlbC5mb250U2l6ZSAvIDIgLSA1KVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sIGZhbHNlKVxyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGxldCBpbWFnZSA9IG5ldyBJbWFnZSgpXHJcbiAgICAgIGltYWdlLnNyYyA9IHVybFxyXG4gICAgICBsZXQgYmlsbGJvYXJkSCA9IDM2XHJcbiAgICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpXHJcbiAgICAgIGltYWdlLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBsZXQgcmF0aW8gPSBpbWFnZS53aWR0aCAvIGltYWdlLmhlaWdodFxyXG4gICAgICAgIGltYWdlLndpZHRoID0gMTAwXHJcbiAgICAgICAgaW1hZ2UuaGVpZ2h0ID0gMTAwIC8gcmF0aW9cclxuICAgICAgICBsZXQgd2lkdGggPSBpbWFnZS53aWR0aFxyXG4gICAgICAgIGxldCBoZWlnaHQgPSBpbWFnZS5oZWlnaHRcclxuICAgICAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnLCB7IHdpbGxSZWFkRnJlcXVlbnRseTogdHJ1ZSB9KVxyXG4gICAgICAgIGNhbnZhcy53aWR0aCA9IHdpZHRoXHJcbiAgICAgICAgY2FudmFzLmhlaWdodCA9IGhlaWdodFxyXG4gICAgICAgIGN0eC5kcmF3SW1hZ2UoaW1hZ2UsIDAsIDAsIHdpZHRoLCBoZWlnaHQpXHJcbiAgICAgICAgYmlsbGJvYXJkSCA9IGhlaWdodCAqICgzMSAvIHdpZHRoKVxyXG4gICAgICAgIF90aGlzLmVudGl0eS5iaWxsYm9hcmQuaW1nV2lkdGggPSB3aWR0aFxyXG4gICAgICAgIF90aGlzLmVudGl0eS5iaWxsYm9hcmQuaW1nSGVpZ2h0ID0gaGVpZ2h0XHJcbiAgICAgICAgX3RoaXMuZW50aXR5ICYmIChfdGhpcy5lbnRpdHkuYmlsbGJvYXJkLmltYWdlID0gY2FudmFzKVxyXG4gICAgICAgIF90aGlzLmVudGl0eS5iaWxsYm9hcmQuaGVpZ2h0ID0gbmV3IENlc2l1bS5DYWxsYmFja1Byb3BlcnR5KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgIHJldHVybiBiaWxsYm9hcmRIXHJcbiAgICAgICAgfSwgZmFsc2UpXHJcbiAgICAgICAgX3RoaXMuZW50aXR5LmxhYmVsLnBpeGVsT2Zmc2V0ID0gbmV3IENlc2l1bS5DYWxsYmFja1Byb3BlcnR5KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgIGlmIChfdGhpcy5vcHRpb25zLmJpbGxib2FyZC5zaG93KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgQ2VzaXVtLkNhcnRlc2lhbjIoXHJcbiAgICAgICAgICAgICAgMCxcclxuICAgICAgICAgICAgICAtYmlsbGJvYXJkSCAqIF90aGlzLm9wdGlvbnMuYmlsbGJvYXJkLnNjYWxlIC1cclxuICAgICAgICAgICAgICBfdGhpcy5vcHRpb25zLmxhYmVsLmZvbnRTaXplIC8gMiAtXHJcbiAgICAgICAgICAgICAgNVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IENlc2l1bS5DYXJ0ZXNpYW4yKDAsIC1fdGhpcy5vcHRpb25zLmxhYmVsLmZvbnRTaXplIC8gMiAtIDUpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSwgZmFsc2UpXHJcbiAgICAgICAgYmlsbGJvYXJkSCA9IGhlaWdodCAqICgzMSAvIHdpZHRoKVxyXG4gICAgICB9XHJcbiAgICAgIGltYWdlLm9uZXJyb3IgPSBmdW5jdGlvbiAoZXJyKSB7XHJcbiAgICAgICAgbGV0IHdpZHRoID0gMzFcclxuICAgICAgICBsZXQgaGVpZ2h0ID0gMzZcclxuICAgICAgICBjYW52YXMud2lkdGggPSAwXHJcbiAgICAgICAgY2FudmFzLmhlaWdodCA9IDBcclxuICAgICAgICBiaWxsYm9hcmRIID0gMFxyXG4gICAgICAgIF90aGlzLmVudGl0eS5iaWxsYm9hcmQuaW1nV2lkdGggPSAwXHJcbiAgICAgICAgX3RoaXMuZW50aXR5LmJpbGxib2FyZC5pbWdIZWlnaHQgPSAwXHJcbiAgICAgICAgX3RoaXMuZW50aXR5ICYmIChfdGhpcy5lbnRpdHkuYmlsbGJvYXJkLmltYWdlID0gY2FudmFzKVxyXG4gICAgICAgIF90aGlzLmVudGl0eS5iaWxsYm9hcmQuaGVpZ2h0ID0gbmV3IENlc2l1bS5DYWxsYmFja1Byb3BlcnR5KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgIHJldHVybiAwXHJcbiAgICAgICAgfSwgZmFsc2UpXHJcbiAgICAgICAgX3RoaXMuZW50aXR5LmxhYmVsLnBpeGVsT2Zmc2V0ID0gbmV3IENlc2l1bS5DYWxsYmFja1Byb3BlcnR5KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgIHJldHVybiBuZXcgQ2VzaXVtLkNhcnRlc2lhbjIoMCwgMClcclxuICAgICAgICB9LCBmYWxzZSlcclxuICAgICAgICBiaWxsYm9hcmRIID0gaGVpZ2h0ICogKDMxIC8gd2lkdGgpXHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgYmlsbGJvYXJkU2NhbGUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmJpbGxib2FyZC5zY2FsZVxyXG4gIH1cclxuICBzZXQgYmlsbGJvYXJkU2NhbGUodikge1xyXG4gICAgdGhpcy5vcHRpb25zLmJpbGxib2FyZC5zY2FsZSA9IHZcclxuICAgIHRoaXMucmVuZXdQb2ludCgpXHJcbiAgICB0aGlzLl9lbG1zLmJpbGxib2FyZFNjYWxlICYmXHJcbiAgICAgIHRoaXMuX2VsbXMuYmlsbGJvYXJkU2NhbGUuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICBpdGVtLnZhbHVlID0gdlxyXG4gICAgICB9KVxyXG4gIH1cclxuXHJcbiAgZ2V0IGxhYmVsU2hvdygpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubGFiZWwuc2hvd1xyXG4gIH1cclxuICBzZXQgbGFiZWxTaG93KHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5sYWJlbC5zaG93ID0gdlxyXG4gICAgdGhpcy5lbnRpdHkgJiYgKHRoaXMuZW50aXR5LmxhYmVsLnNob3cgPSB2KVxyXG4gICAgdGhpcy5fZWxtcy5sYWJlbFNob3cgJiZcclxuICAgICAgdGhpcy5fZWxtcy5sYWJlbFNob3cuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICBpdGVtLnZhbHVlID0gdlxyXG4gICAgICB9KVxyXG4gIH1cclxuXHJcbiAgZ2V0IGxhYmVsRm9udEZhbWlseSgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubGFiZWwuZm9udEZhbWlseVxyXG4gIH1cclxuXHJcbiAgc2V0IGxhYmVsRm9udEZhbWlseSh2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMubGFiZWwuZm9udEZhbWlseSA9IHYgfHwgMFxyXG4gICAgdGhpcy5yZW5ld1BvaW50KClcclxuXHJcbiAgICBsZXQgbmFtZSA9IGdldEZvbnRGYW1pbHlOYW1lKHRoaXMubGFiZWxGb250RmFtaWx5KSB8fCAnJ1xyXG4gICAgdGhpcy5fZWxtcy5sYWJlbEZvbnRGYW1pbHkgJiZcclxuICAgICAgdGhpcy5fZWxtcy5sYWJlbEZvbnRGYW1pbHkuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICBpdGVtLnZhbHVlID0gbmFtZVxyXG4gICAgICB9KVxyXG4gIH1cclxuXHJcbiAgZ2V0IGxhYmVsRm9udFNpemUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmxhYmVsLmZvbnRTaXplXHJcbiAgfVxyXG4gIHNldCBsYWJlbEZvbnRTaXplKHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5sYWJlbC5mb250U2l6ZSA9IHZcclxuICAgIHRoaXMucmVuZXdQb2ludCgpXHJcbiAgICB0aGlzLl9lbG1zLmxhYmVsRm9udFNpemUgJiZcclxuICAgICAgdGhpcy5fZWxtcy5sYWJlbEZvbnRTaXplLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgaXRlbS52YWx1ZSA9IHZcclxuICAgICAgfSlcclxuICB9XHJcblxyXG4gIGdldCBsYWJlbENvbG9yKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5sYWJlbC5jb2xvclxyXG4gIH1cclxuICBzZXQgbGFiZWxDb2xvcih2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMubGFiZWwuY29sb3IgPSB2IHx8ICcjMDBmZmZmJ1xyXG4gICAgdGhpcy5yZW5ld1BvaW50KClcclxuICAgIGlmICh0aGlzLl9lbG1zLmxhYmVsQ29sb3IpIHtcclxuICAgICAgdGhpcy5fZWxtcy5sYWJlbENvbG9yLmZvckVhY2goKGl0ZW0sIGkpID0+IHtcclxuICAgICAgICBsZXQgY29sb3JQaWNrZXIgPSBuZXcgWUpDb2xvclBpY2tlcih7XHJcbiAgICAgICAgICBlbDogaXRlbS5lbCxcclxuICAgICAgICAgIHNpemU6ICdtaW5pJywgLy/popzoibJib3jnsbvlnotcclxuICAgICAgICAgIGFscGhhOiB0cnVlLCAvL+aYr+WQpuW8gOWQr+mAj+aYjuW6plxyXG4gICAgICAgICAgZGVmYXVsdENvbG9yOiB0aGlzLm9wdGlvbnMubGFiZWwuY29sb3IsXHJcbiAgICAgICAgICBkaXNhYmxlZDogZmFsc2UsIC8v5piv5ZCm56aB5q2i5omT5byA6aKc6Imy6YCJ5oup5ZmoXHJcbiAgICAgICAgICBvcGVuUGlja2VyQW5pOiAnb3BhY2l0eScsIC8v5omT5byA6aKc6Imy6YCJ5oup5Zmo5Yqo55S7XHJcbiAgICAgICAgICBzdXJlOiBjID0+IHtcclxuICAgICAgICAgICAgdGhpcy5sYWJlbENvbG9yID0gY1xyXG4gICAgICAgICAgfSwgLy/ngrnlh7vnoa7orqTmjInpkq7kuovku7blm57osINcclxuICAgICAgICAgIGNsZWFyOiAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubGFiZWxDb2xvciA9ICdyZ2JhKDAsMjU1LDI1NSwxKSdcclxuICAgICAgICAgIH0gLy/ngrnlh7vmuIXnqbrmjInpkq7kuovku7blm57osINcclxuICAgICAgICB9KVxyXG4gICAgICAgIHRoaXMuX2VsbXMubGFiZWxDb2xvcltpXSA9IGNvbG9yUGlja2VyXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBnZXQgZGlmZnVzZVNob3coKSB7XHJcbiAgLy8gICByZXR1cm4gdGhpcy5vcHRpb25zLmRpZmZ1c2VTaG93XHJcbiAgLy8gfVxyXG4gIC8vIHNldCBkaWZmdXNlU2hvdyh2KSB7XHJcbiAgLy8gICB0aGlzLm9wdGlvbnMuZGlmZnVzZVNob3cgPSB2XHJcbiAgLy8gICB0aGlzLl9lbG1zLmRpZmZ1c2VTaG93ICYmIHRoaXMuX2VsbXMuZGlmZnVzZVNob3cuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gIC8vICAgICBpdGVtLmNoZWNrZWQgPSB2XHJcbiAgLy8gICB9KVxyXG4gIC8vICAgaWYgKHYgJiYgdGhpcy5zY2FuU2hvdykge1xyXG4gIC8vICAgICB0aGlzLnNjYW5TaG93ID0gZmFsc2VcclxuICAvLyAgIH1cclxuICAvLyAgIGlmICh0aGlzLmRpZmZ1c2UpIHtcclxuICAvLyAgICAgaWYgKHRoaXMuc2hvdykge1xyXG4gIC8vICAgICAgIHRoaXMuZGlmZnVzZS5zaG93ID0gdGhpcy5vcHRpb25zLmRpZmZ1c2VTaG93XHJcbiAgLy8gICAgIH1cclxuICAvLyAgIH1cclxuICAvLyAgIGVsc2Uge1xyXG4gIC8vICAgICB0aGlzLmRpZmZ1c2UgPSBuZXcgQ2lyY2xlRGlmZnVzZSh0aGlzLnNkaywgeyBzaG93OiB0aGlzLmRpZmZ1c2VTaG93LCBsbmc6IHRoaXMubG5nLCBsYXQ6IHRoaXMubGF0LCByYWRpdXM6IHRoaXMuZGlmZnVzZVJhZGl1cywgZHVyYXRpb246IHRoaXMuZGlmZnVzZUR1cmF0aW9uLCBjb2xvcjogdGhpcy5kaWZmdXNlQ29sb3IgfSlcclxuICAvLyAgIH1cclxuICAvLyB9XHJcblxyXG4gIC8vIGdldCBkaWZmdXNlUmFkaXVzKCkge1xyXG4gIC8vICAgcmV0dXJuIHRoaXMub3B0aW9ucy5kaWZmdXNlUmFkaXVzXHJcbiAgLy8gfVxyXG4gIC8vIHNldCBkaWZmdXNlUmFkaXVzKHYpIHtcclxuICAvLyAgIHRoaXMub3B0aW9ucy5kaWZmdXNlUmFkaXVzID0gdlxyXG4gIC8vICAgdGhpcy5fZWxtcy5kaWZmdXNlUmFkaXVzICYmIHRoaXMuX2VsbXMuZGlmZnVzZVJhZGl1cy5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgLy8gICAgIGl0ZW0udmFsdWUgPSB2XHJcbiAgLy8gICB9KVxyXG4gIC8vICAgaWYgKHRoaXMuZGlmZnVzZSkge1xyXG4gIC8vICAgICB0aGlzLmRpZmZ1c2UucmFkaXVzID0gdGhpcy5vcHRpb25zLmRpZmZ1c2VSYWRpdXNcclxuICAvLyAgIH1cclxuICAvLyB9XHJcblxyXG4gIC8vIGdldCBkaWZmdXNlRHVyYXRpb24oKSB7XHJcbiAgLy8gICByZXR1cm4gdGhpcy5vcHRpb25zLmRpZmZ1c2VEdXJhdGlvblxyXG4gIC8vIH1cclxuICAvLyBzZXQgZGlmZnVzZUR1cmF0aW9uKHYpIHtcclxuICAvLyAgIHRoaXMub3B0aW9ucy5kaWZmdXNlRHVyYXRpb24gPSB2XHJcbiAgLy8gICB0aGlzLl9lbG1zLmRpZmZ1c2VEdXJhdGlvbiAmJiB0aGlzLl9lbG1zLmRpZmZ1c2VEdXJhdGlvbi5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgLy8gICAgIGl0ZW0udmFsdWUgPSB2XHJcbiAgLy8gICB9KVxyXG4gIC8vICAgaWYgKHRoaXMuZGlmZnVzZSkge1xyXG4gIC8vICAgICB0aGlzLmRpZmZ1c2UuZHVyYXRpb24gPSB0aGlzLm9wdGlvbnMuZGlmZnVzZUR1cmF0aW9uXHJcbiAgLy8gICB9XHJcbiAgLy8gfVxyXG5cclxuICAvLyBnZXQgZGlmZnVzZUNvbG9yKCkge1xyXG4gIC8vICAgcmV0dXJuIHRoaXMub3B0aW9ucy5kaWZmdXNlQ29sb3JcclxuICAvLyB9XHJcbiAgLy8gc2V0IGRpZmZ1c2VDb2xvcih2KSB7XHJcbiAgLy8gICB0aGlzLm9wdGlvbnMuZGlmZnVzZUNvbG9yID0gdlxyXG4gIC8vICAgaWYgKHRoaXMuX2VsbXMuZGlmZnVzZUNvbG9yKSB7XHJcbiAgLy8gICAgIHRoaXMuX2VsbXMuZGlmZnVzZUNvbG9yLmZvckVhY2goKGl0ZW0sIGkpID0+IHtcclxuICAvLyAgICAgICBsZXQgZGlmZnVzZUNvbG9yUGlja2VyID0gbmV3IFlKQ29sb3JQaWNrZXIoe1xyXG4gIC8vICAgICAgICAgZWw6IGl0ZW0uZWwsXHJcbiAgLy8gICAgICAgICBzaXplOiAnbWluaScsLy/popzoibJib3jnsbvlnotcclxuICAvLyAgICAgICAgIGFscGhhOiBmYWxzZSwvL+aYr+WQpuW8gOWQr+mAj+aYjuW6plxyXG4gIC8vICAgICAgICAgZGVmYXVsdENvbG9yOiB2LFxyXG4gIC8vICAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLC8v5piv5ZCm56aB5q2i5omT5byA6aKc6Imy6YCJ5oup5ZmoXHJcbiAgLy8gICAgICAgICBvcGVuUGlja2VyQW5pOiAnb3BhY2l0eScsLy/miZPlvIDpopzoibLpgInmi6nlmajliqjnlLtcclxuICAvLyAgICAgICAgIHN1cmU6IChjKSA9PiB7XHJcbiAgLy8gICAgICAgICAgIHRoaXMuZGlmZnVzZUNvbG9yID0gY1xyXG4gIC8vICAgICAgICAgfSwvL+eCueWHu+ehruiupOaMiemSruS6i+S7tuWbnuiwg1xyXG4gIC8vICAgICAgICAgY2xlYXI6ICgpID0+IHtcclxuICAvLyAgICAgICAgICAgdGhpcy5kaWZmdXNlQ29sb3IgPSAncmdiYSgyNTUsMjU1LDI1NSwxKSdcclxuICAvLyAgICAgICAgIH0sLy/ngrnlh7vmuIXnqbrmjInpkq7kuovku7blm57osINcclxuICAvLyAgICAgICB9KVxyXG4gIC8vICAgICAgIHRoaXMuX2VsbXMuZGlmZnVzZUNvbG9yW2ldID0gZGlmZnVzZUNvbG9yUGlja2VyXHJcbiAgLy8gICAgIH0pXHJcbiAgLy8gICB9XHJcbiAgLy8gICBpZiAodGhpcy5kaWZmdXNlKSB7XHJcbiAgLy8gICAgIHRoaXMuZGlmZnVzZS5jb2xvciA9IHRoaXMub3B0aW9ucy5kaWZmdXNlQ29sb3JcclxuICAvLyAgIH1cclxuICAvLyB9XHJcblxyXG4gIC8vIGdldCBzY2FuU2hvdygpIHtcclxuICAvLyAgIHJldHVybiB0aGlzLm9wdGlvbnMuc2NhblNob3dcclxuICAvLyB9XHJcbiAgLy8gc2V0IHNjYW5TaG93KHYpIHtcclxuICAvLyAgIHRoaXMub3B0aW9ucy5zY2FuU2hvdyA9IHZcclxuICAvLyAgIHRoaXMuX2VsbXMuc2NhblNob3cgJiYgdGhpcy5fZWxtcy5zY2FuU2hvdy5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgLy8gICAgIGl0ZW0uY2hlY2tlZCA9IHZcclxuICAvLyAgIH0pXHJcbiAgLy8gICBpZiAodiAmJiB0aGlzLmRpZmZ1c2VTaG93KSB7XHJcbiAgLy8gICAgIHRoaXMuZGlmZnVzZVNob3cgPSBmYWxzZVxyXG4gIC8vICAgfVxyXG4gIC8vICAgaWYgKHRoaXMuc2Nhbikge1xyXG4gIC8vICAgICBpZiAodGhpcy5zaG93KSB7XHJcbiAgLy8gICAgICAgdGhpcy5zY2FuLnNob3cgPSB0aGlzLm9wdGlvbnMuc2NhblNob3dcclxuICAvLyAgICAgfVxyXG4gIC8vICAgfVxyXG4gIC8vICAgZWxzZSB7XHJcbiAgLy8gICAgIHRoaXMuc2NhbiA9IG5ldyBSYWRhclNjYW4odGhpcy5zZGssIHsgc2hvdzogdGhpcy5zY2FuU2hvdywgbG5nOiB0aGlzLmxuZywgbGF0OiB0aGlzLmxhdCwgcmFkaXVzOiB0aGlzLnNjYW5SYWRpdXMsIGR1cmF0aW9uOiB0aGlzLnNjYW5EdXJhdGlvbiwgY29sb3I6IHRoaXMuc2NhbkNvbG9yIH0pXHJcbiAgLy8gICB9XHJcbiAgLy8gfVxyXG5cclxuICAvLyBnZXQgc2NhblJhZGl1cygpIHtcclxuICAvLyAgIHJldHVybiB0aGlzLm9wdGlvbnMuc2NhblJhZGl1c1xyXG4gIC8vIH1cclxuICAvLyBzZXQgc2NhblJhZGl1cyh2KSB7XHJcbiAgLy8gICB0aGlzLm9wdGlvbnMuc2NhblJhZGl1cyA9IHZcclxuICAvLyAgIHRoaXMuX2VsbXMuc2NhblJhZGl1cyAmJiB0aGlzLl9lbG1zLnNjYW5SYWRpdXMuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gIC8vICAgICBpdGVtLnZhbHVlID0gdlxyXG4gIC8vICAgfSlcclxuICAvLyAgIGlmICh0aGlzLnNjYW4pIHtcclxuICAvLyAgICAgdGhpcy5zY2FuLnJhZGl1cyA9IHRoaXMub3B0aW9ucy5zY2FuUmFkaXVzXHJcbiAgLy8gICB9XHJcbiAgLy8gfVxyXG5cclxuICAvLyBnZXQgc2NhbkR1cmF0aW9uKCkge1xyXG4gIC8vICAgcmV0dXJuIHRoaXMub3B0aW9ucy5zY2FuRHVyYXRpb25cclxuICAvLyB9XHJcbiAgLy8gc2V0IHNjYW5EdXJhdGlvbih2KSB7XHJcbiAgLy8gICB0aGlzLm9wdGlvbnMuc2NhbkR1cmF0aW9uID0gdlxyXG4gIC8vICAgdGhpcy5fZWxtcy5zY2FuRHVyYXRpb24gJiYgdGhpcy5fZWxtcy5zY2FuRHVyYXRpb24uZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gIC8vICAgICBpdGVtLnZhbHVlID0gdlxyXG4gIC8vICAgfSlcclxuICAvLyAgIGlmICh0aGlzLnNjYW4pIHtcclxuICAvLyAgICAgdGhpcy5zY2FuLmR1cmF0aW9uID0gdGhpcy5vcHRpb25zLnNjYW5EdXJhdGlvblxyXG4gIC8vICAgfVxyXG4gIC8vIH1cclxuXHJcbiAgLy8gZ2V0IHNjYW5Db2xvcigpIHtcclxuICAvLyAgIHJldHVybiB0aGlzLm9wdGlvbnMuc2NhbkNvbG9yXHJcbiAgLy8gfVxyXG4gIC8vIHNldCBzY2FuQ29sb3Iodikge1xyXG4gIC8vICAgdGhpcy5vcHRpb25zLnNjYW5Db2xvciA9IHZcclxuICAvLyAgIGlmICh0aGlzLl9lbG1zLnNjYW5Db2xvcikge1xyXG4gIC8vICAgICB0aGlzLl9lbG1zLnNjYW5Db2xvci5mb3JFYWNoKChpdGVtLCBpKSA9PiB7XHJcbiAgLy8gICAgICAgbGV0IHNjYW5Db2xvclBpY2tlciA9IG5ldyBZSkNvbG9yUGlja2VyKHtcclxuICAvLyAgICAgICAgIGVsOiBpdGVtLmVsLFxyXG4gIC8vICAgICAgICAgc2l6ZTogJ21pbmknLC8v6aKc6ImyYm9457G75Z6LXHJcbiAgLy8gICAgICAgICBhbHBoYTogZmFsc2UsLy/mmK/lkKblvIDlkK/pgI/mmI7luqZcclxuICAvLyAgICAgICAgIGRlZmF1bHRDb2xvcjogdixcclxuICAvLyAgICAgICAgIGRpc2FibGVkOiBmYWxzZSwvL+aYr+WQpuemgeatouaJk+W8gOminOiJsumAieaLqeWZqFxyXG4gIC8vICAgICAgICAgb3BlblBpY2tlckFuaTogJ29wYWNpdHknLC8v5omT5byA6aKc6Imy6YCJ5oup5Zmo5Yqo55S7XHJcbiAgLy8gICAgICAgICBzdXJlOiAoYykgPT4ge1xyXG4gIC8vICAgICAgICAgICB0aGlzLnNjYW5Db2xvciA9IGNcclxuICAvLyAgICAgICAgIH0sLy/ngrnlh7vnoa7orqTmjInpkq7kuovku7blm57osINcclxuICAvLyAgICAgICAgIGNsZWFyOiAoKSA9PiB7XHJcbiAgLy8gICAgICAgICAgIHRoaXMuc2NhbkNvbG9yID0gJ3JnYmEoMjU1LDI1NSwyNTUsMSknXHJcbiAgLy8gICAgICAgICB9LC8v54K55Ye75riF56m65oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgLy8gICAgICAgfSlcclxuICAvLyAgICAgICB0aGlzLl9lbG1zLnNjYW5Db2xvcltpXSA9IHNjYW5Db2xvclBpY2tlclxyXG4gIC8vICAgICB9KVxyXG4gIC8vICAgfVxyXG4gIC8vICAgaWYgKHRoaXMuc2Nhbikge1xyXG4gIC8vICAgICB0aGlzLnNjYW4uY29sb3IgPSB0aGlzLm9wdGlvbnMuc2NhbkNvbG9yXHJcbiAgLy8gICB9XHJcbiAgLy8gfVxyXG5cclxuXHJcbiAgZ2V0IGF0dHJpYnV0ZUxpbmsoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnRcclxuICB9XHJcblxyXG4gIHNldCBhdHRyaWJ1dGVMaW5rKHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50ID0gdlxyXG4gICAgaWYgKFxyXG4gICAgICAhdGhpcy5fRGlhbG9nT2JqZWN0IHx8XHJcbiAgICAgICF0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQgfHxcclxuICAgICAgIXRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50IHx8XHJcbiAgICAgIHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXHJcbiAgICAgICAgJ2F0dHJpYnV0ZS1jb250ZW50LWxpbmsnXHJcbiAgICAgICkubGVuZ3RoID09IDBcclxuICAgICkge1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuICAgIGxldCB0YWJsZSA9IHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50XHJcbiAgICAgIC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdhdHRyaWJ1dGUtY29udGVudC1saW5rJylbMV1cclxuICAgICAgLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RhYmxlJylbMF1cclxuICAgIGxldCB0YWJsZUNvbnRlbnQgPSB0YWJsZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0YWJsZS1ib2R5JylbMF1cclxuICAgIHRhYmxlQ29udGVudC5pbm5lckhUTUwgPSAnJ1xyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50Lmxlbmd0aCA+IDApIHtcclxuICAgICAgdGFibGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndGFibGUtZW1wdHknKVswXS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0YWJsZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0YWJsZS1lbXB0eScpWzBdLnN0eWxlLmRpc3BsYXkgPSAnZmxleCdcclxuICAgIH1cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnQubGVuZ3RoOyBpKyspIHtcclxuICAgICAgbGV0IHRyID1cclxuICAgICAgICBgXHJcbiAgICAgIDxkaXYgY2xhc3M9XCJ0clwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRkXCI+YCArXHJcbiAgICAgICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnRbaV0ubmFtZSArXHJcbiAgICAgICAgYDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRkXCI+YCArXHJcbiAgICAgICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnRbaV0udXJsICtcclxuICAgICAgICBgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidGRcIj5cclxuICAgICAgICAgICAgICA8YnV0dG9uIEBjbGljaz1cImxpbmtFZGl0XCI+57yW6L6RPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvbiBAY2xpY2s9XCJsaW5rRGVsZXRlXCI+5Yig6ZmkPC9idXR0b24+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+YFxyXG4gICAgICBsZXQgdHJFbG0gPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpLmNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudCh0cilcclxuICAgICAgdGFibGVDb250ZW50LmFwcGVuZENoaWxkKHRyRWxtKVxyXG4gICAgfVxyXG4gICAgbGV0IGl0ZW0gPSB0YWJsZUNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndHInKVxyXG4gICAgbGV0IGZ1biA9IHtcclxuICAgICAgbGlua0VkaXQ6IGFzeW5jIGluZGV4ID0+IHtcclxuICAgICAgICB0aGlzLmF0dHJpYnV0ZUxpbmsgPSBhd2FpdCB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudFxyXG4gICAgICAgIGxldCB0YWJsZSA9IHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50XHJcbiAgICAgICAgICAuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnYXR0cmlidXRlLWNvbnRlbnQtbGluaycpWzFdXHJcbiAgICAgICAgICAuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndGFibGUnKVswXVxyXG4gICAgICAgIGxldCB0YWJsZUNvbnRlbnQgPSB0YWJsZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0YWJsZS1ib2R5JylbMF1cclxuICAgICAgICBsZXQgaXRlbSA9IHRhYmxlQ29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0cicpXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpdGVtLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBpZiAoaW5kZXggPT09IGkpIHtcclxuICAgICAgICAgICAgbGV0IGhlaWdodCA9IGl0ZW1baV0ub2Zmc2V0SGVpZ2h0XHJcbiAgICAgICAgICAgIGxldCBodG1sID0gYFxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZFwiPlxyXG4gICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiaW5wdXRcIiB0eXBlPVwidGV4dFwiPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZFwiPlxyXG4gICAgICAgICAgICAgICAgPHRleHRhcmVhIGNsYXNzPVwiaW5wdXQgbGluay1lZGl0XCIgdHlwZT1cInRleHRcIj48L3RleHRhcmVhPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZFwiPlxyXG4gICAgICAgICAgICAgICAgICA8YnV0dG9uIEBjbGljaz1cImNvbmZpcm1FZGl0XCI+56Gu6K6kPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgIDxidXR0b24gQGNsaWNrPVwiY2FuY2VsRWRpdFwiPuWPlua2iDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDwvZGl2PmBcclxuICAgICAgICAgICAgaXRlbVtpXS5pbm5lckhUTUwgPSBodG1sXHJcbiAgICAgICAgICAgIGxldCB0ZXh0YXJlYUVsbSA9IGl0ZW1baV0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbGluay1lZGl0JylbMF1cclxuICAgICAgICAgICAgdGV4dGFyZWFFbG0uc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0IC0gMTAgKyAncHgnXHJcbiAgICAgICAgICAgIGxldCB0ZCA9IGl0ZW1baV0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndGQnKVxyXG4gICAgICAgICAgICB0ZFswXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFxyXG4gICAgICAgICAgICAgICdpbnB1dCdcclxuICAgICAgICAgICAgKVswXS52YWx1ZSA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50W2luZGV4XS5uYW1lXHJcbiAgICAgICAgICAgIHRkWzFdLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXHJcbiAgICAgICAgICAgICAgJ2lucHV0J1xyXG4gICAgICAgICAgICApWzBdLnZhbHVlID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnRbaW5kZXhdLnVybFxyXG4gICAgICAgICAgICBsZXQgYnRuID0gaXRlbVtpXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnYnV0dG9uJylcclxuICAgICAgICAgICAgZm9yIChsZXQgbiA9IDA7IG4gPCBidG4ubGVuZ3RoOyBuKyspIHtcclxuICAgICAgICAgICAgICBpZiAoIWJ0bltuXSB8fCAhYnRuW25dLmF0dHJpYnV0ZXMpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGZvciAobGV0IG0gb2YgYnRuW25dLmF0dHJpYnV0ZXMpIHtcclxuICAgICAgICAgICAgICAgIGlmIChtLm5hbWUgPT09ICdAY2xpY2snKSB7XHJcbiAgICAgICAgICAgICAgICAgIGJ0bltuXS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGUgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZnVuW20udmFsdWVdID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBmdW5bbS52YWx1ZV0oXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiB0ZFswXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdpbnB1dCcpWzBdLnZhbHVlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogdGRbMV0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaW5wdXQnKVswXS52YWx1ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpXHJcbiAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICBidG5bbl0uYXR0cmlidXRlcy5yZW1vdmVOYW1lZEl0ZW0obS5uYW1lKVxyXG4gICAgICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgbGlua0RlbGV0ZTogaSA9PiB7XHJcbiAgICAgICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnQuc3BsaWNlKGksIDEpXHJcbiAgICAgICAgdGhpcy5hdHRyaWJ1dGVMaW5rID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnRcclxuICAgICAgfSxcclxuXHJcbiAgICAgIGNvbmZpcm1FZGl0OiAodmFsdWUsIGkpID0+IHtcclxuICAgICAgICBsZXQgbmFtZSA9IHZhbHVlLm5hbWUgJiYgdmFsdWUubmFtZS5yZXBsYWNlKC9cXHMvZywgJycpXHJcbiAgICAgICAgbGV0IHVybCA9IHZhbHVlLnVybCAmJiB2YWx1ZS51cmwucmVwbGFjZSgvXFxzL2csICcnKVxyXG4gICAgICAgIGlmIChuYW1lICYmIHVybCkge1xyXG4gICAgICAgICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnRbaV0gPSB2YWx1ZVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB3aW5kb3cuRUxFTUVOVCAmJlxyXG4gICAgICAgICAgICB3aW5kb3cuRUxFTUVOVC5NZXNzYWdlKHtcclxuICAgICAgICAgICAgICBtZXNzYWdlOiAn5ZCN56ew5oiW6ZO+5o6l5LiN6IO95Li656m677yBJyxcclxuICAgICAgICAgICAgICB0eXBlOiAnd2FybmluZycsXHJcbiAgICAgICAgICAgICAgZHVyYXRpb246IDE1MDBcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5hdHRyaWJ1dGVMaW5rID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnRcclxuICAgICAgfSxcclxuICAgICAgY2FuY2VsRWRpdDogKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuYXR0cmlidXRlTGluayA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50XHJcbiAgICAgIH0sXHJcbiAgICAgIGZpbGVTZWxlY3Q6ICh2YWx1ZSwgaSkgPT4ge1xyXG4gICAgICAgIGxldCBmaWxlRWxtID0gaXRlbVtpXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdmaWxlLXNlbGVjdCcpWzBdXHJcbiAgICAgICAgZmlsZUVsbS5jbGljaygpXHJcbiAgICAgICAgZmlsZUVsbS5yZW1vdmVFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBmaWxlU2VsZWN0KVxyXG4gICAgICAgIGZpbGVFbG0uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgZmlsZVNlbGVjdClcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgbGV0IGZpbGVTZWxlY3QgPSBldmVudCA9PiB7XHJcbiAgICAgIGlmIChldmVudC50YXJnZXQudmFsdWUpIHtcclxuICAgICAgICBsZXQgdGQgPSBpdGVtW1xyXG4gICAgICAgICAgZXZlbnQudGFyZ2V0LmdldEF0dHJpYnV0ZSgnaW5kZXgnKVxyXG4gICAgICAgIF0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndGQnKVxyXG4gICAgICAgIHRkWzFdLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2lucHV0JylbMF0udmFsdWUgPSBldmVudC50YXJnZXQudmFsdWVcclxuICAgICAgICBldmVudC50YXJnZXQudmFsdWUgPSBudWxsXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbS5sZW5ndGg7IGkrKykge1xyXG4gICAgICBsZXQgYnRuID0gaXRlbVtpXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnYnV0dG9uJylcclxuICAgICAgZm9yIChsZXQgbiA9IDA7IG4gPCBidG4ubGVuZ3RoOyBuKyspIHtcclxuICAgICAgICBpZiAoIWJ0bltuXSB8fCAhYnRuW25dLmF0dHJpYnV0ZXMpIHtcclxuICAgICAgICAgIGNvbnRpbnVlXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvciAobGV0IG0gb2YgYnRuW25dLmF0dHJpYnV0ZXMpIHtcclxuICAgICAgICAgIGlmIChtLm5hbWUgPT09ICdAY2xpY2snKSB7XHJcbiAgICAgICAgICAgIGJ0bltuXS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGUgPT4ge1xyXG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgZnVuW20udmFsdWVdID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgICAgICBmdW5bbS52YWx1ZV0oaSlcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIGJ0bltuXS5hdHRyaWJ1dGVzLnJlbW92ZU5hbWVkSXRlbShtLm5hbWUpXHJcbiAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgYXR0cmlidXRlQ2FtZXJhKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUuY2FtZXJhLmNvbnRlbnRcclxuICB9XHJcblxyXG4gIHNldCBhdHRyaWJ1dGVDYW1lcmEodikge1xyXG4gICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5jYW1lcmEuY29udGVudCA9IHZcclxuICB9XHJcblxyXG4gIGdldCBhdHRyaWJ1dGVJU0MoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5pc2MuY29udGVudFxyXG4gIH1cclxuXHJcbiAgc2V0IGF0dHJpYnV0ZUlTQyh2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmlzYy5jb250ZW50ID0gdlxyXG4gIH1cclxuXHJcbiAgZ2V0IGF0dHJpYnV0ZVZyKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudFxyXG4gIH1cclxuXHJcbiAgc2V0IGF0dHJpYnV0ZVZyKHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudCA9IHZcclxuICAgIGlmIChcclxuICAgICAgIXRoaXMuX0RpYWxvZ09iamVjdCB8fFxyXG4gICAgICAhdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50IHx8XHJcbiAgICAgICF0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudCB8fFxyXG4gICAgICB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFxyXG4gICAgICAgICdhdHRyaWJ1dGUtY29udGVudC12cidcclxuICAgICAgKS5sZW5ndGggPT0gMFxyXG4gICAgKSB7XHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG4gICAgbGV0IHRhYmxlID0gdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnRcclxuICAgICAgLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2F0dHJpYnV0ZS1jb250ZW50LXZyJylbMV1cclxuICAgICAgLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RhYmxlJylbMF1cclxuICAgIGxldCB0YWJsZUNvbnRlbnQgPSB0YWJsZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0YWJsZS1ib2R5JylbMF1cclxuICAgIHRhYmxlQ29udGVudC5pbm5lckhUTUwgPSAnJ1xyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudC5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRhYmxlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RhYmxlLWVtcHR5JylbMF0uc3R5bGUuZGlzcGxheSA9ICdub25lJ1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGFibGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndGFibGUtZW1wdHknKVswXS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnXHJcbiAgICB9XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudC5sZW5ndGg7IGkrKykge1xyXG4gICAgICBsZXQgdHIgPVxyXG4gICAgICAgIGBcclxuICAgICAgPGRpdiBjbGFzcz1cInRyXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidGRcIj5gICtcclxuICAgICAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnRbaV0ubmFtZSArXHJcbiAgICAgICAgYDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRkXCI+YCArXHJcbiAgICAgICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52ci5jb250ZW50W2ldLnVybCArXHJcbiAgICAgICAgYDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRkXCI+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvbiBAY2xpY2s9XCJ2ckVkaXRcIj7nvJbovpE8L2J1dHRvbj5cclxuICAgICAgICAgICAgICA8YnV0dG9uIEBjbGljaz1cInZyRGVsZXRlXCI+5Yig6ZmkPC9idXR0b24+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+YFxyXG4gICAgICBsZXQgdHJFbG0gPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpLmNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudCh0cilcclxuICAgICAgdGFibGVDb250ZW50LmFwcGVuZENoaWxkKHRyRWxtKVxyXG4gICAgfVxyXG4gICAgbGV0IGl0ZW0gPSB0YWJsZUNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndHInKVxyXG4gICAgbGV0IGZ1biA9IHtcclxuICAgICAgdnJFZGl0OiBhc3luYyBpbmRleCA9PiB7XHJcbiAgICAgICAgdGhpcy5hdHRyaWJ1dGVWciA9IGF3YWl0IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudFxyXG4gICAgICAgIGxldCB0YWJsZSA9IHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50XHJcbiAgICAgICAgICAuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnYXR0cmlidXRlLWNvbnRlbnQtdnInKVsxXVxyXG4gICAgICAgICAgLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RhYmxlJylbMF1cclxuICAgICAgICBsZXQgdGFibGVDb250ZW50ID0gdGFibGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndGFibGUtYm9keScpWzBdXHJcbiAgICAgICAgbGV0IGl0ZW0gPSB0YWJsZUNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndHInKVxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgaWYgKGluZGV4ID09PSBpKSB7XHJcbiAgICAgICAgICAgIGxldCBoZWlnaHQgPSBpdGVtW2ldLm9mZnNldEhlaWdodFxyXG4gICAgICAgICAgICBsZXQgaHRtbCA9IGBcclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGRcIj5cclxuICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImlucHV0XCIgdHlwZT1cInRleHRcIj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGRcIj5cclxuICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBjbGFzcz1cImlucHV0IGxpbmstZWRpdFwiIHR5cGU9XCJ0ZXh0XCI+PC90ZXh0YXJlYT5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGRcIj5cclxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBAY2xpY2s9XCJjb25maXJtRWRpdFwiPuehruiupDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICA8YnV0dG9uIEBjbGljaz1cImNhbmNlbEVkaXRcIj7lj5bmtog8L2J1dHRvbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5gXHJcbiAgICAgICAgICAgIGl0ZW1baV0uaW5uZXJIVE1MID0gaHRtbFxyXG4gICAgICAgICAgICBsZXQgdGV4dGFyZWFFbG0gPSBpdGVtW2ldLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xpbmstZWRpdCcpWzBdXHJcbiAgICAgICAgICAgIHRleHRhcmVhRWxtLnN0eWxlLmhlaWdodCA9IGhlaWdodCAtIDEwICsgJ3B4J1xyXG4gICAgICAgICAgICBsZXQgdGQgPSBpdGVtW2ldLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RkJylcclxuICAgICAgICAgICAgdGRbMF0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcclxuICAgICAgICAgICAgICAnaW5wdXQnXHJcbiAgICAgICAgICAgIClbMF0udmFsdWUgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnRbaW5kZXhdLm5hbWVcclxuICAgICAgICAgICAgdGRbMV0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcclxuICAgICAgICAgICAgICAnaW5wdXQnXHJcbiAgICAgICAgICAgIClbMF0udmFsdWUgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnRbaW5kZXhdLnVybFxyXG4gICAgICAgICAgICBsZXQgYnRuID0gaXRlbVtpXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnYnV0dG9uJylcclxuICAgICAgICAgICAgZm9yIChsZXQgbiA9IDA7IG4gPCBidG4ubGVuZ3RoOyBuKyspIHtcclxuICAgICAgICAgICAgICBpZiAoIWJ0bltuXSB8fCAhYnRuW25dLmF0dHJpYnV0ZXMpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGZvciAobGV0IG0gb2YgYnRuW25dLmF0dHJpYnV0ZXMpIHtcclxuICAgICAgICAgICAgICAgIGlmIChtLm5hbWUgPT09ICdAY2xpY2snKSB7XHJcbiAgICAgICAgICAgICAgICAgIGJ0bltuXS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGUgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZnVuW20udmFsdWVdID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBmdW5bbS52YWx1ZV0oXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiB0ZFswXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdpbnB1dCcpWzBdLnZhbHVlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogdGRbMV0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaW5wdXQnKVswXS52YWx1ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpXHJcbiAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICBidG5bbl0uYXR0cmlidXRlcy5yZW1vdmVOYW1lZEl0ZW0obS5uYW1lKVxyXG4gICAgICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgdnJEZWxldGU6IGkgPT4ge1xyXG4gICAgICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudC5zcGxpY2UoaSwgMSlcclxuICAgICAgICB0aGlzLmF0dHJpYnV0ZVZyID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52ci5jb250ZW50XHJcbiAgICAgIH0sXHJcblxyXG4gICAgICBjb25maXJtRWRpdDogKHZhbHVlLCBpKSA9PiB7XHJcbiAgICAgICAgbGV0IG5hbWUgPSB2YWx1ZS5uYW1lICYmIHZhbHVlLm5hbWUucmVwbGFjZSgvXFxzL2csICcnKVxyXG4gICAgICAgIGxldCB1cmwgPSB2YWx1ZS51cmwgJiYgdmFsdWUudXJsLnJlcGxhY2UoL1xccy9nLCAnJylcclxuICAgICAgICBpZiAobmFtZSAmJiB1cmwpIHtcclxuICAgICAgICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudFtpXSA9IHZhbHVlXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHdpbmRvdy5FTEVNRU5UICYmXHJcbiAgICAgICAgICAgIHdpbmRvdy5FTEVNRU5ULk1lc3NhZ2Uoe1xyXG4gICAgICAgICAgICAgIG1lc3NhZ2U6ICflkI3np7DmiJbpk77mjqXkuI3og73kuLrnqbrvvIEnLFxyXG4gICAgICAgICAgICAgIHR5cGU6ICd3YXJuaW5nJyxcclxuICAgICAgICAgICAgICBkdXJhdGlvbjogMTUwMFxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmF0dHJpYnV0ZVZyID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52ci5jb250ZW50XHJcbiAgICAgIH0sXHJcbiAgICAgIGNhbmNlbEVkaXQ6ICgpID0+IHtcclxuICAgICAgICB0aGlzLmF0dHJpYnV0ZVZyID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52ci5jb250ZW50XHJcbiAgICAgIH0sXHJcbiAgICAgIGZpbGVTZWxlY3Q6ICh2YWx1ZSwgaSkgPT4ge1xyXG4gICAgICAgIGxldCBmaWxlRWxtID0gaXRlbVtpXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdmaWxlLXNlbGVjdCcpWzBdXHJcbiAgICAgICAgZmlsZUVsbS5jbGljaygpXHJcbiAgICAgICAgZmlsZUVsbS5yZW1vdmVFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBmaWxlU2VsZWN0KVxyXG4gICAgICAgIGZpbGVFbG0uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgZmlsZVNlbGVjdClcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgbGV0IGZpbGVTZWxlY3QgPSBldmVudCA9PiB7XHJcbiAgICAgIGlmIChldmVudC50YXJnZXQudmFsdWUpIHtcclxuICAgICAgICBsZXQgdGQgPSBpdGVtW1xyXG4gICAgICAgICAgZXZlbnQudGFyZ2V0LmdldEF0dHJpYnV0ZSgnaW5kZXgnKVxyXG4gICAgICAgIF0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndGQnKVxyXG4gICAgICAgIHRkWzFdLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2lucHV0JylbMF0udmFsdWUgPSBldmVudC50YXJnZXQudmFsdWVcclxuICAgICAgICBldmVudC50YXJnZXQudmFsdWUgPSBudWxsXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbS5sZW5ndGg7IGkrKykge1xyXG4gICAgICBsZXQgYnRuID0gaXRlbVtpXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnYnV0dG9uJylcclxuICAgICAgZm9yIChsZXQgbiA9IDA7IG4gPCBidG4ubGVuZ3RoOyBuKyspIHtcclxuICAgICAgICBpZiAoIWJ0bltuXSB8fCAhYnRuW25dLmF0dHJpYnV0ZXMpIHtcclxuICAgICAgICAgIGNvbnRpbnVlXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvciAobGV0IG0gb2YgYnRuW25dLmF0dHJpYnV0ZXMpIHtcclxuICAgICAgICAgIGlmIChtLm5hbWUgPT09ICdAY2xpY2snKSB7XHJcbiAgICAgICAgICAgIGJ0bltuXS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGUgPT4ge1xyXG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgZnVuW20udmFsdWVdID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgICAgICBmdW5bbS52YWx1ZV0oaSlcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIGJ0bltuXS5hdHRyaWJ1dGVzLnJlbW92ZU5hbWVkSXRlbShtLm5hbWUpXHJcbiAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgYXR0cmlidXRlR29vZHMoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5nb29kcy5jb250ZW50XHJcbiAgfVxyXG5cclxuICBzZXQgYXR0cmlidXRlR29vZHModikge1xyXG4gICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5nb29kcy5jb250ZW50ID0gdlxyXG4gIH1cclxuXHJcbiAgZ2V0IGJpbGxib2FyZERlZmF1bHRJbWFnZSgpIHtcclxuICAgIHJldHVybiAoXHJcbiAgICAgIGdldEJpbGxib2FyZERlZmF1bHRVcmwodGhpcy5vcHRpb25zLmJpbGxib2FyZC5kZWZhdWx0SW1hZ2UpIHx8XHJcbiAgICAgIHRoaXMuZ2V0U291cmNlUm9vdFBhdGgoKSArICcvaW1nL0EtYWJsdS1ibGFuay5wbmcnXHJcbiAgICApXHJcbiAgfVxyXG5cclxuICBzZXQgYmlsbGJvYXJkRGVmYXVsdEltYWdlKHYpIHtcclxuICAgIGxldCB1cmwgPSB0aGlzLnJlcGxhY2VIb3N0KHYsIHRoaXMub3B0aW9ucy5ob3N0KVxyXG4gICAgc2V0QmlsbGJvYXJkRGVmYXVsdFVybCh1cmwsIHRoaXMub3B0aW9ucy5iaWxsYm9hcmQuZGVmYXVsdEltYWdlKVxyXG4gICAgdGhpcy5fZWxtcy5iaWxsYm9hcmREZWZhdWx0SW1hZ2UgJiZcclxuICAgICAgdGhpcy5fZWxtcy5iaWxsYm9hcmREZWZhdWx0SW1hZ2UuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICBpdGVtLnNyYyA9IHVybFxyXG4gICAgICB9KVxyXG4gIH1cclxuXHJcbiAgZ2V0IGNvb3JkaW5hdGUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmNvb3JkaW5hdGVcclxuICB9XHJcbiAgc2V0IGNvb3JkaW5hdGUodikge1xyXG4gICAgcmV0dXJuXHJcbiAgICB0aGlzLm9wdGlvbnMuY29vcmRpbmF0ZSA9IHZcclxuICAgIGxldCBwb3NpdGlvbiA9IHRoaXMuX3Byb2ouY29udmVydChcclxuICAgICAgW1xyXG4gICAgICAgIHtcclxuICAgICAgICAgIHg6IHRoaXMub3B0aW9ucy5wb3NpdGlvbi5sbmcsXHJcbiAgICAgICAgICB5OiB0aGlzLm9wdGlvbnMucG9zaXRpb24ubGF0LFxyXG4gICAgICAgICAgejogdGhpcy5vcHRpb25zLnBvc2l0aW9uLmFsdFxyXG4gICAgICAgIH1cclxuICAgICAgXSxcclxuICAgICAgJ0VQU0c6NDMyNicsXHJcbiAgICAgIHZcclxuICAgICkucG9pbnRzXHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMuX0RpYWxvZ09iamVjdCAmJlxyXG4gICAgICB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQgJiZcclxuICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQgJiZcclxuICAgICAgcG9zaXRpb25bMF1cclxuICAgICkge1xyXG4gICAgICB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFxyXG4gICAgICAgICdjb252ZXJ0LXgnXHJcbiAgICAgIClbMF0udmFsdWUgPSBwb3NpdGlvblswXS54XHJcbiAgICAgIHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXHJcbiAgICAgICAgJ2NvbnZlcnQteSdcclxuICAgICAgKVswXS52YWx1ZSA9IHBvc2l0aW9uWzBdLnlcclxuICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcclxuICAgICAgICAnY29udmVydC16J1xyXG4gICAgICApWzBdLnZhbHVlID0gcG9zaXRpb25bMF0uelxyXG4gICAgfVxyXG4gICAgdGhpcy5fZWxtcy5jb29yZGluYXRlICYmXHJcbiAgICAgIHRoaXMuX2VsbXMuY29vcmRpbmF0ZS5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgIGl0ZW0udmFsdWUgPSB2XHJcbiAgICAgIH0pXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAZGVzY3JpcHRpb24g57yW6L6R5qGGXHJcbiAgICogQHBhcmFtIHN0YXRlPWZhbHNlIHtib29sZWFufSDnirbmgIE6IHRydWXmiZPlvIAsIGZhbHNl5YWz6ZetXHJcbiAgICovXHJcbiAgYXN5bmMgZWRpdChzdGF0ZSA9IGZhbHNlKSB7XHJcbiAgICByZXR1cm5cclxuICAgIGxldCBfdGhpcyA9IHRoaXNcclxuICAgIHRoaXMub3JpZ2luYWxPcHRpb25zID0gdGhpcy5kZWVwQ29weU9iaih0aGlzLm9wdGlvbnMpXHJcblxyXG4gICAgLy8gbGV0IGVsbXMgPSB0aGlzLnNkay52aWV3ZXIuX2NvbnRhaW5lci5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdZSi1jdXN0b20tYmFzZS1kaWFsb2cnKVxyXG4gICAgLy8gZm9yIChsZXQgaSA9IGVsbXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuICAgIC8vICAgdGhpcy5zZGsudmlld2VyLl9jb250YWluZXIucmVtb3ZlQ2hpbGQoZWxtc1tpXSlcclxuICAgIC8vIH1cclxuXHJcbiAgICBpZiAodGhpcy5fRGlhbG9nT2JqZWN0ICYmIHRoaXMuX0RpYWxvZ09iamVjdC5jbG9zZSkge1xyXG4gICAgICB0aGlzLl9EaWFsb2dPYmplY3QuY2xvc2UoKVxyXG4gICAgICB0aGlzLl9EaWFsb2dPYmplY3QgPSBudWxsXHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHN0YXRlKSB7XHJcbiAgICAgIHRoaXMuX0RpYWxvZ09iamVjdCA9IGF3YWl0IG5ldyBEaWFsb2coXHJcbiAgICAgICAgdGhpcy5zZGssXHJcbiAgICAgICAgdGhpcy5vcHRpb25zLFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIHRpdGxlOiAn54K55bGe5oCnJyxcclxuICAgICAgICAgIGxlZnQ6ICcxODBweCcsXHJcbiAgICAgICAgICB0b3A6ICcxMDBweCcsXHJcbiAgICAgICAgICBjb25maXJtQ2FsbEJhY2s6IG9wdGlvbnMgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxhYmVsVGV4dCA9IHRoaXMubGFiZWxUZXh0LnRyaW0oKVxyXG4gICAgICAgICAgICBpZiAoIXRoaXMubGFiZWxUZXh0KSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5sYWJlbFRleHQgPSAn5pyq5ZG95ZCN5a+56LGhJ1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMub3JpZ2luYWxPcHRpb25zID0gdGhpcy5kZWVwQ29weU9iaih0aGlzLm9wdGlvbnMpXHJcbiAgICAgICAgICAgIHRoaXMuX0RpYWxvZ09iamVjdC5jbG9zZSgpXHJcbiAgICAgICAgICAgIGxldCBjZG9wdGlvbnMgPSB0aGlzLmRlZXBDb3B5T2JqKHRoaXMub3B0aW9ucylcclxuICAgICAgICAgICAgY2RvcHRpb25zLmhvc3QgPSAnJ1xyXG4gICAgICAgICAgICB0aGlzLkRpYWxvZy5jb25maXJtQ2FsbEJhY2sgJiZcclxuICAgICAgICAgICAgICB0aGlzLkRpYWxvZy5jb25maXJtQ2FsbEJhY2soY2RvcHRpb25zKVxyXG4gICAgICAgICAgICBzeW5jRGF0YSh0aGlzLnNkaywgdGhpcy5vcHRpb25zLmlkKVxyXG4gICAgICAgICAgICBzeW5jU3BsaXREYXRhKHRoaXMuc2RrLCB0aGlzLm9wdGlvbnMuaWQpXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgcmVzZXRDYWxsQmFjazogKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnJlc2V0KClcclxuICAgICAgICAgICAgdGhpcy5EaWFsb2cucmVzZXRDYWxsQmFjayAmJiB0aGlzLkRpYWxvZy5yZXNldENhbGxCYWNrKClcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICByZW1vdmVDYWxsQmFjazogKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLkRpYWxvZy5yZW1vdmVDYWxsQmFjayAmJiB0aGlzLkRpYWxvZy5yZW1vdmVDYWxsQmFjaygpXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgY2xvc2VDYWxsQmFjazogKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uRWRpdGluZyA9IGZhbHNlXHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgIHRoaXMucmVzZXQoKVxyXG4gICAgICAgICAgICAgIHRoaXMuRGlhbG9nLmNsb3NlQ2FsbEJhY2sgJiYgdGhpcy5EaWFsb2cuY2xvc2VDYWxsQmFjaygpXHJcbiAgICAgICAgICAgIH0sIDApXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgc2hvd0NhbGxCYWNrOiBzaG93ID0+IHtcclxuICAgICAgICAgICAgdGhpcy5zaG93ID0gc2hvd1xyXG4gICAgICAgICAgICB0aGlzLkRpYWxvZy5zaG93Q2FsbEJhY2sgJiYgdGhpcy5EaWFsb2cuc2hvd0NhbGxCYWNrKClcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB0cmFuc2xhdGlvbmFsQ2FsbEJhY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5wb3NpdGlvbkVkaXRpbmcgPSAhdGhpcy5wb3NpdGlvbkVkaXRpbmdcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB1cGRhdGVIZWlnaHRDYWxsQmFjazogKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUhlaWdodCgpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICB0cnVlXHJcbiAgICAgIClcclxuICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmJvZHkuY2xhc3NOYW1lID1cclxuICAgICAgICB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuYm9keS5jbGFzc05hbWUgKyAnIGJpbGxib2FyZC1vYmplY3QnXHJcbiAgICAgIGxldCBjb250ZW50RWxtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcclxuICAgICAgY29udGVudEVsbS5pbm5lckhUTUwgPSBodG1sKHRoaXMpXHJcbiAgICAgIHRoaXMuX0RpYWxvZ09iamVjdC5jb250ZW50QXBwQ2hpbGQoY29udGVudEVsbSlcclxuICAgICAgdGhpcy5hdHRyaWJ1dGVDYW1lcmEgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmNhbWVyYS5jb250ZW50XHJcbiAgICAgIHRoaXMuYXR0cmlidXRlSVNDID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5pc2MuY29udGVudFxyXG5cclxuICAgICAgLy8gbGV0IGNvb3JkaW5hdGVFbG0gPSBjb250ZW50RWxtLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2Nvb3JkaW5hdGUtc2VsZWN0JylbMF1cclxuICAgICAgLy8gbGV0IG9wdGlvbiA9ICcnXHJcbiAgICAgIC8vIHRoaXMuX3Byb2ouZXBzZ19tYXAuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xyXG4gICAgICAvLyAgIGlmICghdGhpcy5vcHRpb25zLmNvb3JkaW5hdGUpIHtcclxuICAgICAgLy8gICAgIHRoaXMub3B0aW9ucy5jb29yZGluYXRlID0ga2V5XHJcbiAgICAgIC8vICAgICB0aGlzLm9yaWdpbmFsT3B0aW9ucy5jb29yZGluYXRlID0ga2V5XHJcbiAgICAgIC8vICAgfVxyXG4gICAgICAvLyAgIG9wdGlvbiArPSBgPG9wdGlvbiB2YWx1ZT1cIiR7a2V5fVwiPiR7dmFsdWUubmFtZX0gKCR7dmFsdWUuZXBzZ30pPC9vcHRpb24+YFxyXG4gICAgICAvLyB9KVxyXG4gICAgICAvLyBjb29yZGluYXRlRWxtLmlubmVySFRNTCA9IG9wdGlvblxyXG4gICAgICAvLyB0aGlzLmNvb3JkaW5hdGUgPSB0aGlzLm9wdGlvbnMuY29vcmRpbmF0ZVxyXG5cclxuICAgICAgLy8g5Yib5bu65qCH562+6aG1XHJcbiAgICAgIGxldCB0YWJzRWxtID0gbmV3IGN5X3RhYnMoJ3BvaW50LW9iamVjdC1lZGl0LXRhYnMnLCB1bmRlZmluZWQsIHRoaXMuc2RrKVxyXG4gICAgICAvLyDpopzoibLnu4Tku7ZcclxuICAgICAgbGV0IGNvbG9yUGlja2VyID0gbmV3IFlKQ29sb3JQaWNrZXIoe1xyXG4gICAgICAgIGVsOiBjb250ZW50RWxtLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xhYmVsQ29sb3InKVswXSxcclxuICAgICAgICBzaXplOiAnbWluaScsIC8v6aKc6ImyYm9457G75Z6LXHJcbiAgICAgICAgYWxwaGE6IHRydWUsIC8v5piv5ZCm5byA5ZCv6YCP5piO5bqmXHJcbiAgICAgICAgZGVmYXVsdENvbG9yOiB0aGlzLmxhYmVsQ29sb3IsXHJcbiAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLCAvL+aYr+WQpuemgeatouaJk+W8gOminOiJsumAieaLqeWZqFxyXG4gICAgICAgIG9wZW5QaWNrZXJBbmk6ICdvcGFjaXR5JywgLy/miZPlvIDpopzoibLpgInmi6nlmajliqjnlLtcclxuICAgICAgICBzdXJlOiBjb2xvciA9PiB7XHJcbiAgICAgICAgICB0aGlzLmxhYmVsQ29sb3IgPSBjb2xvclxyXG4gICAgICAgIH0sIC8v54K55Ye756Gu6K6k5oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgICAgY2xlYXI6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMubGFiZWxDb2xvciA9ICdyZ2JhKDI1NSwyNTUsMjU1LDEpJ1xyXG4gICAgICAgIH0gLy/ngrnlh7vmuIXnqbrmjInpkq7kuovku7blm57osINcclxuICAgICAgfSlcclxuXHJcbiAgICAgIC8vIGxldCBkaWZmdXNlQ29sb3JQaWNrZXIgPSBuZXcgWUpDb2xvclBpY2tlcih7XHJcbiAgICAgIC8vICAgZWw6IGNvbnRlbnRFbG0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcImRpZmZ1c2VDb2xvclwiKVswXSxcclxuICAgICAgLy8gICBzaXplOiAnbWluaScsLy/popzoibJib3jnsbvlnotcclxuICAgICAgLy8gICBhbHBoYTogZmFsc2UsLy/mmK/lkKblvIDlkK/pgI/mmI7luqZcclxuICAgICAgLy8gICBkZWZhdWx0Q29sb3I6IHRoaXMuZGlmZnVzZUNvbG9yLFxyXG4gICAgICAvLyAgIGRpc2FibGVkOiBmYWxzZSwvL+aYr+WQpuemgeatouaJk+W8gOminOiJsumAieaLqeWZqFxyXG4gICAgICAvLyAgIG9wZW5QaWNrZXJBbmk6ICdvcGFjaXR5JywvL+aJk+W8gOminOiJsumAieaLqeWZqOWKqOeUu1xyXG4gICAgICAvLyAgIHN1cmU6IChjb2xvcikgPT4ge1xyXG4gICAgICAvLyAgICAgdGhpcy5kaWZmdXNlQ29sb3IgPSBjb2xvclxyXG4gICAgICAvLyAgIH0sLy/ngrnlh7vnoa7orqTmjInpkq7kuovku7blm57osINcclxuICAgICAgLy8gICBjbGVhcjogKCkgPT4ge1xyXG4gICAgICAvLyAgICAgdGhpcy5kaWZmdXNlQ29sb3IgPSAncmdiYSgyNTUsMjU1LDI1NSwxKSdcclxuICAgICAgLy8gICB9LC8v54K55Ye75riF56m65oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgIC8vIH0pXHJcbiAgICAgIC8vIGxldCBzY2FuQ29sb3JQaWNrZXIgPSBuZXcgWUpDb2xvclBpY2tlcih7XHJcbiAgICAgIC8vICAgZWw6IGNvbnRlbnRFbG0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcInNjYW5Db2xvclwiKVswXSxcclxuICAgICAgLy8gICBzaXplOiAnbWluaScsLy/popzoibJib3jnsbvlnotcclxuICAgICAgLy8gICBhbHBoYTogZmFsc2UsLy/mmK/lkKblvIDlkK/pgI/mmI7luqZcclxuICAgICAgLy8gICBkZWZhdWx0Q29sb3I6IHRoaXMuc2NhbkNvbG9yLFxyXG4gICAgICAvLyAgIGRpc2FibGVkOiBmYWxzZSwvL+aYr+WQpuemgeatouaJk+W8gOminOiJsumAieaLqeWZqFxyXG4gICAgICAvLyAgIG9wZW5QaWNrZXJBbmk6ICdvcGFjaXR5JywvL+aJk+W8gOminOiJsumAieaLqeWZqOWKqOeUu1xyXG4gICAgICAvLyAgIHN1cmU6IChjb2xvcikgPT4ge1xyXG4gICAgICAvLyAgICAgdGhpcy5zY2FuQ29sb3IgPSBjb2xvclxyXG4gICAgICAvLyAgIH0sLy/ngrnlh7vnoa7orqTmjInpkq7kuovku7blm57osINcclxuICAgICAgLy8gICBjbGVhcjogKCkgPT4ge1xyXG4gICAgICAvLyAgICAgdGhpcy5zY2FuQ29sb3IgPSAncmdiYSgyNTUsMjU1LDI1NSwxKSdcclxuICAgICAgLy8gICB9LC8v54K55Ye75riF56m65oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgIC8vIH0pXHJcbiAgICAgIGxldCBhbGxfZWxtID0gY29udGVudEVsbS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnKicpXHJcbiAgICAgIHRoaXMuX0V2ZW50QmluZGluZy5vbih0aGlzLCBhbGxfZWxtKVxyXG4gICAgICB0aGlzLl9lbG1zID0gdGhpcy5fRXZlbnRCaW5kaW5nLmVsZW1lbnRcclxuICAgICAgdGhpcy5fZWxtcy5sYWJlbENvbG9yID0gW2NvbG9yUGlja2VyXVxyXG4gICAgICAvLyB0aGlzLl9lbG1zLmRpZmZ1c2VDb2xvciA9IFtkaWZmdXNlQ29sb3JQaWNrZXJdXHJcbiAgICAgIC8vIHRoaXMuX2VsbXMuc2NhbkNvbG9yID0gW3NjYW5Db2xvclBpY2tlcl1cclxuXHJcbiAgICAgIHNldFRpbWVvdXQoYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuYXR0cmlidXRlTGluayA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50XHJcbiAgICAgICAgdGhpcy5hdHRyaWJ1dGVWciA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudFxyXG4gICAgICAgIC8vIHRoaXMuYXR0cmlidXRlQ2FtZXJhID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5jYW1lcmFcclxuICAgICAgICB0aGlzLmNhbWVyYVNlbGVjdCAmJiB0aGlzLmNhbWVyYVNlbGVjdCgpXHJcbiAgICAgICAgdGhpcy5JU0NTZWxlY3QgJiYgdGhpcy5JU0NTZWxlY3QoKVxyXG4gICAgICAgIHRoaXMuZ29vZHNTZWxlY3QgJiYgdGhpcy5nb29kc1NlbGVjdCgpXHJcblxyXG4gICAgICAgIGxldCBjb2wgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKVxyXG4gICAgICAgIGNvbC5jbGFzc05hbWUgPSAnY29sJ1xyXG4gICAgICAgIGNvbC5zdHlsZS5mbGV4ID0gJzAgMCAxMTBweCdcclxuICAgICAgICBjb2wuaW5uZXJIVE1MID0gYFxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJsYWJlbFwiPuWxnuaAp+ahhjwvc3Bhbj5cclxuICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImJ0bi1zd2l0Y2hcIiB0eXBlPVwiY2hlY2tib3hcIj5cclxuICAgICAgICBgXHJcblxyXG4gICAgICAgIGxldCByb3cgPSB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdhdHRyaWJ1dGUnKVswXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdyb3cnKVswXVxyXG4gICAgICAgIHJvdy5hcHBlbmRDaGlsZChjb2wpXHJcbiAgICAgICAgbGV0IHRhZ0RhdGEgPSB0aGlzLmF0dHJpYnV0ZVNlbGVjdFxyXG4gICAgICAgIGxldCBhdHRyaWJ1dGVFbG0gPSB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFxyXG4gICAgICAgICAgJ2F0dHJpYnV0ZS1zZWxlY3QtYm94J1xyXG4gICAgICAgIClbMF1cclxuICAgICAgICBpZiAoYXR0cmlidXRlRWxtKSB7XHJcbiAgICAgICAgICBsZXQgbGVncE9iamVjdCA9IGxlZ3AoYXR0cmlidXRlRWxtLCAnLmF0dHJpYnV0ZS1zZWxlY3QnKVxyXG4gICAgICAgICAgbGVncE9iamVjdC5sZWdwX3NlYXJjaCh0YWdEYXRhKVxyXG4gICAgICAgICAgbGV0IGF0dHJpYnV0ZVNlbGVjdEVsbSA9IHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50XHJcbiAgICAgICAgICAgIC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdhdHRyaWJ1dGUtc2VsZWN0JylbMF1cclxuICAgICAgICAgICAgLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdpbnB1dCcpWzBdXHJcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhZ0RhdGEubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKHRhZ0RhdGFbaV0ua2V5ID09PSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlVHlwZSkge1xyXG4gICAgICAgICAgICAgIGF0dHJpYnV0ZVNlbGVjdEVsbS52YWx1ZSA9IHRhZ0RhdGFbaV0udmFsdWVcclxuICAgICAgICAgICAgICBsZWdwT2JqZWN0LmxlZ3Bfc2VhcmNoQWN0aXZlKHRhZ0RhdGFbaV0udmFsdWUpXHJcbiAgICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYXR0cmlidXRlU2VsZWN0RWxtLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKCkgPT4ge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhZ0RhdGEubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICBpZiAodGFnRGF0YVtpXS52YWx1ZSA9PT0gYXR0cmlidXRlU2VsZWN0RWxtLnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmF0dHJpYnV0ZVR5cGUgPSB0YWdEYXRhW2ldLmtleVxyXG4gICAgICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgY29vcmRpbmF0ZURhdGEgPSBbXVxyXG4gICAgICAgIHRoaXMuZXBzZ19tYXAuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xyXG4gICAgICAgICAgY29vcmRpbmF0ZURhdGEucHVzaCh7XHJcbiAgICAgICAgICAgIG5hbWU6IGAke3ZhbHVlLm5hbWV9KCR7dmFsdWUuZXBzZ30pYCxcclxuICAgICAgICAgICAgdmFsdWU6IGtleVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICB9KVxyXG4gICAgICAgIGxldCBjb29yZGluYXRlRGF0YUxlZ3BPYmplY3QgPSBsZWdwKFxyXG4gICAgICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcclxuICAgICAgICAgICAgJ2Nvb3JkaW5hdGUtc2VsZWN0LWJveCdcclxuICAgICAgICAgIClbMF0sXHJcbiAgICAgICAgICAnLmNvb3JkaW5hdGUtc2VsZWN0J1xyXG4gICAgICAgIClcclxuICAgICAgICBpZiAoY29vcmRpbmF0ZURhdGFMZWdwT2JqZWN0KSB7XHJcbiAgICAgICAgICBjb29yZGluYXRlRGF0YUxlZ3BPYmplY3QubGVncF9zZWFyY2goY29vcmRpbmF0ZURhdGEpXHJcbiAgICAgICAgICBsZXQgY29vcmRpbmF0ZURhdGFMZWdwRWxtID0gdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnRcclxuICAgICAgICAgICAgLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2Nvb3JkaW5hdGUtc2VsZWN0JylbMF1cclxuICAgICAgICAgICAgLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdpbnB1dCcpWzBdXHJcbiAgICAgICAgICBpZiAoIXRoaXMuY29vcmRpbmF0ZSkge1xyXG4gICAgICAgICAgICB0aGlzLmNvb3JkaW5hdGUgPSBjb29yZGluYXRlRGF0YVswXS52YWx1ZVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5jb29yZGluYXRlID0gdGhpcy5jb29yZGluYXRlXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBjb29yZGluYXRlRGF0YUxlZ3BFbG0udmFsdWUgPSB0aGlzLmNvb3JkaW5hdGVcclxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29vcmRpbmF0ZURhdGEubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKGNvb3JkaW5hdGVEYXRhW2ldLnZhbHVlID09PSBjb29yZGluYXRlRGF0YS52YWx1ZSkge1xyXG4gICAgICAgICAgICAgIGNvb3JkaW5hdGVEYXRhTGVncE9iamVjdC5sZWdwX3NlYXJjaEFjdGl2ZShcclxuICAgICAgICAgICAgICAgIGNvb3JkaW5hdGVEYXRhW2ldLnZhbHVlXHJcbiAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGNvb3JkaW5hdGVEYXRhTGVncEVsbS5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICgpID0+IHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb29yZGluYXRlRGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgIGlmIChjb29yZGluYXRlRGF0YVtpXS52YWx1ZSA9PT0gY29vcmRpbmF0ZURhdGFMZWdwRWxtLnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvb3JkaW5hdGUgPSBjb29yZGluYXRlRGF0YVtpXS52YWx1ZVxyXG4gICAgICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgaGVpZ2h0Qm94RWxtID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaGVpZ2h0LWJveCcpWzBdXHJcbiAgICAgICAgbGV0IGhlaWdodEVsbSA9IGhlaWdodEJveEVsbS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdoZWlnaHQnKVswXVxyXG4gICAgICAgIGxldCBoZWlnaHRNb2RlRGF0YSA9IFtcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJ+a1t+aLlOmrmOW6picsXHJcbiAgICAgICAgICAgIHZhbHVlOiAn5rW35ouU6auY5bqmJyxcclxuICAgICAgICAgICAga2V5OiAnMCdcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIG5hbWU6ICfnm7jlr7nlnLDooagnLFxyXG4gICAgICAgICAgICB2YWx1ZTogJ+ebuOWvueWcsOihqCcsXHJcbiAgICAgICAgICAgIGtleTogJzEnXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lOiAn5L6d6ZmE5Zyw6KGoJyxcclxuICAgICAgICAgICAgdmFsdWU6ICfkvp3pmYTlnLDooagnLFxyXG4gICAgICAgICAgICBrZXk6ICcyJ1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJ+S+nemZhOaooeWeiycsXHJcbiAgICAgICAgICAgIHZhbHVlOiAn5L6d6ZmE5qih5Z6LJyxcclxuICAgICAgICAgICAga2V5OiAnMydcclxuICAgICAgICAgIH1cclxuICAgICAgICBdXHJcbiAgICAgICAgbGV0IGhlaWdodE1vZGUgPSB0aGlzLmhlaWdodE1vZGVcclxuXHJcbiAgICAgICAgc3dpdGNoIChoZWlnaHRNb2RlKSB7XHJcbiAgICAgICAgICBjYXNlIDA6XHJcbiAgICAgICAgICBjYXNlICcwJzpcclxuICAgICAgICAgICAgaGVpZ2h0RWxtLnZhbHVlID0gdGhpcy5hbHRcclxuICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgIGNhc2UgMTpcclxuICAgICAgICAgIGNhc2UgJzEnOlxyXG4gICAgICAgICAgICBpZiAodGhpcy5zZGsudmlld2VyLnNjZW5lLnRlcnJhaW5Qcm92aWRlci5hdmFpbGFiaWxpdHkpIHtcclxuICAgICAgICAgICAgICBDZXNpdW0uc2FtcGxlVGVycmFpbk1vc3REZXRhaWxlZChcclxuICAgICAgICAgICAgICAgIHRoaXMuc2RrLnZpZXdlci5zY2VuZS50ZXJyYWluUHJvdmlkZXIsXHJcbiAgICAgICAgICAgICAgICBbXHJcbiAgICAgICAgICAgICAgICAgIENlc2l1bS5DYXJ0b2dyYXBoaWMuZnJvbURlZ3JlZXMoXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uLmxuZyxcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb24ubGF0XHJcbiAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIF1cclxuICAgICAgICAgICAgICApLnRoZW4ocG9zaXRpb24gPT4ge1xyXG4gICAgICAgICAgICAgICAgaGVpZ2h0RWxtLnZhbHVlID0gTnVtYmVyKFxyXG4gICAgICAgICAgICAgICAgICAodGhpcy5hbHQgLSBOdW1iZXIocG9zaXRpb25bMF0uaGVpZ2h0LnRvRml4ZWQoMikpKS50b0ZpeGVkKDIpXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBoZWlnaHRFbG0udmFsdWUgPSBOdW1iZXIodGhpcy5hbHQudG9GaXhlZCgyKSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgY2FzZSAyOlxyXG4gICAgICAgICAgY2FzZSAnMic6XHJcbiAgICAgICAgICBjYXNlIDM6XHJcbiAgICAgICAgICBjYXNlICczJzpcclxuICAgICAgICAgICAgbGV0IG9iamVjdHNUb0V4Y2x1ZGUgPSBbXVxyXG4gICAgICAgICAgICBmb3IgKGxldCBba2V5LCB2YWx1ZV0gb2YgdGhpcy5zZGsuZW50aXR5TWFwKSB7XHJcbiAgICAgICAgICAgICAgaWYgKHZhbHVlLnR5cGUgPT09ICdSYWRhclNjYW5TdGVyZW9zY29waWMnICYmIHZhbHVlLmVudGl0eSkge1xyXG4gICAgICAgICAgICAgICAgb2JqZWN0c1RvRXhjbHVkZS5wdXNoKHZhbHVlLmVudGl0eSlcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5nZXRDbGFtcFRvSGVpZ2h0KHRoaXMub3B0aW9ucy5wb3NpdGlvbiwgb2JqZWN0c1RvRXhjbHVkZSkudGhlbihoID0+IHtcclxuICAgICAgICAgICAgICB0aGlzLmFsdCA9IE51bWJlcihoLnRvRml4ZWQoMikpXHJcbiAgICAgICAgICAgICAgaGVpZ2h0RWxtLnZhbHVlID0gdGhpcy5hbHRcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBoZWlnaHRNb2RlT2JqZWN0ID0gbGVncChcclxuICAgICAgICAgIHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXHJcbiAgICAgICAgICAgICdoZWlnaHQtbW9kZS1ib3gnXHJcbiAgICAgICAgICApWzBdLFxyXG4gICAgICAgICAgJy5oZWlnaHQtbW9kZSdcclxuICAgICAgICApXHJcbiAgICAgICAgaWYgKGhlaWdodE1vZGVPYmplY3QpIHtcclxuICAgICAgICAgIGhlaWdodE1vZGVPYmplY3QubGVncF9zZWFyY2goaGVpZ2h0TW9kZURhdGEpXHJcbiAgICAgICAgICBsZXQgaGVpZ2h0TW9kZURhdGFMZWdwRWxtID0gdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnRcclxuICAgICAgICAgICAgLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2hlaWdodC1tb2RlJylbMF1cclxuICAgICAgICAgICAgLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdpbnB1dCcpWzBdXHJcbiAgICAgICAgICBoZWlnaHRNb2RlRGF0YUxlZ3BFbG0udmFsdWUgPSBoZWlnaHRNb2RlRGF0YVt0aGlzLmhlaWdodE1vZGVdLnZhbHVlXHJcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhlaWdodE1vZGVEYXRhLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChoZWlnaHRNb2RlRGF0YVtpXS52YWx1ZSA9PSBoZWlnaHRNb2RlRGF0YUxlZ3BFbG0udmFsdWUpIHtcclxuICAgICAgICAgICAgICBoZWlnaHRNb2RlT2JqZWN0LmxlZ3Bfc2VhcmNoQWN0aXZlKGhlaWdodE1vZGVEYXRhW2ldLnZhbHVlKVxyXG4gICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGhlaWdodE1vZGVEYXRhTGVncEVsbS5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICgpID0+IHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoZWlnaHRNb2RlRGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgIGlmIChoZWlnaHRNb2RlRGF0YVtpXS52YWx1ZSA9PT0gaGVpZ2h0TW9kZURhdGFMZWdwRWxtLnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICBoZWlnaHRNb2RlID0gaGVpZ2h0TW9kZURhdGFbaV0ua2V5XHJcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGhlaWdodE1vZGUpIHtcclxuICAgICAgICAgICAgICAgICAgY2FzZSAwOlxyXG4gICAgICAgICAgICAgICAgICBjYXNlICcwJzpcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFsdCA9IE51bWJlcihoZWlnaHRFbG0udmFsdWUpXHJcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0Qm94RWxtLnN0eWxlLmRpc3BsYXkgPSAnZmxleCdcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmhlaWdodE1vZGUgPSAwXHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgICAgICAgICAgY2FzZSAxOlxyXG4gICAgICAgICAgICAgICAgICBjYXNlICcxJzpcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zZGsudmlld2VyLnNjZW5lLnRlcnJhaW5Qcm92aWRlci5hdmFpbGFiaWxpdHkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIENlc2l1bS5zYW1wbGVUZXJyYWluTW9zdERldGFpbGVkKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNkay52aWV3ZXIuc2NlbmUudGVycmFpblByb3ZpZGVyLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgQ2VzaXVtLkNhcnRvZ3JhcGhpYy5mcm9tRGVncmVlcyhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbi5sbmcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb24ubGF0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBdXHJcbiAgICAgICAgICAgICAgICAgICAgICApLnRoZW4ocG9zaXRpb24gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFsdCA9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtYmVyKGhlaWdodEVsbS52YWx1ZSkgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIE51bWJlcihwb3NpdGlvblswXS5oZWlnaHQudG9GaXhlZCgyKSlcclxuICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWx0ID0gTnVtYmVyKGhlaWdodEVsbS52YWx1ZSlcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0Qm94RWxtLnN0eWxlLmRpc3BsYXkgPSAnZmxleCdcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmhlaWdodE1vZGUgPSAxXHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgICAgICAgICAgY2FzZSAyOlxyXG4gICAgICAgICAgICAgICAgICBjYXNlICcyJzpcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmhlaWdodE1vZGUgPSAyXHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgICAgICAgICAgY2FzZSAzOlxyXG4gICAgICAgICAgICAgICAgICBjYXNlICczJzpcclxuICAgICAgICAgICAgICAgICAgICBsZXQgb2JqZWN0c1RvRXhjbHVkZSA9IFtdXHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgW2tleSwgdmFsdWVdIG9mIHRoaXMuc2RrLmVudGl0eU1hcCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlLnR5cGUgPT09ICdSYWRhclNjYW5TdGVyZW9zY29waWMnICYmIHZhbHVlLmVudGl0eSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RzVG9FeGNsdWRlLnB1c2godmFsdWUuZW50aXR5KVxyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdldENsYW1wVG9IZWlnaHQodGhpcy5vcHRpb25zLnBvc2l0aW9uLCBvYmplY3RzVG9FeGNsdWRlKS50aGVuKGggPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5hbHQgPSBOdW1iZXIoaC50b0ZpeGVkKDIpKVxyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oZWlnaHRNb2RlID0gM1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSlcclxuXHJcbiAgICAgICAgICBoZWlnaHRFbG0uYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIHN3aXRjaCAoaGVpZ2h0TW9kZSkge1xyXG4gICAgICAgICAgICAgIGNhc2UgMDpcclxuICAgICAgICAgICAgICBjYXNlICcwJzpcclxuICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbi5hbHQgPSBOdW1iZXIoXHJcbiAgICAgICAgICAgICAgICAgIE51bWJlcihoZWlnaHRFbG0udmFsdWUpLnRvRml4ZWQoMilcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgICAgY2FzZSAxOlxyXG4gICAgICAgICAgICAgIGNhc2UgJzEnOlxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2RrLnZpZXdlci5zY2VuZS50ZXJyYWluUHJvdmlkZXIuYXZhaWxhYmlsaXR5KSB7XHJcbiAgICAgICAgICAgICAgICAgIENlc2l1bS5zYW1wbGVUZXJyYWluTW9zdERldGFpbGVkKFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2RrLnZpZXdlci5zY2VuZS50ZXJyYWluUHJvdmlkZXIsXHJcbiAgICAgICAgICAgICAgICAgICAgW1xyXG4gICAgICAgICAgICAgICAgICAgICAgQ2VzaXVtLkNhcnRvZ3JhcGhpYy5mcm9tRGVncmVlcyhcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uLmxuZyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uLmxhdFxyXG4gICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgIF1cclxuICAgICAgICAgICAgICAgICAgKS50aGVuKHBvc2l0aW9uID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFsdCA9XHJcbiAgICAgICAgICAgICAgICAgICAgICBOdW1iZXIoaGVpZ2h0RWxtLnZhbHVlKSArXHJcbiAgICAgICAgICAgICAgICAgICAgICBOdW1iZXIocG9zaXRpb25bMF0uaGVpZ2h0LnRvRml4ZWQoMikpXHJcbiAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLmFsdCA9IE51bWJlcihoZWlnaHRFbG0udmFsdWUpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICAgIGNhc2UgMjpcclxuICAgICAgICAgICAgICBjYXNlICcyJzpcclxuICAgICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5yZW5ld1BvaW50KClcclxuICAgICAgICAgICAgdGhpcy5jb29yZGluYXRlID0gdGhpcy5vcHRpb25zLmNvb3JkaW5hdGVcclxuICAgICAgICAgICAgdGhpcy5fZWxtcy5hbHQgJiZcclxuICAgICAgICAgICAgICB0aGlzLl9lbG1zLmFsdC5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICAgICAgaXRlbS52YWx1ZSA9IHRoaXMub3B0aW9ucy5wb3NpdGlvbi5hbHRcclxuICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIHRoaXMuX2VsbXMuaGVpZ2h0ID0gaGVpZ2h0Qm94RWxtXHJcbiAgICAgICAgICB0aGlzLl9lbG1zLmhlaWdodE1vZGUgPSBoZWlnaHRNb2RlRGF0YUxlZ3BFbG1cclxuXHJcbiAgICAgICAgICB0aGlzLmhlaWdodE1vZGUgPSB0aGlzLmhlaWdodE1vZGVcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBmb250RGF0YSA9IGdldEZvbnRMaXN0KClcclxuICAgICAgICBsZXQgZm9udE9iamVjdCA9IGxlZ3AoXHJcbiAgICAgICAgICB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFxyXG4gICAgICAgICAgICAnZm9udC1zZWxlY3QtYm94J1xyXG4gICAgICAgICAgKVswXSxcclxuICAgICAgICAgICcuZm9udC1zZWxlY3QnXHJcbiAgICAgICAgKVxyXG4gICAgICAgIGlmIChmb250T2JqZWN0KSB7XHJcbiAgICAgICAgICBmb250T2JqZWN0LmxlZ3Bfc2VhcmNoKGZvbnREYXRhKVxyXG4gICAgICAgICAgbGV0IGZvbnREYXRhTGVncEVsbSA9IHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50XHJcbiAgICAgICAgICAgIC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdmb250LXNlbGVjdCcpWzBdXHJcbiAgICAgICAgICAgIC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaW5wdXQnKVswXVxyXG4gICAgICAgICAgZm9udERhdGFMZWdwRWxtLnZhbHVlID0gZm9udERhdGFbdGhpcy5sYWJlbEZvbnRGYW1pbHldLnZhbHVlXHJcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZvbnREYXRhLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChmb250RGF0YVtpXS52YWx1ZSA9PSBmb250RGF0YUxlZ3BFbG0udmFsdWUpIHtcclxuICAgICAgICAgICAgICBmb250T2JqZWN0LmxlZ3Bfc2VhcmNoQWN0aXZlKGZvbnREYXRhW2ldLnZhbHVlKVxyXG4gICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGZvbnREYXRhTGVncEVsbS5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICgpID0+IHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmb250RGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgIGlmIChmb250RGF0YVtpXS52YWx1ZSA9PT0gZm9udERhdGFMZWdwRWxtLnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxhYmVsRm9udEZhbWlseSA9IGZvbnREYXRhW2ldLmtleVxyXG4gICAgICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICB0aGlzLl9lbG1zLmxhYmVsRm9udEZhbWlseSA9IFtmb250RGF0YUxlZ3BFbG1dXHJcbiAgICAgICAgfVxyXG4gICAgICB9LCAwKVxyXG5cclxuICAgICAgbGV0IGxuZ0VsbiA9IGNvbnRlbnRFbG0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbG5nJylbMF1cclxuICAgICAgbGV0IGxhdEVsbiA9IGNvbnRlbnRFbG0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbGF0JylbMF1cclxuICAgICAgbG5nRWxuLnZhbHVlID0gdGhpcy5sbmdcclxuICAgICAgbGF0RWxuLnZhbHVlID0gdGhpcy5sYXRcclxuICAgICAgdGhpcy5fZWxtcy5sbmcucHVzaChsbmdFbG4pXHJcbiAgICAgIHRoaXMuX2VsbXMubGF0LnB1c2gobGF0RWxuKVxyXG5cclxuICAgICAgbGV0IHByb2pDaGVja2JveEJveEVsbXMgPSB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFxyXG4gICAgICAgICdZSi1jdXN0b20tY2hlY2tib3gtYm94J1xyXG4gICAgICApXHJcbiAgICAgIGxldCBwcm9qQ2hlY2tib3hFbG1zID0gdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcclxuICAgICAgICAnWUotY3VzdG9tLWNoZWNrYm94J1xyXG4gICAgICApXHJcbiAgICAgIGxldCBwcm9qSW5wdXRCb3hFbG1zID0gdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcclxuICAgICAgICAncHJvai1pbnB1dC1ib3gnXHJcbiAgICAgIClcclxuXHJcbiAgICAgIHByb2pDaGVja2JveEVsbXNbMF0uY2hlY2tlZCA9IHRydWVcclxuICAgICAgcHJvaklucHV0Qm94RWxtc1sxXS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnXHJcbiAgICAgIHByb2pJbnB1dEJveEVsbXNbMl0uc3R5bGUuZGlzcGxheSA9ICdub25lJ1xyXG5cclxuICAgICAgcHJvakNoZWNrYm94Qm94RWxtc1swXS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcclxuICAgICAgICBwcm9qQ2hlY2tib3hFbG1zWzBdLmNoZWNrZWQgPSB0cnVlXHJcbiAgICAgICAgcHJvaklucHV0Qm94RWxtc1swXS5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJ1xyXG4gICAgICAgIHByb2pDaGVja2JveEVsbXNbMV0uY2hlY2tlZCA9IGZhbHNlXHJcbiAgICAgICAgcHJvaklucHV0Qm94RWxtc1sxXS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnXHJcbiAgICAgICAgcHJvakNoZWNrYm94RWxtc1syXS5jaGVja2VkID0gZmFsc2VcclxuICAgICAgICBwcm9qSW5wdXRCb3hFbG1zWzJdLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSdcclxuICAgICAgfSlcclxuICAgICAgcHJvakNoZWNrYm94Qm94RWxtc1sxXS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcclxuICAgICAgICBwcm9qQ2hlY2tib3hFbG1zWzFdLmNoZWNrZWQgPSB0cnVlXHJcbiAgICAgICAgcHJvaklucHV0Qm94RWxtc1sxXS5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJ1xyXG4gICAgICAgIHByb2pDaGVja2JveEVsbXNbMF0uY2hlY2tlZCA9IGZhbHNlXHJcbiAgICAgICAgcHJvaklucHV0Qm94RWxtc1swXS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnXHJcbiAgICAgICAgcHJvakNoZWNrYm94RWxtc1syXS5jaGVja2VkID0gZmFsc2VcclxuICAgICAgICBwcm9qSW5wdXRCb3hFbG1zWzJdLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSdcclxuICAgICAgfSlcclxuICAgICAgcHJvakNoZWNrYm94Qm94RWxtc1syXS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcclxuICAgICAgICBwcm9qQ2hlY2tib3hFbG1zWzJdLmNoZWNrZWQgPSB0cnVlXHJcbiAgICAgICAgcHJvaklucHV0Qm94RWxtc1syXS5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJ1xyXG4gICAgICAgIHByb2pDaGVja2JveEVsbXNbMF0uY2hlY2tlZCA9IGZhbHNlXHJcbiAgICAgICAgcHJvaklucHV0Qm94RWxtc1swXS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnXHJcbiAgICAgICAgcHJvakNoZWNrYm94RWxtc1sxXS5jaGVja2VkID0gZmFsc2VcclxuICAgICAgICBwcm9qSW5wdXRCb3hFbG1zWzFdLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSdcclxuICAgICAgfSlcclxuXHJcbiAgICAgIF90aGlzLl9wcm9qQ29udmVydCA9ICgpID0+IHtcclxuICAgICAgICBpZiAoIXRoaXMuX0RpYWxvZ09iamVjdCB8fCB0aGlzLl9EaWFsb2dPYmplY3QuaXNEZXN0cm95KSB7XHJcbiAgICAgICAgICByZXR1cm5cclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IGxuZyxcclxuICAgICAgICAgIGxhdCxcclxuICAgICAgICAgIGxuZ0QsXHJcbiAgICAgICAgICBsbmdNLFxyXG4gICAgICAgICAgbG5nUyxcclxuICAgICAgICAgIGxhdEQsXHJcbiAgICAgICAgICBsYXRNLFxyXG4gICAgICAgICAgbGF0UyxcclxuICAgICAgICAgIGxuZ0RNLFxyXG4gICAgICAgICAgbGF0RE0sXHJcbiAgICAgICAgICBsbmdETVMsXHJcbiAgICAgICAgICBsYXRETVMsXHJcbiAgICAgICAgICBsbmdkbkFycjEsXHJcbiAgICAgICAgICBsbmdkbkFycjIsXHJcbiAgICAgICAgICBsYXRkbkFycjEsXHJcbiAgICAgICAgICBsYXRkbkFycjIsXHJcbiAgICAgICAgICBsbmdkbnNBcnIxLFxyXG4gICAgICAgICAgbG5nZG5zQXJyMixcclxuICAgICAgICAgIGxuZ2Ruc0FycjMsXHJcbiAgICAgICAgICBsYXRkbnNBcnIxLFxyXG4gICAgICAgICAgbGF0ZG5zQXJyMixcclxuICAgICAgICAgIGxhdGRuc0FycjNcclxuICAgICAgICBsbmcgPSBfdGhpcy5sbmdcclxuICAgICAgICBsYXQgPSBfdGhpcy5sYXRcclxuICAgICAgICBsbmdETSA9IF90aGlzLl9wcm9qLmRlZ3JlZXNUb0RNUyhsbmcsIHRydWUpXHJcbiAgICAgICAgbGF0RE0gPSBfdGhpcy5fcHJvai5kZWdyZWVzVG9ETVMobGF0LCB0cnVlKVxyXG4gICAgICAgIGxuZ2RuQXJyMSA9IGxuZ0RNLnNwbGl0KCfCsCcpXHJcbiAgICAgICAgbG5nZG5BcnIyID0gbG5nZG5BcnIxWzFdLnNwbGl0KFwiJ1wiKVxyXG4gICAgICAgIGxhdGRuQXJyMSA9IGxhdERNLnNwbGl0KCfCsCcpXHJcbiAgICAgICAgbGF0ZG5BcnIyID0gbGF0ZG5BcnIxWzFdLnNwbGl0KFwiJ1wiKVxyXG4gICAgICAgIGNvbnRlbnRFbG0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbG5nLWRtLWQnKVswXS52YWx1ZSA9IGxuZ2RuQXJyMVswXVxyXG4gICAgICAgIGNvbnRlbnRFbG0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbG5nLWRtLW0nKVswXS52YWx1ZSA9IGxuZ2RuQXJyMlswXVxyXG4gICAgICAgIGNvbnRlbnRFbG0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbGF0LWRtLWQnKVswXS52YWx1ZSA9IGxhdGRuQXJyMVswXVxyXG4gICAgICAgIGNvbnRlbnRFbG0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbGF0LWRtLW0nKVswXS52YWx1ZSA9IGxhdGRuQXJyMlswXVxyXG5cclxuICAgICAgICBsbmdETVMgPSBfdGhpcy5fcHJvai5kZWdyZWVzVG9ETVMobG5nKVxyXG4gICAgICAgIGxhdERNUyA9IF90aGlzLl9wcm9qLmRlZ3JlZXNUb0RNUyhsYXQpXHJcbiAgICAgICAgbG5nZG5zQXJyMSA9IGxuZ0RNUy5zcGxpdCgnwrAnKVxyXG4gICAgICAgIGxuZ2Ruc0FycjIgPSBsbmdkbnNBcnIxWzFdLnNwbGl0KFwiJ1wiKVxyXG4gICAgICAgIGxuZ2Ruc0FycjMgPSBsbmdkbnNBcnIyWzFdLnNwbGl0KCdcIicpXHJcbiAgICAgICAgbGF0ZG5zQXJyMSA9IGxhdERNUy5zcGxpdCgnwrAnKVxyXG4gICAgICAgIGxhdGRuc0FycjIgPSBsYXRkbnNBcnIxWzFdLnNwbGl0KFwiJ1wiKVxyXG4gICAgICAgIGxhdGRuc0FycjMgPSBsYXRkbnNBcnIyWzFdLnNwbGl0KCdcIicpXHJcbiAgICAgICAgY29udGVudEVsbS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdsbmctZG1zLWQnKVswXS52YWx1ZSA9IGxuZ2Ruc0FycjFbMF1cclxuICAgICAgICBjb250ZW50RWxtLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xuZy1kbXMtbScpWzBdLnZhbHVlID0gbG5nZG5zQXJyMlswXVxyXG4gICAgICAgIGNvbnRlbnRFbG0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbG5nLWRtcy1zJylbMF0udmFsdWUgPSBsbmdkbnNBcnIzWzBdXHJcbiAgICAgICAgY29udGVudEVsbS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdsYXQtZG1zLWQnKVswXS52YWx1ZSA9IGxhdGRuc0FycjFbMF1cclxuICAgICAgICBjb250ZW50RWxtLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xhdC1kbXMtbScpWzBdLnZhbHVlID0gbGF0ZG5zQXJyMlswXVxyXG4gICAgICAgIGNvbnRlbnRFbG0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbGF0LWRtcy1zJylbMF0udmFsdWUgPSBsYXRkbnNBcnIzWzBdXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIF90aGlzLl9wcm9qQ29udmVydCgpXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBpZiAodGhpcy5fZWxlbWVudF9zdHlsZSkge1xyXG4gICAgICAvLyAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdoZWFkJylbMF0ucmVtb3ZlQ2hpbGQodGhpcy5fZWxlbWVudF9zdHlsZSlcclxuICAgICAgLy8gICB0aGlzLl9lbGVtZW50X3N0eWxlID0gbnVsbFxyXG4gICAgICAvLyB9XHJcbiAgICAgIC8vIGlmICh0aGlzLl9EaWFsb2dPYmplY3QgJiYgdGhpcy5fRGlhbG9nT2JqZWN0LnJlbW92ZSkge1xyXG4gICAgICAvLyAgIHRoaXMuX0RpYWxvZ09iamVjdC5yZW1vdmUoKVxyXG4gICAgICAvLyAgIHRoaXMuX0RpYWxvZ09iamVjdCA9IG51bGxcclxuICAgICAgLy8gfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVuZXdQb2ludCgpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXNcclxuXHJcbiAgICBsZXQgZm9udCA9IGdldEZvbnRGYW1pbHkodGhpcy5sYWJlbEZvbnRGYW1pbHkpIHx8ICdIZWx2ZXRpY2EnXHJcblxyXG4gICAgaWYgKHRoaXMuZW50aXR5KSB7XHJcbiAgICAgIHRoaXMuZW50aXR5LnBvc2l0aW9uID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXMoXHJcbiAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uLmxuZyxcclxuICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb24ubGF0LFxyXG4gICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbi5hbHRcclxuICAgICAgKVxyXG4gICAgICBpZiAodGhpcy5vcHRpb25zLnNjYWxlQnlEaXN0YW5jZSkge1xyXG4gICAgICAgIHRoaXMuZW50aXR5LmJpbGxib2FyZC5zY2FsZUJ5RGlzdGFuY2UgPSBuZXcgQ2VzaXVtLk5lYXJGYXJTY2FsYXIoXHJcbiAgICAgICAgICB0aGlzLm9wdGlvbnMubmVhcixcclxuICAgICAgICAgIDEsXHJcbiAgICAgICAgICB0aGlzLm9wdGlvbnMuZmFyLFxyXG4gICAgICAgICAgMFxyXG4gICAgICAgIClcclxuICAgICAgICB0aGlzLmVudGl0eS5iaWxsYm9hcmQucGl4ZWxPZmZzZXRTY2FsZUJ5RGlzdGFuY2UgPSBuZXcgQ2VzaXVtLk5lYXJGYXJTY2FsYXIoXHJcbiAgICAgICAgICB0aGlzLm9wdGlvbnMubmVhcixcclxuICAgICAgICAgIDEsXHJcbiAgICAgICAgICB0aGlzLm9wdGlvbnMuZmFyLFxyXG4gICAgICAgICAgMFxyXG4gICAgICAgIClcclxuICAgICAgICB0aGlzLmVudGl0eS5sYWJlbC5zY2FsZUJ5RGlzdGFuY2UgPSBuZXcgQ2VzaXVtLk5lYXJGYXJTY2FsYXIoXHJcbiAgICAgICAgICB0aGlzLm9wdGlvbnMubmVhcixcclxuICAgICAgICAgIDEsXHJcbiAgICAgICAgICB0aGlzLm9wdGlvbnMuZmFyLFxyXG4gICAgICAgICAgMFxyXG4gICAgICAgIClcclxuICAgICAgICB0aGlzLmVudGl0eS5sYWJlbC5waXhlbE9mZnNldFNjYWxlQnlEaXN0YW5jZSA9IG5ldyBDZXNpdW0uTmVhckZhclNjYWxhcihcclxuICAgICAgICAgIHRoaXMub3B0aW9ucy5uZWFyLFxyXG4gICAgICAgICAgMSxcclxuICAgICAgICAgIHRoaXMub3B0aW9ucy5mYXIsXHJcbiAgICAgICAgICAwXHJcbiAgICAgICAgKVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuZW50aXR5LmJpbGxib2FyZC5zY2FsZUJ5RGlzdGFuY2UgPSB1bmRlZmluZWRcclxuICAgICAgICB0aGlzLmVudGl0eS5iaWxsYm9hcmQucGl4ZWxPZmZzZXRTY2FsZUJ5RGlzdGFuY2UgPSB1bmRlZmluZWRcclxuICAgICAgICB0aGlzLmVudGl0eS5sYWJlbC5zY2FsZUJ5RGlzdGFuY2UgPSB1bmRlZmluZWRcclxuICAgICAgICB0aGlzLmVudGl0eS5sYWJlbC5waXhlbE9mZnNldFNjYWxlQnlEaXN0YW5jZSA9IHVuZGVmaW5lZFxyXG4gICAgICB9XHJcbiAgICAgIC8vIHRoaXMuZW50aXR5LmJpbGxib2FyZC5waXhlbE9mZnNldCA9IG5ldyBDZXNpdW0uQ2FsbGJhY2tQcm9wZXJ0eShcclxuICAgICAgLy8gICBmdW5jdGlvbiAoKSB7XHJcbiAgICAgIC8vICAgICBsZXQgYmlsbGJvYXJkSCA9XHJcbiAgICAgIC8vICAgICAgIF90aGlzLmVudGl0eS5iaWxsYm9hcmQuaW1nSGVpZ2h0ICpcclxuICAgICAgLy8gICAgICAgKDMxIC8gX3RoaXMuZW50aXR5LmJpbGxib2FyZC5pbWdXaWR0aClcclxuICAgICAgLy8gICAgIHJldHVybiBuZXcgQ2VzaXVtLkNhcnRlc2lhbjIoXHJcbiAgICAgIC8vICAgICAgIDAsXHJcbiAgICAgIC8vICAgICAgIC0oYmlsbGJvYXJkSCAvIDIpICogX3RoaXMub3B0aW9ucy5iaWxsYm9hcmQuc2NhbGVcclxuICAgICAgLy8gICAgIClcclxuICAgICAgLy8gICB9LFxyXG4gICAgICAvLyAgIGZhbHNlXHJcbiAgICAgIC8vIClcclxuICAgICAgdGhpcy5lbnRpdHkubGFiZWwucGl4ZWxPZmZzZXQgPSBuZXcgQ2VzaXVtLkNhbGxiYWNrUHJvcGVydHkoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGlmIChfdGhpcy5vcHRpb25zLmJpbGxib2FyZC5zaG93KSB7XHJcbiAgICAgICAgICBsZXQgYmlsbGJvYXJkSCA9IF90aGlzLmVudGl0eS5iaWxsYm9hcmQuaW1nSGVpZ2h0ID9cclxuICAgICAgICAgICAgX3RoaXMuZW50aXR5LmJpbGxib2FyZC5pbWdIZWlnaHQgKlxyXG4gICAgICAgICAgICAoMzEgLyBfdGhpcy5lbnRpdHkuYmlsbGJvYXJkLmltZ1dpZHRoKSA6IDBcclxuICAgICAgICAgIHJldHVybiBuZXcgQ2VzaXVtLkNhcnRlc2lhbjIoXHJcbiAgICAgICAgICAgIDAsXHJcbiAgICAgICAgICAgIC1iaWxsYm9hcmRIICogX3RoaXMub3B0aW9ucy5iaWxsYm9hcmQuc2NhbGUgLVxyXG4gICAgICAgICAgICBfdGhpcy5vcHRpb25zLmxhYmVsLmZvbnRTaXplIC8gMiAtXHJcbiAgICAgICAgICAgIDVcclxuICAgICAgICAgIClcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmV0dXJuIG5ldyBDZXNpdW0uQ2FydGVzaWFuMigwLCAtX3RoaXMub3B0aW9ucy5sYWJlbC5mb250U2l6ZSAvIDIgLSA1KVxyXG4gICAgICAgIH1cclxuICAgICAgfSwgZmFsc2UpXHJcbiAgICAgIHRoaXMuZW50aXR5LmxhYmVsLmZvbnQgPSB0aGlzLm9wdGlvbnMubGFiZWwuZm9udFNpemUgKyAncHggJyArIGZvbnRcclxuICAgICAgdGhpcy5lbnRpdHkubGFiZWwuZmlsbENvbG9yID0gQ2VzaXVtLkNvbG9yLmZyb21Dc3NDb2xvclN0cmluZyhcclxuICAgICAgICB0aGlzLm9wdGlvbnMubGFiZWwuY29sb3JcclxuICAgICAgKVxyXG4gICAgICB0aGlzLmVudGl0eS5iaWxsYm9hcmQuc2NhbGUgPSB0aGlzLm9wdGlvbnMuYmlsbGJvYXJkLnNjYWxlXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZXNldCgpIHtcclxuICAgIGlmICghdGhpcy5lbnRpdHkpIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcbiAgICB0aGlzLm9wdGlvbnMgPSB0aGlzLmRlZXBDb3B5T2JqKHRoaXMub3JpZ2luYWxPcHRpb25zKVxyXG4gICAgdGhpcy5uZWFyID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMubmVhclxyXG4gICAgdGhpcy5mYXIgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5mYXJcclxuICAgIHRoaXMuc2NhbGVCeURpc3RhbmNlID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMuc2NhbGVCeURpc3RhbmNlXHJcbiAgICB0aGlzLmJpbGxib2FyZFNob3cgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5iaWxsYm9hcmQuc2hvd1xyXG4gICAgdGhpcy5iaWxsYm9hcmRJbWFnZSA9IHRoaXMub3JpZ2luYWxPcHRpb25zLmJpbGxib2FyZC5pbWFnZVxyXG4gICAgdGhpcy5iaWxsYm9hcmRTY2FsZSA9IHRoaXMub3JpZ2luYWxPcHRpb25zLmJpbGxib2FyZC5zY2FsZVxyXG4gICAgdGhpcy5sYWJlbFRleHQgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5sYWJlbC50ZXh0XHJcbiAgICB0aGlzLmxhYmVsU2hvdyA9IHRoaXMub3JpZ2luYWxPcHRpb25zLmxhYmVsLnNob3dcclxuICAgIHRoaXMubGFiZWxGb250U2l6ZSA9IHRoaXMub3JpZ2luYWxPcHRpb25zLmxhYmVsLmZvbnRTaXplXHJcbiAgICB0aGlzLmxhYmVsQ29sb3IgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5sYWJlbC5jb2xvclxyXG4gICAgdGhpcy5sbmcgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5wb3NpdGlvbi5sbmdcclxuICAgIHRoaXMubGF0ID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMucG9zaXRpb24ubGF0XHJcbiAgICB0aGlzLmFsdCA9IHRoaXMub3JpZ2luYWxPcHRpb25zLnBvc2l0aW9uLmFsdFxyXG4gICAgdGhpcy5hdHRyaWJ1dGVMaW5rID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnRcclxuICAgIHRoaXMuYXR0cmlidXRlVnIgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnRcclxuICAgIHRoaXMuYXR0cmlidXRlQ2FtZXJhID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5jYW1lcmEuY29udGVudFxyXG4gICAgdGhpcy5hdHRyaWJ1dGVHb29kcyA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUuZ29vZHMuY29udGVudFxyXG4gICAgdGhpcy5hdHRyaWJ1dGVJU0MgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmlzYy5jb250ZW50XHJcbiAgICB0aGlzLmNhbWVyYVNlbGVjdCAmJiB0aGlzLmNhbWVyYVNlbGVjdCgpXHJcbiAgICB0aGlzLmdvb2RzU2VsZWN0ICYmIHRoaXMuZ29vZHNTZWxlY3QoKVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgcmVtb3ZlKCkge1xyXG4gICAgYXdhaXQgcmVtb3ZlX2VudGl0eV9mcm9tX2NsdXN0ZXIodGhpcy5zZGsudmlld2VyLCB0aGlzLmVudGl0eSlcclxuICAgIHRoaXMuZW50aXR5ID0gbnVsbFxyXG4gICAgaWYgKCF0aGlzLnNkay52aWV3ZXIgfHwgIXRoaXMuc2RrLnZpZXdlci5lbnRpdGllcykge1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuICAgIC8vIGlmICh0aGlzLmRpZmZ1c2UpIHtcclxuICAgIC8vICAgdGhpcy5kaWZmdXNlLnJlbW92ZSgpXHJcbiAgICAvLyAgIHRoaXMuZGlmZnVzZSA9IG51bGxcclxuICAgIC8vIH1cclxuICAgIC8vIGlmICh0aGlzLnNjYW4pIHtcclxuICAgIC8vICAgdGhpcy5zY2FuLnJlbW92ZSgpXHJcbiAgICAvLyAgIHRoaXMuc2NhbiA9IG51bGxcclxuICAgIC8vIH1cclxuICAgIGlmICh0aGlzLl9EaWFsb2dPYmplY3QgJiYgIXRoaXMuX0RpYWxvZ09iamVjdC5pc0Rlc3Ryb3kpIHtcclxuICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0LmNsb3NlKClcclxuICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0ID0gbnVsbFxyXG4gICAgfVxyXG4gICAgdGhpcy5ldmVudCAmJiB0aGlzLmV2ZW50LmRlc3Ryb3koKVxyXG4gICAgdGhpcy50aXAgJiYgdGhpcy50aXAuZGVzdHJveSgpXHJcbiAgICBhd2FpdCB0aGlzLnNkay5yZW1vdmVJbmNldGFuY2UodGhpcy5vcHRpb25zLmlkKVxyXG4gICAgYXdhaXQgc3luY0RhdGEodGhpcy5zZGssIHRoaXMub3B0aW9ucy5pZClcclxuICAgIC8vIHRoaXMuZW50aXR5ID0gbnVsbFxyXG4gIH1cclxuXHJcbiAgLy8g54K55Ye75by55qGG5YaF5Zu+5qCH5YiH5o2iXHJcbiAgY2xpY2tDaGFuZ2VJbWFnZSgpIHtcclxuICAgIHRoaXMuRGlhbG9nLmNsaWNrQ2hhbmdlSW1hZ2UgJiYgdGhpcy5EaWFsb2cuY2xpY2tDaGFuZ2VJbWFnZSgpXHJcbiAgfVxyXG4gIC8vIOeCueWHu+W8ueahhuWGhem7mOiupOWbvuagh+WIh+aNolxyXG4gIGNsaWNrQ2hhbmdlRGVmYXVsdEltYWdlKCkge1xyXG4gICAgdGhpcy5EaWFsb2cuY2xpY2tDaGFuZ2VEZWZhdWx0SW1hZ2UgJiYgdGhpcy5EaWFsb2cuY2xpY2tDaGFuZ2VEZWZhdWx0SW1hZ2UoKVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgdXBkYXRlSGVpZ2h0KCkge1xyXG4gICAgaWYgKCF0aGlzLnNkayB8fCAhdGhpcy5zZGsudmlld2VyIHx8ICF0aGlzLnNkay52aWV3ZXIuc2NlbmUpIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcbiAgICBsZXQgaGVpZ2h0XHJcbiAgICBsZXQgaGVpZ2h0MlxyXG4gICAgbGV0IHBvaW50MSA9IG5ldyBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlcyhcclxuICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uLmxuZyxcclxuICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uLmxhdCxcclxuICAgICAgMFxyXG4gICAgKVxyXG4gICAgbGV0IHBvaW50MiA9IG5ldyBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlcyhcclxuICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uLmxuZyxcclxuICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uLmxhdCxcclxuICAgICAgMTAwMDAwMDAwMDAwMDBcclxuICAgIClcclxuXHJcbiAgICBsZXQgb2JqZWN0c1RvRXhjbHVkZSA9IFtdXHJcbiAgICBmb3IgKGxldCBba2V5LCB2YWx1ZV0gb2YgdGhpcy5zZGsuZW50aXR5TWFwKSB7XHJcbiAgICAgIGlmICh2YWx1ZS50eXBlID09PSAnUmFkYXJTY2FuU3RlcmVvc2NvcGljJyAmJiB2YWx1ZS5lbnRpdHkpIHtcclxuICAgICAgICBvYmplY3RzVG9FeGNsdWRlLnB1c2godmFsdWUuZW50aXR5KVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBsZXQgdXBkYXRlZENhcnRlc2lhbnMgPSBhd2FpdCB0aGlzLnNkay52aWV3ZXIuc2NlbmUuY2xhbXBUb0hlaWdodE1vc3REZXRhaWxlZChbcG9pbnQxXSwgb2JqZWN0c1RvRXhjbHVkZSlcclxuICAgIGlmICh1cGRhdGVkQ2FydGVzaWFucyAmJiB1cGRhdGVkQ2FydGVzaWFuc1swXSkge1xyXG4gICAgICBoZWlnaHQgPSB0aGlzLmNhcnRlc2lhbjNUb3dnczg0KHVwZGF0ZWRDYXJ0ZXNpYW5zWzBdLCB0aGlzLnNkay52aWV3ZXIpLmFsdFxyXG4gICAgfVxyXG5cclxuICAgIGxldCBkaXJlY3Rpb24gPSBDZXNpdW0uQ2FydGVzaWFuMy5zdWJ0cmFjdChcclxuICAgICAgcG9pbnQxLFxyXG4gICAgICBwb2ludDIsXHJcbiAgICAgIG5ldyBDZXNpdW0uQ2FydGVzaWFuMygpXHJcbiAgICApXHJcbiAgICBsZXQgYyA9IENlc2l1bS5DYXJ0ZXNpYW4zLm5vcm1hbGl6ZShkaXJlY3Rpb24sIG5ldyBDZXNpdW0uQ2FydGVzaWFuMygpKVxyXG4gICAgbGV0IHJheSA9IG5ldyBDZXNpdW0uUmF5KHBvaW50MiwgYylcclxuICAgIGxldCByID0ge31cclxuICAgIGxldCBwaWNrZWRPYmplY3RzID0gdGhpcy5zZGsudmlld2VyLnNjZW5lLmRyaWxsUGlja0Zyb21SYXkocmF5KVxyXG4gICAgZm9yIChsZXQgaSA9IHBpY2tlZE9iamVjdHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgaWYgKHBpY2tlZE9iamVjdHNbaV0ucG9zaXRpb24pIHtcclxuICAgICAgICByID0gcGlja2VkT2JqZWN0c1tpXVxyXG4gICAgICAgIGJyZWFrXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmIChyICYmIHIucG9zaXRpb24pIHtcclxuICAgICAgaGVpZ2h0MiA9IHRoaXMuY2FydGVzaWFuM1Rvd2dzODQoci5wb3NpdGlvbiwgdGhpcy5zZGsudmlld2VyKS5hbHRcclxuICAgIH1cclxuICAgIGxldCBwcm9taXNlXHJcbiAgICB0cnkge1xyXG4gICAgICBwcm9taXNlID0gYXdhaXQgQ2VzaXVtLnNhbXBsZVRlcnJhaW5Nb3N0RGV0YWlsZWQoXHJcbiAgICAgICAgdGhpcy5zZGsudmlld2VyLnRlcnJhaW5Qcm92aWRlcixcclxuICAgICAgICBbXHJcbiAgICAgICAgICBDZXNpdW0uQ2FydG9ncmFwaGljLmZyb21EZWdyZWVzKFxyXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb24ubG5nLFxyXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb24ubGF0XHJcbiAgICAgICAgICApXHJcbiAgICAgICAgXVxyXG4gICAgICApXHJcbiAgICB9IGNhdGNoIChlcnJvcikgeyB9XHJcblxyXG4gICAgaWYgKChoZWlnaHQyID09PSB2b2lkIDAgfHwgaGVpZ2h0MiA8IHByb21pc2VbMF0uaGVpZ2h0KSAmJiBwcm9taXNlKSB7XHJcbiAgICAgIGhlaWdodDIgPSBwcm9taXNlWzBdLmhlaWdodFxyXG4gICAgfVxyXG4gICAgaWYgKGhlaWdodCA9PT0gdm9pZCAwIHx8IGhlaWdodCA8IGhlaWdodDIpIHtcclxuICAgICAgaGVpZ2h0ID0gaGVpZ2h0MlxyXG4gICAgfVxyXG4gICAgaWYgKGhlaWdodCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbi5hbHQgPSBOdW1iZXIoTnVtYmVyKGhlaWdodCkudG9GaXhlZCgyKSlcclxuICAgICAgdGhpcy5yZW5ld1BvaW50KClcclxuICAgICAgdGhpcy5jb29yZGluYXRlID0gdGhpcy5vcHRpb25zLmNvb3JkaW5hdGVcclxuICAgICAgcmV0dXJuIHRydWVcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIGZseVRvKG9wdGlvbnMgPSB7fSkge1xyXG4gICAgc2V0QWN0aXZlVmlld2VyKDApXHJcbiAgICBjbG9zZVJvdGF0ZUFyb3VuZCh0aGlzLnNkaylcclxuICAgIGNsb3NlVmlld0ZvbGxvdyh0aGlzLnNkaylcclxuXHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMub3B0aW9ucy5jdXN0b21WaWV3ICYmXHJcbiAgICAgIHRoaXMub3B0aW9ucy5jdXN0b21WaWV3LnJlbGF0aXZlUG9zaXRpb24gJiZcclxuICAgICAgdGhpcy5vcHRpb25zLmN1c3RvbVZpZXcub3JpZW50YXRpb25cclxuICAgICkge1xyXG4gICAgICBsZXQgb3JpZW50YXRpb24gPSB7XHJcbiAgICAgICAgaGVhZGluZzogQ2VzaXVtLk1hdGgudG9SYWRpYW5zKFxyXG4gICAgICAgICAgdGhpcy5vcHRpb25zLmN1c3RvbVZpZXcub3JpZW50YXRpb24uaGVhZGluZyB8fCAwLjBcclxuICAgICAgICApLFxyXG4gICAgICAgIHBpdGNoOiBDZXNpdW0uTWF0aC50b1JhZGlhbnMoXHJcbiAgICAgICAgICB0aGlzLm9wdGlvbnMuY3VzdG9tVmlldy5vcmllbnRhdGlvbi5waXRjaCB8fCAtNjAuMFxyXG4gICAgICAgICksXHJcbiAgICAgICAgcm9sbDogQ2VzaXVtLk1hdGgudG9SYWRpYW5zKFxyXG4gICAgICAgICAgdGhpcy5vcHRpb25zLmN1c3RvbVZpZXcub3JpZW50YXRpb24ucm9sbCB8fCAwLjBcclxuICAgICAgICApXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBsbmcgPSB0aGlzLm9wdGlvbnMuY3VzdG9tVmlldy5yZWxhdGl2ZVBvc2l0aW9uLmxuZ1xyXG4gICAgICBsZXQgbGF0ID0gdGhpcy5vcHRpb25zLmN1c3RvbVZpZXcucmVsYXRpdmVQb3NpdGlvbi5sYXRcclxuICAgICAgbGV0IGFsdCA9IHRoaXMub3B0aW9ucy5jdXN0b21WaWV3LnJlbGF0aXZlUG9zaXRpb24uYWx0XHJcbiAgICAgIGxldCBkZXN0aW5hdGlvbiA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzKGxuZywgbGF0LCBhbHQpXHJcblxyXG4gICAgICBsZXQgcG9zaXRpb24gPSB7IGxuZzogMCwgbGF0OiAwIH1cclxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5wb3NpdGlvbikge1xyXG4gICAgICAgIHBvc2l0aW9uID0geyAuLi50aGlzLm9wdGlvbnMucG9zaXRpb24gfVxyXG4gICAgICB9IGVsc2UgaWYgKHRoaXMub3B0aW9ucy5wb3NpdGlvbikge1xyXG4gICAgICAgIHBvc2l0aW9uID0geyAuLi50aGlzLm9wdGlvbnMucG9zaXRpb24gfVxyXG4gICAgICB9IGVsc2UgaWYgKHRoaXMub3B0aW9ucy5jZW50ZXIpIHtcclxuICAgICAgICBwb3NpdGlvbiA9IHsgLi4udGhpcy5vcHRpb25zLmNlbnRlciB9XHJcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5vcHRpb25zLnN0YXJ0KSB7XHJcbiAgICAgICAgcG9zaXRpb24gPSB7IC4uLnRoaXMub3B0aW9ucy5zdGFydCB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgnbG5nJykpIHtcclxuICAgICAgICAgIHBvc2l0aW9uLmxuZyA9IHRoaXMub3B0aW9ucy5sbmdcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgnbGF0JykpIHtcclxuICAgICAgICAgIHBvc2l0aW9uLmxhdCA9IHRoaXMub3B0aW9ucy5sYXRcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgnYWx0JykpIHtcclxuICAgICAgICAgIHBvc2l0aW9uLmFsdCA9IHRoaXMub3B0aW9ucy5hbHRcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgLy8g5aaC5p6c5rKh5pyJ6auY5bqm5YC877yM5YiZ6I635Y+W57Sn6LS06auY5bqm6K6h566XXHJcbiAgICAgIGlmICghcG9zaXRpb24uaGFzT3duUHJvcGVydHkoJ2FsdCcpKSB7XHJcbiAgICAgICAgbGV0IG9iamVjdHNUb0V4Y2x1ZGUgPSBbXVxyXG4gICAgICAgIGZvciAobGV0IFtrZXksIHZhbHVlXSBvZiB0aGlzLnNkay5lbnRpdHlNYXApIHtcclxuICAgICAgICAgIGlmICh2YWx1ZS50eXBlID09PSAnUmFkYXJTY2FuU3RlcmVvc2NvcGljJyAmJiB2YWx1ZS5lbnRpdHkpIHtcclxuICAgICAgICAgICAgb2JqZWN0c1RvRXhjbHVkZS5wdXNoKHZhbHVlLmVudGl0eSlcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcG9zaXRpb24uYWx0ID0gYXdhaXQgdGhpcy5nZXRDbGFtcFRvSGVpZ2h0KHBvc2l0aW9uLCBvYmplY3RzVG9FeGNsdWRlKVxyXG4gICAgICB9XHJcbiAgICAgIGxuZyA9IHRoaXMub3B0aW9ucy5jdXN0b21WaWV3LnJlbGF0aXZlUG9zaXRpb24ubG5nICsgcG9zaXRpb24ubG5nXHJcbiAgICAgIGxhdCA9IHRoaXMub3B0aW9ucy5jdXN0b21WaWV3LnJlbGF0aXZlUG9zaXRpb24ubGF0ICsgcG9zaXRpb24ubGF0XHJcbiAgICAgIGFsdCA9IHRoaXMub3B0aW9ucy5jdXN0b21WaWV3LnJlbGF0aXZlUG9zaXRpb24uYWx0ICsgcG9zaXRpb24uYWx0XHJcbiAgICAgIGRlc3RpbmF0aW9uID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXMobG5nLCBsYXQsIGFsdClcclxuICAgICAgdGhpcy5zZGsudmlld2VyLmNhbWVyYS5mbHlUbyh7XHJcbiAgICAgICAgZGVzdGluYXRpb246IGRlc3RpbmF0aW9uLFxyXG4gICAgICAgIG9yaWVudGF0aW9uOiBvcmllbnRhdGlvblxyXG4gICAgICB9KVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbGV0IG9iamVjdHNUb0V4Y2x1ZGUgPSBbXVxyXG4gICAgICBmb3IgKGxldCBba2V5LCB2YWx1ZV0gb2YgdGhpcy5zZGsuZW50aXR5TWFwKSB7XHJcbiAgICAgICAgaWYgKHZhbHVlLnR5cGUgPT09ICdSYWRhclNjYW5TdGVyZW9zY29waWMnICYmIHZhbHVlLmVudGl0eSkge1xyXG4gICAgICAgICAgb2JqZWN0c1RvRXhjbHVkZS5wdXNoKHZhbHVlLmVudGl0eSlcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgbGV0IGhlaWdodCA9IGF3YWl0IHRoaXMuZ2V0Q2xhbXBUb0hlaWdodCh0aGlzLm9wdGlvbnMucG9zaXRpb24sIG9iamVjdHNUb0V4Y2x1ZGUpXHJcbiAgICAgIHRoaXMuc2RrLnZpZXdlci5jYW1lcmEuZmx5VG8oe1xyXG4gICAgICAgIG9yaWVudGF0aW9uOiBvcHRpb25zLm9yaWVudGF0aW9uLFxyXG4gICAgICAgIGRlc3RpbmF0aW9uOiBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlcyhcclxuICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbi5sbmcsXHJcbiAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb24ubGF0LFxyXG4gICAgICAgICAgaGVpZ2h0ICsgKG9wdGlvbnMuaGVpZ2h0IHx8IDUwMClcclxuICAgICAgICApXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzZXRQb3NpdGlvbih2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMucG9zaXRpb24ubG5nID0gdi5wb3NpdGlvbi5sbmdcclxuICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbi5sYXQgPSB2LnBvc2l0aW9uLmxhdFxyXG4gICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uLmFsdCA9IHYucG9zaXRpb24uYWx0XHJcbiAgICB0aGlzLnJlbmV3UG9pbnQoKVxyXG4gIH1cclxuXHJcbiAgLyoqQGRlc2Mg5omT5byA5bmz56e75Yqf6IO9XHJcbiAgICpcclxuICAgKiBAbWVtYmVyT2YgU291cmNlXHJcbiAgICogQHBhcmFtIHN0YXR1cyB7Ym9vbGVhbn1cclxuICAgKlxyXG4gICAqICovXHJcbiAgc2V0IHBvc2l0aW9uRWRpdGluZyhzdGF0dXMpIHtcclxuICAgIGlmICghdGhpcy5zZGsgfHwgIXRoaXMuc2RrLnZpZXdlciB8fCAhdGhpcy5lbnRpdHkpIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcbiAgICB0aGlzLm9wZXJhdGUucG9zaXRpb25FZGl0aW5nID0gc3RhdHVzXHJcbiAgICB0aGlzLmV2ZW50ICYmIHRoaXMuZXZlbnQuZGVzdHJveSgpXHJcbiAgICB0aGlzLmV2ZW50ID0gbmV3IE1vdXNlRXZlbnQodGhpcy5zZGspXHJcbiAgICBpZiAoc3RhdHVzID09PSB0cnVlKSB7XHJcbiAgICAgIHRoaXMucGlja2luZyA9IGZhbHNlXHJcbiAgICAgIHRoaXMudGlwICYmIHRoaXMudGlwLmRlc3Ryb3koKVxyXG4gICAgICB0aGlzLnRpcCA9IG5ldyBNb3VzZVRpcCgn54K55Ye76byg5qCH5bem6ZSu56Gu6K6k77yM5Y+z6ZSu5Y+W5raIJywgdGhpcy5zZGspXHJcbiAgICAgIHRoaXMucHJldmlvdXMgPSB7XHJcbiAgICAgICAgcG9zaXRpb246IHsgLi4udGhpcy5vcHRpb25zLnBvc2l0aW9uIH1cclxuICAgICAgfVxyXG4gICAgICBsZXQgbW92ZUV2ZW50ID0gKG1vdmVtZW50LCBjYXJ0ZXNpYW4pID0+IHtcclxuICAgICAgICB0aGlzLmVudGl0eS5wb3NpdGlvbiA9IG5ldyBDZXNpdW0uQ2FsbGJhY2tQcm9wZXJ0eShmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICByZXR1cm4gY2FydGVzaWFuXHJcbiAgICAgICAgfSwgZmFsc2UpXHJcblxyXG4gICAgICAgIHRoaXMudGlwLnNldFBvc2l0aW9uKFxyXG4gICAgICAgICAgY2FydGVzaWFuLFxyXG4gICAgICAgICAgbW92ZW1lbnQuZW5kUG9zaXRpb24ueCxcclxuICAgICAgICAgIG1vdmVtZW50LmVuZFBvc2l0aW9uLnlcclxuICAgICAgICApXHJcbiAgICAgIH1cclxuICAgICAgbGV0IGxlZnRFdmVudCA9IChtb3ZlbWVudCwgY2FydGVzaWFuKSA9PiB7XHJcbiAgICAgICAgbGV0IHBvc2l0aW9ucyA9IHRoaXMuY2FydGVzaWFuM1Rvd2dzODQoY2FydGVzaWFuLCB0aGlzLnNkay52aWV3ZXIpXHJcbiAgICAgICAgdGhpcy5sbmcgPSBwb3NpdGlvbnMubG5nXHJcbiAgICAgICAgdGhpcy5sYXQgPSBwb3NpdGlvbnMubGF0XHJcbiAgICAgICAgdGhpcy5hbHQgPSBwb3NpdGlvbnMuYWx0XHJcbiAgICAgICAgdGhpcy5wcmV2aW91cyA9IHtcclxuICAgICAgICAgIHBvc2l0aW9uOiB7IC4uLnRoaXMub3B0aW9ucy5wb3NpdGlvbiB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuZXZlbnQubW91c2VfbW92ZSgoKSA9PiB7IH0pXHJcbiAgICAgICAgdGhpcy5ldmVudC5tb3VzZV9sZWZ0KCgpID0+IHsgfSlcclxuICAgICAgICB0aGlzLmV2ZW50Lm1vdXNlX3JpZ2h0KCgpID0+IHsgfSlcclxuICAgICAgICB0aGlzLmV2ZW50Lmdlc3R1cmVfcGluY2tfc3RhcnQoKCkgPT4geyB9KVxyXG4gICAgICAgIHRoaXMuZXZlbnQuZ2VzdHVyZV9waW5ja19lbmQoKCkgPT4geyB9KVxyXG4gICAgICAgIHRoaXMuZW50aXR5LnBvc2l0aW9uID0gbmV3IENlc2l1bS5DYWxsYmFja1Byb3BlcnR5KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgIHJldHVybiBjYXJ0ZXNpYW5cclxuICAgICAgICB9LCBmYWxzZSlcclxuICAgICAgICBpZih0aGlzLiNfcG9zaXRpb25FZGl0aW5nQ2FsbGJhY2spIHtcclxuICAgICAgICAgIHRoaXMuI19wb3NpdGlvbkVkaXRpbmdDYWxsYmFjaygpXHJcbiAgICAgICAgICB0aGlzLiNfcG9zaXRpb25FZGl0aW5nQ2FsbGJhY2sgPSBudWxsXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMucG9zaXRpb25FZGl0aW5nID0gZmFsc2VcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmV2ZW50Lm1vdXNlX21vdmUobW92ZUV2ZW50KVxyXG4gICAgICB0aGlzLmV2ZW50Lm1vdXNlX2xlZnQobGVmdEV2ZW50KVxyXG4gICAgICB0aGlzLmV2ZW50Lm1vdXNlX3JpZ2h0KChtb3ZlbWVudCwgY2FydGVzaWFuKSA9PiB7XHJcbiAgICAgICAgdGhpcy5wb3NpdGlvbkVkaXRpbmcgPSBmYWxzZVxyXG4gICAgICB9KVxyXG5cclxuICAgICAgdGhpcy5ldmVudC5nZXN0dXJlX3BpbmNrX3N0YXJ0KChtb3ZlbWVudCwgY2FydGVzaWFuKSA9PiB7XHJcbiAgICAgICAgbGV0IHN0YXJ0VGltZSA9IG5ldyBEYXRlKClcclxuICAgICAgICB0aGlzLmV2ZW50Lmdlc3R1cmVfcGluY2tfZW5kKCgpID0+IHtcclxuICAgICAgICAgIGxldCBlbmRUaW1lID0gbmV3IERhdGUoKVxyXG4gICAgICAgICAgbGV0IHBvcyA9IHtcclxuICAgICAgICAgICAgcG9zaXRpb246IHtcclxuICAgICAgICAgICAgICB4OiAobW92ZW1lbnQucG9zaXRpb24xLnggKyBtb3ZlbWVudC5wb3NpdGlvbjIueCkgLyAyLFxyXG4gICAgICAgICAgICAgIHk6IChtb3ZlbWVudC5wb3NpdGlvbjEueSArIG1vdmVtZW50LnBvc2l0aW9uMi55KSAvIDJcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKGVuZFRpbWUgLSBzdGFydFRpbWUgPj0gNTAwKSB7XHJcbiAgICAgICAgICAgIC8vIOmVv+aMieWPlua2iFxyXG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uRWRpdGluZyA9IGZhbHNlXHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBsZWZ0RXZlbnQocG9zLCBjYXJ0ZXNpYW4pXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgfSlcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuI19wb3NpdGlvbkVkaXRpbmdDYWxsYmFjayA9IG51bGxcclxuICAgICAgdGhpcy5waWNraW5nID0gdHJ1ZVxyXG4gICAgICBpZiAodGhpcy5ldmVudCkge1xyXG4gICAgICAgIHRoaXMuZXZlbnQubW91c2VfbW92ZSgoKSA9PiB7IH0pXHJcbiAgICAgICAgdGhpcy5ldmVudC5tb3VzZV9sZWZ0KCgpID0+IHsgfSlcclxuICAgICAgICB0aGlzLmV2ZW50Lm1vdXNlX3JpZ2h0KCgpID0+IHsgfSlcclxuICAgICAgICB0aGlzLmV2ZW50Lmdlc3R1cmVfcGluY2tfc3RhcnQoKCkgPT4geyB9KVxyXG4gICAgICAgIHRoaXMuZXZlbnQuZ2VzdHVyZV9waW5ja19lbmQoKCkgPT4geyB9KVxyXG4gICAgICAgIHRoaXMuZXZlbnQuZGVzdHJveSgpXHJcbiAgICAgICAgdGhpcy5ldmVudCA9IG51bGxcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnRpcCAmJiB0aGlzLnRpcC5kZXN0cm95KClcclxuICAgICAgdGhpcy5sbmcgPSB0aGlzLnByZXZpb3VzLnBvc2l0aW9uLmxuZ1xyXG4gICAgICB0aGlzLmxhdCA9IHRoaXMucHJldmlvdXMucG9zaXRpb24ubGF0XHJcbiAgICAgIHRoaXMuYWx0ID0gdGhpcy5wcmV2aW91cy5wb3NpdGlvbi5hbHRcclxuICAgICAgdGhpcy5yZW5ld1BvaW50KClcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCBwb3NpdGlvbkVkaXRpbmcoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcGVyYXRlLnBvc2l0aW9uRWRpdGluZ1xyXG4gIH1cclxuXHJcbiAgb3BlblBvc2l0aW9uRWRpdGluZyhjZCkge1xyXG4gICAgdGhpcy5wb3NpdGlvbkVkaXRpbmcgPSB0cnVlXHJcbiAgICB0aGlzLiNfcG9zaXRpb25FZGl0aW5nQ2FsbGJhY2sgPSBjZFxyXG4gIH1cclxuXHJcbiAgc2V0RElWKG9wdGlvbnMgPSB7IGRvbWlkOiAnJywgeDogMTAsIHk6IDEwIH0pIHtcclxuICAgIG9wdGlvbnMueCA9IG9wdGlvbnMueCB8fCBvcHRpb25zLnggPT09IDAgPyBvcHRpb25zLnggOiAxMFxyXG4gICAgb3B0aW9ucy55ID0gb3B0aW9ucy55IHx8IG9wdGlvbnMueSA9PT0gMCA/IG9wdGlvbnMueSA6IDEwXHJcbiAgICBsZXQgc2l0ZUluZm9Eb20gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChvcHRpb25zLmRvbWlkKVxyXG4gICAgbGV0IHNpdGVJbmZvUG9zaXRpb24gPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlcyhcclxuICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uLmxuZyxcclxuICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uLmxhdFxyXG4gICAgKVxyXG5cclxuICAgIHRoaXMuc2RrLnZpZXdlci5zY2VuZS5wb3N0UmVuZGVyLmFkZEV2ZW50TGlzdGVuZXIocGVyY2VudGFnZSA9PiB7XHJcbiAgICAgIC8v6L2s5o2i5Yiw5bGP5bmV5Z2Q5qCHXHJcbiAgICAgIGlmIChcclxuICAgICAgICBzaXRlSW5mb0RvbS5zdHlsZS5kaXNwbGF5ID09PSAnYmxvY2snIHx8XHJcbiAgICAgICAgc2l0ZUluZm9Eb20uc3R5bGUuZGlzcGxheSA9PT0gJydcclxuICAgICAgKSB7XHJcbiAgICAgICAgbGV0IHdpbnBvcyA9IHRoaXMuc2RrLnZpZXdlci5zY2VuZS5jYXJ0ZXNpYW5Ub0NhbnZhc0Nvb3JkaW5hdGVzKFxyXG4gICAgICAgICAgc2l0ZUluZm9Qb3NpdGlvblxyXG4gICAgICAgIClcclxuICAgICAgICBpZiAod2lucG9zKSB7XHJcbiAgICAgICAgICBzaXRlSW5mb0RvbS5zdHlsZS5sZWZ0ID0gKHdpbnBvcy54ICsgb3B0aW9ucy54KS50b0ZpeGVkKDApICsgJ3B4J1xyXG4gICAgICAgICAgc2l0ZUluZm9Eb20uc3R5bGUudG9wID0gKHdpbnBvcy55ICsgb3B0aW9ucy55KS50b0ZpeGVkKDApICsgJ3B4J1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGFzeW5jIHNldEN1c3RvbVZpZXcodmFsKSB7XHJcbiAgICBpZiAodmFsKSB7XHJcbiAgICAgIHRoaXMub3B0aW9ucy5jdXN0b21WaWV3ID0gdmFsXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBsZXQgY2FtZXJhID0gdGhpcy5zZGsudmlld2VyLmNhbWVyYVxyXG4gICAgICBsZXQgY2FtZXJhUG9zaXRpb244NCA9IHRoaXMuY2FydGVzaWFuM1Rvd2dzODQoXHJcbiAgICAgICAgY2FtZXJhLnBvc2l0aW9uLFxyXG4gICAgICAgIHRoaXMuc2RrLnZpZXdlclxyXG4gICAgICApXHJcblxyXG4gICAgICBsZXQgcG9zaXRpb24gPSB7IGxuZzogMCwgbGF0OiAwIH1cclxuICAgICAgbGV0IHJlbGF0aXZlUG9zaXRpb24gPSB7IC4uLmNhbWVyYVBvc2l0aW9uODQgfVxyXG4gICAgICBpZiAodGhpcy5vcHRpb25zLnBvc2l0aW9uKSB7XHJcbiAgICAgICAgcG9zaXRpb24gPSB7IC4uLnRoaXMub3B0aW9ucy5wb3NpdGlvbiB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgnbG5nJykpIHtcclxuICAgICAgICAgIHBvc2l0aW9uLmxuZyA9IHRoaXMub3B0aW9ucy5sbmdcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgnbGF0JykpIHtcclxuICAgICAgICAgIHBvc2l0aW9uLmxhdCA9IHRoaXMub3B0aW9ucy5sYXRcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgnYWx0JykpIHtcclxuICAgICAgICAgIHBvc2l0aW9uLmFsdCA9IHRoaXMub3B0aW9ucy5hbHRcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgLy8g5aaC5p6c5rKh5pyJ6auY5bqm5YC877yM5YiZ6I635Y+W57Sn6LS06auY5bqm6K6h566XXHJcbiAgICAgIGlmICghcG9zaXRpb24uaGFzT3duUHJvcGVydHkoJ2FsdCcpKSB7XHJcbiAgICAgICAgbGV0IG9iamVjdHNUb0V4Y2x1ZGUgPSBbXVxyXG4gICAgICAgIGZvciAobGV0IFtrZXksIHZhbHVlXSBvZiB0aGlzLnNkay5lbnRpdHlNYXApIHtcclxuICAgICAgICAgIGlmICh2YWx1ZS50eXBlID09PSAnUmFkYXJTY2FuU3RlcmVvc2NvcGljJyAmJiB2YWx1ZS5lbnRpdHkpIHtcclxuICAgICAgICAgICAgb2JqZWN0c1RvRXhjbHVkZS5wdXNoKHZhbHVlLmVudGl0eSlcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcG9zaXRpb24uYWx0ID0gYXdhaXQgdGhpcy5nZXRDbGFtcFRvSGVpZ2h0KHBvc2l0aW9uLCBvYmplY3RzVG9FeGNsdWRlKVxyXG4gICAgICB9XHJcbiAgICAgIHJlbGF0aXZlUG9zaXRpb24gPSB7XHJcbiAgICAgICAgbG5nOiBjYW1lcmFQb3NpdGlvbjg0LmxuZyAtIHBvc2l0aW9uLmxuZyxcclxuICAgICAgICBsYXQ6IGNhbWVyYVBvc2l0aW9uODQubGF0IC0gcG9zaXRpb24ubGF0LFxyXG4gICAgICAgIGFsdDogY2FtZXJhUG9zaXRpb244NC5hbHQgLSBwb3NpdGlvbi5hbHRcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5vcHRpb25zLmN1c3RvbVZpZXcgPSB7XHJcbiAgICAgICAgb3JpZW50YXRpb246IHtcclxuICAgICAgICAgIGhlYWRpbmc6IENlc2l1bS5NYXRoLnRvRGVncmVlcyhjYW1lcmEuaGVhZGluZyksXHJcbiAgICAgICAgICBwaXRjaDogQ2VzaXVtLk1hdGgudG9EZWdyZWVzKGNhbWVyYS5waXRjaCksXHJcbiAgICAgICAgICByb2xsOiBDZXNpdW0uTWF0aC50b0RlZ3JlZXMoY2FtZXJhLnJvbGwpXHJcbiAgICAgICAgfSxcclxuICAgICAgICByZWxhdGl2ZVBvc2l0aW9uOiByZWxhdGl2ZVBvc2l0aW9uXHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5vcmlnaW5hbE9wdGlvbnMgJiZcclxuICAgICAgICAodGhpcy5vcmlnaW5hbE9wdGlvbnMuY3VzdG9tVmlldyA9IHRoaXMub3B0aW9ucy5jdXN0b21WaWV3KVxyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgQmlsbGJvYXJkT2JqZWN0XHJcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFNQTtBQU1BO0FBQUE7QUFBQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQWpFQTtBQWtFQTtBQUNBO0FBQ0E7QUFJQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBSUE7QUFHQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUdBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQXlNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFJQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBS0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUlBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQVFBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQWNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBR0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFXQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFHQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFqQkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQXpCQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBa0RBO0FBekRBO0FBQUE7QUFBQTtBQUFBO0FBMERBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFWQTtBQUFBO0FBUUE7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQWxCQTtBQUFBO0FBQUE7QUFtQkE7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQVFBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQWNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBR0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFXQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFHQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFqQkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQXpCQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBa0RBO0FBekRBO0FBQUE7QUFBQTtBQUFBO0FBMERBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFWQTtBQUFBO0FBUUE7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQWxCQTtBQUFBO0FBQUE7QUFtQkE7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFJQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQU1BO0FBR0E7QUFHQTtBQUdBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFBQTtBQUFBO0FBQUE7QUFJQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQWdCQTtBQWdEQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFIQTtBQUFBO0FBQUE7QUFBQTtBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFBQTtBQUpBO0FBQUE7QUFBQTtBQUFBO0FBUUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBRUE7QUE0QkE7QUFBQTtBQXpCQTtBQUFBO0FBQUE7QUFJQTtBQUNBO0FBU0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFNQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBSUE7QUFLQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBRkE7QUFBQTtBQUFBO0FBQUE7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFTQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFTQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBR0E7QUFDQTtBQUtBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFGQTtBQUFBO0FBQUE7QUFBQTtBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBR0E7QUFHQTtBQUlBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFzQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBV0E7QUExaUJBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBNmlCQTtBQUVBO0FBRUE7QUFDQTtBQUtBO0FBQ0E7QUFNQTtBQU1BO0FBTUE7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUF2QkE7QUFBQTtBQUFBO0FBQUE7QUF5QkE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFLQTtBQUtBO0FBTUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBRkE7QUFBQTtBQUFBO0FBQUE7QUFNQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFXQTtBQVJBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBV0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBdkVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUF5RUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUtBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFHQTtBQUdBO0FBR0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQWxGQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQXFGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFMQTtBQUFBO0FBQUE7QUFrR0E7QUFDQTtBQUFBO0FBN0ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQU9BO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBSUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUtBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQXBEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQXBzRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFNQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQXNqRUEiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/Obj/Base/BillboardObject/index.js\n"); /***/ }), @@ -1895,7 +1895,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _bab /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/toConsumableArray */ \"./node_modules/@babel/runtime/helpers/toConsumableArray.js\");\n/* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ \"./node_modules/@babel/runtime/helpers/asyncToGenerator.js\");\n/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ \"./node_modules/@babel/runtime/helpers/defineProperty.js\");\n/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ \"./node_modules/@babel/runtime/helpers/classCallCheck.js\");\n/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ \"./node_modules/@babel/runtime/helpers/createClass.js\");\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ \"./node_modules/@babel/runtime/helpers/possibleConstructorReturn.js\");\n/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ \"./node_modules/@babel/runtime/helpers/getPrototypeOf.js\");\n/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ \"./node_modules/@babel/runtime/helpers/inherits.js\");\n/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @babel/runtime/regenerator */ \"./node_modules/@babel/runtime/regenerator/index.js\");\n/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8__);\n/* harmony import */ var _Element_Dialog__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../Element/Dialog */ \"./src/Obj/Element/Dialog/index.js\");\n/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./_element */ \"./src/Obj/Base/CurvelineObject/_element.js\");\n/* harmony import */ var _index__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../index */ \"./src/Obj/Base/index.js\");\n/* harmony import */ var _Element_cy_html_tabs__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../../Element/cy_html_tabs */ \"./src/Obj/Element/cy_html_tabs.js\");\n/* harmony import */ var _Element_richText__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../../Element/richText */ \"./src/Obj/Element/richText.js\");\n/* harmony import */ var _eventBinding__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./eventBinding */ \"./src/Obj/Base/CurvelineObject/eventBinding.js\");\n/* harmony import */ var _LabelObject__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../LabelObject */ \"./src/Obj/Base/LabelObject/index.js\");\n/* harmony import */ var _Event_index__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../../../Event/index */ \"./src/Event/index.js\");\n/* harmony import */ var _MouseTip__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../../../MouseTip */ \"./src/MouseTip/index.js\");\n/* harmony import */ var _Controller_index__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../../../Controller/index */ \"./src/Controller/index.js\");\n/* harmony import */ var _Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../../../Global/MultiViewportMode */ \"./src/Global/MultiViewportMode/index.js\");\n/* harmony import */ var _Element_datalist__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../../Element/datalist */ \"./src/Obj/Element/datalist.js\");\n/* harmony import */ var _Element_fontSelect__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../../Element/fontSelect */ \"./src/Obj/Element/fontSelect.js\");\n/* harmony import */ var _Global_SplitScreen__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ../../../Global/SplitScreen */ \"./src/Global/SplitScreen/index.js\");\n/* harmony import */ var _Global_global__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ../../../Global/global */ \"./src/Global/global.js\");\n\n\n\n\n\n\n\n\n\nfunction _createForOfIteratorHelper(r, e) { var t = \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && \"number\" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t.return || t.return(); } finally { if (u) throw o; } } }; }\nfunction _unsupportedIterableToArray(r, a) { if (r) { if (\"string\" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }\nfunction _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default()(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nfunction _callSuper(t, o, e) { return o = _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6___default()(o), _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_5___default()(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6___default()(t).constructor) : o.apply(t, e)); }\nfunction _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }\n/**\r\n * @description 线\r\n */\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nvar CurvelineObject = /*#__PURE__*/function (_Base) {\n /**\r\n * @constructor\r\n * @param sdk\r\n * @description 曲线\r\n * @param options {object} 线属性\r\n * @param options.name{string} 名称\r\n * @param options.width=3{number} 线宽\r\n * @param options.color=#ff0000 {string} 颜色\r\n * @param options.type=0 {number} 材质类型 0-实线 1-虚线 2-泛光...\r\n * @param options.heightMode=2{number} 高度模式(0:海拔高度;1:相对高度;2:依附模式)\r\n * @param options.noseToTail=false {boolean} 首尾相连\r\n * @param options.extend=false {boolean} 线缓冲\r\n * @param options.extendWidth=10 {number} 线缓冲宽度\r\n * @param options.extendColor=rgba(255,255,80,0.3) {number} 线缓冲颜色\r\n * @param options.show=true {boolean} 显隐\r\n * @param {Array.} options.positions 必填,经纬度和高度的列表,值交替 [{lon,lat,alt},...]\r\n * @param options.positions[].lng {number} 经度\r\n * @param options.positions[].lat {number} 纬度\r\n * @param options.positions[].alt {number} 高度\r\n * @param options.label {object} 标签对象\r\n * @param options.label.text {string} 标签文本\r\n * @param options.label.show {string} 标签显隐\r\n * @param options.label.position {string} 标签位置\r\n * @param options.label.position {object} 标签位置\r\n * @param options.label.position.lng {number} 经度\r\n * @param options.label.position.lat {number} 纬度\r\n * @param options.label.position.alt {number} 高度\r\n * @param options.label.fontSize=20 {number} 字体大小\r\n * @param options.label.fontFamily=0 {number} 字体项 0:黑体;1:思源黑体;2:庞门正道标题体;3:数黑体\r\n * @param options.label.color=#ffffff {string} 字体颜色\r\n * @param options.label.lineWidth=4 {number} 引线宽\r\n * @param options.label.lineColor=#00ffff80 {string} 引线颜色\r\n * @param options.label.pixelOffset=20 {number} 字体偏移(引线长度)\r\n * @param options.label.backgroundColor=['#00ffff80', '#00ffff80'] {array} 背景颜色\r\n * @param options.label.scaleByDistance {boolean} 距离缩放\r\n * @param options.label.near=2000 {number} 视野缩放最近距离\r\n * @param options.label.far=100000 {number} 视野缩放最远距离\r\n * @param options.attribute {object} 属性内容\r\n * @param options.attribute.link={} {string} 链接\r\n * @param options.attribute.link.content=[]] {array} 链接内容\r\n * @param options.attribute.link.content[].name {string} 链接名称\r\n * @param options.attribute.link.content[].url {string} 链接地址\r\n * @param options.richTextContent {string} 富文本内容\r\n * @param options.customView {object} 默认视角\r\n * @param options.customView.orientation {object} 默认视角方位\r\n * @param options.customView.orientation.heading {number} 航向角\r\n * @param options.customView.orientation.pitch {number} 俯仰角\r\n * @param options.customView.orientation.roll {number} 翻滚角\r\n * @param options.customView.relativePosition {object} 视角相对位置\r\n * @param options.customView.relativePosition.lng {number} 经度\r\n * @param options.customView.relativePosition.lat {number} 纬度\r\n * @param options.customView.relativePosition.alt {number} 高度\r\n * \r\n * \r\n * @param _Dialog {object} 弹框事件\r\n * @param _Dialog.confirmCallBack {function} 弹框确认时的回调\r\n * */\n function CurvelineObject(sdk) {\n var _this2;\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var _Dialog = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3___default()(this, CurvelineObject);\n _this2 = _callSuper(this, CurvelineObject, [sdk, options]);\n _this2.options.name = options.name || '未命名对象';\n _this2.options.width = options.width || options.width === 0 ? options.width : 3;\n _this2.options.color = options.color || '#ff0000';\n _this2.options.type = options.type ? Number(options.type) : 0;\n _this2.options.noseToTail = options.noseToTail || false;\n _this2.options.extend = options.extend || false;\n _this2.options.rotate = options.rotate || options.rotate === false ? options.rotate : true;\n _this2.options.space = options.space || 1;\n _this2.options.speed = options.speed || 10;\n // this.options.dashSize = options.dashSize || 0.03\n _this2.options.wordsName = options.wordsName || 0;\n _this2.options.extendWidth = options.extendWidth || options.extendWidth === 0 ? options.extendWidth : 10;\n _this2.options.extendColor = options.extendColor || 'rgba(255,255,80,0.3)';\n _this2.options.show = options.show || options.show === false ? options.show : true;\n _this2.options.heightMode = options.heightMode || options.heightMode == 0 ? options.heightMode : 2;\n _this2._elms = [];\n options.label = options.label || {};\n _this2.options.label = {\n text: _this2.options.name,\n show: options.label.show || false,\n position: options.label.position,\n fontSize: options.label.fontSize || options.label.fontSize === 0 ? options.label.fontSize : 20,\n fontFamily: options.label.fontFamily ? options.label.fontFamily : 0,\n color: options.label.color || '#ffffff',\n lineWidth: options.label.lineWidth || options.label.lineWidth === 0 ? options.label.lineWidth : 4,\n pixelOffset: options.label.pixelOffset || options.label.pixelOffset === 0 ? options.label.pixelOffset : 20,\n backgroundColor: options.label.backgroundColor || ['#00ffff80', '#00ffff80'],\n lineColor: options.label.lineColor || '#00ffff80',\n scaleByDistance: options.label.scaleByDistance || false,\n near: options.label.near || options.label.near === 0 ? options.label.near : 2000,\n far: options.label.far || options.label.far === 0 ? options.label.far : 100000\n };\n _this2.options.attribute = options.attribute || {};\n _this2.options.attribute.link = _this2.options.attribute.link || {};\n _this2.options.attribute.link.content = _this2.options.attribute.link.content || [];\n // this.options.attribute.camera = this.options.attribute.camera || {}\n // this.options.attribute.camera.content =\n // this.options.attribute.camera.content || []\n // this.options.attribute.vr = this.options.attribute.vr || {}\n // this.options.attribute.vr.content =\n // this.options.attribute.vr.content || []\n // this.options.attribute.goods = this.options.attribute.goods || {}\n // this.options.attribute.goods.content =\n // this.options.attribute.goods.content || []\n\n delete _this2.options.attribute.camera;\n delete _this2.options.attribute.vr;\n delete _this2.options.attribute.goods;\n _this2.operate = {};\n _this2.nodePoints = [];\n _this2.unitNum = 0;\n _this2.inputSpeed = options.speed && Math.pow(options.speed, -1) * 100 || 10;\n _this2.Dialog = _Dialog;\n if (!_this2.options.positions || _this2.options.positions.length < 2) {\n _this2._error = '线段最少需要两个坐标!';\n console.warn(_this2._error);\n window.ELEMENT && window.ELEMENT.Message({\n message: _this2._error,\n type: 'warning',\n duration: 1500\n });\n } else {\n for (var i = 0; i < _this2.options.positions.length; i++) {\n _this2.options.positions[i].lng = Number(Number(_this2.options.positions[i].lng).toFixed(8));\n _this2.options.positions[i].lat = Number(Number(_this2.options.positions[i].lat).toFixed(8));\n _this2.options.positions[i].alt = Number(Number(_this2.options.positions[i].alt).toFixed(2));\n }\n _this2.sdk.addIncetance(_this2.options.id, _this2);\n CurvelineObject.create(_this2);\n }\n return _this2;\n }\n _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_7___default()(CurvelineObject, _Base);\n return _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4___default()(CurvelineObject, [{\n key: \"color\",\n get: function get() {\n return this.options.color;\n },\n set: function set(v) {\n var _this3 = this;\n this.options.color = v || '#ff0000';\n // this.entity.polyline.material = this.getMaterial(v, this.options.type)\n var params = _objectSpread({}, this.options);\n params.speed = this.inputSpeed;\n // this.entity.polyline.material = this.getMaterial(this.options.color, this.options.type, this.entity, this.options)\n this.entity.polyline.material = this.getMaterial(this.options.color, this.options.type, this.entity, params);\n if (this._elms.color) {\n this._elms.color.forEach(function (item, i) {\n var colorPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: _this3.options.color,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(c) {\n _this3.color = c;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this3.color = 'rgba(255,0,0,1)';\n } //点击清空按钮事件回调\n });\n _this3._elms.color[i] = colorPicker;\n });\n }\n }\n }, {\n key: \"speed\",\n get: function get() {\n return this.options.speed;\n },\n set: function set(v) {\n this.options.speed = v;\n // this.options.speed = v !== 0 ? Math.pow(v, -1) * 100 : 0\n this.inputSpeed = v !== 0 ? Math.pow(v, -1) * 100 : 0;\n var params = _objectSpread({}, this.options);\n params.speed = this.inputSpeed;\n // this.entity.polyline.material = this.getMaterial(this.options.color, this.options.type, this.entity, this.options)\n this.entity.polyline.material = this.getMaterial(this.options.color, this.options.type, this.entity, params);\n }\n // get dashSize() {\n // return this.options.dashSize\n // }\n\n // set dashSize(v) {\n // this.options.dashSize = v\n // let params = { ...this.options }\n // params.speed = this.inputSpeed\n // // this.entity.polyline.material = this.getMaterial(this.options.color, this.options.type, this.entity, this.options)\n // this.entity.polyline.material = this.getMaterial(this.options.color, this.options.type, this.entity, params)\n // }\n }, {\n key: \"rotate\",\n get: function get() {\n return this.options.rotate;\n },\n set: function set(v) {\n this.options.rotate = v;\n this.closeNodeEdit();\n this._elms.rotate && this._elms.rotate.forEach(function (item) {\n item.checked = v;\n });\n this.options.rotate = v;\n this.entity.polyline.material = this.getMaterial(this.options.color, this.options.type, this.entity, this.options);\n }\n }, {\n key: \"space\",\n get: function get() {\n return this.options.space;\n },\n set: function set(v) {\n this.options.space = v;\n var params = _objectSpread({}, this.options);\n params.speed = this.inputSpeed;\n // this.entity.polyline.material = this.getMaterial(this.options.color, this.options.type, this.entity, this.options)\n this.entity.polyline.material = this.getMaterial(this.options.color, this.options.type, this.entity, params);\n }\n }, {\n key: \"wordsName\",\n get: function get() {\n return this.options.wordsName;\n },\n set: function set(v) {\n var _this4 = this;\n this.options.wordsName = v;\n var _this = this;\n if (!this.noseToTail) {\n this.computeDistance(this.smoothHandle(this.options.positions), 2, v).then(function (res) {\n _this.lengthByMeter = res;\n _this4.lengthChangeCallBack && _this4.lengthChangeCallBack();\n });\n } else {\n var fromDegreesArray = this.renewPositions(this.options.positions);\n }\n }\n\n // get fitLengthUnit() {\n // return this.options['fit-length-unit']\n // }\n // set fitLengthUnit(v) {\n // this.options['fit-length-unit'] = v\n // this._elms.fitLengthUnit &&\n // this._elms.fitLengthUnit.forEach(item => {\n // item.value = v\n // })\n // if (this.options.fitLengthByMeter) {\n // switch (v) {\n // case '米':\n // this.fitLength = this.options.fitLengthByMeter\n // break\n // case '千米':\n // this.fitLength = Number(\n // (this.options.fitLengthByMeter / 1000).toFixed(5)\n // )\n // break\n // default:\n // this.fitLength = this.options.fitLengthByMeter\n // }\n // }\n // }\n }, {\n key: \"lineWidth\",\n get: function get() {\n return this.options.width;\n },\n set: function set(v) {\n var _this5 = this;\n this.options.width = v || v == 0 ? v : 3;\n this._elms.lineWidth && this._elms.lineWidth.forEach(function (item) {\n item.value = _this5.options.width;\n });\n if (this.entity && this.entity.polyline) {\n this.entity.polyline.width = this.entity.polyline.width + v - this.entity.polyline.oriWidth;\n this.entity.polyline.oriWidth = this.options.width;\n }\n // this.entity &&\n // this.entity.polyline &&\n // (this.entity.polyline.width = this.options.width) && (this.entity.polyline.oriWidth = this.options.width)\n }\n }, {\n key: \"lineType\",\n get: function get() {\n return this.options.type;\n },\n set: function set(v) {\n var _this6 = this;\n var lineTypeData = [{\n name: '实线',\n value: '实线',\n key: 0,\n icon: 'line'\n }, {\n name: '虚线',\n value: '虚线',\n key: 1,\n icon: 'dash-line'\n }, {\n name: '泛光',\n value: '泛光',\n key: 2,\n icon: 'light-line'\n }, {\n name: '尾迹光线',\n value: '尾迹光线',\n key: 3,\n icon: 'tail-line'\n }, {\n name: '多尾迹光线',\n value: '多尾迹光线',\n key: 4,\n icon: 'mult-tail-line'\n }, {\n name: '流动虚线1',\n value: '流动虚线1',\n key: 5,\n icon: 'flow-dash-line1'\n }, {\n name: '流动虚线2',\n value: '流动虚线2',\n key: 6,\n icon: 'flow-dash-line2'\n }, {\n name: '流动箭头1',\n value: '流动箭头1',\n key: 7,\n icon: 'pic-line1'\n }, {\n name: '流动箭头2',\n value: '流动箭头2',\n key: 8,\n icon: 'pic-line2'\n }, {\n name: '流动箭头3',\n value: '流动箭头3',\n key: 9,\n icon: 'pic-line3'\n }, {\n name: '流动箭头4',\n value: '流动箭头4',\n key: 10,\n icon: 'pic-line4'\n }, {\n name: '流动箭头5',\n value: '流动箭头5',\n key: 11,\n icon: 'pic-line5'\n }, {\n name: '流动箭头6',\n value: '流动箭头6',\n key: 12,\n icon: 'pic-line6'\n }];\n this.options.type = Number(v);\n var _loop = function _loop(i) {\n if (lineTypeData[i].key === Number(v)) {\n _this6._elms.lineType && _this6._elms.lineType.forEach(function (item) {\n item.value = lineTypeData[i].value;\n if (2 < item.value && item.value < 13) {\n //贴图参数\n document.getElementById('dashTextureDom') && (document.getElementById('dashTextureDom').style.display = 'flex');\n } else {\n document.getElementById('dashTextureDom') && (document.getElementById('dashTextureDom').style.display = 'none');\n }\n if (2 < item.value && item.value < 5) {\n //尾迹参数\n document.getElementsByClassName('lineSpace')[0] && (document.getElementsByClassName('lineSpace')[0].style.display = 'none');\n document.getElementsByClassName('lineSpace')[1] && (document.getElementsByClassName('lineSpace')[1].style.display = 'none');\n } else {\n document.getElementsByClassName('lineSpace')[0] && (document.getElementsByClassName('lineSpace')[0].style.display = 'flex');\n document.getElementsByClassName('lineSpace')[1] && (document.getElementsByClassName('lineSpace')[1].style.display = 'flex');\n }\n });\n return 1; // break\n }\n };\n for (var i = 0; i < lineTypeData.length; i++) {\n if (_loop(i)) break;\n }\n var params = _objectSpread({}, this.options);\n params.speed = this.inputSpeed;\n this.entity && this.entity.polyline && (this.entity.polyline.material = this.getMaterial(this.options.color, this.options.type, this.entity, params));\n }\n }, {\n key: \"noseToTail\",\n get: function get() {\n return this.options.noseToTail;\n },\n set: function set(v) {\n this.options.noseToTail = v;\n this.closeNodeEdit();\n this._elms.noseToTail && this._elms.noseToTail.forEach(function (item) {\n item.checked = v;\n });\n if (this.entity) {\n var fromDegreesArray = this.renewPositions(this.options.positions);\n this.entity.polyline.positions = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray);\n this.renewPolygon(fromDegreesArray);\n }\n // if (v) {\n // if (this.options.fitLengthByMeter > 1000 || this.options.fitLengthByMeter == 1000) {\n // let dom = document.getElementsByClassName('input-select-unit')[1]\n // dom && dom.querySelectorAll('dd')[1] && dom.querySelectorAll('dd')[1].click()\n // } else {\n // let dom = document.getElementsByClassName('input-select-unit')[1]\n // dom && dom.querySelectorAll('dd')[0] && dom.querySelectorAll('dd')[0].click()\n // }\n\n // } else {\n // if (this.options.lengthByMeter > 1000 || this.options.lengthByMeter == 1000) {\n // let dom = document.getElementsByClassName('input-select-unit')[1]\n // dom && dom.querySelectorAll('dd')[1] && dom.querySelectorAll('dd')[1].click()\n // } else {\n // let dom = document.getElementsByClassName('input-select-unit')[1]\n // dom && dom.querySelectorAll('dd')[0] && dom.querySelectorAll('dd')[0].click()\n // }\n // }\n }\n }, {\n key: \"heightMode\",\n get: function get() {\n return this.options.heightMode ? this.options.heightMode : 0;\n },\n set: function set(v) {\n var _this7 = this;\n this.positionEditing = false;\n this.options.heightMode = v || v == 0 ? v : 2;\n var heightModeName = '';\n this.closeNodeEdit();\n var ground = false;\n var disabled = false;\n var fromDegreesArray = this.renewPositions(this.options.positions);\n this.entity.polyline.positions = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray);\n this.renewPolygon(fromDegreesArray);\n switch (this.options.heightMode) {\n case '0':\n case 0:\n this.entity.polyline.clampToGround = ground;\n this.extend = false;\n heightModeName = '海拔高度';\n break;\n case '1':\n case 1:\n this.entity.polyline.clampToGround = ground;\n this.extend = false;\n heightModeName = '相对地表';\n break;\n case '2':\n case 2:\n ground = true;\n disabled = true;\n this.entity.polyline.clampToGround = ground;\n heightModeName = '依附模型';\n break;\n }\n\n // this.options.lengthByMeter = this.computeDistance2(\n // this.smoothHandle(this.options.positions),\n // 2,\n // ground\n // )\n this.lengthUnit = this.lengthUnit;\n this._elms.heightMode && (this._elms.heightMode.value = heightModeName);\n this._elms.heightModeObject && this._elms.heightModeObject.legp_searchActive(heightModeName);\n if (disabled) {\n this._elms.heightBox && (this._elms.heightBox.className = 'input-number input-number-unit-1 height-box disabled');\n this._elms.heightConfirm && this._elms.heightConfirm.setAttribute('disabled', 'disabled');\n } else {\n this._elms.heightBox && (this._elms.heightBox.className = 'input-number input-number-unit-1 height-box');\n this._elms.heightConfirm && this._elms.heightConfirm.removeAttribute('disabled');\n }\n setTimeout(function () {\n if (ground) {\n _this7.label.ground = ground;\n _this7._elms.heightMode && (_this7._elms.heightMode.value = '依附模型');\n _this7.label.position = [_this7.options.positions[0].lng, _this7.options.positions[0].lat];\n } else {\n _this7.label.ground = ground;\n _this7.label.position = [_this7.options.positions[0].lng, _this7.options.positions[0].lat, fromDegreesArray[2]];\n _this7.options.label.position = {\n lng: _this7.options.positions[0].lng,\n lat: _this7.options.positions[0].lat,\n alt: fromDegreesArray[2]\n };\n }\n }, 0);\n }\n }, {\n key: \"extend\",\n get: function get() {\n return this.options.extend;\n },\n set: function set(v) {\n this.options.extend = v;\n this.closeNodeEdit();\n if (v) {\n this.heightMode = 2;\n }\n this._elms.extend && this._elms.extend.forEach(function (item) {\n item.checked = v;\n });\n if (this.entity) {\n if (this.options.extend) {\n var fromDegreesArray = this.renewPositions(this.options.positions);\n this.renewPolygon(fromDegreesArray);\n } else {\n this.entity.polygon = undefined;\n }\n }\n }\n }, {\n key: \"extendWidth\",\n get: function get() {\n return this.options.extendWidth;\n },\n set: function set(v) {\n this.options.extendWidth = v;\n this._elms.extendWidth && this._elms.extendWidth.forEach(function (item) {\n item.value = v;\n });\n var fromDegreesArray = this.renewPositions(this.options.positions);\n this.renewPolygon(fromDegreesArray);\n }\n }, {\n key: \"extendColor\",\n get: function get() {\n return this.options.extendColor;\n },\n set: function set(v) {\n var _this8 = this;\n this.options.extendColor = v;\n if (this._elms.extendColor) {\n this._elms.extendColor.forEach(function (item, i) {\n var extendColorPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: _this8.extendColor,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this8.extendColor = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this8.extendColor = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n _this8._elms.extendColor[i] = extendColorPicker;\n });\n }\n this.entity && this.entity.polygon && (this.entity.polygon.material = Cesium.Color.fromCssColorString(this.options.extendColor));\n }\n }, {\n key: \"labelShow\",\n get: function get() {\n return this.options.label.show;\n },\n set: function set(v) {\n var _this9 = this;\n this.options.label.show = v;\n if (this.show && !this.showView || this.showView == 3) {\n this.label.show = v;\n setTimeout(function () {\n _this9.label.position = [_this9.options.positions[0].lng, _this9.options.positions[0].lat, _this9.options.positions[0].alt];\n }, 0);\n } else {\n this.label.show = false;\n }\n this._elms.labelShow && this._elms.labelShow.forEach(function (item) {\n item.checked = v;\n });\n }\n }, {\n key: \"labelFontFamily\",\n get: function get() {\n return this.options.label.fontFamily;\n },\n set: function set(v) {\n this.options.label.fontFamily = v || 0;\n this.label && (this.label.fontFamily = this.options.label.fontFamily);\n var name = Object(_Element_fontSelect__WEBPACK_IMPORTED_MODULE_21__[\"getFontFamilyName\"])(this.labelFontFamily) || '';\n this._elms.labelFontFamily && this._elms.labelFontFamily.forEach(function (item) {\n item.value = name;\n });\n }\n }, {\n key: \"labelColor\",\n get: function get() {\n return this.options.label.color;\n },\n set: function set(v) {\n var _this10 = this;\n this.options.label.color = v;\n this.label.color = v;\n if (this._elms.labelColor) {\n this._elms.labelColor.forEach(function (item, i) {\n var labelColorPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: _this10.labelColor,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this10.labelColor = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this10.labelColor = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n _this10._elms.labelColor[i] = labelColorPicker;\n });\n }\n }\n }, {\n key: \"labelFontSize\",\n get: function get() {\n return this.options.label.fontSize;\n },\n set: function set(v) {\n this.options.label.fontSize = v;\n this.label.fontSize = v;\n this._elms.labelFontSize && this._elms.labelFontSize.forEach(function (item) {\n item.value = v;\n });\n }\n }, {\n key: \"labelScaleByDistance\",\n get: function get() {\n return this.options.label.scaleByDistance;\n },\n set: function set(v) {\n this.options.label.scaleByDistance = v;\n this.label.scaleByDistance = v;\n this._elms.labelScaleByDistance && this._elms.labelScaleByDistance.forEach(function (item) {\n item.checked = v;\n });\n }\n }, {\n key: \"labelNear\",\n get: function get() {\n return this.options.label.near;\n },\n set: function set(v) {\n var near = v;\n if (near > this.labelFar) {\n near = this.labelFar;\n }\n this.options.label.near = near;\n this.label.near = near;\n this._elms.labelNear && this._elms.labelNear.forEach(function (item) {\n item.value = near;\n });\n }\n }, {\n key: \"labelFar\",\n get: function get() {\n return this.options.label.far;\n },\n set: function set(v) {\n var far = v;\n if (far < this.labelNear) {\n far = this.labelNear;\n }\n this.options.label.far = far;\n this.label.far = far;\n this._elms.labelFar && this._elms.labelFar.forEach(function (item) {\n item.value = far;\n });\n }\n }, {\n key: \"labelLineWidth\",\n get: function get() {\n return this.options.label.lineWidth;\n },\n set: function set(v) {\n this.options.label.lineWidth = v;\n this.label.lineWidth = v;\n this._elms.labelLineWidth && this._elms.labelLineWidth.forEach(function (item) {\n item.value = v;\n });\n }\n }, {\n key: \"labelPixelOffset\",\n get: function get() {\n return this.options.label.pixelOffset;\n },\n set: function set(v) {\n this.options.label.pixelOffset = v;\n this.label.pixelOffset = v;\n this._elms.labelPixelOffset && this._elms.labelPixelOffset.forEach(function (item) {\n item.value = v;\n });\n }\n }, {\n key: \"labelLineColor\",\n get: function get() {\n return this.options.label.lineColor;\n },\n set: function set(v) {\n var _this11 = this;\n this.options.label.lineColor = v;\n this.label.lineColor = v;\n if (this._elms.labelLineColor) {\n this._elms.labelLineColor.forEach(function (item, i) {\n var lineColorPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: _this11.labelLineColor,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this11.labelLineColor = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this11.labelLineColor = 'rgba(0,255,255,0.5)';\n } //点击清空按钮事件回调\n });\n _this11._elms.labelLineColor[i] = lineColorPicker;\n });\n }\n }\n }, {\n key: \"labelBackgroundColorStart\",\n get: function get() {\n return this.options.label.backgroundColor[0];\n },\n set: function set(v) {\n var _this12 = this;\n this.options.label.backgroundColor[0] = v;\n this.label.backgroundColor = [v, this.label.backgroundColor[1]];\n if (this._elms.labelBackgroundColorStart) {\n this._elms.labelBackgroundColorStart.forEach(function (item, i) {\n var labelBackgroundColorStartPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: _this12.labelBackgroundColorStart,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this12.labelBackgroundColorStart = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this12.labelBackgroundColorStart = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n _this12._elms.labelBackgroundColorStart[i] = labelBackgroundColorStartPicker;\n });\n }\n }\n }, {\n key: \"labelBackgroundColorEnd\",\n get: function get() {\n return this.options.label.backgroundColor[1];\n },\n set: function set(v) {\n var _this13 = this;\n this.options.label.backgroundColor[1] = v;\n this.label.backgroundColor = [this.label.backgroundColor[0], v];\n if (this._elms.labelBackgroundColorEnd) {\n this._elms.labelBackgroundColorEnd.forEach(function (item, i) {\n var labelBackgroundColorEndPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: _this13.labelBackgroundColorEnd,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this13.labelBackgroundColorEnd = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this13.labelBackgroundColorEnd = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n _this13._elms.labelBackgroundColorEnd[i] = labelBackgroundColorEndPicker;\n });\n }\n }\n }, {\n key: \"attributeType\",\n get: function get() {\n return this.options.attributeType;\n },\n set: function set(v) {\n this.options.attributeType = v;\n this._elms.attributeType && this._elms.attributeType.forEach(function (item) {\n item.value = v;\n });\n var attributeContent = this._DialogObject._element.content.getElementsByClassName('attribute-content');\n for (var i = 0; i < attributeContent.length; i++) {\n if (attributeContent[i].className.indexOf('attribute-content-' + v) > -1) {\n attributeContent[i].style.display = 'block';\n } else {\n attributeContent[i].style.display = 'none';\n }\n }\n }\n }, {\n key: \"attributeLink\",\n get: function get() {\n return this.options.attribute.link.content;\n },\n set: function set(v) {\n var _this14 = this;\n this.options.attribute.link.content = v;\n if (!this._DialogObject || !this._DialogObject._element || !this._DialogObject._element.content || this._DialogObject._element.content.getElementsByClassName('attribute-content-link').length == 0) {\n return;\n }\n var table = this._DialogObject._element.content.getElementsByClassName('attribute-content-link')[1].getElementsByClassName('table')[0];\n var tableContent = table.getElementsByClassName('table-body')[0];\n tableContent.innerHTML = '';\n if (this.options.attribute.link.content.length > 0) {\n table.getElementsByClassName('table-empty')[0].style.display = 'none';\n } else {\n table.getElementsByClassName('table-empty')[0].style.display = 'flex';\n }\n for (var i = 0; i < this.options.attribute.link.content.length; i++) {\n var tr = \"\\n
\\n
\" + this.options.attribute.link.content[i].name + \"
\\n
\" + this.options.attribute.link.content[i].url + \"
\\n
\\n \\n \\n
\\n
\";\n var trElm = document.createRange().createContextualFragment(tr);\n tableContent.appendChild(trElm);\n }\n var item = tableContent.getElementsByClassName('tr');\n var fun = {\n linkEdit: function () {\n var _linkEdit = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee(index) {\n var table, tableContent, item, _loop2, _i;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee$(_context3) {\n while (1) switch (_context3.prev = _context3.next) {\n case 0:\n _context3.next = 2;\n return _this14.options.attribute.link.content;\n case 2:\n _this14.attributeLink = _context3.sent;\n table = _this14._DialogObject._element.content.getElementsByClassName('attribute-content-link')[1].getElementsByClassName('table')[0];\n tableContent = table.getElementsByClassName('table-body')[0];\n item = tableContent.getElementsByClassName('tr');\n _loop2 = /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _loop2(_i) {\n var height, _html, textareaElm, td, btn, n, _iterator, _step, _loop3;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _loop2$(_context2) {\n while (1) switch (_context2.prev = _context2.next) {\n case 0:\n if (!(index === _i)) {\n _context2.next = 36;\n break;\n }\n height = item[_i].offsetHeight;\n _html = \"\\n
\\n \\n
\\n
\\n \\n
\\n
\\n \\n \\n
\";\n item[_i].innerHTML = _html;\n textareaElm = item[_i].getElementsByClassName('link-edit')[0];\n textareaElm.style.height = height - 10 + 'px';\n td = item[_i].getElementsByClassName('td');\n td[0].getElementsByClassName('input')[0].value = _this14.options.attribute.link.content[index].name;\n td[1].getElementsByClassName('input')[0].value = _this14.options.attribute.link.content[index].url;\n btn = item[_i].getElementsByTagName('button');\n n = 0;\n case 11:\n if (!(n < btn.length)) {\n _context2.next = 35;\n break;\n }\n if (!(!btn[n] || !btn[n].attributes)) {\n _context2.next = 14;\n break;\n }\n return _context2.abrupt(\"continue\", 32);\n case 14:\n _iterator = _createForOfIteratorHelper(btn[n].attributes);\n _context2.prev = 15;\n _loop3 = /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _loop3() {\n var m;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _loop3$(_context) {\n while (1) switch (_context.prev = _context.next) {\n case 0:\n m = _step.value;\n if (!(m.name === '@click')) {\n _context.next = 5;\n break;\n }\n btn[n].addEventListener('click', function (e) {\n if (typeof fun[m.value] === 'function') {\n fun[m.value]({\n name: td[0].getElementsByClassName('input')[0].value,\n url: td[1].getElementsByClassName('input')[0].value\n }, _i);\n }\n });\n btn[n].attributes.removeNamedItem(m.name);\n return _context.abrupt(\"return\", 1);\n case 5:\n case \"end\":\n return _context.stop();\n }\n }, _loop3);\n });\n _iterator.s();\n case 18:\n if ((_step = _iterator.n()).done) {\n _context2.next = 24;\n break;\n }\n return _context2.delegateYield(_loop3(), \"t0\", 20);\n case 20:\n if (!_context2.t0) {\n _context2.next = 22;\n break;\n }\n return _context2.abrupt(\"break\", 24);\n case 22:\n _context2.next = 18;\n break;\n case 24:\n _context2.next = 29;\n break;\n case 26:\n _context2.prev = 26;\n _context2.t1 = _context2[\"catch\"](15);\n _iterator.e(_context2.t1);\n case 29:\n _context2.prev = 29;\n _iterator.f();\n return _context2.finish(29);\n case 32:\n n++;\n _context2.next = 11;\n break;\n case 35:\n return _context2.abrupt(\"return\", 1);\n case 36:\n case \"end\":\n return _context2.stop();\n }\n }, _loop2, null, [[15, 26, 29, 32]]);\n });\n _i = 0;\n case 8:\n if (!(_i < item.length)) {\n _context3.next = 15;\n break;\n }\n return _context3.delegateYield(_loop2(_i), \"t0\", 10);\n case 10:\n if (!_context3.t0) {\n _context3.next = 12;\n break;\n }\n return _context3.abrupt(\"break\", 15);\n case 12:\n _i++;\n _context3.next = 8;\n break;\n case 15:\n case \"end\":\n return _context3.stop();\n }\n }, _callee);\n }));\n function linkEdit(_x) {\n return _linkEdit.apply(this, arguments);\n }\n return linkEdit;\n }(),\n linkDelete: function linkDelete(i) {\n _this14.options.attribute.link.content.splice(i, 1);\n _this14.attributeLink = _this14.options.attribute.link.content;\n },\n confirmEdit: function confirmEdit(value, i) {\n var name = value.name && value.name.replace(/\\s/g, '');\n var url = value.url && value.url.replace(/\\s/g, '');\n if (name && url) {\n _this14.options.attribute.link.content[i] = value;\n } else {\n window.ELEMENT && window.ELEMENT.Message({\n message: '名称或链接不能为空!',\n type: 'warning',\n duration: 1500\n });\n }\n _this14.attributeLink = _this14.options.attribute.link.content;\n },\n cancelEdit: function cancelEdit() {\n _this14.attributeLink = _this14.options.attribute.link.content;\n },\n fileSelect: function fileSelect(value, i) {\n var fileElm = item[i].getElementsByClassName('file-select')[0];\n fileElm.click();\n fileElm.removeEventListener('change', _fileSelect);\n fileElm.addEventListener('change', _fileSelect);\n }\n };\n var _fileSelect = function _fileSelect(event) {\n if (event.target.value) {\n var td = item[event.target.getAttribute('index')].getElementsByClassName('td');\n td[1].getElementsByClassName('input')[0].value = event.target.value;\n event.target.value = null;\n }\n };\n var _loop4 = function _loop4(_i2) {\n var btn = item[_i2].getElementsByTagName('button');\n for (var n = 0; n < btn.length; n++) {\n if (!btn[n] || !btn[n].attributes) {\n continue;\n }\n var _iterator2 = _createForOfIteratorHelper(btn[n].attributes),\n _step2;\n try {\n var _loop5 = function _loop5() {\n var m = _step2.value;\n if (m.name === '@click') {\n btn[n].addEventListener('click', function (e) {\n if (typeof fun[m.value] === 'function') {\n fun[m.value](_i2);\n }\n });\n btn[n].attributes.removeNamedItem(m.name);\n return 1; // break\n }\n };\n for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {\n if (_loop5()) break;\n }\n } catch (err) {\n _iterator2.e(err);\n } finally {\n _iterator2.f();\n }\n }\n };\n for (var _i2 = 0; _i2 < item.length; _i2++) {\n _loop4(_i2);\n }\n }\n\n // get attributeCamera() {\n // return this.options.attribute.camera.content\n // }\n\n // set attributeCamera(v) {\n // this.options.attribute.camera.content = v\n // }\n\n // get attributeVr() {\n // return this.options.attribute.vr.content\n // }\n\n // set attributeVr(v) {\n // this.options.attribute.vr.content = v\n // if (\n // !this._DialogObject ||\n // !this._DialogObject._element ||\n // !this._DialogObject._element.content ||\n // this._DialogObject._element.content.getElementsByClassName(\n // 'attribute-content-vr'\n // ).length == 0\n // ) {\n // return\n // }\n // let table = this._DialogObject._element.content\n // .getElementsByClassName('attribute-content-vr')[1]\n // .getElementsByClassName('table')[0]\n // let tableContent = table.getElementsByClassName('table-body')[0]\n // tableContent.innerHTML = ''\n // if (this.options.attribute.vr.content.length > 0) {\n // table.getElementsByClassName('table-empty')[0].style.display = 'none'\n // } else {\n // table.getElementsByClassName('table-empty')[0].style.display = 'flex'\n // }\n // for (let i = 0; i < this.options.attribute.vr.content.length; i++) {\n // let tr =\n // `\n //
\n //
` +\n // this.options.attribute.vr.content[i].name +\n // `
\n //
` +\n // this.options.attribute.vr.content[i].url +\n // `
\n //
\n // \n // \n //
\n //
`\n // let trElm = document.createRange().createContextualFragment(tr)\n // tableContent.appendChild(trElm)\n // }\n // let item = tableContent.getElementsByClassName('tr')\n // let fun = {\n // vrEdit: async index => {\n // this.attributeVr = await this.options.attribute.vr.content\n // let table = this._DialogObject._element.content\n // .getElementsByClassName('attribute-content-vr')[1]\n // .getElementsByClassName('table')[0]\n // let tableContent = table.getElementsByClassName('table-body')[0]\n // let item = tableContent.getElementsByClassName('tr')\n // for (let i = 0; i < item.length; i++) {\n // if (index === i) {\n // let height = item[i].offsetHeight\n // let html = `\n //
\n // \n //
\n //
\n // \n //
\n //
\n // \n // \n //
`\n // item[i].innerHTML = html\n // let textareaElm = item[i].getElementsByClassName('link-edit')[0]\n // textareaElm.style.height = height - 10 + 'px'\n // let td = item[i].getElementsByClassName('td')\n // td[0].getElementsByClassName(\n // 'input'\n // )[0].value = this.options.attribute.vr.content[index].name\n // td[1].getElementsByClassName(\n // 'input'\n // )[0].value = this.options.attribute.vr.content[index].url\n // let btn = item[i].getElementsByTagName('button')\n // for (let n = 0; n < btn.length; n++) {\n // if (!btn[n] || !btn[n].attributes) {\n // continue\n // }\n // for (let m of btn[n].attributes) {\n // if (m.name === '@click') {\n // btn[n].addEventListener('click', e => {\n // if (typeof fun[m.value] === 'function') {\n // fun[m.value](\n // {\n // name: td[0].getElementsByClassName('input')[0].value,\n // url: td[1].getElementsByClassName('input')[0].value\n // },\n // i\n // )\n // }\n // })\n // btn[n].attributes.removeNamedItem(m.name)\n // break\n // }\n // }\n // }\n // break\n // }\n // }\n // },\n // vrDelete: i => {\n // this.options.attribute.vr.content.splice(i, 1)\n // this.attributeVr = this.options.attribute.vr.content\n // },\n\n // confirmEdit: (value, i) => {\n // let name = value.name && value.name.replace(/\\s/g, '')\n // let url = value.url && value.url.replace(/\\s/g, '')\n // if (name && url) {\n // this.options.attribute.vr.content[i] = value\n // } else {\n // window.ELEMENT &&\n // window.ELEMENT.Message({\n // message: '名称或链接不能为空!',\n // type: 'warning',\n // duration: 1500\n // })\n // }\n // this.attributeVr = this.options.attribute.vr.content\n // },\n // cancelEdit: () => {\n // this.attributeVr = this.options.attribute.vr.content\n // },\n // fileSelect: (value, i) => {\n // let fileElm = item[i].getElementsByClassName('file-select')[0]\n // fileElm.click()\n // fileElm.removeEventListener('change', fileSelect)\n // fileElm.addEventListener('change', fileSelect)\n // }\n // }\n // let fileSelect = event => {\n // if (event.target.value) {\n // let td = item[\n // event.target.getAttribute('index')\n // ].getElementsByClassName('td')\n // td[1].getElementsByClassName('input')[0].value = event.target.value\n // event.target.value = null\n // }\n // }\n // for (let i = 0; i < item.length; i++) {\n // let btn = item[i].getElementsByTagName('button')\n // for (let n = 0; n < btn.length; n++) {\n // if (!btn[n] || !btn[n].attributes) {\n // continue\n // }\n // for (let m of btn[n].attributes) {\n // if (m.name === '@click') {\n // btn[n].addEventListener('click', e => {\n // if (typeof fun[m.value] === 'function') {\n // fun[m.value](i)\n // }\n // })\n // btn[n].attributes.removeNamedItem(m.name)\n // break\n // }\n // }\n // }\n // }\n // }\n\n // get attributeGoods() {\n // return this.options.attribute.goods.content\n // }\n\n // set attributeGoods(v) {\n // this.options.attribute.goods.content = v\n // }\n }, {\n key: \"judgeLine\",\n value: function judgeLine(entity, newParam) {\n if (!entity.polyline.oriRepeat) {\n var param = {\n color: newParam.color,\n image: this.getSourceRootPath() + \"/img/arrow/1.png\",\n space: newParam.space,\n speed: newParam.speed\n };\n param.speed = newParam.rotate ? param.speed : 0 - param.speed;\n var canvasEle = document.createElement('canvas');\n var ctx = canvasEle.getContext('2d');\n var myImg = new Image();\n // myImg.src = that.getSourceRootPath() + '/img/arrow/1.png'\n myImg.src = param.image;\n var that = this;\n myImg.onload = function () {\n canvasEle.width = myImg.width * (param.space + 1);\n canvasEle.height = myImg.height;\n var oriRepeat = that.getSceenLine(entity, param, canvasEle);\n oriRepeat && (entity.polyline.oriRepeat = oriRepeat);\n var positionProperty = entity.polyline.positions;\n var positions = positionProperty.getValue(that.sdk.viewer.clock.currentTime);\n if (!Cesium.defined(positions)) {\n return new Cesium.Cartesian2(1.0, 1.0);\n // return 1.0;\n }\n var distance = 0;\n for (var i = 0; i < positions.length - 1; ++i) {\n distance += Cesium.Cartesian3.distance(positions[i], positions[i + 1]);\n }\n var repeatX = distance / entity.polyline.width.getValue();\n // 根据地图缩放程度调整repeatX\n var cameraHeight = that.sdk.viewer.camera.positionCartographic.height;\n var boundingSphere = new Cesium.BoundingSphere(new Cesium.Cartesian3(-1000000, 0, 0),\n // 中心点坐标\n 500000 // 半径(距离)\n );\n\n // 获取绘图缓冲区的宽度和高度(通常是屏幕的分辨率)\n var drawingBufferWidth = that.sdk.viewer.canvas.clientWidth;\n var drawingBufferHeight = that.sdk.viewer.canvas.clientHeight;\n\n // 使用 getPixelSize 方法获取包围球在屏幕上的像素大小\n var groundResolution = that.sdk.viewer.scene.camera.getPixelSize(boundingSphere, drawingBufferWidth, drawingBufferHeight);\n repeatX *= groundResolution / cameraHeight / (param.space * (canvasEle.width / canvasEle.height * 5) + 1);\n // if (entity.polyline.material.oriRepeat) {\n\n if (that.sdk.viewer.scene.mode === Cesium.SceneMode.SCENE3D) {\n var speed = repeatX / entity.polyline.oriRepeat;\n entity.polyline.oriSpeed = speed;\n entity.polyline.oriRepeatX = repeatX;\n } else {\n var sdk3d = Object(_Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_19__[\"get3DView\"])();\n var sdk3dEntity = sdk3d.viewer.entities.getById(that.options.id);\n entity.polyline.oriSpeed = sdk3dEntity.polyline.oriSpeed;\n entity.polyline.oriRepeatX = sdk3dEntity.polyline.oriRepeatX;\n }\n };\n }\n }\n /**获取当前满屏横线速度 */\n }, {\n key: \"getSceenLine\",\n value: function getSceenLine(entity, options, canvasEle) {\n var point1 = new Cesium.Cartesian2(0, this.sdk.viewer.canvas.clientHeight);\n var point2 = new Cesium.Cartesian2(this.sdk.viewer.canvas.clientWidth / 2, this.sdk.viewer.canvas.clientHeight);\n // var cartesian1 = this.sdk.viewer.scene.pickPosition(point1)\n // var cartesian2 = this.sdk.viewer.scene.pickPosition(point2)\n\n var ray = this.sdk.viewer.camera.getPickRay(point1);\n var cartesian1 = this.sdk.viewer.scene.globe.pick(ray, this.sdk.viewer.scene);\n var ray2 = this.sdk.viewer.camera.getPickRay(point2);\n var cartesian2 = this.sdk.viewer.scene.globe.pick(ray2, this.sdk.viewer.scene);\n // if (!cartesian1 || !cartesian2) {\n // let ray = this.sdk.viewer.camera.getPickRay(point1);\n // cartesian1 = this.sdk.viewer.scene.globe.pick(ray, this.sdk.viewer.scene);\n\n // let ray2 = this.sdk.viewer.camera.getPickRay(point2);\n // cartesian2 = this.sdk.viewer.scene.globe.pick(ray2, this.sdk.viewer.scene);\n // }\n if (cartesian1 && cartesian2) {\n var distance = Cesium.Cartesian3.distance(cartesian1, cartesian2);\n var repeatX = distance / entity.polyline.width.getValue();\n // 根据地图缩放程度调整repeatX\n var cameraHeight = this.sdk.viewer.camera.positionCartographic.height;\n var boundingSphere = new Cesium.BoundingSphere(new Cesium.Cartesian3(-1000000, 0, 0),\n // 中心点坐标\n 500000 // 半径(距离)\n );\n\n // 获取绘图缓冲区的宽度和高度(通常是屏幕的分辨率)\n var drawingBufferWidth = this.sdk.viewer.canvas.clientWidth;\n var drawingBufferHeight = this.sdk.viewer.canvas.clientHeight;\n\n // 使用 getPixelSize 方法获取包围球在屏幕上的像素大小\n var groundResolution = this.sdk.viewer.scene.camera.getPixelSize(boundingSphere, drawingBufferWidth, drawingBufferHeight);\n // repeatX *= groundResolution / cameraHeight / ((myImg.width / myImg.height * 5) + 1);\n if (groundResolution > 700) {\n repeatX *= groundResolution / cameraHeight / (options.space * (canvasEle.width / canvasEle.height * 5) + 1);\n } else {\n repeatX = undefined;\n }\n if (this.sdk.viewer.scene.mode === Cesium.SceneMode.SCENE3D) {\n return repeatX;\n } else {\n var sdk3d = Object(_Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_19__[\"get3DView\"])();\n var sdk3dEntity = sdk3d.viewer.entities.getById(this.options.id);\n return sdk3dEntity.polyline.oriRepeatX;\n }\n }\n }\n /**\r\n * 编辑框\r\n * @param {boolean} state true打开,false关闭\r\n */\n }, {\n key: \"edit\",\n value: (function () {\n var _edit = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee2(state) {\n var _this15 = this;\n var _this, tabClick, contentElm, tabsElm, colorPicker, labelColorPicker, extendColorPicker, lineColorPicker, labelBackgroundColorStartPicker, labelBackgroundColorEndPicker, all_elm;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee2$(_context4) {\n while (1) switch (_context4.prev = _context4.next) {\n case 0:\n return _context4.abrupt(\"return\");\n case 8:\n this._DialogObject = _context4.sent;\n this._DialogObject._element.body.className = this._DialogObject._element.body.className + ' polyline';\n contentElm = document.createElement('div');\n contentElm.innerHTML = Object(_element__WEBPACK_IMPORTED_MODULE_10__[\"html\"])(this);\n this._DialogObject.contentAppChild(contentElm);\n this.attributeType = this.options.attributeType;\n // this.attributeCamera = this.options.attribute.camera.content\n // this.attributeGoods = this.options.attribute.goods.content\n // 创建标签页\n tabsElm = new _Element_cy_html_tabs__WEBPACK_IMPORTED_MODULE_12__[\"default\"]('polyline-object-edit-tabs', undefined, this.sdk); // 颜色组件\n colorPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName('color')[0],\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: this.color,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this15.color = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this15.color = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n labelColorPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName('labelColor')[0],\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: this.labelColor,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this15.labelColor = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this15.labelColor = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n extendColorPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName('extendColor')[0],\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: this.extendColor,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this15.extendColor = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this15.extendColor = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n lineColorPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName('labelLineColor')[0],\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: this.labelLineColor,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this15.labelLineColor = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this15.labelLineColor = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n labelBackgroundColorStartPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName('labelBackgroundColorStart')[0],\n size: 'mini',\n alpha: true,\n defaultColor: this.labelBackgroundColorStart,\n disabled: false,\n openPickerAni: 'opacity',\n sure: function sure(color) {\n _this15.labelBackgroundColorStart = color;\n },\n clear: function clear() {\n _this15.labelBackgroundColorStart = 'rgba(255,255,255,1)';\n }\n });\n labelBackgroundColorEndPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName('labelBackgroundColorEnd')[0],\n size: 'mini',\n alpha: true,\n defaultColor: this.labelBackgroundColorEnd,\n disabled: false,\n openPickerAni: 'opacity',\n sure: function sure(color) {\n _this15.labelBackgroundColorEnd = color;\n },\n clear: function clear() {\n _this15.labelBackgroundColorEnd = 'rgba(255,255,255,1)';\n }\n });\n all_elm = contentElm.getElementsByTagName('*');\n _eventBinding__WEBPACK_IMPORTED_MODULE_14__[\"default\"].on(this, all_elm);\n this._elms = _eventBinding__WEBPACK_IMPORTED_MODULE_14__[\"default\"].element;\n this._elms.color = [colorPicker];\n this._elms.labelColor = [labelColorPicker];\n this._elms.extendColor = [extendColorPicker];\n this._elms.labelLineColor = [lineColorPicker];\n this._elms.labelBackgroundColorStart = [labelBackgroundColorStartPicker];\n this._elms.labelBackgroundColorEnd = [labelBackgroundColorEndPicker];\n setTimeout(function () {\n _this15.attributeLink = _this15.options.attribute.link.content;\n // this.attributeVr = this.options.attribute.vr.content\n // this.cameraSelect && this.cameraSelect()\n // this.goodsSelect && this.goodsSelect()\n var tagData = _this15.attributeSelect;\n var attributeElm = _this15._DialogObject._element.content.getElementsByClassName('attribute-select-box')[0];\n if (attributeElm) {\n var legpObject = Object(_Element_datalist__WEBPACK_IMPORTED_MODULE_20__[\"legp\"])(attributeElm, '.attribute-select');\n legpObject.legp_search(tagData);\n var attributeSelectElm = _this15._DialogObject._element.content.getElementsByClassName('attribute-select')[0].getElementsByTagName('input')[0];\n for (var i = 0; i < tagData.length; i++) {\n if (tagData[i].key === _this15.options.attributeType) {\n attributeSelectElm.value = tagData[i].value;\n legpObject.legp_searchActive(tagData[i].value);\n break;\n }\n }\n attributeSelectElm.addEventListener('input', function () {\n for (var _i3 = 0; _i3 < tagData.length; _i3++) {\n if (tagData[_i3].value === attributeSelectElm.value) {\n _this15.attributeType = tagData[_i3].key;\n break;\n }\n }\n });\n }\n var nameData = [{\n name: '空间长度',\n value: '空间长度'\n }, {\n name: '投影长度',\n value: '投影长度'\n }, {\n name: '地表长度',\n value: '地表长度'\n }];\n var nameDataLegpObject = Object(_Element_datalist__WEBPACK_IMPORTED_MODULE_20__[\"legp\"])(_this15._DialogObject._element.content.getElementsByClassName('input-select-unit-box')[0], '.input-select-unit');\n if (nameDataLegpObject) {\n nameDataLegpObject.legp_search(nameData);\n var nameDataLegpElm = _this15._DialogObject._element.content.getElementsByClassName('input-select-unit')[0].getElementsByTagName('input')[0];\n _this15._elms.wordsName = [nameDataLegpElm];\n nameDataLegpElm.value = _this15.options.wordsName;\n for (var _i4 = 0; _i4 < nameData.length; _i4++) {\n if (nameData[_i4].value === nameDataLegpElm.value) {\n nameDataLegpObject.legp_searchActive(nameData[_i4].value);\n break;\n }\n }\n nameDataLegpElm.addEventListener('input', function () {\n for (var _i5 = 0; _i5 < nameData.length; _i5++) {\n if (nameData[_i5].value === nameDataLegpElm.value) {\n _this15.wordsName = nameData[_i5].value;\n break;\n }\n }\n });\n }\n\n // 原始长度单位\n var unitData = [{\n name: '米',\n value: '米'\n }, {\n name: '千米',\n value: '千米'\n }];\n var unitDataLegpObject = Object(_Element_datalist__WEBPACK_IMPORTED_MODULE_20__[\"legp\"])(_this15._DialogObject._element.content.getElementsByClassName('input-select-unit-box')[0], '.input-select-unit', 1);\n if (unitDataLegpObject) {\n unitDataLegpObject.legp_search(unitData);\n var unitDataLegpElm = _this15._DialogObject._element.content.getElementsByClassName('input-select-unit')[1].getElementsByTagName('input')[0];\n _this15._elms.lengthUnit = [unitDataLegpElm];\n for (var _i6 = 0; _i6 < unitData.length; _i6++) {\n if (unitData[_i6].value === unitDataLegpElm.value) {\n unitDataLegpObject.legp_searchActive(unitData[_i6].value);\n break;\n }\n }\n unitDataLegpElm.addEventListener('input', function () {\n for (var _i7 = 0; _i7 < unitData.length; _i7++) {\n if (unitData[_i7].value === unitDataLegpElm.value) {\n _this15.lengthUnit = unitData[_i7].value;\n break;\n }\n }\n });\n }\n\n // 拟合长度单位\n // let fitUnitData = [\n // {\n // name: '米',\n // value: '米'\n // },\n // {\n // name: '千米',\n // value: '千米'\n // }\n // ]\n\n // let fitUnitDataLegpObject = legp(\n // this._DialogObject._element.content.getElementsByClassName(\n // 'input-select-fit-unit-box'\n // )[0],\n // '.input-select-fit-unit'\n // )\n // if (fitUnitDataLegpObject) {\n // fitUnitDataLegpObject.legp_search(fitUnitData)\n // let fitUnitDataLegpElm = this._DialogObject._element.content\n // .getElementsByClassName('input-select-fit-unit')[0]\n // .getElementsByTagName('input')[0]\n // this._elms.fitLengthUnit = [fitUnitDataLegpElm]\n // fitUnitDataLegpElm.value = this.options['fit-length-unit']\n // for (let i = 0; i < fitUnitData.length; i++) {\n // if (fitUnitData[i].value === fitUnitDataLegpElm.value) {\n // fitUnitDataLegpObject.legp_searchActive(fitUnitData[i].value)\n // break\n // }\n // }\n // fitUnitDataLegpElm.addEventListener('input', () => {\n // for (let i = 0; i < fitUnitData.length; i++) {\n // if (fitUnitData[i].value === fitUnitDataLegpElm.value) {\n // this.fitLengthUnit = fitUnitData[i].value\n // break\n // }\n // }\n // })\n // }\n\n var lineTypeData = [{\n name: '实线',\n value: '实线',\n key: 0,\n icon: 'line'\n }, {\n name: '虚线',\n value: '虚线',\n key: 1,\n icon: 'dash-line'\n }, {\n name: '泛光',\n value: '泛光',\n key: 2,\n icon: 'light-line'\n }, {\n name: '尾迹光线',\n value: '尾迹光线',\n key: 3,\n icon: 'tail-line'\n }, {\n name: '多尾迹光线',\n value: '多尾迹光线',\n key: 4,\n icon: 'mult-tail-line'\n }, {\n name: '流动虚线1',\n value: '流动虚线1',\n key: 5,\n icon: 'flow-dash-line1'\n }, {\n name: '流动虚线2',\n value: '流动虚线2',\n key: 6,\n icon: 'flow-dash-line2'\n }, {\n name: '流动箭头1',\n value: '流动箭头1',\n key: 7,\n icon: 'pic-line1'\n }, {\n name: '流动箭头2',\n value: '流动箭头2',\n key: 8,\n icon: 'pic-line2'\n }, {\n name: '流动箭头3',\n value: '流动箭头3',\n key: 9,\n icon: 'pic-line3'\n }, {\n name: '流动箭头4',\n value: '流动箭头4',\n key: 10,\n icon: 'pic-line4'\n }, {\n name: '流动箭头5',\n value: '流动箭头5',\n key: 11,\n icon: 'pic-line5'\n }, {\n name: '流动箭头6',\n value: '流动箭头6',\n key: 12,\n icon: 'pic-line6'\n }];\n var lineTypeDataLegpObject = Object(_Element_datalist__WEBPACK_IMPORTED_MODULE_20__[\"legp\"])(_this15._DialogObject._element.content.getElementsByClassName('input-select-line-type-box')[0], '.input-select-line-type');\n if (lineTypeDataLegpObject) {\n lineTypeDataLegpObject.legp_search(lineTypeData);\n var iActiveElm2 = document.createElement('i');\n iActiveElm2.className = 'icon icon-active';\n _this15._DialogObject._element.content.getElementsByClassName('input-select-line-type')[0].getElementsByClassName('cy_datalist')[0].appendChild(iActiveElm2);\n var lineTypeDataLegpElm = _this15._DialogObject._element.content.getElementsByClassName('input-select-line-type')[0].getElementsByTagName('input')[0];\n _this15._elms.lineType = [lineTypeDataLegpElm];\n for (var _i8 = 0; _i8 < lineTypeData.length; _i8++) {\n if (lineTypeData[_i8].key === _this15.options.type) {\n lineTypeDataLegpObject.legp_searchActive(lineTypeData[_i8].value);\n lineTypeDataLegpElm.value = lineTypeData[_i8].value;\n iActiveElm2.className = \"icon icon-active \".concat(lineTypeData[_i8].icon);\n break;\n }\n }\n lineTypeDataLegpElm.addEventListener('input', function () {\n for (var _i9 = 0; _i9 < lineTypeData.length; _i9++) {\n if (lineTypeData[_i9].value === lineTypeDataLegpElm.value) {\n _this15.lineType = lineTypeData[_i9].key;\n iActiveElm2.className = \"icon icon-active \".concat(lineTypeData[_i9].icon);\n\n //控制参数显隐\n if (2 < _this15.lineType && _this15.lineType < 13) {\n //贴图参数\n document.getElementById('dashTextureDom') && (document.getElementById('dashTextureDom').style.display = 'flex');\n } else {\n document.getElementById('dashTextureDom') && (document.getElementById('dashTextureDom').style.display = 'none');\n }\n if (2 < _this15.lineType && _this15.lineType < 5) {\n //尾迹参数\n document.getElementsByClassName('lineSpace')[0] && (document.getElementsByClassName('lineSpace')[0].style.display = 'none');\n document.getElementsByClassName('lineSpace')[1] && (document.getElementsByClassName('lineSpace')[1].style.display = 'none');\n } else {\n document.getElementsByClassName('lineSpace')[0] && (document.getElementsByClassName('lineSpace')[0].style.display = 'flex');\n document.getElementsByClassName('lineSpace')[1] && (document.getElementsByClassName('lineSpace')[1].style.display = 'flex');\n }\n break;\n }\n }\n });\n }\n var heightBoxElm = _this15._DialogObject._element.content.getElementsByClassName('height-box')[0];\n var heightElm = heightBoxElm.getElementsByClassName('height')[0];\n var heightConfirmElm = _this15._DialogObject._element.content.getElementsByClassName('height-confirm')[0];\n heightElm.value = 10;\n if (_this15.heightMode == 2) {\n heightBoxElm && (heightBoxElm.className = 'input-number input-number-unit-1 height-box disabled');\n heightConfirmElm && heightConfirmElm.setAttribute('disabled', 'disabled');\n } else {\n heightBoxElm && (heightBoxElm.className = 'input-number input-number-unit-1 height-box');\n heightConfirmElm && heightConfirmElm.removeAttribute('disabled');\n }\n var heightModeData = [{\n name: '海拔高度',\n value: '海拔高度',\n key: '0'\n }, {\n name: '相对地表',\n value: '相对地表',\n key: '1'\n }, {\n name: '依附模型',\n value: '依附模型',\n key: '2'\n }];\n var heightModeObject = Object(_Element_datalist__WEBPACK_IMPORTED_MODULE_20__[\"legp\"])(_this15._DialogObject._element.content.getElementsByClassName('height-mode-box')[0], '.height-mode');\n if (heightModeObject) {\n heightModeObject.legp_search(heightModeData);\n var heightModeDataLegpElm = _this15._DialogObject._element.content.getElementsByClassName('height-mode')[0].getElementsByTagName('input')[0];\n for (var _i10 = 0; _i10 < heightModeData.length; _i10++) {\n if (heightModeData[_i10].key == _this15.heightMode) {\n heightModeDataLegpElm.value = heightModeData[_i10].value;\n heightModeObject.legp_searchActive(heightModeData[_i10].value);\n break;\n }\n }\n heightModeDataLegpElm.addEventListener('input', function () {\n for (var _i11 = 0; _i11 < heightModeData.length; _i11++) {\n if (heightModeData[_i11].value === heightModeDataLegpElm.value) {\n _this15.heightMode = heightModeData[_i11].key;\n break;\n }\n }\n });\n heightElm.addEventListener('input', function () {\n switch (_this15.heightMode) {\n case 0:\n case '0':\n break;\n case 1:\n case '1':\n break;\n case 2:\n case '2':\n break;\n }\n });\n _this15._elms.height = heightElm;\n _this15._elms.heightBox = heightBoxElm;\n _this15._elms.heightMode = heightModeDataLegpElm;\n _this15._elms.heightConfirm = heightConfirmElm;\n _this15._elms.heightModeObject = heightModeObject;\n heightConfirmElm.addEventListener('click', function () {\n _this15.positionEditing = false;\n for (var _i12 = 0; _i12 < _this15.options.positions.length; _i12++) {\n _this15.options.positions[_i12].alt = Number((_this15.options.positions[_i12].alt + Number(heightElm.value)).toFixed(2));\n _this15._elms.alt[_i12].innerHTML = _this15.options.positions[_i12].alt;\n }\n var fromDegreesArray = _this15.renewPositions(_this15.options.positions);\n _this15.entity.polyline.positions = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray);\n _this15.positionEditing = false;\n _this15.closeNodeEdit();\n });\n }\n var tableElm = contentElm.getElementsByClassName('spatial-info-table')[0];\n var tBodyElm = tableElm.getElementsByClassName('table-body')[0];\n _this15._elms.lng = [];\n _this15._elms.lngInput = [];\n _this15._elms.lat = [];\n _this15._elms.latInput = [];\n _this15._elms.alt = [];\n _this15._elms.altInput = [];\n var _loop6 = function _loop6(_i13) {\n var tr = document.createElement('div');\n tr.className = 'tr';\n tr.innerHTML = \"\\n
\".concat(_i13 + 1, \"
\\n
\\n
\\n
\\n \");\n var lngBox = tr.getElementsByClassName('lng')[0];\n var lng = document.createElement('span');\n lng.innerHTML = _this15.options.positions[_i13].lng.toFixed(8);\n lngBox.appendChild(lng);\n var lngInput = document.createElement('input');\n lngInput.className = 'input';\n lngInput.type = 'number';\n lngInput.title = '';\n lngInput.min = -180;\n lngInput.max = 180;\n lngInput.value = _this15.options.positions[_i13].lng.toFixed(8);\n var latBox = tr.getElementsByClassName('lat')[0];\n var lat = document.createElement('span');\n lat.innerHTML = _this15.options.positions[_i13].lat.toFixed(8);\n latBox.appendChild(lat);\n var latInput = document.createElement('input');\n latInput.className = 'input';\n latInput.type = 'number';\n latInput.title = '';\n latInput.min = -90;\n latInput.max = 90;\n latInput.value = _this15.options.positions[_i13].lat.toFixed(8);\n var altBox = tr.getElementsByClassName('alt')[0];\n var alt = document.createElement('span');\n alt.innerHTML = _this15.options.positions[_i13].alt.toFixed(2);\n altBox.appendChild(alt);\n var altInput = document.createElement('input');\n altInput.className = 'input';\n altInput.type = 'number';\n altInput.title = '';\n altInput.min = -9999999;\n altInput.max = 999999999;\n altInput.value = _this15.options.positions[_i13].alt.toFixed(2);\n lngBox.addEventListener('dblclick', function () {\n lngBox.innerHTML = '';\n lngInput.value = Number(_this15.options.positions[_i13].lng.toFixed(8));\n lngBox.appendChild(lngInput);\n lngInput.focus();\n _this15.positionEditing = false;\n _this15.closeNodeEdit();\n });\n lngInput.addEventListener('blur', function () {\n lngInput.value = Number(_this15.options.positions[_i13].lng.toFixed(8));\n lngBox.innerHTML = '';\n lngBox.appendChild(lng);\n });\n lngInput.addEventListener('input', function () {\n _this15.options.positions[_i13].lng = Number(Number(lngInput.value).toFixed(8));\n lng.innerHTML = _this15.options.positions[_i13].lng.toFixed(8);\n var fromDegreesArray = _this15.renewPositions(_this15.options.positions);\n _this15.entity.polyline.positions = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray);\n _this15.label.position = [_this15.options.positions[0].lng, _this15.options.positions[0].lat, fromDegreesArray[2]];\n });\n latBox.addEventListener('dblclick', function () {\n latBox.innerHTML = '';\n latInput.value = Number(_this15.options.positions[_i13].lat.toFixed(8));\n latBox.appendChild(latInput);\n latInput.focus();\n _this15.positionEditing = false;\n _this15.closeNodeEdit();\n });\n latInput.addEventListener('blur', function () {\n latInput.value = Number(_this15.options.positions[_i13].lat.toFixed(8));\n latBox.innerHTML = '';\n latBox.appendChild(lat);\n });\n latInput.addEventListener('input', function () {\n _this15.options.positions[_i13].lat = Number(Number(latInput.value).toFixed(8));\n lat.innerHTML = _this15.options.positions[_i13].lat.toFixed(8);\n var fromDegreesArray = _this15.renewPositions(_this15.options.positions);\n _this15.entity.polyline.positions = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray);\n _this15.label.position = [_this15.options.positions[0].lng, _this15.options.positions[0].lat, fromDegreesArray[2]];\n });\n altBox.addEventListener('dblclick', function () {\n if (_this15.heightMode == 2) {\n return;\n }\n altBox.innerHTML = '';\n altInput.value = Number(_this15.options.positions[_i13].alt.toFixed(2));\n altBox.appendChild(altInput);\n altInput.focus();\n _this15.positionEditing = false;\n _this15.closeNodeEdit();\n });\n altInput.addEventListener('blur', function () {\n altInput.value = Number(_this15.options.positions[_i13].alt.toFixed(2));\n altBox.innerHTML = '';\n altBox.appendChild(alt);\n });\n altInput.addEventListener('input', function () {\n _this15.options.positions[_i13].alt = Number(Number(altInput.value).toFixed(2));\n alt.innerHTML = _this15.options.positions[_i13].alt.toFixed(2);\n var fromDegreesArray = _this15.renewPositions(_this15.options.positions);\n _this15.entity.polyline.positions = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray);\n _this15.label.position = [_this15.options.positions[0].lng, _this15.options.positions[0].lat, fromDegreesArray[2]];\n });\n _this15._elms.lng.push(lng);\n _this15._elms.lngInput.push(lngInput);\n _this15._elms.lat.push(lat);\n _this15._elms.latInput.push(latInput);\n _this15._elms.alt.push(alt);\n _this15._elms.altInput.push(altInput);\n tBodyElm.appendChild(tr);\n };\n for (var _i13 = 0; _i13 < _this15.options.positions.length; _i13++) {\n _loop6(_i13);\n }\n var fontData = Object(_Element_fontSelect__WEBPACK_IMPORTED_MODULE_21__[\"getFontList\"])();\n var fontObject = Object(_Element_datalist__WEBPACK_IMPORTED_MODULE_20__[\"legp\"])(_this15._DialogObject._element.content.getElementsByClassName('font-select-box')[0], '.font-select');\n if (fontObject) {\n fontObject.legp_search(fontData);\n var fontDataLegpElm = _this15._DialogObject._element.content.getElementsByClassName('font-select')[0].getElementsByTagName('input')[0];\n fontDataLegpElm.value = fontData[_this15.labelFontFamily].value;\n for (var _i14 = 0; _i14 < fontData.length; _i14++) {\n if (fontData[_i14].value == fontDataLegpElm.value) {\n fontObject.legp_searchActive(fontData[_i14].value);\n break;\n }\n }\n fontDataLegpElm.addEventListener('input', function () {\n for (var _i15 = 0; _i15 < fontData.length; _i15++) {\n if (fontData[_i15].value === fontDataLegpElm.value) {\n _this15.labelFontFamily = fontData[_i15].key;\n break;\n }\n }\n });\n _this15._elms.labelFontFamily = [fontDataLegpElm];\n }\n }, 0);\n _context4.next = 34;\n break;\n case 33:\n if (this._DialogObject && this._DialogObject.close) {\n this._DialogObject.close();\n this._DialogObject = null;\n }\n case 34:\n case \"end\":\n return _context4.stop();\n }\n }, _callee2, this);\n }));\n function edit(_x2) {\n return _edit.apply(this, arguments);\n }\n return edit;\n }() // 平滑处理\n )\n }, {\n key: \"smoothHandle\",\n value: function smoothHandle(positions) {\n var newPositions = [];\n var time = [];\n var fromDegreesArrayHeights = [];\n for (var i = 0; i < positions.length; i++) {\n fromDegreesArrayHeights.push(positions[i].lng, positions[i].lat, positions[i].alt);\n time.push(i / (positions.length - 1));\n }\n var spline = new Cesium.CatmullRomSpline({\n times: time,\n points: Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArrayHeights)\n });\n var length = positions.length * 20;\n for (var _i16 = 0; _i16 <= length; _i16++) {\n var cartesian3 = spline.evaluate(_i16 / length);\n newPositions.push(this.cartesian3Towgs84(cartesian3, this.sdk.viewer));\n }\n return newPositions;\n }\n\n // 更新坐标\n }, {\n key: \"renewPositions\",\n value: function renewPositions(positionsArray, cd) {\n var _this17 = this;\n if (this._error) {\n return;\n }\n var positions = JSON.parse(JSON.stringify(positionsArray));\n var ground;\n switch (this.heightMode) {\n case 0:\n case '0':\n ground = false;\n break;\n case 1:\n case '1':\n for (var i = 0; i < positions.length; i++) {\n var height = this.sdk.viewer.scene.globe.getHeight(Cesium.Cartographic.fromDegrees(positions[i].lng, positions[i].lat));\n positions[i].alt = height ? Number((positions[i].alt + Number(height)).toFixed(2)) : Number(positions[i].alt.toFixed(2));\n }\n ground = false;\n break;\n case 2:\n case '2':\n ground = true;\n break;\n }\n var newPositions;\n var fromDegreesArray = [];\n if (this.options.noseToTail && this.options.noseToTail !== 'false') {\n newPositions = [].concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default()(positions), [positions[0]]);\n } else {\n newPositions = _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default()(positions);\n }\n newPositions = this.smoothHandle(newPositions);\n for (var _i17 = 0; _i17 < newPositions.length; _i17++) {\n fromDegreesArray.push(newPositions[_i17].lng, newPositions[_i17].lat, newPositions[_i17].alt);\n }\n\n // 计算长度\n // let array = []\n // for (let i = 0; i < fromDegreesArray.length; i += 3) {\n // array.push({\n // lng: fromDegreesArray[i],\n // lat: fromDegreesArray[i + 1],\n // alt: fromDegreesArray[i + 2]\n // })\n // }\n // this.options.fitLengthByMeter = this.computeDistance2(\n // array,\n // 2,\n // ground\n // )\n // this.fitLengthUnit = this.options['fit-length-unit']\n // this.options.lengthByMeter = this.computeDistance2(this.smoothHandle(positions), 2, ground)\n // this.lengthUnit = this.options['length-unit']\n\n if (this.options.noseToTail && this.options.noseToTail !== 'false' || this.options.smooth && this.options.smooth !== 'false') {\n var array = [];\n for (var _i18 = 0; _i18 < fromDegreesArray.length; _i18 += 3) {\n array.push({\n lng: fromDegreesArray[_i18],\n lat: fromDegreesArray[_i18 + 1],\n alt: fromDegreesArray[_i18 + 2]\n });\n }\n // this.options.fitLengthByMeter = this.computeDistance(\n // array,\n // 2,\n // ground\n // )\n var _this16 = this;\n this.computeDistance(array, 2, this.options.wordsName).then(function (res) {\n _this16.lengthByMeter = res;\n _this17.lengthChangeCallBack && _this17.lengthChangeCallBack();\n cd && cd();\n });\n } else {\n var _this18 = this;\n this.computeDistance(_this18.smoothHandle(positions), 2, this.options.wordsName).then(function (res) {\n _this18.lengthByMeter = res;\n _this17.lengthChangeCallBack && _this17.lengthChangeCallBack();\n cd && cd();\n });\n }\n return fromDegreesArray;\n }\n\n // 更新多边形(线扩展)\n }, {\n key: \"renewPolygon\",\n value: function renewPolygon(fromDegreesArray) {\n var linePositions = [];\n if (this.options.extend && this.options.extend !== 'false') {\n var outerHole = [];\n for (var i = 0; i < fromDegreesArray.length; i += 3) {\n linePositions.push([fromDegreesArray[i], fromDegreesArray[i + 1]]);\n }\n var linestring = turf.lineString(linePositions);\n var buffered = turf.buffer(linestring, this.options.extendWidth / 1000, {\n units: 'kilometers'\n });\n for (var _i19 = 0; _i19 < buffered.geometry.coordinates[0].length; _i19++) {\n outerHole.push(buffered.geometry.coordinates[0][_i19][0], buffered.geometry.coordinates[0][_i19][1]);\n }\n var holes = []; // 孔\n for (var _i20 = 1; _i20 < buffered.geometry.coordinates.length; _i20++) {\n var array = [];\n for (var m = 0; m < buffered.geometry.coordinates[_i20].length; m++) {\n array.push(buffered.geometry.coordinates[_i20][m][0], buffered.geometry.coordinates[_i20][m][1]);\n }\n holes.push({\n positions: Cesium.Cartesian3.fromDegreesArray(array)\n });\n }\n this.entity.polygon = new Cesium.PolygonGraphics({\n hierarchy: {\n positions: Cesium.Cartesian3.fromDegreesArray(outerHole),\n holes: holes\n },\n material: Cesium.Color.fromCssColorString(this.options.extendColor)\n });\n } else {\n this.entity.polygon = undefined;\n }\n }\n }, {\n key: \"reset\",\n value: function () {\n var _reset = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee3() {\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee3$(_context5) {\n while (1) switch (_context5.prev = _context5.next) {\n case 0:\n if (this.entity) {\n _context5.next = 2;\n break;\n }\n return _context5.abrupt(\"return\");\n case 2:\n this.options = this.deepCopyObj(this.originalOptions);\n this.name = this.originalOptions.name;\n this.color = this.originalOptions.color;\n this.lineWidth = this.originalOptions.width;\n this.lineType = this.originalOptions.type;\n this.noseToTail = this.originalOptions.noseToTail;\n this.extend = this.originalOptions.extend;\n this.extendWidth = this.originalOptions.extendWidth;\n this.extendColor = this.originalOptions.extendColor;\n this.labelShow = this.originalOptions.label.show;\n this.labelColor = this.originalOptions.label.color;\n this.labelFontSize = this.originalOptions.label.fontSize;\n this.labelFontFamily = this.originalOptions.label.fontFamily;\n this.labelScaleByDistance = this.originalOptions.label.scaleByDistance;\n this.labelNear = this.originalOptions.label.near;\n this.labelFar = this.originalOptions.label.far;\n this.labelLineWidth = this.originalOptions.label.lineWidth;\n this.labelPixelOffset = this.originalOptions.label.pixelOffset;\n this.labelLineColor = this.originalOptions.label.lineColor;\n this.labelBackgroundColorStart = this.originalOptions.label.backgroundColor[0];\n this.labelBackgroundColorEnd = this.originalOptions.label.backgroundColor[1];\n this.attributeLink = this.options.attribute.link.content;\n // this.attributeVr = this.options.attribute.vr.content\n // this.attributeCamera = this.options.attribute.camera.content\n // this.attributeGoods = this.options.attribute.goods.content\n this.rotate = this.originalOptions.rotate;\n this.speed = this.originalOptions.speed;\n // this.dashSize = this.originalOptions.dashSize\n this.space = this.originalOptions.space;\n // this.cameraSelect && this.cameraSelect()\n // this.goodsSelect && this.goodsSelect()\n\n this.heightMode = this.options.heightMode;\n\n // let height\n // if (this.ground) {\n // height = await that.getClampToHeight({\n // lng: this.options.positions[0].lng,\n // lat: this.options.positions[0].lat\n // })\n // } else {\n // height = this.options.positions[0].alt\n // }\n // this.options.label.position = {\n // lng: this.options.positions[0].lng,\n // lat: this.options.positions[0].lat,\n // alt: height\n // }\n // this.label.position = [\n // this.options.label.position.lng,\n // this.options.label.position.lat,\n // this.options.label.position.alt\n // ]\n case 28:\n case \"end\":\n return _context5.stop();\n }\n }, _callee3, this);\n }));\n function reset() {\n return _reset.apply(this, arguments);\n }\n return reset;\n }()\n }, {\n key: \"_addLink\",\n value: function _addLink() {\n if (this._DialogObject._element.content.getElementsByClassName('link_add')[0].value) {\n this.options.attribute.link.content.push({\n name: '链接',\n url: this._DialogObject._element.content.getElementsByClassName('link_add')[0].value\n });\n this._DialogObject._element.content.getElementsByClassName('link_add')[0].value = '';\n this.attributeLink = this.options.attribute.link.content;\n } else {\n this.Dialog.clickAddLink && this.Dialog.clickAddLink();\n // let input = document.createElement('input');\n // input.type = \"file\";\n // input.accept = \".mp4, .pdf\"\n // input.click()\n // input.addEventListener('change', (event) => {\n // if (input.value) {\n // this.options.attribute.link.content.push({\n // name: '链接',\n // url: input.value\n // })\n // this.attributeLink = this.options.attribute.link.content\n // }\n // })\n }\n }\n }, {\n key: \"addAttributeLink\",\n value: function addAttributeLink(link) {\n this.options.attribute.link.content.push({\n name: '链接',\n url: link\n });\n this.attributeLink = this.options.attribute.link.content;\n }\n\n // _addRr() {\n // if (\n // this._DialogObject._element.content.getElementsByClassName(\n // 'vr_add'\n // )[0].value\n // ) {\n // this.options.attribute.vr.content.push({\n // name: '全景图',\n // url: this._DialogObject._element.content.getElementsByClassName(\n // 'vr_add'\n // )[0].value\n // })\n // this._DialogObject._element.content.getElementsByClassName(\n // 'vr_add'\n // )[0].value = ''\n // this.attributeVr = this.options.attribute.vr.content\n // } else {\n // this.Dialog.clickAddVr && this.Dialog.clickAddVr()\n // }\n // }\n\n // addAttributeRr(vr) {\n // this.options.attribute.vr.content.push({\n // name: '全景图',\n // url: vr\n // })\n // this.attributeVr = this.options.attribute.vr.content\n // }\n\n /**\r\n * 飞到\r\n */\n }, {\n key: \"flyTo\",\n value: function () {\n var _flyTo = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee4() {\n var options,\n orientation,\n lng,\n lat,\n alt,\n destination,\n position,\n positionArray,\n height,\n i,\n a,\n _i21,\n _a,\n _i22,\n _a2,\n BoundingSphere,\n _args6 = arguments;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee4$(_context6) {\n while (1) switch (_context6.prev = _context6.next) {\n case 0:\n options = _args6.length > 0 && _args6[0] !== undefined ? _args6[0] : {};\n if (!this._error) {\n _context6.next = 3;\n break;\n }\n return _context6.abrupt(\"return\");\n case 3:\n Object(_Global_global__WEBPACK_IMPORTED_MODULE_23__[\"closeRotateAround\"])(this.sdk);\n Object(_Global_global__WEBPACK_IMPORTED_MODULE_23__[\"closeViewFollow\"])(this.sdk);\n Object(_Global_global__WEBPACK_IMPORTED_MODULE_23__[\"setActiveViewer\"])(0);\n if (!this.options.customView) {\n _context6.next = 25;\n break;\n }\n orientation = {\n heading: Cesium.Math.toRadians(this.options.customView.orientation.heading || 0.0),\n pitch: Cesium.Math.toRadians(this.options.customView.orientation.pitch || -60.0),\n roll: Cesium.Math.toRadians(this.options.customView.orientation.roll || 0.0)\n };\n lng = this.options.customView.relativePosition.lng;\n lat = this.options.customView.relativePosition.lat;\n alt = this.options.customView.relativePosition.alt;\n destination = Cesium.Cartesian3.fromDegrees(lng, lat, alt);\n position = {\n lng: 0,\n lat: 0\n };\n if (this.options.position) {\n position = _objectSpread({}, this.options.position);\n } else if (this.options.positions) {\n position = _objectSpread({}, this.options.positions[0]);\n } else if (this.options.center) {\n position = _objectSpread({}, this.options.center);\n } else if (this.options.start) {\n position = _objectSpread({}, this.options.start);\n } else {\n if (this.options.hasOwnProperty('lng')) {\n position.lng = this.options.lng;\n }\n if (this.options.hasOwnProperty('lat')) {\n position.lat = this.options.lat;\n }\n if (this.options.hasOwnProperty('alt')) {\n position.alt = this.options.alt;\n }\n }\n // 如果没有高度值,则获取紧贴高度计算\n if (position.hasOwnProperty('alt')) {\n _context6.next = 18;\n break;\n }\n _context6.next = 17;\n return this.getClampToHeight(position);\n case 17:\n position.alt = _context6.sent;\n case 18:\n lng = this.options.customView.relativePosition.lng + position.lng;\n lat = this.options.customView.relativePosition.lat + position.lat;\n alt = this.options.customView.relativePosition.alt + position.alt;\n destination = Cesium.Cartesian3.fromDegrees(lng, lat, alt);\n this.sdk.viewer.camera.flyTo({\n destination: destination,\n orientation: orientation\n });\n _context6.next = 43;\n break;\n case 25:\n positionArray = [];\n _context6.t0 = this.options.heightMode;\n _context6.next = _context6.t0 === '0' ? 29 : _context6.t0 === 0 ? 29 : _context6.t0 === '1' ? 31 : _context6.t0 === 1 ? 31 : _context6.t0 === '2' ? 36 : _context6.t0 === 2 ? 36 : 41;\n break;\n case 29:\n for (i = 0; i < this.options.positions.length; i++) {\n a = Cesium.Cartesian3.fromDegrees(this.options.positions[i].lng, this.options.positions[i].lat, this.options.positions[i].alt);\n positionArray.push(a.x, a.y, a.z);\n }\n return _context6.abrupt(\"break\", 41);\n case 31:\n _context6.next = 33;\n return this.getClampToHeight(this.options.positions[0]);\n case 33:\n height = _context6.sent;\n for (_i21 = 0; _i21 < this.options.positions.length; _i21++) {\n _a = Cesium.Cartesian3.fromDegrees(this.options.positions[_i21].lng, this.options.positions[_i21].lat, height + this.options.positions[_i21].alt);\n positionArray.push(_a.x, _a.y, _a.z);\n }\n return _context6.abrupt(\"break\", 41);\n case 36:\n _context6.next = 38;\n return this.getClampToHeight(this.options.positions[0]);\n case 38:\n height = _context6.sent;\n for (_i22 = 0; _i22 < this.options.positions.length; _i22++) {\n _a2 = Cesium.Cartesian3.fromDegrees(this.options.positions[_i22].lng, this.options.positions[_i22].lat, height);\n positionArray.push(_a2.x, _a2.y, _a2.z);\n }\n return _context6.abrupt(\"break\", 41);\n case 41:\n BoundingSphere = Cesium.BoundingSphere.fromVertices(positionArray);\n this.sdk.viewer.camera.flyToBoundingSphere(BoundingSphere, {\n offset: options.orientation || {\n heading: Cesium.Math.toRadians(0.0),\n pitch: Cesium.Math.toRadians(-90.0),\n roll: Cesium.Math.toRadians(0.0)\n }\n });\n case 43:\n case \"end\":\n return _context6.stop();\n }\n }, _callee4, this);\n }));\n function flyTo() {\n return _flyTo.apply(this, arguments);\n }\n return flyTo;\n }()\n /**\r\n * 打开富文本框\r\n */\n }, {\n key: \"openRichTextEditor\",\n value: function openRichTextEditor(e) {\n var _this19 = this;\n // var ue = UE.getEditor('app');\n _Element_richText__WEBPACK_IMPORTED_MODULE_13__[\"default\"].open(this.options.id, this.options.name, this.options.richTextContent);\n _Element_richText__WEBPACK_IMPORTED_MODULE_13__[\"default\"].primaryCallBack = function (content) {\n _this19.options.richTextContent = content;\n };\n }\n\n // static nodeEdit2(that, cb = () => { }) {\n // that.positionEditing = false\n // if (YJ.Measure.GetMeasureStatus()) {\n // cb('上一次测量未结束')\n // } else {\n // YJ.Measure.SetMeasureStatus(true)\n // that.tip = new MouseTip('请选择一个顶点,右键取消', that.sdk)\n // that.event = new MouseEvent(that.sdk)\n // that.nodePoints = []\n // let selectPoint\n // let originalPosition\n // let newpositions = []\n // let fromDegreesArray = []\n // for (let i = 0; i < that.options.positions.length; i++) {\n // fromDegreesArray.push(\n // that.options.positions[i].lng,\n // that.options.positions[i].lat,\n // that.options.positions[i].alt\n // )\n // }\n // newpositions = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray)\n\n // that.event.mouse_left((movement, cartesian) => {\n // if (selectPoint) {\n // that.options.positions[selectPoint.index] = that.cartesian3Towgs84(\n // cartesian,\n // that.sdk.viewer\n // )\n // originalPosition = that.options.positions[selectPoint.index]\n // let entity = that.sdk.viewer.entities.add({\n // name: 'node-secondary-edit-point',\n // position: Cesium.Cartesian3.fromDegrees(\n // that.options.positions[selectPoint.index].lng,\n // that.options.positions[selectPoint.index].lat,\n // that.options.positions[selectPoint.index].alt\n // ),\n // billboard: {\n // image: that.getSourceRootPath() + '/img/point.png',\n // width: 15,\n // height: 15,\n // disableDepthTestDistance: Number.POSITIVE_INFINITY\n // }\n // })\n // that.nodePoints.splice(selectPoint.index, 0, entity)\n // that.options.positions.splice(\n // selectPoint.index,\n // 0,\n // that.options.positions[selectPoint.index]\n // )\n // let fromDegreesArray = that.renewPositions(that.options.positions)\n // that.renewPolygon(fromDegreesArray)\n // that.options.lengthByMeter = that.computeDistance2(\n // that.options.positions,\n // 2,\n // that.ground\n // )\n // that.lengthUnit = that.options['length-unit']\n // } else {\n // var pick = that.sdk.viewer.scene.pick(movement.position)\n // if (\n // pick &&\n // pick.id &&\n // pick.id.name &&\n // pick.id.name === 'node-secondary-edit-point'\n // ) {\n // selectPoint = pick.id\n // that.nodePoints.splice(pick.id.index, 1)\n // that.sdk.viewer.entities.remove(pick.id)\n // that.tip.set_text('左键开始,右键结束,CTRL+右键撤销')\n // originalPosition = that.cartesian3Towgs84(\n // cartesian,\n // that.sdk.viewer\n // )\n // }\n // }\n // })\n\n // that.event.mouse_right((movement, cartesian) => {\n // if (selectPoint) {\n // that.options.positions[selectPoint.index] = originalPosition\n // cb(null, that.options.positions)\n // }\n // let positions = that.options.positions\n // let fromDegreesArray = []\n // for (let i = 0; i < positions.length; i++) {\n // fromDegreesArray.push(\n // positions[i].lng,\n // positions[i].lat,\n // positions[i].alt\n // )\n // }\n // newpositions = Cesium.Cartesian3.fromDegreesArrayHeights(\n // fromDegreesArray\n // )\n // for (let i = 0; i < that.nodePoints.length; i++) {\n // that.sdk.viewer.entities.remove(that.nodePoints[i])\n // }\n // that.nodePoints = []\n // that.event.destroy()\n // that.tip.destroy()\n // })\n\n // that.event.mouse_move((movement, cartesian) => {\n // if (selectPoint) {\n // that.options.positions[selectPoint.index] = that.cartesian3Towgs84(\n // cartesian,\n // that.sdk.viewer\n // )\n // let positions = that.options.positions\n // let fromDegreesArray = []\n // for (let i = 0; i < positions.length; i++) {\n // fromDegreesArray.push(\n // positions[i].lng,\n // positions[i].lat,\n // positions[i].alt\n // )\n // }\n // newpositions = Cesium.Cartesian3.fromDegreesArrayHeights(\n // fromDegreesArray\n // )\n // if (that.options.positions.length === 1) {\n // that.label.position = [\n // that.options.positions[0].lng,\n // that.options.positions[0].lat,\n // that.options.positions[0].alt\n // ]\n // that.options.label.position = {\n // lng: that.options.positions[0].lng,\n // lat: that.options.positions[0].lat,\n // alt: that.options.positions[0].alt\n // }\n // }\n // }\n // that.tip.setPosition(\n // cartesian,\n // movement.endPosition.x,\n // movement.endPosition.y\n // )\n // })\n\n // that.event.mouse_right_keyboard_ctrl((movement, cartesian) => {\n // if (selectPoint) {\n // that.options.positions.pop()\n // that.sdk.viewer.entities.remove(\n // that.nodePoints[that.nodePoints.length - 1]\n // )\n // that.nodePoints.pop()\n // if (selectPoint.index === that.options.positions.length) {\n // if (that.nodePoints[selectPoint.index - 1]) {\n // selectPoint = that.nodePoints[selectPoint.index - 1]\n // } else {\n // selectPoint.index = 0\n // }\n // }\n // }\n // })\n\n // that.entity.polyline.positions = new Cesium.CallbackProperty(function () {\n // return newpositions\n // }, false)\n\n // for (let i = 0; i < that.options.positions.length; i++) {\n // let entity = that.sdk.viewer.entities.add({\n // name: 'node-secondary-edit-point',\n // index: i,\n // position: Cesium.Cartesian3.fromDegrees(\n // that.options.positions[i].lng,\n // that.options.positions[i].lat,\n // that.options.positions[i].alt\n // ),\n // billboard: {\n // image: that.getSourceRootPath() + '/img/point.png',\n // width: 15,\n // height: 15,\n // disableDepthTestDistance: Number.POSITIVE_INFINITY\n // }\n // })\n // that.nodePoints.push(entity)\n // }\n // }\n // }\n }, {\n key: \"nodeEdit\",\n value: function nodeEdit(cd) {\n var _this20 = this;\n this.positionEditing = false;\n if (YJ.Measure.GetMeasureStatus()) {} else {\n this.closeNodeEdit();\n this.tip = new _MouseTip__WEBPACK_IMPORTED_MODULE_17__[\"default\"]('请选择一个顶点,右键取消', this.sdk);\n this.event = new _Event_index__WEBPACK_IMPORTED_MODULE_16__[\"default\"](this.sdk);\n this.ControllerObject = new _Controller_index__WEBPACK_IMPORTED_MODULE_18__[\"default\"](this.sdk);\n this._nodeEditCallback = cd;\n var selectPoint;\n this.event.mouse_left(function (movement, cartesian) {\n var pick = _this20.sdk.viewer.scene.pick(movement.position);\n if (pick && pick.id && pick.id.name && pick.id.name === 'node-secondary-edit-point') {\n selectPoint = pick.id;\n _this20.ControllerObject.position = _this20.options.positions[selectPoint.index];\n _this20.ControllerObject.editTranslational();\n _this20.tip && _this20.tip.destroy();\n _this20.ControllerObject.controllerCallBack = function (params) {\n if (selectPoint.index === 0) {\n _this20.label.position = [params.position.lng, params.position.lat, params.position.alt];\n _this20.options.label.position = {\n lng: params.position.lng,\n lat: params.position.lat,\n alt: params.position.alt\n };\n }\n _this20.options.positions[selectPoint.index] = params.position;\n _this20._elms.lng && (_this20._elms.lng[selectPoint.index].innerHTML = params.position.lng.toFixed(8));\n _this20._elms.lngInput && (_this20._elms.lngInput[selectPoint.index].value = params.position.lng.toFixed(8));\n _this20._elms.lat && (_this20._elms.lat[selectPoint.index].innerHTML = params.position.lat.toFixed(8));\n _this20._elms.latInput && (_this20._elms.latInput[selectPoint.index].value = params.position.lat.toFixed(8));\n _this20._elms.alt && (_this20._elms.alt[selectPoint.index].innerHTML = params.position.alt.toFixed(2));\n _this20._elms.altInput && (_this20._elms.altInput[selectPoint.index].value = params.position.alt.toFixed(2));\n selectPoint.position = Cesium.Cartesian3.fromDegrees(params.position.lng, params.position.lat, params.position.alt);\n };\n }\n });\n this.event.mouse_right(function (movement, cartesian) {\n for (var i = 0; i < _this20.nodePoints.length; i++) {\n _this20.sdk.viewer.entities.remove(_this20.nodePoints[i]);\n }\n _this20.nodePoints = [];\n _this20.event.destroy();\n _this20.tip && _this20.tip.destroy();\n _this20.tip = null;\n _this20.ControllerObject.destroy();\n var fromDegreesArray = _this20.renewPositions(_this20.options.positions);\n _this20.entity.polyline.positions = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray);\n YJ.Measure.SetMeasureStatus(false);\n _this20._nodeEditCallback = null;\n });\n this.event.mouse_move(function (movement, cartesian) {\n _this20.tip.setPosition(cartesian, movement.endPosition.x, movement.endPosition.y);\n });\n this.entity.polyline.positions = new Cesium.CallbackProperty(function () {\n var fromDegreesArray = _this20.renewPositions(_this20.options.positions);\n _this20._nodeEditCallback(_this20.options.positions, _this20.lengthByMeter);\n return Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray);\n }, false);\n for (var i = 0; i < this.options.positions.length; i++) {\n var entity = this.sdk.viewer.entities.add({\n name: 'node-secondary-edit-point',\n index: i,\n position: Cesium.Cartesian3.fromDegrees(this.options.positions[i].lng, this.options.positions[i].lat, this.options.positions[i].alt),\n billboard: {\n image: this.getSourceRootPath() + '/img/point.png',\n width: 15,\n height: 15,\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\n color: Cesium.Color.WHITE.withAlpha(0.99)\n }\n });\n this.nodePoints.push(entity);\n }\n }\n }\n }, {\n key: \"closeNodeEdit\",\n value: function closeNodeEdit() {\n this.ControllerObject && this.ControllerObject.destroy();\n this.event && this.event.destroy();\n this.tip && this.tip.destroy();\n this.tip = null;\n for (var i = 0; i < this.nodePoints.length; i++) {\n this.sdk.viewer.entities.remove(this.nodePoints[i]);\n }\n this.nodePoints = [];\n this._nodeEditCallback = null;\n }\n\n /**\r\n * 删除\r\n */\n }, {\n key: \"remove\",\n value: (function () {\n var _remove = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee5() {\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee5$(_context7) {\n while (1) switch (_context7.prev = _context7.next) {\n case 0:\n this.event && this.event.destroy();\n this.tip && this.tip.destroy();\n this.label && this.label.remove();\n this.sdk.viewer.entities.remove(this.entity);\n this.entity = null;\n if (this._DialogObject && !this._DialogObject.isDestroy) {\n this._DialogObject.close();\n this._DialogObject = null;\n }\n _context7.next = 8;\n return this.sdk.removeIncetance(this.options.id);\n case 8:\n _context7.next = 10;\n return Object(_Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_19__[\"syncData\"])(this.sdk, this.options.id);\n case 10:\n case \"end\":\n return _context7.stop();\n }\n }, _callee5, this);\n }));\n function remove() {\n return _remove.apply(this, arguments);\n }\n return remove;\n }()\n /**@desc 打开平移功能\r\n *\r\n * @memberOf Source\r\n * @param status {boolean}\r\n *\r\n * */\n )\n }, {\n key: \"positionEditing\",\n get: function get() {\n return this.operate.positionEditing;\n },\n set: function set(status) {\n var _this21 = this;\n if (YJ.Measure.GetMeasureStatus() || !this.sdk || !this.sdk.viewer || !this.entity) {\n return;\n }\n this.operate.positionEditing = status;\n if (status === true) {\n this.closeNodeEdit();\n this.event && this.event.destroy();\n this.event = new _Event_index__WEBPACK_IMPORTED_MODULE_16__[\"default\"](this.sdk);\n this.tip && this.tip.destroy();\n this.tip = new _MouseTip__WEBPACK_IMPORTED_MODULE_17__[\"default\"]('点击鼠标左键确认,右键取消', this.sdk);\n this.label && (this.label.entity.billboard.color = Cesium.Color.fromCssColorString(\"rgba(255,255,255,0.9)\"));\n this.picking = false;\n var positions = JSON.parse(JSON.stringify(this.options.positions));\n var positions2 = this.renewPositions(this.options.positions);\n // let positions2 = JSON.parse(JSON.stringify(positions))\n // for (let i = 0; i < positions2.length; i++) {\n // let height = this.sdk.viewer.scene.globe.getHeight(Cesium.Cartographic.fromDegrees(positions2[i].lng, positions2[i].lat))\n // positions2[i] = Cesium.Cartesian3.fromDegrees(\n // positions2[i].lng,\n // positions2[i].lat,\n // Number((positions2[i].alt + Number(height)).toFixed(2))\n // )\n // }\n this.previous = {\n positions: _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default()(this.options.positions)\n };\n for (var i = 0; i < positions.length; i++) {\n positions[i] = Cesium.Cartesian3.fromDegrees(positions[i].lng, positions[i].lat, positions[i].alt);\n }\n var center = positions[Math.floor(positions.length / 2)];\n var disparity = [];\n for (var _i23 = 0; _i23 < positions.length; _i23++) {\n disparity.push({\n x: center.x - positions[_i23].x,\n y: center.y - positions[_i23].y,\n z: center.z - positions[_i23].z\n });\n }\n var newpositions = [];\n var newpositions84 = [];\n this.event.mouse_move(function (movement, cartesian) {\n newpositions = [];\n newpositions84 = [];\n for (var _i24 = 0; _i24 < disparity.length; _i24++) {\n var newP = {\n x: cartesian.x - disparity[_i24].x,\n y: cartesian.y - disparity[_i24].y,\n z: cartesian.z - disparity[_i24].z\n };\n var pos84 = _this21.cartesian3Towgs84(newP, _this21.sdk.viewer);\n pos84.alt = _this21.options.positions[_i24].alt;\n // let height = this.sdk.viewer.scene.globe.getHeight(Cesium.Cartographic.fromDegrees(pos84.lng, pos84.lat))\n // pos84.alt = Number((pos84.alt + Number(height)).toFixed(2))\n // newP = Cesium.Cartesian3.fromDegrees(\n // pos84.lng,\n // pos84.lat,\n // pos84.alt\n // )\n newpositions.push(newP);\n newpositions84.push(pos84);\n }\n var position84 = newpositions84[0];\n positions2 = _this21.renewPositions(newpositions84);\n _this21.label.position = [position84.lng, position84.lat, position84.alt];\n _this21.options.label.position = {\n lng: position84.lng,\n lat: position84.lat,\n alt: position84.alt\n };\n _this21.tip.setPosition(cartesian, movement.endPosition.x, movement.endPosition.y);\n });\n this.event.mouse_left(function (movement, cartesian) {\n _this21.event.mouse_move(function () {});\n _this21.event.mouse_left(function () {});\n _this21.event.mouse_right(function () {});\n newpositions = [];\n newpositions84 = [];\n for (var _i25 = 0; _i25 < disparity.length; _i25++) {\n var newP = {\n x: cartesian.x - disparity[_i25].x,\n y: cartesian.y - disparity[_i25].y,\n z: cartesian.z - disparity[_i25].z\n };\n var pos84 = _this21.cartesian3Towgs84(newP, _this21.sdk.viewer);\n pos84.alt = _this21.options.positions[_i25].alt;\n newpositions.push(newP);\n newpositions84.push(pos84);\n }\n var positionsLngLat = [];\n for (var _i26 = 0; _i26 < newpositions84.length; _i26++) {\n var position = newpositions84[_i26];\n positionsLngLat.push(position);\n _this21._elms.lng && (_this21._elms.lng[_i26].innerHTML = position.lng.toFixed(8));\n _this21._elms.lngInput && (_this21._elms.lngInput[_i26].value = position.lng.toFixed(8));\n _this21._elms.lat && (_this21._elms.lat[_i26].innerHTML = position.lat.toFixed(8));\n _this21._elms.latInput && (_this21._elms.latInput[_i26].value = position.lat.toFixed(8));\n _this21._elms.alt && (_this21._elms.alt[_i26].innerHTML = position.alt.toFixed(2));\n _this21._elms.altInput && (_this21._elms.altInput[_i26].value = position.alt.toFixed(2));\n }\n _this21.options.positions = positionsLngLat;\n _this21.previous.positions = positionsLngLat;\n\n // this.entity.polyline.positionsLngLat = positionsLngLat\n var fromDegreesArray = _this21.renewPositions(_this21.options.positions, function () {\n if (_this21._positionEditingCallback) {\n _this21._positionEditingCallback();\n _this21._positionEditingCallback = null;\n }\n });\n _this21.entity.polyline.positions = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray);\n _this21.renewPolygon(fromDegreesArray);\n _this21.positionEditing = false;\n });\n this.event.mouse_right(function (movement, cartesian) {\n _this21.event.mouse_move(function () {});\n _this21.event.mouse_left(function () {});\n _this21.event.mouse_right(function () {});\n _this21.positionEditing = false;\n });\n this.event.gesture_pinck_start(function (movement, cartesian) {\n var startTime = new Date();\n _this21.event.gesture_pinck_end(function () {\n var endTime = new Date();\n var pos = {\n position: {\n x: (movement.position1.x + movement.position2.x) / 2,\n y: (movement.position1.y + movement.position2.y) / 2\n }\n };\n if (endTime - startTime >= 500) {\n // 长按取消\n _this21.event.mouse_move(function () {});\n _this21.event.mouse_left(function () {});\n _this21.event.mouse_right(function () {});\n _this21.positionEditing = false;\n } else {\n leftEvent(pos, cartesian);\n }\n });\n });\n this.entity.polyline.positions = new Cesium.CallbackProperty(function () {\n return Cesium.Cartesian3.fromDegreesArrayHeights(positions2);\n }, false);\n } else {\n if (!this.sdk || !this.sdk.viewer || !this.label || !this.label.entity) {\n this.label.entity.billboard.color = Cesium.Color.fromCssColorString(\"rgba(255,255,255,1)\");\n }\n this.picking = true;\n if (this.event) {\n this.event.mouse_move(function () {});\n this.event.mouse_left(function () {});\n this.event.mouse_right(function () {});\n this.event.destroy();\n }\n this.tip && this.tip.destroy();\n var fromDegreesArray = this.renewPositions(this.options.positions);\n this.entity.polyline.positions = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray);\n this.renewPolygon(fromDegreesArray);\n switch (this.heightMode) {\n case 0:\n case '0':\n case 1:\n case '1':\n this.label.position = [this.options.positions[0].lng, this.options.positions[0].lat, fromDegreesArray[2]];\n this.options.label.position = {\n lng: this.options.positions[0].lng,\n lat: this.options.positions[0].lat,\n alt: fromDegreesArray[2]\n };\n break;\n case 2:\n case '2':\n this.label.position = [this.options.positions[0].lng, this.options.positions[0].lat];\n this.options.label.position = {\n lng: this.options.positions[0].lng,\n lat: this.options.positions[0].lat,\n alt: fromDegreesArray[2]\n };\n break;\n }\n }\n }\n }, {\n key: \"openPositionEditing\",\n value: function openPositionEditing(cd) {\n this.positionEditing = true;\n this._positionEditingCallback = cd;\n }\n }, {\n key: \"lengthChangeCallBack\",\n get: function get() {\n return this._lengthChangeCallBack;\n },\n set: function set(cd) {\n this._lengthChangeCallBack = cd;\n }\n }, {\n key: \"setDIV\",\n value: function setDIV() {\n var _Cesium$Cartesian,\n _this22 = this;\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {\n domid: '',\n x: 10,\n y: 10\n };\n options.x = options.x || options.x === 0 ? options.x : 10;\n options.y = options.y || options.y === 0 ? options.y : 10;\n var points = [];\n for (var i = 0; i < this.options.positions.length; i++) {\n points.push([this.options.positions[i].lng, this.options.positions[i].lat]);\n }\n var line = turf.lineString(points);\n var length = turf.length(line, {\n units: 'kilometers'\n });\n var sliced = turf.lineSliceAlong(line, 0, length / 2, {\n units: 'kilometers'\n });\n var siteInfoDom = document.getElementById(options.domid);\n var siteInfoPosition = (_Cesium$Cartesian = Cesium.Cartesian3).fromDegrees.apply(_Cesium$Cartesian, _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default()(sliced.geometry.coordinates[sliced.geometry.coordinates.length - 1]));\n this.sdk.viewer.scene.postRender.addEventListener(function (percentage) {\n //转换到屏幕坐标\n if (siteInfoDom.style.display === 'block' || siteInfoDom.style.display === '') {\n var winpos = _this22.sdk.viewer.scene.cartesianToCanvasCoordinates(siteInfoPosition);\n if (winpos) {\n siteInfoDom.style.left = (winpos.x + options.x).toFixed(0) + 'px';\n siteInfoDom.style.top = (winpos.y + options.y).toFixed(0) + 'px';\n }\n }\n });\n }\n }], [{\n key: \"createLabel\",\n value: function () {\n var _createLabel = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee6(that) {\n var height, ground, objectsToExclude;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee6$(_context8) {\n while (1) switch (_context8.prev = _context8.next) {\n case 0:\n objectsToExclude = _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default()(that.sdk.viewer.entities.values);\n _context8.t0 = that.options.heightMode;\n _context8.next = _context8.t0 === '0' ? 4 : _context8.t0 === 0 ? 4 : _context8.t0 === '1' ? 7 : _context8.t0 === 1 ? 7 : _context8.t0 === '2' ? 14 : _context8.t0 === 2 ? 14 : 19;\n break;\n case 4:\n ground = false;\n height = that.options.positions[0].alt;\n return _context8.abrupt(\"break\", 19);\n case 7:\n ground = false;\n _context8.next = 10;\n return that.getClampToHeight({\n lng: that.options.positions[0].lng,\n lat: that.options.positions[0].lat\n }, objectsToExclude);\n case 10:\n _context8.t1 = _context8.sent;\n _context8.t2 = that.options.positions[0].alt;\n height = _context8.t1 + _context8.t2;\n return _context8.abrupt(\"break\", 19);\n case 14:\n ground = true;\n _context8.next = 17;\n return that.getClampToHeight({\n lng: that.options.positions[0].lng,\n lat: that.options.positions[0].lat\n }, objectsToExclude);\n case 17:\n height = _context8.sent;\n return _context8.abrupt(\"break\", 19);\n case 19:\n if (!that.options.label.position) {\n that.options.label.position = {\n lng: that.options.positions[0].lng,\n lat: that.options.positions[0].lat,\n alt: height\n };\n }\n that.label = new _LabelObject__WEBPACK_IMPORTED_MODULE_15__[\"default\"](that.sdk, {\n id: that.options.id,\n show: that.options.show ? that.options.label.show : false,\n position: [that.options.label.position.lng, that.options.label.position.lat, that.options.label.position.alt],\n text: that.options.name,\n fontSize: that.options.label.fontSize,\n fontFamily: that.options.label.fontFamily,\n color: that.options.label.color,\n pixelOffset: that.options.label.pixelOffset,\n backgroundColor: that.options.label.backgroundColor,\n lineColor: that.options.label.lineColor,\n lineWidth: that.options.label.lineWidth,\n scaleByDistance: that.options.label.scaleByDistance,\n near: that.options.label.near,\n far: that.options.label.far,\n ground: ground\n });\n case 21:\n case \"end\":\n return _context8.stop();\n }\n }, _callee6);\n }));\n function createLabel(_x3) {\n return _createLabel.apply(this, arguments);\n }\n return createLabel;\n }()\n }, {\n key: \"create\",\n value: function create(that) {\n var ground;\n if (that.heightMode == 2) {\n ground = true;\n } else {\n ground = false;\n }\n var positions = that.options.positions;\n var fromDegreesArray = that.renewPositions(positions);\n that.entity = that.sdk.viewer.entities.add({\n id: that.options.id,\n show: that.options.show,\n polyline: {\n positions: Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray),\n width: that.options.width,\n clampToGround: ground,\n // material: that.getMaterial(that.options.color, that.options.type),\n zIndex: that.sdk._entityZIndex\n }\n });\n that.entity.polyline.oriWidth = that.options.width;\n that.judgeLine(that.entity, that.options);\n var params = _objectSpread({}, that.options);\n params.speed = that.inputSpeed;\n that.entity.polyline.material = that.getMaterial(that.options.color, that.options.type, that.entity, params);\n that.sdk._entityZIndex++;\n CurvelineObject.createLabel(that);\n // that.entity.polyline.positionsLngLat = positions\n that.renewPolygon(fromDegreesArray);\n // that.options.lengthByMeter = that.computeDistance2(that.smoothHandle(positions), 2, ground)\n // that.lengthUnit = that.options['length-unit']\n // syncData(that.sdk, that.options.id)\n // if (that.options.show) {\n // setSplitDirection(0, that.options.id)\n // }\n\n that.computeDistance(that.smoothHandle(positions), 2, that.options.wordsName).then(function (res) {\n that.lengthByMeter = res;\n that.lengthChangeCallBack && that.lengthChangeCallBack();\n Object(_Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_19__[\"syncData\"])(that.sdk, that.options.id);\n });\n if (that.options.show) {\n Object(_Global_SplitScreen__WEBPACK_IMPORTED_MODULE_22__[\"setSplitDirection\"])(0, that.options.id);\n }\n\n // if (this.options.noseToTail) {\n // let array = []\n // for (let i = 0; i < fromDegreesArray.length; i += 2) {\n // array.push({ lng: fromDegreesArray[i], lat: fromDegreesArray[i + 1] })\n // }\n // this.options.fit_length = tool.computeDistance2(array)\n // }\n // else {\n // this.options.fit_length = tool.computeDistance2(positions)\n // }\n // if (this.options.fit_length_unit === 'km') {\n // this.options.fit_length = this.options.fit_length / 1000\n // }\n\n var scene = that.sdk.viewer.scene;\n }\n }]);\n}(_index__WEBPACK_IMPORTED_MODULE_11__[\"default\"]);\n/* harmony default export */ __webpack_exports__[\"default\"] = (CurvelineObject);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvT2JqL0Jhc2UvQ3VydmVsaW5lT2JqZWN0L2luZGV4LmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL09iai9CYXNlL0N1cnZlbGluZU9iamVjdC9pbmRleC5qcz80NDJjIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBAZGVzY3JpcHRpb24g57q/XHJcbiAqL1xyXG5pbXBvcnQgRGlhbG9nIGZyb20gJy4uLy4uL0VsZW1lbnQvRGlhbG9nJ1xyXG5pbXBvcnQgeyBodG1sIH0gZnJvbSAnLi9fZWxlbWVudCdcclxuaW1wb3J0IEJhc2UgZnJvbSAnLi4vaW5kZXgnXHJcbmltcG9ydCBjeV90YWJzIGZyb20gJy4uLy4uL0VsZW1lbnQvY3lfaHRtbF90YWJzJ1xyXG5pbXBvcnQgcmljaFRleHQgZnJvbSAnLi4vLi4vRWxlbWVudC9yaWNoVGV4dCdcclxuaW1wb3J0IEV2ZW50QmluZGluZyBmcm9tICcuL2V2ZW50QmluZGluZydcclxuaW1wb3J0IExhYmVsT2JqZWN0IGZyb20gJy4uL0xhYmVsT2JqZWN0J1xyXG5pbXBvcnQgTW91c2VFdmVudCBmcm9tICcuLi8uLi8uLi9FdmVudC9pbmRleCdcclxuaW1wb3J0IE1vdXNlVGlwIGZyb20gJy4uLy4uLy4uL01vdXNlVGlwJ1xyXG5pbXBvcnQgQ29udHJvbGxlciBmcm9tICcuLi8uLi8uLi9Db250cm9sbGVyL2luZGV4J1xyXG5pbXBvcnQgeyBzeW5jRGF0YSwgZ2V0M0RWaWV3IH0gZnJvbSAnLi4vLi4vLi4vR2xvYmFsL011bHRpVmlld3BvcnRNb2RlJ1xyXG5pbXBvcnQgeyBsZWdwIH0gZnJvbSAnLi4vLi4vRWxlbWVudC9kYXRhbGlzdCdcclxuaW1wb3J0IHsgZ2V0Rm9udExpc3QsIGdldEZvbnRGYW1pbHlOYW1lIH0gZnJvbSAnLi4vLi4vRWxlbWVudC9mb250U2VsZWN0J1xyXG5pbXBvcnQgeyBzZXRTcGxpdERpcmVjdGlvbiwgc3luY1NwbGl0RGF0YSwgc2V0QWN0aXZlSWQgfSBmcm9tICcuLi8uLi8uLi9HbG9iYWwvU3BsaXRTY3JlZW4nXHJcbmltcG9ydCB7IHNldEFjdGl2ZVZpZXdlciwgY2xvc2VSb3RhdGVBcm91bmQsIGNsb3NlVmlld0ZvbGxvdyB9IGZyb20gJy4uLy4uLy4uL0dsb2JhbC9nbG9iYWwnXHJcblxyXG5jbGFzcyBDdXJ2ZWxpbmVPYmplY3QgZXh0ZW5kcyBCYXNlIHtcclxuICAvKipcclxuICAgKiBAY29uc3RydWN0b3JcclxuICAgKiBAcGFyYW0gc2RrXHJcbiAgICogQGRlc2NyaXB0aW9uIOabsue6v1xyXG4gICAqIEBwYXJhbSBvcHRpb25zIHtvYmplY3R9IOe6v+WxnuaAp1xyXG4gICAqIEBwYXJhbSBvcHRpb25zLm5hbWV7c3RyaW5nfSDlkI3np7BcclxuICAgKiBAcGFyYW0gb3B0aW9ucy53aWR0aD0ze251bWJlcn0g57q/5a69XHJcbiAgICogQHBhcmFtIG9wdGlvbnMuY29sb3I9I2ZmMDAwMCB7c3RyaW5nfSDpopzoibJcclxuICAgKiBAcGFyYW0gb3B0aW9ucy50eXBlPTAge251bWJlcn0g5p2Q6LSo57G75Z6LIDAt5a6e57q/IDEt6Jma57q/IDIt5rOb5YWJLi4uXHJcbiAgICogQHBhcmFtIG9wdGlvbnMuaGVpZ2h0TW9kZT0ye251bWJlcn0g6auY5bqm5qih5byP77yIMO+8mua1t+aLlOmrmOW6pu+8mzHvvJrnm7jlr7npq5jluqbvvJsy77ya5L6d6ZmE5qih5byP77yJXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubm9zZVRvVGFpbD1mYWxzZSB7Ym9vbGVhbn0g6aaW5bC+55u46L+eXHJcbiAgICogQHBhcmFtIG9wdGlvbnMuZXh0ZW5kPWZhbHNlIHtib29sZWFufSDnur/nvJPlhrJcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5leHRlbmRXaWR0aD0xMCB7bnVtYmVyfSDnur/nvJPlhrLlrr3luqZcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5leHRlbmRDb2xvcj1yZ2JhKDI1NSwyNTUsODAsMC4zKSB7bnVtYmVyfSDnur/nvJPlhrLpopzoibJcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5zaG93PXRydWUge2Jvb2xlYW59IOaYvumakFxyXG4gICAqIEBwYXJhbSB7QXJyYXkuPG9iamVjdD59IG9wdGlvbnMucG9zaXRpb25zIOW/heWhq++8jOe7j+e6rOW6puWSjOmrmOW6pueahOWIl+ihqO+8jOWAvOS6pOabvyBbe2xvbixsYXQsYWx0fSwuLi5dXHJcbiAgICogQHBhcmFtIG9wdGlvbnMucG9zaXRpb25zW10ubG5nIHtudW1iZXJ9IOe7j+W6plxyXG4gICAqIEBwYXJhbSBvcHRpb25zLnBvc2l0aW9uc1tdLmxhdCB7bnVtYmVyfSDnuqzluqZcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5wb3NpdGlvbnNbXS5hbHQge251bWJlcn0g6auY5bqmXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwge29iamVjdH0g5qCH562+5a+56LGhXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwudGV4dCB7c3RyaW5nfSDmoIfnrb7mlofmnKxcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5sYWJlbC5zaG93IHtzdHJpbmd9IOagh+etvuaYvumakFxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLnBvc2l0aW9uIHtzdHJpbmd9IOagh+etvuS9jee9rlxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLnBvc2l0aW9uIHtvYmplY3R9IOagh+etvuS9jee9rlxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLnBvc2l0aW9uLmxuZyB7bnVtYmVyfSDnu4/luqZcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5sYWJlbC5wb3NpdGlvbi5sYXQge251bWJlcn0g57qs5bqmXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwucG9zaXRpb24uYWx0IHtudW1iZXJ9IOmrmOW6plxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLmZvbnRTaXplPTIwIHtudW1iZXJ9IOWtl+S9k+Wkp+Wwj1xyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLmZvbnRGYW1pbHk9MCB7bnVtYmVyfSDlrZfkvZPpobkgMO+8mum7keS9k++8mzHvvJrmgJ3mupDpu5HkvZPvvJsy77ya5bqe6Zeo5q2j6YGT5qCH6aKY5L2T77ybM++8muaVsOm7keS9k1xyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLmNvbG9yPSNmZmZmZmYge3N0cmluZ30g5a2X5L2T6aKc6ImyXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwubGluZVdpZHRoPTQge251bWJlcn0g5byV57q/5a69XHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwubGluZUNvbG9yPSMwMGZmZmY4MCB7c3RyaW5nfSDlvJXnur/popzoibJcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5sYWJlbC5waXhlbE9mZnNldD0yMCB7bnVtYmVyfSDlrZfkvZPlgY/np7so5byV57q/6ZW/5bqmKVxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLmJhY2tncm91bmRDb2xvcj1bJyMwMGZmZmY4MCcsICcjMDBmZmZmODAnXSB7YXJyYXl9IOiDjOaZr+minOiJslxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLnNjYWxlQnlEaXN0YW5jZSB7Ym9vbGVhbn0g6Led56a757yp5pS+XHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwubmVhcj0yMDAwIHtudW1iZXJ9IOinhumHjue8qeaUvuacgOi/kei3neemu1xyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLmZhcj0xMDAwMDAge251bWJlcn0g6KeG6YeO57yp5pS+5pyA6L+c6Led56a7XHJcbiAgICogQHBhcmFtIG9wdGlvbnMuYXR0cmlidXRlIHtvYmplY3R9IOWxnuaAp+WGheWuuVxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmF0dHJpYnV0ZS5saW5rPXt9IHtzdHJpbmd9IOmTvuaOpVxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnQ9W11dIHthcnJheX0g6ZO+5o6l5YaF5a65XHJcbiAgICogQHBhcmFtIG9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudFtdLm5hbWUge3N0cmluZ30g6ZO+5o6l5ZCN56ewXHJcbiAgICogQHBhcmFtIG9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudFtdLnVybCB7c3RyaW5nfSDpk77mjqXlnLDlnYBcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5yaWNoVGV4dENvbnRlbnQge3N0cmluZ30g5a+M5paH5pys5YaF5a65XHJcbiAgICogQHBhcmFtIG9wdGlvbnMuY3VzdG9tVmlldyB7b2JqZWN0fSDpu5jorqTop4bop5JcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5jdXN0b21WaWV3Lm9yaWVudGF0aW9uIHtvYmplY3R9IOm7mOiupOinhuinkuaWueS9jVxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmN1c3RvbVZpZXcub3JpZW50YXRpb24uaGVhZGluZyB7bnVtYmVyfSDoiKrlkJHop5JcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5jdXN0b21WaWV3Lm9yaWVudGF0aW9uLnBpdGNoIHtudW1iZXJ9IOS/r+S7sOinklxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmN1c3RvbVZpZXcub3JpZW50YXRpb24ucm9sbCB7bnVtYmVyfSDnv7vmu5rop5JcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5jdXN0b21WaWV3LnJlbGF0aXZlUG9zaXRpb24ge29iamVjdH0g6KeG6KeS55u45a+55L2N572uXHJcbiAgICogQHBhcmFtIG9wdGlvbnMuY3VzdG9tVmlldy5yZWxhdGl2ZVBvc2l0aW9uLmxuZyB7bnVtYmVyfSDnu4/luqZcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5jdXN0b21WaWV3LnJlbGF0aXZlUG9zaXRpb24ubGF0IHtudW1iZXJ9IOe6rOW6plxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmN1c3RvbVZpZXcucmVsYXRpdmVQb3NpdGlvbi5hbHQge251bWJlcn0g6auY5bqmXHJcbiAgICogXHJcbiAgICogXHJcbiAgICogQHBhcmFtIF9EaWFsb2cge29iamVjdH0g5by55qGG5LqL5Lu2XHJcbiAgICogQHBhcmFtIF9EaWFsb2cuY29uZmlybUNhbGxCYWNrIHtmdW5jdGlvbn0g5by55qGG56Gu6K6k5pe255qE5Zue6LCDXHJcbiAgICogKi9cclxuICBjb25zdHJ1Y3RvcihzZGssIG9wdGlvbnMgPSB7fSwgX0RpYWxvZyA9IHt9KSB7XHJcbiAgICBzdXBlcihzZGssIG9wdGlvbnMpXHJcbiAgICB0aGlzLm9wdGlvbnMubmFtZSA9IG9wdGlvbnMubmFtZSB8fCAn5pyq5ZG95ZCN5a+56LGhJ1xyXG4gICAgdGhpcy5vcHRpb25zLndpZHRoID0gKChvcHRpb25zLndpZHRoIHx8IG9wdGlvbnMud2lkdGggPT09IDApID8gb3B0aW9ucy53aWR0aCA6IDMpXHJcbiAgICB0aGlzLm9wdGlvbnMuY29sb3IgPSBvcHRpb25zLmNvbG9yIHx8ICcjZmYwMDAwJ1xyXG4gICAgdGhpcy5vcHRpb25zLnR5cGUgPSBvcHRpb25zLnR5cGUgPyBOdW1iZXIob3B0aW9ucy50eXBlKSA6IDBcclxuICAgIHRoaXMub3B0aW9ucy5ub3NlVG9UYWlsID0gb3B0aW9ucy5ub3NlVG9UYWlsIHx8IGZhbHNlXHJcbiAgICB0aGlzLm9wdGlvbnMuZXh0ZW5kID0gb3B0aW9ucy5leHRlbmQgfHwgZmFsc2VcclxuICAgIHRoaXMub3B0aW9ucy5yb3RhdGUgPSAob3B0aW9ucy5yb3RhdGUgfHwgb3B0aW9ucy5yb3RhdGUgPT09IGZhbHNlKSA/IG9wdGlvbnMucm90YXRlIDogdHJ1ZVxyXG4gICAgdGhpcy5vcHRpb25zLnNwYWNlID0gb3B0aW9ucy5zcGFjZSB8fCAxXHJcbiAgICB0aGlzLm9wdGlvbnMuc3BlZWQgPSBvcHRpb25zLnNwZWVkIHx8IDEwXHJcbiAgICAvLyB0aGlzLm9wdGlvbnMuZGFzaFNpemUgPSBvcHRpb25zLmRhc2hTaXplIHx8IDAuMDNcclxuICAgIHRoaXMub3B0aW9ucy53b3Jkc05hbWUgPSBvcHRpb25zLndvcmRzTmFtZSB8fCAwXHJcbiAgICB0aGlzLm9wdGlvbnMuZXh0ZW5kV2lkdGggPVxyXG4gICAgICBvcHRpb25zLmV4dGVuZFdpZHRoIHx8IG9wdGlvbnMuZXh0ZW5kV2lkdGggPT09IDBcclxuICAgICAgICA/IG9wdGlvbnMuZXh0ZW5kV2lkdGhcclxuICAgICAgICA6IDEwXHJcbiAgICB0aGlzLm9wdGlvbnMuZXh0ZW5kQ29sb3IgPSBvcHRpb25zLmV4dGVuZENvbG9yIHx8ICdyZ2JhKDI1NSwyNTUsODAsMC4zKSdcclxuICAgIHRoaXMub3B0aW9ucy5zaG93ID1cclxuICAgICAgb3B0aW9ucy5zaG93IHx8IG9wdGlvbnMuc2hvdyA9PT0gZmFsc2UgPyBvcHRpb25zLnNob3cgOiB0cnVlXHJcbiAgICB0aGlzLm9wdGlvbnMuaGVpZ2h0TW9kZSA9IChvcHRpb25zLmhlaWdodE1vZGUgfHwgb3B0aW9ucy5oZWlnaHRNb2RlID09IDApID8gb3B0aW9ucy5oZWlnaHRNb2RlIDogMlxyXG4gICAgdGhpcy5fZWxtcyA9IFtdXHJcbiAgICBvcHRpb25zLmxhYmVsID0gb3B0aW9ucy5sYWJlbCB8fCB7fVxyXG4gICAgdGhpcy5vcHRpb25zLmxhYmVsID0ge1xyXG4gICAgICB0ZXh0OiB0aGlzLm9wdGlvbnMubmFtZSxcclxuICAgICAgc2hvdzogb3B0aW9ucy5sYWJlbC5zaG93IHx8IGZhbHNlLFxyXG4gICAgICBwb3NpdGlvbjogb3B0aW9ucy5sYWJlbC5wb3NpdGlvbixcclxuICAgICAgZm9udFNpemU6XHJcbiAgICAgICAgb3B0aW9ucy5sYWJlbC5mb250U2l6ZSB8fCBvcHRpb25zLmxhYmVsLmZvbnRTaXplID09PSAwXHJcbiAgICAgICAgICA/IG9wdGlvbnMubGFiZWwuZm9udFNpemVcclxuICAgICAgICAgIDogMjAsXHJcbiAgICAgIGZvbnRGYW1pbHk6IG9wdGlvbnMubGFiZWwuZm9udEZhbWlseSA/IG9wdGlvbnMubGFiZWwuZm9udEZhbWlseSA6IDAsXHJcbiAgICAgIGNvbG9yOiBvcHRpb25zLmxhYmVsLmNvbG9yIHx8ICcjZmZmZmZmJyxcclxuICAgICAgbGluZVdpZHRoOlxyXG4gICAgICAgIG9wdGlvbnMubGFiZWwubGluZVdpZHRoIHx8IG9wdGlvbnMubGFiZWwubGluZVdpZHRoID09PSAwXHJcbiAgICAgICAgICA/IG9wdGlvbnMubGFiZWwubGluZVdpZHRoXHJcbiAgICAgICAgICA6IDQsXHJcbiAgICAgIHBpeGVsT2Zmc2V0OlxyXG4gICAgICAgIG9wdGlvbnMubGFiZWwucGl4ZWxPZmZzZXQgfHwgb3B0aW9ucy5sYWJlbC5waXhlbE9mZnNldCA9PT0gMFxyXG4gICAgICAgICAgPyBvcHRpb25zLmxhYmVsLnBpeGVsT2Zmc2V0XHJcbiAgICAgICAgICA6IDIwLFxyXG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6IG9wdGlvbnMubGFiZWwuYmFja2dyb3VuZENvbG9yIHx8IFsnIzAwZmZmZjgwJywgJyMwMGZmZmY4MCddLFxyXG4gICAgICBsaW5lQ29sb3I6IG9wdGlvbnMubGFiZWwubGluZUNvbG9yIHx8ICcjMDBmZmZmODAnLFxyXG4gICAgICBzY2FsZUJ5RGlzdGFuY2U6IG9wdGlvbnMubGFiZWwuc2NhbGVCeURpc3RhbmNlIHx8IGZhbHNlLFxyXG4gICAgICBuZWFyOlxyXG4gICAgICAgIG9wdGlvbnMubGFiZWwubmVhciB8fCBvcHRpb25zLmxhYmVsLm5lYXIgPT09IDBcclxuICAgICAgICAgID8gb3B0aW9ucy5sYWJlbC5uZWFyXHJcbiAgICAgICAgICA6IDIwMDAsXHJcbiAgICAgIGZhcjpcclxuICAgICAgICBvcHRpb25zLmxhYmVsLmZhciB8fCBvcHRpb25zLmxhYmVsLmZhciA9PT0gMFxyXG4gICAgICAgICAgPyBvcHRpb25zLmxhYmVsLmZhclxyXG4gICAgICAgICAgOiAxMDAwMDBcclxuICAgIH1cclxuICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUgPSBvcHRpb25zLmF0dHJpYnV0ZSB8fCB7fVxyXG4gICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rIHx8IHt9XHJcbiAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudCA9XHJcbiAgICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50IHx8IFtdXHJcbiAgICAvLyB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmNhbWVyYSA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUuY2FtZXJhIHx8IHt9XHJcbiAgICAvLyB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmNhbWVyYS5jb250ZW50ID1cclxuICAgIC8vICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5jYW1lcmEuY29udGVudCB8fCBbXVxyXG4gICAgLy8gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52ciA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIgfHwge31cclxuICAgIC8vIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudCA9XHJcbiAgICAvLyAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudCB8fCBbXVxyXG4gICAgLy8gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5nb29kcyA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUuZ29vZHMgfHwge31cclxuICAgIC8vIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUuZ29vZHMuY29udGVudCA9XHJcbiAgICAvLyAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUuZ29vZHMuY29udGVudCB8fCBbXVxyXG5cclxuXHJcbiAgICAgIGRlbGV0ZSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmNhbWVyYVxyXG4gICAgICBkZWxldGUgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52clxyXG4gICAgICBkZWxldGUgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5nb29kc1xyXG5cclxuXHJcbiAgICB0aGlzLm9wZXJhdGUgPSB7fVxyXG4gICAgdGhpcy5ub2RlUG9pbnRzID0gW11cclxuICAgIHRoaXMudW5pdE51bSA9IDBcclxuICAgIHRoaXMuaW5wdXRTcGVlZCA9IChvcHRpb25zLnNwZWVkICYmIE1hdGgucG93KG9wdGlvbnMuc3BlZWQsIC0xKSAqIDEwMCkgfHwgMTBcclxuICAgIHRoaXMuRGlhbG9nID0gX0RpYWxvZ1xyXG4gICAgaWYgKCF0aGlzLm9wdGlvbnMucG9zaXRpb25zIHx8IHRoaXMub3B0aW9ucy5wb3NpdGlvbnMubGVuZ3RoIDwgMikge1xyXG4gICAgICB0aGlzLl9lcnJvciA9ICfnur/mrrXmnIDlsJHpnIDopoHkuKTkuKrlnZDmoIfvvIEnXHJcbiAgICAgIGNvbnNvbGUud2Fybih0aGlzLl9lcnJvcilcclxuICAgICAgd2luZG93LkVMRU1FTlQgJiZcclxuICAgICAgICB3aW5kb3cuRUxFTUVOVC5NZXNzYWdlKHtcclxuICAgICAgICAgIG1lc3NhZ2U6IHRoaXMuX2Vycm9yLFxyXG4gICAgICAgICAgdHlwZTogJ3dhcm5pbmcnLFxyXG4gICAgICAgICAgZHVyYXRpb246IDE1MDBcclxuICAgICAgICB9KVxyXG4gICAgfSBlbHNlIHtcclxuXHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5vcHRpb25zLnBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubG5nID0gTnVtYmVyKE51bWJlcih0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxuZykudG9GaXhlZCg4KSlcclxuICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxhdCA9IE51bWJlcihOdW1iZXIodGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sYXQpLnRvRml4ZWQoOCkpXHJcbiAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5hbHQgPSBOdW1iZXIoTnVtYmVyKHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0uYWx0KS50b0ZpeGVkKDIpKVxyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLnNkay5hZGRJbmNldGFuY2UodGhpcy5vcHRpb25zLmlkLCB0aGlzKVxyXG4gICAgICBDdXJ2ZWxpbmVPYmplY3QuY3JlYXRlKHRoaXMpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgY29sb3IoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmNvbG9yXHJcbiAgfVxyXG4gIHNldCBjb2xvcih2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMuY29sb3IgPSB2IHx8ICcjZmYwMDAwJ1xyXG4gICAgLy8gdGhpcy5lbnRpdHkucG9seWxpbmUubWF0ZXJpYWwgPSB0aGlzLmdldE1hdGVyaWFsKHYsIHRoaXMub3B0aW9ucy50eXBlKVxyXG4gICAgbGV0IHBhcmFtcyA9IHsgLi4udGhpcy5vcHRpb25zIH1cclxuICAgIHBhcmFtcy5zcGVlZCA9IHRoaXMuaW5wdXRTcGVlZFxyXG4gICAgLy8gdGhpcy5lbnRpdHkucG9seWxpbmUubWF0ZXJpYWwgPSB0aGlzLmdldE1hdGVyaWFsKHRoaXMub3B0aW9ucy5jb2xvciwgdGhpcy5vcHRpb25zLnR5cGUsIHRoaXMuZW50aXR5LCB0aGlzLm9wdGlvbnMpXHJcbiAgICB0aGlzLmVudGl0eS5wb2x5bGluZS5tYXRlcmlhbCA9IHRoaXMuZ2V0TWF0ZXJpYWwodGhpcy5vcHRpb25zLmNvbG9yLCB0aGlzLm9wdGlvbnMudHlwZSwgdGhpcy5lbnRpdHksIHBhcmFtcylcclxuICAgIGlmICh0aGlzLl9lbG1zLmNvbG9yKSB7XHJcbiAgICAgIHRoaXMuX2VsbXMuY29sb3IuZm9yRWFjaCgoaXRlbSwgaSkgPT4ge1xyXG4gICAgICAgIGxldCBjb2xvclBpY2tlciA9IG5ldyBZSkNvbG9yUGlja2VyKHtcclxuICAgICAgICAgIGVsOiBpdGVtLmVsLFxyXG4gICAgICAgICAgc2l6ZTogJ21pbmknLCAvL+minOiJsmJveOexu+Wei1xyXG4gICAgICAgICAgYWxwaGE6IHRydWUsIC8v5piv5ZCm5byA5ZCv6YCP5piO5bqmXHJcbiAgICAgICAgICBkZWZhdWx0Q29sb3I6IHRoaXMub3B0aW9ucy5jb2xvcixcclxuICAgICAgICAgIGRpc2FibGVkOiBmYWxzZSwgLy/mmK/lkKbnpoHmraLmiZPlvIDpopzoibLpgInmi6nlmahcclxuICAgICAgICAgIG9wZW5QaWNrZXJBbmk6ICdvcGFjaXR5JywgLy/miZPlvIDpopzoibLpgInmi6nlmajliqjnlLtcclxuICAgICAgICAgIHN1cmU6IGMgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmNvbG9yID0gY1xyXG4gICAgICAgICAgfSwgLy/ngrnlh7vnoa7orqTmjInpkq7kuovku7blm57osINcclxuICAgICAgICAgIGNsZWFyOiAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuY29sb3IgPSAncmdiYSgyNTUsMCwwLDEpJ1xyXG4gICAgICAgICAgfSAvL+eCueWHu+a4heepuuaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgdGhpcy5fZWxtcy5jb2xvcltpXSA9IGNvbG9yUGlja2VyXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgfVxyXG4gIGdldCBzcGVlZCgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuc3BlZWRcclxuICB9XHJcblxyXG4gIHNldCBzcGVlZCh2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMuc3BlZWQgPSB2XHJcbiAgICAvLyB0aGlzLm9wdGlvbnMuc3BlZWQgPSB2ICE9PSAwID8gTWF0aC5wb3codiwgLTEpICogMTAwIDogMFxyXG4gICAgdGhpcy5pbnB1dFNwZWVkID0gdiAhPT0gMCA/IE1hdGgucG93KHYsIC0xKSAqIDEwMCA6IDBcclxuICAgIGxldCBwYXJhbXMgPSB7IC4uLnRoaXMub3B0aW9ucyB9XHJcbiAgICBwYXJhbXMuc3BlZWQgPSB0aGlzLmlucHV0U3BlZWRcclxuICAgIC8vIHRoaXMuZW50aXR5LnBvbHlsaW5lLm1hdGVyaWFsID0gdGhpcy5nZXRNYXRlcmlhbCh0aGlzLm9wdGlvbnMuY29sb3IsIHRoaXMub3B0aW9ucy50eXBlLCB0aGlzLmVudGl0eSwgdGhpcy5vcHRpb25zKVxyXG4gICAgdGhpcy5lbnRpdHkucG9seWxpbmUubWF0ZXJpYWwgPSB0aGlzLmdldE1hdGVyaWFsKHRoaXMub3B0aW9ucy5jb2xvciwgdGhpcy5vcHRpb25zLnR5cGUsIHRoaXMuZW50aXR5LCBwYXJhbXMpXHJcbiAgfVxyXG4gIC8vIGdldCBkYXNoU2l6ZSgpIHtcclxuICAvLyAgIHJldHVybiB0aGlzLm9wdGlvbnMuZGFzaFNpemVcclxuICAvLyB9XHJcblxyXG4gIC8vIHNldCBkYXNoU2l6ZSh2KSB7XHJcbiAgLy8gICB0aGlzLm9wdGlvbnMuZGFzaFNpemUgPSB2XHJcbiAgLy8gICBsZXQgcGFyYW1zID0geyAuLi50aGlzLm9wdGlvbnMgfVxyXG4gIC8vICAgcGFyYW1zLnNwZWVkID0gdGhpcy5pbnB1dFNwZWVkXHJcbiAgLy8gICAvLyB0aGlzLmVudGl0eS5wb2x5bGluZS5tYXRlcmlhbCA9IHRoaXMuZ2V0TWF0ZXJpYWwodGhpcy5vcHRpb25zLmNvbG9yLCB0aGlzLm9wdGlvbnMudHlwZSwgdGhpcy5lbnRpdHksIHRoaXMub3B0aW9ucylcclxuICAvLyAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLm1hdGVyaWFsID0gdGhpcy5nZXRNYXRlcmlhbCh0aGlzLm9wdGlvbnMuY29sb3IsIHRoaXMub3B0aW9ucy50eXBlLCB0aGlzLmVudGl0eSwgcGFyYW1zKVxyXG4gIC8vIH1cclxuXHJcbiAgZ2V0IHJvdGF0ZSgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMucm90YXRlXHJcbiAgfVxyXG5cclxuICBzZXQgcm90YXRlKHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5yb3RhdGUgPSB2XHJcbiAgICB0aGlzLmNsb3NlTm9kZUVkaXQoKVxyXG4gICAgdGhpcy5fZWxtcy5yb3RhdGUgJiZcclxuICAgICAgdGhpcy5fZWxtcy5yb3RhdGUuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICBpdGVtLmNoZWNrZWQgPSB2XHJcbiAgICAgIH0pXHJcblxyXG4gICAgdGhpcy5vcHRpb25zLnJvdGF0ZSA9IHZcclxuICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLm1hdGVyaWFsID0gdGhpcy5nZXRNYXRlcmlhbCh0aGlzLm9wdGlvbnMuY29sb3IsIHRoaXMub3B0aW9ucy50eXBlLCB0aGlzLmVudGl0eSwgdGhpcy5vcHRpb25zKVxyXG4gIH1cclxuXHJcbiAgZ2V0IHNwYWNlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5zcGFjZVxyXG4gIH1cclxuXHJcbiAgc2V0IHNwYWNlKHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5zcGFjZSA9IHZcclxuICAgIGxldCBwYXJhbXMgPSB7IC4uLnRoaXMub3B0aW9ucyB9XHJcbiAgICBwYXJhbXMuc3BlZWQgPSB0aGlzLmlucHV0U3BlZWRcclxuICAgIC8vIHRoaXMuZW50aXR5LnBvbHlsaW5lLm1hdGVyaWFsID0gdGhpcy5nZXRNYXRlcmlhbCh0aGlzLm9wdGlvbnMuY29sb3IsIHRoaXMub3B0aW9ucy50eXBlLCB0aGlzLmVudGl0eSwgdGhpcy5vcHRpb25zKVxyXG4gICAgdGhpcy5lbnRpdHkucG9seWxpbmUubWF0ZXJpYWwgPSB0aGlzLmdldE1hdGVyaWFsKHRoaXMub3B0aW9ucy5jb2xvciwgdGhpcy5vcHRpb25zLnR5cGUsIHRoaXMuZW50aXR5LCBwYXJhbXMpXHJcbiAgfVxyXG5cclxuICBnZXQgd29yZHNOYW1lKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy53b3Jkc05hbWVcclxuICB9XHJcbiAgc2V0IHdvcmRzTmFtZSh2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMud29yZHNOYW1lID0gdlxyXG5cclxuICAgIGxldCBfdGhpcyA9IHRoaXNcclxuICAgIGlmICghdGhpcy5ub3NlVG9UYWlsKSB7XHJcbiAgICAgIHRoaXMuY29tcHV0ZURpc3RhbmNlKFxyXG4gICAgICAgIHRoaXMuc21vb3RoSGFuZGxlKHRoaXMub3B0aW9ucy5wb3NpdGlvbnMpLFxyXG4gICAgICAgIDIsXHJcbiAgICAgICAgdlxyXG4gICAgICApLnRoZW4ocmVzID0+IHtcclxuICAgICAgICBfdGhpcy5sZW5ndGhCeU1ldGVyID0gcmVzXHJcbiAgICAgICAgdGhpcy5sZW5ndGhDaGFuZ2VDYWxsQmFjayAmJiB0aGlzLmxlbmd0aENoYW5nZUNhbGxCYWNrKClcclxuICAgICAgfSlcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGxldCBmcm9tRGVncmVlc0FycmF5ID0gdGhpcy5yZW5ld1Bvc2l0aW9ucyh0aGlzLm9wdGlvbnMucG9zaXRpb25zKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gZ2V0IGZpdExlbmd0aFVuaXQoKSB7XHJcbiAgLy8gICByZXR1cm4gdGhpcy5vcHRpb25zWydmaXQtbGVuZ3RoLXVuaXQnXVxyXG4gIC8vIH1cclxuICAvLyBzZXQgZml0TGVuZ3RoVW5pdCh2KSB7XHJcbiAgLy8gICB0aGlzLm9wdGlvbnNbJ2ZpdC1sZW5ndGgtdW5pdCddID0gdlxyXG4gIC8vICAgdGhpcy5fZWxtcy5maXRMZW5ndGhVbml0ICYmXHJcbiAgLy8gICAgIHRoaXMuX2VsbXMuZml0TGVuZ3RoVW5pdC5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gIC8vICAgICAgIGl0ZW0udmFsdWUgPSB2XHJcbiAgLy8gICAgIH0pXHJcbiAgLy8gICBpZiAodGhpcy5vcHRpb25zLmZpdExlbmd0aEJ5TWV0ZXIpIHtcclxuICAvLyAgICAgc3dpdGNoICh2KSB7XHJcbiAgLy8gICAgICAgY2FzZSAn57GzJzpcclxuICAvLyAgICAgICAgIHRoaXMuZml0TGVuZ3RoID0gdGhpcy5vcHRpb25zLmZpdExlbmd0aEJ5TWV0ZXJcclxuICAvLyAgICAgICAgIGJyZWFrXHJcbiAgLy8gICAgICAgY2FzZSAn5Y2D57GzJzpcclxuICAvLyAgICAgICAgIHRoaXMuZml0TGVuZ3RoID0gTnVtYmVyKFxyXG4gIC8vICAgICAgICAgICAodGhpcy5vcHRpb25zLmZpdExlbmd0aEJ5TWV0ZXIgLyAxMDAwKS50b0ZpeGVkKDUpXHJcbiAgLy8gICAgICAgICApXHJcbiAgLy8gICAgICAgICBicmVha1xyXG4gIC8vICAgICAgIGRlZmF1bHQ6XHJcbiAgLy8gICAgICAgICB0aGlzLmZpdExlbmd0aCA9IHRoaXMub3B0aW9ucy5maXRMZW5ndGhCeU1ldGVyXHJcbiAgLy8gICAgIH1cclxuICAvLyAgIH1cclxuICAvLyB9XHJcblxyXG4gIGdldCBsaW5lV2lkdGgoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLndpZHRoXHJcbiAgfVxyXG5cclxuICBzZXQgbGluZVdpZHRoKHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy53aWR0aCA9ICh2IHx8IHYgPT0gMCkgPyB2IDogM1xyXG4gICAgdGhpcy5fZWxtcy5saW5lV2lkdGggJiZcclxuICAgICAgdGhpcy5fZWxtcy5saW5lV2lkdGguZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICBpdGVtLnZhbHVlID0gdGhpcy5vcHRpb25zLndpZHRoXHJcbiAgICAgIH0pXHJcbiAgICBpZiAodGhpcy5lbnRpdHkgJiYgdGhpcy5lbnRpdHkucG9seWxpbmUpIHtcclxuICAgICAgdGhpcy5lbnRpdHkucG9seWxpbmUud2lkdGggPSB0aGlzLmVudGl0eS5wb2x5bGluZS53aWR0aCArIHYgLSB0aGlzLmVudGl0eS5wb2x5bGluZS5vcmlXaWR0aFxyXG4gICAgICB0aGlzLmVudGl0eS5wb2x5bGluZS5vcmlXaWR0aCA9IHRoaXMub3B0aW9ucy53aWR0aFxyXG4gICAgfVxyXG4gICAgLy8gdGhpcy5lbnRpdHkgJiZcclxuICAgIC8vICAgdGhpcy5lbnRpdHkucG9seWxpbmUgJiZcclxuICAgIC8vICAgKHRoaXMuZW50aXR5LnBvbHlsaW5lLndpZHRoID0gdGhpcy5vcHRpb25zLndpZHRoKSAmJiAodGhpcy5lbnRpdHkucG9seWxpbmUub3JpV2lkdGggPSB0aGlzLm9wdGlvbnMud2lkdGgpXHJcbiAgfVxyXG5cclxuICBnZXQgbGluZVR5cGUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLnR5cGVcclxuICB9XHJcblxyXG4gIHNldCBsaW5lVHlwZSh2KSB7XHJcbiAgICBsZXQgbGluZVR5cGVEYXRhID0gW1xyXG4gICAgICB7XHJcbiAgICAgICAgbmFtZTogJzxpIGNsYXNzPVwiaWNvbiBsaW5lXCI+PC9pPuWunue6vycsXHJcbiAgICAgICAgdmFsdWU6ICflrp7nur8nLFxyXG4gICAgICAgIGtleTogMCxcclxuICAgICAgICBpY29uOiAnbGluZSdcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIG5hbWU6ICc8aSBjbGFzcz1cImljb24gZGFzaC1saW5lXCI+PC9pPuiZmue6vycsXHJcbiAgICAgICAgdmFsdWU6ICfomZrnur8nLFxyXG4gICAgICAgIGtleTogMSxcclxuICAgICAgICBpY29uOiAnZGFzaC1saW5lJ1xyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgbmFtZTogJzxpIGNsYXNzPVwiaWNvbiBsaWdodC1saW5lXCI+PC9pPuazm+WFiScsXHJcbiAgICAgICAgdmFsdWU6ICfms5vlhYknLFxyXG4gICAgICAgIGtleTogMixcclxuICAgICAgICBpY29uOiAnbGlnaHQtbGluZSdcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIG5hbWU6ICc8aSBjbGFzcz1cImljb24gdGFpbC1saW5lXCI+PC9pPuWwvui/ueWFiee6vycsXHJcbiAgICAgICAgdmFsdWU6ICflsL7ov7nlhYnnur8nLFxyXG4gICAgICAgIGtleTogMyxcclxuICAgICAgICBpY29uOiAndGFpbC1saW5lJ1xyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgbmFtZTogJzxpIGNsYXNzPVwiaWNvbiBtdWx0LXRhaWwtbGluZVwiPjwvaT7lpJrlsL7ov7nlhYnnur8nLFxyXG4gICAgICAgIHZhbHVlOiAn5aSa5bC+6L+55YWJ57q/JyxcclxuICAgICAgICBrZXk6IDQsXHJcbiAgICAgICAgaWNvbjogJ211bHQtdGFpbC1saW5lJ1xyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgbmFtZTogJzxpIGNsYXNzPVwiaWNvbiBmbG93LWRhc2gtbGluZTFcIj48L2k+5rWB5Yqo6Jma57q/MScsXHJcbiAgICAgICAgdmFsdWU6ICfmtYHliqjomZrnur8xJyxcclxuICAgICAgICBrZXk6IDUsXHJcbiAgICAgICAgaWNvbjogJ2Zsb3ctZGFzaC1saW5lMSdcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIG5hbWU6ICc8aSBjbGFzcz1cImljb24gZmxvdy1kYXNoLWxpbmUyXCI+PC9pPua1geWKqOiZmue6vzInLFxyXG4gICAgICAgIHZhbHVlOiAn5rWB5Yqo6Jma57q/MicsXHJcbiAgICAgICAga2V5OiA2LFxyXG4gICAgICAgIGljb246ICdmbG93LWRhc2gtbGluZTInXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBuYW1lOiAnPGkgY2xhc3M9XCJpY29uIHBpYy1saW5lMVwiPjwvaT7mtYHliqjnrq3lpLQxJyxcclxuICAgICAgICB2YWx1ZTogJ+a1geWKqOeureWktDEnLFxyXG4gICAgICAgIGtleTogNyxcclxuICAgICAgICBpY29uOiAncGljLWxpbmUxJ1xyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgbmFtZTogJzxpIGNsYXNzPVwiaWNvbiBwaWMtbGluZTJcIj48L2k+5rWB5Yqo566t5aS0MicsXHJcbiAgICAgICAgdmFsdWU6ICfmtYHliqjnrq3lpLQyJyxcclxuICAgICAgICBrZXk6IDgsXHJcbiAgICAgICAgaWNvbjogJ3BpYy1saW5lMidcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIG5hbWU6ICc8aSBjbGFzcz1cImljb24gcGljLWxpbmUzXCI+PC9pPua1geWKqOeureWktDMnLFxyXG4gICAgICAgIHZhbHVlOiAn5rWB5Yqo566t5aS0MycsXHJcbiAgICAgICAga2V5OiA5LFxyXG4gICAgICAgIGljb246ICdwaWMtbGluZTMnXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBuYW1lOiAnPGkgY2xhc3M9XCJpY29uIHBpYy1saW5lNFwiPjwvaT7mtYHliqjnrq3lpLQ0JyxcclxuICAgICAgICB2YWx1ZTogJ+a1geWKqOeureWktDQnLFxyXG4gICAgICAgIGtleTogMTAsXHJcbiAgICAgICAgaWNvbjogJ3BpYy1saW5lNCdcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIG5hbWU6ICc8aSBjbGFzcz1cImljb24gcGljLWxpbmU1XCI+PC9pPua1geWKqOeureWktDUnLFxyXG4gICAgICAgIHZhbHVlOiAn5rWB5Yqo566t5aS0NScsXHJcbiAgICAgICAga2V5OiAxMSxcclxuICAgICAgICBpY29uOiAncGljLWxpbmU1J1xyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgbmFtZTogJzxpIGNsYXNzPVwiaWNvbiBwaWMtbGluZTZcIj48L2k+5rWB5Yqo566t5aS0NicsXHJcbiAgICAgICAgdmFsdWU6ICfmtYHliqjnrq3lpLQ2JyxcclxuICAgICAgICBrZXk6IDEyLFxyXG4gICAgICAgIGljb246ICdwaWMtbGluZTYnXHJcbiAgICAgIH1cclxuICAgIF1cclxuICAgIHRoaXMub3B0aW9ucy50eXBlID0gTnVtYmVyKHYpXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmVUeXBlRGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICBpZiAobGluZVR5cGVEYXRhW2ldLmtleSA9PT0gTnVtYmVyKHYpKSB7XHJcbiAgICAgICAgdGhpcy5fZWxtcy5saW5lVHlwZSAmJlxyXG4gICAgICAgICAgdGhpcy5fZWxtcy5saW5lVHlwZS5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICBpdGVtLnZhbHVlID0gbGluZVR5cGVEYXRhW2ldLnZhbHVlXHJcbiAgICAgICAgICAgIGlmICgyIDwgaXRlbS52YWx1ZSAmJiBpdGVtLnZhbHVlIDwgMTMpIHsvL+i0tOWbvuWPguaVsFxyXG4gICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkYXNoVGV4dHVyZURvbScpICYmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGFzaFRleHR1cmVEb20nKS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnKVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkYXNoVGV4dHVyZURvbScpICYmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGFzaFRleHR1cmVEb20nKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICgyIDwgaXRlbS52YWx1ZSAmJiBpdGVtLnZhbHVlIDwgNSkgey8v5bC+6L+55Y+C5pWwXHJcbiAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbGluZVNwYWNlJylbMF0gJiYgKGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xpbmVTcGFjZScpWzBdLnN0eWxlLmRpc3BsYXkgPSAnbm9uZScpXHJcbiAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbGluZVNwYWNlJylbMV0gJiYgKGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xpbmVTcGFjZScpWzFdLnN0eWxlLmRpc3BsYXkgPSAnbm9uZScpXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbGluZVNwYWNlJylbMF0gJiYgKGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xpbmVTcGFjZScpWzBdLnN0eWxlLmRpc3BsYXkgPSAnZmxleCcpXHJcbiAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbGluZVNwYWNlJylbMV0gJiYgKGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xpbmVTcGFjZScpWzFdLnN0eWxlLmRpc3BsYXkgPSAnZmxleCcpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgYnJlYWtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgbGV0IHBhcmFtcyA9IHsgLi4udGhpcy5vcHRpb25zIH1cclxuICAgIHBhcmFtcy5zcGVlZCA9IHRoaXMuaW5wdXRTcGVlZFxyXG4gICAgdGhpcy5lbnRpdHkgJiZcclxuICAgICAgdGhpcy5lbnRpdHkucG9seWxpbmUgJiZcclxuICAgICAgKHRoaXMuZW50aXR5LnBvbHlsaW5lLm1hdGVyaWFsID0gdGhpcy5nZXRNYXRlcmlhbChcclxuICAgICAgICB0aGlzLm9wdGlvbnMuY29sb3IsXHJcbiAgICAgICAgdGhpcy5vcHRpb25zLnR5cGUsXHJcbiAgICAgICAgdGhpcy5lbnRpdHksXHJcbiAgICAgICAgcGFyYW1zXHJcbiAgICAgICkpXHJcbiAgfVxyXG4gIGdldCBub3NlVG9UYWlsKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5ub3NlVG9UYWlsXHJcbiAgfVxyXG5cclxuICBzZXQgbm9zZVRvVGFpbCh2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMubm9zZVRvVGFpbCA9IHZcclxuICAgIHRoaXMuY2xvc2VOb2RlRWRpdCgpXHJcbiAgICB0aGlzLl9lbG1zLm5vc2VUb1RhaWwgJiZcclxuICAgICAgdGhpcy5fZWxtcy5ub3NlVG9UYWlsLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgaXRlbS5jaGVja2VkID0gdlxyXG4gICAgICB9KVxyXG4gICAgaWYgKHRoaXMuZW50aXR5KSB7XHJcbiAgICAgIGxldCBmcm9tRGVncmVlc0FycmF5ID0gdGhpcy5yZW5ld1Bvc2l0aW9ucyh0aGlzLm9wdGlvbnMucG9zaXRpb25zKVxyXG4gICAgICB0aGlzLmVudGl0eS5wb2x5bGluZS5wb3NpdGlvbnMgPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlc0FycmF5SGVpZ2h0cyhcclxuICAgICAgICBmcm9tRGVncmVlc0FycmF5XHJcbiAgICAgIClcclxuICAgICAgdGhpcy5yZW5ld1BvbHlnb24oZnJvbURlZ3JlZXNBcnJheSlcclxuICAgIH1cclxuICAgIC8vIGlmICh2KSB7XHJcbiAgICAvLyAgIGlmICh0aGlzLm9wdGlvbnMuZml0TGVuZ3RoQnlNZXRlciA+IDEwMDAgfHwgdGhpcy5vcHRpb25zLmZpdExlbmd0aEJ5TWV0ZXIgPT0gMTAwMCkge1xyXG4gICAgLy8gICAgIGxldCBkb20gPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdpbnB1dC1zZWxlY3QtdW5pdCcpWzFdXHJcbiAgICAvLyAgICAgZG9tICYmIGRvbS5xdWVyeVNlbGVjdG9yQWxsKCdkZCcpWzFdICYmIGRvbS5xdWVyeVNlbGVjdG9yQWxsKCdkZCcpWzFdLmNsaWNrKClcclxuICAgIC8vICAgfSBlbHNlIHtcclxuICAgIC8vICAgICBsZXQgZG9tID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaW5wdXQtc2VsZWN0LXVuaXQnKVsxXVxyXG4gICAgLy8gICAgIGRvbSAmJiBkb20ucXVlcnlTZWxlY3RvckFsbCgnZGQnKVswXSAmJiBkb20ucXVlcnlTZWxlY3RvckFsbCgnZGQnKVswXS5jbGljaygpXHJcbiAgICAvLyAgIH1cclxuXHJcbiAgICAvLyB9IGVsc2Uge1xyXG4gICAgLy8gICBpZiAodGhpcy5vcHRpb25zLmxlbmd0aEJ5TWV0ZXIgPiAxMDAwIHx8IHRoaXMub3B0aW9ucy5sZW5ndGhCeU1ldGVyID09IDEwMDApIHtcclxuICAgIC8vICAgICBsZXQgZG9tID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaW5wdXQtc2VsZWN0LXVuaXQnKVsxXVxyXG4gICAgLy8gICAgIGRvbSAmJiBkb20ucXVlcnlTZWxlY3RvckFsbCgnZGQnKVsxXSAmJiBkb20ucXVlcnlTZWxlY3RvckFsbCgnZGQnKVsxXS5jbGljaygpXHJcbiAgICAvLyAgIH0gZWxzZSB7XHJcbiAgICAvLyAgICAgbGV0IGRvbSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2lucHV0LXNlbGVjdC11bml0JylbMV1cclxuICAgIC8vICAgICBkb20gJiYgZG9tLnF1ZXJ5U2VsZWN0b3JBbGwoJ2RkJylbMF0gJiYgZG9tLnF1ZXJ5U2VsZWN0b3JBbGwoJ2RkJylbMF0uY2xpY2soKVxyXG4gICAgLy8gICB9XHJcbiAgICAvLyB9XHJcbiAgfVxyXG5cclxuXHJcbiAgZ2V0IGhlaWdodE1vZGUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmhlaWdodE1vZGUgPyB0aGlzLm9wdGlvbnMuaGVpZ2h0TW9kZSA6IDBcclxuICB9XHJcbiAgc2V0IGhlaWdodE1vZGUodikge1xyXG4gICAgdGhpcy5wb3NpdGlvbkVkaXRpbmcgPSBmYWxzZVxyXG4gICAgdGhpcy5vcHRpb25zLmhlaWdodE1vZGUgPSAodiB8fCB2ID09IDApID8gdiA6IDJcclxuICAgIGxldCBoZWlnaHRNb2RlTmFtZSA9ICcnXHJcbiAgICB0aGlzLmNsb3NlTm9kZUVkaXQoKVxyXG4gICAgbGV0IGdyb3VuZCA9IGZhbHNlXHJcbiAgICBsZXQgZGlzYWJsZWQgPSBmYWxzZVxyXG4gICAgbGV0IGZyb21EZWdyZWVzQXJyYXkgPSB0aGlzLnJlbmV3UG9zaXRpb25zKHRoaXMub3B0aW9ucy5wb3NpdGlvbnMpXHJcbiAgICB0aGlzLmVudGl0eS5wb2x5bGluZS5wb3NpdGlvbnMgPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlc0FycmF5SGVpZ2h0cyhcclxuICAgICAgZnJvbURlZ3JlZXNBcnJheVxyXG4gICAgKVxyXG4gICAgdGhpcy5yZW5ld1BvbHlnb24oZnJvbURlZ3JlZXNBcnJheSlcclxuICAgIHN3aXRjaCAodGhpcy5vcHRpb25zLmhlaWdodE1vZGUpIHtcclxuICAgICAgY2FzZSAnMCc6XHJcbiAgICAgIGNhc2UgMDpcclxuICAgICAgICB0aGlzLmVudGl0eS5wb2x5bGluZS5jbGFtcFRvR3JvdW5kID0gZ3JvdW5kXHJcbiAgICAgICAgdGhpcy5leHRlbmQgPSBmYWxzZVxyXG4gICAgICAgIGhlaWdodE1vZGVOYW1lID0gJ+a1t+aLlOmrmOW6pidcclxuICAgICAgICBicmVha1xyXG4gICAgICBjYXNlICcxJzpcclxuICAgICAgY2FzZSAxOlxyXG4gICAgICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLmNsYW1wVG9Hcm91bmQgPSBncm91bmRcclxuICAgICAgICB0aGlzLmV4dGVuZCA9IGZhbHNlXHJcbiAgICAgICAgaGVpZ2h0TW9kZU5hbWUgPSAn55u45a+55Zyw6KGoJ1xyXG4gICAgICAgIGJyZWFrXHJcbiAgICAgIGNhc2UgJzInOlxyXG4gICAgICBjYXNlIDI6XHJcbiAgICAgICAgZ3JvdW5kID0gdHJ1ZVxyXG4gICAgICAgIGRpc2FibGVkID0gdHJ1ZVxyXG4gICAgICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLmNsYW1wVG9Hcm91bmQgPSBncm91bmRcclxuICAgICAgICBoZWlnaHRNb2RlTmFtZSA9ICfkvp3pmYTmqKHlnosnXHJcbiAgICAgICAgYnJlYWtcclxuICAgIH1cclxuXHJcbiAgICAvLyB0aGlzLm9wdGlvbnMubGVuZ3RoQnlNZXRlciA9IHRoaXMuY29tcHV0ZURpc3RhbmNlMihcclxuICAgIC8vICAgdGhpcy5zbW9vdGhIYW5kbGUodGhpcy5vcHRpb25zLnBvc2l0aW9ucyksXHJcbiAgICAvLyAgIDIsXHJcbiAgICAvLyAgIGdyb3VuZFxyXG4gICAgLy8gKVxyXG4gICAgdGhpcy5sZW5ndGhVbml0ID0gdGhpcy5sZW5ndGhVbml0XHJcbiAgICB0aGlzLl9lbG1zLmhlaWdodE1vZGUgJiYgKHRoaXMuX2VsbXMuaGVpZ2h0TW9kZS52YWx1ZSA9IGhlaWdodE1vZGVOYW1lKVxyXG4gICAgdGhpcy5fZWxtcy5oZWlnaHRNb2RlT2JqZWN0ICYmICh0aGlzLl9lbG1zLmhlaWdodE1vZGVPYmplY3QubGVncF9zZWFyY2hBY3RpdmUoXHJcbiAgICAgIGhlaWdodE1vZGVOYW1lXHJcbiAgICApKVxyXG4gICAgaWYgKGRpc2FibGVkKSB7XHJcbiAgICAgIHRoaXMuX2VsbXMuaGVpZ2h0Qm94ICYmICh0aGlzLl9lbG1zLmhlaWdodEJveC5jbGFzc05hbWUgPSAnaW5wdXQtbnVtYmVyIGlucHV0LW51bWJlci11bml0LTEgaGVpZ2h0LWJveCBkaXNhYmxlZCcpO1xyXG4gICAgICB0aGlzLl9lbG1zLmhlaWdodENvbmZpcm0gJiYgdGhpcy5fZWxtcy5oZWlnaHRDb25maXJtLnNldEF0dHJpYnV0ZSgnZGlzYWJsZWQnLCAnZGlzYWJsZWQnKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLl9lbG1zLmhlaWdodEJveCAmJiAodGhpcy5fZWxtcy5oZWlnaHRCb3guY2xhc3NOYW1lID0gJ2lucHV0LW51bWJlciBpbnB1dC1udW1iZXItdW5pdC0xIGhlaWdodC1ib3gnKTtcclxuICAgICAgdGhpcy5fZWxtcy5oZWlnaHRDb25maXJtICYmIHRoaXMuX2VsbXMuaGVpZ2h0Q29uZmlybS5yZW1vdmVBdHRyaWJ1dGUoJ2Rpc2FibGVkJyk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIGlmIChncm91bmQpIHtcclxuICAgICAgICB0aGlzLmxhYmVsLmdyb3VuZCA9IGdyb3VuZFxyXG4gICAgICAgIHRoaXMuX2VsbXMuaGVpZ2h0TW9kZSAmJiAodGhpcy5fZWxtcy5oZWlnaHRNb2RlLnZhbHVlID0gJ+S+nemZhOaooeWeiycpXHJcbiAgICAgICAgdGhpcy5sYWJlbC5wb3NpdGlvbiA9IFtcclxuICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0ubG5nLFxyXG4gICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXS5sYXRcclxuICAgICAgICBdXHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdGhpcy5sYWJlbC5ncm91bmQgPSBncm91bmRcclxuICAgICAgICB0aGlzLmxhYmVsLnBvc2l0aW9uID0gW1xyXG4gICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXS5sbmcsXHJcbiAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zWzBdLmxhdCxcclxuICAgICAgICAgIGZyb21EZWdyZWVzQXJyYXlbMl1cclxuICAgICAgICBdXHJcbiAgICAgICAgdGhpcy5vcHRpb25zLmxhYmVsLnBvc2l0aW9uID0ge1xyXG4gICAgICAgICAgbG5nOiB0aGlzLm9wdGlvbnMucG9zaXRpb25zWzBdLmxuZyxcclxuICAgICAgICAgIGxhdDogdGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXS5sYXQsXHJcbiAgICAgICAgICBhbHQ6IGZyb21EZWdyZWVzQXJyYXlbMl1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0sIDApO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGV4dGVuZCgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuZXh0ZW5kXHJcbiAgfVxyXG5cclxuICBzZXQgZXh0ZW5kKHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5leHRlbmQgPSB2XHJcbiAgICB0aGlzLmNsb3NlTm9kZUVkaXQoKVxyXG4gICAgaWYgKHYpIHtcclxuICAgICAgdGhpcy5oZWlnaHRNb2RlID0gMlxyXG4gICAgfVxyXG4gICAgdGhpcy5fZWxtcy5leHRlbmQgJiZcclxuICAgICAgdGhpcy5fZWxtcy5leHRlbmQuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICBpdGVtLmNoZWNrZWQgPSB2XHJcbiAgICAgIH0pXHJcbiAgICBpZiAodGhpcy5lbnRpdHkpIHtcclxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5leHRlbmQpIHtcclxuICAgICAgICBsZXQgZnJvbURlZ3JlZXNBcnJheSA9IHRoaXMucmVuZXdQb3NpdGlvbnModGhpcy5vcHRpb25zLnBvc2l0aW9ucylcclxuICAgICAgICB0aGlzLnJlbmV3UG9seWdvbihmcm9tRGVncmVlc0FycmF5KVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuZW50aXR5LnBvbHlnb24gPSB1bmRlZmluZWRcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IGV4dGVuZFdpZHRoKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5leHRlbmRXaWR0aFxyXG4gIH1cclxuXHJcbiAgc2V0IGV4dGVuZFdpZHRoKHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5leHRlbmRXaWR0aCA9IHZcclxuICAgIHRoaXMuX2VsbXMuZXh0ZW5kV2lkdGggJiZcclxuICAgICAgdGhpcy5fZWxtcy5leHRlbmRXaWR0aC5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgIGl0ZW0udmFsdWUgPSB2XHJcbiAgICAgIH0pXHJcbiAgICBsZXQgZnJvbURlZ3JlZXNBcnJheSA9IHRoaXMucmVuZXdQb3NpdGlvbnModGhpcy5vcHRpb25zLnBvc2l0aW9ucylcclxuICAgIHRoaXMucmVuZXdQb2x5Z29uKGZyb21EZWdyZWVzQXJyYXkpXHJcbiAgfVxyXG5cclxuICBnZXQgZXh0ZW5kQ29sb3IoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmV4dGVuZENvbG9yXHJcbiAgfVxyXG4gIHNldCBleHRlbmRDb2xvcih2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMuZXh0ZW5kQ29sb3IgPSB2XHJcbiAgICBpZiAodGhpcy5fZWxtcy5leHRlbmRDb2xvcikge1xyXG4gICAgICB0aGlzLl9lbG1zLmV4dGVuZENvbG9yLmZvckVhY2goKGl0ZW0sIGkpID0+IHtcclxuICAgICAgICBsZXQgZXh0ZW5kQ29sb3JQaWNrZXIgPSBuZXcgWUpDb2xvclBpY2tlcih7XHJcbiAgICAgICAgICBlbDogaXRlbS5lbCxcclxuICAgICAgICAgIHNpemU6ICdtaW5pJywgLy/popzoibJib3jnsbvlnotcclxuICAgICAgICAgIGFscGhhOiB0cnVlLCAvL+aYr+WQpuW8gOWQr+mAj+aYjuW6plxyXG4gICAgICAgICAgZGVmYXVsdENvbG9yOiB0aGlzLmV4dGVuZENvbG9yLFxyXG4gICAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLCAvL+aYr+WQpuemgeatouaJk+W8gOminOiJsumAieaLqeWZqFxyXG4gICAgICAgICAgb3BlblBpY2tlckFuaTogJ29wYWNpdHknLCAvL+aJk+W8gOminOiJsumAieaLqeWZqOWKqOeUu1xyXG4gICAgICAgICAgc3VyZTogY29sb3IgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmV4dGVuZENvbG9yID0gY29sb3JcclxuICAgICAgICAgIH0sIC8v54K55Ye756Gu6K6k5oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgICAgICBjbGVhcjogKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmV4dGVuZENvbG9yID0gJ3JnYmEoMjU1LDI1NSwyNTUsMSknXHJcbiAgICAgICAgICB9IC8v54K55Ye75riF56m65oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgICAgfSlcclxuICAgICAgICB0aGlzLl9lbG1zLmV4dGVuZENvbG9yW2ldID0gZXh0ZW5kQ29sb3JQaWNrZXJcclxuICAgICAgfSlcclxuICAgIH1cclxuICAgIHRoaXMuZW50aXR5ICYmXHJcbiAgICAgIHRoaXMuZW50aXR5LnBvbHlnb24gJiZcclxuICAgICAgKHRoaXMuZW50aXR5LnBvbHlnb24ubWF0ZXJpYWwgPSBDZXNpdW0uQ29sb3IuZnJvbUNzc0NvbG9yU3RyaW5nKFxyXG4gICAgICAgIHRoaXMub3B0aW9ucy5leHRlbmRDb2xvclxyXG4gICAgICApKVxyXG4gIH1cclxuXHJcbiAgZ2V0IGxhYmVsU2hvdygpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubGFiZWwuc2hvd1xyXG4gIH1cclxuICBzZXQgbGFiZWxTaG93KHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5sYWJlbC5zaG93ID0gdlxyXG4gICAgaWYgKHRoaXMuc2hvdyAmJiAhdGhpcy5zaG93VmlldyB8fCB0aGlzLnNob3dWaWV3ID09IDMpIHtcclxuICAgICAgdGhpcy5sYWJlbC5zaG93ID0gdlxyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICB0aGlzLmxhYmVsLnBvc2l0aW9uID0gW1xyXG4gICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXS5sbmcsXHJcbiAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zWzBdLmxhdCxcclxuICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0uYWx0XHJcbiAgICAgICAgXVxyXG4gICAgICB9LCAwKVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5sYWJlbC5zaG93ID0gZmFsc2VcclxuICAgIH1cclxuICAgIHRoaXMuX2VsbXMubGFiZWxTaG93ICYmXHJcbiAgICAgIHRoaXMuX2VsbXMubGFiZWxTaG93LmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgaXRlbS5jaGVja2VkID0gdlxyXG4gICAgICB9KVxyXG4gIH1cclxuXHJcbiAgZ2V0IGxhYmVsRm9udEZhbWlseSgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubGFiZWwuZm9udEZhbWlseVxyXG4gIH1cclxuXHJcbiAgc2V0IGxhYmVsRm9udEZhbWlseSh2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMubGFiZWwuZm9udEZhbWlseSA9IHYgfHwgMFxyXG4gICAgdGhpcy5sYWJlbCAmJiAodGhpcy5sYWJlbC5mb250RmFtaWx5ID0gdGhpcy5vcHRpb25zLmxhYmVsLmZvbnRGYW1pbHkpXHJcblxyXG4gICAgbGV0IG5hbWUgPSBnZXRGb250RmFtaWx5TmFtZSh0aGlzLmxhYmVsRm9udEZhbWlseSkgfHwgJydcclxuICAgIHRoaXMuX2VsbXMubGFiZWxGb250RmFtaWx5ICYmXHJcbiAgICAgIHRoaXMuX2VsbXMubGFiZWxGb250RmFtaWx5LmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgaXRlbS52YWx1ZSA9IG5hbWVcclxuICAgICAgfSlcclxuICB9XHJcblxyXG4gIGdldCBsYWJlbENvbG9yKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5sYWJlbC5jb2xvclxyXG4gIH1cclxuICBzZXQgbGFiZWxDb2xvcih2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMubGFiZWwuY29sb3IgPSB2XHJcbiAgICB0aGlzLmxhYmVsLmNvbG9yID0gdlxyXG4gICAgaWYgKHRoaXMuX2VsbXMubGFiZWxDb2xvcikge1xyXG4gICAgICB0aGlzLl9lbG1zLmxhYmVsQ29sb3IuZm9yRWFjaCgoaXRlbSwgaSkgPT4ge1xyXG4gICAgICAgIGxldCBsYWJlbENvbG9yUGlja2VyID0gbmV3IFlKQ29sb3JQaWNrZXIoe1xyXG4gICAgICAgICAgZWw6IGl0ZW0uZWwsXHJcbiAgICAgICAgICBzaXplOiAnbWluaScsIC8v6aKc6ImyYm9457G75Z6LXHJcbiAgICAgICAgICBhbHBoYTogdHJ1ZSwgLy/mmK/lkKblvIDlkK/pgI/mmI7luqZcclxuICAgICAgICAgIGRlZmF1bHRDb2xvcjogdGhpcy5sYWJlbENvbG9yLFxyXG4gICAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLCAvL+aYr+WQpuemgeatouaJk+W8gOminOiJsumAieaLqeWZqFxyXG4gICAgICAgICAgb3BlblBpY2tlckFuaTogJ29wYWNpdHknLCAvL+aJk+W8gOminOiJsumAieaLqeWZqOWKqOeUu1xyXG4gICAgICAgICAgc3VyZTogY29sb3IgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxhYmVsQ29sb3IgPSBjb2xvclxyXG4gICAgICAgICAgfSwgLy/ngrnlh7vnoa7orqTmjInpkq7kuovku7blm57osINcclxuICAgICAgICAgIGNsZWFyOiAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubGFiZWxDb2xvciA9ICdyZ2JhKDI1NSwyNTUsMjU1LDEpJ1xyXG4gICAgICAgICAgfSAvL+eCueWHu+a4heepuuaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgdGhpcy5fZWxtcy5sYWJlbENvbG9yW2ldID0gbGFiZWxDb2xvclBpY2tlclxyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IGxhYmVsRm9udFNpemUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmxhYmVsLmZvbnRTaXplXHJcbiAgfVxyXG4gIHNldCBsYWJlbEZvbnRTaXplKHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5sYWJlbC5mb250U2l6ZSA9IHZcclxuICAgIHRoaXMubGFiZWwuZm9udFNpemUgPSB2XHJcbiAgICB0aGlzLl9lbG1zLmxhYmVsRm9udFNpemUgJiZcclxuICAgICAgdGhpcy5fZWxtcy5sYWJlbEZvbnRTaXplLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgaXRlbS52YWx1ZSA9IHZcclxuICAgICAgfSlcclxuICB9XHJcblxyXG4gIGdldCBsYWJlbFNjYWxlQnlEaXN0YW5jZSgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubGFiZWwuc2NhbGVCeURpc3RhbmNlXHJcbiAgfVxyXG4gIHNldCBsYWJlbFNjYWxlQnlEaXN0YW5jZSh2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMubGFiZWwuc2NhbGVCeURpc3RhbmNlID0gdlxyXG4gICAgdGhpcy5sYWJlbC5zY2FsZUJ5RGlzdGFuY2UgPSB2XHJcbiAgICB0aGlzLl9lbG1zLmxhYmVsU2NhbGVCeURpc3RhbmNlICYmXHJcbiAgICAgIHRoaXMuX2VsbXMubGFiZWxTY2FsZUJ5RGlzdGFuY2UuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICBpdGVtLmNoZWNrZWQgPSB2XHJcbiAgICAgIH0pXHJcbiAgfVxyXG5cclxuICBnZXQgbGFiZWxOZWFyKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5sYWJlbC5uZWFyXHJcbiAgfVxyXG4gIHNldCBsYWJlbE5lYXIodikge1xyXG4gICAgbGV0IG5lYXIgPSB2XHJcbiAgICBpZiAobmVhciA+IHRoaXMubGFiZWxGYXIpIHtcclxuICAgICAgbmVhciA9IHRoaXMubGFiZWxGYXJcclxuICAgIH1cclxuICAgIHRoaXMub3B0aW9ucy5sYWJlbC5uZWFyID0gbmVhclxyXG4gICAgdGhpcy5sYWJlbC5uZWFyID0gbmVhclxyXG4gICAgdGhpcy5fZWxtcy5sYWJlbE5lYXIgJiYgdGhpcy5fZWxtcy5sYWJlbE5lYXIuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICBpdGVtLnZhbHVlID0gbmVhclxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGdldCBsYWJlbEZhcigpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubGFiZWwuZmFyXHJcbiAgfVxyXG4gIHNldCBsYWJlbEZhcih2KSB7XHJcbiAgICBsZXQgZmFyID0gdlxyXG4gICAgaWYgKGZhciA8IHRoaXMubGFiZWxOZWFyKSB7XHJcbiAgICAgIGZhciA9IHRoaXMubGFiZWxOZWFyXHJcbiAgICB9XHJcbiAgICB0aGlzLm9wdGlvbnMubGFiZWwuZmFyID0gZmFyXHJcbiAgICB0aGlzLmxhYmVsLmZhciA9IGZhclxyXG4gICAgdGhpcy5fZWxtcy5sYWJlbEZhciAmJiB0aGlzLl9lbG1zLmxhYmVsRmFyLmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgaXRlbS52YWx1ZSA9IGZhclxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGdldCBsYWJlbExpbmVXaWR0aCgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubGFiZWwubGluZVdpZHRoXHJcbiAgfVxyXG4gIHNldCBsYWJlbExpbmVXaWR0aCh2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMubGFiZWwubGluZVdpZHRoID0gdlxyXG4gICAgdGhpcy5sYWJlbC5saW5lV2lkdGggPSB2XHJcbiAgICB0aGlzLl9lbG1zLmxhYmVsTGluZVdpZHRoICYmXHJcbiAgICAgIHRoaXMuX2VsbXMubGFiZWxMaW5lV2lkdGguZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICBpdGVtLnZhbHVlID0gdlxyXG4gICAgICB9KVxyXG4gIH1cclxuXHJcbiAgZ2V0IGxhYmVsUGl4ZWxPZmZzZXQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmxhYmVsLnBpeGVsT2Zmc2V0XHJcbiAgfVxyXG4gIHNldCBsYWJlbFBpeGVsT2Zmc2V0KHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5sYWJlbC5waXhlbE9mZnNldCA9IHZcclxuICAgIHRoaXMubGFiZWwucGl4ZWxPZmZzZXQgPSB2XHJcbiAgICB0aGlzLl9lbG1zLmxhYmVsUGl4ZWxPZmZzZXQgJiZcclxuICAgICAgdGhpcy5fZWxtcy5sYWJlbFBpeGVsT2Zmc2V0LmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgaXRlbS52YWx1ZSA9IHZcclxuICAgICAgfSlcclxuICB9XHJcbiAgZ2V0IGxhYmVsTGluZUNvbG9yKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5sYWJlbC5saW5lQ29sb3JcclxuICB9XHJcbiAgc2V0IGxhYmVsTGluZUNvbG9yKHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5sYWJlbC5saW5lQ29sb3IgPSB2XHJcbiAgICB0aGlzLmxhYmVsLmxpbmVDb2xvciA9IHZcclxuICAgIGlmICh0aGlzLl9lbG1zLmxhYmVsTGluZUNvbG9yKSB7XHJcbiAgICAgIHRoaXMuX2VsbXMubGFiZWxMaW5lQ29sb3IuZm9yRWFjaCgoaXRlbSwgaSkgPT4ge1xyXG4gICAgICAgIGxldCBsaW5lQ29sb3JQaWNrZXIgPSBuZXcgWUpDb2xvclBpY2tlcih7XHJcbiAgICAgICAgICBlbDogaXRlbS5lbCxcclxuICAgICAgICAgIHNpemU6ICdtaW5pJywgLy/popzoibJib3jnsbvlnotcclxuICAgICAgICAgIGFscGhhOiB0cnVlLCAvL+aYr+WQpuW8gOWQr+mAj+aYjuW6plxyXG4gICAgICAgICAgZGVmYXVsdENvbG9yOiB0aGlzLmxhYmVsTGluZUNvbG9yLFxyXG4gICAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLCAvL+aYr+WQpuemgeatouaJk+W8gOminOiJsumAieaLqeWZqFxyXG4gICAgICAgICAgb3BlblBpY2tlckFuaTogJ29wYWNpdHknLCAvL+aJk+W8gOminOiJsumAieaLqeWZqOWKqOeUu1xyXG4gICAgICAgICAgc3VyZTogY29sb3IgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxhYmVsTGluZUNvbG9yID0gY29sb3JcclxuICAgICAgICAgIH0sIC8v54K55Ye756Gu6K6k5oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgICAgICBjbGVhcjogKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxhYmVsTGluZUNvbG9yID0gJ3JnYmEoMCwyNTUsMjU1LDAuNSknXHJcbiAgICAgICAgICB9IC8v54K55Ye75riF56m65oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgICAgfSlcclxuICAgICAgICB0aGlzLl9lbG1zLmxhYmVsTGluZUNvbG9yW2ldID0gbGluZUNvbG9yUGlja2VyXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgbGFiZWxCYWNrZ3JvdW5kQ29sb3JTdGFydCgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubGFiZWwuYmFja2dyb3VuZENvbG9yWzBdXHJcbiAgfVxyXG4gIHNldCBsYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0KHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5sYWJlbC5iYWNrZ3JvdW5kQ29sb3JbMF0gPSB2XHJcbiAgICB0aGlzLmxhYmVsLmJhY2tncm91bmRDb2xvciA9IFt2LCB0aGlzLmxhYmVsLmJhY2tncm91bmRDb2xvclsxXV1cclxuICAgIGlmICh0aGlzLl9lbG1zLmxhYmVsQmFja2dyb3VuZENvbG9yU3RhcnQpIHtcclxuICAgICAgdGhpcy5fZWxtcy5sYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0LmZvckVhY2goKGl0ZW0sIGkpID0+IHtcclxuICAgICAgICBsZXQgbGFiZWxCYWNrZ3JvdW5kQ29sb3JTdGFydFBpY2tlciA9IG5ldyBZSkNvbG9yUGlja2VyKHtcclxuICAgICAgICAgIGVsOiBpdGVtLmVsLFxyXG4gICAgICAgICAgc2l6ZTogJ21pbmknLCAvL+minOiJsmJveOexu+Wei1xyXG4gICAgICAgICAgYWxwaGE6IHRydWUsIC8v5piv5ZCm5byA5ZCv6YCP5piO5bqmXHJcbiAgICAgICAgICBkZWZhdWx0Q29sb3I6IHRoaXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JTdGFydCxcclxuICAgICAgICAgIGRpc2FibGVkOiBmYWxzZSwgLy/mmK/lkKbnpoHmraLmiZPlvIDpopzoibLpgInmi6nlmahcclxuICAgICAgICAgIG9wZW5QaWNrZXJBbmk6ICdvcGFjaXR5JywgLy/miZPlvIDpopzoibLpgInmi6nlmajliqjnlLtcclxuICAgICAgICAgIHN1cmU6IGNvbG9yID0+IHtcclxuICAgICAgICAgICAgdGhpcy5sYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0ID0gY29sb3JcclxuICAgICAgICAgIH0sIC8v54K55Ye756Gu6K6k5oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgICAgICBjbGVhcjogKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxhYmVsQmFja2dyb3VuZENvbG9yU3RhcnQgPSAncmdiYSgyNTUsMjU1LDI1NSwxKSdcclxuICAgICAgICAgIH0gLy/ngrnlh7vmuIXnqbrmjInpkq7kuovku7blm57osINcclxuICAgICAgICB9KVxyXG4gICAgICAgIHRoaXMuX2VsbXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JTdGFydFtcclxuICAgICAgICAgIGlcclxuICAgICAgICBdID0gbGFiZWxCYWNrZ3JvdW5kQ29sb3JTdGFydFBpY2tlclxyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gIH1cclxuICBnZXQgbGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmxhYmVsLmJhY2tncm91bmRDb2xvclsxXVxyXG4gIH1cclxuICBzZXQgbGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmQodikge1xyXG4gICAgdGhpcy5vcHRpb25zLmxhYmVsLmJhY2tncm91bmRDb2xvclsxXSA9IHZcclxuICAgIHRoaXMubGFiZWwuYmFja2dyb3VuZENvbG9yID0gW3RoaXMubGFiZWwuYmFja2dyb3VuZENvbG9yWzBdLCB2XVxyXG4gICAgaWYgKHRoaXMuX2VsbXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmQpIHtcclxuICAgICAgdGhpcy5fZWxtcy5sYWJlbEJhY2tncm91bmRDb2xvckVuZC5mb3JFYWNoKChpdGVtLCBpKSA9PiB7XHJcbiAgICAgICAgbGV0IGxhYmVsQmFja2dyb3VuZENvbG9yRW5kUGlja2VyID0gbmV3IFlKQ29sb3JQaWNrZXIoe1xyXG4gICAgICAgICAgZWw6IGl0ZW0uZWwsXHJcbiAgICAgICAgICBzaXplOiAnbWluaScsIC8v6aKc6ImyYm9457G75Z6LXHJcbiAgICAgICAgICBhbHBoYTogdHJ1ZSwgLy/mmK/lkKblvIDlkK/pgI/mmI7luqZcclxuICAgICAgICAgIGRlZmF1bHRDb2xvcjogdGhpcy5sYWJlbEJhY2tncm91bmRDb2xvckVuZCxcclxuICAgICAgICAgIGRpc2FibGVkOiBmYWxzZSwgLy/mmK/lkKbnpoHmraLmiZPlvIDpopzoibLpgInmi6nlmahcclxuICAgICAgICAgIG9wZW5QaWNrZXJBbmk6ICdvcGFjaXR5JywgLy/miZPlvIDpopzoibLpgInmi6nlmajliqjnlLtcclxuICAgICAgICAgIHN1cmU6IGNvbG9yID0+IHtcclxuICAgICAgICAgICAgdGhpcy5sYWJlbEJhY2tncm91bmRDb2xvckVuZCA9IGNvbG9yXHJcbiAgICAgICAgICB9LCAvL+eCueWHu+ehruiupOaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICAgICAgY2xlYXI6ICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5sYWJlbEJhY2tncm91bmRDb2xvckVuZCA9ICdyZ2JhKDI1NSwyNTUsMjU1LDEpJ1xyXG4gICAgICAgICAgfSAvL+eCueWHu+a4heepuuaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgdGhpcy5fZWxtcy5sYWJlbEJhY2tncm91bmRDb2xvckVuZFtpXSA9IGxhYmVsQmFja2dyb3VuZENvbG9yRW5kUGlja2VyXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgYXR0cmlidXRlVHlwZSgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuYXR0cmlidXRlVHlwZVxyXG4gIH1cclxuXHJcbiAgc2V0IGF0dHJpYnV0ZVR5cGUodikge1xyXG4gICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZVR5cGUgPSB2XHJcbiAgICB0aGlzLl9lbG1zLmF0dHJpYnV0ZVR5cGUgJiZcclxuICAgICAgdGhpcy5fZWxtcy5hdHRyaWJ1dGVUeXBlLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgaXRlbS52YWx1ZSA9IHZcclxuICAgICAgfSlcclxuICAgIGxldCBhdHRyaWJ1dGVDb250ZW50ID0gdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcclxuICAgICAgJ2F0dHJpYnV0ZS1jb250ZW50J1xyXG4gICAgKVxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVDb250ZW50Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGlmIChcclxuICAgICAgICBhdHRyaWJ1dGVDb250ZW50W2ldLmNsYXNzTmFtZS5pbmRleE9mKCdhdHRyaWJ1dGUtY29udGVudC0nICsgdikgPiAtMVxyXG4gICAgICApIHtcclxuICAgICAgICBhdHRyaWJ1dGVDb250ZW50W2ldLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgYXR0cmlidXRlQ29udGVudFtpXS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCBhdHRyaWJ1dGVMaW5rKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50XHJcbiAgfVxyXG5cclxuICBzZXQgYXR0cmlidXRlTGluayh2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudCA9IHZcclxuICAgIGlmIChcclxuICAgICAgIXRoaXMuX0RpYWxvZ09iamVjdCB8fFxyXG4gICAgICAhdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50IHx8XHJcbiAgICAgICF0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudCB8fFxyXG4gICAgICB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFxyXG4gICAgICAgICdhdHRyaWJ1dGUtY29udGVudC1saW5rJ1xyXG4gICAgICApLmxlbmd0aCA9PSAwXHJcbiAgICApIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcbiAgICBsZXQgdGFibGUgPSB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudFxyXG4gICAgICAuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnYXR0cmlidXRlLWNvbnRlbnQtbGluaycpWzFdXHJcbiAgICAgIC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0YWJsZScpWzBdXHJcbiAgICBsZXQgdGFibGVDb250ZW50ID0gdGFibGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndGFibGUtYm9keScpWzBdXHJcbiAgICB0YWJsZUNvbnRlbnQuaW5uZXJIVE1MID0gJydcclxuICAgIGlmICh0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudC5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRhYmxlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RhYmxlLWVtcHR5JylbMF0uc3R5bGUuZGlzcGxheSA9ICdub25lJ1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGFibGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndGFibGUtZW1wdHknKVswXS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnXHJcbiAgICB9XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGxldCB0ciA9XHJcbiAgICAgICAgYFxyXG4gICAgICA8ZGl2IGNsYXNzPVwidHJcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZFwiPmAgK1xyXG4gICAgICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50W2ldLm5hbWUgK1xyXG4gICAgICAgIGA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZFwiPmAgK1xyXG4gICAgICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50W2ldLnVybCArXHJcbiAgICAgICAgYDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRkXCI+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvbiBAY2xpY2s9XCJsaW5rRWRpdFwiPue8lui+kTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gQGNsaWNrPVwibGlua0RlbGV0ZVwiPuWIoOmZpDwvYnV0dG9uPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PmBcclxuICAgICAgbGV0IHRyRWxtID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKS5jcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQodHIpXHJcbiAgICAgIHRhYmxlQ29udGVudC5hcHBlbmRDaGlsZCh0ckVsbSlcclxuICAgIH1cclxuICAgIGxldCBpdGVtID0gdGFibGVDb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RyJylcclxuICAgIGxldCBmdW4gPSB7XHJcbiAgICAgIGxpbmtFZGl0OiBhc3luYyBpbmRleCA9PiB7XHJcbiAgICAgICAgdGhpcy5hdHRyaWJ1dGVMaW5rID0gYXdhaXQgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnRcclxuICAgICAgICBsZXQgdGFibGUgPSB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudFxyXG4gICAgICAgICAgLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2F0dHJpYnV0ZS1jb250ZW50LWxpbmsnKVsxXVxyXG4gICAgICAgICAgLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RhYmxlJylbMF1cclxuICAgICAgICBsZXQgdGFibGVDb250ZW50ID0gdGFibGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndGFibGUtYm9keScpWzBdXHJcbiAgICAgICAgbGV0IGl0ZW0gPSB0YWJsZUNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndHInKVxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgaWYgKGluZGV4ID09PSBpKSB7XHJcbiAgICAgICAgICAgIGxldCBoZWlnaHQgPSBpdGVtW2ldLm9mZnNldEhlaWdodFxyXG4gICAgICAgICAgICBsZXQgaHRtbCA9IGBcclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGRcIj5cclxuICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImlucHV0XCIgdHlwZT1cInRleHRcIj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGRcIj5cclxuICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBjbGFzcz1cImlucHV0IGxpbmstZWRpdFwiIHR5cGU9XCJ0ZXh0XCI+PC90ZXh0YXJlYT5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGRcIj5cclxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBAY2xpY2s9XCJjb25maXJtRWRpdFwiPuehruiupDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICA8YnV0dG9uIEBjbGljaz1cImNhbmNlbEVkaXRcIj7lj5bmtog8L2J1dHRvbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5gXHJcbiAgICAgICAgICAgIGl0ZW1baV0uaW5uZXJIVE1MID0gaHRtbFxyXG4gICAgICAgICAgICBsZXQgdGV4dGFyZWFFbG0gPSBpdGVtW2ldLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xpbmstZWRpdCcpWzBdXHJcbiAgICAgICAgICAgIHRleHRhcmVhRWxtLnN0eWxlLmhlaWdodCA9IGhlaWdodCAtIDEwICsgJ3B4J1xyXG4gICAgICAgICAgICBsZXQgdGQgPSBpdGVtW2ldLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RkJylcclxuICAgICAgICAgICAgdGRbMF0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcclxuICAgICAgICAgICAgICAnaW5wdXQnXHJcbiAgICAgICAgICAgIClbMF0udmFsdWUgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudFtpbmRleF0ubmFtZVxyXG4gICAgICAgICAgICB0ZFsxXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFxyXG4gICAgICAgICAgICAgICdpbnB1dCdcclxuICAgICAgICAgICAgKVswXS52YWx1ZSA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50W2luZGV4XS51cmxcclxuICAgICAgICAgICAgbGV0IGJ0biA9IGl0ZW1baV0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2J1dHRvbicpXHJcbiAgICAgICAgICAgIGZvciAobGV0IG4gPSAwOyBuIDwgYnRuLmxlbmd0aDsgbisrKSB7XHJcbiAgICAgICAgICAgICAgaWYgKCFidG5bbl0gfHwgIWJ0bltuXS5hdHRyaWJ1dGVzKSB7XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBmb3IgKGxldCBtIG9mIGJ0bltuXS5hdHRyaWJ1dGVzKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAobS5uYW1lID09PSAnQGNsaWNrJykge1xyXG4gICAgICAgICAgICAgICAgICBidG5bbl0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBlID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGZ1blttLnZhbHVlXSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgZnVuW20udmFsdWVdKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogdGRbMF0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaW5wdXQnKVswXS52YWx1ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6IHRkWzFdLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2lucHV0JylbMF0udmFsdWVcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgaVxyXG4gICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgYnRuW25dLmF0dHJpYnV0ZXMucmVtb3ZlTmFtZWRJdGVtKG0ubmFtZSlcclxuICAgICAgICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIGxpbmtEZWxldGU6IGkgPT4ge1xyXG4gICAgICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50LnNwbGljZShpLCAxKVxyXG4gICAgICAgIHRoaXMuYXR0cmlidXRlTGluayA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50XHJcbiAgICAgIH0sXHJcblxyXG4gICAgICBjb25maXJtRWRpdDogKHZhbHVlLCBpKSA9PiB7XHJcbiAgICAgICAgbGV0IG5hbWUgPSB2YWx1ZS5uYW1lICYmIHZhbHVlLm5hbWUucmVwbGFjZSgvXFxzL2csICcnKVxyXG4gICAgICAgIGxldCB1cmwgPSB2YWx1ZS51cmwgJiYgdmFsdWUudXJsLnJlcGxhY2UoL1xccy9nLCAnJylcclxuICAgICAgICBpZiAobmFtZSAmJiB1cmwpIHtcclxuICAgICAgICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50W2ldID0gdmFsdWVcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgd2luZG93LkVMRU1FTlQgJiZcclxuICAgICAgICAgICAgd2luZG93LkVMRU1FTlQuTWVzc2FnZSh7XHJcbiAgICAgICAgICAgICAgbWVzc2FnZTogJ+WQjeensOaIlumTvuaOpeS4jeiDveS4uuepuu+8gScsXHJcbiAgICAgICAgICAgICAgdHlwZTogJ3dhcm5pbmcnLFxyXG4gICAgICAgICAgICAgIGR1cmF0aW9uOiAxNTAwXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuYXR0cmlidXRlTGluayA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50XHJcbiAgICAgIH0sXHJcbiAgICAgIGNhbmNlbEVkaXQ6ICgpID0+IHtcclxuICAgICAgICB0aGlzLmF0dHJpYnV0ZUxpbmsgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudFxyXG4gICAgICB9LFxyXG4gICAgICBmaWxlU2VsZWN0OiAodmFsdWUsIGkpID0+IHtcclxuICAgICAgICBsZXQgZmlsZUVsbSA9IGl0ZW1baV0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnZmlsZS1zZWxlY3QnKVswXVxyXG4gICAgICAgIGZpbGVFbG0uY2xpY2soKVxyXG4gICAgICAgIGZpbGVFbG0ucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgZmlsZVNlbGVjdClcclxuICAgICAgICBmaWxlRWxtLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGZpbGVTZWxlY3QpXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGxldCBmaWxlU2VsZWN0ID0gZXZlbnQgPT4ge1xyXG4gICAgICBpZiAoZXZlbnQudGFyZ2V0LnZhbHVlKSB7XHJcbiAgICAgICAgbGV0IHRkID0gaXRlbVtcclxuICAgICAgICAgIGV2ZW50LnRhcmdldC5nZXRBdHRyaWJ1dGUoJ2luZGV4JylcclxuICAgICAgICBdLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RkJylcclxuICAgICAgICB0ZFsxXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdpbnB1dCcpWzBdLnZhbHVlID0gZXZlbnQudGFyZ2V0LnZhbHVlXHJcbiAgICAgICAgZXZlbnQudGFyZ2V0LnZhbHVlID0gbnVsbFxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW0ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgbGV0IGJ0biA9IGl0ZW1baV0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2J1dHRvbicpXHJcbiAgICAgIGZvciAobGV0IG4gPSAwOyBuIDwgYnRuLmxlbmd0aDsgbisrKSB7XHJcbiAgICAgICAgaWYgKCFidG5bbl0gfHwgIWJ0bltuXS5hdHRyaWJ1dGVzKSB7XHJcbiAgICAgICAgICBjb250aW51ZVxyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKGxldCBtIG9mIGJ0bltuXS5hdHRyaWJ1dGVzKSB7XHJcbiAgICAgICAgICBpZiAobS5uYW1lID09PSAnQGNsaWNrJykge1xyXG4gICAgICAgICAgICBidG5bbl0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBlID0+IHtcclxuICAgICAgICAgICAgICBpZiAodHlwZW9mIGZ1blttLnZhbHVlXSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgZnVuW20udmFsdWVdKGkpXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICBidG5bbl0uYXR0cmlidXRlcy5yZW1vdmVOYW1lZEl0ZW0obS5uYW1lKVxyXG4gICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gZ2V0IGF0dHJpYnV0ZUNhbWVyYSgpIHtcclxuICAvLyAgIHJldHVybiB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmNhbWVyYS5jb250ZW50XHJcbiAgLy8gfVxyXG5cclxuICAvLyBzZXQgYXR0cmlidXRlQ2FtZXJhKHYpIHtcclxuICAvLyAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUuY2FtZXJhLmNvbnRlbnQgPSB2XHJcbiAgLy8gfVxyXG5cclxuICAvLyBnZXQgYXR0cmlidXRlVnIoKSB7XHJcbiAgLy8gICByZXR1cm4gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52ci5jb250ZW50XHJcbiAgLy8gfVxyXG5cclxuICAvLyBzZXQgYXR0cmlidXRlVnIodikge1xyXG4gIC8vICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52ci5jb250ZW50ID0gdlxyXG4gIC8vICAgaWYgKFxyXG4gIC8vICAgICAhdGhpcy5fRGlhbG9nT2JqZWN0IHx8XHJcbiAgLy8gICAgICF0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQgfHxcclxuICAvLyAgICAgIXRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50IHx8XHJcbiAgLy8gICAgIHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXHJcbiAgLy8gICAgICAgJ2F0dHJpYnV0ZS1jb250ZW50LXZyJ1xyXG4gIC8vICAgICApLmxlbmd0aCA9PSAwXHJcbiAgLy8gICApIHtcclxuICAvLyAgICAgcmV0dXJuXHJcbiAgLy8gICB9XHJcbiAgLy8gICBsZXQgdGFibGUgPSB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudFxyXG4gIC8vICAgICAuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnYXR0cmlidXRlLWNvbnRlbnQtdnInKVsxXVxyXG4gIC8vICAgICAuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndGFibGUnKVswXVxyXG4gIC8vICAgbGV0IHRhYmxlQ29udGVudCA9IHRhYmxlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RhYmxlLWJvZHknKVswXVxyXG4gIC8vICAgdGFibGVDb250ZW50LmlubmVySFRNTCA9ICcnXHJcbiAgLy8gICBpZiAodGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52ci5jb250ZW50Lmxlbmd0aCA+IDApIHtcclxuICAvLyAgICAgdGFibGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndGFibGUtZW1wdHknKVswXS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnXHJcbiAgLy8gICB9IGVsc2Uge1xyXG4gIC8vICAgICB0YWJsZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0YWJsZS1lbXB0eScpWzBdLnN0eWxlLmRpc3BsYXkgPSAnZmxleCdcclxuICAvLyAgIH1cclxuICAvLyAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52ci5jb250ZW50Lmxlbmd0aDsgaSsrKSB7XHJcbiAgLy8gICAgIGxldCB0ciA9XHJcbiAgLy8gICAgICAgYFxyXG4gIC8vICAgICA8ZGl2IGNsYXNzPVwidHJcIj5cclxuICAvLyAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZFwiPmAgK1xyXG4gIC8vICAgICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudFtpXS5uYW1lICtcclxuICAvLyAgICAgICBgPC9kaXY+XHJcbiAgLy8gICAgICAgICA8ZGl2IGNsYXNzPVwidGRcIj5gICtcclxuICAvLyAgICAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnRbaV0udXJsICtcclxuICAvLyAgICAgICBgPC9kaXY+XHJcbiAgLy8gICAgICAgICA8ZGl2IGNsYXNzPVwidGRcIj5cclxuICAvLyAgICAgICAgICAgICA8YnV0dG9uIEBjbGljaz1cInZyRWRpdFwiPue8lui+kTwvYnV0dG9uPlxyXG4gIC8vICAgICAgICAgICAgIDxidXR0b24gQGNsaWNrPVwidnJEZWxldGVcIj7liKDpmaQ8L2J1dHRvbj5cclxuICAvLyAgICAgICAgIDwvZGl2PlxyXG4gIC8vICAgICA8L2Rpdj5gXHJcbiAgLy8gICAgIGxldCB0ckVsbSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCkuY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50KHRyKVxyXG4gIC8vICAgICB0YWJsZUNvbnRlbnQuYXBwZW5kQ2hpbGQodHJFbG0pXHJcbiAgLy8gICB9XHJcbiAgLy8gICBsZXQgaXRlbSA9IHRhYmxlQ29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0cicpXHJcbiAgLy8gICBsZXQgZnVuID0ge1xyXG4gIC8vICAgICB2ckVkaXQ6IGFzeW5jIGluZGV4ID0+IHtcclxuICAvLyAgICAgICB0aGlzLmF0dHJpYnV0ZVZyID0gYXdhaXQgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52ci5jb250ZW50XHJcbiAgLy8gICAgICAgbGV0IHRhYmxlID0gdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnRcclxuICAvLyAgICAgICAgIC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdhdHRyaWJ1dGUtY29udGVudC12cicpWzFdXHJcbiAgLy8gICAgICAgICAuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndGFibGUnKVswXVxyXG4gIC8vICAgICAgIGxldCB0YWJsZUNvbnRlbnQgPSB0YWJsZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0YWJsZS1ib2R5JylbMF1cclxuICAvLyAgICAgICBsZXQgaXRlbSA9IHRhYmxlQ29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0cicpXHJcbiAgLy8gICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpdGVtLmxlbmd0aDsgaSsrKSB7XHJcbiAgLy8gICAgICAgICBpZiAoaW5kZXggPT09IGkpIHtcclxuICAvLyAgICAgICAgICAgbGV0IGhlaWdodCA9IGl0ZW1baV0ub2Zmc2V0SGVpZ2h0XHJcbiAgLy8gICAgICAgICAgIGxldCBodG1sID0gYFxyXG4gIC8vICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZFwiPlxyXG4gIC8vICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiaW5wdXRcIiB0eXBlPVwidGV4dFwiPlxyXG4gIC8vICAgICAgICAgICAgIDwvZGl2PlxyXG4gIC8vICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZFwiPlxyXG4gIC8vICAgICAgICAgICAgICAgPHRleHRhcmVhIGNsYXNzPVwiaW5wdXQgbGluay1lZGl0XCIgdHlwZT1cInRleHRcIj48L3RleHRhcmVhPlxyXG4gIC8vICAgICAgICAgICAgIDwvZGl2PlxyXG4gIC8vICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZFwiPlxyXG4gIC8vICAgICAgICAgICAgICAgICA8YnV0dG9uIEBjbGljaz1cImNvbmZpcm1FZGl0XCI+56Gu6K6kPC9idXR0b24+XHJcbiAgLy8gICAgICAgICAgICAgICAgIDxidXR0b24gQGNsaWNrPVwiY2FuY2VsRWRpdFwiPuWPlua2iDwvYnV0dG9uPlxyXG4gIC8vICAgICAgICAgICAgIDwvZGl2PmBcclxuICAvLyAgICAgICAgICAgaXRlbVtpXS5pbm5lckhUTUwgPSBodG1sXHJcbiAgLy8gICAgICAgICAgIGxldCB0ZXh0YXJlYUVsbSA9IGl0ZW1baV0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbGluay1lZGl0JylbMF1cclxuICAvLyAgICAgICAgICAgdGV4dGFyZWFFbG0uc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0IC0gMTAgKyAncHgnXHJcbiAgLy8gICAgICAgICAgIGxldCB0ZCA9IGl0ZW1baV0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndGQnKVxyXG4gIC8vICAgICAgICAgICB0ZFswXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFxyXG4gIC8vICAgICAgICAgICAgICdpbnB1dCdcclxuICAvLyAgICAgICAgICAgKVswXS52YWx1ZSA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudFtpbmRleF0ubmFtZVxyXG4gIC8vICAgICAgICAgICB0ZFsxXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFxyXG4gIC8vICAgICAgICAgICAgICdpbnB1dCdcclxuICAvLyAgICAgICAgICAgKVswXS52YWx1ZSA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudFtpbmRleF0udXJsXHJcbiAgLy8gICAgICAgICAgIGxldCBidG4gPSBpdGVtW2ldLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdidXR0b24nKVxyXG4gIC8vICAgICAgICAgICBmb3IgKGxldCBuID0gMDsgbiA8IGJ0bi5sZW5ndGg7IG4rKykge1xyXG4gIC8vICAgICAgICAgICAgIGlmICghYnRuW25dIHx8ICFidG5bbl0uYXR0cmlidXRlcykge1xyXG4gIC8vICAgICAgICAgICAgICAgY29udGludWVcclxuICAvLyAgICAgICAgICAgICB9XHJcbiAgLy8gICAgICAgICAgICAgZm9yIChsZXQgbSBvZiBidG5bbl0uYXR0cmlidXRlcykge1xyXG4gIC8vICAgICAgICAgICAgICAgaWYgKG0ubmFtZSA9PT0gJ0BjbGljaycpIHtcclxuICAvLyAgICAgICAgICAgICAgICAgYnRuW25dLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZSA9PiB7XHJcbiAgLy8gICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBmdW5bbS52YWx1ZV0gPT09ICdmdW5jdGlvbicpIHtcclxuICAvLyAgICAgICAgICAgICAgICAgICAgIGZ1blttLnZhbHVlXShcclxuICAvLyAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gIC8vICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHRkWzBdLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2lucHV0JylbMF0udmFsdWUsXHJcbiAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiB0ZFsxXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdpbnB1dCcpWzBdLnZhbHVlXHJcbiAgLy8gICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgLy8gICAgICAgICAgICAgICAgICAgICAgIGlcclxuICAvLyAgICAgICAgICAgICAgICAgICAgIClcclxuICAvLyAgICAgICAgICAgICAgICAgICB9XHJcbiAgLy8gICAgICAgICAgICAgICAgIH0pXHJcbiAgLy8gICAgICAgICAgICAgICAgIGJ0bltuXS5hdHRyaWJ1dGVzLnJlbW92ZU5hbWVkSXRlbShtLm5hbWUpXHJcbiAgLy8gICAgICAgICAgICAgICAgIGJyZWFrXHJcbiAgLy8gICAgICAgICAgICAgICB9XHJcbiAgLy8gICAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgICB9XHJcbiAgLy8gICAgICAgICAgIGJyZWFrXHJcbiAgLy8gICAgICAgICB9XHJcbiAgLy8gICAgICAgfVxyXG4gIC8vICAgICB9LFxyXG4gIC8vICAgICB2ckRlbGV0ZTogaSA9PiB7XHJcbiAgLy8gICAgICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52ci5jb250ZW50LnNwbGljZShpLCAxKVxyXG4gIC8vICAgICAgIHRoaXMuYXR0cmlidXRlVnIgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnRcclxuICAvLyAgICAgfSxcclxuXHJcbiAgLy8gICAgIGNvbmZpcm1FZGl0OiAodmFsdWUsIGkpID0+IHtcclxuICAvLyAgICAgICBsZXQgbmFtZSA9IHZhbHVlLm5hbWUgJiYgdmFsdWUubmFtZS5yZXBsYWNlKC9cXHMvZywgJycpXHJcbiAgLy8gICAgICAgbGV0IHVybCA9IHZhbHVlLnVybCAmJiB2YWx1ZS51cmwucmVwbGFjZSgvXFxzL2csICcnKVxyXG4gIC8vICAgICAgIGlmIChuYW1lICYmIHVybCkge1xyXG4gIC8vICAgICAgICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52ci5jb250ZW50W2ldID0gdmFsdWVcclxuICAvLyAgICAgICB9IGVsc2Uge1xyXG4gIC8vICAgICAgICAgd2luZG93LkVMRU1FTlQgJiZcclxuICAvLyAgICAgICAgICAgd2luZG93LkVMRU1FTlQuTWVzc2FnZSh7XHJcbiAgLy8gICAgICAgICAgICAgbWVzc2FnZTogJ+WQjeensOaIlumTvuaOpeS4jeiDveS4uuepuu+8gScsXHJcbiAgLy8gICAgICAgICAgICAgdHlwZTogJ3dhcm5pbmcnLFxyXG4gIC8vICAgICAgICAgICAgIGR1cmF0aW9uOiAxNTAwXHJcbiAgLy8gICAgICAgICAgIH0pXHJcbiAgLy8gICAgICAgfVxyXG4gIC8vICAgICAgIHRoaXMuYXR0cmlidXRlVnIgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnRcclxuICAvLyAgICAgfSxcclxuICAvLyAgICAgY2FuY2VsRWRpdDogKCkgPT4ge1xyXG4gIC8vICAgICAgIHRoaXMuYXR0cmlidXRlVnIgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnRcclxuICAvLyAgICAgfSxcclxuICAvLyAgICAgZmlsZVNlbGVjdDogKHZhbHVlLCBpKSA9PiB7XHJcbiAgLy8gICAgICAgbGV0IGZpbGVFbG0gPSBpdGVtW2ldLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2ZpbGUtc2VsZWN0JylbMF1cclxuICAvLyAgICAgICBmaWxlRWxtLmNsaWNrKClcclxuICAvLyAgICAgICBmaWxlRWxtLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGZpbGVTZWxlY3QpXHJcbiAgLy8gICAgICAgZmlsZUVsbS5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBmaWxlU2VsZWN0KVxyXG4gIC8vICAgICB9XHJcbiAgLy8gICB9XHJcbiAgLy8gICBsZXQgZmlsZVNlbGVjdCA9IGV2ZW50ID0+IHtcclxuICAvLyAgICAgaWYgKGV2ZW50LnRhcmdldC52YWx1ZSkge1xyXG4gIC8vICAgICAgIGxldCB0ZCA9IGl0ZW1bXHJcbiAgLy8gICAgICAgICBldmVudC50YXJnZXQuZ2V0QXR0cmlidXRlKCdpbmRleCcpXHJcbiAgLy8gICAgICAgXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0ZCcpXHJcbiAgLy8gICAgICAgdGRbMV0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaW5wdXQnKVswXS52YWx1ZSA9IGV2ZW50LnRhcmdldC52YWx1ZVxyXG4gIC8vICAgICAgIGV2ZW50LnRhcmdldC52YWx1ZSA9IG51bGxcclxuICAvLyAgICAgfVxyXG4gIC8vICAgfVxyXG4gIC8vICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpdGVtLmxlbmd0aDsgaSsrKSB7XHJcbiAgLy8gICAgIGxldCBidG4gPSBpdGVtW2ldLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdidXR0b24nKVxyXG4gIC8vICAgICBmb3IgKGxldCBuID0gMDsgbiA8IGJ0bi5sZW5ndGg7IG4rKykge1xyXG4gIC8vICAgICAgIGlmICghYnRuW25dIHx8ICFidG5bbl0uYXR0cmlidXRlcykge1xyXG4gIC8vICAgICAgICAgY29udGludWVcclxuICAvLyAgICAgICB9XHJcbiAgLy8gICAgICAgZm9yIChsZXQgbSBvZiBidG5bbl0uYXR0cmlidXRlcykge1xyXG4gIC8vICAgICAgICAgaWYgKG0ubmFtZSA9PT0gJ0BjbGljaycpIHtcclxuICAvLyAgICAgICAgICAgYnRuW25dLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZSA9PiB7XHJcbiAgLy8gICAgICAgICAgICAgaWYgKHR5cGVvZiBmdW5bbS52YWx1ZV0gPT09ICdmdW5jdGlvbicpIHtcclxuICAvLyAgICAgICAgICAgICAgIGZ1blttLnZhbHVlXShpKVxyXG4gIC8vICAgICAgICAgICAgIH1cclxuICAvLyAgICAgICAgICAgfSlcclxuICAvLyAgICAgICAgICAgYnRuW25dLmF0dHJpYnV0ZXMucmVtb3ZlTmFtZWRJdGVtKG0ubmFtZSlcclxuICAvLyAgICAgICAgICAgYnJlYWtcclxuICAvLyAgICAgICAgIH1cclxuICAvLyAgICAgICB9XHJcbiAgLy8gICAgIH1cclxuICAvLyAgIH1cclxuICAvLyB9XHJcblxyXG4gIC8vIGdldCBhdHRyaWJ1dGVHb29kcygpIHtcclxuICAvLyAgIHJldHVybiB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmdvb2RzLmNvbnRlbnRcclxuICAvLyB9XHJcblxyXG4gIC8vIHNldCBhdHRyaWJ1dGVHb29kcyh2KSB7XHJcbiAgLy8gICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmdvb2RzLmNvbnRlbnQgPSB2XHJcbiAgLy8gfVxyXG5cclxuICBzdGF0aWMgYXN5bmMgY3JlYXRlTGFiZWwodGhhdCkge1xyXG4gICAgbGV0IGhlaWdodFxyXG4gICAgbGV0IGdyb3VuZFxyXG4gICAgbGV0IG9iamVjdHNUb0V4Y2x1ZGUgPSBbLi4udGhhdC5zZGsudmlld2VyLmVudGl0aWVzLnZhbHVlc11cclxuICAgIHN3aXRjaCAodGhhdC5vcHRpb25zLmhlaWdodE1vZGUpIHtcclxuICAgICAgY2FzZSAnMCc6XHJcbiAgICAgIGNhc2UgMDpcclxuICAgICAgICBncm91bmQgPSBmYWxzZVxyXG4gICAgICAgIGhlaWdodCA9IHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbMF0uYWx0XHJcbiAgICAgICAgYnJlYWtcclxuICAgICAgY2FzZSAnMSc6XHJcbiAgICAgIGNhc2UgMTpcclxuICAgICAgICBncm91bmQgPSBmYWxzZVxyXG4gICAgICAgIGhlaWdodCA9IGF3YWl0IHRoYXQuZ2V0Q2xhbXBUb0hlaWdodCh7XHJcbiAgICAgICAgICBsbmc6IHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbMF0ubG5nLFxyXG4gICAgICAgICAgbGF0OiB0aGF0Lm9wdGlvbnMucG9zaXRpb25zWzBdLmxhdFxyXG4gICAgICAgIH0sIG9iamVjdHNUb0V4Y2x1ZGUpICsgdGhhdC5vcHRpb25zLnBvc2l0aW9uc1swXS5hbHRcclxuICAgICAgICBicmVha1xyXG4gICAgICBjYXNlICcyJzpcclxuICAgICAgY2FzZSAyOlxyXG4gICAgICAgIGdyb3VuZCA9IHRydWVcclxuICAgICAgICBoZWlnaHQgPSBhd2FpdCB0aGF0LmdldENsYW1wVG9IZWlnaHQoe1xyXG4gICAgICAgICAgbG5nOiB0aGF0Lm9wdGlvbnMucG9zaXRpb25zWzBdLmxuZyxcclxuICAgICAgICAgIGxhdDogdGhhdC5vcHRpb25zLnBvc2l0aW9uc1swXS5sYXRcclxuICAgICAgICB9LCBvYmplY3RzVG9FeGNsdWRlKVxyXG4gICAgICAgIGJyZWFrXHJcbiAgICB9XHJcbiAgICBpZiAoIXRoYXQub3B0aW9ucy5sYWJlbC5wb3NpdGlvbikge1xyXG4gICAgICB0aGF0Lm9wdGlvbnMubGFiZWwucG9zaXRpb24gPSB7XHJcbiAgICAgICAgbG5nOiB0aGF0Lm9wdGlvbnMucG9zaXRpb25zWzBdLmxuZyxcclxuICAgICAgICBsYXQ6IHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbMF0ubGF0LFxyXG4gICAgICAgIGFsdDogaGVpZ2h0XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoYXQubGFiZWwgPSBuZXcgTGFiZWxPYmplY3QodGhhdC5zZGssIHtcclxuICAgICAgaWQ6IHRoYXQub3B0aW9ucy5pZCxcclxuICAgICAgc2hvdzogdGhhdC5vcHRpb25zLnNob3cgPyB0aGF0Lm9wdGlvbnMubGFiZWwuc2hvdyA6IGZhbHNlLFxyXG4gICAgICBwb3NpdGlvbjogW1xyXG4gICAgICAgIHRoYXQub3B0aW9ucy5sYWJlbC5wb3NpdGlvbi5sbmcsXHJcbiAgICAgICAgdGhhdC5vcHRpb25zLmxhYmVsLnBvc2l0aW9uLmxhdCxcclxuICAgICAgICB0aGF0Lm9wdGlvbnMubGFiZWwucG9zaXRpb24uYWx0XHJcbiAgICAgIF0sXHJcbiAgICAgIHRleHQ6IHRoYXQub3B0aW9ucy5uYW1lLFxyXG4gICAgICBmb250U2l6ZTogdGhhdC5vcHRpb25zLmxhYmVsLmZvbnRTaXplLFxyXG4gICAgICBmb250RmFtaWx5OiB0aGF0Lm9wdGlvbnMubGFiZWwuZm9udEZhbWlseSxcclxuICAgICAgY29sb3I6IHRoYXQub3B0aW9ucy5sYWJlbC5jb2xvcixcclxuICAgICAgcGl4ZWxPZmZzZXQ6IHRoYXQub3B0aW9ucy5sYWJlbC5waXhlbE9mZnNldCxcclxuICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGF0Lm9wdGlvbnMubGFiZWwuYmFja2dyb3VuZENvbG9yLFxyXG4gICAgICBsaW5lQ29sb3I6IHRoYXQub3B0aW9ucy5sYWJlbC5saW5lQ29sb3IsXHJcbiAgICAgIGxpbmVXaWR0aDogdGhhdC5vcHRpb25zLmxhYmVsLmxpbmVXaWR0aCxcclxuICAgICAgc2NhbGVCeURpc3RhbmNlOiB0aGF0Lm9wdGlvbnMubGFiZWwuc2NhbGVCeURpc3RhbmNlLFxyXG4gICAgICBuZWFyOiB0aGF0Lm9wdGlvbnMubGFiZWwubmVhcixcclxuICAgICAgZmFyOiB0aGF0Lm9wdGlvbnMubGFiZWwuZmFyLFxyXG4gICAgICBncm91bmQ6IGdyb3VuZFxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIHN0YXRpYyBjcmVhdGUodGhhdCkge1xyXG4gICAgbGV0IGdyb3VuZFxyXG4gICAgaWYgKHRoYXQuaGVpZ2h0TW9kZSA9PSAyKSB7XHJcbiAgICAgIGdyb3VuZCA9IHRydWVcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGdyb3VuZCA9IGZhbHNlXHJcbiAgICB9XHJcbiAgICBsZXQgcG9zaXRpb25zID0gdGhhdC5vcHRpb25zLnBvc2l0aW9uc1xyXG4gICAgbGV0IGZyb21EZWdyZWVzQXJyYXkgPSB0aGF0LnJlbmV3UG9zaXRpb25zKHBvc2l0aW9ucylcclxuICAgIHRoYXQuZW50aXR5ID0gdGhhdC5zZGsudmlld2VyLmVudGl0aWVzLmFkZCh7XHJcbiAgICAgIGlkOiB0aGF0Lm9wdGlvbnMuaWQsXHJcbiAgICAgIHNob3c6IHRoYXQub3B0aW9ucy5zaG93LFxyXG4gICAgICBwb2x5bGluZToge1xyXG4gICAgICAgIHBvc2l0aW9uczogQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXNBcnJheUhlaWdodHMoZnJvbURlZ3JlZXNBcnJheSksXHJcbiAgICAgICAgd2lkdGg6IHRoYXQub3B0aW9ucy53aWR0aCxcclxuICAgICAgICBjbGFtcFRvR3JvdW5kOiBncm91bmQsXHJcbiAgICAgICAgLy8gbWF0ZXJpYWw6IHRoYXQuZ2V0TWF0ZXJpYWwodGhhdC5vcHRpb25zLmNvbG9yLCB0aGF0Lm9wdGlvbnMudHlwZSksXHJcbiAgICAgICAgekluZGV4OiB0aGF0LnNkay5fZW50aXR5WkluZGV4XHJcbiAgICAgIH1cclxuICAgIH0pXHJcblxyXG4gICAgdGhhdC5lbnRpdHkucG9seWxpbmUub3JpV2lkdGggPSB0aGF0Lm9wdGlvbnMud2lkdGhcclxuICAgIHRoYXQuanVkZ2VMaW5lKHRoYXQuZW50aXR5LCB0aGF0Lm9wdGlvbnMpXHJcblxyXG4gICAgbGV0IHBhcmFtcyA9IHsgLi4udGhhdC5vcHRpb25zIH1cclxuICAgIHBhcmFtcy5zcGVlZCA9IHRoYXQuaW5wdXRTcGVlZFxyXG4gICAgdGhhdC5lbnRpdHkucG9seWxpbmUubWF0ZXJpYWwgPSB0aGF0LmdldE1hdGVyaWFsKFxyXG4gICAgICB0aGF0Lm9wdGlvbnMuY29sb3IsXHJcbiAgICAgIHRoYXQub3B0aW9ucy50eXBlLFxyXG4gICAgICB0aGF0LmVudGl0eSxcclxuICAgICAgcGFyYW1zXHJcbiAgICApXHJcblxyXG4gICAgdGhhdC5zZGsuX2VudGl0eVpJbmRleCsrXHJcbiAgICBDdXJ2ZWxpbmVPYmplY3QuY3JlYXRlTGFiZWwodGhhdClcclxuICAgIC8vIHRoYXQuZW50aXR5LnBvbHlsaW5lLnBvc2l0aW9uc0xuZ0xhdCA9IHBvc2l0aW9uc1xyXG4gICAgdGhhdC5yZW5ld1BvbHlnb24oZnJvbURlZ3JlZXNBcnJheSlcclxuICAgIC8vIHRoYXQub3B0aW9ucy5sZW5ndGhCeU1ldGVyID0gdGhhdC5jb21wdXRlRGlzdGFuY2UyKHRoYXQuc21vb3RoSGFuZGxlKHBvc2l0aW9ucyksIDIsIGdyb3VuZClcclxuICAgIC8vIHRoYXQubGVuZ3RoVW5pdCA9IHRoYXQub3B0aW9uc1snbGVuZ3RoLXVuaXQnXVxyXG4gICAgLy8gc3luY0RhdGEodGhhdC5zZGssIHRoYXQub3B0aW9ucy5pZClcclxuICAgIC8vIGlmICh0aGF0Lm9wdGlvbnMuc2hvdykge1xyXG4gICAgLy8gICBzZXRTcGxpdERpcmVjdGlvbigwLCB0aGF0Lm9wdGlvbnMuaWQpXHJcbiAgICAvLyB9XHJcblxyXG4gICAgdGhhdC5jb21wdXRlRGlzdGFuY2UoXHJcbiAgICAgIHRoYXQuc21vb3RoSGFuZGxlKHBvc2l0aW9ucyksXHJcbiAgICAgIDIsXHJcbiAgICAgIHRoYXQub3B0aW9ucy53b3Jkc05hbWVcclxuICAgICkudGhlbihyZXMgPT4ge1xyXG4gICAgICB0aGF0Lmxlbmd0aEJ5TWV0ZXIgPSByZXNcclxuICAgICAgdGhhdC5sZW5ndGhDaGFuZ2VDYWxsQmFjayAmJiB0aGF0Lmxlbmd0aENoYW5nZUNhbGxCYWNrKClcclxuICAgICAgc3luY0RhdGEodGhhdC5zZGssIHRoYXQub3B0aW9ucy5pZClcclxuICAgIH0pXHJcbiAgICBpZiAodGhhdC5vcHRpb25zLnNob3cpIHtcclxuICAgICAgc2V0U3BsaXREaXJlY3Rpb24oMCwgdGhhdC5vcHRpb25zLmlkKVxyXG4gICAgfVxyXG5cclxuICAgIC8vIGlmICh0aGlzLm9wdGlvbnMubm9zZVRvVGFpbCkge1xyXG4gICAgLy8gICBsZXQgYXJyYXkgPSBbXVxyXG4gICAgLy8gICBmb3IgKGxldCBpID0gMDsgaSA8IGZyb21EZWdyZWVzQXJyYXkubGVuZ3RoOyBpICs9IDIpIHtcclxuICAgIC8vICAgICBhcnJheS5wdXNoKHsgbG5nOiBmcm9tRGVncmVlc0FycmF5W2ldLCBsYXQ6IGZyb21EZWdyZWVzQXJyYXlbaSArIDFdIH0pXHJcbiAgICAvLyAgIH1cclxuICAgIC8vICAgdGhpcy5vcHRpb25zLmZpdF9sZW5ndGggPSB0b29sLmNvbXB1dGVEaXN0YW5jZTIoYXJyYXkpXHJcbiAgICAvLyB9XHJcbiAgICAvLyBlbHNlIHtcclxuICAgIC8vICAgdGhpcy5vcHRpb25zLmZpdF9sZW5ndGggPSB0b29sLmNvbXB1dGVEaXN0YW5jZTIocG9zaXRpb25zKVxyXG4gICAgLy8gfVxyXG4gICAgLy8gaWYgKHRoaXMub3B0aW9ucy5maXRfbGVuZ3RoX3VuaXQgPT09ICdrbScpIHtcclxuICAgIC8vICAgdGhpcy5vcHRpb25zLmZpdF9sZW5ndGggPSB0aGlzLm9wdGlvbnMuZml0X2xlbmd0aCAvIDEwMDBcclxuICAgIC8vIH1cclxuXHJcbiAgICBsZXQgc2NlbmUgPSB0aGF0LnNkay52aWV3ZXIuc2NlbmVcclxuICB9XHJcbiAganVkZ2VMaW5lKGVudGl0eSwgbmV3UGFyYW0pIHtcclxuICAgIGlmICghZW50aXR5LnBvbHlsaW5lLm9yaVJlcGVhdCkge1xyXG4gICAgICBsZXQgcGFyYW0gPSB7XHJcbiAgICAgICAgY29sb3I6IG5ld1BhcmFtLmNvbG9yLFxyXG4gICAgICAgIGltYWdlOiB0aGlzLmdldFNvdXJjZVJvb3RQYXRoKCkgKyBgL2ltZy9hcnJvdy8xLnBuZ2AsXHJcbiAgICAgICAgc3BhY2U6IG5ld1BhcmFtLnNwYWNlLFxyXG4gICAgICAgIHNwZWVkOiBuZXdQYXJhbS5zcGVlZFxyXG4gICAgICB9XHJcblxyXG4gICAgICBwYXJhbS5zcGVlZCA9IG5ld1BhcmFtLnJvdGF0ZSA/IHBhcmFtLnNwZWVkIDogMCAtIHBhcmFtLnNwZWVkXHJcblxyXG4gICAgICBjb25zdCBjYW52YXNFbGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcclxuICAgICAgY29uc3QgY3R4ID0gY2FudmFzRWxlLmdldENvbnRleHQoJzJkJylcclxuICAgICAgY29uc3QgbXlJbWcgPSBuZXcgSW1hZ2UoKVxyXG4gICAgICAvLyBteUltZy5zcmMgPSB0aGF0LmdldFNvdXJjZVJvb3RQYXRoKCkgKyAnL2ltZy9hcnJvdy8xLnBuZydcclxuICAgICAgbXlJbWcuc3JjID0gcGFyYW0uaW1hZ2VcclxuICAgICAgbGV0IHRoYXQgPSB0aGlzXHJcbiAgICAgIG15SW1nLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBjYW52YXNFbGUud2lkdGggPSBteUltZy53aWR0aCAqIChwYXJhbS5zcGFjZSArIDEpXHJcbiAgICAgICAgY2FudmFzRWxlLmhlaWdodCA9IG15SW1nLmhlaWdodFxyXG5cclxuICAgICAgICBsZXQgb3JpUmVwZWF0ID0gdGhhdC5nZXRTY2VlbkxpbmUoZW50aXR5LCBwYXJhbSwgY2FudmFzRWxlKVxyXG4gICAgICAgIG9yaVJlcGVhdCAmJiAoZW50aXR5LnBvbHlsaW5lLm9yaVJlcGVhdCA9IG9yaVJlcGVhdClcclxuXHJcblxyXG4gICAgICAgIHZhciBwb3NpdGlvblByb3BlcnR5ID0gZW50aXR5LnBvbHlsaW5lLnBvc2l0aW9ucztcclxuICAgICAgICB2YXIgcG9zaXRpb25zID0gcG9zaXRpb25Qcm9wZXJ0eS5nZXRWYWx1ZSh0aGF0LnNkay52aWV3ZXIuY2xvY2suY3VycmVudFRpbWUpO1xyXG5cclxuICAgICAgICBpZiAoIUNlc2l1bS5kZWZpbmVkKHBvc2l0aW9ucykpIHtcclxuICAgICAgICAgIHJldHVybiBuZXcgQ2VzaXVtLkNhcnRlc2lhbjIoMS4wLCAxLjApO1xyXG4gICAgICAgICAgLy8gcmV0dXJuIDEuMDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBkaXN0YW5jZSA9IDA7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwb3NpdGlvbnMubGVuZ3RoIC0gMTsgKytpKSB7XHJcbiAgICAgICAgICBkaXN0YW5jZSArPSBDZXNpdW0uQ2FydGVzaWFuMy5kaXN0YW5jZShwb3NpdGlvbnNbaV0sIHBvc2l0aW9uc1tpICsgMV0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIHJlcGVhdFggPSBkaXN0YW5jZSAvIGVudGl0eS5wb2x5bGluZS53aWR0aC5nZXRWYWx1ZSgpO1xyXG4gICAgICAgIC8vIOagueaNruWcsOWbvue8qeaUvueoi+W6puiwg+aVtHJlcGVhdFhcclxuICAgICAgICB2YXIgY2FtZXJhSGVpZ2h0ID0gdGhhdC5zZGsudmlld2VyLmNhbWVyYS5wb3NpdGlvbkNhcnRvZ3JhcGhpYy5oZWlnaHQ7XHJcbiAgICAgICAgdmFyIGJvdW5kaW5nU3BoZXJlID0gbmV3IENlc2l1bS5Cb3VuZGluZ1NwaGVyZShcclxuICAgICAgICAgIG5ldyBDZXNpdW0uQ2FydGVzaWFuMygtMTAwMDAwMCwgMCwgMCksIC8vIOS4reW/g+eCueWdkOagh1xyXG4gICAgICAgICAgNTAwMDAwIC8vIOWNiuW+hO+8iOi3neemu++8iVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIC8vIOiOt+WPlue7mOWbvue8k+WGsuWMuueahOWuveW6puWSjOmrmOW6pu+8iOmAmuW4uOaYr+Wxj+W5leeahOWIhui+qOeOh++8iVxyXG4gICAgICAgIHZhciBkcmF3aW5nQnVmZmVyV2lkdGggPSB0aGF0LnNkay52aWV3ZXIuY2FudmFzLmNsaWVudFdpZHRoO1xyXG4gICAgICAgIHZhciBkcmF3aW5nQnVmZmVySGVpZ2h0ID0gdGhhdC5zZGsudmlld2VyLmNhbnZhcy5jbGllbnRIZWlnaHQ7XHJcblxyXG4gICAgICAgIC8vIOS9v+eUqCBnZXRQaXhlbFNpemUg5pa55rOV6I635Y+W5YyF5Zu055CD5Zyo5bGP5bmV5LiK55qE5YOP57Sg5aSn5bCPXHJcbiAgICAgICAgdmFyIGdyb3VuZFJlc29sdXRpb24gPSB0aGF0LnNkay52aWV3ZXIuc2NlbmUuY2FtZXJhLmdldFBpeGVsU2l6ZShib3VuZGluZ1NwaGVyZSwgZHJhd2luZ0J1ZmZlcldpZHRoLCBkcmF3aW5nQnVmZmVySGVpZ2h0KVxyXG4gICAgICAgIHJlcGVhdFggKj0gZ3JvdW5kUmVzb2x1dGlvbiAvIGNhbWVyYUhlaWdodCAvIChwYXJhbS5zcGFjZSAqIChjYW52YXNFbGUud2lkdGggLyBjYW52YXNFbGUuaGVpZ2h0ICogNSkgKyAxKTtcclxuICAgICAgICAvLyBpZiAoZW50aXR5LnBvbHlsaW5lLm1hdGVyaWFsLm9yaVJlcGVhdCkge1xyXG5cclxuICAgICAgICBpZiAodGhhdC5zZGsudmlld2VyLnNjZW5lLm1vZGUgPT09IENlc2l1bS5TY2VuZU1vZGUuU0NFTkUzRCkge1xyXG4gICAgICAgICAgbGV0IHNwZWVkID0gcmVwZWF0WCAvIGVudGl0eS5wb2x5bGluZS5vcmlSZXBlYXRcclxuICAgICAgICAgIGVudGl0eS5wb2x5bGluZS5vcmlTcGVlZCA9IHNwZWVkXHJcbiAgICAgICAgICBlbnRpdHkucG9seWxpbmUub3JpUmVwZWF0WCA9IHJlcGVhdFhcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgbGV0IHNkazNkID0gZ2V0M0RWaWV3KClcclxuICAgICAgICAgIGxldCBzZGszZEVudGl0eSA9IHNkazNkLnZpZXdlci5lbnRpdGllcy5nZXRCeUlkKHRoYXQub3B0aW9ucy5pZClcclxuICAgICAgICAgIGVudGl0eS5wb2x5bGluZS5vcmlTcGVlZCA9IHNkazNkRW50aXR5LnBvbHlsaW5lLm9yaVNwZWVkXHJcbiAgICAgICAgICBlbnRpdHkucG9seWxpbmUub3JpUmVwZWF0WCA9IHNkazNkRW50aXR5LnBvbHlsaW5lLm9yaVJlcGVhdFhcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICB9XHJcbiAgfVxyXG4gIC8qKuiOt+WPluW9k+WJjea7oeWxj+aoque6v+mAn+W6piAqL1xyXG4gIGdldFNjZWVuTGluZShlbnRpdHksIG9wdGlvbnMsIGNhbnZhc0VsZSkge1xyXG4gICAgbGV0IHBvaW50MSA9IG5ldyBDZXNpdW0uQ2FydGVzaWFuMigwLCB0aGlzLnNkay52aWV3ZXIuY2FudmFzLmNsaWVudEhlaWdodClcclxuICAgIGxldCBwb2ludDIgPSBuZXcgQ2VzaXVtLkNhcnRlc2lhbjIodGhpcy5zZGsudmlld2VyLmNhbnZhcy5jbGllbnRXaWR0aCAvIDIsIHRoaXMuc2RrLnZpZXdlci5jYW52YXMuY2xpZW50SGVpZ2h0KVxyXG4gICAgLy8gdmFyIGNhcnRlc2lhbjEgPSB0aGlzLnNkay52aWV3ZXIuc2NlbmUucGlja1Bvc2l0aW9uKHBvaW50MSlcclxuICAgIC8vIHZhciBjYXJ0ZXNpYW4yID0gdGhpcy5zZGsudmlld2VyLnNjZW5lLnBpY2tQb3NpdGlvbihwb2ludDIpXHJcblxyXG4gICAgbGV0IHJheSA9IHRoaXMuc2RrLnZpZXdlci5jYW1lcmEuZ2V0UGlja1JheShwb2ludDEpO1xyXG4gICAgbGV0IGNhcnRlc2lhbjEgPSB0aGlzLnNkay52aWV3ZXIuc2NlbmUuZ2xvYmUucGljayhyYXksIHRoaXMuc2RrLnZpZXdlci5zY2VuZSk7XHJcblxyXG4gICAgbGV0IHJheTIgPSB0aGlzLnNkay52aWV3ZXIuY2FtZXJhLmdldFBpY2tSYXkocG9pbnQyKTtcclxuICAgIGxldCBjYXJ0ZXNpYW4yID0gdGhpcy5zZGsudmlld2VyLnNjZW5lLmdsb2JlLnBpY2socmF5MiwgdGhpcy5zZGsudmlld2VyLnNjZW5lKTtcclxuICAgIC8vIGlmICghY2FydGVzaWFuMSB8fCAhY2FydGVzaWFuMikge1xyXG4gICAgLy8gICBsZXQgcmF5ID0gdGhpcy5zZGsudmlld2VyLmNhbWVyYS5nZXRQaWNrUmF5KHBvaW50MSk7XHJcbiAgICAvLyAgIGNhcnRlc2lhbjEgPSB0aGlzLnNkay52aWV3ZXIuc2NlbmUuZ2xvYmUucGljayhyYXksIHRoaXMuc2RrLnZpZXdlci5zY2VuZSk7XHJcblxyXG4gICAgLy8gICBsZXQgcmF5MiA9IHRoaXMuc2RrLnZpZXdlci5jYW1lcmEuZ2V0UGlja1JheShwb2ludDIpO1xyXG4gICAgLy8gICBjYXJ0ZXNpYW4yID0gdGhpcy5zZGsudmlld2VyLnNjZW5lLmdsb2JlLnBpY2socmF5MiwgdGhpcy5zZGsudmlld2VyLnNjZW5lKTtcclxuICAgIC8vIH1cclxuICAgIGlmIChjYXJ0ZXNpYW4xICYmIGNhcnRlc2lhbjIpIHtcclxuXHJcblxyXG4gICAgICB2YXIgZGlzdGFuY2UgPSBDZXNpdW0uQ2FydGVzaWFuMy5kaXN0YW5jZShjYXJ0ZXNpYW4xLCBjYXJ0ZXNpYW4yKTtcclxuXHJcbiAgICAgIHZhciByZXBlYXRYID0gZGlzdGFuY2UgLyBlbnRpdHkucG9seWxpbmUud2lkdGguZ2V0VmFsdWUoKTtcclxuICAgICAgLy8g5qC55o2u5Zyw5Zu+57yp5pS+56iL5bqm6LCD5pW0cmVwZWF0WFxyXG4gICAgICB2YXIgY2FtZXJhSGVpZ2h0ID0gdGhpcy5zZGsudmlld2VyLmNhbWVyYS5wb3NpdGlvbkNhcnRvZ3JhcGhpYy5oZWlnaHQ7XHJcbiAgICAgIHZhciBib3VuZGluZ1NwaGVyZSA9IG5ldyBDZXNpdW0uQm91bmRpbmdTcGhlcmUoXHJcbiAgICAgICAgbmV3IENlc2l1bS5DYXJ0ZXNpYW4zKC0xMDAwMDAwLCAwLCAwKSwgLy8g5Lit5b+D54K55Z2Q5qCHXHJcbiAgICAgICAgNTAwMDAwIC8vIOWNiuW+hO+8iOi3neemu++8iVxyXG4gICAgICApO1xyXG5cclxuXHJcbiAgICAgIC8vIOiOt+WPlue7mOWbvue8k+WGsuWMuueahOWuveW6puWSjOmrmOW6pu+8iOmAmuW4uOaYr+Wxj+W5leeahOWIhui+qOeOh++8iVxyXG4gICAgICB2YXIgZHJhd2luZ0J1ZmZlcldpZHRoID0gdGhpcy5zZGsudmlld2VyLmNhbnZhcy5jbGllbnRXaWR0aDtcclxuICAgICAgdmFyIGRyYXdpbmdCdWZmZXJIZWlnaHQgPSB0aGlzLnNkay52aWV3ZXIuY2FudmFzLmNsaWVudEhlaWdodDtcclxuXHJcbiAgICAgIC8vIOS9v+eUqCBnZXRQaXhlbFNpemUg5pa55rOV6I635Y+W5YyF5Zu055CD5Zyo5bGP5bmV5LiK55qE5YOP57Sg5aSn5bCPXHJcbiAgICAgIHZhciBncm91bmRSZXNvbHV0aW9uID0gdGhpcy5zZGsudmlld2VyLnNjZW5lLmNhbWVyYS5nZXRQaXhlbFNpemUoYm91bmRpbmdTcGhlcmUsIGRyYXdpbmdCdWZmZXJXaWR0aCwgZHJhd2luZ0J1ZmZlckhlaWdodClcclxuICAgICAgLy8gcmVwZWF0WCAqPSBncm91bmRSZXNvbHV0aW9uIC8gY2FtZXJhSGVpZ2h0IC8gKChteUltZy53aWR0aCAvIG15SW1nLmhlaWdodCAqIDUpICsgMSk7XHJcbiAgICAgIGlmIChncm91bmRSZXNvbHV0aW9uID4gNzAwKSB7XHJcbiAgICAgICAgcmVwZWF0WCAqPSBncm91bmRSZXNvbHV0aW9uIC8gY2FtZXJhSGVpZ2h0IC8gKG9wdGlvbnMuc3BhY2UgKiAoY2FudmFzRWxlLndpZHRoIC8gY2FudmFzRWxlLmhlaWdodCAqIDUpICsgMSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmVwZWF0WCA9IHVuZGVmaW5lZDtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHRoaXMuc2RrLnZpZXdlci5zY2VuZS5tb2RlID09PSBDZXNpdW0uU2NlbmVNb2RlLlNDRU5FM0QpIHtcclxuICAgICAgICByZXR1cm4gcmVwZWF0WFxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGxldCBzZGszZCA9IGdldDNEVmlldygpXHJcbiAgICAgICAgbGV0IHNkazNkRW50aXR5ID0gc2RrM2Qudmlld2VyLmVudGl0aWVzLmdldEJ5SWQodGhpcy5vcHRpb25zLmlkKVxyXG4gICAgICAgIHJldHVybiBzZGszZEVudGl0eS5wb2x5bGluZS5vcmlSZXBlYXRYXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbiAgLyoqXHJcbiAgICog57yW6L6R5qGGXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBzdGF0ZSB0cnVl5omT5byA77yMZmFsc2XlhbPpl61cclxuICAgKi9cclxuICBhc3luYyBlZGl0KHN0YXRlKSB7XHJcbiAgICByZXR1cm5cclxuICAgIGxldCBfdGhpcyA9IHRoaXNcclxuICAgIHRoaXMub3JpZ2luYWxPcHRpb25zID0gdGhpcy5kZWVwQ29weU9iaih0aGlzLm9wdGlvbnMpXHJcbiAgICBpZiAodGhpcy5fRGlhbG9nT2JqZWN0ICYmIHRoaXMuX0RpYWxvZ09iamVjdC5jbG9zZSkge1xyXG4gICAgICB0aGlzLl9EaWFsb2dPYmplY3QuY2xvc2UoKVxyXG4gICAgICB0aGlzLl9EaWFsb2dPYmplY3QgPSBudWxsXHJcbiAgICB9XHJcbiAgICBpZiAoc3RhdGUpIHtcclxuICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0ID0gYXdhaXQgbmV3IERpYWxvZyh0aGlzLnNkaywgdGhpcy5vcHRpb25zLCB7XHJcbiAgICAgICAgdGl0bGU6ICfmm7Lnur/lsZ7mgKcnLFxyXG4gICAgICAgIGxlZnQ6ICcxODBweCcsXHJcbiAgICAgICAgdG9wOiAnMTAwcHgnLFxyXG4gICAgICAgIGNvbmZpcm1DYWxsQmFjazogb3B0aW9ucyA9PiB7XHJcbiAgICAgICAgICB0aGlzLm5hbWUgPSB0aGlzLm5hbWUudHJpbSgpXHJcbiAgICAgICAgICBpZiAoIXRoaXMubmFtZSkge1xyXG4gICAgICAgICAgICB0aGlzLm5hbWUgPSAn5pyq5ZG95ZCN5a+56LGhJ1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5vcHRpb25zLmxhYmVsLnBvc2l0aW9uID0ge1xyXG4gICAgICAgICAgICBsbmc6IHRoaXMubGFiZWwucG9zaXRpb25bMF0sXHJcbiAgICAgICAgICAgIGxhdDogdGhpcy5sYWJlbC5wb3NpdGlvblsxXSxcclxuICAgICAgICAgICAgYWx0OiB0aGlzLmxhYmVsLnBvc2l0aW9uWzJdXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLm9yaWdpbmFsT3B0aW9ucyA9IHRoaXMuZGVlcENvcHlPYmoodGhpcy5vcHRpb25zKVxyXG4gICAgICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0LmNsb3NlKClcclxuICAgICAgICAgIHRoaXMuRGlhbG9nLmNvbmZpcm1DYWxsQmFjayAmJlxyXG4gICAgICAgICAgICB0aGlzLkRpYWxvZy5jb25maXJtQ2FsbEJhY2sodGhpcy5vcmlnaW5hbE9wdGlvbnMpXHJcbiAgICAgICAgICBzeW5jRGF0YSh0aGlzLnNkaywgdGhpcy5vcHRpb25zLmlkKVxyXG4gICAgICAgICAgc3luY1NwbGl0RGF0YSh0aGlzLnNkaywgdGhpcy5vcHRpb25zLmlkKVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgcmVzZXRDYWxsQmFjazogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5yZXNldCgpXHJcbiAgICAgICAgICB0aGlzLkRpYWxvZy5yZXNldENhbGxCYWNrICYmIHRoaXMuRGlhbG9nLnJlc2V0Q2FsbEJhY2soKVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgcmVtb3ZlQ2FsbEJhY2s6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMuRGlhbG9nLnJlbW92ZUNhbGxCYWNrICYmIHRoaXMuRGlhbG9nLnJlbW92ZUNhbGxCYWNrKClcclxuICAgICAgICB9LFxyXG4gICAgICAgIGNsb3NlQ2FsbEJhY2s6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMucmVzZXQoKVxyXG4gICAgICAgICAgdGhpcy5EaWFsb2cuY2xvc2VDYWxsQmFjayAmJiB0aGlzLkRpYWxvZy5jbG9zZUNhbGxCYWNrKClcclxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5ub2RlUG9pbnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2RrLnZpZXdlci5lbnRpdGllcy5yZW1vdmUodGhpcy5ub2RlUG9pbnRzW2ldKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5ub2RlUG9pbnRzID0gW11cclxuICAgICAgICAgIHRoaXMucG9zaXRpb25FZGl0aW5nID0gZmFsc2VcclxuICAgICAgICB9LFxyXG4gICAgICAgIHNob3dDYWxsQmFjazogc2hvdyA9PiB7XHJcbiAgICAgICAgICB0aGlzLm9wdGlvbnMuc2hvdyA9IHNob3dcclxuICAgICAgICAgIHRoaXMub3JpZ2luYWxPcHRpb25zLnNob3cgPSBzaG93XHJcbiAgICAgICAgICB0aGlzLnNob3cgPSBzaG93XHJcbiAgICAgICAgICB0aGlzLkRpYWxvZy5zaG93Q2FsbEJhY2sgJiYgdGhpcy5EaWFsb2cuc2hvd0NhbGxCYWNrKClcclxuICAgICAgICB9LFxyXG4gICAgICAgIHRyYW5zbGF0aW9uYWxDYWxsQmFjazogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5wb3NpdGlvbkVkaXRpbmcgPSAhdGhpcy5wb3NpdGlvbkVkaXRpbmdcclxuICAgICAgICB9LFxyXG4gICAgICAgIC8vIOS6jOasoee8lui+keWbnuiwg1xyXG4gICAgICAgIHNlY29uZGFyeUVkaXRDYWxsQmFjazogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5wb3NpdGlvbkVkaXRpbmcgPSBmYWxzZVxyXG4gICAgICAgICAgdGhpcy5ub3NlVG9UYWlsID0gZmFsc2VcclxuICAgICAgICAgIHRoaXMuaGVpZ2h0TW9kZSA9IDBcclxuICAgICAgICAgIHRoaXMubm9kZUVkaXQoKVxyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmJvZHkuY2xhc3NOYW1lID1cclxuICAgICAgICB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuYm9keS5jbGFzc05hbWUgKyAnIHBvbHlsaW5lJ1xyXG4gICAgICBsZXQgY29udGVudEVsbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpXHJcbiAgICAgIGNvbnRlbnRFbG0uaW5uZXJIVE1MID0gaHRtbCh0aGlzKVxyXG4gICAgICB0aGlzLl9EaWFsb2dPYmplY3QuY29udGVudEFwcENoaWxkKGNvbnRlbnRFbG0pXHJcbiAgICAgIHRoaXMuYXR0cmlidXRlVHlwZSA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGVUeXBlXHJcbiAgICAgIC8vIHRoaXMuYXR0cmlidXRlQ2FtZXJhID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5jYW1lcmEuY29udGVudFxyXG4gICAgICAvLyB0aGlzLmF0dHJpYnV0ZUdvb2RzID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5nb29kcy5jb250ZW50XHJcbiAgICAgIGZ1bmN0aW9uIHRhYkNsaWNrKGUpIHtcclxuICAgICAgICBpZiAoZSA9PT0gJzInIHx8IGUgPT09IDIpIHsvL+eCueWHu+e6v+adoeagt+W8j1xyXG4gICAgICAgICAgaWYgKDIgPCBfdGhpcy5vcHRpb25zLnR5cGUgJiYgX3RoaXMub3B0aW9ucy50eXBlIDwgMTMpIHsvL+i0tOWbvuWPguaVsFxyXG4gICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGFzaFRleHR1cmVEb20nKSAmJiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rhc2hUZXh0dXJlRG9tJykuc3R5bGUuZGlzcGxheSA9ICdmbGV4JylcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkYXNoVGV4dHVyZURvbScpICYmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGFzaFRleHR1cmVEb20nKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgLy8g5Yib5bu65qCH562+6aG1XHJcbiAgICAgIGxldCB0YWJzRWxtID0gbmV3IGN5X3RhYnMoXHJcbiAgICAgICAgJ3BvbHlsaW5lLW9iamVjdC1lZGl0LXRhYnMnLFxyXG4gICAgICAgIHVuZGVmaW5lZCxcclxuICAgICAgICB0aGlzLnNka1xyXG4gICAgICApXHJcbiAgICAgIC8vIOminOiJsue7hOS7tlxyXG4gICAgICBsZXQgY29sb3JQaWNrZXIgPSBuZXcgWUpDb2xvclBpY2tlcih7XHJcbiAgICAgICAgZWw6IGNvbnRlbnRFbG0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnY29sb3InKVswXSxcclxuICAgICAgICBzaXplOiAnbWluaScsIC8v6aKc6ImyYm9457G75Z6LXHJcbiAgICAgICAgYWxwaGE6IHRydWUsIC8v5piv5ZCm5byA5ZCv6YCP5piO5bqmXHJcbiAgICAgICAgZGVmYXVsdENvbG9yOiB0aGlzLmNvbG9yLFxyXG4gICAgICAgIGRpc2FibGVkOiBmYWxzZSwgLy/mmK/lkKbnpoHmraLmiZPlvIDpopzoibLpgInmi6nlmahcclxuICAgICAgICBvcGVuUGlja2VyQW5pOiAnb3BhY2l0eScsIC8v5omT5byA6aKc6Imy6YCJ5oup5Zmo5Yqo55S7XHJcbiAgICAgICAgc3VyZTogY29sb3IgPT4ge1xyXG4gICAgICAgICAgdGhpcy5jb2xvciA9IGNvbG9yXHJcbiAgICAgICAgfSwgLy/ngrnlh7vnoa7orqTmjInpkq7kuovku7blm57osINcclxuICAgICAgICBjbGVhcjogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5jb2xvciA9ICdyZ2JhKDI1NSwyNTUsMjU1LDEpJ1xyXG4gICAgICAgIH0gLy/ngrnlh7vmuIXnqbrmjInpkq7kuovku7blm57osINcclxuICAgICAgfSlcclxuICAgICAgbGV0IGxhYmVsQ29sb3JQaWNrZXIgPSBuZXcgWUpDb2xvclBpY2tlcih7XHJcbiAgICAgICAgZWw6IGNvbnRlbnRFbG0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbGFiZWxDb2xvcicpWzBdLFxyXG4gICAgICAgIHNpemU6ICdtaW5pJywgLy/popzoibJib3jnsbvlnotcclxuICAgICAgICBhbHBoYTogdHJ1ZSwgLy/mmK/lkKblvIDlkK/pgI/mmI7luqZcclxuICAgICAgICBkZWZhdWx0Q29sb3I6IHRoaXMubGFiZWxDb2xvcixcclxuICAgICAgICBkaXNhYmxlZDogZmFsc2UsIC8v5piv5ZCm56aB5q2i5omT5byA6aKc6Imy6YCJ5oup5ZmoXHJcbiAgICAgICAgb3BlblBpY2tlckFuaTogJ29wYWNpdHknLCAvL+aJk+W8gOminOiJsumAieaLqeWZqOWKqOeUu1xyXG4gICAgICAgIHN1cmU6IGNvbG9yID0+IHtcclxuICAgICAgICAgIHRoaXMubGFiZWxDb2xvciA9IGNvbG9yXHJcbiAgICAgICAgfSwgLy/ngrnlh7vnoa7orqTmjInpkq7kuovku7blm57osINcclxuICAgICAgICBjbGVhcjogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5sYWJlbENvbG9yID0gJ3JnYmEoMjU1LDI1NSwyNTUsMSknXHJcbiAgICAgICAgfSAvL+eCueWHu+a4heepuuaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICB9KVxyXG4gICAgICBsZXQgZXh0ZW5kQ29sb3JQaWNrZXIgPSBuZXcgWUpDb2xvclBpY2tlcih7XHJcbiAgICAgICAgZWw6IGNvbnRlbnRFbG0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnZXh0ZW5kQ29sb3InKVswXSxcclxuICAgICAgICBzaXplOiAnbWluaScsIC8v6aKc6ImyYm9457G75Z6LXHJcbiAgICAgICAgYWxwaGE6IHRydWUsIC8v5piv5ZCm5byA5ZCv6YCP5piO5bqmXHJcbiAgICAgICAgZGVmYXVsdENvbG9yOiB0aGlzLmV4dGVuZENvbG9yLFxyXG4gICAgICAgIGRpc2FibGVkOiBmYWxzZSwgLy/mmK/lkKbnpoHmraLmiZPlvIDpopzoibLpgInmi6nlmahcclxuICAgICAgICBvcGVuUGlja2VyQW5pOiAnb3BhY2l0eScsIC8v5omT5byA6aKc6Imy6YCJ5oup5Zmo5Yqo55S7XHJcbiAgICAgICAgc3VyZTogY29sb3IgPT4ge1xyXG4gICAgICAgICAgdGhpcy5leHRlbmRDb2xvciA9IGNvbG9yXHJcbiAgICAgICAgfSwgLy/ngrnlh7vnoa7orqTmjInpkq7kuovku7blm57osINcclxuICAgICAgICBjbGVhcjogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5leHRlbmRDb2xvciA9ICdyZ2JhKDI1NSwyNTUsMjU1LDEpJ1xyXG4gICAgICAgIH0gLy/ngrnlh7vmuIXnqbrmjInpkq7kuovku7blm57osINcclxuICAgICAgfSlcclxuICAgICAgbGV0IGxpbmVDb2xvclBpY2tlciA9IG5ldyBZSkNvbG9yUGlja2VyKHtcclxuICAgICAgICBlbDogY29udGVudEVsbS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdsYWJlbExpbmVDb2xvcicpWzBdLFxyXG4gICAgICAgIHNpemU6ICdtaW5pJywgLy/popzoibJib3jnsbvlnotcclxuICAgICAgICBhbHBoYTogdHJ1ZSwgLy/mmK/lkKblvIDlkK/pgI/mmI7luqZcclxuICAgICAgICBkZWZhdWx0Q29sb3I6IHRoaXMubGFiZWxMaW5lQ29sb3IsXHJcbiAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLCAvL+aYr+WQpuemgeatouaJk+W8gOminOiJsumAieaLqeWZqFxyXG4gICAgICAgIG9wZW5QaWNrZXJBbmk6ICdvcGFjaXR5JywgLy/miZPlvIDpopzoibLpgInmi6nlmajliqjnlLtcclxuICAgICAgICBzdXJlOiBjb2xvciA9PiB7XHJcbiAgICAgICAgICB0aGlzLmxhYmVsTGluZUNvbG9yID0gY29sb3JcclxuICAgICAgICB9LCAvL+eCueWHu+ehruiupOaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICAgIGNsZWFyOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmxhYmVsTGluZUNvbG9yID0gJ3JnYmEoMjU1LDI1NSwyNTUsMSknXHJcbiAgICAgICAgfSAvL+eCueWHu+a4heepuuaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICB9KVxyXG4gICAgICBsZXQgbGFiZWxCYWNrZ3JvdW5kQ29sb3JTdGFydFBpY2tlciA9IG5ldyBZSkNvbG9yUGlja2VyKHtcclxuICAgICAgICBlbDogY29udGVudEVsbS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdsYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0JylbMF0sXHJcbiAgICAgICAgc2l6ZTogJ21pbmknLFxyXG4gICAgICAgIGFscGhhOiB0cnVlLFxyXG4gICAgICAgIGRlZmF1bHRDb2xvcjogdGhpcy5sYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0LFxyXG4gICAgICAgIGRpc2FibGVkOiBmYWxzZSxcclxuICAgICAgICBvcGVuUGlja2VyQW5pOiAnb3BhY2l0eScsXHJcbiAgICAgICAgc3VyZTogY29sb3IgPT4ge1xyXG4gICAgICAgICAgdGhpcy5sYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0ID0gY29sb3JcclxuICAgICAgICB9LFxyXG4gICAgICAgIGNsZWFyOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmxhYmVsQmFja2dyb3VuZENvbG9yU3RhcnQgPSAncmdiYSgyNTUsMjU1LDI1NSwxKSdcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICAgIGxldCBsYWJlbEJhY2tncm91bmRDb2xvckVuZFBpY2tlciA9IG5ldyBZSkNvbG9yUGlja2VyKHtcclxuICAgICAgICBlbDogY29udGVudEVsbS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdsYWJlbEJhY2tncm91bmRDb2xvckVuZCcpWzBdLFxyXG4gICAgICAgIHNpemU6ICdtaW5pJyxcclxuICAgICAgICBhbHBoYTogdHJ1ZSxcclxuICAgICAgICBkZWZhdWx0Q29sb3I6IHRoaXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmQsXHJcbiAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLFxyXG4gICAgICAgIG9wZW5QaWNrZXJBbmk6ICdvcGFjaXR5JyxcclxuICAgICAgICBzdXJlOiBjb2xvciA9PiB7XHJcbiAgICAgICAgICB0aGlzLmxhYmVsQmFja2dyb3VuZENvbG9yRW5kID0gY29sb3JcclxuICAgICAgICB9LFxyXG4gICAgICAgIGNsZWFyOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmxhYmVsQmFja2dyb3VuZENvbG9yRW5kID0gJ3JnYmEoMjU1LDI1NSwyNTUsMSknXHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgICBsZXQgYWxsX2VsbSA9IGNvbnRlbnRFbG0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoJyonKVxyXG4gICAgICBFdmVudEJpbmRpbmcub24odGhpcywgYWxsX2VsbSlcclxuICAgICAgdGhpcy5fZWxtcyA9IEV2ZW50QmluZGluZy5lbGVtZW50XHJcbiAgICAgIHRoaXMuX2VsbXMuY29sb3IgPSBbY29sb3JQaWNrZXJdXHJcbiAgICAgIHRoaXMuX2VsbXMubGFiZWxDb2xvciA9IFtsYWJlbENvbG9yUGlja2VyXVxyXG4gICAgICB0aGlzLl9lbG1zLmV4dGVuZENvbG9yID0gW2V4dGVuZENvbG9yUGlja2VyXVxyXG4gICAgICB0aGlzLl9lbG1zLmxhYmVsTGluZUNvbG9yID0gW2xpbmVDb2xvclBpY2tlcl1cclxuICAgICAgdGhpcy5fZWxtcy5sYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0ID0gW2xhYmVsQmFja2dyb3VuZENvbG9yU3RhcnRQaWNrZXJdXHJcbiAgICAgIHRoaXMuX2VsbXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmQgPSBbbGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmRQaWNrZXJdXHJcblxyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICB0aGlzLmF0dHJpYnV0ZUxpbmsgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudFxyXG4gICAgICAgIC8vIHRoaXMuYXR0cmlidXRlVnIgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnRcclxuICAgICAgICAvLyB0aGlzLmNhbWVyYVNlbGVjdCAmJiB0aGlzLmNhbWVyYVNlbGVjdCgpXHJcbiAgICAgICAgLy8gdGhpcy5nb29kc1NlbGVjdCAmJiB0aGlzLmdvb2RzU2VsZWN0KClcclxuICAgICAgICBsZXQgdGFnRGF0YSA9IHRoaXMuYXR0cmlidXRlU2VsZWN0XHJcbiAgICAgICAgbGV0IGF0dHJpYnV0ZUVsbSA9IHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXHJcbiAgICAgICAgICAnYXR0cmlidXRlLXNlbGVjdC1ib3gnXHJcbiAgICAgICAgKVswXVxyXG4gICAgICAgIGlmIChhdHRyaWJ1dGVFbG0pIHtcclxuICAgICAgICAgIGxldCBsZWdwT2JqZWN0ID0gbGVncChhdHRyaWJ1dGVFbG0sICcuYXR0cmlidXRlLXNlbGVjdCcpXHJcbiAgICAgICAgICBsZWdwT2JqZWN0LmxlZ3Bfc2VhcmNoKHRhZ0RhdGEpXHJcbiAgICAgICAgICBsZXQgYXR0cmlidXRlU2VsZWN0RWxtID0gdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnRcclxuICAgICAgICAgICAgLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2F0dHJpYnV0ZS1zZWxlY3QnKVswXVxyXG4gICAgICAgICAgICAuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2lucHV0JylbMF1cclxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGFnRGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAodGFnRGF0YVtpXS5rZXkgPT09IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGVUeXBlKSB7XHJcbiAgICAgICAgICAgICAgYXR0cmlidXRlU2VsZWN0RWxtLnZhbHVlID0gdGFnRGF0YVtpXS52YWx1ZVxyXG4gICAgICAgICAgICAgIGxlZ3BPYmplY3QubGVncF9zZWFyY2hBY3RpdmUodGFnRGF0YVtpXS52YWx1ZSlcclxuICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBhdHRyaWJ1dGVTZWxlY3RFbG0uYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGFnRGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgIGlmICh0YWdEYXRhW2ldLnZhbHVlID09PSBhdHRyaWJ1dGVTZWxlY3RFbG0udmFsdWUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYXR0cmlidXRlVHlwZSA9IHRhZ0RhdGFbaV0ua2V5XHJcbiAgICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBuYW1lRGF0YSA9IFtcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJ+epuumXtOmVv+W6picsXHJcbiAgICAgICAgICAgIHZhbHVlOiAn56m66Ze06ZW/5bqmJ1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJ+aKleW9semVv+W6picsXHJcbiAgICAgICAgICAgIHZhbHVlOiAn5oqV5b2x6ZW/5bqmJ1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJ+WcsOihqOmVv+W6picsXHJcbiAgICAgICAgICAgIHZhbHVlOiAn5Zyw6KGo6ZW/5bqmJ1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIF1cclxuXHJcbiAgICAgICAgbGV0IG5hbWVEYXRhTGVncE9iamVjdCA9IGxlZ3AoXHJcbiAgICAgICAgICB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFxyXG4gICAgICAgICAgICAnaW5wdXQtc2VsZWN0LXVuaXQtYm94J1xyXG4gICAgICAgICAgKVswXSxcclxuICAgICAgICAgICcuaW5wdXQtc2VsZWN0LXVuaXQnXHJcbiAgICAgICAgKVxyXG4gICAgICAgIGlmIChuYW1lRGF0YUxlZ3BPYmplY3QpIHtcclxuICAgICAgICAgIG5hbWVEYXRhTGVncE9iamVjdC5sZWdwX3NlYXJjaChuYW1lRGF0YSlcclxuICAgICAgICAgIGxldCBuYW1lRGF0YUxlZ3BFbG0gPSB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudFxyXG4gICAgICAgICAgICAuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaW5wdXQtc2VsZWN0LXVuaXQnKVswXVxyXG4gICAgICAgICAgICAuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2lucHV0JylbMF1cclxuICAgICAgICAgIHRoaXMuX2VsbXMud29yZHNOYW1lID0gW25hbWVEYXRhTGVncEVsbV1cclxuICAgICAgICAgIG5hbWVEYXRhTGVncEVsbS52YWx1ZSA9IHRoaXMub3B0aW9ucy53b3Jkc05hbWVcclxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmFtZURhdGEubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKG5hbWVEYXRhW2ldLnZhbHVlID09PSBuYW1lRGF0YUxlZ3BFbG0udmFsdWUpIHtcclxuICAgICAgICAgICAgICBuYW1lRGF0YUxlZ3BPYmplY3QubGVncF9zZWFyY2hBY3RpdmUobmFtZURhdGFbaV0udmFsdWUpXHJcbiAgICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgbmFtZURhdGFMZWdwRWxtLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKCkgPT4ge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5hbWVEYXRhLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgaWYgKG5hbWVEYXRhW2ldLnZhbHVlID09PSBuYW1lRGF0YUxlZ3BFbG0udmFsdWUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMud29yZHNOYW1lID0gbmFtZURhdGFbaV0udmFsdWVcclxuICAgICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8g5Y6f5aeL6ZW/5bqm5Y2V5L2NXHJcbiAgICAgICAgbGV0IHVuaXREYXRhID0gW1xyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lOiAn57GzJyxcclxuICAgICAgICAgICAgdmFsdWU6ICfnsbMnXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lOiAn5Y2D57GzJyxcclxuICAgICAgICAgICAgdmFsdWU6ICfljYPnsbMnXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgXVxyXG5cclxuICAgICAgICBsZXQgdW5pdERhdGFMZWdwT2JqZWN0ID0gbGVncChcclxuICAgICAgICAgIHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXHJcbiAgICAgICAgICAgICdpbnB1dC1zZWxlY3QtdW5pdC1ib3gnXHJcbiAgICAgICAgICApWzBdLFxyXG4gICAgICAgICAgJy5pbnB1dC1zZWxlY3QtdW5pdCcsXHJcbiAgICAgICAgICAxXHJcbiAgICAgICAgKVxyXG4gICAgICAgIGlmICh1bml0RGF0YUxlZ3BPYmplY3QpIHtcclxuICAgICAgICAgIHVuaXREYXRhTGVncE9iamVjdC5sZWdwX3NlYXJjaCh1bml0RGF0YSlcclxuICAgICAgICAgIGxldCB1bml0RGF0YUxlZ3BFbG0gPSB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudFxyXG4gICAgICAgICAgICAuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaW5wdXQtc2VsZWN0LXVuaXQnKVsxXVxyXG4gICAgICAgICAgICAuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2lucHV0JylbMF1cclxuICAgICAgICAgIHRoaXMuX2VsbXMubGVuZ3RoVW5pdCA9IFt1bml0RGF0YUxlZ3BFbG1dXHJcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHVuaXREYXRhLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmICh1bml0RGF0YVtpXS52YWx1ZSA9PT0gdW5pdERhdGFMZWdwRWxtLnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgdW5pdERhdGFMZWdwT2JqZWN0LmxlZ3Bfc2VhcmNoQWN0aXZlKHVuaXREYXRhW2ldLnZhbHVlKVxyXG4gICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHVuaXREYXRhTGVncEVsbS5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICgpID0+IHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB1bml0RGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgIGlmICh1bml0RGF0YVtpXS52YWx1ZSA9PT0gdW5pdERhdGFMZWdwRWxtLnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxlbmd0aFVuaXQgPSB1bml0RGF0YVtpXS52YWx1ZVxyXG4gICAgICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyDmi5/lkIjplb/luqbljZXkvY1cclxuICAgICAgICAvLyBsZXQgZml0VW5pdERhdGEgPSBbXHJcbiAgICAgICAgLy8gICB7XHJcbiAgICAgICAgLy8gICAgIG5hbWU6ICfnsbMnLFxyXG4gICAgICAgIC8vICAgICB2YWx1ZTogJ+exsydcclxuICAgICAgICAvLyAgIH0sXHJcbiAgICAgICAgLy8gICB7XHJcbiAgICAgICAgLy8gICAgIG5hbWU6ICfljYPnsbMnLFxyXG4gICAgICAgIC8vICAgICB2YWx1ZTogJ+WNg+exsydcclxuICAgICAgICAvLyAgIH1cclxuICAgICAgICAvLyBdXHJcblxyXG4gICAgICAgIC8vIGxldCBmaXRVbml0RGF0YUxlZ3BPYmplY3QgPSBsZWdwKFxyXG4gICAgICAgIC8vICAgdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcclxuICAgICAgICAvLyAgICAgJ2lucHV0LXNlbGVjdC1maXQtdW5pdC1ib3gnXHJcbiAgICAgICAgLy8gICApWzBdLFxyXG4gICAgICAgIC8vICAgJy5pbnB1dC1zZWxlY3QtZml0LXVuaXQnXHJcbiAgICAgICAgLy8gKVxyXG4gICAgICAgIC8vIGlmIChmaXRVbml0RGF0YUxlZ3BPYmplY3QpIHtcclxuICAgICAgICAvLyAgIGZpdFVuaXREYXRhTGVncE9iamVjdC5sZWdwX3NlYXJjaChmaXRVbml0RGF0YSlcclxuICAgICAgICAvLyAgIGxldCBmaXRVbml0RGF0YUxlZ3BFbG0gPSB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudFxyXG4gICAgICAgIC8vICAgICAuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaW5wdXQtc2VsZWN0LWZpdC11bml0JylbMF1cclxuICAgICAgICAvLyAgICAgLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdpbnB1dCcpWzBdXHJcbiAgICAgICAgLy8gICB0aGlzLl9lbG1zLmZpdExlbmd0aFVuaXQgPSBbZml0VW5pdERhdGFMZWdwRWxtXVxyXG4gICAgICAgIC8vICAgZml0VW5pdERhdGFMZWdwRWxtLnZhbHVlID0gdGhpcy5vcHRpb25zWydmaXQtbGVuZ3RoLXVuaXQnXVxyXG4gICAgICAgIC8vICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaXRVbml0RGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIC8vICAgICBpZiAoZml0VW5pdERhdGFbaV0udmFsdWUgPT09IGZpdFVuaXREYXRhTGVncEVsbS52YWx1ZSkge1xyXG4gICAgICAgIC8vICAgICAgIGZpdFVuaXREYXRhTGVncE9iamVjdC5sZWdwX3NlYXJjaEFjdGl2ZShmaXRVbml0RGF0YVtpXS52YWx1ZSlcclxuICAgICAgICAvLyAgICAgICBicmVha1xyXG4gICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgLy8gICB9XHJcbiAgICAgICAgLy8gICBmaXRVbml0RGF0YUxlZ3BFbG0uYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7XHJcbiAgICAgICAgLy8gICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZml0VW5pdERhdGEubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAvLyAgICAgICBpZiAoZml0VW5pdERhdGFbaV0udmFsdWUgPT09IGZpdFVuaXREYXRhTGVncEVsbS52YWx1ZSkge1xyXG4gICAgICAgIC8vICAgICAgICAgdGhpcy5maXRMZW5ndGhVbml0ID0gZml0VW5pdERhdGFbaV0udmFsdWVcclxuICAgICAgICAvLyAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgLy8gICAgICAgfVxyXG4gICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgLy8gICB9KVxyXG4gICAgICAgIC8vIH1cclxuXHJcbiAgICAgICAgbGV0IGxpbmVUeXBlRGF0YSA9IFtcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJzxpIGNsYXNzPVwiaWNvbiBsaW5lXCI+PC9pPuWunue6vycsXHJcbiAgICAgICAgICAgIHZhbHVlOiAn5a6e57q/JyxcclxuICAgICAgICAgICAga2V5OiAwLFxyXG4gICAgICAgICAgICBpY29uOiAnbGluZSdcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIG5hbWU6ICc8aSBjbGFzcz1cImljb24gZGFzaC1saW5lXCI+PC9pPuiZmue6vycsXHJcbiAgICAgICAgICAgIHZhbHVlOiAn6Jma57q/JyxcclxuICAgICAgICAgICAga2V5OiAxLFxyXG4gICAgICAgICAgICBpY29uOiAnZGFzaC1saW5lJ1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJzxpIGNsYXNzPVwiaWNvbiBsaWdodC1saW5lXCI+PC9pPuazm+WFiScsXHJcbiAgICAgICAgICAgIHZhbHVlOiAn5rOb5YWJJyxcclxuICAgICAgICAgICAga2V5OiAyLFxyXG4gICAgICAgICAgICBpY29uOiAnbGlnaHQtbGluZSdcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIG5hbWU6ICc8aSBjbGFzcz1cImljb24gdGFpbC1saW5lXCI+PC9pPuWwvui/ueWFiee6vycsXHJcbiAgICAgICAgICAgIHZhbHVlOiAn5bC+6L+55YWJ57q/JyxcclxuICAgICAgICAgICAga2V5OiAzLFxyXG4gICAgICAgICAgICBpY29uOiAndGFpbC1saW5lJ1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJzxpIGNsYXNzPVwiaWNvbiBtdWx0LXRhaWwtbGluZVwiPjwvaT7lpJrlsL7ov7nlhYnnur8nLFxyXG4gICAgICAgICAgICB2YWx1ZTogJ+WkmuWwvui/ueWFiee6vycsXHJcbiAgICAgICAgICAgIGtleTogNCxcclxuICAgICAgICAgICAgaWNvbjogJ211bHQtdGFpbC1saW5lJ1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJzxpIGNsYXNzPVwiaWNvbiBmbG93LWRhc2gtbGluZTFcIj48L2k+5rWB5Yqo6Jma57q/MScsXHJcbiAgICAgICAgICAgIHZhbHVlOiAn5rWB5Yqo6Jma57q/MScsXHJcbiAgICAgICAgICAgIGtleTogNSxcclxuICAgICAgICAgICAgaWNvbjogJ2Zsb3ctZGFzaC1saW5lMSdcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIG5hbWU6ICc8aSBjbGFzcz1cImljb24gZmxvdy1kYXNoLWxpbmUyXCI+PC9pPua1geWKqOiZmue6vzInLFxyXG4gICAgICAgICAgICB2YWx1ZTogJ+a1geWKqOiZmue6vzInLFxyXG4gICAgICAgICAgICBrZXk6IDYsXHJcbiAgICAgICAgICAgIGljb246ICdmbG93LWRhc2gtbGluZTInXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lOiAnPGkgY2xhc3M9XCJpY29uIHBpYy1saW5lMVwiPjwvaT7mtYHliqjnrq3lpLQxJyxcclxuICAgICAgICAgICAgdmFsdWU6ICfmtYHliqjnrq3lpLQxJyxcclxuICAgICAgICAgICAga2V5OiA3LFxyXG4gICAgICAgICAgICBpY29uOiAncGljLWxpbmUxJ1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJzxpIGNsYXNzPVwiaWNvbiBwaWMtbGluZTJcIj48L2k+5rWB5Yqo566t5aS0MicsXHJcbiAgICAgICAgICAgIHZhbHVlOiAn5rWB5Yqo566t5aS0MicsXHJcbiAgICAgICAgICAgIGtleTogOCxcclxuICAgICAgICAgICAgaWNvbjogJ3BpYy1saW5lMidcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIG5hbWU6ICc8aSBjbGFzcz1cImljb24gcGljLWxpbmUzXCI+PC9pPua1geWKqOeureWktDMnLFxyXG4gICAgICAgICAgICB2YWx1ZTogJ+a1geWKqOeureWktDMnLFxyXG4gICAgICAgICAgICBrZXk6IDksXHJcbiAgICAgICAgICAgIGljb246ICdwaWMtbGluZTMnXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lOiAnPGkgY2xhc3M9XCJpY29uIHBpYy1saW5lNFwiPjwvaT7mtYHliqjnrq3lpLQ0JyxcclxuICAgICAgICAgICAgdmFsdWU6ICfmtYHliqjnrq3lpLQ0JyxcclxuICAgICAgICAgICAga2V5OiAxMCxcclxuICAgICAgICAgICAgaWNvbjogJ3BpYy1saW5lNCdcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIG5hbWU6ICc8aSBjbGFzcz1cImljb24gcGljLWxpbmU1XCI+PC9pPua1geWKqOeureWktDUnLFxyXG4gICAgICAgICAgICB2YWx1ZTogJ+a1geWKqOeureWktDUnLFxyXG4gICAgICAgICAgICBrZXk6IDExLFxyXG4gICAgICAgICAgICBpY29uOiAncGljLWxpbmU1J1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJzxpIGNsYXNzPVwiaWNvbiBwaWMtbGluZTZcIj48L2k+5rWB5Yqo566t5aS0NicsXHJcbiAgICAgICAgICAgIHZhbHVlOiAn5rWB5Yqo566t5aS0NicsXHJcbiAgICAgICAgICAgIGtleTogMTIsXHJcbiAgICAgICAgICAgIGljb246ICdwaWMtbGluZTYnXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgXVxyXG4gICAgICAgIGxldCBsaW5lVHlwZURhdGFMZWdwT2JqZWN0ID0gbGVncChcclxuICAgICAgICAgIHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXHJcbiAgICAgICAgICAgICdpbnB1dC1zZWxlY3QtbGluZS10eXBlLWJveCdcclxuICAgICAgICAgIClbMF0sXHJcbiAgICAgICAgICAnLmlucHV0LXNlbGVjdC1saW5lLXR5cGUnXHJcbiAgICAgICAgKVxyXG4gICAgICAgIGlmIChsaW5lVHlwZURhdGFMZWdwT2JqZWN0KSB7XHJcbiAgICAgICAgICBsaW5lVHlwZURhdGFMZWdwT2JqZWN0LmxlZ3Bfc2VhcmNoKGxpbmVUeXBlRGF0YSlcclxuXHJcbiAgICAgICAgICBsZXQgaUFjdGl2ZUVsbTIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpJylcclxuICAgICAgICAgIGlBY3RpdmVFbG0yLmNsYXNzTmFtZSA9ICdpY29uIGljb24tYWN0aXZlJ1xyXG4gICAgICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaW5wdXQtc2VsZWN0LWxpbmUtdHlwZScpWzBdLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2N5X2RhdGFsaXN0JylbMF0uYXBwZW5kQ2hpbGQoaUFjdGl2ZUVsbTIpXHJcblxyXG4gICAgICAgICAgbGV0IGxpbmVUeXBlRGF0YUxlZ3BFbG0gPSB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudFxyXG4gICAgICAgICAgICAuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaW5wdXQtc2VsZWN0LWxpbmUtdHlwZScpWzBdXHJcbiAgICAgICAgICAgIC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaW5wdXQnKVswXVxyXG4gICAgICAgICAgdGhpcy5fZWxtcy5saW5lVHlwZSA9IFtsaW5lVHlwZURhdGFMZWdwRWxtXVxyXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lVHlwZURhdGEubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKGxpbmVUeXBlRGF0YVtpXS5rZXkgPT09IHRoaXMub3B0aW9ucy50eXBlKSB7XHJcbiAgICAgICAgICAgICAgbGluZVR5cGVEYXRhTGVncE9iamVjdC5sZWdwX3NlYXJjaEFjdGl2ZShsaW5lVHlwZURhdGFbaV0udmFsdWUpXHJcbiAgICAgICAgICAgICAgbGluZVR5cGVEYXRhTGVncEVsbS52YWx1ZSA9IGxpbmVUeXBlRGF0YVtpXS52YWx1ZVxyXG4gICAgICAgICAgICAgIGlBY3RpdmVFbG0yLmNsYXNzTmFtZSA9IGBpY29uIGljb24tYWN0aXZlICR7bGluZVR5cGVEYXRhW2ldLmljb259YFxyXG4gICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGxpbmVUeXBlRGF0YUxlZ3BFbG0uYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZVR5cGVEYXRhLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgaWYgKGxpbmVUeXBlRGF0YVtpXS52YWx1ZSA9PT0gbGluZVR5cGVEYXRhTGVncEVsbS52YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5saW5lVHlwZSA9IGxpbmVUeXBlRGF0YVtpXS5rZXlcclxuICAgICAgICAgICAgICAgIGlBY3RpdmVFbG0yLmNsYXNzTmFtZSA9IGBpY29uIGljb24tYWN0aXZlICR7bGluZVR5cGVEYXRhW2ldLmljb259YFxyXG5cclxuICAgICAgICAgICAgICAgIC8v5o6n5Yi25Y+C5pWw5pi+6ZqQXHJcbiAgICAgICAgICAgICAgICBpZiAoMiA8IHRoaXMubGluZVR5cGUgJiYgdGhpcy5saW5lVHlwZSA8IDEzKSB7Ly/otLTlm77lj4LmlbBcclxuICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rhc2hUZXh0dXJlRG9tJykgJiYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkYXNoVGV4dHVyZURvbScpLnN0eWxlLmRpc3BsYXkgPSAnZmxleCcpXHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGFzaFRleHR1cmVEb20nKSAmJiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rhc2hUZXh0dXJlRG9tJykuc3R5bGUuZGlzcGxheSA9ICdub25lJylcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmICgyIDwgdGhpcy5saW5lVHlwZSAmJiB0aGlzLmxpbmVUeXBlIDwgNSkgey8v5bC+6L+55Y+C5pWwXHJcbiAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xpbmVTcGFjZScpWzBdICYmIChkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdsaW5lU3BhY2UnKVswXS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnKVxyXG4gICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdsaW5lU3BhY2UnKVsxXSAmJiAoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbGluZVNwYWNlJylbMV0uc3R5bGUuZGlzcGxheSA9ICdub25lJylcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xpbmVTcGFjZScpWzBdICYmIChkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdsaW5lU3BhY2UnKVswXS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnKVxyXG4gICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdsaW5lU3BhY2UnKVsxXSAmJiAoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbGluZVNwYWNlJylbMV0uc3R5bGUuZGlzcGxheSA9ICdmbGV4JylcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IGhlaWdodEJveEVsbSA9IHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2hlaWdodC1ib3gnKVswXVxyXG4gICAgICAgIGxldCBoZWlnaHRFbG0gPSBoZWlnaHRCb3hFbG0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaGVpZ2h0JylbMF1cclxuICAgICAgICBsZXQgaGVpZ2h0Q29uZmlybUVsbSA9IHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2hlaWdodC1jb25maXJtJylbMF1cclxuICAgICAgICBoZWlnaHRFbG0udmFsdWUgPSAxMFxyXG4gICAgICAgIGlmICh0aGlzLmhlaWdodE1vZGUgPT0gMikge1xyXG4gICAgICAgICAgaGVpZ2h0Qm94RWxtICYmIChoZWlnaHRCb3hFbG0uY2xhc3NOYW1lID0gJ2lucHV0LW51bWJlciBpbnB1dC1udW1iZXItdW5pdC0xIGhlaWdodC1ib3ggZGlzYWJsZWQnKTtcclxuICAgICAgICAgIGhlaWdodENvbmZpcm1FbG0gJiYgaGVpZ2h0Q29uZmlybUVsbS5zZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJywgJ2Rpc2FibGVkJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgaGVpZ2h0Qm94RWxtICYmIChoZWlnaHRCb3hFbG0uY2xhc3NOYW1lID0gJ2lucHV0LW51bWJlciBpbnB1dC1udW1iZXItdW5pdC0xIGhlaWdodC1ib3gnKTtcclxuICAgICAgICAgIGhlaWdodENvbmZpcm1FbG0gJiYgaGVpZ2h0Q29uZmlybUVsbS5yZW1vdmVBdHRyaWJ1dGUoJ2Rpc2FibGVkJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBoZWlnaHRNb2RlRGF0YSA9IFtcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJ+a1t+aLlOmrmOW6picsXHJcbiAgICAgICAgICAgIHZhbHVlOiAn5rW35ouU6auY5bqmJyxcclxuICAgICAgICAgICAga2V5OiAnMCcsXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lOiAn55u45a+55Zyw6KGoJyxcclxuICAgICAgICAgICAgdmFsdWU6ICfnm7jlr7nlnLDooagnLFxyXG4gICAgICAgICAgICBrZXk6ICcxJyxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIG5hbWU6ICfkvp3pmYTmqKHlnosnLFxyXG4gICAgICAgICAgICB2YWx1ZTogJ+S+nemZhOaooeWeiycsXHJcbiAgICAgICAgICAgIGtleTogJzInLFxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIF1cclxuICAgICAgICBsZXQgaGVpZ2h0TW9kZU9iamVjdCA9IGxlZ3AoXHJcbiAgICAgICAgICB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFxyXG4gICAgICAgICAgICAnaGVpZ2h0LW1vZGUtYm94J1xyXG4gICAgICAgICAgKVswXSxcclxuICAgICAgICAgICcuaGVpZ2h0LW1vZGUnXHJcbiAgICAgICAgKVxyXG4gICAgICAgIGlmIChoZWlnaHRNb2RlT2JqZWN0KSB7XHJcbiAgICAgICAgICBoZWlnaHRNb2RlT2JqZWN0LmxlZ3Bfc2VhcmNoKGhlaWdodE1vZGVEYXRhKVxyXG4gICAgICAgICAgbGV0IGhlaWdodE1vZGVEYXRhTGVncEVsbSA9IHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50XHJcbiAgICAgICAgICAgIC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdoZWlnaHQtbW9kZScpWzBdXHJcbiAgICAgICAgICAgIC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaW5wdXQnKVswXVxyXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoZWlnaHRNb2RlRGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoaGVpZ2h0TW9kZURhdGFbaV0ua2V5ID09IHRoaXMuaGVpZ2h0TW9kZSkge1xyXG4gICAgICAgICAgICAgIGhlaWdodE1vZGVEYXRhTGVncEVsbS52YWx1ZSA9IGhlaWdodE1vZGVEYXRhW2ldLnZhbHVlXHJcbiAgICAgICAgICAgICAgaGVpZ2h0TW9kZU9iamVjdC5sZWdwX3NlYXJjaEFjdGl2ZShcclxuICAgICAgICAgICAgICAgIGhlaWdodE1vZGVEYXRhW2ldLnZhbHVlXHJcbiAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGhlaWdodE1vZGVEYXRhTGVncEVsbS5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICgpID0+IHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoZWlnaHRNb2RlRGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgIGlmIChoZWlnaHRNb2RlRGF0YVtpXS52YWx1ZSA9PT0gaGVpZ2h0TW9kZURhdGFMZWdwRWxtLnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhlaWdodE1vZGUgPSBoZWlnaHRNb2RlRGF0YVtpXS5rZXlcclxuICAgICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KVxyXG5cclxuICAgICAgICAgIGhlaWdodEVsbS5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICgpID0+IHtcclxuICAgICAgICAgICAgc3dpdGNoICh0aGlzLmhlaWdodE1vZGUpIHtcclxuICAgICAgICAgICAgICBjYXNlIDA6XHJcbiAgICAgICAgICAgICAgY2FzZSAnMCc6XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICBjYXNlIDE6XHJcbiAgICAgICAgICAgICAgY2FzZSAnMSc6XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICBjYXNlIDI6XHJcbiAgICAgICAgICAgICAgY2FzZSAnMic6XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSlcclxuXHJcbiAgICAgICAgICB0aGlzLl9lbG1zLmhlaWdodCA9IGhlaWdodEVsbVxyXG4gICAgICAgICAgdGhpcy5fZWxtcy5oZWlnaHRCb3ggPSBoZWlnaHRCb3hFbG1cclxuICAgICAgICAgIHRoaXMuX2VsbXMuaGVpZ2h0TW9kZSA9IGhlaWdodE1vZGVEYXRhTGVncEVsbVxyXG4gICAgICAgICAgdGhpcy5fZWxtcy5oZWlnaHRDb25maXJtID0gaGVpZ2h0Q29uZmlybUVsbVxyXG4gICAgICAgICAgdGhpcy5fZWxtcy5oZWlnaHRNb2RlT2JqZWN0ID0gaGVpZ2h0TW9kZU9iamVjdFxyXG5cclxuICAgICAgICAgIGhlaWdodENvbmZpcm1FbG0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb25FZGl0aW5nID0gZmFsc2VcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm9wdGlvbnMucG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5hbHQgPSBOdW1iZXIoKHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0uYWx0ICsgTnVtYmVyKGhlaWdodEVsbS52YWx1ZSkpLnRvRml4ZWQoMikpXHJcbiAgICAgICAgICAgICAgdGhpcy5fZWxtcy5hbHRbaV0uaW5uZXJIVE1MID0gdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5hbHRcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBsZXQgZnJvbURlZ3JlZXNBcnJheSA9IHRoaXMucmVuZXdQb3NpdGlvbnModGhpcy5vcHRpb25zLnBvc2l0aW9ucylcclxuICAgICAgICAgICAgdGhpcy5lbnRpdHkucG9seWxpbmUucG9zaXRpb25zID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXNBcnJheUhlaWdodHMoXHJcbiAgICAgICAgICAgICAgZnJvbURlZ3JlZXNBcnJheVxyXG4gICAgICAgICAgICApXHJcblxyXG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uRWRpdGluZyA9IGZhbHNlXHJcbiAgICAgICAgICAgIHRoaXMuY2xvc2VOb2RlRWRpdCgpXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHRhYmxlRWxtID0gY29udGVudEVsbS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdzcGF0aWFsLWluZm8tdGFibGUnKVswXVxyXG4gICAgICAgIGxldCB0Qm9keUVsbSA9IHRhYmxlRWxtLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RhYmxlLWJvZHknKVswXVxyXG4gICAgICAgIHRoaXMuX2VsbXMubG5nID0gW11cclxuICAgICAgICB0aGlzLl9lbG1zLmxuZ0lucHV0ID0gW11cclxuICAgICAgICB0aGlzLl9lbG1zLmxhdCA9IFtdXHJcbiAgICAgICAgdGhpcy5fZWxtcy5sYXRJbnB1dCA9IFtdXHJcbiAgICAgICAgdGhpcy5fZWxtcy5hbHQgPSBbXVxyXG4gICAgICAgIHRoaXMuX2VsbXMuYWx0SW5wdXQgPSBbXVxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5vcHRpb25zLnBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgbGV0IHRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcclxuICAgICAgICAgIHRyLmNsYXNzTmFtZSA9ICd0cidcclxuICAgICAgICAgIHRyLmlubmVySFRNTCA9IGBcclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRkXCI+JHtpICsgMX08L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRkIGxuZyBhbGlnbi1jZW50ZXJcIj48L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRkIGxhdCBhbGlnbi1jZW50ZXJcIj48L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRkIGFsdCBhbGlnbi1jZW50ZXJcIj48L2Rpdj5cclxuICAgICAgICAgIGBcclxuICAgICAgICAgIGxldCBsbmdCb3ggPSB0ci5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdsbmcnKVswXVxyXG4gICAgICAgICAgbGV0IGxuZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKVxyXG4gICAgICAgICAgbG5nLmlubmVySFRNTCA9ICh0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxuZykudG9GaXhlZCg4KVxyXG4gICAgICAgICAgbG5nQm94LmFwcGVuZENoaWxkKGxuZylcclxuICAgICAgICAgIGxldCBsbmdJbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0JylcclxuICAgICAgICAgIGxuZ0lucHV0LmNsYXNzTmFtZSA9ICdpbnB1dCdcclxuICAgICAgICAgIGxuZ0lucHV0LnR5cGUgPSAnbnVtYmVyJ1xyXG4gICAgICAgICAgbG5nSW5wdXQudGl0bGUgPSAnJ1xyXG4gICAgICAgICAgbG5nSW5wdXQubWluID0gLTE4MFxyXG4gICAgICAgICAgbG5nSW5wdXQubWF4ID0gMTgwXHJcbiAgICAgICAgICBsbmdJbnB1dC52YWx1ZSA9ICh0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxuZykudG9GaXhlZCg4KVxyXG5cclxuICAgICAgICAgIGxldCBsYXRCb3ggPSB0ci5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdsYXQnKVswXVxyXG4gICAgICAgICAgbGV0IGxhdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKVxyXG4gICAgICAgICAgbGF0LmlubmVySFRNTCA9ICh0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxhdCkudG9GaXhlZCg4KVxyXG4gICAgICAgICAgbGF0Qm94LmFwcGVuZENoaWxkKGxhdClcclxuICAgICAgICAgIGxldCBsYXRJbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0JylcclxuICAgICAgICAgIGxhdElucHV0LmNsYXNzTmFtZSA9ICdpbnB1dCdcclxuICAgICAgICAgIGxhdElucHV0LnR5cGUgPSAnbnVtYmVyJ1xyXG4gICAgICAgICAgbGF0SW5wdXQudGl0bGUgPSAnJ1xyXG4gICAgICAgICAgbGF0SW5wdXQubWluID0gLTkwXHJcbiAgICAgICAgICBsYXRJbnB1dC5tYXggPSA5MFxyXG4gICAgICAgICAgbGF0SW5wdXQudmFsdWUgPSAodGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sYXQpLnRvRml4ZWQoOClcclxuXHJcbiAgICAgICAgICBsZXQgYWx0Qm94ID0gdHIuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnYWx0JylbMF1cclxuICAgICAgICAgIGxldCBhbHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJylcclxuICAgICAgICAgIGFsdC5pbm5lckhUTUwgPSAodGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5hbHQpLnRvRml4ZWQoMilcclxuICAgICAgICAgIGFsdEJveC5hcHBlbmRDaGlsZChhbHQpXHJcbiAgICAgICAgICBsZXQgYWx0SW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpXHJcbiAgICAgICAgICBhbHRJbnB1dC5jbGFzc05hbWUgPSAnaW5wdXQnXHJcbiAgICAgICAgICBhbHRJbnB1dC50eXBlID0gJ251bWJlcidcclxuICAgICAgICAgIGFsdElucHV0LnRpdGxlID0gJydcclxuICAgICAgICAgIGFsdElucHV0Lm1pbiA9IC05OTk5OTk5XHJcbiAgICAgICAgICBhbHRJbnB1dC5tYXggPSA5OTk5OTk5OTlcclxuICAgICAgICAgIGFsdElucHV0LnZhbHVlID0gKHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0uYWx0KS50b0ZpeGVkKDIpXHJcblxyXG4gICAgICAgICAgbG5nQm94LmFkZEV2ZW50TGlzdGVuZXIoJ2RibGNsaWNrJywgKCkgPT4ge1xyXG4gICAgICAgICAgICBsbmdCb3guaW5uZXJIVE1MID0gJydcclxuICAgICAgICAgICAgbG5nSW5wdXQudmFsdWUgPSBOdW1iZXIodGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sbmcudG9GaXhlZCg4KSlcclxuICAgICAgICAgICAgbG5nQm94LmFwcGVuZENoaWxkKGxuZ0lucHV0KVxyXG4gICAgICAgICAgICBsbmdJbnB1dC5mb2N1cygpXHJcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb25FZGl0aW5nID0gZmFsc2VcclxuICAgICAgICAgICAgdGhpcy5jbG9zZU5vZGVFZGl0KClcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICBsbmdJbnB1dC5hZGRFdmVudExpc3RlbmVyKCdibHVyJywgKCkgPT4ge1xyXG4gICAgICAgICAgICBsbmdJbnB1dC52YWx1ZSA9IE51bWJlcih0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxuZy50b0ZpeGVkKDgpKVxyXG4gICAgICAgICAgICBsbmdCb3guaW5uZXJIVE1MID0gJydcclxuICAgICAgICAgICAgbG5nQm94LmFwcGVuZENoaWxkKGxuZylcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICBsbmdJbnB1dC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sbmcgPSBOdW1iZXIoTnVtYmVyKGxuZ0lucHV0LnZhbHVlKS50b0ZpeGVkKDgpKVxyXG4gICAgICAgICAgICBsbmcuaW5uZXJIVE1MID0gdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sbmcudG9GaXhlZCg4KVxyXG4gICAgICAgICAgICBsZXQgZnJvbURlZ3JlZXNBcnJheSA9IHRoaXMucmVuZXdQb3NpdGlvbnModGhpcy5vcHRpb25zLnBvc2l0aW9ucylcclxuICAgICAgICAgICAgdGhpcy5lbnRpdHkucG9seWxpbmUucG9zaXRpb25zID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXNBcnJheUhlaWdodHMoZnJvbURlZ3JlZXNBcnJheSlcclxuICAgICAgICAgICAgdGhpcy5sYWJlbC5wb3NpdGlvbiA9IFt0aGlzLm9wdGlvbnMucG9zaXRpb25zWzBdLmxuZywgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXS5sYXQsIGZyb21EZWdyZWVzQXJyYXlbMl1dXHJcbiAgICAgICAgICB9KVxyXG5cclxuICAgICAgICAgIGxhdEJveC5hZGRFdmVudExpc3RlbmVyKCdkYmxjbGljaycsICgpID0+IHtcclxuICAgICAgICAgICAgbGF0Qm94LmlubmVySFRNTCA9ICcnXHJcbiAgICAgICAgICAgIGxhdElucHV0LnZhbHVlID0gTnVtYmVyKHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubGF0LnRvRml4ZWQoOCkpXHJcbiAgICAgICAgICAgIGxhdEJveC5hcHBlbmRDaGlsZChsYXRJbnB1dClcclxuICAgICAgICAgICAgbGF0SW5wdXQuZm9jdXMoKVxyXG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uRWRpdGluZyA9IGZhbHNlXHJcbiAgICAgICAgICAgIHRoaXMuY2xvc2VOb2RlRWRpdCgpXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgbGF0SW5wdXQuYWRkRXZlbnRMaXN0ZW5lcignYmx1cicsICgpID0+IHtcclxuICAgICAgICAgICAgbGF0SW5wdXQudmFsdWUgPSBOdW1iZXIodGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sYXQudG9GaXhlZCg4KSlcclxuICAgICAgICAgICAgbGF0Qm94LmlubmVySFRNTCA9ICcnXHJcbiAgICAgICAgICAgIGxhdEJveC5hcHBlbmRDaGlsZChsYXQpXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgbGF0SW5wdXQuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubGF0ID0gTnVtYmVyKE51bWJlcihsYXRJbnB1dC52YWx1ZSkudG9GaXhlZCg4KSlcclxuICAgICAgICAgICAgbGF0LmlubmVySFRNTCA9IHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubGF0LnRvRml4ZWQoOClcclxuICAgICAgICAgICAgbGV0IGZyb21EZWdyZWVzQXJyYXkgPSB0aGlzLnJlbmV3UG9zaXRpb25zKHRoaXMub3B0aW9ucy5wb3NpdGlvbnMpXHJcbiAgICAgICAgICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLnBvc2l0aW9ucyA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzQXJyYXlIZWlnaHRzKGZyb21EZWdyZWVzQXJyYXkpXHJcbiAgICAgICAgICAgIHRoaXMubGFiZWwucG9zaXRpb24gPSBbdGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXS5sbmcsIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0ubGF0LCBmcm9tRGVncmVlc0FycmF5WzJdXVxyXG4gICAgICAgICAgfSlcclxuXHJcbiAgICAgICAgICBhbHRCb3guYWRkRXZlbnRMaXN0ZW5lcignZGJsY2xpY2snLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmhlaWdodE1vZGUgPT0gMikge1xyXG4gICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBhbHRCb3guaW5uZXJIVE1MID0gJydcclxuICAgICAgICAgICAgYWx0SW5wdXQudmFsdWUgPSBOdW1iZXIodGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5hbHQudG9GaXhlZCgyKSlcclxuICAgICAgICAgICAgYWx0Qm94LmFwcGVuZENoaWxkKGFsdElucHV0KVxyXG4gICAgICAgICAgICBhbHRJbnB1dC5mb2N1cygpXHJcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb25FZGl0aW5nID0gZmFsc2VcclxuICAgICAgICAgICAgdGhpcy5jbG9zZU5vZGVFZGl0KClcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICBhbHRJbnB1dC5hZGRFdmVudExpc3RlbmVyKCdibHVyJywgKCkgPT4ge1xyXG4gICAgICAgICAgICBhbHRJbnB1dC52YWx1ZSA9IE51bWJlcih0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmFsdC50b0ZpeGVkKDIpKVxyXG4gICAgICAgICAgICBhbHRCb3guaW5uZXJIVE1MID0gJydcclxuICAgICAgICAgICAgYWx0Qm94LmFwcGVuZENoaWxkKGFsdClcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICBhbHRJbnB1dC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5hbHQgPSBOdW1iZXIoTnVtYmVyKGFsdElucHV0LnZhbHVlKS50b0ZpeGVkKDIpKVxyXG4gICAgICAgICAgICBhbHQuaW5uZXJIVE1MID0gdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5hbHQudG9GaXhlZCgyKVxyXG4gICAgICAgICAgICBsZXQgZnJvbURlZ3JlZXNBcnJheSA9IHRoaXMucmVuZXdQb3NpdGlvbnModGhpcy5vcHRpb25zLnBvc2l0aW9ucylcclxuICAgICAgICAgICAgdGhpcy5lbnRpdHkucG9seWxpbmUucG9zaXRpb25zID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXNBcnJheUhlaWdodHMoZnJvbURlZ3JlZXNBcnJheSlcclxuICAgICAgICAgICAgdGhpcy5sYWJlbC5wb3NpdGlvbiA9IFt0aGlzLm9wdGlvbnMucG9zaXRpb25zWzBdLmxuZywgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXS5sYXQsIGZyb21EZWdyZWVzQXJyYXlbMl1dXHJcbiAgICAgICAgICB9KVxyXG5cclxuICAgICAgICAgIHRoaXMuX2VsbXMubG5nLnB1c2gobG5nKVxyXG4gICAgICAgICAgdGhpcy5fZWxtcy5sbmdJbnB1dC5wdXNoKGxuZ0lucHV0KVxyXG4gICAgICAgICAgdGhpcy5fZWxtcy5sYXQucHVzaChsYXQpXHJcbiAgICAgICAgICB0aGlzLl9lbG1zLmxhdElucHV0LnB1c2gobGF0SW5wdXQpXHJcbiAgICAgICAgICB0aGlzLl9lbG1zLmFsdC5wdXNoKGFsdClcclxuICAgICAgICAgIHRoaXMuX2VsbXMuYWx0SW5wdXQucHVzaChhbHRJbnB1dClcclxuICAgICAgICAgIHRCb2R5RWxtLmFwcGVuZENoaWxkKHRyKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IGZvbnREYXRhID0gZ2V0Rm9udExpc3QoKVxyXG4gICAgICAgIGxldCBmb250T2JqZWN0ID0gbGVncChcclxuICAgICAgICAgIHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXHJcbiAgICAgICAgICAgICdmb250LXNlbGVjdC1ib3gnXHJcbiAgICAgICAgICApWzBdLFxyXG4gICAgICAgICAgJy5mb250LXNlbGVjdCdcclxuICAgICAgICApXHJcbiAgICAgICAgaWYgKGZvbnRPYmplY3QpIHtcclxuICAgICAgICAgIGZvbnRPYmplY3QubGVncF9zZWFyY2goZm9udERhdGEpXHJcbiAgICAgICAgICBsZXQgZm9udERhdGFMZWdwRWxtID0gdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnRcclxuICAgICAgICAgICAgLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2ZvbnQtc2VsZWN0JylbMF1cclxuICAgICAgICAgICAgLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdpbnB1dCcpWzBdXHJcbiAgICAgICAgICBmb250RGF0YUxlZ3BFbG0udmFsdWUgPSBmb250RGF0YVt0aGlzLmxhYmVsRm9udEZhbWlseV0udmFsdWVcclxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZm9udERhdGEubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKGZvbnREYXRhW2ldLnZhbHVlID09IGZvbnREYXRhTGVncEVsbS52YWx1ZSkge1xyXG4gICAgICAgICAgICAgIGZvbnRPYmplY3QubGVncF9zZWFyY2hBY3RpdmUoZm9udERhdGFbaV0udmFsdWUpXHJcbiAgICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZm9udERhdGFMZWdwRWxtLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKCkgPT4ge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZvbnREYXRhLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgaWYgKGZvbnREYXRhW2ldLnZhbHVlID09PSBmb250RGF0YUxlZ3BFbG0udmFsdWUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubGFiZWxGb250RmFtaWx5ID0gZm9udERhdGFbaV0ua2V5XHJcbiAgICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIHRoaXMuX2VsbXMubGFiZWxGb250RmFtaWx5ID0gW2ZvbnREYXRhTGVncEVsbV1cclxuICAgICAgICB9XHJcbiAgICAgIH0sIDApXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAodGhpcy5fRGlhbG9nT2JqZWN0ICYmIHRoaXMuX0RpYWxvZ09iamVjdC5jbG9zZSkge1xyXG4gICAgICAgIHRoaXMuX0RpYWxvZ09iamVjdC5jbG9zZSgpXHJcbiAgICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0ID0gbnVsbFxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyDlubPmu5HlpITnkIZcclxuICBzbW9vdGhIYW5kbGUocG9zaXRpb25zKSB7XHJcbiAgICBsZXQgbmV3UG9zaXRpb25zID0gW11cclxuICAgIGxldCB0aW1lID0gW11cclxuICAgIGxldCBmcm9tRGVncmVlc0FycmF5SGVpZ2h0cyA9IFtdXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBmcm9tRGVncmVlc0FycmF5SGVpZ2h0cy5wdXNoKFxyXG4gICAgICAgIHBvc2l0aW9uc1tpXS5sbmcsXHJcbiAgICAgICAgcG9zaXRpb25zW2ldLmxhdCxcclxuICAgICAgICBwb3NpdGlvbnNbaV0uYWx0XHJcbiAgICAgIClcclxuICAgICAgdGltZS5wdXNoKGkgLyAocG9zaXRpb25zLmxlbmd0aCAtIDEpKVxyXG4gICAgfVxyXG4gICAgbGV0IHNwbGluZSA9IG5ldyBDZXNpdW0uQ2F0bXVsbFJvbVNwbGluZSh7XHJcbiAgICAgIHRpbWVzOiB0aW1lLFxyXG4gICAgICBwb2ludHM6IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzQXJyYXlIZWlnaHRzKGZyb21EZWdyZWVzQXJyYXlIZWlnaHRzKVxyXG4gICAgfSlcclxuICAgIGxldCBsZW5ndGggPSBwb3NpdGlvbnMubGVuZ3RoICogMjBcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IGxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGxldCBjYXJ0ZXNpYW4zID0gc3BsaW5lLmV2YWx1YXRlKGkgLyBsZW5ndGgpXHJcbiAgICAgIG5ld1Bvc2l0aW9ucy5wdXNoKHRoaXMuY2FydGVzaWFuM1Rvd2dzODQoY2FydGVzaWFuMywgdGhpcy5zZGsudmlld2VyKSlcclxuICAgIH1cclxuICAgIHJldHVybiBuZXdQb3NpdGlvbnNcclxuICB9XHJcblxyXG4gIC8vIOabtOaWsOWdkOagh1xyXG4gIHJlbmV3UG9zaXRpb25zKHBvc2l0aW9uc0FycmF5LCBjZCkge1xyXG4gICAgaWYgKHRoaXMuX2Vycm9yKSB7XHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG4gICAgbGV0IHBvc2l0aW9ucyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkocG9zaXRpb25zQXJyYXkpKVxyXG4gICAgbGV0IGdyb3VuZFxyXG4gICAgc3dpdGNoICh0aGlzLmhlaWdodE1vZGUpIHtcclxuICAgICAgY2FzZSAwOlxyXG4gICAgICBjYXNlICcwJzpcclxuICAgICAgICBncm91bmQgPSBmYWxzZVxyXG4gICAgICAgIGJyZWFrXHJcbiAgICAgIGNhc2UgMTpcclxuICAgICAgY2FzZSAnMSc6XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGxldCBoZWlnaHQgPSB0aGlzLnNkay52aWV3ZXIuc2NlbmUuZ2xvYmUuZ2V0SGVpZ2h0KENlc2l1bS5DYXJ0b2dyYXBoaWMuZnJvbURlZ3JlZXMocG9zaXRpb25zW2ldLmxuZywgcG9zaXRpb25zW2ldLmxhdCkpXHJcbiAgICAgICAgICBwb3NpdGlvbnNbaV0uYWx0ID0gaGVpZ2h0ID8gTnVtYmVyKChwb3NpdGlvbnNbaV0uYWx0ICsgTnVtYmVyKGhlaWdodCkpLnRvRml4ZWQoMikpIDogTnVtYmVyKChwb3NpdGlvbnNbaV0uYWx0KS50b0ZpeGVkKDIpKVxyXG4gICAgICAgIH1cclxuICAgICAgICBncm91bmQgPSBmYWxzZVxyXG4gICAgICAgIGJyZWFrXHJcbiAgICAgIGNhc2UgMjpcclxuICAgICAgY2FzZSAnMic6XHJcbiAgICAgICAgZ3JvdW5kID0gdHJ1ZVxyXG4gICAgICAgIGJyZWFrXHJcbiAgICB9XHJcbiAgICBsZXQgbmV3UG9zaXRpb25zXHJcbiAgICBsZXQgZnJvbURlZ3JlZXNBcnJheSA9IFtdXHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMub3B0aW9ucy5ub3NlVG9UYWlsICYmXHJcbiAgICAgIHRoaXMub3B0aW9ucy5ub3NlVG9UYWlsICE9PSAnZmFsc2UnXHJcbiAgICApIHtcclxuICAgICAgbmV3UG9zaXRpb25zID0gWy4uLnBvc2l0aW9ucywgcG9zaXRpb25zWzBdXVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbmV3UG9zaXRpb25zID0gWy4uLnBvc2l0aW9uc11cclxuICAgIH1cclxuICAgIG5ld1Bvc2l0aW9ucyA9IHRoaXMuc21vb3RoSGFuZGxlKG5ld1Bvc2l0aW9ucylcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmV3UG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGZyb21EZWdyZWVzQXJyYXkucHVzaChcclxuICAgICAgICBuZXdQb3NpdGlvbnNbaV0ubG5nLFxyXG4gICAgICAgIG5ld1Bvc2l0aW9uc1tpXS5sYXQsXHJcbiAgICAgICAgbmV3UG9zaXRpb25zW2ldLmFsdFxyXG4gICAgICApXHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vIOiuoeeul+mVv+W6plxyXG4gICAgLy8gbGV0IGFycmF5ID0gW11cclxuICAgIC8vIGZvciAobGV0IGkgPSAwOyBpIDwgZnJvbURlZ3JlZXNBcnJheS5sZW5ndGg7IGkgKz0gMykge1xyXG4gICAgLy8gICBhcnJheS5wdXNoKHtcclxuICAgIC8vICAgICBsbmc6IGZyb21EZWdyZWVzQXJyYXlbaV0sXHJcbiAgICAvLyAgICAgbGF0OiBmcm9tRGVncmVlc0FycmF5W2kgKyAxXSxcclxuICAgIC8vICAgICBhbHQ6IGZyb21EZWdyZWVzQXJyYXlbaSArIDJdXHJcbiAgICAvLyAgIH0pXHJcbiAgICAvLyB9XHJcbiAgICAvLyB0aGlzLm9wdGlvbnMuZml0TGVuZ3RoQnlNZXRlciA9IHRoaXMuY29tcHV0ZURpc3RhbmNlMihcclxuICAgIC8vICAgYXJyYXksXHJcbiAgICAvLyAgIDIsXHJcbiAgICAvLyAgIGdyb3VuZFxyXG4gICAgLy8gKVxyXG4gICAgLy8gdGhpcy5maXRMZW5ndGhVbml0ID0gdGhpcy5vcHRpb25zWydmaXQtbGVuZ3RoLXVuaXQnXVxyXG4gICAgLy8gdGhpcy5vcHRpb25zLmxlbmd0aEJ5TWV0ZXIgPSB0aGlzLmNvbXB1dGVEaXN0YW5jZTIodGhpcy5zbW9vdGhIYW5kbGUocG9zaXRpb25zKSwgMiwgZ3JvdW5kKVxyXG4gICAgLy8gdGhpcy5sZW5ndGhVbml0ID0gdGhpcy5vcHRpb25zWydsZW5ndGgtdW5pdCddXHJcblxyXG5cclxuICAgIGlmIChcclxuICAgICAgKHRoaXMub3B0aW9ucy5ub3NlVG9UYWlsICYmXHJcbiAgICAgICAgdGhpcy5vcHRpb25zLm5vc2VUb1RhaWwgIT09ICdmYWxzZScpIHx8XHJcbiAgICAgICh0aGlzLm9wdGlvbnMuc21vb3RoICYmIHRoaXMub3B0aW9ucy5zbW9vdGggIT09ICdmYWxzZScpXHJcbiAgICApIHtcclxuICAgICAgbGV0IGFycmF5ID0gW11cclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmcm9tRGVncmVlc0FycmF5Lmxlbmd0aDsgaSArPSAzKSB7XHJcbiAgICAgICAgYXJyYXkucHVzaCh7XHJcbiAgICAgICAgICBsbmc6IGZyb21EZWdyZWVzQXJyYXlbaV0sXHJcbiAgICAgICAgICBsYXQ6IGZyb21EZWdyZWVzQXJyYXlbaSArIDFdLFxyXG4gICAgICAgICAgYWx0OiBmcm9tRGVncmVlc0FycmF5W2kgKyAyXVxyXG4gICAgICAgIH0pXHJcbiAgICAgIH1cclxuICAgICAgLy8gdGhpcy5vcHRpb25zLmZpdExlbmd0aEJ5TWV0ZXIgPSB0aGlzLmNvbXB1dGVEaXN0YW5jZShcclxuICAgICAgLy8gICBhcnJheSxcclxuICAgICAgLy8gICAyLFxyXG4gICAgICAvLyAgIGdyb3VuZFxyXG4gICAgICAvLyApXHJcbiAgICAgIGxldCBfdGhpcyA9IHRoaXNcclxuICAgICAgdGhpcy5jb21wdXRlRGlzdGFuY2UoXHJcbiAgICAgICAgYXJyYXksXHJcbiAgICAgICAgMixcclxuICAgICAgICB0aGlzLm9wdGlvbnMud29yZHNOYW1lXHJcbiAgICAgICkudGhlbihyZXMgPT4ge1xyXG4gICAgICAgIF90aGlzLmxlbmd0aEJ5TWV0ZXIgPSByZXNcclxuICAgICAgICB0aGlzLmxlbmd0aENoYW5nZUNhbGxCYWNrICYmIHRoaXMubGVuZ3RoQ2hhbmdlQ2FsbEJhY2soKVxyXG4gICAgICAgIGNkICYmIGNkKClcclxuICAgICAgfSlcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGxldCBfdGhpcyA9IHRoaXNcclxuICAgICAgdGhpcy5jb21wdXRlRGlzdGFuY2UoXHJcbiAgICAgICAgX3RoaXMuc21vb3RoSGFuZGxlKHBvc2l0aW9ucyksXHJcbiAgICAgICAgMixcclxuICAgICAgICB0aGlzLm9wdGlvbnMud29yZHNOYW1lXHJcbiAgICAgICkudGhlbihyZXMgPT4ge1xyXG4gICAgICAgIF90aGlzLmxlbmd0aEJ5TWV0ZXIgPSByZXNcclxuICAgICAgICB0aGlzLmxlbmd0aENoYW5nZUNhbGxCYWNrICYmIHRoaXMubGVuZ3RoQ2hhbmdlQ2FsbEJhY2soKVxyXG4gICAgICAgIGNkICYmIGNkKClcclxuICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZnJvbURlZ3JlZXNBcnJheVxyXG4gIH1cclxuXHJcbiAgLy8g5pu05paw5aSa6L655b2i77yI57q/5omp5bGV77yJXHJcbiAgcmVuZXdQb2x5Z29uKGZyb21EZWdyZWVzQXJyYXkpIHtcclxuICAgIGxldCBsaW5lUG9zaXRpb25zID0gW11cclxuICAgIGlmICh0aGlzLm9wdGlvbnMuZXh0ZW5kICYmIHRoaXMub3B0aW9ucy5leHRlbmQgIT09ICdmYWxzZScpIHtcclxuICAgICAgbGV0IG91dGVySG9sZSA9IFtdXHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZnJvbURlZ3JlZXNBcnJheS5sZW5ndGg7IGkgKz0gMykge1xyXG4gICAgICAgIGxpbmVQb3NpdGlvbnMucHVzaChbZnJvbURlZ3JlZXNBcnJheVtpXSwgZnJvbURlZ3JlZXNBcnJheVtpICsgMV1dKVxyXG4gICAgICB9XHJcbiAgICAgIGxldCBsaW5lc3RyaW5nID0gdHVyZi5saW5lU3RyaW5nKGxpbmVQb3NpdGlvbnMpXHJcbiAgICAgIGxldCBidWZmZXJlZCA9IHR1cmYuYnVmZmVyKFxyXG4gICAgICAgIGxpbmVzdHJpbmcsXHJcbiAgICAgICAgdGhpcy5vcHRpb25zLmV4dGVuZFdpZHRoIC8gMTAwMCxcclxuICAgICAgICB7IHVuaXRzOiAna2lsb21ldGVycycgfVxyXG4gICAgICApXHJcblxyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ1ZmZlcmVkLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzBdLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgb3V0ZXJIb2xlLnB1c2goXHJcbiAgICAgICAgICBidWZmZXJlZC5nZW9tZXRyeS5jb29yZGluYXRlc1swXVtpXVswXSxcclxuICAgICAgICAgIGJ1ZmZlcmVkLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzBdW2ldWzFdXHJcbiAgICAgICAgKVxyXG4gICAgICB9XHJcbiAgICAgIGxldCBob2xlcyA9IFtdIC8vIOWtlFxyXG4gICAgICBmb3IgKGxldCBpID0gMTsgaSA8IGJ1ZmZlcmVkLmdlb21ldHJ5LmNvb3JkaW5hdGVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgbGV0IGFycmF5ID0gW11cclxuICAgICAgICBmb3IgKGxldCBtID0gMDsgbSA8IGJ1ZmZlcmVkLmdlb21ldHJ5LmNvb3JkaW5hdGVzW2ldLmxlbmd0aDsgbSsrKSB7XHJcbiAgICAgICAgICBhcnJheS5wdXNoKFxyXG4gICAgICAgICAgICBidWZmZXJlZC5nZW9tZXRyeS5jb29yZGluYXRlc1tpXVttXVswXSxcclxuICAgICAgICAgICAgYnVmZmVyZWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbaV1bbV1bMV1cclxuICAgICAgICAgIClcclxuICAgICAgICB9XHJcbiAgICAgICAgaG9sZXMucHVzaCh7IHBvc2l0aW9uczogQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXNBcnJheShhcnJheSkgfSlcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmVudGl0eS5wb2x5Z29uID0gbmV3IENlc2l1bS5Qb2x5Z29uR3JhcGhpY3Moe1xyXG4gICAgICAgIGhpZXJhcmNoeToge1xyXG4gICAgICAgICAgcG9zaXRpb25zOiBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlc0FycmF5KG91dGVySG9sZSksXHJcbiAgICAgICAgICBob2xlczogaG9sZXNcclxuICAgICAgICB9LFxyXG4gICAgICAgIG1hdGVyaWFsOiBDZXNpdW0uQ29sb3IuZnJvbUNzc0NvbG9yU3RyaW5nKHRoaXMub3B0aW9ucy5leHRlbmRDb2xvcilcclxuICAgICAgfSlcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZW50aXR5LnBvbHlnb24gPSB1bmRlZmluZWRcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIHJlc2V0KCkge1xyXG4gICAgaWYgKCF0aGlzLmVudGl0eSkge1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuICAgIHRoaXMub3B0aW9ucyA9IHRoaXMuZGVlcENvcHlPYmoodGhpcy5vcmlnaW5hbE9wdGlvbnMpXHJcbiAgICB0aGlzLm5hbWUgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5uYW1lXHJcbiAgICB0aGlzLmNvbG9yID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMuY29sb3JcclxuICAgIHRoaXMubGluZVdpZHRoID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMud2lkdGhcclxuICAgIHRoaXMubGluZVR5cGUgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy50eXBlXHJcbiAgICB0aGlzLm5vc2VUb1RhaWwgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5ub3NlVG9UYWlsXHJcbiAgICB0aGlzLmV4dGVuZCA9IHRoaXMub3JpZ2luYWxPcHRpb25zLmV4dGVuZFxyXG4gICAgdGhpcy5leHRlbmRXaWR0aCA9IHRoaXMub3JpZ2luYWxPcHRpb25zLmV4dGVuZFdpZHRoXHJcbiAgICB0aGlzLmV4dGVuZENvbG9yID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMuZXh0ZW5kQ29sb3JcclxuICAgIHRoaXMubGFiZWxTaG93ID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMubGFiZWwuc2hvd1xyXG4gICAgdGhpcy5sYWJlbENvbG9yID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMubGFiZWwuY29sb3JcclxuICAgIHRoaXMubGFiZWxGb250U2l6ZSA9IHRoaXMub3JpZ2luYWxPcHRpb25zLmxhYmVsLmZvbnRTaXplXHJcbiAgICB0aGlzLmxhYmVsRm9udEZhbWlseSA9IHRoaXMub3JpZ2luYWxPcHRpb25zLmxhYmVsLmZvbnRGYW1pbHlcclxuICAgIHRoaXMubGFiZWxTY2FsZUJ5RGlzdGFuY2UgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5sYWJlbC5zY2FsZUJ5RGlzdGFuY2VcclxuICAgIHRoaXMubGFiZWxOZWFyID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMubGFiZWwubmVhclxyXG4gICAgdGhpcy5sYWJlbEZhciA9IHRoaXMub3JpZ2luYWxPcHRpb25zLmxhYmVsLmZhclxyXG4gICAgdGhpcy5sYWJlbExpbmVXaWR0aCA9IHRoaXMub3JpZ2luYWxPcHRpb25zLmxhYmVsLmxpbmVXaWR0aFxyXG4gICAgdGhpcy5sYWJlbFBpeGVsT2Zmc2V0ID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMubGFiZWwucGl4ZWxPZmZzZXRcclxuICAgIHRoaXMubGFiZWxMaW5lQ29sb3IgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5sYWJlbC5saW5lQ29sb3JcclxuICAgIHRoaXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JTdGFydCA9IHRoaXMub3JpZ2luYWxPcHRpb25zLmxhYmVsLmJhY2tncm91bmRDb2xvclswXVxyXG4gICAgdGhpcy5sYWJlbEJhY2tncm91bmRDb2xvckVuZCA9IHRoaXMub3JpZ2luYWxPcHRpb25zLmxhYmVsLmJhY2tncm91bmRDb2xvclsxXVxyXG4gICAgdGhpcy5hdHRyaWJ1dGVMaW5rID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnRcclxuICAgIC8vIHRoaXMuYXR0cmlidXRlVnIgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnRcclxuICAgIC8vIHRoaXMuYXR0cmlidXRlQ2FtZXJhID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5jYW1lcmEuY29udGVudFxyXG4gICAgLy8gdGhpcy5hdHRyaWJ1dGVHb29kcyA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUuZ29vZHMuY29udGVudFxyXG4gICAgdGhpcy5yb3RhdGUgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5yb3RhdGVcclxuICAgIHRoaXMuc3BlZWQgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5zcGVlZFxyXG4gICAgLy8gdGhpcy5kYXNoU2l6ZSA9IHRoaXMub3JpZ2luYWxPcHRpb25zLmRhc2hTaXplXHJcbiAgICB0aGlzLnNwYWNlID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMuc3BhY2VcclxuICAgIC8vIHRoaXMuY2FtZXJhU2VsZWN0ICYmIHRoaXMuY2FtZXJhU2VsZWN0KClcclxuICAgIC8vIHRoaXMuZ29vZHNTZWxlY3QgJiYgdGhpcy5nb29kc1NlbGVjdCgpXHJcblxyXG4gICAgdGhpcy5oZWlnaHRNb2RlID0gdGhpcy5vcHRpb25zLmhlaWdodE1vZGVcclxuXHJcbiAgICAvLyBsZXQgaGVpZ2h0XHJcbiAgICAvLyBpZiAodGhpcy5ncm91bmQpIHtcclxuICAgIC8vICAgaGVpZ2h0ID0gYXdhaXQgdGhhdC5nZXRDbGFtcFRvSGVpZ2h0KHtcclxuICAgIC8vICAgICBsbmc6IHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0ubG5nLFxyXG4gICAgLy8gICAgIGxhdDogdGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXS5sYXRcclxuICAgIC8vICAgfSlcclxuICAgIC8vIH0gZWxzZSB7XHJcbiAgICAvLyAgIGhlaWdodCA9IHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0uYWx0XHJcbiAgICAvLyB9XHJcbiAgICAvLyB0aGlzLm9wdGlvbnMubGFiZWwucG9zaXRpb24gPSB7XHJcbiAgICAvLyAgIGxuZzogdGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXS5sbmcsXHJcbiAgICAvLyAgIGxhdDogdGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXS5sYXQsXHJcbiAgICAvLyAgIGFsdDogaGVpZ2h0XHJcbiAgICAvLyB9XHJcbiAgICAvLyB0aGlzLmxhYmVsLnBvc2l0aW9uID0gW1xyXG4gICAgLy8gICB0aGlzLm9wdGlvbnMubGFiZWwucG9zaXRpb24ubG5nLFxyXG4gICAgLy8gICB0aGlzLm9wdGlvbnMubGFiZWwucG9zaXRpb24ubGF0LFxyXG4gICAgLy8gICB0aGlzLm9wdGlvbnMubGFiZWwucG9zaXRpb24uYWx0XHJcbiAgICAvLyBdXHJcbiAgfVxyXG5cclxuICBfYWRkTGluaygpIHtcclxuICAgIGlmIChcclxuICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbGlua19hZGQnKVswXVxyXG4gICAgICAgIC52YWx1ZVxyXG4gICAgKSB7XHJcbiAgICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50LnB1c2goe1xyXG4gICAgICAgIG5hbWU6ICfpk77mjqUnLFxyXG4gICAgICAgIHVybDogdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcclxuICAgICAgICAgICdsaW5rX2FkZCdcclxuICAgICAgICApWzBdLnZhbHVlXHJcbiAgICAgIH0pXHJcbiAgICAgIHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXHJcbiAgICAgICAgJ2xpbmtfYWRkJ1xyXG4gICAgICApWzBdLnZhbHVlID0gJydcclxuICAgICAgdGhpcy5hdHRyaWJ1dGVMaW5rID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnRcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuRGlhbG9nLmNsaWNrQWRkTGluayAmJiB0aGlzLkRpYWxvZy5jbGlja0FkZExpbmsoKVxyXG4gICAgICAvLyBsZXQgaW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpO1xyXG4gICAgICAvLyBpbnB1dC50eXBlID0gXCJmaWxlXCI7XHJcbiAgICAgIC8vIGlucHV0LmFjY2VwdCA9IFwiLm1wNCwgLnBkZlwiXHJcbiAgICAgIC8vIGlucHV0LmNsaWNrKClcclxuICAgICAgLy8gaW5wdXQuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKGV2ZW50KSA9PiB7XHJcbiAgICAgIC8vICAgaWYgKGlucHV0LnZhbHVlKSB7XHJcbiAgICAgIC8vICAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudC5wdXNoKHtcclxuICAgICAgLy8gICAgICAgbmFtZTogJ+mTvuaOpScsXHJcbiAgICAgIC8vICAgICAgIHVybDogaW5wdXQudmFsdWVcclxuICAgICAgLy8gICAgIH0pXHJcbiAgICAgIC8vICAgICB0aGlzLmF0dHJpYnV0ZUxpbmsgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudFxyXG4gICAgICAvLyAgIH1cclxuICAgICAgLy8gfSlcclxuICAgIH1cclxuICB9XHJcbiAgYWRkQXR0cmlidXRlTGluayhsaW5rKSB7XHJcbiAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudC5wdXNoKHtcclxuICAgICAgbmFtZTogJ+mTvuaOpScsXHJcbiAgICAgIHVybDogbGlua1xyXG4gICAgfSlcclxuICAgIHRoaXMuYXR0cmlidXRlTGluayA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50XHJcbiAgfVxyXG5cclxuICAvLyBfYWRkUnIoKSB7XHJcbiAgLy8gICBpZiAoXHJcbiAgLy8gICAgIHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXHJcbiAgLy8gICAgICAgJ3ZyX2FkZCdcclxuICAvLyAgICAgKVswXS52YWx1ZVxyXG4gIC8vICAgKSB7XHJcbiAgLy8gICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudC5wdXNoKHtcclxuICAvLyAgICAgICBuYW1lOiAn5YWo5pmv5Zu+JyxcclxuICAvLyAgICAgICB1cmw6IHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXHJcbiAgLy8gICAgICAgICAndnJfYWRkJ1xyXG4gIC8vICAgICAgIClbMF0udmFsdWVcclxuICAvLyAgICAgfSlcclxuICAvLyAgICAgdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcclxuICAvLyAgICAgICAndnJfYWRkJ1xyXG4gIC8vICAgICApWzBdLnZhbHVlID0gJydcclxuICAvLyAgICAgdGhpcy5hdHRyaWJ1dGVWciA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudFxyXG4gIC8vICAgfSBlbHNlIHtcclxuICAvLyAgICAgdGhpcy5EaWFsb2cuY2xpY2tBZGRWciAmJiB0aGlzLkRpYWxvZy5jbGlja0FkZFZyKClcclxuICAvLyAgIH1cclxuICAvLyB9XHJcblxyXG4gIC8vIGFkZEF0dHJpYnV0ZVJyKHZyKSB7XHJcbiAgLy8gICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnQucHVzaCh7XHJcbiAgLy8gICAgIG5hbWU6ICflhajmma/lm74nLFxyXG4gIC8vICAgICB1cmw6IHZyXHJcbiAgLy8gICB9KVxyXG4gIC8vICAgdGhpcy5hdHRyaWJ1dGVWciA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudFxyXG4gIC8vIH1cclxuXHJcbiAgLyoqXHJcbiAgICog6aOe5YiwXHJcbiAgICovXHJcbiAgYXN5bmMgZmx5VG8ob3B0aW9ucyA9IHt9KSB7XHJcbiAgICBpZiAodGhpcy5fZXJyb3IpIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcbiAgICBjbG9zZVJvdGF0ZUFyb3VuZCh0aGlzLnNkaylcclxuICAgIGNsb3NlVmlld0ZvbGxvdyh0aGlzLnNkaylcclxuXHJcbiAgICBzZXRBY3RpdmVWaWV3ZXIoMClcclxuICAgIGlmICh0aGlzLm9wdGlvbnMuY3VzdG9tVmlldykge1xyXG4gICAgICBsZXQgb3JpZW50YXRpb24gPSB7XHJcbiAgICAgICAgaGVhZGluZzogQ2VzaXVtLk1hdGgudG9SYWRpYW5zKHRoaXMub3B0aW9ucy5jdXN0b21WaWV3Lm9yaWVudGF0aW9uLmhlYWRpbmcgfHwgMC4wKSxcclxuICAgICAgICBwaXRjaDogQ2VzaXVtLk1hdGgudG9SYWRpYW5zKHRoaXMub3B0aW9ucy5jdXN0b21WaWV3Lm9yaWVudGF0aW9uLnBpdGNoIHx8IC02MC4wKSxcclxuICAgICAgICByb2xsOiBDZXNpdW0uTWF0aC50b1JhZGlhbnModGhpcy5vcHRpb25zLmN1c3RvbVZpZXcub3JpZW50YXRpb24ucm9sbCB8fCAwLjApXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBsbmcgPSB0aGlzLm9wdGlvbnMuY3VzdG9tVmlldy5yZWxhdGl2ZVBvc2l0aW9uLmxuZ1xyXG4gICAgICBsZXQgbGF0ID0gdGhpcy5vcHRpb25zLmN1c3RvbVZpZXcucmVsYXRpdmVQb3NpdGlvbi5sYXRcclxuICAgICAgbGV0IGFsdCA9IHRoaXMub3B0aW9ucy5jdXN0b21WaWV3LnJlbGF0aXZlUG9zaXRpb24uYWx0XHJcbiAgICAgIGxldCBkZXN0aW5hdGlvbiA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzKGxuZywgbGF0LCBhbHQpXHJcblxyXG4gICAgICBsZXQgcG9zaXRpb24gPSB7IGxuZzogMCwgbGF0OiAwIH1cclxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5wb3NpdGlvbikge1xyXG4gICAgICAgIHBvc2l0aW9uID0geyAuLi50aGlzLm9wdGlvbnMucG9zaXRpb24gfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKHRoaXMub3B0aW9ucy5wb3NpdGlvbnMpIHtcclxuICAgICAgICBwb3NpdGlvbiA9IHsgLi4udGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXSB9XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAodGhpcy5vcHRpb25zLmNlbnRlcikge1xyXG4gICAgICAgIHBvc2l0aW9uID0geyAuLi50aGlzLm9wdGlvbnMuY2VudGVyIH1cclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmICh0aGlzLm9wdGlvbnMuc3RhcnQpIHtcclxuICAgICAgICBwb3NpdGlvbiA9IHsgLi4udGhpcy5vcHRpb25zLnN0YXJ0IH1cclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmhhc093blByb3BlcnR5KCdsbmcnKSkge1xyXG4gICAgICAgICAgcG9zaXRpb24ubG5nID0gdGhpcy5vcHRpb25zLmxuZ1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmhhc093blByb3BlcnR5KCdsYXQnKSkge1xyXG4gICAgICAgICAgcG9zaXRpb24ubGF0ID0gdGhpcy5vcHRpb25zLmxhdFxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmhhc093blByb3BlcnR5KCdhbHQnKSkge1xyXG4gICAgICAgICAgcG9zaXRpb24uYWx0ID0gdGhpcy5vcHRpb25zLmFsdFxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICAvLyDlpoLmnpzmsqHmnInpq5jluqblgLzvvIzliJnojrflj5bntKfotLTpq5jluqborqHnrpdcclxuICAgICAgaWYgKCFwb3NpdGlvbi5oYXNPd25Qcm9wZXJ0eSgnYWx0JykpIHtcclxuICAgICAgICBwb3NpdGlvbi5hbHQgPSBhd2FpdCB0aGlzLmdldENsYW1wVG9IZWlnaHQocG9zaXRpb24pXHJcbiAgICAgIH1cclxuICAgICAgbG5nID0gdGhpcy5vcHRpb25zLmN1c3RvbVZpZXcucmVsYXRpdmVQb3NpdGlvbi5sbmcgKyBwb3NpdGlvbi5sbmdcclxuICAgICAgbGF0ID0gdGhpcy5vcHRpb25zLmN1c3RvbVZpZXcucmVsYXRpdmVQb3NpdGlvbi5sYXQgKyBwb3NpdGlvbi5sYXRcclxuICAgICAgYWx0ID0gdGhpcy5vcHRpb25zLmN1c3RvbVZpZXcucmVsYXRpdmVQb3NpdGlvbi5hbHQgKyBwb3NpdGlvbi5hbHRcclxuICAgICAgZGVzdGluYXRpb24gPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlcyhsbmcsIGxhdCwgYWx0KVxyXG4gICAgICB0aGlzLnNkay52aWV3ZXIuY2FtZXJhLmZseVRvKHtcclxuICAgICAgICBkZXN0aW5hdGlvbjogZGVzdGluYXRpb24sXHJcbiAgICAgICAgb3JpZW50YXRpb246IG9yaWVudGF0aW9uXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgbGV0IHBvc2l0aW9uQXJyYXkgPSBbXVxyXG4gICAgICBsZXQgaGVpZ2h0XHJcbiAgICAgIHN3aXRjaCAodGhpcy5vcHRpb25zLmhlaWdodE1vZGUpIHtcclxuICAgICAgICBjYXNlICcwJzpcclxuICAgICAgICBjYXNlIDA6XHJcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMub3B0aW9ucy5wb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgbGV0IGEgPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlcyhcclxuICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxuZyxcclxuICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxhdCxcclxuICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmFsdFxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICAgIHBvc2l0aW9uQXJyYXkucHVzaChhLngsIGEueSwgYS56KVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWtcclxuICAgICAgICBjYXNlICcxJzpcclxuICAgICAgICBjYXNlIDE6XHJcbiAgICAgICAgICBoZWlnaHQgPSBhd2FpdCB0aGlzLmdldENsYW1wVG9IZWlnaHQodGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXSlcclxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5vcHRpb25zLnBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBsZXQgYSA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzKFxyXG4gICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubG5nLFxyXG4gICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubGF0LFxyXG4gICAgICAgICAgICAgIGhlaWdodCArIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0uYWx0XHJcbiAgICAgICAgICAgIClcclxuICAgICAgICAgICAgcG9zaXRpb25BcnJheS5wdXNoKGEueCwgYS55LCBhLnopXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVha1xyXG4gICAgICAgIGNhc2UgJzInOlxyXG4gICAgICAgIGNhc2UgMjpcclxuICAgICAgICAgIGhlaWdodCA9IGF3YWl0IHRoaXMuZ2V0Q2xhbXBUb0hlaWdodCh0aGlzLm9wdGlvbnMucG9zaXRpb25zWzBdKVxyXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm9wdGlvbnMucG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGxldCBhID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXMoXHJcbiAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sbmcsXHJcbiAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sYXQsXHJcbiAgICAgICAgICAgICAgaGVpZ2h0XHJcbiAgICAgICAgICAgIClcclxuICAgICAgICAgICAgcG9zaXRpb25BcnJheS5wdXNoKGEueCwgYS55LCBhLnopXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVha1xyXG4gICAgICB9XHJcbiAgICAgIGxldCBCb3VuZGluZ1NwaGVyZSA9IENlc2l1bS5Cb3VuZGluZ1NwaGVyZS5mcm9tVmVydGljZXMocG9zaXRpb25BcnJheSlcclxuICAgICAgdGhpcy5zZGsudmlld2VyLmNhbWVyYS5mbHlUb0JvdW5kaW5nU3BoZXJlKEJvdW5kaW5nU3BoZXJlLCB7XHJcbiAgICAgICAgb2Zmc2V0OiBvcHRpb25zLm9yaWVudGF0aW9uIHx8IHtcclxuICAgICAgICAgIGhlYWRpbmc6IENlc2l1bS5NYXRoLnRvUmFkaWFucygwLjApLFxyXG4gICAgICAgICAgcGl0Y2g6IENlc2l1bS5NYXRoLnRvUmFkaWFucygtOTAuMCksXHJcbiAgICAgICAgICByb2xsOiBDZXNpdW0uTWF0aC50b1JhZGlhbnMoMC4wKVxyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIOaJk+W8gOWvjOaWh+acrOahhlxyXG4gICAqL1xyXG4gIG9wZW5SaWNoVGV4dEVkaXRvcihlKSB7XHJcbiAgICAvLyB2YXIgdWUgPSBVRS5nZXRFZGl0b3IoJ2FwcCcpO1xyXG4gICAgcmljaFRleHQub3BlbihcclxuICAgICAgdGhpcy5vcHRpb25zLmlkLFxyXG4gICAgICB0aGlzLm9wdGlvbnMubmFtZSxcclxuICAgICAgdGhpcy5vcHRpb25zLnJpY2hUZXh0Q29udGVudFxyXG4gICAgKVxyXG4gICAgcmljaFRleHQucHJpbWFyeUNhbGxCYWNrID0gY29udGVudCA9PiB7XHJcbiAgICAgIHRoaXMub3B0aW9ucy5yaWNoVGV4dENvbnRlbnQgPSBjb250ZW50XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBzdGF0aWMgbm9kZUVkaXQyKHRoYXQsIGNiID0gKCkgPT4geyB9KSB7XHJcbiAgLy8gICB0aGF0LnBvc2l0aW9uRWRpdGluZyA9IGZhbHNlXHJcbiAgLy8gICBpZiAoWUouTWVhc3VyZS5HZXRNZWFzdXJlU3RhdHVzKCkpIHtcclxuICAvLyAgICAgY2IoJ+S4iuS4gOasoea1i+mHj+acque7k+adnycpXHJcbiAgLy8gICB9IGVsc2Uge1xyXG4gIC8vICAgICBZSi5NZWFzdXJlLlNldE1lYXN1cmVTdGF0dXModHJ1ZSlcclxuICAvLyAgICAgdGhhdC50aXAgPSBuZXcgTW91c2VUaXAoJ+ivt+mAieaLqeS4gOS4qumhtueCue+8jOWPs+mUruWPlua2iCcsIHRoYXQuc2RrKVxyXG4gIC8vICAgICB0aGF0LmV2ZW50ID0gbmV3IE1vdXNlRXZlbnQodGhhdC5zZGspXHJcbiAgLy8gICAgIHRoYXQubm9kZVBvaW50cyA9IFtdXHJcbiAgLy8gICAgIGxldCBzZWxlY3RQb2ludFxyXG4gIC8vICAgICBsZXQgb3JpZ2luYWxQb3NpdGlvblxyXG4gIC8vICAgICBsZXQgbmV3cG9zaXRpb25zID0gW11cclxuICAvLyAgICAgbGV0IGZyb21EZWdyZWVzQXJyYXkgPSBbXVxyXG4gIC8vICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoYXQub3B0aW9ucy5wb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAvLyAgICAgICBmcm9tRGVncmVlc0FycmF5LnB1c2goXHJcbiAgLy8gICAgICAgICB0aGF0Lm9wdGlvbnMucG9zaXRpb25zW2ldLmxuZyxcclxuICAvLyAgICAgICAgIHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbaV0ubGF0LFxyXG4gIC8vICAgICAgICAgdGhhdC5vcHRpb25zLnBvc2l0aW9uc1tpXS5hbHRcclxuICAvLyAgICAgICApXHJcbiAgLy8gICAgIH1cclxuICAvLyAgICAgbmV3cG9zaXRpb25zID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXNBcnJheUhlaWdodHMoZnJvbURlZ3JlZXNBcnJheSlcclxuXHJcbiAgLy8gICAgIHRoYXQuZXZlbnQubW91c2VfbGVmdCgobW92ZW1lbnQsIGNhcnRlc2lhbikgPT4ge1xyXG4gIC8vICAgICAgIGlmIChzZWxlY3RQb2ludCkge1xyXG4gIC8vICAgICAgICAgdGhhdC5vcHRpb25zLnBvc2l0aW9uc1tzZWxlY3RQb2ludC5pbmRleF0gPSB0aGF0LmNhcnRlc2lhbjNUb3dnczg0KFxyXG4gIC8vICAgICAgICAgICBjYXJ0ZXNpYW4sXHJcbiAgLy8gICAgICAgICAgIHRoYXQuc2RrLnZpZXdlclxyXG4gIC8vICAgICAgICAgKVxyXG4gIC8vICAgICAgICAgb3JpZ2luYWxQb3NpdGlvbiA9IHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbc2VsZWN0UG9pbnQuaW5kZXhdXHJcbiAgLy8gICAgICAgICBsZXQgZW50aXR5ID0gdGhhdC5zZGsudmlld2VyLmVudGl0aWVzLmFkZCh7XHJcbiAgLy8gICAgICAgICAgIG5hbWU6ICdub2RlLXNlY29uZGFyeS1lZGl0LXBvaW50JyxcclxuICAvLyAgICAgICAgICAgcG9zaXRpb246IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzKFxyXG4gIC8vICAgICAgICAgICAgIHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbc2VsZWN0UG9pbnQuaW5kZXhdLmxuZyxcclxuICAvLyAgICAgICAgICAgICB0aGF0Lm9wdGlvbnMucG9zaXRpb25zW3NlbGVjdFBvaW50LmluZGV4XS5sYXQsXHJcbiAgLy8gICAgICAgICAgICAgdGhhdC5vcHRpb25zLnBvc2l0aW9uc1tzZWxlY3RQb2ludC5pbmRleF0uYWx0XHJcbiAgLy8gICAgICAgICAgICksXHJcbiAgLy8gICAgICAgICAgIGJpbGxib2FyZDoge1xyXG4gIC8vICAgICAgICAgICAgIGltYWdlOiB0aGF0LmdldFNvdXJjZVJvb3RQYXRoKCkgKyAnL2ltZy9wb2ludC5wbmcnLFxyXG4gIC8vICAgICAgICAgICAgIHdpZHRoOiAxNSxcclxuICAvLyAgICAgICAgICAgICBoZWlnaHQ6IDE1LFxyXG4gIC8vICAgICAgICAgICAgIGRpc2FibGVEZXB0aFRlc3REaXN0YW5jZTogTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZXHJcbiAgLy8gICAgICAgICAgIH1cclxuICAvLyAgICAgICAgIH0pXHJcbiAgLy8gICAgICAgICB0aGF0Lm5vZGVQb2ludHMuc3BsaWNlKHNlbGVjdFBvaW50LmluZGV4LCAwLCBlbnRpdHkpXHJcbiAgLy8gICAgICAgICB0aGF0Lm9wdGlvbnMucG9zaXRpb25zLnNwbGljZShcclxuICAvLyAgICAgICAgICAgc2VsZWN0UG9pbnQuaW5kZXgsXHJcbiAgLy8gICAgICAgICAgIDAsXHJcbiAgLy8gICAgICAgICAgIHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbc2VsZWN0UG9pbnQuaW5kZXhdXHJcbiAgLy8gICAgICAgICApXHJcbiAgLy8gICAgICAgICBsZXQgZnJvbURlZ3JlZXNBcnJheSA9IHRoYXQucmVuZXdQb3NpdGlvbnModGhhdC5vcHRpb25zLnBvc2l0aW9ucylcclxuICAvLyAgICAgICAgIHRoYXQucmVuZXdQb2x5Z29uKGZyb21EZWdyZWVzQXJyYXkpXHJcbiAgLy8gICAgICAgICB0aGF0Lm9wdGlvbnMubGVuZ3RoQnlNZXRlciA9IHRoYXQuY29tcHV0ZURpc3RhbmNlMihcclxuICAvLyAgICAgICAgICAgdGhhdC5vcHRpb25zLnBvc2l0aW9ucyxcclxuICAvLyAgICAgICAgICAgMixcclxuICAvLyAgICAgICAgICAgdGhhdC5ncm91bmRcclxuICAvLyAgICAgICAgIClcclxuICAvLyAgICAgICAgIHRoYXQubGVuZ3RoVW5pdCA9IHRoYXQub3B0aW9uc1snbGVuZ3RoLXVuaXQnXVxyXG4gIC8vICAgICAgIH0gZWxzZSB7XHJcbiAgLy8gICAgICAgICB2YXIgcGljayA9IHRoYXQuc2RrLnZpZXdlci5zY2VuZS5waWNrKG1vdmVtZW50LnBvc2l0aW9uKVxyXG4gIC8vICAgICAgICAgaWYgKFxyXG4gIC8vICAgICAgICAgICBwaWNrICYmXHJcbiAgLy8gICAgICAgICAgIHBpY2suaWQgJiZcclxuICAvLyAgICAgICAgICAgcGljay5pZC5uYW1lICYmXHJcbiAgLy8gICAgICAgICAgIHBpY2suaWQubmFtZSA9PT0gJ25vZGUtc2Vjb25kYXJ5LWVkaXQtcG9pbnQnXHJcbiAgLy8gICAgICAgICApIHtcclxuICAvLyAgICAgICAgICAgc2VsZWN0UG9pbnQgPSBwaWNrLmlkXHJcbiAgLy8gICAgICAgICAgIHRoYXQubm9kZVBvaW50cy5zcGxpY2UocGljay5pZC5pbmRleCwgMSlcclxuICAvLyAgICAgICAgICAgdGhhdC5zZGsudmlld2VyLmVudGl0aWVzLnJlbW92ZShwaWNrLmlkKVxyXG4gIC8vICAgICAgICAgICB0aGF0LnRpcC5zZXRfdGV4dCgn5bem6ZSu5byA5aeL77yM5Y+z6ZSu57uT5p2f77yMQ1RSTCvlj7PplK7mkqTplIAnKVxyXG4gIC8vICAgICAgICAgICBvcmlnaW5hbFBvc2l0aW9uID0gdGhhdC5jYXJ0ZXNpYW4zVG93Z3M4NChcclxuICAvLyAgICAgICAgICAgICBjYXJ0ZXNpYW4sXHJcbiAgLy8gICAgICAgICAgICAgdGhhdC5zZGsudmlld2VyXHJcbiAgLy8gICAgICAgICAgIClcclxuICAvLyAgICAgICAgIH1cclxuICAvLyAgICAgICB9XHJcbiAgLy8gICAgIH0pXHJcblxyXG4gIC8vICAgICB0aGF0LmV2ZW50Lm1vdXNlX3JpZ2h0KChtb3ZlbWVudCwgY2FydGVzaWFuKSA9PiB7XHJcbiAgLy8gICAgICAgaWYgKHNlbGVjdFBvaW50KSB7XHJcbiAgLy8gICAgICAgICB0aGF0Lm9wdGlvbnMucG9zaXRpb25zW3NlbGVjdFBvaW50LmluZGV4XSA9IG9yaWdpbmFsUG9zaXRpb25cclxuICAvLyAgICAgICAgIGNiKG51bGwsIHRoYXQub3B0aW9ucy5wb3NpdGlvbnMpXHJcbiAgLy8gICAgICAgfVxyXG4gIC8vICAgICAgIGxldCBwb3NpdGlvbnMgPSB0aGF0Lm9wdGlvbnMucG9zaXRpb25zXHJcbiAgLy8gICAgICAgbGV0IGZyb21EZWdyZWVzQXJyYXkgPSBbXVxyXG4gIC8vICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgLy8gICAgICAgICBmcm9tRGVncmVlc0FycmF5LnB1c2goXHJcbiAgLy8gICAgICAgICAgIHBvc2l0aW9uc1tpXS5sbmcsXHJcbiAgLy8gICAgICAgICAgIHBvc2l0aW9uc1tpXS5sYXQsXHJcbiAgLy8gICAgICAgICAgIHBvc2l0aW9uc1tpXS5hbHRcclxuICAvLyAgICAgICAgIClcclxuICAvLyAgICAgICB9XHJcbiAgLy8gICAgICAgbmV3cG9zaXRpb25zID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXNBcnJheUhlaWdodHMoXHJcbiAgLy8gICAgICAgICBmcm9tRGVncmVlc0FycmF5XHJcbiAgLy8gICAgICAgKVxyXG4gIC8vICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhhdC5ub2RlUG9pbnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgLy8gICAgICAgICB0aGF0LnNkay52aWV3ZXIuZW50aXRpZXMucmVtb3ZlKHRoYXQubm9kZVBvaW50c1tpXSlcclxuICAvLyAgICAgICB9XHJcbiAgLy8gICAgICAgdGhhdC5ub2RlUG9pbnRzID0gW11cclxuICAvLyAgICAgICB0aGF0LmV2ZW50LmRlc3Ryb3koKVxyXG4gIC8vICAgICAgIHRoYXQudGlwLmRlc3Ryb3koKVxyXG4gIC8vICAgICB9KVxyXG5cclxuICAvLyAgICAgdGhhdC5ldmVudC5tb3VzZV9tb3ZlKChtb3ZlbWVudCwgY2FydGVzaWFuKSA9PiB7XHJcbiAgLy8gICAgICAgaWYgKHNlbGVjdFBvaW50KSB7XHJcbiAgLy8gICAgICAgICB0aGF0Lm9wdGlvbnMucG9zaXRpb25zW3NlbGVjdFBvaW50LmluZGV4XSA9IHRoYXQuY2FydGVzaWFuM1Rvd2dzODQoXHJcbiAgLy8gICAgICAgICAgIGNhcnRlc2lhbixcclxuICAvLyAgICAgICAgICAgdGhhdC5zZGsudmlld2VyXHJcbiAgLy8gICAgICAgICApXHJcbiAgLy8gICAgICAgICBsZXQgcG9zaXRpb25zID0gdGhhdC5vcHRpb25zLnBvc2l0aW9uc1xyXG4gIC8vICAgICAgICAgbGV0IGZyb21EZWdyZWVzQXJyYXkgPSBbXVxyXG4gIC8vICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAvLyAgICAgICAgICAgZnJvbURlZ3JlZXNBcnJheS5wdXNoKFxyXG4gIC8vICAgICAgICAgICAgIHBvc2l0aW9uc1tpXS5sbmcsXHJcbiAgLy8gICAgICAgICAgICAgcG9zaXRpb25zW2ldLmxhdCxcclxuICAvLyAgICAgICAgICAgICBwb3NpdGlvbnNbaV0uYWx0XHJcbiAgLy8gICAgICAgICAgIClcclxuICAvLyAgICAgICAgIH1cclxuICAvLyAgICAgICAgIG5ld3Bvc2l0aW9ucyA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzQXJyYXlIZWlnaHRzKFxyXG4gIC8vICAgICAgICAgICBmcm9tRGVncmVlc0FycmF5XHJcbiAgLy8gICAgICAgICApXHJcbiAgLy8gICAgICAgICBpZiAodGhhdC5vcHRpb25zLnBvc2l0aW9ucy5sZW5ndGggPT09IDEpIHtcclxuICAvLyAgICAgICAgICAgdGhhdC5sYWJlbC5wb3NpdGlvbiA9IFtcclxuICAvLyAgICAgICAgICAgICB0aGF0Lm9wdGlvbnMucG9zaXRpb25zWzBdLmxuZyxcclxuICAvLyAgICAgICAgICAgICB0aGF0Lm9wdGlvbnMucG9zaXRpb25zWzBdLmxhdCxcclxuICAvLyAgICAgICAgICAgICB0aGF0Lm9wdGlvbnMucG9zaXRpb25zWzBdLmFsdFxyXG4gIC8vICAgICAgICAgICBdXHJcbiAgLy8gICAgICAgICAgIHRoYXQub3B0aW9ucy5sYWJlbC5wb3NpdGlvbiA9IHtcclxuICAvLyAgICAgICAgICAgICBsbmc6IHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbMF0ubG5nLFxyXG4gIC8vICAgICAgICAgICAgIGxhdDogdGhhdC5vcHRpb25zLnBvc2l0aW9uc1swXS5sYXQsXHJcbiAgLy8gICAgICAgICAgICAgYWx0OiB0aGF0Lm9wdGlvbnMucG9zaXRpb25zWzBdLmFsdFxyXG4gIC8vICAgICAgICAgICB9XHJcbiAgLy8gICAgICAgICB9XHJcbiAgLy8gICAgICAgfVxyXG4gIC8vICAgICAgIHRoYXQudGlwLnNldFBvc2l0aW9uKFxyXG4gIC8vICAgICAgICAgY2FydGVzaWFuLFxyXG4gIC8vICAgICAgICAgbW92ZW1lbnQuZW5kUG9zaXRpb24ueCxcclxuICAvLyAgICAgICAgIG1vdmVtZW50LmVuZFBvc2l0aW9uLnlcclxuICAvLyAgICAgICApXHJcbiAgLy8gICAgIH0pXHJcblxyXG4gIC8vICAgICB0aGF0LmV2ZW50Lm1vdXNlX3JpZ2h0X2tleWJvYXJkX2N0cmwoKG1vdmVtZW50LCBjYXJ0ZXNpYW4pID0+IHtcclxuICAvLyAgICAgICBpZiAoc2VsZWN0UG9pbnQpIHtcclxuICAvLyAgICAgICAgIHRoYXQub3B0aW9ucy5wb3NpdGlvbnMucG9wKClcclxuICAvLyAgICAgICAgIHRoYXQuc2RrLnZpZXdlci5lbnRpdGllcy5yZW1vdmUoXHJcbiAgLy8gICAgICAgICAgIHRoYXQubm9kZVBvaW50c1t0aGF0Lm5vZGVQb2ludHMubGVuZ3RoIC0gMV1cclxuICAvLyAgICAgICAgIClcclxuICAvLyAgICAgICAgIHRoYXQubm9kZVBvaW50cy5wb3AoKVxyXG4gIC8vICAgICAgICAgaWYgKHNlbGVjdFBvaW50LmluZGV4ID09PSB0aGF0Lm9wdGlvbnMucG9zaXRpb25zLmxlbmd0aCkge1xyXG4gIC8vICAgICAgICAgICBpZiAodGhhdC5ub2RlUG9pbnRzW3NlbGVjdFBvaW50LmluZGV4IC0gMV0pIHtcclxuICAvLyAgICAgICAgICAgICBzZWxlY3RQb2ludCA9IHRoYXQubm9kZVBvaW50c1tzZWxlY3RQb2ludC5pbmRleCAtIDFdXHJcbiAgLy8gICAgICAgICAgIH0gZWxzZSB7XHJcbiAgLy8gICAgICAgICAgICAgc2VsZWN0UG9pbnQuaW5kZXggPSAwXHJcbiAgLy8gICAgICAgICAgIH1cclxuICAvLyAgICAgICAgIH1cclxuICAvLyAgICAgICB9XHJcbiAgLy8gICAgIH0pXHJcblxyXG4gIC8vICAgICB0aGF0LmVudGl0eS5wb2x5bGluZS5wb3NpdGlvbnMgPSBuZXcgQ2VzaXVtLkNhbGxiYWNrUHJvcGVydHkoZnVuY3Rpb24gKCkge1xyXG4gIC8vICAgICAgIHJldHVybiBuZXdwb3NpdGlvbnNcclxuICAvLyAgICAgfSwgZmFsc2UpXHJcblxyXG4gIC8vICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoYXQub3B0aW9ucy5wb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAvLyAgICAgICBsZXQgZW50aXR5ID0gdGhhdC5zZGsudmlld2VyLmVudGl0aWVzLmFkZCh7XHJcbiAgLy8gICAgICAgICBuYW1lOiAnbm9kZS1zZWNvbmRhcnktZWRpdC1wb2ludCcsXHJcbiAgLy8gICAgICAgICBpbmRleDogaSxcclxuICAvLyAgICAgICAgIHBvc2l0aW9uOiBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlcyhcclxuICAvLyAgICAgICAgICAgdGhhdC5vcHRpb25zLnBvc2l0aW9uc1tpXS5sbmcsXHJcbiAgLy8gICAgICAgICAgIHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbaV0ubGF0LFxyXG4gIC8vICAgICAgICAgICB0aGF0Lm9wdGlvbnMucG9zaXRpb25zW2ldLmFsdFxyXG4gIC8vICAgICAgICAgKSxcclxuICAvLyAgICAgICAgIGJpbGxib2FyZDoge1xyXG4gIC8vICAgICAgICAgICBpbWFnZTogdGhhdC5nZXRTb3VyY2VSb290UGF0aCgpICsgJy9pbWcvcG9pbnQucG5nJyxcclxuICAvLyAgICAgICAgICAgd2lkdGg6IDE1LFxyXG4gIC8vICAgICAgICAgICBoZWlnaHQ6IDE1LFxyXG4gIC8vICAgICAgICAgICBkaXNhYmxlRGVwdGhUZXN0RGlzdGFuY2U6IE51bWJlci5QT1NJVElWRV9JTkZJTklUWVxyXG4gIC8vICAgICAgICAgfVxyXG4gIC8vICAgICAgIH0pXHJcbiAgLy8gICAgICAgdGhhdC5ub2RlUG9pbnRzLnB1c2goZW50aXR5KVxyXG4gIC8vICAgICB9XHJcbiAgLy8gICB9XHJcbiAgLy8gfVxyXG5cclxuICBub2RlRWRpdChjZCkge1xyXG4gICAgdGhpcy5wb3NpdGlvbkVkaXRpbmcgPSBmYWxzZVxyXG4gICAgaWYgKFlKLk1lYXN1cmUuR2V0TWVhc3VyZVN0YXR1cygpKSB7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmNsb3NlTm9kZUVkaXQoKVxyXG4gICAgICB0aGlzLnRpcCA9IG5ldyBNb3VzZVRpcCgn6K+36YCJ5oup5LiA5Liq6aG254K577yM5Y+z6ZSu5Y+W5raIJywgdGhpcy5zZGspXHJcbiAgICAgIHRoaXMuZXZlbnQgPSBuZXcgTW91c2VFdmVudCh0aGlzLnNkaylcclxuICAgICAgdGhpcy5Db250cm9sbGVyT2JqZWN0ID0gbmV3IENvbnRyb2xsZXIodGhpcy5zZGspXHJcblxyXG4gICAgICB0aGlzLl9ub2RlRWRpdENhbGxiYWNrID0gY2RcclxuICAgICAgbGV0IHNlbGVjdFBvaW50XHJcbiAgICAgIHRoaXMuZXZlbnQubW91c2VfbGVmdCgobW92ZW1lbnQsIGNhcnRlc2lhbikgPT4ge1xyXG4gICAgICAgIHZhciBwaWNrID0gdGhpcy5zZGsudmlld2VyLnNjZW5lLnBpY2sobW92ZW1lbnQucG9zaXRpb24pXHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgcGljayAmJlxyXG4gICAgICAgICAgcGljay5pZCAmJlxyXG4gICAgICAgICAgcGljay5pZC5uYW1lICYmXHJcbiAgICAgICAgICBwaWNrLmlkLm5hbWUgPT09ICdub2RlLXNlY29uZGFyeS1lZGl0LXBvaW50J1xyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgc2VsZWN0UG9pbnQgPSBwaWNrLmlkXHJcbiAgICAgICAgICB0aGlzLkNvbnRyb2xsZXJPYmplY3QucG9zaXRpb24gPVxyXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zW3NlbGVjdFBvaW50LmluZGV4XVxyXG4gICAgICAgICAgdGhpcy5Db250cm9sbGVyT2JqZWN0LmVkaXRUcmFuc2xhdGlvbmFsKClcclxuICAgICAgICAgIHRoaXMudGlwICYmIHRoaXMudGlwLmRlc3Ryb3koKVxyXG4gICAgICAgICAgdGhpcy5Db250cm9sbGVyT2JqZWN0LmNvbnRyb2xsZXJDYWxsQmFjayA9IHBhcmFtcyA9PiB7XHJcbiAgICAgICAgICAgIGlmIChzZWxlY3RQb2ludC5pbmRleCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgIHRoaXMubGFiZWwucG9zaXRpb24gPSBbXHJcbiAgICAgICAgICAgICAgICBwYXJhbXMucG9zaXRpb24ubG5nLFxyXG4gICAgICAgICAgICAgICAgcGFyYW1zLnBvc2l0aW9uLmxhdCxcclxuICAgICAgICAgICAgICAgIHBhcmFtcy5wb3NpdGlvbi5hbHRcclxuICAgICAgICAgICAgICBdXHJcbiAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmxhYmVsLnBvc2l0aW9uID0ge1xyXG4gICAgICAgICAgICAgICAgbG5nOiBwYXJhbXMucG9zaXRpb24ubG5nLFxyXG4gICAgICAgICAgICAgICAgbGF0OiBwYXJhbXMucG9zaXRpb24ubGF0LFxyXG4gICAgICAgICAgICAgICAgYWx0OiBwYXJhbXMucG9zaXRpb24uYWx0XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbc2VsZWN0UG9pbnQuaW5kZXhdID0gcGFyYW1zLnBvc2l0aW9uXHJcbiAgICAgICAgICAgIHRoaXMuX2VsbXMubG5nICYmICh0aGlzLl9lbG1zLmxuZ1tzZWxlY3RQb2ludC5pbmRleF0uaW5uZXJIVE1MID0gcGFyYW1zLnBvc2l0aW9uLmxuZy50b0ZpeGVkKDgpKVxyXG4gICAgICAgICAgICB0aGlzLl9lbG1zLmxuZ0lucHV0ICYmICh0aGlzLl9lbG1zLmxuZ0lucHV0W3NlbGVjdFBvaW50LmluZGV4XS52YWx1ZSA9IHBhcmFtcy5wb3NpdGlvbi5sbmcudG9GaXhlZCg4KSlcclxuICAgICAgICAgICAgdGhpcy5fZWxtcy5sYXQgJiYgKHRoaXMuX2VsbXMubGF0W3NlbGVjdFBvaW50LmluZGV4XS5pbm5lckhUTUwgPSBwYXJhbXMucG9zaXRpb24ubGF0LnRvRml4ZWQoOCkpXHJcbiAgICAgICAgICAgIHRoaXMuX2VsbXMubGF0SW5wdXQgJiYgKHRoaXMuX2VsbXMubGF0SW5wdXRbc2VsZWN0UG9pbnQuaW5kZXhdLnZhbHVlID0gcGFyYW1zLnBvc2l0aW9uLmxhdC50b0ZpeGVkKDgpKVxyXG4gICAgICAgICAgICB0aGlzLl9lbG1zLmFsdCAmJiAodGhpcy5fZWxtcy5hbHRbc2VsZWN0UG9pbnQuaW5kZXhdLmlubmVySFRNTCA9IHBhcmFtcy5wb3NpdGlvbi5hbHQudG9GaXhlZCgyKSlcclxuICAgICAgICAgICAgdGhpcy5fZWxtcy5hbHRJbnB1dCAmJiAodGhpcy5fZWxtcy5hbHRJbnB1dFtzZWxlY3RQb2ludC5pbmRleF0udmFsdWUgPSBwYXJhbXMucG9zaXRpb24uYWx0LnRvRml4ZWQoMikpXHJcbiAgICAgICAgICAgIHNlbGVjdFBvaW50LnBvc2l0aW9uID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXMoXHJcbiAgICAgICAgICAgICAgcGFyYW1zLnBvc2l0aW9uLmxuZyxcclxuICAgICAgICAgICAgICBwYXJhbXMucG9zaXRpb24ubGF0LFxyXG4gICAgICAgICAgICAgIHBhcmFtcy5wb3NpdGlvbi5hbHRcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuXHJcbiAgICAgIHRoaXMuZXZlbnQubW91c2VfcmlnaHQoKG1vdmVtZW50LCBjYXJ0ZXNpYW4pID0+IHtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubm9kZVBvaW50cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgdGhpcy5zZGsudmlld2VyLmVudGl0aWVzLnJlbW92ZSh0aGlzLm5vZGVQb2ludHNbaV0pXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMubm9kZVBvaW50cyA9IFtdXHJcbiAgICAgICAgdGhpcy5ldmVudC5kZXN0cm95KClcclxuICAgICAgICB0aGlzLnRpcCAmJiB0aGlzLnRpcC5kZXN0cm95KClcclxuICAgICAgICB0aGlzLnRpcCA9IG51bGxcclxuICAgICAgICB0aGlzLkNvbnRyb2xsZXJPYmplY3QuZGVzdHJveSgpXHJcblxyXG4gICAgICAgIGxldCBmcm9tRGVncmVlc0FycmF5ID0gdGhpcy5yZW5ld1Bvc2l0aW9ucyh0aGlzLm9wdGlvbnMucG9zaXRpb25zKVxyXG4gICAgICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLnBvc2l0aW9ucyA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzQXJyYXlIZWlnaHRzKGZyb21EZWdyZWVzQXJyYXkpXHJcbiAgICAgICAgWUouTWVhc3VyZS5TZXRNZWFzdXJlU3RhdHVzKGZhbHNlKVxyXG4gICAgICAgIHRoaXMuX25vZGVFZGl0Q2FsbGJhY2sgPSBudWxsXHJcbiAgICAgIH0pXHJcblxyXG4gICAgICB0aGlzLmV2ZW50Lm1vdXNlX21vdmUoKG1vdmVtZW50LCBjYXJ0ZXNpYW4pID0+IHtcclxuICAgICAgICB0aGlzLnRpcC5zZXRQb3NpdGlvbihcclxuICAgICAgICAgIGNhcnRlc2lhbixcclxuICAgICAgICAgIG1vdmVtZW50LmVuZFBvc2l0aW9uLngsXHJcbiAgICAgICAgICBtb3ZlbWVudC5lbmRQb3NpdGlvbi55XHJcbiAgICAgICAgKVxyXG4gICAgICB9KVxyXG5cclxuICAgICAgdGhpcy5lbnRpdHkucG9seWxpbmUucG9zaXRpb25zID0gbmV3IENlc2l1bS5DYWxsYmFja1Byb3BlcnR5KCAoKSA9PiB7XHJcbiAgICAgICAgbGV0IGZyb21EZWdyZWVzQXJyYXkgPSB0aGlzLnJlbmV3UG9zaXRpb25zKHRoaXMub3B0aW9ucy5wb3NpdGlvbnMpXHJcbiAgICAgICAgdGhpcy5fbm9kZUVkaXRDYWxsYmFjayh0aGlzLm9wdGlvbnMucG9zaXRpb25zLCB0aGlzLmxlbmd0aEJ5TWV0ZXIpXHJcbiAgICAgICAgcmV0dXJuIENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzQXJyYXlIZWlnaHRzKGZyb21EZWdyZWVzQXJyYXkpXHJcbiAgICAgIH0sIGZhbHNlKVxyXG5cclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm9wdGlvbnMucG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgbGV0IGVudGl0eSA9IHRoaXMuc2RrLnZpZXdlci5lbnRpdGllcy5hZGQoe1xyXG4gICAgICAgICAgbmFtZTogJ25vZGUtc2Vjb25kYXJ5LWVkaXQtcG9pbnQnLFxyXG4gICAgICAgICAgaW5kZXg6IGksXHJcbiAgICAgICAgICBwb3NpdGlvbjogQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXMoXHJcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubG5nLFxyXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxhdCxcclxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5hbHRcclxuICAgICAgICAgICksXHJcbiAgICAgICAgICBiaWxsYm9hcmQ6IHtcclxuICAgICAgICAgICAgaW1hZ2U6IHRoaXMuZ2V0U291cmNlUm9vdFBhdGgoKSArICcvaW1nL3BvaW50LnBuZycsXHJcbiAgICAgICAgICAgIHdpZHRoOiAxNSxcclxuICAgICAgICAgICAgaGVpZ2h0OiAxNSxcclxuICAgICAgICAgICAgZGlzYWJsZURlcHRoVGVzdERpc3RhbmNlOiBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksXHJcbiAgICAgICAgICAgIGNvbG9yOiBDZXNpdW0uQ29sb3IuV0hJVEUud2l0aEFscGhhKDAuOTkpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgICB0aGlzLm5vZGVQb2ludHMucHVzaChlbnRpdHkpXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNsb3NlTm9kZUVkaXQoKSB7XHJcbiAgICB0aGlzLkNvbnRyb2xsZXJPYmplY3QgJiYgdGhpcy5Db250cm9sbGVyT2JqZWN0LmRlc3Ryb3koKVxyXG4gICAgdGhpcy5ldmVudCAmJiB0aGlzLmV2ZW50LmRlc3Ryb3koKVxyXG4gICAgdGhpcy50aXAgJiYgdGhpcy50aXAuZGVzdHJveSgpXHJcbiAgICB0aGlzLnRpcCA9IG51bGxcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubm9kZVBvaW50cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICB0aGlzLnNkay52aWV3ZXIuZW50aXRpZXMucmVtb3ZlKHRoaXMubm9kZVBvaW50c1tpXSlcclxuICAgIH1cclxuICAgIHRoaXMubm9kZVBvaW50cyA9IFtdXHJcbiAgICB0aGlzLl9ub2RlRWRpdENhbGxiYWNrID0gbnVsbFxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICog5Yig6ZmkXHJcbiAgICovXHJcbiAgYXN5bmMgcmVtb3ZlKCkge1xyXG4gICAgdGhpcy5ldmVudCAmJiB0aGlzLmV2ZW50LmRlc3Ryb3koKVxyXG4gICAgdGhpcy50aXAgJiYgdGhpcy50aXAuZGVzdHJveSgpXHJcbiAgICB0aGlzLmxhYmVsICYmIHRoaXMubGFiZWwucmVtb3ZlKClcclxuICAgIHRoaXMuc2RrLnZpZXdlci5lbnRpdGllcy5yZW1vdmUodGhpcy5lbnRpdHkpXHJcbiAgICB0aGlzLmVudGl0eSA9IG51bGxcclxuICAgIGlmICh0aGlzLl9EaWFsb2dPYmplY3QgJiYgIXRoaXMuX0RpYWxvZ09iamVjdC5pc0Rlc3Ryb3kpIHtcclxuICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0LmNsb3NlKClcclxuICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0ID0gbnVsbFxyXG4gICAgfVxyXG4gICAgYXdhaXQgdGhpcy5zZGsucmVtb3ZlSW5jZXRhbmNlKHRoaXMub3B0aW9ucy5pZClcclxuICAgIGF3YWl0IHN5bmNEYXRhKHRoaXMuc2RrLCB0aGlzLm9wdGlvbnMuaWQpXHJcbiAgfVxyXG5cclxuICAvKipAZGVzYyDmiZPlvIDlubPnp7vlip/og71cclxuICAgKlxyXG4gICAqIEBtZW1iZXJPZiBTb3VyY2VcclxuICAgKiBAcGFyYW0gc3RhdHVzIHtib29sZWFufVxyXG4gICAqXHJcbiAgICogKi9cclxuICBzZXQgcG9zaXRpb25FZGl0aW5nKHN0YXR1cykge1xyXG4gICAgaWYgKFlKLk1lYXN1cmUuR2V0TWVhc3VyZVN0YXR1cygpIHx8ICF0aGlzLnNkayB8fCAhdGhpcy5zZGsudmlld2VyIHx8ICF0aGlzLmVudGl0eSkge1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuICAgIHRoaXMub3BlcmF0ZS5wb3NpdGlvbkVkaXRpbmcgPSBzdGF0dXNcclxuICAgIGlmIChzdGF0dXMgPT09IHRydWUpIHtcclxuICAgICAgdGhpcy5jbG9zZU5vZGVFZGl0KClcclxuICAgICAgdGhpcy5ldmVudCAmJiB0aGlzLmV2ZW50LmRlc3Ryb3koKVxyXG4gICAgICB0aGlzLmV2ZW50ID0gbmV3IE1vdXNlRXZlbnQodGhpcy5zZGspXHJcbiAgICAgIHRoaXMudGlwICYmIHRoaXMudGlwLmRlc3Ryb3koKVxyXG4gICAgICB0aGlzLnRpcCA9IG5ldyBNb3VzZVRpcCgn54K55Ye76byg5qCH5bem6ZSu56Gu6K6k77yM5Y+z6ZSu5Y+W5raIJywgdGhpcy5zZGspXHJcbiAgICAgIHRoaXMubGFiZWwgJiZcclxuICAgICAgICAodGhpcy5sYWJlbC5lbnRpdHkuYmlsbGJvYXJkLmNvbG9yID0gQ2VzaXVtLkNvbG9yLmZyb21Dc3NDb2xvclN0cmluZyhcclxuICAgICAgICAgIGByZ2JhKDI1NSwyNTUsMjU1LDAuOSlgXHJcbiAgICAgICAgKSlcclxuICAgICAgdGhpcy5waWNraW5nID0gZmFsc2VcclxuICAgICAgbGV0IHBvc2l0aW9ucyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5vcHRpb25zLnBvc2l0aW9ucykpXHJcbiAgICAgIGxldCBwb3NpdGlvbnMyID0gdGhpcy5yZW5ld1Bvc2l0aW9ucyh0aGlzLm9wdGlvbnMucG9zaXRpb25zKVxyXG4gICAgICAvLyBsZXQgcG9zaXRpb25zMiA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkocG9zaXRpb25zKSlcclxuICAgICAgLy8gZm9yIChsZXQgaSA9IDA7IGkgPCBwb3NpdGlvbnMyLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIC8vICAgbGV0IGhlaWdodCA9IHRoaXMuc2RrLnZpZXdlci5zY2VuZS5nbG9iZS5nZXRIZWlnaHQoQ2VzaXVtLkNhcnRvZ3JhcGhpYy5mcm9tRGVncmVlcyhwb3NpdGlvbnMyW2ldLmxuZywgcG9zaXRpb25zMltpXS5sYXQpKVxyXG4gICAgICAvLyAgIHBvc2l0aW9uczJbaV0gPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlcyhcclxuICAgICAgLy8gICAgIHBvc2l0aW9uczJbaV0ubG5nLFxyXG4gICAgICAvLyAgICAgcG9zaXRpb25zMltpXS5sYXQsXHJcbiAgICAgIC8vICAgICBOdW1iZXIoKHBvc2l0aW9uczJbaV0uYWx0ICsgTnVtYmVyKGhlaWdodCkpLnRvRml4ZWQoMikpXHJcbiAgICAgIC8vICAgKVxyXG4gICAgICAvLyB9XHJcbiAgICAgIHRoaXMucHJldmlvdXMgPSB7XHJcbiAgICAgICAgcG9zaXRpb25zOiBbLi4udGhpcy5vcHRpb25zLnBvc2l0aW9uc11cclxuICAgICAgfVxyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIHBvc2l0aW9uc1tpXSA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzKFxyXG4gICAgICAgICAgcG9zaXRpb25zW2ldLmxuZyxcclxuICAgICAgICAgIHBvc2l0aW9uc1tpXS5sYXQsXHJcbiAgICAgICAgICBwb3NpdGlvbnNbaV0uYWx0XHJcbiAgICAgICAgKVxyXG4gICAgICB9XHJcbiAgICAgIGxldCBjZW50ZXIgPSBwb3NpdGlvbnNbTWF0aC5mbG9vcihwb3NpdGlvbnMubGVuZ3RoIC8gMildXHJcbiAgICAgIGxldCBkaXNwYXJpdHkgPSBbXVxyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGRpc3Bhcml0eS5wdXNoKHtcclxuICAgICAgICAgIHg6IGNlbnRlci54IC0gcG9zaXRpb25zW2ldLngsXHJcbiAgICAgICAgICB5OiBjZW50ZXIueSAtIHBvc2l0aW9uc1tpXS55LFxyXG4gICAgICAgICAgejogY2VudGVyLnogLSBwb3NpdGlvbnNbaV0uelxyXG4gICAgICAgIH0pXHJcbiAgICAgIH1cclxuICAgICAgbGV0IG5ld3Bvc2l0aW9ucyA9IFtdXHJcbiAgICAgIGxldCBuZXdwb3NpdGlvbnM4NCA9IFtdXHJcbiAgICAgIHRoaXMuZXZlbnQubW91c2VfbW92ZSgobW92ZW1lbnQsIGNhcnRlc2lhbikgPT4ge1xyXG4gICAgICAgIG5ld3Bvc2l0aW9ucyA9IFtdXHJcbiAgICAgICAgbmV3cG9zaXRpb25zODQgPSBbXVxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGlzcGFyaXR5Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBsZXQgbmV3UCA9IHtcclxuICAgICAgICAgICAgeDogY2FydGVzaWFuLnggLSBkaXNwYXJpdHlbaV0ueCxcclxuICAgICAgICAgICAgeTogY2FydGVzaWFuLnkgLSBkaXNwYXJpdHlbaV0ueSxcclxuICAgICAgICAgICAgejogY2FydGVzaWFuLnogLSBkaXNwYXJpdHlbaV0uelxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgbGV0IHBvczg0ID0gdGhpcy5jYXJ0ZXNpYW4zVG93Z3M4NChcclxuICAgICAgICAgICAgbmV3UCxcclxuICAgICAgICAgICAgdGhpcy5zZGsudmlld2VyXHJcbiAgICAgICAgICApXHJcbiAgICAgICAgICBwb3M4NC5hbHQgPSB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmFsdFxyXG4gICAgICAgICAgLy8gbGV0IGhlaWdodCA9IHRoaXMuc2RrLnZpZXdlci5zY2VuZS5nbG9iZS5nZXRIZWlnaHQoQ2VzaXVtLkNhcnRvZ3JhcGhpYy5mcm9tRGVncmVlcyhwb3M4NC5sbmcsIHBvczg0LmxhdCkpXHJcbiAgICAgICAgICAvLyBwb3M4NC5hbHQgPSBOdW1iZXIoKHBvczg0LmFsdCArIE51bWJlcihoZWlnaHQpKS50b0ZpeGVkKDIpKVxyXG4gICAgICAgICAgLy8gbmV3UCA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzKFxyXG4gICAgICAgICAgLy8gICBwb3M4NC5sbmcsXHJcbiAgICAgICAgICAvLyAgIHBvczg0LmxhdCxcclxuICAgICAgICAgIC8vICAgcG9zODQuYWx0XHJcbiAgICAgICAgICAvLyApXHJcbiAgICAgICAgICBuZXdwb3NpdGlvbnMucHVzaChuZXdQKVxyXG4gICAgICAgICAgbmV3cG9zaXRpb25zODQucHVzaChwb3M4NClcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IHBvc2l0aW9uODQgPSBuZXdwb3NpdGlvbnM4NFswXVxyXG4gICAgICAgIHBvc2l0aW9uczIgPSB0aGlzLnJlbmV3UG9zaXRpb25zKG5ld3Bvc2l0aW9uczg0KVxyXG4gICAgICAgIHRoaXMubGFiZWwucG9zaXRpb24gPSBbcG9zaXRpb244NC5sbmcsIHBvc2l0aW9uODQubGF0LCBwb3NpdGlvbjg0LmFsdF1cclxuICAgICAgICB0aGlzLm9wdGlvbnMubGFiZWwucG9zaXRpb24gPSB7XHJcbiAgICAgICAgICBsbmc6IHBvc2l0aW9uODQubG5nLFxyXG4gICAgICAgICAgbGF0OiBwb3NpdGlvbjg0LmxhdCxcclxuICAgICAgICAgIGFsdDogcG9zaXRpb244NC5hbHRcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy50aXAuc2V0UG9zaXRpb24oXHJcbiAgICAgICAgICBjYXJ0ZXNpYW4sXHJcbiAgICAgICAgICBtb3ZlbWVudC5lbmRQb3NpdGlvbi54LFxyXG4gICAgICAgICAgbW92ZW1lbnQuZW5kUG9zaXRpb24ueVxyXG4gICAgICAgIClcclxuICAgICAgfSlcclxuICAgICAgdGhpcy5ldmVudC5tb3VzZV9sZWZ0KChtb3ZlbWVudCwgY2FydGVzaWFuKSA9PiB7XHJcbiAgICAgICAgdGhpcy5ldmVudC5tb3VzZV9tb3ZlKCgpID0+IHsgfSlcclxuICAgICAgICB0aGlzLmV2ZW50Lm1vdXNlX2xlZnQoKCkgPT4geyB9KVxyXG4gICAgICAgIHRoaXMuZXZlbnQubW91c2VfcmlnaHQoKCkgPT4geyB9KVxyXG4gICAgICAgIG5ld3Bvc2l0aW9ucyA9IFtdXHJcbiAgICAgICAgbmV3cG9zaXRpb25zODQgPSBbXVxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGlzcGFyaXR5Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBsZXQgbmV3UCA9IHtcclxuICAgICAgICAgICAgeDogY2FydGVzaWFuLnggLSBkaXNwYXJpdHlbaV0ueCxcclxuICAgICAgICAgICAgeTogY2FydGVzaWFuLnkgLSBkaXNwYXJpdHlbaV0ueSxcclxuICAgICAgICAgICAgejogY2FydGVzaWFuLnogLSBkaXNwYXJpdHlbaV0uelxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgbGV0IHBvczg0ID0gdGhpcy5jYXJ0ZXNpYW4zVG93Z3M4NChcclxuICAgICAgICAgICAgbmV3UCxcclxuICAgICAgICAgICAgdGhpcy5zZGsudmlld2VyXHJcbiAgICAgICAgICApXHJcbiAgICAgICAgICBwb3M4NC5hbHQgPSB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmFsdFxyXG4gICAgICAgICAgbmV3cG9zaXRpb25zLnB1c2gobmV3UClcclxuICAgICAgICAgIG5ld3Bvc2l0aW9uczg0LnB1c2gocG9zODQpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBwb3NpdGlvbnNMbmdMYXQgPSBbXVxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmV3cG9zaXRpb25zODQubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGxldCBwb3NpdGlvbiA9IG5ld3Bvc2l0aW9uczg0W2ldXHJcbiAgICAgICAgICBwb3NpdGlvbnNMbmdMYXQucHVzaChwb3NpdGlvbilcclxuXHJcbiAgICAgICAgICB0aGlzLl9lbG1zLmxuZyAmJiAodGhpcy5fZWxtcy5sbmdbaV0uaW5uZXJIVE1MID0gcG9zaXRpb24ubG5nLnRvRml4ZWQoOCkpXHJcbiAgICAgICAgICB0aGlzLl9lbG1zLmxuZ0lucHV0ICYmICh0aGlzLl9lbG1zLmxuZ0lucHV0W2ldLnZhbHVlID0gcG9zaXRpb24ubG5nLnRvRml4ZWQoOCkpXHJcbiAgICAgICAgICB0aGlzLl9lbG1zLmxhdCAmJiAodGhpcy5fZWxtcy5sYXRbaV0uaW5uZXJIVE1MID0gcG9zaXRpb24ubGF0LnRvRml4ZWQoOCkpXHJcbiAgICAgICAgICB0aGlzLl9lbG1zLmxhdElucHV0ICYmICh0aGlzLl9lbG1zLmxhdElucHV0W2ldLnZhbHVlID0gcG9zaXRpb24ubGF0LnRvRml4ZWQoOCkpXHJcbiAgICAgICAgICB0aGlzLl9lbG1zLmFsdCAmJiAodGhpcy5fZWxtcy5hbHRbaV0uaW5uZXJIVE1MID0gcG9zaXRpb24uYWx0LnRvRml4ZWQoMikpXHJcbiAgICAgICAgICB0aGlzLl9lbG1zLmFsdElucHV0ICYmICh0aGlzLl9lbG1zLmFsdElucHV0W2ldLnZhbHVlID0gcG9zaXRpb24uYWx0LnRvRml4ZWQoMikpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zID0gcG9zaXRpb25zTG5nTGF0XHJcbiAgICAgICAgdGhpcy5wcmV2aW91cy5wb3NpdGlvbnMgPSBwb3NpdGlvbnNMbmdMYXRcclxuXHJcbiAgICAgICAgLy8gdGhpcy5lbnRpdHkucG9seWxpbmUucG9zaXRpb25zTG5nTGF0ID0gcG9zaXRpb25zTG5nTGF0XHJcbiAgICAgICAgbGV0IGZyb21EZWdyZWVzQXJyYXkgPSB0aGlzLnJlbmV3UG9zaXRpb25zKHRoaXMub3B0aW9ucy5wb3NpdGlvbnMsICgpPT57XHJcbiAgICAgICAgICBpZih0aGlzLl9wb3NpdGlvbkVkaXRpbmdDYWxsYmFjaykge1xyXG4gICAgICAgICAgICB0aGlzLl9wb3NpdGlvbkVkaXRpbmdDYWxsYmFjaygpXHJcbiAgICAgICAgICAgIHRoaXMuX3Bvc2l0aW9uRWRpdGluZ0NhbGxiYWNrID0gbnVsbFxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgdGhpcy5lbnRpdHkucG9seWxpbmUucG9zaXRpb25zID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXNBcnJheUhlaWdodHMoXHJcbiAgICAgICAgICBmcm9tRGVncmVlc0FycmF5XHJcbiAgICAgICAgKVxyXG4gICAgICAgIHRoaXMucmVuZXdQb2x5Z29uKGZyb21EZWdyZWVzQXJyYXkpXHJcbiAgICAgICAgdGhpcy5wb3NpdGlvbkVkaXRpbmcgPSBmYWxzZVxyXG4gICAgICB9KVxyXG5cclxuICAgICAgdGhpcy5ldmVudC5tb3VzZV9yaWdodCgobW92ZW1lbnQsIGNhcnRlc2lhbikgPT4ge1xyXG4gICAgICAgIHRoaXMuZXZlbnQubW91c2VfbW92ZSgoKSA9PiB7IH0pXHJcbiAgICAgICAgdGhpcy5ldmVudC5tb3VzZV9sZWZ0KCgpID0+IHsgfSlcclxuICAgICAgICB0aGlzLmV2ZW50Lm1vdXNlX3JpZ2h0KCgpID0+IHsgfSlcclxuICAgICAgICB0aGlzLnBvc2l0aW9uRWRpdGluZyA9IGZhbHNlXHJcbiAgICAgIH0pXHJcbiAgICAgIHRoaXMuZXZlbnQuZ2VzdHVyZV9waW5ja19zdGFydCgobW92ZW1lbnQsIGNhcnRlc2lhbikgPT4ge1xyXG4gICAgICAgIGxldCBzdGFydFRpbWUgPSBuZXcgRGF0ZSgpXHJcbiAgICAgICAgdGhpcy5ldmVudC5nZXN0dXJlX3BpbmNrX2VuZCgoKSA9PiB7XHJcbiAgICAgICAgICBsZXQgZW5kVGltZSA9IG5ldyBEYXRlKClcclxuICAgICAgICAgIGxldCBwb3MgPSB7XHJcbiAgICAgICAgICAgIHBvc2l0aW9uOiB7XHJcbiAgICAgICAgICAgICAgeDogKG1vdmVtZW50LnBvc2l0aW9uMS54ICsgbW92ZW1lbnQucG9zaXRpb24yLngpIC8gMixcclxuICAgICAgICAgICAgICB5OiAobW92ZW1lbnQucG9zaXRpb24xLnkgKyBtb3ZlbWVudC5wb3NpdGlvbjIueSkgLyAyXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChlbmRUaW1lIC0gc3RhcnRUaW1lID49IDUwMCkge1xyXG4gICAgICAgICAgICAvLyDplb/mjInlj5bmtohcclxuICAgICAgICAgICAgdGhpcy5ldmVudC5tb3VzZV9tb3ZlKCgpID0+IHsgfSlcclxuICAgICAgICAgICAgdGhpcy5ldmVudC5tb3VzZV9sZWZ0KCgpID0+IHsgfSlcclxuICAgICAgICAgICAgdGhpcy5ldmVudC5tb3VzZV9yaWdodCgoKSA9PiB7IH0pXHJcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb25FZGl0aW5nID0gZmFsc2VcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGxlZnRFdmVudChwb3MsIGNhcnRlc2lhbilcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgICB9KVxyXG5cclxuICAgICAgdGhpcy5lbnRpdHkucG9seWxpbmUucG9zaXRpb25zID0gbmV3IENlc2l1bS5DYWxsYmFja1Byb3BlcnR5KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICByZXR1cm4gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXNBcnJheUhlaWdodHMoXHJcbiAgICAgICAgICBwb3NpdGlvbnMyXHJcbiAgICAgICAgKVxyXG4gICAgICB9LCBmYWxzZSlcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmICghdGhpcy5zZGsgfHwgIXRoaXMuc2RrLnZpZXdlciB8fCAhdGhpcy5sYWJlbCB8fCAhdGhpcy5sYWJlbC5lbnRpdHkpIHtcclxuICAgICAgICB0aGlzLmxhYmVsLmVudGl0eS5iaWxsYm9hcmQuY29sb3IgPSBDZXNpdW0uQ29sb3IuZnJvbUNzc0NvbG9yU3RyaW5nKFxyXG4gICAgICAgICAgYHJnYmEoMjU1LDI1NSwyNTUsMSlgXHJcbiAgICAgICAgKVxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMucGlja2luZyA9IHRydWVcclxuICAgICAgaWYgKHRoaXMuZXZlbnQpIHtcclxuICAgICAgICB0aGlzLmV2ZW50Lm1vdXNlX21vdmUoKCkgPT4geyB9KVxyXG4gICAgICAgIHRoaXMuZXZlbnQubW91c2VfbGVmdCgoKSA9PiB7IH0pXHJcbiAgICAgICAgdGhpcy5ldmVudC5tb3VzZV9yaWdodCgoKSA9PiB7IH0pXHJcbiAgICAgICAgdGhpcy5ldmVudC5kZXN0cm95KClcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnRpcCAmJiB0aGlzLnRpcC5kZXN0cm95KClcclxuICAgICAgbGV0IGZyb21EZWdyZWVzQXJyYXkgPSB0aGlzLnJlbmV3UG9zaXRpb25zKHRoaXMub3B0aW9ucy5wb3NpdGlvbnMpXHJcbiAgICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLnBvc2l0aW9ucyA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzQXJyYXlIZWlnaHRzKFxyXG4gICAgICAgIGZyb21EZWdyZWVzQXJyYXlcclxuICAgICAgKVxyXG4gICAgICB0aGlzLnJlbmV3UG9seWdvbihmcm9tRGVncmVlc0FycmF5KVxyXG5cclxuICAgICAgc3dpdGNoICh0aGlzLmhlaWdodE1vZGUpIHtcclxuICAgICAgICBjYXNlIDA6XHJcbiAgICAgICAgY2FzZSAnMCc6XHJcbiAgICAgICAgY2FzZSAxOlxyXG4gICAgICAgIGNhc2UgJzEnOlxyXG4gICAgICAgICAgdGhpcy5sYWJlbC5wb3NpdGlvbiA9IFtcclxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXS5sbmcsXHJcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0ubGF0LFxyXG4gICAgICAgICAgICBmcm9tRGVncmVlc0FycmF5WzJdXHJcbiAgICAgICAgICBdXHJcbiAgICAgICAgICB0aGlzLm9wdGlvbnMubGFiZWwucG9zaXRpb24gPSB7XHJcbiAgICAgICAgICAgIGxuZzogdGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXS5sbmcsXHJcbiAgICAgICAgICAgIGxhdDogdGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXS5sYXQsXHJcbiAgICAgICAgICAgIGFsdDogZnJvbURlZ3JlZXNBcnJheVsyXVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSAyOlxyXG4gICAgICAgIGNhc2UgJzInOlxyXG4gICAgICAgICAgdGhpcy5sYWJlbC5wb3NpdGlvbiA9IFtcclxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXS5sbmcsXHJcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0ubGF0LFxyXG4gICAgICAgICAgXVxyXG4gICAgICAgICAgdGhpcy5vcHRpb25zLmxhYmVsLnBvc2l0aW9uID0ge1xyXG4gICAgICAgICAgICBsbmc6IHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0ubG5nLFxyXG4gICAgICAgICAgICBsYXQ6IHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0ubGF0LFxyXG4gICAgICAgICAgICBhbHQ6IGZyb21EZWdyZWVzQXJyYXlbMl1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgcG9zaXRpb25FZGl0aW5nKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3BlcmF0ZS5wb3NpdGlvbkVkaXRpbmdcclxuICB9XHJcbiAgb3BlblBvc2l0aW9uRWRpdGluZyhjZCkge1xyXG4gICAgdGhpcy5wb3NpdGlvbkVkaXRpbmcgPSB0cnVlXHJcbiAgICB0aGlzLl9wb3NpdGlvbkVkaXRpbmdDYWxsYmFjayA9IGNkXHJcbiAgfVxyXG4gIFxyXG4gIGdldCBsZW5ndGhDaGFuZ2VDYWxsQmFjaygpIHtcclxuICAgIHJldHVybiB0aGlzLl9sZW5ndGhDaGFuZ2VDYWxsQmFja1xyXG4gIH1cclxuXHJcbiAgc2V0IGxlbmd0aENoYW5nZUNhbGxCYWNrIChjZCkge1xyXG4gICAgdGhpcy5fbGVuZ3RoQ2hhbmdlQ2FsbEJhY2sgPSBjZFxyXG4gIH1cclxuXHJcbiAgc2V0RElWKG9wdGlvbnMgPSB7IGRvbWlkOiAnJywgeDogMTAsIHk6IDEwIH0pIHtcclxuICAgIG9wdGlvbnMueCA9IG9wdGlvbnMueCB8fCBvcHRpb25zLnggPT09IDAgPyBvcHRpb25zLnggOiAxMFxyXG4gICAgb3B0aW9ucy55ID0gb3B0aW9ucy55IHx8IG9wdGlvbnMueSA9PT0gMCA/IG9wdGlvbnMueSA6IDEwXHJcblxyXG4gICAgbGV0IHBvaW50cyA9IFtdXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMub3B0aW9ucy5wb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgcG9pbnRzLnB1c2goW1xyXG4gICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubG5nLFxyXG4gICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubGF0XHJcbiAgICAgIF0pXHJcbiAgICB9XHJcbiAgICBsZXQgbGluZSA9IHR1cmYubGluZVN0cmluZyhwb2ludHMpXHJcbiAgICBsZXQgbGVuZ3RoID0gdHVyZi5sZW5ndGgobGluZSwgeyB1bml0czogJ2tpbG9tZXRlcnMnIH0pXHJcbiAgICBsZXQgc2xpY2VkID0gdHVyZi5saW5lU2xpY2VBbG9uZyhsaW5lLCAwLCBsZW5ndGggLyAyLCB7XHJcbiAgICAgIHVuaXRzOiAna2lsb21ldGVycydcclxuICAgIH0pXHJcblxyXG4gICAgbGV0IHNpdGVJbmZvRG9tID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQob3B0aW9ucy5kb21pZClcclxuICAgIGxldCBzaXRlSW5mb1Bvc2l0aW9uID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXMoXHJcbiAgICAgIC4uLnNsaWNlZC5nZW9tZXRyeS5jb29yZGluYXRlc1tzbGljZWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXMubGVuZ3RoIC0gMV1cclxuICAgIClcclxuICAgIHRoaXMuc2RrLnZpZXdlci5zY2VuZS5wb3N0UmVuZGVyLmFkZEV2ZW50TGlzdGVuZXIocGVyY2VudGFnZSA9PiB7XHJcbiAgICAgIC8v6L2s5o2i5Yiw5bGP5bmV5Z2Q5qCHXHJcbiAgICAgIGlmIChcclxuICAgICAgICBzaXRlSW5mb0RvbS5zdHlsZS5kaXNwbGF5ID09PSAnYmxvY2snIHx8XHJcbiAgICAgICAgc2l0ZUluZm9Eb20uc3R5bGUuZGlzcGxheSA9PT0gJydcclxuICAgICAgKSB7XHJcbiAgICAgICAgbGV0IHdpbnBvcyA9IHRoaXMuc2RrLnZpZXdlci5zY2VuZS5jYXJ0ZXNpYW5Ub0NhbnZhc0Nvb3JkaW5hdGVzKFxyXG4gICAgICAgICAgc2l0ZUluZm9Qb3NpdGlvblxyXG4gICAgICAgIClcclxuICAgICAgICBpZiAod2lucG9zKSB7XHJcbiAgICAgICAgICBzaXRlSW5mb0RvbS5zdHlsZS5sZWZ0ID0gKHdpbnBvcy54ICsgb3B0aW9ucy54KS50b0ZpeGVkKDApICsgJ3B4J1xyXG4gICAgICAgICAgc2l0ZUluZm9Eb20uc3R5bGUudG9wID0gKHdpbnBvcy55ICsgb3B0aW9ucy55KS50b0ZpeGVkKDApICsgJ3B4J1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcbn1cclxuZXhwb3J0IGRlZmF1bHQgQ3VydmVsaW5lT2JqZWN0XHJcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBSUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFwQkE7QUFBQTtBQWtCQTtBQUdBO0FBQ0E7QUFDQTtBQVFBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUlBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFFQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUtBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFRQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFjQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUdBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBV0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBR0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBakJBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUF6QkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQWtEQTtBQXpEQTtBQUFBO0FBQUE7QUFBQTtBQTBEQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBVkE7QUFBQTtBQVFBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFsQkE7QUFBQTtBQUFBO0FBbUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBcUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBR0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBQUE7QUFBQTtBQUFBO0FBSUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFTQTtBQXNEQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVdBO0FBQ0E7QUFNQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFHQTtBQU1BO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFHQTtBQU9BO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFNQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFNQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBdEhBO0FBQUE7QUFBQTtBQXdIQTtBQUNBO0FBTUE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQXh0QkE7QUFBQTtBQUFBO0FBQUE7QUEwdEJBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFBQTtBQUdBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBekRBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBNERBO0FBSUE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUVBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFBQTtBQUVBO0FBeUJBO0FBQUE7QUF0QkE7QUFDQTtBQUtBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUlBO0FBQUE7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBSUE7QUFBQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQTFHQTtBQUFBO0FBQUE7QUFBQTtBQTRHQTtBQUNBO0FBQ0E7QUFGQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFNQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUtBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFaQTtBQUFBO0FBQUE7QUFBQTtBQWNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUxBO0FBQUE7QUFBQTtBQUFBO0FBb09BO0FBQ0E7QUFBQTtBQS9OQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFNQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFJQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUEvOURBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFBQTtBQUNBO0FBZUE7QUFBQTtBQVpBO0FBQ0E7QUFBQTtBQUFBO0FBSUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBSEE7QUFBQTtBQUFBO0FBT0E7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFIQTtBQUFBO0FBQUE7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQXZEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQTBEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBZzJEQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/Obj/Base/CurvelineObject/index.js\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/toConsumableArray */ \"./node_modules/@babel/runtime/helpers/toConsumableArray.js\");\n/* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ \"./node_modules/@babel/runtime/helpers/asyncToGenerator.js\");\n/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ \"./node_modules/@babel/runtime/helpers/defineProperty.js\");\n/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ \"./node_modules/@babel/runtime/helpers/classCallCheck.js\");\n/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ \"./node_modules/@babel/runtime/helpers/createClass.js\");\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ \"./node_modules/@babel/runtime/helpers/possibleConstructorReturn.js\");\n/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ \"./node_modules/@babel/runtime/helpers/getPrototypeOf.js\");\n/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ \"./node_modules/@babel/runtime/helpers/inherits.js\");\n/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @babel/runtime/regenerator */ \"./node_modules/@babel/runtime/regenerator/index.js\");\n/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8__);\n/* harmony import */ var _Element_Dialog__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../Element/Dialog */ \"./src/Obj/Element/Dialog/index.js\");\n/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./_element */ \"./src/Obj/Base/CurvelineObject/_element.js\");\n/* harmony import */ var _index__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../index */ \"./src/Obj/Base/index.js\");\n/* harmony import */ var _Element_cy_html_tabs__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../../Element/cy_html_tabs */ \"./src/Obj/Element/cy_html_tabs.js\");\n/* harmony import */ var _Element_richText__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../../Element/richText */ \"./src/Obj/Element/richText.js\");\n/* harmony import */ var _eventBinding__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./eventBinding */ \"./src/Obj/Base/CurvelineObject/eventBinding.js\");\n/* harmony import */ var _LabelObject__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../LabelObject */ \"./src/Obj/Base/LabelObject/index.js\");\n/* harmony import */ var _Event_index__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../../../Event/index */ \"./src/Event/index.js\");\n/* harmony import */ var _MouseTip__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../../../MouseTip */ \"./src/MouseTip/index.js\");\n/* harmony import */ var _Controller_index__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../../../Controller/index */ \"./src/Controller/index.js\");\n/* harmony import */ var _Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../../../Global/MultiViewportMode */ \"./src/Global/MultiViewportMode/index.js\");\n/* harmony import */ var _Element_datalist__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../../Element/datalist */ \"./src/Obj/Element/datalist.js\");\n/* harmony import */ var _Element_fontSelect__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../../Element/fontSelect */ \"./src/Obj/Element/fontSelect.js\");\n/* harmony import */ var _Global_SplitScreen__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ../../../Global/SplitScreen */ \"./src/Global/SplitScreen/index.js\");\n/* harmony import */ var _Global_global__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ../../../Global/global */ \"./src/Global/global.js\");\n\n\n\n\n\n\n\n\n\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default()(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nfunction _callSuper(t, o, e) { return o = _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6___default()(o), _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_5___default()(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6___default()(t).constructor) : o.apply(t, e)); }\nfunction _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }\n/**\r\n * @description 线\r\n */\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nvar CurvelineObject = /*#__PURE__*/function (_Base) {\n /**\r\n * @constructor\r\n * @param sdk\r\n * @description 曲线\r\n * @param options {object} 线属性\r\n * @param options.name{string} 名称\r\n * @param options.width=3{number} 线宽\r\n * @param options.color=#ff0000 {string} 颜色\r\n * @param options.type=0 {number} 材质类型 0-实线 1-虚线 2-泛光...\r\n * @param options.heightMode=2{number} 高度模式(0:海拔高度;1:相对高度;2:依附模式)\r\n * @param options.noseToTail=false {boolean} 首尾相连\r\n * @param options.extend=false {boolean} 线缓冲\r\n * @param options.extendWidth=10 {number} 线缓冲宽度\r\n * @param options.extendColor=rgba(255,255,80,0.3) {number} 线缓冲颜色\r\n * @param options.show=true {boolean} 显隐\r\n * @param {Array.} options.positions 必填,经纬度和高度的列表,值交替 [{lon,lat,alt},...]\r\n * @param options.positions[].lng {number} 经度\r\n * @param options.positions[].lat {number} 纬度\r\n * @param options.positions[].alt {number} 高度\r\n * @param options.label {object} 标签对象\r\n * @param options.label.text {string} 标签文本\r\n * @param options.label.show {string} 标签显隐\r\n * @param options.label.position {string} 标签位置\r\n * @param options.label.position {object} 标签位置\r\n * @param options.label.position.lng {number} 经度\r\n * @param options.label.position.lat {number} 纬度\r\n * @param options.label.position.alt {number} 高度\r\n * @param options.label.fontSize=20 {number} 字体大小\r\n * @param options.label.fontFamily=0 {number} 字体项 0:黑体;1:思源黑体;2:庞门正道标题体;3:数黑体\r\n * @param options.label.color=#ffffff {string} 字体颜色\r\n * @param options.label.lineWidth=4 {number} 引线宽\r\n * @param options.label.lineColor=#00ffff80 {string} 引线颜色\r\n * @param options.label.pixelOffset=20 {number} 字体偏移(引线长度)\r\n * @param options.label.backgroundColor=['#00ffff80', '#00ffff80'] {array} 背景颜色\r\n * @param options.label.scaleByDistance {boolean} 距离缩放\r\n * @param options.label.near=2000 {number} 视野缩放最近距离\r\n * @param options.label.far=100000 {number} 视野缩放最远距离\r\n * @param options.attribute {object} 属性内容\r\n * @param options.attribute.link={} {string} 链接\r\n * @param options.attribute.link.content=[]] {array} 链接内容\r\n * @param options.attribute.link.content[].name {string} 链接名称\r\n * @param options.attribute.link.content[].url {string} 链接地址\r\n * @param options.richTextContent {string} 富文本内容\r\n * @param options.customView {object} 默认视角\r\n * @param options.customView.orientation {object} 默认视角方位\r\n * @param options.customView.orientation.heading {number} 航向角\r\n * @param options.customView.orientation.pitch {number} 俯仰角\r\n * @param options.customView.orientation.roll {number} 翻滚角\r\n * @param options.customView.relativePosition {object} 视角相对位置\r\n * @param options.customView.relativePosition.lng {number} 经度\r\n * @param options.customView.relativePosition.lat {number} 纬度\r\n * @param options.customView.relativePosition.alt {number} 高度\r\n * \r\n * \r\n * @param _Dialog {object} 弹框事件\r\n * @param _Dialog.confirmCallBack {function} 弹框确认时的回调\r\n * */\n function CurvelineObject(sdk) {\n var _this2;\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var _Dialog = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3___default()(this, CurvelineObject);\n _this2 = _callSuper(this, CurvelineObject, [sdk, options]);\n _this2.options.name = options.name || '未命名对象';\n _this2.options.width = options.width || options.width === 0 ? options.width : 3;\n _this2.options.color = options.color || '#ff0000';\n _this2.options.type = options.type ? Number(options.type) : 0;\n _this2.options.noseToTail = options.noseToTail || false;\n _this2.options.extend = options.extend || false;\n _this2.options.rotate = options.rotate || options.rotate === false ? options.rotate : true;\n _this2.options.space = options.space || 1;\n _this2.options.speed = options.speed || 10;\n // this.options.dashSize = options.dashSize || 0.03\n _this2.options.wordsName = options.wordsName || 0;\n _this2.options.extendWidth = options.extendWidth || options.extendWidth === 0 ? options.extendWidth : 10;\n _this2.options.extendColor = options.extendColor || 'rgba(255,255,80,0.3)';\n _this2.options.show = options.show || options.show === false ? options.show : true;\n _this2.options.heightMode = options.heightMode || options.heightMode == 0 ? options.heightMode : 2;\n _this2._elms = [];\n options.label = options.label || {};\n _this2.options.label = {\n text: _this2.options.name,\n show: options.label.show || false,\n position: options.label.position,\n fontSize: options.label.fontSize || options.label.fontSize === 0 ? options.label.fontSize : 20,\n fontFamily: options.label.fontFamily ? options.label.fontFamily : 0,\n color: options.label.color || '#ffffff',\n lineWidth: options.label.lineWidth || options.label.lineWidth === 0 ? options.label.lineWidth : 4,\n pixelOffset: options.label.pixelOffset || options.label.pixelOffset === 0 ? options.label.pixelOffset : 20,\n backgroundColor: options.label.backgroundColor || ['#00ffff80', '#00ffff80'],\n lineColor: options.label.lineColor || '#00ffff80',\n scaleByDistance: options.label.scaleByDistance || false,\n near: options.label.near || options.label.near === 0 ? options.label.near : 2000,\n far: options.label.far || options.label.far === 0 ? options.label.far : 100000\n };\n _this2.options.attribute = options.attribute || {};\n _this2.options.attribute.link = _this2.options.attribute.link || {};\n _this2.options.attribute.link.content = _this2.options.attribute.link.content || [];\n // this.options.attribute.camera = this.options.attribute.camera || {}\n // this.options.attribute.camera.content =\n // this.options.attribute.camera.content || []\n // this.options.attribute.vr = this.options.attribute.vr || {}\n // this.options.attribute.vr.content =\n // this.options.attribute.vr.content || []\n // this.options.attribute.goods = this.options.attribute.goods || {}\n // this.options.attribute.goods.content =\n // this.options.attribute.goods.content || []\n\n delete _this2.options.attribute.camera;\n delete _this2.options.attribute.vr;\n delete _this2.options.attribute.goods;\n _this2.operate = {};\n _this2.nodePoints = [];\n _this2.unitNum = 0;\n _this2.inputSpeed = options.speed && Math.pow(options.speed, -1) * 100 || 10;\n _this2.Dialog = _Dialog;\n if (!_this2.options.positions || _this2.options.positions.length < 2) {\n _this2._error = '线段最少需要两个坐标!';\n console.warn(_this2._error);\n } else {\n for (var i = 0; i < _this2.options.positions.length; i++) {\n _this2.options.positions[i].lng = Number(Number(_this2.options.positions[i].lng).toFixed(8));\n _this2.options.positions[i].lat = Number(Number(_this2.options.positions[i].lat).toFixed(8));\n _this2.options.positions[i].alt = Number(Number(_this2.options.positions[i].alt).toFixed(2));\n }\n _this2.sdk.addIncetance(_this2.options.id, _this2);\n CurvelineObject.create(_this2);\n }\n return _this2;\n }\n _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_7___default()(CurvelineObject, _Base);\n return _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4___default()(CurvelineObject, [{\n key: \"color\",\n get: function get() {\n return this.options.color;\n },\n set: function set(v) {\n var _this3 = this;\n this.options.color = v || '#ff0000';\n // this.entity.polyline.material = this.getMaterial(v, this.options.type)\n var params = _objectSpread({}, this.options);\n params.speed = this.inputSpeed;\n // this.entity.polyline.material = this.getMaterial(this.options.color, this.options.type, this.entity, this.options)\n this.entity.polyline.material = this.getMaterial(this.options.color, this.options.type, this.entity, params);\n if (this._elms.color) {\n this._elms.color.forEach(function (item, i) {\n var colorPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: _this3.options.color,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(c) {\n _this3.color = c;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this3.color = 'rgba(255,0,0,1)';\n } //点击清空按钮事件回调\n });\n _this3._elms.color[i] = colorPicker;\n });\n }\n }\n }, {\n key: \"speed\",\n get: function get() {\n return this.options.speed;\n },\n set: function set(v) {\n this.options.speed = v;\n // this.options.speed = v !== 0 ? Math.pow(v, -1) * 100 : 0\n this.inputSpeed = v !== 0 ? Math.pow(v, -1) * 100 : 0;\n var params = _objectSpread({}, this.options);\n params.speed = this.inputSpeed;\n // this.entity.polyline.material = this.getMaterial(this.options.color, this.options.type, this.entity, this.options)\n this.entity.polyline.material = this.getMaterial(this.options.color, this.options.type, this.entity, params);\n }\n // get dashSize() {\n // return this.options.dashSize\n // }\n\n // set dashSize(v) {\n // this.options.dashSize = v\n // let params = { ...this.options }\n // params.speed = this.inputSpeed\n // // this.entity.polyline.material = this.getMaterial(this.options.color, this.options.type, this.entity, this.options)\n // this.entity.polyline.material = this.getMaterial(this.options.color, this.options.type, this.entity, params)\n // }\n }, {\n key: \"rotate\",\n get: function get() {\n return this.options.rotate;\n },\n set: function set(v) {\n this.options.rotate = v;\n this.closeNodeEdit();\n this._elms.rotate && this._elms.rotate.forEach(function (item) {\n item.checked = v;\n });\n this.options.rotate = v;\n this.entity.polyline.material = this.getMaterial(this.options.color, this.options.type, this.entity, this.options);\n }\n }, {\n key: \"space\",\n get: function get() {\n return this.options.space;\n },\n set: function set(v) {\n this.options.space = v;\n var params = _objectSpread({}, this.options);\n params.speed = this.inputSpeed;\n // this.entity.polyline.material = this.getMaterial(this.options.color, this.options.type, this.entity, this.options)\n this.entity.polyline.material = this.getMaterial(this.options.color, this.options.type, this.entity, params);\n }\n }, {\n key: \"wordsName\",\n get: function get() {\n return this.options.wordsName;\n },\n set: function set(v) {\n var _this4 = this;\n this.options.wordsName = v;\n var _this = this;\n if (!this.noseToTail) {\n this.computeDistance(this.smoothHandle(this.options.positions), 2, v).then(function (res) {\n _this.lengthByMeter = res;\n _this4.lengthChangeCallBack && _this4.lengthChangeCallBack();\n });\n } else {\n var fromDegreesArray = this.renewPositions(this.options.positions);\n }\n }\n\n // get fitLengthUnit() {\n // return this.options['fit-length-unit']\n // }\n // set fitLengthUnit(v) {\n // this.options['fit-length-unit'] = v\n // this._elms.fitLengthUnit &&\n // this._elms.fitLengthUnit.forEach(item => {\n // item.value = v\n // })\n // if (this.options.fitLengthByMeter) {\n // switch (v) {\n // case '米':\n // this.fitLength = this.options.fitLengthByMeter\n // break\n // case '千米':\n // this.fitLength = Number(\n // (this.options.fitLengthByMeter / 1000).toFixed(5)\n // )\n // break\n // default:\n // this.fitLength = this.options.fitLengthByMeter\n // }\n // }\n // }\n }, {\n key: \"lineWidth\",\n get: function get() {\n return this.options.width;\n },\n set: function set(v) {\n var _this5 = this;\n this.options.width = v || v == 0 ? v : 3;\n this._elms.lineWidth && this._elms.lineWidth.forEach(function (item) {\n item.value = _this5.options.width;\n });\n if (this.entity && this.entity.polyline) {\n this.entity.polyline.width = this.entity.polyline.width + v - this.entity.polyline.oriWidth;\n this.entity.polyline.oriWidth = this.options.width;\n }\n // this.entity &&\n // this.entity.polyline &&\n // (this.entity.polyline.width = this.options.width) && (this.entity.polyline.oriWidth = this.options.width)\n }\n }, {\n key: \"lineType\",\n get: function get() {\n return this.options.type;\n },\n set: function set(v) {\n var _this6 = this;\n var lineTypeData = [{\n name: '实线',\n value: '实线',\n key: 0,\n icon: 'line'\n }, {\n name: '虚线',\n value: '虚线',\n key: 1,\n icon: 'dash-line'\n }, {\n name: '泛光',\n value: '泛光',\n key: 2,\n icon: 'light-line'\n }, {\n name: '尾迹光线',\n value: '尾迹光线',\n key: 3,\n icon: 'tail-line'\n }, {\n name: '多尾迹光线',\n value: '多尾迹光线',\n key: 4,\n icon: 'mult-tail-line'\n }, {\n name: '流动虚线1',\n value: '流动虚线1',\n key: 5,\n icon: 'flow-dash-line1'\n }, {\n name: '流动虚线2',\n value: '流动虚线2',\n key: 6,\n icon: 'flow-dash-line2'\n }, {\n name: '流动箭头1',\n value: '流动箭头1',\n key: 7,\n icon: 'pic-line1'\n }, {\n name: '流动箭头2',\n value: '流动箭头2',\n key: 8,\n icon: 'pic-line2'\n }, {\n name: '流动箭头3',\n value: '流动箭头3',\n key: 9,\n icon: 'pic-line3'\n }, {\n name: '流动箭头4',\n value: '流动箭头4',\n key: 10,\n icon: 'pic-line4'\n }, {\n name: '流动箭头5',\n value: '流动箭头5',\n key: 11,\n icon: 'pic-line5'\n }, {\n name: '流动箭头6',\n value: '流动箭头6',\n key: 12,\n icon: 'pic-line6'\n }];\n this.options.type = Number(v);\n var _loop = function _loop(i) {\n if (lineTypeData[i].key === Number(v)) {\n _this6._elms.lineType && _this6._elms.lineType.forEach(function (item) {\n item.value = lineTypeData[i].value;\n if (2 < item.value && item.value < 13) {\n //贴图参数\n document.getElementById('dashTextureDom') && (document.getElementById('dashTextureDom').style.display = 'flex');\n } else {\n document.getElementById('dashTextureDom') && (document.getElementById('dashTextureDom').style.display = 'none');\n }\n if (2 < item.value && item.value < 5) {\n //尾迹参数\n document.getElementsByClassName('lineSpace')[0] && (document.getElementsByClassName('lineSpace')[0].style.display = 'none');\n document.getElementsByClassName('lineSpace')[1] && (document.getElementsByClassName('lineSpace')[1].style.display = 'none');\n } else {\n document.getElementsByClassName('lineSpace')[0] && (document.getElementsByClassName('lineSpace')[0].style.display = 'flex');\n document.getElementsByClassName('lineSpace')[1] && (document.getElementsByClassName('lineSpace')[1].style.display = 'flex');\n }\n });\n return 1; // break\n }\n };\n for (var i = 0; i < lineTypeData.length; i++) {\n if (_loop(i)) break;\n }\n var params = _objectSpread({}, this.options);\n params.speed = this.inputSpeed;\n this.entity && this.entity.polyline && (this.entity.polyline.material = this.getMaterial(this.options.color, this.options.type, this.entity, params));\n }\n }, {\n key: \"noseToTail\",\n get: function get() {\n return this.options.noseToTail;\n },\n set: function set(v) {\n this.options.noseToTail = v;\n this.closeNodeEdit();\n this._elms.noseToTail && this._elms.noseToTail.forEach(function (item) {\n item.checked = v;\n });\n if (this.entity) {\n var fromDegreesArray = this.renewPositions(this.options.positions);\n this.entity.polyline.positions = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray);\n this.renewPolygon(fromDegreesArray);\n }\n // if (v) {\n // if (this.options.fitLengthByMeter > 1000 || this.options.fitLengthByMeter == 1000) {\n // let dom = document.getElementsByClassName('input-select-unit')[1]\n // dom && dom.querySelectorAll('dd')[1] && dom.querySelectorAll('dd')[1].click()\n // } else {\n // let dom = document.getElementsByClassName('input-select-unit')[1]\n // dom && dom.querySelectorAll('dd')[0] && dom.querySelectorAll('dd')[0].click()\n // }\n\n // } else {\n // if (this.options.lengthByMeter > 1000 || this.options.lengthByMeter == 1000) {\n // let dom = document.getElementsByClassName('input-select-unit')[1]\n // dom && dom.querySelectorAll('dd')[1] && dom.querySelectorAll('dd')[1].click()\n // } else {\n // let dom = document.getElementsByClassName('input-select-unit')[1]\n // dom && dom.querySelectorAll('dd')[0] && dom.querySelectorAll('dd')[0].click()\n // }\n // }\n }\n }, {\n key: \"heightMode\",\n get: function get() {\n return this.options.heightMode ? this.options.heightMode : 0;\n },\n set: function set(v) {\n var _this7 = this;\n this.positionEditing = false;\n this.options.heightMode = v || v == 0 ? v : 2;\n var heightModeName = '';\n this.closeNodeEdit();\n var ground = false;\n var disabled = false;\n var fromDegreesArray = this.renewPositions(this.options.positions);\n this.entity.polyline.positions = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray);\n this.renewPolygon(fromDegreesArray);\n switch (this.options.heightMode) {\n case '0':\n case 0:\n this.entity.polyline.clampToGround = ground;\n this.extend = false;\n heightModeName = '海拔高度';\n break;\n case '1':\n case 1:\n this.entity.polyline.clampToGround = ground;\n this.extend = false;\n heightModeName = '相对地表';\n break;\n case '2':\n case 2:\n ground = true;\n disabled = true;\n this.entity.polyline.clampToGround = ground;\n heightModeName = '依附模型';\n break;\n }\n\n // this.options.lengthByMeter = this.computeDistance2(\n // this.smoothHandle(this.options.positions),\n // 2,\n // ground\n // )\n // this.lengthUnit = this.lengthUnit\n this._elms.heightMode && (this._elms.heightMode.value = heightModeName);\n this._elms.heightModeObject && this._elms.heightModeObject.legp_searchActive(heightModeName);\n if (disabled) {\n this._elms.heightBox && (this._elms.heightBox.className = 'input-number input-number-unit-1 height-box disabled');\n this._elms.heightConfirm && this._elms.heightConfirm.setAttribute('disabled', 'disabled');\n } else {\n this._elms.heightBox && (this._elms.heightBox.className = 'input-number input-number-unit-1 height-box');\n this._elms.heightConfirm && this._elms.heightConfirm.removeAttribute('disabled');\n }\n setTimeout(function () {\n if (ground) {\n _this7.label.ground = ground;\n _this7._elms.heightMode && (_this7._elms.heightMode.value = '依附模型');\n _this7.label.position = [_this7.options.positions[0].lng, _this7.options.positions[0].lat];\n } else {\n _this7.label.ground = ground;\n _this7.label.position = [_this7.options.positions[0].lng, _this7.options.positions[0].lat, fromDegreesArray[2]];\n _this7.options.label.position = {\n lng: _this7.options.positions[0].lng,\n lat: _this7.options.positions[0].lat,\n alt: fromDegreesArray[2]\n };\n }\n }, 0);\n }\n }, {\n key: \"extend\",\n get: function get() {\n return this.options.extend;\n },\n set: function set(v) {\n this.options.extend = v;\n this.closeNodeEdit();\n if (v) {\n this.heightMode = 2;\n }\n this._elms.extend && this._elms.extend.forEach(function (item) {\n item.checked = v;\n });\n if (this.entity) {\n if (this.options.extend) {\n var fromDegreesArray = this.renewPositions(this.options.positions);\n this.renewPolygon(fromDegreesArray);\n } else {\n this.entity.polygon = undefined;\n }\n }\n }\n }, {\n key: \"extendWidth\",\n get: function get() {\n return this.options.extendWidth;\n },\n set: function set(v) {\n this.options.extendWidth = v;\n this._elms.extendWidth && this._elms.extendWidth.forEach(function (item) {\n item.value = v;\n });\n var fromDegreesArray = this.renewPositions(this.options.positions);\n this.renewPolygon(fromDegreesArray);\n }\n }, {\n key: \"extendColor\",\n get: function get() {\n return this.options.extendColor;\n },\n set: function set(v) {\n var _this8 = this;\n this.options.extendColor = v;\n if (this._elms.extendColor) {\n this._elms.extendColor.forEach(function (item, i) {\n var extendColorPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: _this8.extendColor,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this8.extendColor = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this8.extendColor = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n _this8._elms.extendColor[i] = extendColorPicker;\n });\n }\n this.entity && this.entity.polygon && (this.entity.polygon.material = Cesium.Color.fromCssColorString(this.options.extendColor));\n }\n }, {\n key: \"labelShow\",\n get: function get() {\n return this.options.label.show;\n },\n set: function set(v) {\n var _this9 = this;\n this.options.label.show = v;\n if (this.show && !this.showView || this.showView == 3) {\n this.label.show = v;\n setTimeout(function () {\n _this9.label.position = [_this9.options.positions[0].lng, _this9.options.positions[0].lat, _this9.options.positions[0].alt];\n }, 0);\n } else {\n this.label.show = false;\n }\n this._elms.labelShow && this._elms.labelShow.forEach(function (item) {\n item.checked = v;\n });\n }\n }, {\n key: \"labelFontFamily\",\n get: function get() {\n return this.options.label.fontFamily;\n },\n set: function set(v) {\n this.options.label.fontFamily = v || 0;\n this.label && (this.label.fontFamily = this.options.label.fontFamily);\n var name = Object(_Element_fontSelect__WEBPACK_IMPORTED_MODULE_21__[\"getFontFamilyName\"])(this.labelFontFamily) || '';\n this._elms.labelFontFamily && this._elms.labelFontFamily.forEach(function (item) {\n item.value = name;\n });\n }\n }, {\n key: \"labelColor\",\n get: function get() {\n return this.options.label.color;\n },\n set: function set(v) {\n var _this10 = this;\n this.options.label.color = v;\n this.label.color = v;\n if (this._elms.labelColor) {\n this._elms.labelColor.forEach(function (item, i) {\n var labelColorPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: _this10.labelColor,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this10.labelColor = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this10.labelColor = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n _this10._elms.labelColor[i] = labelColorPicker;\n });\n }\n }\n }, {\n key: \"labelFontSize\",\n get: function get() {\n return this.options.label.fontSize;\n },\n set: function set(v) {\n this.options.label.fontSize = v;\n this.label.fontSize = v;\n this._elms.labelFontSize && this._elms.labelFontSize.forEach(function (item) {\n item.value = v;\n });\n }\n }, {\n key: \"labelScaleByDistance\",\n get: function get() {\n return this.options.label.scaleByDistance;\n },\n set: function set(v) {\n this.options.label.scaleByDistance = v;\n this.label.scaleByDistance = v;\n this._elms.labelScaleByDistance && this._elms.labelScaleByDistance.forEach(function (item) {\n item.checked = v;\n });\n }\n }, {\n key: \"labelNear\",\n get: function get() {\n return this.options.label.near;\n },\n set: function set(v) {\n var near = v;\n if (near > this.labelFar) {\n near = this.labelFar;\n }\n this.options.label.near = near;\n this.label.near = near;\n this._elms.labelNear && this._elms.labelNear.forEach(function (item) {\n item.value = near;\n });\n }\n }, {\n key: \"labelFar\",\n get: function get() {\n return this.options.label.far;\n },\n set: function set(v) {\n var far = v;\n if (far < this.labelNear) {\n far = this.labelNear;\n }\n this.options.label.far = far;\n this.label.far = far;\n this._elms.labelFar && this._elms.labelFar.forEach(function (item) {\n item.value = far;\n });\n }\n }, {\n key: \"labelLineWidth\",\n get: function get() {\n return this.options.label.lineWidth;\n },\n set: function set(v) {\n this.options.label.lineWidth = v;\n this.label.lineWidth = v;\n this._elms.labelLineWidth && this._elms.labelLineWidth.forEach(function (item) {\n item.value = v;\n });\n }\n }, {\n key: \"labelPixelOffset\",\n get: function get() {\n return this.options.label.pixelOffset;\n },\n set: function set(v) {\n this.options.label.pixelOffset = v;\n this.label.pixelOffset = v;\n this._elms.labelPixelOffset && this._elms.labelPixelOffset.forEach(function (item) {\n item.value = v;\n });\n }\n }, {\n key: \"labelLineColor\",\n get: function get() {\n return this.options.label.lineColor;\n },\n set: function set(v) {\n var _this11 = this;\n this.options.label.lineColor = v;\n this.label.lineColor = v;\n if (this._elms.labelLineColor) {\n this._elms.labelLineColor.forEach(function (item, i) {\n var lineColorPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: _this11.labelLineColor,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this11.labelLineColor = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this11.labelLineColor = 'rgba(0,255,255,0.5)';\n } //点击清空按钮事件回调\n });\n _this11._elms.labelLineColor[i] = lineColorPicker;\n });\n }\n }\n }, {\n key: \"labelBackgroundColorStart\",\n get: function get() {\n return this.options.label.backgroundColor[0];\n },\n set: function set(v) {\n var _this12 = this;\n this.options.label.backgroundColor[0] = v;\n this.label.backgroundColor = [v, this.label.backgroundColor[1]];\n if (this._elms.labelBackgroundColorStart) {\n this._elms.labelBackgroundColorStart.forEach(function (item, i) {\n var labelBackgroundColorStartPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: _this12.labelBackgroundColorStart,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this12.labelBackgroundColorStart = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this12.labelBackgroundColorStart = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n _this12._elms.labelBackgroundColorStart[i] = labelBackgroundColorStartPicker;\n });\n }\n }\n }, {\n key: \"labelBackgroundColorEnd\",\n get: function get() {\n return this.options.label.backgroundColor[1];\n },\n set: function set(v) {\n var _this13 = this;\n this.options.label.backgroundColor[1] = v;\n this.label.backgroundColor = [this.label.backgroundColor[0], v];\n if (this._elms.labelBackgroundColorEnd) {\n this._elms.labelBackgroundColorEnd.forEach(function (item, i) {\n var labelBackgroundColorEndPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: _this13.labelBackgroundColorEnd,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this13.labelBackgroundColorEnd = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this13.labelBackgroundColorEnd = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n _this13._elms.labelBackgroundColorEnd[i] = labelBackgroundColorEndPicker;\n });\n }\n }\n // get attributeCamera() {\n // return this.options.attribute.camera.content\n // }\n\n // set attributeCamera(v) {\n // this.options.attribute.camera.content = v\n // }\n\n // get attributeVr() {\n // return this.options.attribute.vr.content\n // }\n\n // set attributeVr(v) {\n // this.options.attribute.vr.content = v\n // if (\n // !this._DialogObject ||\n // !this._DialogObject._element ||\n // !this._DialogObject._element.content ||\n // this._DialogObject._element.content.getElementsByClassName(\n // 'attribute-content-vr'\n // ).length == 0\n // ) {\n // return\n // }\n // let table = this._DialogObject._element.content\n // .getElementsByClassName('attribute-content-vr')[1]\n // .getElementsByClassName('table')[0]\n // let tableContent = table.getElementsByClassName('table-body')[0]\n // tableContent.innerHTML = ''\n // if (this.options.attribute.vr.content.length > 0) {\n // table.getElementsByClassName('table-empty')[0].style.display = 'none'\n // } else {\n // table.getElementsByClassName('table-empty')[0].style.display = 'flex'\n // }\n // for (let i = 0; i < this.options.attribute.vr.content.length; i++) {\n // let tr =\n // `\n //
\n //
` +\n // this.options.attribute.vr.content[i].name +\n // `
\n //
` +\n // this.options.attribute.vr.content[i].url +\n // `
\n //
\n // \n // \n //
\n //
`\n // let trElm = document.createRange().createContextualFragment(tr)\n // tableContent.appendChild(trElm)\n // }\n // let item = tableContent.getElementsByClassName('tr')\n // let fun = {\n // vrEdit: async index => {\n // this.attributeVr = await this.options.attribute.vr.content\n // let table = this._DialogObject._element.content\n // .getElementsByClassName('attribute-content-vr')[1]\n // .getElementsByClassName('table')[0]\n // let tableContent = table.getElementsByClassName('table-body')[0]\n // let item = tableContent.getElementsByClassName('tr')\n // for (let i = 0; i < item.length; i++) {\n // if (index === i) {\n // let height = item[i].offsetHeight\n // let html = `\n //
\n // \n //
\n //
\n // \n //
\n //
\n // \n // \n //
`\n // item[i].innerHTML = html\n // let textareaElm = item[i].getElementsByClassName('link-edit')[0]\n // textareaElm.style.height = height - 10 + 'px'\n // let td = item[i].getElementsByClassName('td')\n // td[0].getElementsByClassName(\n // 'input'\n // )[0].value = this.options.attribute.vr.content[index].name\n // td[1].getElementsByClassName(\n // 'input'\n // )[0].value = this.options.attribute.vr.content[index].url\n // let btn = item[i].getElementsByTagName('button')\n // for (let n = 0; n < btn.length; n++) {\n // if (!btn[n] || !btn[n].attributes) {\n // continue\n // }\n // for (let m of btn[n].attributes) {\n // if (m.name === '@click') {\n // btn[n].addEventListener('click', e => {\n // if (typeof fun[m.value] === 'function') {\n // fun[m.value](\n // {\n // name: td[0].getElementsByClassName('input')[0].value,\n // url: td[1].getElementsByClassName('input')[0].value\n // },\n // i\n // )\n // }\n // })\n // btn[n].attributes.removeNamedItem(m.name)\n // break\n // }\n // }\n // }\n // break\n // }\n // }\n // },\n // vrDelete: i => {\n // this.options.attribute.vr.content.splice(i, 1)\n // this.attributeVr = this.options.attribute.vr.content\n // },\n\n // confirmEdit: (value, i) => {\n // let name = value.name && value.name.replace(/\\s/g, '')\n // let url = value.url && value.url.replace(/\\s/g, '')\n // if (name && url) {\n // this.options.attribute.vr.content[i] = value\n // } else {\n // window.ELEMENT &&\n // window.ELEMENT.Message({\n // message: '名称或链接不能为空!',\n // type: 'warning',\n // duration: 1500\n // })\n // }\n // this.attributeVr = this.options.attribute.vr.content\n // },\n // cancelEdit: () => {\n // this.attributeVr = this.options.attribute.vr.content\n // },\n // fileSelect: (value, i) => {\n // let fileElm = item[i].getElementsByClassName('file-select')[0]\n // fileElm.click()\n // fileElm.removeEventListener('change', fileSelect)\n // fileElm.addEventListener('change', fileSelect)\n // }\n // }\n // let fileSelect = event => {\n // if (event.target.value) {\n // let td = item[\n // event.target.getAttribute('index')\n // ].getElementsByClassName('td')\n // td[1].getElementsByClassName('input')[0].value = event.target.value\n // event.target.value = null\n // }\n // }\n // for (let i = 0; i < item.length; i++) {\n // let btn = item[i].getElementsByTagName('button')\n // for (let n = 0; n < btn.length; n++) {\n // if (!btn[n] || !btn[n].attributes) {\n // continue\n // }\n // for (let m of btn[n].attributes) {\n // if (m.name === '@click') {\n // btn[n].addEventListener('click', e => {\n // if (typeof fun[m.value] === 'function') {\n // fun[m.value](i)\n // }\n // })\n // btn[n].attributes.removeNamedItem(m.name)\n // break\n // }\n // }\n // }\n // }\n // }\n\n // get attributeGoods() {\n // return this.options.attribute.goods.content\n // }\n\n // set attributeGoods(v) {\n // this.options.attribute.goods.content = v\n // }\n }, {\n key: \"judgeLine\",\n value: function judgeLine(entity, newParam) {\n if (!entity.polyline.oriRepeat) {\n var param = {\n color: newParam.color,\n image: this.getSourceRootPath() + \"/img/arrow/1.png\",\n space: newParam.space,\n speed: newParam.speed\n };\n param.speed = newParam.rotate ? param.speed : 0 - param.speed;\n var canvasEle = document.createElement('canvas');\n var ctx = canvasEle.getContext('2d');\n var myImg = new Image();\n // myImg.src = that.getSourceRootPath() + '/img/arrow/1.png'\n myImg.src = param.image;\n var that = this;\n myImg.onload = function () {\n canvasEle.width = myImg.width * (param.space + 1);\n canvasEle.height = myImg.height;\n var oriRepeat = that.getSceenLine(entity, param, canvasEle);\n oriRepeat && (entity.polyline.oriRepeat = oriRepeat);\n var positionProperty = entity.polyline.positions;\n var positions = positionProperty.getValue(that.sdk.viewer.clock.currentTime);\n if (!Cesium.defined(positions)) {\n return new Cesium.Cartesian2(1.0, 1.0);\n // return 1.0;\n }\n var distance = 0;\n for (var i = 0; i < positions.length - 1; ++i) {\n distance += Cesium.Cartesian3.distance(positions[i], positions[i + 1]);\n }\n var repeatX = distance / entity.polyline.width.getValue();\n // 根据地图缩放程度调整repeatX\n var cameraHeight = that.sdk.viewer.camera.positionCartographic.height;\n var boundingSphere = new Cesium.BoundingSphere(new Cesium.Cartesian3(-1000000, 0, 0),\n // 中心点坐标\n 500000 // 半径(距离)\n );\n\n // 获取绘图缓冲区的宽度和高度(通常是屏幕的分辨率)\n var drawingBufferWidth = that.sdk.viewer.canvas.clientWidth;\n var drawingBufferHeight = that.sdk.viewer.canvas.clientHeight;\n\n // 使用 getPixelSize 方法获取包围球在屏幕上的像素大小\n var groundResolution = that.sdk.viewer.scene.camera.getPixelSize(boundingSphere, drawingBufferWidth, drawingBufferHeight);\n repeatX *= groundResolution / cameraHeight / (param.space * (canvasEle.width / canvasEle.height * 5) + 1);\n // if (entity.polyline.material.oriRepeat) {\n\n if (that.sdk.viewer.scene.mode === Cesium.SceneMode.SCENE3D) {\n var speed = repeatX / entity.polyline.oriRepeat;\n entity.polyline.oriSpeed = speed;\n entity.polyline.oriRepeatX = repeatX;\n } else {\n var sdk3d = Object(_Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_19__[\"get3DView\"])();\n var sdk3dEntity = sdk3d.viewer.entities.getById(that.options.id);\n entity.polyline.oriSpeed = sdk3dEntity.polyline.oriSpeed;\n entity.polyline.oriRepeatX = sdk3dEntity.polyline.oriRepeatX;\n }\n };\n }\n }\n /**获取当前满屏横线速度 */\n }, {\n key: \"getSceenLine\",\n value: function getSceenLine(entity, options, canvasEle) {\n var point1 = new Cesium.Cartesian2(0, this.sdk.viewer.canvas.clientHeight);\n var point2 = new Cesium.Cartesian2(this.sdk.viewer.canvas.clientWidth / 2, this.sdk.viewer.canvas.clientHeight);\n // var cartesian1 = this.sdk.viewer.scene.pickPosition(point1)\n // var cartesian2 = this.sdk.viewer.scene.pickPosition(point2)\n\n var ray = this.sdk.viewer.camera.getPickRay(point1);\n var cartesian1 = this.sdk.viewer.scene.globe.pick(ray, this.sdk.viewer.scene);\n var ray2 = this.sdk.viewer.camera.getPickRay(point2);\n var cartesian2 = this.sdk.viewer.scene.globe.pick(ray2, this.sdk.viewer.scene);\n // if (!cartesian1 || !cartesian2) {\n // let ray = this.sdk.viewer.camera.getPickRay(point1);\n // cartesian1 = this.sdk.viewer.scene.globe.pick(ray, this.sdk.viewer.scene);\n\n // let ray2 = this.sdk.viewer.camera.getPickRay(point2);\n // cartesian2 = this.sdk.viewer.scene.globe.pick(ray2, this.sdk.viewer.scene);\n // }\n if (cartesian1 && cartesian2) {\n var distance = Cesium.Cartesian3.distance(cartesian1, cartesian2);\n var repeatX = distance / entity.polyline.width.getValue();\n // 根据地图缩放程度调整repeatX\n var cameraHeight = this.sdk.viewer.camera.positionCartographic.height;\n var boundingSphere = new Cesium.BoundingSphere(new Cesium.Cartesian3(-1000000, 0, 0),\n // 中心点坐标\n 500000 // 半径(距离)\n );\n\n // 获取绘图缓冲区的宽度和高度(通常是屏幕的分辨率)\n var drawingBufferWidth = this.sdk.viewer.canvas.clientWidth;\n var drawingBufferHeight = this.sdk.viewer.canvas.clientHeight;\n\n // 使用 getPixelSize 方法获取包围球在屏幕上的像素大小\n var groundResolution = this.sdk.viewer.scene.camera.getPixelSize(boundingSphere, drawingBufferWidth, drawingBufferHeight);\n // repeatX *= groundResolution / cameraHeight / ((myImg.width / myImg.height * 5) + 1);\n if (groundResolution > 700) {\n repeatX *= groundResolution / cameraHeight / (options.space * (canvasEle.width / canvasEle.height * 5) + 1);\n } else {\n repeatX = undefined;\n }\n if (this.sdk.viewer.scene.mode === Cesium.SceneMode.SCENE3D) {\n return repeatX;\n } else {\n var sdk3d = Object(_Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_19__[\"get3DView\"])();\n var sdk3dEntity = sdk3d.viewer.entities.getById(this.options.id);\n return sdk3dEntity.polyline.oriRepeatX;\n }\n }\n }\n /**\r\n * 编辑框\r\n * @param {boolean} state true打开,false关闭\r\n */\n }, {\n key: \"edit\",\n value: (function () {\n var _edit = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee(state) {\n var _this14 = this;\n var _this, tabClick, contentElm, tabsElm, colorPicker, labelColorPicker, extendColorPicker, lineColorPicker, labelBackgroundColorStartPicker, labelBackgroundColorEndPicker, all_elm;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee$(_context) {\n while (1) switch (_context.prev = _context.next) {\n case 0:\n return _context.abrupt(\"return\");\n case 8:\n this._DialogObject = _context.sent;\n this._DialogObject._element.body.className = this._DialogObject._element.body.className + ' polyline';\n contentElm = document.createElement('div');\n contentElm.innerHTML = Object(_element__WEBPACK_IMPORTED_MODULE_10__[\"html\"])(this);\n this._DialogObject.contentAppChild(contentElm);\n this.attributeType = this.options.attributeType;\n // this.attributeCamera = this.options.attribute.camera.content\n // this.attributeGoods = this.options.attribute.goods.content\n // 创建标签页\n tabsElm = new _Element_cy_html_tabs__WEBPACK_IMPORTED_MODULE_12__[\"default\"]('polyline-object-edit-tabs', undefined, this.sdk); // 颜色组件\n colorPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName('color')[0],\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: this.color,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this14.color = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this14.color = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n labelColorPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName('labelColor')[0],\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: this.labelColor,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this14.labelColor = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this14.labelColor = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n extendColorPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName('extendColor')[0],\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: this.extendColor,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this14.extendColor = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this14.extendColor = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n lineColorPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName('labelLineColor')[0],\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: this.labelLineColor,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this14.labelLineColor = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this14.labelLineColor = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n labelBackgroundColorStartPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName('labelBackgroundColorStart')[0],\n size: 'mini',\n alpha: true,\n defaultColor: this.labelBackgroundColorStart,\n disabled: false,\n openPickerAni: 'opacity',\n sure: function sure(color) {\n _this14.labelBackgroundColorStart = color;\n },\n clear: function clear() {\n _this14.labelBackgroundColorStart = 'rgba(255,255,255,1)';\n }\n });\n labelBackgroundColorEndPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName('labelBackgroundColorEnd')[0],\n size: 'mini',\n alpha: true,\n defaultColor: this.labelBackgroundColorEnd,\n disabled: false,\n openPickerAni: 'opacity',\n sure: function sure(color) {\n _this14.labelBackgroundColorEnd = color;\n },\n clear: function clear() {\n _this14.labelBackgroundColorEnd = 'rgba(255,255,255,1)';\n }\n });\n all_elm = contentElm.getElementsByTagName('*');\n _eventBinding__WEBPACK_IMPORTED_MODULE_14__[\"default\"].on(this, all_elm);\n this._elms = _eventBinding__WEBPACK_IMPORTED_MODULE_14__[\"default\"].element;\n this._elms.color = [colorPicker];\n this._elms.labelColor = [labelColorPicker];\n this._elms.extendColor = [extendColorPicker];\n this._elms.labelLineColor = [lineColorPicker];\n this._elms.labelBackgroundColorStart = [labelBackgroundColorStartPicker];\n this._elms.labelBackgroundColorEnd = [labelBackgroundColorEndPicker];\n setTimeout(function () {\n _this14.attributeLink = _this14.options.attribute.link.content;\n // this.attributeVr = this.options.attribute.vr.content\n // this.cameraSelect && this.cameraSelect()\n // this.goodsSelect && this.goodsSelect()\n var tagData = _this14.attributeSelect;\n var attributeElm = _this14._DialogObject._element.content.getElementsByClassName('attribute-select-box')[0];\n if (attributeElm) {\n var legpObject = Object(_Element_datalist__WEBPACK_IMPORTED_MODULE_20__[\"legp\"])(attributeElm, '.attribute-select');\n legpObject.legp_search(tagData);\n var attributeSelectElm = _this14._DialogObject._element.content.getElementsByClassName('attribute-select')[0].getElementsByTagName('input')[0];\n for (var i = 0; i < tagData.length; i++) {\n if (tagData[i].key === _this14.options.attributeType) {\n attributeSelectElm.value = tagData[i].value;\n legpObject.legp_searchActive(tagData[i].value);\n break;\n }\n }\n attributeSelectElm.addEventListener('input', function () {\n for (var _i = 0; _i < tagData.length; _i++) {\n if (tagData[_i].value === attributeSelectElm.value) {\n _this14.attributeType = tagData[_i].key;\n break;\n }\n }\n });\n }\n var nameData = [{\n name: '空间长度',\n value: '空间长度'\n }, {\n name: '投影长度',\n value: '投影长度'\n }, {\n name: '地表长度',\n value: '地表长度'\n }];\n var nameDataLegpObject = Object(_Element_datalist__WEBPACK_IMPORTED_MODULE_20__[\"legp\"])(_this14._DialogObject._element.content.getElementsByClassName('input-select-unit-box')[0], '.input-select-unit');\n if (nameDataLegpObject) {\n nameDataLegpObject.legp_search(nameData);\n var nameDataLegpElm = _this14._DialogObject._element.content.getElementsByClassName('input-select-unit')[0].getElementsByTagName('input')[0];\n _this14._elms.wordsName = [nameDataLegpElm];\n nameDataLegpElm.value = _this14.options.wordsName;\n for (var _i2 = 0; _i2 < nameData.length; _i2++) {\n if (nameData[_i2].value === nameDataLegpElm.value) {\n nameDataLegpObject.legp_searchActive(nameData[_i2].value);\n break;\n }\n }\n nameDataLegpElm.addEventListener('input', function () {\n for (var _i3 = 0; _i3 < nameData.length; _i3++) {\n if (nameData[_i3].value === nameDataLegpElm.value) {\n _this14.wordsName = nameData[_i3].value;\n break;\n }\n }\n });\n }\n\n // 原始长度单位\n var unitData = [{\n name: '米',\n value: '米'\n }, {\n name: '千米',\n value: '千米'\n }];\n var unitDataLegpObject = Object(_Element_datalist__WEBPACK_IMPORTED_MODULE_20__[\"legp\"])(_this14._DialogObject._element.content.getElementsByClassName('input-select-unit-box')[0], '.input-select-unit', 1);\n if (unitDataLegpObject) {\n unitDataLegpObject.legp_search(unitData);\n var unitDataLegpElm = _this14._DialogObject._element.content.getElementsByClassName('input-select-unit')[1].getElementsByTagName('input')[0];\n _this14._elms.lengthUnit = [unitDataLegpElm];\n for (var _i4 = 0; _i4 < unitData.length; _i4++) {\n if (unitData[_i4].value === unitDataLegpElm.value) {\n unitDataLegpObject.legp_searchActive(unitData[_i4].value);\n break;\n }\n }\n unitDataLegpElm.addEventListener('input', function () {\n for (var _i5 = 0; _i5 < unitData.length; _i5++) {\n if (unitData[_i5].value === unitDataLegpElm.value) {\n _this14.lengthUnit = unitData[_i5].value;\n break;\n }\n }\n });\n }\n\n // 拟合长度单位\n // let fitUnitData = [\n // {\n // name: '米',\n // value: '米'\n // },\n // {\n // name: '千米',\n // value: '千米'\n // }\n // ]\n\n // let fitUnitDataLegpObject = legp(\n // this._DialogObject._element.content.getElementsByClassName(\n // 'input-select-fit-unit-box'\n // )[0],\n // '.input-select-fit-unit'\n // )\n // if (fitUnitDataLegpObject) {\n // fitUnitDataLegpObject.legp_search(fitUnitData)\n // let fitUnitDataLegpElm = this._DialogObject._element.content\n // .getElementsByClassName('input-select-fit-unit')[0]\n // .getElementsByTagName('input')[0]\n // this._elms.fitLengthUnit = [fitUnitDataLegpElm]\n // fitUnitDataLegpElm.value = this.options['fit-length-unit']\n // for (let i = 0; i < fitUnitData.length; i++) {\n // if (fitUnitData[i].value === fitUnitDataLegpElm.value) {\n // fitUnitDataLegpObject.legp_searchActive(fitUnitData[i].value)\n // break\n // }\n // }\n // fitUnitDataLegpElm.addEventListener('input', () => {\n // for (let i = 0; i < fitUnitData.length; i++) {\n // if (fitUnitData[i].value === fitUnitDataLegpElm.value) {\n // this.fitLengthUnit = fitUnitData[i].value\n // break\n // }\n // }\n // })\n // }\n\n var lineTypeData = [{\n name: '实线',\n value: '实线',\n key: 0,\n icon: 'line'\n }, {\n name: '虚线',\n value: '虚线',\n key: 1,\n icon: 'dash-line'\n }, {\n name: '泛光',\n value: '泛光',\n key: 2,\n icon: 'light-line'\n }, {\n name: '尾迹光线',\n value: '尾迹光线',\n key: 3,\n icon: 'tail-line'\n }, {\n name: '多尾迹光线',\n value: '多尾迹光线',\n key: 4,\n icon: 'mult-tail-line'\n }, {\n name: '流动虚线1',\n value: '流动虚线1',\n key: 5,\n icon: 'flow-dash-line1'\n }, {\n name: '流动虚线2',\n value: '流动虚线2',\n key: 6,\n icon: 'flow-dash-line2'\n }, {\n name: '流动箭头1',\n value: '流动箭头1',\n key: 7,\n icon: 'pic-line1'\n }, {\n name: '流动箭头2',\n value: '流动箭头2',\n key: 8,\n icon: 'pic-line2'\n }, {\n name: '流动箭头3',\n value: '流动箭头3',\n key: 9,\n icon: 'pic-line3'\n }, {\n name: '流动箭头4',\n value: '流动箭头4',\n key: 10,\n icon: 'pic-line4'\n }, {\n name: '流动箭头5',\n value: '流动箭头5',\n key: 11,\n icon: 'pic-line5'\n }, {\n name: '流动箭头6',\n value: '流动箭头6',\n key: 12,\n icon: 'pic-line6'\n }];\n var lineTypeDataLegpObject = Object(_Element_datalist__WEBPACK_IMPORTED_MODULE_20__[\"legp\"])(_this14._DialogObject._element.content.getElementsByClassName('input-select-line-type-box')[0], '.input-select-line-type');\n if (lineTypeDataLegpObject) {\n lineTypeDataLegpObject.legp_search(lineTypeData);\n var iActiveElm2 = document.createElement('i');\n iActiveElm2.className = 'icon icon-active';\n _this14._DialogObject._element.content.getElementsByClassName('input-select-line-type')[0].getElementsByClassName('cy_datalist')[0].appendChild(iActiveElm2);\n var lineTypeDataLegpElm = _this14._DialogObject._element.content.getElementsByClassName('input-select-line-type')[0].getElementsByTagName('input')[0];\n _this14._elms.lineType = [lineTypeDataLegpElm];\n for (var _i6 = 0; _i6 < lineTypeData.length; _i6++) {\n if (lineTypeData[_i6].key === _this14.options.type) {\n lineTypeDataLegpObject.legp_searchActive(lineTypeData[_i6].value);\n lineTypeDataLegpElm.value = lineTypeData[_i6].value;\n iActiveElm2.className = \"icon icon-active \".concat(lineTypeData[_i6].icon);\n break;\n }\n }\n lineTypeDataLegpElm.addEventListener('input', function () {\n for (var _i7 = 0; _i7 < lineTypeData.length; _i7++) {\n if (lineTypeData[_i7].value === lineTypeDataLegpElm.value) {\n _this14.lineType = lineTypeData[_i7].key;\n iActiveElm2.className = \"icon icon-active \".concat(lineTypeData[_i7].icon);\n\n //控制参数显隐\n if (2 < _this14.lineType && _this14.lineType < 13) {\n //贴图参数\n document.getElementById('dashTextureDom') && (document.getElementById('dashTextureDom').style.display = 'flex');\n } else {\n document.getElementById('dashTextureDom') && (document.getElementById('dashTextureDom').style.display = 'none');\n }\n if (2 < _this14.lineType && _this14.lineType < 5) {\n //尾迹参数\n document.getElementsByClassName('lineSpace')[0] && (document.getElementsByClassName('lineSpace')[0].style.display = 'none');\n document.getElementsByClassName('lineSpace')[1] && (document.getElementsByClassName('lineSpace')[1].style.display = 'none');\n } else {\n document.getElementsByClassName('lineSpace')[0] && (document.getElementsByClassName('lineSpace')[0].style.display = 'flex');\n document.getElementsByClassName('lineSpace')[1] && (document.getElementsByClassName('lineSpace')[1].style.display = 'flex');\n }\n break;\n }\n }\n });\n }\n var heightBoxElm = _this14._DialogObject._element.content.getElementsByClassName('height-box')[0];\n var heightElm = heightBoxElm.getElementsByClassName('height')[0];\n var heightConfirmElm = _this14._DialogObject._element.content.getElementsByClassName('height-confirm')[0];\n heightElm.value = 10;\n if (_this14.heightMode == 2) {\n heightBoxElm && (heightBoxElm.className = 'input-number input-number-unit-1 height-box disabled');\n heightConfirmElm && heightConfirmElm.setAttribute('disabled', 'disabled');\n } else {\n heightBoxElm && (heightBoxElm.className = 'input-number input-number-unit-1 height-box');\n heightConfirmElm && heightConfirmElm.removeAttribute('disabled');\n }\n var heightModeData = [{\n name: '海拔高度',\n value: '海拔高度',\n key: '0'\n }, {\n name: '相对地表',\n value: '相对地表',\n key: '1'\n }, {\n name: '依附模型',\n value: '依附模型',\n key: '2'\n }];\n var heightModeObject = Object(_Element_datalist__WEBPACK_IMPORTED_MODULE_20__[\"legp\"])(_this14._DialogObject._element.content.getElementsByClassName('height-mode-box')[0], '.height-mode');\n if (heightModeObject) {\n heightModeObject.legp_search(heightModeData);\n var heightModeDataLegpElm = _this14._DialogObject._element.content.getElementsByClassName('height-mode')[0].getElementsByTagName('input')[0];\n for (var _i8 = 0; _i8 < heightModeData.length; _i8++) {\n if (heightModeData[_i8].key == _this14.heightMode) {\n heightModeDataLegpElm.value = heightModeData[_i8].value;\n heightModeObject.legp_searchActive(heightModeData[_i8].value);\n break;\n }\n }\n heightModeDataLegpElm.addEventListener('input', function () {\n for (var _i9 = 0; _i9 < heightModeData.length; _i9++) {\n if (heightModeData[_i9].value === heightModeDataLegpElm.value) {\n _this14.heightMode = heightModeData[_i9].key;\n break;\n }\n }\n });\n heightElm.addEventListener('input', function () {\n switch (_this14.heightMode) {\n case 0:\n case '0':\n break;\n case 1:\n case '1':\n break;\n case 2:\n case '2':\n break;\n }\n });\n _this14._elms.height = heightElm;\n _this14._elms.heightBox = heightBoxElm;\n _this14._elms.heightMode = heightModeDataLegpElm;\n _this14._elms.heightConfirm = heightConfirmElm;\n _this14._elms.heightModeObject = heightModeObject;\n heightConfirmElm.addEventListener('click', function () {\n _this14.positionEditing = false;\n for (var _i10 = 0; _i10 < _this14.options.positions.length; _i10++) {\n _this14.options.positions[_i10].alt = Number((_this14.options.positions[_i10].alt + Number(heightElm.value)).toFixed(2));\n _this14._elms.alt[_i10].innerHTML = _this14.options.positions[_i10].alt;\n }\n var fromDegreesArray = _this14.renewPositions(_this14.options.positions);\n _this14.entity.polyline.positions = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray);\n _this14.positionEditing = false;\n _this14.closeNodeEdit();\n });\n }\n var tableElm = contentElm.getElementsByClassName('spatial-info-table')[0];\n var tBodyElm = tableElm.getElementsByClassName('table-body')[0];\n _this14._elms.lng = [];\n _this14._elms.lngInput = [];\n _this14._elms.lat = [];\n _this14._elms.latInput = [];\n _this14._elms.alt = [];\n _this14._elms.altInput = [];\n var _loop2 = function _loop2(_i11) {\n var tr = document.createElement('div');\n tr.className = 'tr';\n tr.innerHTML = \"\\n
\".concat(_i11 + 1, \"
\\n
\\n
\\n
\\n \");\n var lngBox = tr.getElementsByClassName('lng')[0];\n var lng = document.createElement('span');\n lng.innerHTML = _this14.options.positions[_i11].lng.toFixed(8);\n lngBox.appendChild(lng);\n var lngInput = document.createElement('input');\n lngInput.className = 'input';\n lngInput.type = 'number';\n lngInput.title = '';\n lngInput.min = -180;\n lngInput.max = 180;\n lngInput.value = _this14.options.positions[_i11].lng.toFixed(8);\n var latBox = tr.getElementsByClassName('lat')[0];\n var lat = document.createElement('span');\n lat.innerHTML = _this14.options.positions[_i11].lat.toFixed(8);\n latBox.appendChild(lat);\n var latInput = document.createElement('input');\n latInput.className = 'input';\n latInput.type = 'number';\n latInput.title = '';\n latInput.min = -90;\n latInput.max = 90;\n latInput.value = _this14.options.positions[_i11].lat.toFixed(8);\n var altBox = tr.getElementsByClassName('alt')[0];\n var alt = document.createElement('span');\n alt.innerHTML = _this14.options.positions[_i11].alt.toFixed(2);\n altBox.appendChild(alt);\n var altInput = document.createElement('input');\n altInput.className = 'input';\n altInput.type = 'number';\n altInput.title = '';\n altInput.min = -9999999;\n altInput.max = 999999999;\n altInput.value = _this14.options.positions[_i11].alt.toFixed(2);\n lngBox.addEventListener('dblclick', function () {\n lngBox.innerHTML = '';\n lngInput.value = Number(_this14.options.positions[_i11].lng.toFixed(8));\n lngBox.appendChild(lngInput);\n lngInput.focus();\n _this14.positionEditing = false;\n _this14.closeNodeEdit();\n });\n lngInput.addEventListener('blur', function () {\n lngInput.value = Number(_this14.options.positions[_i11].lng.toFixed(8));\n lngBox.innerHTML = '';\n lngBox.appendChild(lng);\n });\n lngInput.addEventListener('input', function () {\n _this14.options.positions[_i11].lng = Number(Number(lngInput.value).toFixed(8));\n lng.innerHTML = _this14.options.positions[_i11].lng.toFixed(8);\n var fromDegreesArray = _this14.renewPositions(_this14.options.positions);\n _this14.entity.polyline.positions = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray);\n _this14.label.position = [_this14.options.positions[0].lng, _this14.options.positions[0].lat, fromDegreesArray[2]];\n });\n latBox.addEventListener('dblclick', function () {\n latBox.innerHTML = '';\n latInput.value = Number(_this14.options.positions[_i11].lat.toFixed(8));\n latBox.appendChild(latInput);\n latInput.focus();\n _this14.positionEditing = false;\n _this14.closeNodeEdit();\n });\n latInput.addEventListener('blur', function () {\n latInput.value = Number(_this14.options.positions[_i11].lat.toFixed(8));\n latBox.innerHTML = '';\n latBox.appendChild(lat);\n });\n latInput.addEventListener('input', function () {\n _this14.options.positions[_i11].lat = Number(Number(latInput.value).toFixed(8));\n lat.innerHTML = _this14.options.positions[_i11].lat.toFixed(8);\n var fromDegreesArray = _this14.renewPositions(_this14.options.positions);\n _this14.entity.polyline.positions = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray);\n _this14.label.position = [_this14.options.positions[0].lng, _this14.options.positions[0].lat, fromDegreesArray[2]];\n });\n altBox.addEventListener('dblclick', function () {\n if (_this14.heightMode == 2) {\n return;\n }\n altBox.innerHTML = '';\n altInput.value = Number(_this14.options.positions[_i11].alt.toFixed(2));\n altBox.appendChild(altInput);\n altInput.focus();\n _this14.positionEditing = false;\n _this14.closeNodeEdit();\n });\n altInput.addEventListener('blur', function () {\n altInput.value = Number(_this14.options.positions[_i11].alt.toFixed(2));\n altBox.innerHTML = '';\n altBox.appendChild(alt);\n });\n altInput.addEventListener('input', function () {\n _this14.options.positions[_i11].alt = Number(Number(altInput.value).toFixed(2));\n alt.innerHTML = _this14.options.positions[_i11].alt.toFixed(2);\n var fromDegreesArray = _this14.renewPositions(_this14.options.positions);\n _this14.entity.polyline.positions = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray);\n _this14.label.position = [_this14.options.positions[0].lng, _this14.options.positions[0].lat, fromDegreesArray[2]];\n });\n _this14._elms.lng.push(lng);\n _this14._elms.lngInput.push(lngInput);\n _this14._elms.lat.push(lat);\n _this14._elms.latInput.push(latInput);\n _this14._elms.alt.push(alt);\n _this14._elms.altInput.push(altInput);\n tBodyElm.appendChild(tr);\n };\n for (var _i11 = 0; _i11 < _this14.options.positions.length; _i11++) {\n _loop2(_i11);\n }\n var fontData = Object(_Element_fontSelect__WEBPACK_IMPORTED_MODULE_21__[\"getFontList\"])();\n var fontObject = Object(_Element_datalist__WEBPACK_IMPORTED_MODULE_20__[\"legp\"])(_this14._DialogObject._element.content.getElementsByClassName('font-select-box')[0], '.font-select');\n if (fontObject) {\n fontObject.legp_search(fontData);\n var fontDataLegpElm = _this14._DialogObject._element.content.getElementsByClassName('font-select')[0].getElementsByTagName('input')[0];\n fontDataLegpElm.value = fontData[_this14.labelFontFamily].value;\n for (var _i12 = 0; _i12 < fontData.length; _i12++) {\n if (fontData[_i12].value == fontDataLegpElm.value) {\n fontObject.legp_searchActive(fontData[_i12].value);\n break;\n }\n }\n fontDataLegpElm.addEventListener('input', function () {\n for (var _i13 = 0; _i13 < fontData.length; _i13++) {\n if (fontData[_i13].value === fontDataLegpElm.value) {\n _this14.labelFontFamily = fontData[_i13].key;\n break;\n }\n }\n });\n _this14._elms.labelFontFamily = [fontDataLegpElm];\n }\n }, 0);\n _context.next = 34;\n break;\n case 33:\n if (this._DialogObject && this._DialogObject.close) {\n this._DialogObject.close();\n this._DialogObject = null;\n }\n case 34:\n case \"end\":\n return _context.stop();\n }\n }, _callee, this);\n }));\n function edit(_x) {\n return _edit.apply(this, arguments);\n }\n return edit;\n }() // 平滑处理\n )\n }, {\n key: \"smoothHandle\",\n value: function smoothHandle(positions) {\n var newPositions = [];\n var time = [];\n var fromDegreesArrayHeights = [];\n for (var i = 0; i < positions.length; i++) {\n fromDegreesArrayHeights.push(positions[i].lng, positions[i].lat, positions[i].alt);\n time.push(i / (positions.length - 1));\n }\n var spline = new Cesium.CatmullRomSpline({\n times: time,\n points: Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArrayHeights)\n });\n var length = positions.length * 20;\n for (var _i14 = 0; _i14 <= length; _i14++) {\n var cartesian3 = spline.evaluate(_i14 / length);\n newPositions.push(this.cartesian3Towgs84(cartesian3, this.sdk.viewer));\n }\n return newPositions;\n }\n\n // 更新坐标\n }, {\n key: \"renewPositions\",\n value: function renewPositions(positionsArray, cd) {\n var _this16 = this;\n if (this._error) {\n return;\n }\n var positions = JSON.parse(JSON.stringify(positionsArray));\n var ground;\n switch (this.heightMode) {\n case 0:\n case '0':\n ground = false;\n break;\n case 1:\n case '1':\n for (var i = 0; i < positions.length; i++) {\n var height = this.sdk.viewer.scene.globe.getHeight(Cesium.Cartographic.fromDegrees(positions[i].lng, positions[i].lat));\n positions[i].alt = height ? Number((positions[i].alt + Number(height)).toFixed(2)) : Number(positions[i].alt.toFixed(2));\n }\n ground = false;\n break;\n case 2:\n case '2':\n ground = true;\n break;\n }\n var newPositions;\n var fromDegreesArray = [];\n if (this.options.noseToTail && this.options.noseToTail !== 'false') {\n newPositions = [].concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default()(positions), [positions[0]]);\n } else {\n newPositions = _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default()(positions);\n }\n newPositions = this.smoothHandle(newPositions);\n for (var _i15 = 0; _i15 < newPositions.length; _i15++) {\n fromDegreesArray.push(newPositions[_i15].lng, newPositions[_i15].lat, newPositions[_i15].alt);\n }\n\n // 计算长度\n // let array = []\n // for (let i = 0; i < fromDegreesArray.length; i += 3) {\n // array.push({\n // lng: fromDegreesArray[i],\n // lat: fromDegreesArray[i + 1],\n // alt: fromDegreesArray[i + 2]\n // })\n // }\n // this.options.fitLengthByMeter = this.computeDistance2(\n // array,\n // 2,\n // ground\n // )\n // this.fitLengthUnit = this.options['fit-length-unit']\n // this.options.lengthByMeter = this.computeDistance2(this.smoothHandle(positions), 2, ground)\n // this.lengthUnit = this.options['length-unit']\n\n if (this.options.noseToTail && this.options.noseToTail !== 'false' || this.options.smooth && this.options.smooth !== 'false') {\n var array = [];\n for (var _i16 = 0; _i16 < fromDegreesArray.length; _i16 += 3) {\n array.push({\n lng: fromDegreesArray[_i16],\n lat: fromDegreesArray[_i16 + 1],\n alt: fromDegreesArray[_i16 + 2]\n });\n }\n // this.options.fitLengthByMeter = this.computeDistance(\n // array,\n // 2,\n // ground\n // )\n var _this15 = this;\n this.computeDistance(array, 2, this.options.wordsName).then(function (res) {\n _this15.lengthByMeter = res;\n _this16.lengthChangeCallBack && _this16.lengthChangeCallBack();\n cd && cd();\n });\n } else {\n var _this17 = this;\n this.computeDistance(_this17.smoothHandle(positions), 2, this.options.wordsName).then(function (res) {\n _this17.lengthByMeter = res;\n _this16.lengthChangeCallBack && _this16.lengthChangeCallBack();\n cd && cd();\n });\n }\n return fromDegreesArray;\n }\n\n // 更新多边形(线扩展)\n }, {\n key: \"renewPolygon\",\n value: function renewPolygon(fromDegreesArray) {\n var linePositions = [];\n if (this.options.extend && this.options.extend !== 'false') {\n var outerHole = [];\n for (var i = 0; i < fromDegreesArray.length; i += 3) {\n linePositions.push([fromDegreesArray[i], fromDegreesArray[i + 1]]);\n }\n var linestring = turf.lineString(linePositions);\n var buffered = turf.buffer(linestring, this.options.extendWidth / 1000, {\n units: 'kilometers'\n });\n for (var _i17 = 0; _i17 < buffered.geometry.coordinates[0].length; _i17++) {\n outerHole.push(buffered.geometry.coordinates[0][_i17][0], buffered.geometry.coordinates[0][_i17][1]);\n }\n var holes = []; // 孔\n for (var _i18 = 1; _i18 < buffered.geometry.coordinates.length; _i18++) {\n var array = [];\n for (var m = 0; m < buffered.geometry.coordinates[_i18].length; m++) {\n array.push(buffered.geometry.coordinates[_i18][m][0], buffered.geometry.coordinates[_i18][m][1]);\n }\n holes.push({\n positions: Cesium.Cartesian3.fromDegreesArray(array)\n });\n }\n this.entity.polygon = new Cesium.PolygonGraphics({\n hierarchy: {\n positions: Cesium.Cartesian3.fromDegreesArray(outerHole),\n holes: holes\n },\n material: Cesium.Color.fromCssColorString(this.options.extendColor)\n });\n } else {\n this.entity.polygon = undefined;\n }\n }\n }, {\n key: \"reset\",\n value: function () {\n var _reset = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee2() {\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee2$(_context2) {\n while (1) switch (_context2.prev = _context2.next) {\n case 0:\n if (this.entity) {\n _context2.next = 2;\n break;\n }\n return _context2.abrupt(\"return\");\n case 2:\n this.options = this.deepCopyObj(this.originalOptions);\n this.name = this.originalOptions.name;\n this.color = this.originalOptions.color;\n this.lineWidth = this.originalOptions.width;\n this.lineType = this.originalOptions.type;\n this.noseToTail = this.originalOptions.noseToTail;\n this.extend = this.originalOptions.extend;\n this.extendWidth = this.originalOptions.extendWidth;\n this.extendColor = this.originalOptions.extendColor;\n this.labelShow = this.originalOptions.label.show;\n this.labelColor = this.originalOptions.label.color;\n this.labelFontSize = this.originalOptions.label.fontSize;\n this.labelFontFamily = this.originalOptions.label.fontFamily;\n this.labelScaleByDistance = this.originalOptions.label.scaleByDistance;\n this.labelNear = this.originalOptions.label.near;\n this.labelFar = this.originalOptions.label.far;\n this.labelLineWidth = this.originalOptions.label.lineWidth;\n this.labelPixelOffset = this.originalOptions.label.pixelOffset;\n this.labelLineColor = this.originalOptions.label.lineColor;\n this.labelBackgroundColorStart = this.originalOptions.label.backgroundColor[0];\n this.labelBackgroundColorEnd = this.originalOptions.label.backgroundColor[1];\n // this.attributeVr = this.options.attribute.vr.content\n // this.attributeCamera = this.options.attribute.camera.content\n // this.attributeGoods = this.options.attribute.goods.content\n this.rotate = this.originalOptions.rotate;\n this.speed = this.originalOptions.speed;\n // this.dashSize = this.originalOptions.dashSize\n this.space = this.originalOptions.space;\n // this.cameraSelect && this.cameraSelect()\n // this.goodsSelect && this.goodsSelect()\n\n this.heightMode = this.options.heightMode;\n\n // let height\n // if (this.ground) {\n // height = await that.getClampToHeight({\n // lng: this.options.positions[0].lng,\n // lat: this.options.positions[0].lat\n // })\n // } else {\n // height = this.options.positions[0].alt\n // }\n // this.options.label.position = {\n // lng: this.options.positions[0].lng,\n // lat: this.options.positions[0].lat,\n // alt: height\n // }\n // this.label.position = [\n // this.options.label.position.lng,\n // this.options.label.position.lat,\n // this.options.label.position.alt\n // ]\n case 27:\n case \"end\":\n return _context2.stop();\n }\n }, _callee2, this);\n }));\n function reset() {\n return _reset.apply(this, arguments);\n }\n return reset;\n }() // _addRr() {\n // if (\n // this._DialogObject._element.content.getElementsByClassName(\n // 'vr_add'\n // )[0].value\n // ) {\n // this.options.attribute.vr.content.push({\n // name: '全景图',\n // url: this._DialogObject._element.content.getElementsByClassName(\n // 'vr_add'\n // )[0].value\n // })\n // this._DialogObject._element.content.getElementsByClassName(\n // 'vr_add'\n // )[0].value = ''\n // this.attributeVr = this.options.attribute.vr.content\n // } else {\n // this.Dialog.clickAddVr && this.Dialog.clickAddVr()\n // }\n // }\n // addAttributeRr(vr) {\n // this.options.attribute.vr.content.push({\n // name: '全景图',\n // url: vr\n // })\n // this.attributeVr = this.options.attribute.vr.content\n // }\n /**\r\n * 飞到\r\n */\n }, {\n key: \"flyTo\",\n value: function () {\n var _flyTo = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee3() {\n var options,\n orientation,\n lng,\n lat,\n alt,\n destination,\n position,\n positionArray,\n height,\n i,\n a,\n _i19,\n _a,\n _i20,\n _a2,\n BoundingSphere,\n _args3 = arguments;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee3$(_context3) {\n while (1) switch (_context3.prev = _context3.next) {\n case 0:\n options = _args3.length > 0 && _args3[0] !== undefined ? _args3[0] : {};\n if (!this._error) {\n _context3.next = 3;\n break;\n }\n return _context3.abrupt(\"return\");\n case 3:\n Object(_Global_global__WEBPACK_IMPORTED_MODULE_23__[\"closeRotateAround\"])(this.sdk);\n Object(_Global_global__WEBPACK_IMPORTED_MODULE_23__[\"closeViewFollow\"])(this.sdk);\n Object(_Global_global__WEBPACK_IMPORTED_MODULE_23__[\"setActiveViewer\"])(0);\n if (!this.options.customView) {\n _context3.next = 25;\n break;\n }\n orientation = {\n heading: Cesium.Math.toRadians(this.options.customView.orientation.heading || 0.0),\n pitch: Cesium.Math.toRadians(this.options.customView.orientation.pitch || -60.0),\n roll: Cesium.Math.toRadians(this.options.customView.orientation.roll || 0.0)\n };\n lng = this.options.customView.relativePosition.lng;\n lat = this.options.customView.relativePosition.lat;\n alt = this.options.customView.relativePosition.alt;\n destination = Cesium.Cartesian3.fromDegrees(lng, lat, alt);\n position = {\n lng: 0,\n lat: 0\n };\n if (this.options.position) {\n position = _objectSpread({}, this.options.position);\n } else if (this.options.positions) {\n position = _objectSpread({}, this.options.positions[0]);\n } else if (this.options.center) {\n position = _objectSpread({}, this.options.center);\n } else if (this.options.start) {\n position = _objectSpread({}, this.options.start);\n } else {\n if (this.options.hasOwnProperty('lng')) {\n position.lng = this.options.lng;\n }\n if (this.options.hasOwnProperty('lat')) {\n position.lat = this.options.lat;\n }\n if (this.options.hasOwnProperty('alt')) {\n position.alt = this.options.alt;\n }\n }\n // 如果没有高度值,则获取紧贴高度计算\n if (position.hasOwnProperty('alt')) {\n _context3.next = 18;\n break;\n }\n _context3.next = 17;\n return this.getClampToHeight(position);\n case 17:\n position.alt = _context3.sent;\n case 18:\n lng = this.options.customView.relativePosition.lng + position.lng;\n lat = this.options.customView.relativePosition.lat + position.lat;\n alt = this.options.customView.relativePosition.alt + position.alt;\n destination = Cesium.Cartesian3.fromDegrees(lng, lat, alt);\n this.sdk.viewer.camera.flyTo({\n destination: destination,\n orientation: orientation\n });\n _context3.next = 43;\n break;\n case 25:\n positionArray = [];\n _context3.t0 = this.options.heightMode;\n _context3.next = _context3.t0 === '0' ? 29 : _context3.t0 === 0 ? 29 : _context3.t0 === '1' ? 31 : _context3.t0 === 1 ? 31 : _context3.t0 === '2' ? 36 : _context3.t0 === 2 ? 36 : 41;\n break;\n case 29:\n for (i = 0; i < this.options.positions.length; i++) {\n a = Cesium.Cartesian3.fromDegrees(this.options.positions[i].lng, this.options.positions[i].lat, this.options.positions[i].alt);\n positionArray.push(a.x, a.y, a.z);\n }\n return _context3.abrupt(\"break\", 41);\n case 31:\n _context3.next = 33;\n return this.getClampToHeight(this.options.positions[0]);\n case 33:\n height = _context3.sent;\n for (_i19 = 0; _i19 < this.options.positions.length; _i19++) {\n _a = Cesium.Cartesian3.fromDegrees(this.options.positions[_i19].lng, this.options.positions[_i19].lat, height + this.options.positions[_i19].alt);\n positionArray.push(_a.x, _a.y, _a.z);\n }\n return _context3.abrupt(\"break\", 41);\n case 36:\n _context3.next = 38;\n return this.getClampToHeight(this.options.positions[0]);\n case 38:\n height = _context3.sent;\n for (_i20 = 0; _i20 < this.options.positions.length; _i20++) {\n _a2 = Cesium.Cartesian3.fromDegrees(this.options.positions[_i20].lng, this.options.positions[_i20].lat, height);\n positionArray.push(_a2.x, _a2.y, _a2.z);\n }\n return _context3.abrupt(\"break\", 41);\n case 41:\n BoundingSphere = Cesium.BoundingSphere.fromVertices(positionArray);\n this.sdk.viewer.camera.flyToBoundingSphere(BoundingSphere, {\n offset: options.orientation || {\n heading: Cesium.Math.toRadians(0.0),\n pitch: Cesium.Math.toRadians(-90.0),\n roll: Cesium.Math.toRadians(0.0)\n }\n });\n case 43:\n case \"end\":\n return _context3.stop();\n }\n }, _callee3, this);\n }));\n function flyTo() {\n return _flyTo.apply(this, arguments);\n }\n return flyTo;\n }()\n /**\r\n * 打开富文本框\r\n */\n }, {\n key: \"openRichTextEditor\",\n value: function openRichTextEditor(e) {\n var _this18 = this;\n // var ue = UE.getEditor('app');\n _Element_richText__WEBPACK_IMPORTED_MODULE_13__[\"default\"].open(this.options.id, this.options.name, this.options.richTextContent);\n _Element_richText__WEBPACK_IMPORTED_MODULE_13__[\"default\"].primaryCallBack = function (content) {\n _this18.options.richTextContent = content;\n };\n }\n\n // static nodeEdit2(that, cb = () => { }) {\n // that.positionEditing = false\n // if (YJ.Measure.GetMeasureStatus()) {\n // cb('上一次测量未结束')\n // } else {\n // YJ.Measure.SetMeasureStatus(true)\n // that.tip = new MouseTip('请选择一个顶点,右键取消', that.sdk)\n // that.event = new MouseEvent(that.sdk)\n // that.nodePoints = []\n // let selectPoint\n // let originalPosition\n // let newpositions = []\n // let fromDegreesArray = []\n // for (let i = 0; i < that.options.positions.length; i++) {\n // fromDegreesArray.push(\n // that.options.positions[i].lng,\n // that.options.positions[i].lat,\n // that.options.positions[i].alt\n // )\n // }\n // newpositions = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray)\n\n // that.event.mouse_left((movement, cartesian) => {\n // if (selectPoint) {\n // that.options.positions[selectPoint.index] = that.cartesian3Towgs84(\n // cartesian,\n // that.sdk.viewer\n // )\n // originalPosition = that.options.positions[selectPoint.index]\n // let entity = that.sdk.viewer.entities.add({\n // name: 'node-secondary-edit-point',\n // position: Cesium.Cartesian3.fromDegrees(\n // that.options.positions[selectPoint.index].lng,\n // that.options.positions[selectPoint.index].lat,\n // that.options.positions[selectPoint.index].alt\n // ),\n // billboard: {\n // image: that.getSourceRootPath() + '/img/point.png',\n // width: 15,\n // height: 15,\n // disableDepthTestDistance: Number.POSITIVE_INFINITY\n // }\n // })\n // that.nodePoints.splice(selectPoint.index, 0, entity)\n // that.options.positions.splice(\n // selectPoint.index,\n // 0,\n // that.options.positions[selectPoint.index]\n // )\n // let fromDegreesArray = that.renewPositions(that.options.positions)\n // that.renewPolygon(fromDegreesArray)\n // that.options.lengthByMeter = that.computeDistance2(\n // that.options.positions,\n // 2,\n // that.ground\n // )\n // that.lengthUnit = that.options['length-unit']\n // } else {\n // var pick = that.sdk.viewer.scene.pick(movement.position)\n // if (\n // pick &&\n // pick.id &&\n // pick.id.name &&\n // pick.id.name === 'node-secondary-edit-point'\n // ) {\n // selectPoint = pick.id\n // that.nodePoints.splice(pick.id.index, 1)\n // that.sdk.viewer.entities.remove(pick.id)\n // that.tip.set_text('左键开始,右键结束,CTRL+右键撤销')\n // originalPosition = that.cartesian3Towgs84(\n // cartesian,\n // that.sdk.viewer\n // )\n // }\n // }\n // })\n\n // that.event.mouse_right((movement, cartesian) => {\n // if (selectPoint) {\n // that.options.positions[selectPoint.index] = originalPosition\n // cb(null, that.options.positions)\n // }\n // let positions = that.options.positions\n // let fromDegreesArray = []\n // for (let i = 0; i < positions.length; i++) {\n // fromDegreesArray.push(\n // positions[i].lng,\n // positions[i].lat,\n // positions[i].alt\n // )\n // }\n // newpositions = Cesium.Cartesian3.fromDegreesArrayHeights(\n // fromDegreesArray\n // )\n // for (let i = 0; i < that.nodePoints.length; i++) {\n // that.sdk.viewer.entities.remove(that.nodePoints[i])\n // }\n // that.nodePoints = []\n // that.event.destroy()\n // that.tip.destroy()\n // })\n\n // that.event.mouse_move((movement, cartesian) => {\n // if (selectPoint) {\n // that.options.positions[selectPoint.index] = that.cartesian3Towgs84(\n // cartesian,\n // that.sdk.viewer\n // )\n // let positions = that.options.positions\n // let fromDegreesArray = []\n // for (let i = 0; i < positions.length; i++) {\n // fromDegreesArray.push(\n // positions[i].lng,\n // positions[i].lat,\n // positions[i].alt\n // )\n // }\n // newpositions = Cesium.Cartesian3.fromDegreesArrayHeights(\n // fromDegreesArray\n // )\n // if (that.options.positions.length === 1) {\n // that.label.position = [\n // that.options.positions[0].lng,\n // that.options.positions[0].lat,\n // that.options.positions[0].alt\n // ]\n // that.options.label.position = {\n // lng: that.options.positions[0].lng,\n // lat: that.options.positions[0].lat,\n // alt: that.options.positions[0].alt\n // }\n // }\n // }\n // that.tip.setPosition(\n // cartesian,\n // movement.endPosition.x,\n // movement.endPosition.y\n // )\n // })\n\n // that.event.mouse_right_keyboard_ctrl((movement, cartesian) => {\n // if (selectPoint) {\n // that.options.positions.pop()\n // that.sdk.viewer.entities.remove(\n // that.nodePoints[that.nodePoints.length - 1]\n // )\n // that.nodePoints.pop()\n // if (selectPoint.index === that.options.positions.length) {\n // if (that.nodePoints[selectPoint.index - 1]) {\n // selectPoint = that.nodePoints[selectPoint.index - 1]\n // } else {\n // selectPoint.index = 0\n // }\n // }\n // }\n // })\n\n // that.entity.polyline.positions = new Cesium.CallbackProperty(function () {\n // return newpositions\n // }, false)\n\n // for (let i = 0; i < that.options.positions.length; i++) {\n // let entity = that.sdk.viewer.entities.add({\n // name: 'node-secondary-edit-point',\n // index: i,\n // position: Cesium.Cartesian3.fromDegrees(\n // that.options.positions[i].lng,\n // that.options.positions[i].lat,\n // that.options.positions[i].alt\n // ),\n // billboard: {\n // image: that.getSourceRootPath() + '/img/point.png',\n // width: 15,\n // height: 15,\n // disableDepthTestDistance: Number.POSITIVE_INFINITY\n // }\n // })\n // that.nodePoints.push(entity)\n // }\n // }\n // }\n }, {\n key: \"nodeEdit\",\n value: function nodeEdit(cd) {\n var _this19 = this;\n this.positionEditing = false;\n if (YJ.Measure.GetMeasureStatus()) {} else {\n this.closeNodeEdit();\n this.tip = new _MouseTip__WEBPACK_IMPORTED_MODULE_17__[\"default\"]('请选择一个顶点,右键取消', this.sdk);\n this.event = new _Event_index__WEBPACK_IMPORTED_MODULE_16__[\"default\"](this.sdk);\n this.ControllerObject = new _Controller_index__WEBPACK_IMPORTED_MODULE_18__[\"default\"](this.sdk);\n this._nodeEditCallback = cd;\n var selectPoint;\n this.event.mouse_left(function (movement, cartesian) {\n var pick = _this19.sdk.viewer.scene.pick(movement.position);\n if (pick && pick.id && pick.id.name && pick.id.name === 'node-secondary-edit-point') {\n selectPoint = pick.id;\n _this19.ControllerObject.position = _this19.options.positions[selectPoint.index];\n _this19.ControllerObject.editTranslational();\n _this19.tip && _this19.tip.destroy();\n _this19.ControllerObject.controllerCallBack = function (params) {\n if (selectPoint.index === 0) {\n _this19.label.position = [params.position.lng, params.position.lat, params.position.alt];\n _this19.options.label.position = {\n lng: params.position.lng,\n lat: params.position.lat,\n alt: params.position.alt\n };\n }\n _this19.options.positions[selectPoint.index] = params.position;\n _this19._elms.lng && (_this19._elms.lng[selectPoint.index].innerHTML = params.position.lng.toFixed(8));\n _this19._elms.lngInput && (_this19._elms.lngInput[selectPoint.index].value = params.position.lng.toFixed(8));\n _this19._elms.lat && (_this19._elms.lat[selectPoint.index].innerHTML = params.position.lat.toFixed(8));\n _this19._elms.latInput && (_this19._elms.latInput[selectPoint.index].value = params.position.lat.toFixed(8));\n _this19._elms.alt && (_this19._elms.alt[selectPoint.index].innerHTML = params.position.alt.toFixed(2));\n _this19._elms.altInput && (_this19._elms.altInput[selectPoint.index].value = params.position.alt.toFixed(2));\n selectPoint.position = Cesium.Cartesian3.fromDegrees(params.position.lng, params.position.lat, params.position.alt);\n };\n }\n });\n this.event.mouse_right(function (movement, cartesian) {\n for (var i = 0; i < _this19.nodePoints.length; i++) {\n _this19.sdk.viewer.entities.remove(_this19.nodePoints[i]);\n }\n _this19.nodePoints = [];\n _this19.event.destroy();\n _this19.tip && _this19.tip.destroy();\n _this19.tip = null;\n _this19.ControllerObject.destroy();\n var fromDegreesArray = _this19.renewPositions(_this19.options.positions);\n _this19.entity.polyline.positions = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray);\n YJ.Measure.SetMeasureStatus(false);\n _this19._nodeEditCallback = null;\n });\n this.event.mouse_move(function (movement, cartesian) {\n _this19.tip.setPosition(cartesian, movement.endPosition.x, movement.endPosition.y);\n });\n this.entity.polyline.positions = new Cesium.CallbackProperty(function () {\n var fromDegreesArray = _this19.renewPositions(_this19.options.positions);\n _this19._nodeEditCallback(_this19.options.positions, _this19.lengthByMeter);\n return Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray);\n }, false);\n for (var i = 0; i < this.options.positions.length; i++) {\n var entity = this.sdk.viewer.entities.add({\n name: 'node-secondary-edit-point',\n index: i,\n position: Cesium.Cartesian3.fromDegrees(this.options.positions[i].lng, this.options.positions[i].lat, this.options.positions[i].alt),\n billboard: {\n image: this.getSourceRootPath() + '/img/point.png',\n width: 15,\n height: 15,\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\n color: Cesium.Color.WHITE.withAlpha(0.99)\n }\n });\n this.nodePoints.push(entity);\n }\n }\n }\n }, {\n key: \"closeNodeEdit\",\n value: function closeNodeEdit() {\n this.ControllerObject && this.ControllerObject.destroy();\n this.event && this.event.destroy();\n this.tip && this.tip.destroy();\n this.tip = null;\n for (var i = 0; i < this.nodePoints.length; i++) {\n this.sdk.viewer.entities.remove(this.nodePoints[i]);\n }\n this.nodePoints = [];\n this._nodeEditCallback = null;\n }\n\n /**\r\n * 删除\r\n */\n }, {\n key: \"remove\",\n value: (function () {\n var _remove = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee4() {\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee4$(_context4) {\n while (1) switch (_context4.prev = _context4.next) {\n case 0:\n this.event && this.event.destroy();\n this.tip && this.tip.destroy();\n this.label && this.label.remove();\n this.sdk.viewer.entities.remove(this.entity);\n this.entity = null;\n if (this._DialogObject && !this._DialogObject.isDestroy) {\n this._DialogObject.close();\n this._DialogObject = null;\n }\n _context4.next = 8;\n return this.sdk.removeIncetance(this.options.id);\n case 8:\n _context4.next = 10;\n return Object(_Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_19__[\"syncData\"])(this.sdk, this.options.id);\n case 10:\n case \"end\":\n return _context4.stop();\n }\n }, _callee4, this);\n }));\n function remove() {\n return _remove.apply(this, arguments);\n }\n return remove;\n }()\n /**@desc 打开平移功能\r\n *\r\n * @memberOf Source\r\n * @param status {boolean}\r\n *\r\n * */\n )\n }, {\n key: \"positionEditing\",\n get: function get() {\n return this.operate.positionEditing;\n },\n set: function set(status) {\n var _this20 = this;\n if (YJ.Measure.GetMeasureStatus() || !this.sdk || !this.sdk.viewer || !this.entity) {\n return;\n }\n this.operate.positionEditing = status;\n if (status === true) {\n this.closeNodeEdit();\n this.event && this.event.destroy();\n this.event = new _Event_index__WEBPACK_IMPORTED_MODULE_16__[\"default\"](this.sdk);\n this.tip && this.tip.destroy();\n this.tip = new _MouseTip__WEBPACK_IMPORTED_MODULE_17__[\"default\"]('点击鼠标左键确认,右键取消', this.sdk);\n this.label && (this.label.entity.billboard.color = Cesium.Color.fromCssColorString(\"rgba(255,255,255,0.9)\"));\n this.picking = false;\n var positions = JSON.parse(JSON.stringify(this.options.positions));\n var positions2 = this.renewPositions(this.options.positions);\n // let positions2 = JSON.parse(JSON.stringify(positions))\n // for (let i = 0; i < positions2.length; i++) {\n // let height = this.sdk.viewer.scene.globe.getHeight(Cesium.Cartographic.fromDegrees(positions2[i].lng, positions2[i].lat))\n // positions2[i] = Cesium.Cartesian3.fromDegrees(\n // positions2[i].lng,\n // positions2[i].lat,\n // Number((positions2[i].alt + Number(height)).toFixed(2))\n // )\n // }\n this.previous = {\n positions: _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default()(this.options.positions)\n };\n for (var i = 0; i < positions.length; i++) {\n positions[i] = Cesium.Cartesian3.fromDegrees(positions[i].lng, positions[i].lat, positions[i].alt);\n }\n var center = positions[Math.floor(positions.length / 2)];\n var disparity = [];\n for (var _i21 = 0; _i21 < positions.length; _i21++) {\n disparity.push({\n x: center.x - positions[_i21].x,\n y: center.y - positions[_i21].y,\n z: center.z - positions[_i21].z\n });\n }\n var newpositions = [];\n var newpositions84 = [];\n this.event.mouse_move(function (movement, cartesian) {\n newpositions = [];\n newpositions84 = [];\n for (var _i22 = 0; _i22 < disparity.length; _i22++) {\n var newP = {\n x: cartesian.x - disparity[_i22].x,\n y: cartesian.y - disparity[_i22].y,\n z: cartesian.z - disparity[_i22].z\n };\n var pos84 = _this20.cartesian3Towgs84(newP, _this20.sdk.viewer);\n pos84.alt = _this20.options.positions[_i22].alt;\n // let height = this.sdk.viewer.scene.globe.getHeight(Cesium.Cartographic.fromDegrees(pos84.lng, pos84.lat))\n // pos84.alt = Number((pos84.alt + Number(height)).toFixed(2))\n // newP = Cesium.Cartesian3.fromDegrees(\n // pos84.lng,\n // pos84.lat,\n // pos84.alt\n // )\n newpositions.push(newP);\n newpositions84.push(pos84);\n }\n var position84 = newpositions84[0];\n positions2 = _this20.renewPositions(newpositions84);\n _this20.label.position = [position84.lng, position84.lat, position84.alt];\n _this20.options.label.position = {\n lng: position84.lng,\n lat: position84.lat,\n alt: position84.alt\n };\n _this20.tip.setPosition(cartesian, movement.endPosition.x, movement.endPosition.y);\n });\n this.event.mouse_left(function (movement, cartesian) {\n _this20.event.mouse_move(function () {});\n _this20.event.mouse_left(function () {});\n _this20.event.mouse_right(function () {});\n newpositions = [];\n newpositions84 = [];\n for (var _i23 = 0; _i23 < disparity.length; _i23++) {\n var newP = {\n x: cartesian.x - disparity[_i23].x,\n y: cartesian.y - disparity[_i23].y,\n z: cartesian.z - disparity[_i23].z\n };\n var pos84 = _this20.cartesian3Towgs84(newP, _this20.sdk.viewer);\n pos84.alt = _this20.options.positions[_i23].alt;\n newpositions.push(newP);\n newpositions84.push(pos84);\n }\n var positionsLngLat = [];\n for (var _i24 = 0; _i24 < newpositions84.length; _i24++) {\n var position = newpositions84[_i24];\n positionsLngLat.push(position);\n _this20._elms.lng && (_this20._elms.lng[_i24].innerHTML = position.lng.toFixed(8));\n _this20._elms.lngInput && (_this20._elms.lngInput[_i24].value = position.lng.toFixed(8));\n _this20._elms.lat && (_this20._elms.lat[_i24].innerHTML = position.lat.toFixed(8));\n _this20._elms.latInput && (_this20._elms.latInput[_i24].value = position.lat.toFixed(8));\n _this20._elms.alt && (_this20._elms.alt[_i24].innerHTML = position.alt.toFixed(2));\n _this20._elms.altInput && (_this20._elms.altInput[_i24].value = position.alt.toFixed(2));\n }\n _this20.options.positions = positionsLngLat;\n _this20.previous.positions = positionsLngLat;\n\n // this.entity.polyline.positionsLngLat = positionsLngLat\n var fromDegreesArray = _this20.renewPositions(_this20.options.positions, function () {\n if (_this20._positionEditingCallback) {\n _this20._positionEditingCallback();\n _this20._positionEditingCallback = null;\n }\n });\n _this20.entity.polyline.positions = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray);\n _this20.renewPolygon(fromDegreesArray);\n _this20.positionEditing = false;\n });\n this.event.mouse_right(function (movement, cartesian) {\n _this20.event.mouse_move(function () {});\n _this20.event.mouse_left(function () {});\n _this20.event.mouse_right(function () {});\n _this20.positionEditing = false;\n });\n this.event.gesture_pinck_start(function (movement, cartesian) {\n var startTime = new Date();\n _this20.event.gesture_pinck_end(function () {\n var endTime = new Date();\n var pos = {\n position: {\n x: (movement.position1.x + movement.position2.x) / 2,\n y: (movement.position1.y + movement.position2.y) / 2\n }\n };\n if (endTime - startTime >= 500) {\n // 长按取消\n _this20.event.mouse_move(function () {});\n _this20.event.mouse_left(function () {});\n _this20.event.mouse_right(function () {});\n _this20.positionEditing = false;\n } else {\n leftEvent(pos, cartesian);\n }\n });\n });\n this.entity.polyline.positions = new Cesium.CallbackProperty(function () {\n return Cesium.Cartesian3.fromDegreesArrayHeights(positions2);\n }, false);\n } else {\n if (!this.sdk || !this.sdk.viewer || !this.label || !this.label.entity) {\n this.label.entity.billboard.color = Cesium.Color.fromCssColorString(\"rgba(255,255,255,1)\");\n }\n this.picking = true;\n if (this.event) {\n this.event.mouse_move(function () {});\n this.event.mouse_left(function () {});\n this.event.mouse_right(function () {});\n this.event.destroy();\n }\n this.tip && this.tip.destroy();\n var fromDegreesArray = this.renewPositions(this.options.positions);\n this.entity.polyline.positions = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray);\n this.renewPolygon(fromDegreesArray);\n switch (this.heightMode) {\n case 0:\n case '0':\n case 1:\n case '1':\n this.label.position = [this.options.positions[0].lng, this.options.positions[0].lat, fromDegreesArray[2]];\n this.options.label.position = {\n lng: this.options.positions[0].lng,\n lat: this.options.positions[0].lat,\n alt: fromDegreesArray[2]\n };\n break;\n case 2:\n case '2':\n this.label.position = [this.options.positions[0].lng, this.options.positions[0].lat];\n this.options.label.position = {\n lng: this.options.positions[0].lng,\n lat: this.options.positions[0].lat,\n alt: fromDegreesArray[2]\n };\n break;\n }\n }\n }\n }, {\n key: \"openPositionEditing\",\n value: function openPositionEditing(cd) {\n this.positionEditing = true;\n this._positionEditingCallback = cd;\n }\n }, {\n key: \"lengthChangeCallBack\",\n get: function get() {\n return this._lengthChangeCallBack;\n },\n set: function set(cd) {\n this._lengthChangeCallBack = cd;\n }\n }, {\n key: \"setDIV\",\n value: function setDIV() {\n var _Cesium$Cartesian,\n _this21 = this;\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {\n domid: '',\n x: 10,\n y: 10\n };\n options.x = options.x || options.x === 0 ? options.x : 10;\n options.y = options.y || options.y === 0 ? options.y : 10;\n var points = [];\n for (var i = 0; i < this.options.positions.length; i++) {\n points.push([this.options.positions[i].lng, this.options.positions[i].lat]);\n }\n var line = turf.lineString(points);\n var length = turf.length(line, {\n units: 'kilometers'\n });\n var sliced = turf.lineSliceAlong(line, 0, length / 2, {\n units: 'kilometers'\n });\n var siteInfoDom = document.getElementById(options.domid);\n var siteInfoPosition = (_Cesium$Cartesian = Cesium.Cartesian3).fromDegrees.apply(_Cesium$Cartesian, _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default()(sliced.geometry.coordinates[sliced.geometry.coordinates.length - 1]));\n this.sdk.viewer.scene.postRender.addEventListener(function (percentage) {\n //转换到屏幕坐标\n if (siteInfoDom.style.display === 'block' || siteInfoDom.style.display === '') {\n var winpos = _this21.sdk.viewer.scene.cartesianToCanvasCoordinates(siteInfoPosition);\n if (winpos) {\n siteInfoDom.style.left = (winpos.x + options.x).toFixed(0) + 'px';\n siteInfoDom.style.top = (winpos.y + options.y).toFixed(0) + 'px';\n }\n }\n });\n }\n }], [{\n key: \"createLabel\",\n value: function () {\n var _createLabel = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee5(that) {\n var height, ground, objectsToExclude;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee5$(_context5) {\n while (1) switch (_context5.prev = _context5.next) {\n case 0:\n objectsToExclude = _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default()(that.sdk.viewer.entities.values);\n _context5.t0 = that.options.heightMode;\n _context5.next = _context5.t0 === '0' ? 4 : _context5.t0 === 0 ? 4 : _context5.t0 === '1' ? 7 : _context5.t0 === 1 ? 7 : _context5.t0 === '2' ? 14 : _context5.t0 === 2 ? 14 : 19;\n break;\n case 4:\n ground = false;\n height = that.options.positions[0].alt;\n return _context5.abrupt(\"break\", 19);\n case 7:\n ground = false;\n _context5.next = 10;\n return that.getClampToHeight({\n lng: that.options.positions[0].lng,\n lat: that.options.positions[0].lat\n }, objectsToExclude);\n case 10:\n _context5.t1 = _context5.sent;\n _context5.t2 = that.options.positions[0].alt;\n height = _context5.t1 + _context5.t2;\n return _context5.abrupt(\"break\", 19);\n case 14:\n ground = true;\n _context5.next = 17;\n return that.getClampToHeight({\n lng: that.options.positions[0].lng,\n lat: that.options.positions[0].lat\n }, objectsToExclude);\n case 17:\n height = _context5.sent;\n return _context5.abrupt(\"break\", 19);\n case 19:\n if (!that.options.label.position) {\n that.options.label.position = {\n lng: that.options.positions[0].lng,\n lat: that.options.positions[0].lat,\n alt: height\n };\n }\n that.label = new _LabelObject__WEBPACK_IMPORTED_MODULE_15__[\"default\"](that.sdk, {\n id: that.options.id,\n show: that.options.show ? that.options.label.show : false,\n position: [that.options.label.position.lng, that.options.label.position.lat, that.options.label.position.alt],\n text: that.options.name,\n fontSize: that.options.label.fontSize,\n fontFamily: that.options.label.fontFamily,\n color: that.options.label.color,\n pixelOffset: that.options.label.pixelOffset,\n backgroundColor: that.options.label.backgroundColor,\n lineColor: that.options.label.lineColor,\n lineWidth: that.options.label.lineWidth,\n scaleByDistance: that.options.label.scaleByDistance,\n near: that.options.label.near,\n far: that.options.label.far,\n ground: ground\n });\n case 21:\n case \"end\":\n return _context5.stop();\n }\n }, _callee5);\n }));\n function createLabel(_x2) {\n return _createLabel.apply(this, arguments);\n }\n return createLabel;\n }()\n }, {\n key: \"create\",\n value: function create(that) {\n var ground;\n if (that.heightMode == 2) {\n ground = true;\n } else {\n ground = false;\n }\n var positions = that.options.positions;\n var fromDegreesArray = that.renewPositions(positions);\n that.entity = that.sdk.viewer.entities.add({\n id: that.options.id,\n show: that.options.show,\n polyline: {\n positions: Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray),\n width: that.options.width,\n clampToGround: ground,\n // material: that.getMaterial(that.options.color, that.options.type),\n zIndex: that.sdk._entityZIndex\n }\n });\n that.entity.polyline.oriWidth = that.options.width;\n that.judgeLine(that.entity, that.options);\n var params = _objectSpread({}, that.options);\n params.speed = that.inputSpeed;\n that.entity.polyline.material = that.getMaterial(that.options.color, that.options.type, that.entity, params);\n that.sdk._entityZIndex++;\n CurvelineObject.createLabel(that);\n // that.entity.polyline.positionsLngLat = positions\n that.renewPolygon(fromDegreesArray);\n // that.options.lengthByMeter = that.computeDistance2(that.smoothHandle(positions), 2, ground)\n // that.lengthUnit = that.options['length-unit']\n // syncData(that.sdk, that.options.id)\n // if (that.options.show) {\n // setSplitDirection(0, that.options.id)\n // }\n\n that.computeDistance(that.smoothHandle(positions), 2, that.options.wordsName).then(function (res) {\n that.lengthByMeter = res;\n that.lengthChangeCallBack && that.lengthChangeCallBack();\n Object(_Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_19__[\"syncData\"])(that.sdk, that.options.id);\n });\n if (that.options.show) {\n Object(_Global_SplitScreen__WEBPACK_IMPORTED_MODULE_22__[\"setSplitDirection\"])(0, that.options.id);\n }\n\n // if (this.options.noseToTail) {\n // let array = []\n // for (let i = 0; i < fromDegreesArray.length; i += 2) {\n // array.push({ lng: fromDegreesArray[i], lat: fromDegreesArray[i + 1] })\n // }\n // this.options.fit_length = tool.computeDistance2(array)\n // }\n // else {\n // this.options.fit_length = tool.computeDistance2(positions)\n // }\n // if (this.options.fit_length_unit === 'km') {\n // this.options.fit_length = this.options.fit_length / 1000\n // }\n\n var scene = that.sdk.viewer.scene;\n }\n }]);\n}(_index__WEBPACK_IMPORTED_MODULE_11__[\"default\"]);\n/* harmony default export */ __webpack_exports__[\"default\"] = (CurvelineObject);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvT2JqL0Jhc2UvQ3VydmVsaW5lT2JqZWN0L2luZGV4LmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL09iai9CYXNlL0N1cnZlbGluZU9iamVjdC9pbmRleC5qcz80NDJjIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBAZGVzY3JpcHRpb24g57q/XHJcbiAqL1xyXG5pbXBvcnQgRGlhbG9nIGZyb20gJy4uLy4uL0VsZW1lbnQvRGlhbG9nJ1xyXG5pbXBvcnQgeyBodG1sIH0gZnJvbSAnLi9fZWxlbWVudCdcclxuaW1wb3J0IEJhc2UgZnJvbSAnLi4vaW5kZXgnXHJcbmltcG9ydCBjeV90YWJzIGZyb20gJy4uLy4uL0VsZW1lbnQvY3lfaHRtbF90YWJzJ1xyXG5pbXBvcnQgcmljaFRleHQgZnJvbSAnLi4vLi4vRWxlbWVudC9yaWNoVGV4dCdcclxuaW1wb3J0IEV2ZW50QmluZGluZyBmcm9tICcuL2V2ZW50QmluZGluZydcclxuaW1wb3J0IExhYmVsT2JqZWN0IGZyb20gJy4uL0xhYmVsT2JqZWN0J1xyXG5pbXBvcnQgTW91c2VFdmVudCBmcm9tICcuLi8uLi8uLi9FdmVudC9pbmRleCdcclxuaW1wb3J0IE1vdXNlVGlwIGZyb20gJy4uLy4uLy4uL01vdXNlVGlwJ1xyXG5pbXBvcnQgQ29udHJvbGxlciBmcm9tICcuLi8uLi8uLi9Db250cm9sbGVyL2luZGV4J1xyXG5pbXBvcnQgeyBzeW5jRGF0YSwgZ2V0M0RWaWV3IH0gZnJvbSAnLi4vLi4vLi4vR2xvYmFsL011bHRpVmlld3BvcnRNb2RlJ1xyXG5pbXBvcnQgeyBsZWdwIH0gZnJvbSAnLi4vLi4vRWxlbWVudC9kYXRhbGlzdCdcclxuaW1wb3J0IHsgZ2V0Rm9udExpc3QsIGdldEZvbnRGYW1pbHlOYW1lIH0gZnJvbSAnLi4vLi4vRWxlbWVudC9mb250U2VsZWN0J1xyXG5pbXBvcnQgeyBzZXRTcGxpdERpcmVjdGlvbiwgc3luY1NwbGl0RGF0YSwgc2V0QWN0aXZlSWQgfSBmcm9tICcuLi8uLi8uLi9HbG9iYWwvU3BsaXRTY3JlZW4nXHJcbmltcG9ydCB7IHNldEFjdGl2ZVZpZXdlciwgY2xvc2VSb3RhdGVBcm91bmQsIGNsb3NlVmlld0ZvbGxvdyB9IGZyb20gJy4uLy4uLy4uL0dsb2JhbC9nbG9iYWwnXHJcblxyXG5jbGFzcyBDdXJ2ZWxpbmVPYmplY3QgZXh0ZW5kcyBCYXNlIHtcclxuICAvKipcclxuICAgKiBAY29uc3RydWN0b3JcclxuICAgKiBAcGFyYW0gc2RrXHJcbiAgICogQGRlc2NyaXB0aW9uIOabsue6v1xyXG4gICAqIEBwYXJhbSBvcHRpb25zIHtvYmplY3R9IOe6v+WxnuaAp1xyXG4gICAqIEBwYXJhbSBvcHRpb25zLm5hbWV7c3RyaW5nfSDlkI3np7BcclxuICAgKiBAcGFyYW0gb3B0aW9ucy53aWR0aD0ze251bWJlcn0g57q/5a69XHJcbiAgICogQHBhcmFtIG9wdGlvbnMuY29sb3I9I2ZmMDAwMCB7c3RyaW5nfSDpopzoibJcclxuICAgKiBAcGFyYW0gb3B0aW9ucy50eXBlPTAge251bWJlcn0g5p2Q6LSo57G75Z6LIDAt5a6e57q/IDEt6Jma57q/IDIt5rOb5YWJLi4uXHJcbiAgICogQHBhcmFtIG9wdGlvbnMuaGVpZ2h0TW9kZT0ye251bWJlcn0g6auY5bqm5qih5byP77yIMO+8mua1t+aLlOmrmOW6pu+8mzHvvJrnm7jlr7npq5jluqbvvJsy77ya5L6d6ZmE5qih5byP77yJXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubm9zZVRvVGFpbD1mYWxzZSB7Ym9vbGVhbn0g6aaW5bC+55u46L+eXHJcbiAgICogQHBhcmFtIG9wdGlvbnMuZXh0ZW5kPWZhbHNlIHtib29sZWFufSDnur/nvJPlhrJcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5leHRlbmRXaWR0aD0xMCB7bnVtYmVyfSDnur/nvJPlhrLlrr3luqZcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5leHRlbmRDb2xvcj1yZ2JhKDI1NSwyNTUsODAsMC4zKSB7bnVtYmVyfSDnur/nvJPlhrLpopzoibJcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5zaG93PXRydWUge2Jvb2xlYW59IOaYvumakFxyXG4gICAqIEBwYXJhbSB7QXJyYXkuPG9iamVjdD59IG9wdGlvbnMucG9zaXRpb25zIOW/heWhq++8jOe7j+e6rOW6puWSjOmrmOW6pueahOWIl+ihqO+8jOWAvOS6pOabvyBbe2xvbixsYXQsYWx0fSwuLi5dXHJcbiAgICogQHBhcmFtIG9wdGlvbnMucG9zaXRpb25zW10ubG5nIHtudW1iZXJ9IOe7j+W6plxyXG4gICAqIEBwYXJhbSBvcHRpb25zLnBvc2l0aW9uc1tdLmxhdCB7bnVtYmVyfSDnuqzluqZcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5wb3NpdGlvbnNbXS5hbHQge251bWJlcn0g6auY5bqmXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwge29iamVjdH0g5qCH562+5a+56LGhXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwudGV4dCB7c3RyaW5nfSDmoIfnrb7mlofmnKxcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5sYWJlbC5zaG93IHtzdHJpbmd9IOagh+etvuaYvumakFxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLnBvc2l0aW9uIHtzdHJpbmd9IOagh+etvuS9jee9rlxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLnBvc2l0aW9uIHtvYmplY3R9IOagh+etvuS9jee9rlxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLnBvc2l0aW9uLmxuZyB7bnVtYmVyfSDnu4/luqZcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5sYWJlbC5wb3NpdGlvbi5sYXQge251bWJlcn0g57qs5bqmXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwucG9zaXRpb24uYWx0IHtudW1iZXJ9IOmrmOW6plxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLmZvbnRTaXplPTIwIHtudW1iZXJ9IOWtl+S9k+Wkp+Wwj1xyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLmZvbnRGYW1pbHk9MCB7bnVtYmVyfSDlrZfkvZPpobkgMO+8mum7keS9k++8mzHvvJrmgJ3mupDpu5HkvZPvvJsy77ya5bqe6Zeo5q2j6YGT5qCH6aKY5L2T77ybM++8muaVsOm7keS9k1xyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLmNvbG9yPSNmZmZmZmYge3N0cmluZ30g5a2X5L2T6aKc6ImyXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwubGluZVdpZHRoPTQge251bWJlcn0g5byV57q/5a69XHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwubGluZUNvbG9yPSMwMGZmZmY4MCB7c3RyaW5nfSDlvJXnur/popzoibJcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5sYWJlbC5waXhlbE9mZnNldD0yMCB7bnVtYmVyfSDlrZfkvZPlgY/np7so5byV57q/6ZW/5bqmKVxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLmJhY2tncm91bmRDb2xvcj1bJyMwMGZmZmY4MCcsICcjMDBmZmZmODAnXSB7YXJyYXl9IOiDjOaZr+minOiJslxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLnNjYWxlQnlEaXN0YW5jZSB7Ym9vbGVhbn0g6Led56a757yp5pS+XHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwubmVhcj0yMDAwIHtudW1iZXJ9IOinhumHjue8qeaUvuacgOi/kei3neemu1xyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLmZhcj0xMDAwMDAge251bWJlcn0g6KeG6YeO57yp5pS+5pyA6L+c6Led56a7XHJcbiAgICogQHBhcmFtIG9wdGlvbnMuYXR0cmlidXRlIHtvYmplY3R9IOWxnuaAp+WGheWuuVxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmF0dHJpYnV0ZS5saW5rPXt9IHtzdHJpbmd9IOmTvuaOpVxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnQ9W11dIHthcnJheX0g6ZO+5o6l5YaF5a65XHJcbiAgICogQHBhcmFtIG9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudFtdLm5hbWUge3N0cmluZ30g6ZO+5o6l5ZCN56ewXHJcbiAgICogQHBhcmFtIG9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudFtdLnVybCB7c3RyaW5nfSDpk77mjqXlnLDlnYBcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5yaWNoVGV4dENvbnRlbnQge3N0cmluZ30g5a+M5paH5pys5YaF5a65XHJcbiAgICogQHBhcmFtIG9wdGlvbnMuY3VzdG9tVmlldyB7b2JqZWN0fSDpu5jorqTop4bop5JcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5jdXN0b21WaWV3Lm9yaWVudGF0aW9uIHtvYmplY3R9IOm7mOiupOinhuinkuaWueS9jVxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmN1c3RvbVZpZXcub3JpZW50YXRpb24uaGVhZGluZyB7bnVtYmVyfSDoiKrlkJHop5JcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5jdXN0b21WaWV3Lm9yaWVudGF0aW9uLnBpdGNoIHtudW1iZXJ9IOS/r+S7sOinklxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmN1c3RvbVZpZXcub3JpZW50YXRpb24ucm9sbCB7bnVtYmVyfSDnv7vmu5rop5JcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5jdXN0b21WaWV3LnJlbGF0aXZlUG9zaXRpb24ge29iamVjdH0g6KeG6KeS55u45a+55L2N572uXHJcbiAgICogQHBhcmFtIG9wdGlvbnMuY3VzdG9tVmlldy5yZWxhdGl2ZVBvc2l0aW9uLmxuZyB7bnVtYmVyfSDnu4/luqZcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5jdXN0b21WaWV3LnJlbGF0aXZlUG9zaXRpb24ubGF0IHtudW1iZXJ9IOe6rOW6plxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmN1c3RvbVZpZXcucmVsYXRpdmVQb3NpdGlvbi5hbHQge251bWJlcn0g6auY5bqmXHJcbiAgICogXHJcbiAgICogXHJcbiAgICogQHBhcmFtIF9EaWFsb2cge29iamVjdH0g5by55qGG5LqL5Lu2XHJcbiAgICogQHBhcmFtIF9EaWFsb2cuY29uZmlybUNhbGxCYWNrIHtmdW5jdGlvbn0g5by55qGG56Gu6K6k5pe255qE5Zue6LCDXHJcbiAgICogKi9cclxuICBjb25zdHJ1Y3RvcihzZGssIG9wdGlvbnMgPSB7fSwgX0RpYWxvZyA9IHt9KSB7XHJcbiAgICBzdXBlcihzZGssIG9wdGlvbnMpXHJcbiAgICB0aGlzLm9wdGlvbnMubmFtZSA9IG9wdGlvbnMubmFtZSB8fCAn5pyq5ZG95ZCN5a+56LGhJ1xyXG4gICAgdGhpcy5vcHRpb25zLndpZHRoID0gKChvcHRpb25zLndpZHRoIHx8IG9wdGlvbnMud2lkdGggPT09IDApID8gb3B0aW9ucy53aWR0aCA6IDMpXHJcbiAgICB0aGlzLm9wdGlvbnMuY29sb3IgPSBvcHRpb25zLmNvbG9yIHx8ICcjZmYwMDAwJ1xyXG4gICAgdGhpcy5vcHRpb25zLnR5cGUgPSBvcHRpb25zLnR5cGUgPyBOdW1iZXIob3B0aW9ucy50eXBlKSA6IDBcclxuICAgIHRoaXMub3B0aW9ucy5ub3NlVG9UYWlsID0gb3B0aW9ucy5ub3NlVG9UYWlsIHx8IGZhbHNlXHJcbiAgICB0aGlzLm9wdGlvbnMuZXh0ZW5kID0gb3B0aW9ucy5leHRlbmQgfHwgZmFsc2VcclxuICAgIHRoaXMub3B0aW9ucy5yb3RhdGUgPSAob3B0aW9ucy5yb3RhdGUgfHwgb3B0aW9ucy5yb3RhdGUgPT09IGZhbHNlKSA/IG9wdGlvbnMucm90YXRlIDogdHJ1ZVxyXG4gICAgdGhpcy5vcHRpb25zLnNwYWNlID0gb3B0aW9ucy5zcGFjZSB8fCAxXHJcbiAgICB0aGlzLm9wdGlvbnMuc3BlZWQgPSBvcHRpb25zLnNwZWVkIHx8IDEwXHJcbiAgICAvLyB0aGlzLm9wdGlvbnMuZGFzaFNpemUgPSBvcHRpb25zLmRhc2hTaXplIHx8IDAuMDNcclxuICAgIHRoaXMub3B0aW9ucy53b3Jkc05hbWUgPSBvcHRpb25zLndvcmRzTmFtZSB8fCAwXHJcbiAgICB0aGlzLm9wdGlvbnMuZXh0ZW5kV2lkdGggPVxyXG4gICAgICBvcHRpb25zLmV4dGVuZFdpZHRoIHx8IG9wdGlvbnMuZXh0ZW5kV2lkdGggPT09IDBcclxuICAgICAgICA/IG9wdGlvbnMuZXh0ZW5kV2lkdGhcclxuICAgICAgICA6IDEwXHJcbiAgICB0aGlzLm9wdGlvbnMuZXh0ZW5kQ29sb3IgPSBvcHRpb25zLmV4dGVuZENvbG9yIHx8ICdyZ2JhKDI1NSwyNTUsODAsMC4zKSdcclxuICAgIHRoaXMub3B0aW9ucy5zaG93ID1cclxuICAgICAgb3B0aW9ucy5zaG93IHx8IG9wdGlvbnMuc2hvdyA9PT0gZmFsc2UgPyBvcHRpb25zLnNob3cgOiB0cnVlXHJcbiAgICB0aGlzLm9wdGlvbnMuaGVpZ2h0TW9kZSA9IChvcHRpb25zLmhlaWdodE1vZGUgfHwgb3B0aW9ucy5oZWlnaHRNb2RlID09IDApID8gb3B0aW9ucy5oZWlnaHRNb2RlIDogMlxyXG4gICAgdGhpcy5fZWxtcyA9IFtdXHJcbiAgICBvcHRpb25zLmxhYmVsID0gb3B0aW9ucy5sYWJlbCB8fCB7fVxyXG4gICAgdGhpcy5vcHRpb25zLmxhYmVsID0ge1xyXG4gICAgICB0ZXh0OiB0aGlzLm9wdGlvbnMubmFtZSxcclxuICAgICAgc2hvdzogb3B0aW9ucy5sYWJlbC5zaG93IHx8IGZhbHNlLFxyXG4gICAgICBwb3NpdGlvbjogb3B0aW9ucy5sYWJlbC5wb3NpdGlvbixcclxuICAgICAgZm9udFNpemU6XHJcbiAgICAgICAgb3B0aW9ucy5sYWJlbC5mb250U2l6ZSB8fCBvcHRpb25zLmxhYmVsLmZvbnRTaXplID09PSAwXHJcbiAgICAgICAgICA/IG9wdGlvbnMubGFiZWwuZm9udFNpemVcclxuICAgICAgICAgIDogMjAsXHJcbiAgICAgIGZvbnRGYW1pbHk6IG9wdGlvbnMubGFiZWwuZm9udEZhbWlseSA/IG9wdGlvbnMubGFiZWwuZm9udEZhbWlseSA6IDAsXHJcbiAgICAgIGNvbG9yOiBvcHRpb25zLmxhYmVsLmNvbG9yIHx8ICcjZmZmZmZmJyxcclxuICAgICAgbGluZVdpZHRoOlxyXG4gICAgICAgIG9wdGlvbnMubGFiZWwubGluZVdpZHRoIHx8IG9wdGlvbnMubGFiZWwubGluZVdpZHRoID09PSAwXHJcbiAgICAgICAgICA/IG9wdGlvbnMubGFiZWwubGluZVdpZHRoXHJcbiAgICAgICAgICA6IDQsXHJcbiAgICAgIHBpeGVsT2Zmc2V0OlxyXG4gICAgICAgIG9wdGlvbnMubGFiZWwucGl4ZWxPZmZzZXQgfHwgb3B0aW9ucy5sYWJlbC5waXhlbE9mZnNldCA9PT0gMFxyXG4gICAgICAgICAgPyBvcHRpb25zLmxhYmVsLnBpeGVsT2Zmc2V0XHJcbiAgICAgICAgICA6IDIwLFxyXG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6IG9wdGlvbnMubGFiZWwuYmFja2dyb3VuZENvbG9yIHx8IFsnIzAwZmZmZjgwJywgJyMwMGZmZmY4MCddLFxyXG4gICAgICBsaW5lQ29sb3I6IG9wdGlvbnMubGFiZWwubGluZUNvbG9yIHx8ICcjMDBmZmZmODAnLFxyXG4gICAgICBzY2FsZUJ5RGlzdGFuY2U6IG9wdGlvbnMubGFiZWwuc2NhbGVCeURpc3RhbmNlIHx8IGZhbHNlLFxyXG4gICAgICBuZWFyOlxyXG4gICAgICAgIG9wdGlvbnMubGFiZWwubmVhciB8fCBvcHRpb25zLmxhYmVsLm5lYXIgPT09IDBcclxuICAgICAgICAgID8gb3B0aW9ucy5sYWJlbC5uZWFyXHJcbiAgICAgICAgICA6IDIwMDAsXHJcbiAgICAgIGZhcjpcclxuICAgICAgICBvcHRpb25zLmxhYmVsLmZhciB8fCBvcHRpb25zLmxhYmVsLmZhciA9PT0gMFxyXG4gICAgICAgICAgPyBvcHRpb25zLmxhYmVsLmZhclxyXG4gICAgICAgICAgOiAxMDAwMDBcclxuICAgIH1cclxuICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUgPSBvcHRpb25zLmF0dHJpYnV0ZSB8fCB7fVxyXG4gICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rIHx8IHt9XHJcbiAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudCA9XHJcbiAgICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50IHx8IFtdXHJcbiAgICAvLyB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmNhbWVyYSA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUuY2FtZXJhIHx8IHt9XHJcbiAgICAvLyB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmNhbWVyYS5jb250ZW50ID1cclxuICAgIC8vICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5jYW1lcmEuY29udGVudCB8fCBbXVxyXG4gICAgLy8gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52ciA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIgfHwge31cclxuICAgIC8vIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudCA9XHJcbiAgICAvLyAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudCB8fCBbXVxyXG4gICAgLy8gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5nb29kcyA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUuZ29vZHMgfHwge31cclxuICAgIC8vIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUuZ29vZHMuY29udGVudCA9XHJcbiAgICAvLyAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUuZ29vZHMuY29udGVudCB8fCBbXVxyXG5cclxuXHJcbiAgICAgIGRlbGV0ZSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmNhbWVyYVxyXG4gICAgICBkZWxldGUgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52clxyXG4gICAgICBkZWxldGUgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5nb29kc1xyXG5cclxuXHJcbiAgICB0aGlzLm9wZXJhdGUgPSB7fVxyXG4gICAgdGhpcy5ub2RlUG9pbnRzID0gW11cclxuICAgIHRoaXMudW5pdE51bSA9IDBcclxuICAgIHRoaXMuaW5wdXRTcGVlZCA9IChvcHRpb25zLnNwZWVkICYmIE1hdGgucG93KG9wdGlvbnMuc3BlZWQsIC0xKSAqIDEwMCkgfHwgMTBcclxuICAgIHRoaXMuRGlhbG9nID0gX0RpYWxvZ1xyXG4gICAgaWYgKCF0aGlzLm9wdGlvbnMucG9zaXRpb25zIHx8IHRoaXMub3B0aW9ucy5wb3NpdGlvbnMubGVuZ3RoIDwgMikge1xyXG4gICAgICB0aGlzLl9lcnJvciA9ICfnur/mrrXmnIDlsJHpnIDopoHkuKTkuKrlnZDmoIfvvIEnXHJcbiAgICAgIGNvbnNvbGUud2Fybih0aGlzLl9lcnJvcilcclxuICAgIH0gZWxzZSB7XHJcblxyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMub3B0aW9ucy5wb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxuZyA9IE51bWJlcihOdW1iZXIodGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sbmcpLnRvRml4ZWQoOCkpXHJcbiAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sYXQgPSBOdW1iZXIoTnVtYmVyKHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubGF0KS50b0ZpeGVkKDgpKVxyXG4gICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0uYWx0ID0gTnVtYmVyKE51bWJlcih0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmFsdCkudG9GaXhlZCgyKSlcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5zZGsuYWRkSW5jZXRhbmNlKHRoaXMub3B0aW9ucy5pZCwgdGhpcylcclxuICAgICAgQ3VydmVsaW5lT2JqZWN0LmNyZWF0ZSh0aGlzKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IGNvbG9yKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5jb2xvclxyXG4gIH1cclxuICBzZXQgY29sb3Iodikge1xyXG4gICAgdGhpcy5vcHRpb25zLmNvbG9yID0gdiB8fCAnI2ZmMDAwMCdcclxuICAgIC8vIHRoaXMuZW50aXR5LnBvbHlsaW5lLm1hdGVyaWFsID0gdGhpcy5nZXRNYXRlcmlhbCh2LCB0aGlzLm9wdGlvbnMudHlwZSlcclxuICAgIGxldCBwYXJhbXMgPSB7IC4uLnRoaXMub3B0aW9ucyB9XHJcbiAgICBwYXJhbXMuc3BlZWQgPSB0aGlzLmlucHV0U3BlZWRcclxuICAgIC8vIHRoaXMuZW50aXR5LnBvbHlsaW5lLm1hdGVyaWFsID0gdGhpcy5nZXRNYXRlcmlhbCh0aGlzLm9wdGlvbnMuY29sb3IsIHRoaXMub3B0aW9ucy50eXBlLCB0aGlzLmVudGl0eSwgdGhpcy5vcHRpb25zKVxyXG4gICAgdGhpcy5lbnRpdHkucG9seWxpbmUubWF0ZXJpYWwgPSB0aGlzLmdldE1hdGVyaWFsKHRoaXMub3B0aW9ucy5jb2xvciwgdGhpcy5vcHRpb25zLnR5cGUsIHRoaXMuZW50aXR5LCBwYXJhbXMpXHJcbiAgICBpZiAodGhpcy5fZWxtcy5jb2xvcikge1xyXG4gICAgICB0aGlzLl9lbG1zLmNvbG9yLmZvckVhY2goKGl0ZW0sIGkpID0+IHtcclxuICAgICAgICBsZXQgY29sb3JQaWNrZXIgPSBuZXcgWUpDb2xvclBpY2tlcih7XHJcbiAgICAgICAgICBlbDogaXRlbS5lbCxcclxuICAgICAgICAgIHNpemU6ICdtaW5pJywgLy/popzoibJib3jnsbvlnotcclxuICAgICAgICAgIGFscGhhOiB0cnVlLCAvL+aYr+WQpuW8gOWQr+mAj+aYjuW6plxyXG4gICAgICAgICAgZGVmYXVsdENvbG9yOiB0aGlzLm9wdGlvbnMuY29sb3IsXHJcbiAgICAgICAgICBkaXNhYmxlZDogZmFsc2UsIC8v5piv5ZCm56aB5q2i5omT5byA6aKc6Imy6YCJ5oup5ZmoXHJcbiAgICAgICAgICBvcGVuUGlja2VyQW5pOiAnb3BhY2l0eScsIC8v5omT5byA6aKc6Imy6YCJ5oup5Zmo5Yqo55S7XHJcbiAgICAgICAgICBzdXJlOiBjID0+IHtcclxuICAgICAgICAgICAgdGhpcy5jb2xvciA9IGNcclxuICAgICAgICAgIH0sIC8v54K55Ye756Gu6K6k5oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgICAgICBjbGVhcjogKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmNvbG9yID0gJ3JnYmEoMjU1LDAsMCwxKSdcclxuICAgICAgICAgIH0gLy/ngrnlh7vmuIXnqbrmjInpkq7kuovku7blm57osINcclxuICAgICAgICB9KVxyXG4gICAgICAgIHRoaXMuX2VsbXMuY29sb3JbaV0gPSBjb2xvclBpY2tlclxyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gIH1cclxuICBnZXQgc3BlZWQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLnNwZWVkXHJcbiAgfVxyXG5cclxuICBzZXQgc3BlZWQodikge1xyXG4gICAgdGhpcy5vcHRpb25zLnNwZWVkID0gdlxyXG4gICAgLy8gdGhpcy5vcHRpb25zLnNwZWVkID0gdiAhPT0gMCA/IE1hdGgucG93KHYsIC0xKSAqIDEwMCA6IDBcclxuICAgIHRoaXMuaW5wdXRTcGVlZCA9IHYgIT09IDAgPyBNYXRoLnBvdyh2LCAtMSkgKiAxMDAgOiAwXHJcbiAgICBsZXQgcGFyYW1zID0geyAuLi50aGlzLm9wdGlvbnMgfVxyXG4gICAgcGFyYW1zLnNwZWVkID0gdGhpcy5pbnB1dFNwZWVkXHJcbiAgICAvLyB0aGlzLmVudGl0eS5wb2x5bGluZS5tYXRlcmlhbCA9IHRoaXMuZ2V0TWF0ZXJpYWwodGhpcy5vcHRpb25zLmNvbG9yLCB0aGlzLm9wdGlvbnMudHlwZSwgdGhpcy5lbnRpdHksIHRoaXMub3B0aW9ucylcclxuICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLm1hdGVyaWFsID0gdGhpcy5nZXRNYXRlcmlhbCh0aGlzLm9wdGlvbnMuY29sb3IsIHRoaXMub3B0aW9ucy50eXBlLCB0aGlzLmVudGl0eSwgcGFyYW1zKVxyXG4gIH1cclxuICAvLyBnZXQgZGFzaFNpemUoKSB7XHJcbiAgLy8gICByZXR1cm4gdGhpcy5vcHRpb25zLmRhc2hTaXplXHJcbiAgLy8gfVxyXG5cclxuICAvLyBzZXQgZGFzaFNpemUodikge1xyXG4gIC8vICAgdGhpcy5vcHRpb25zLmRhc2hTaXplID0gdlxyXG4gIC8vICAgbGV0IHBhcmFtcyA9IHsgLi4udGhpcy5vcHRpb25zIH1cclxuICAvLyAgIHBhcmFtcy5zcGVlZCA9IHRoaXMuaW5wdXRTcGVlZFxyXG4gIC8vICAgLy8gdGhpcy5lbnRpdHkucG9seWxpbmUubWF0ZXJpYWwgPSB0aGlzLmdldE1hdGVyaWFsKHRoaXMub3B0aW9ucy5jb2xvciwgdGhpcy5vcHRpb25zLnR5cGUsIHRoaXMuZW50aXR5LCB0aGlzLm9wdGlvbnMpXHJcbiAgLy8gICB0aGlzLmVudGl0eS5wb2x5bGluZS5tYXRlcmlhbCA9IHRoaXMuZ2V0TWF0ZXJpYWwodGhpcy5vcHRpb25zLmNvbG9yLCB0aGlzLm9wdGlvbnMudHlwZSwgdGhpcy5lbnRpdHksIHBhcmFtcylcclxuICAvLyB9XHJcblxyXG4gIGdldCByb3RhdGUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLnJvdGF0ZVxyXG4gIH1cclxuXHJcbiAgc2V0IHJvdGF0ZSh2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMucm90YXRlID0gdlxyXG4gICAgdGhpcy5jbG9zZU5vZGVFZGl0KClcclxuICAgIHRoaXMuX2VsbXMucm90YXRlICYmXHJcbiAgICAgIHRoaXMuX2VsbXMucm90YXRlLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgaXRlbS5jaGVja2VkID0gdlxyXG4gICAgICB9KVxyXG5cclxuICAgIHRoaXMub3B0aW9ucy5yb3RhdGUgPSB2XHJcbiAgICB0aGlzLmVudGl0eS5wb2x5bGluZS5tYXRlcmlhbCA9IHRoaXMuZ2V0TWF0ZXJpYWwodGhpcy5vcHRpb25zLmNvbG9yLCB0aGlzLm9wdGlvbnMudHlwZSwgdGhpcy5lbnRpdHksIHRoaXMub3B0aW9ucylcclxuICB9XHJcblxyXG4gIGdldCBzcGFjZSgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuc3BhY2VcclxuICB9XHJcblxyXG4gIHNldCBzcGFjZSh2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMuc3BhY2UgPSB2XHJcbiAgICBsZXQgcGFyYW1zID0geyAuLi50aGlzLm9wdGlvbnMgfVxyXG4gICAgcGFyYW1zLnNwZWVkID0gdGhpcy5pbnB1dFNwZWVkXHJcbiAgICAvLyB0aGlzLmVudGl0eS5wb2x5bGluZS5tYXRlcmlhbCA9IHRoaXMuZ2V0TWF0ZXJpYWwodGhpcy5vcHRpb25zLmNvbG9yLCB0aGlzLm9wdGlvbnMudHlwZSwgdGhpcy5lbnRpdHksIHRoaXMub3B0aW9ucylcclxuICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLm1hdGVyaWFsID0gdGhpcy5nZXRNYXRlcmlhbCh0aGlzLm9wdGlvbnMuY29sb3IsIHRoaXMub3B0aW9ucy50eXBlLCB0aGlzLmVudGl0eSwgcGFyYW1zKVxyXG4gIH1cclxuXHJcbiAgZ2V0IHdvcmRzTmFtZSgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMud29yZHNOYW1lXHJcbiAgfVxyXG4gIHNldCB3b3Jkc05hbWUodikge1xyXG4gICAgdGhpcy5vcHRpb25zLndvcmRzTmFtZSA9IHZcclxuXHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzXHJcbiAgICBpZiAoIXRoaXMubm9zZVRvVGFpbCkge1xyXG4gICAgICB0aGlzLmNvbXB1dGVEaXN0YW5jZShcclxuICAgICAgICB0aGlzLnNtb290aEhhbmRsZSh0aGlzLm9wdGlvbnMucG9zaXRpb25zKSxcclxuICAgICAgICAyLFxyXG4gICAgICAgIHZcclxuICAgICAgKS50aGVuKHJlcyA9PiB7XHJcbiAgICAgICAgX3RoaXMubGVuZ3RoQnlNZXRlciA9IHJlc1xyXG4gICAgICAgIHRoaXMubGVuZ3RoQ2hhbmdlQ2FsbEJhY2sgJiYgdGhpcy5sZW5ndGhDaGFuZ2VDYWxsQmFjaygpXHJcbiAgICAgIH0pXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBsZXQgZnJvbURlZ3JlZXNBcnJheSA9IHRoaXMucmVuZXdQb3NpdGlvbnModGhpcy5vcHRpb25zLnBvc2l0aW9ucylcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIGdldCBmaXRMZW5ndGhVbml0KCkge1xyXG4gIC8vICAgcmV0dXJuIHRoaXMub3B0aW9uc1snZml0LWxlbmd0aC11bml0J11cclxuICAvLyB9XHJcbiAgLy8gc2V0IGZpdExlbmd0aFVuaXQodikge1xyXG4gIC8vICAgdGhpcy5vcHRpb25zWydmaXQtbGVuZ3RoLXVuaXQnXSA9IHZcclxuICAvLyAgIHRoaXMuX2VsbXMuZml0TGVuZ3RoVW5pdCAmJlxyXG4gIC8vICAgICB0aGlzLl9lbG1zLmZpdExlbmd0aFVuaXQuZm9yRWFjaChpdGVtID0+IHtcclxuICAvLyAgICAgICBpdGVtLnZhbHVlID0gdlxyXG4gIC8vICAgICB9KVxyXG4gIC8vICAgaWYgKHRoaXMub3B0aW9ucy5maXRMZW5ndGhCeU1ldGVyKSB7XHJcbiAgLy8gICAgIHN3aXRjaCAodikge1xyXG4gIC8vICAgICAgIGNhc2UgJ+exsyc6XHJcbiAgLy8gICAgICAgICB0aGlzLmZpdExlbmd0aCA9IHRoaXMub3B0aW9ucy5maXRMZW5ndGhCeU1ldGVyXHJcbiAgLy8gICAgICAgICBicmVha1xyXG4gIC8vICAgICAgIGNhc2UgJ+WNg+exsyc6XHJcbiAgLy8gICAgICAgICB0aGlzLmZpdExlbmd0aCA9IE51bWJlcihcclxuICAvLyAgICAgICAgICAgKHRoaXMub3B0aW9ucy5maXRMZW5ndGhCeU1ldGVyIC8gMTAwMCkudG9GaXhlZCg1KVxyXG4gIC8vICAgICAgICAgKVxyXG4gIC8vICAgICAgICAgYnJlYWtcclxuICAvLyAgICAgICBkZWZhdWx0OlxyXG4gIC8vICAgICAgICAgdGhpcy5maXRMZW5ndGggPSB0aGlzLm9wdGlvbnMuZml0TGVuZ3RoQnlNZXRlclxyXG4gIC8vICAgICB9XHJcbiAgLy8gICB9XHJcbiAgLy8gfVxyXG5cclxuICBnZXQgbGluZVdpZHRoKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy53aWR0aFxyXG4gIH1cclxuXHJcbiAgc2V0IGxpbmVXaWR0aCh2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMud2lkdGggPSAodiB8fCB2ID09IDApID8gdiA6IDNcclxuICAgIHRoaXMuX2VsbXMubGluZVdpZHRoICYmXHJcbiAgICAgIHRoaXMuX2VsbXMubGluZVdpZHRoLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgaXRlbS52YWx1ZSA9IHRoaXMub3B0aW9ucy53aWR0aFxyXG4gICAgICB9KVxyXG4gICAgaWYgKHRoaXMuZW50aXR5ICYmIHRoaXMuZW50aXR5LnBvbHlsaW5lKSB7XHJcbiAgICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLndpZHRoID0gdGhpcy5lbnRpdHkucG9seWxpbmUud2lkdGggKyB2IC0gdGhpcy5lbnRpdHkucG9seWxpbmUub3JpV2lkdGhcclxuICAgICAgdGhpcy5lbnRpdHkucG9seWxpbmUub3JpV2lkdGggPSB0aGlzLm9wdGlvbnMud2lkdGhcclxuICAgIH1cclxuICAgIC8vIHRoaXMuZW50aXR5ICYmXHJcbiAgICAvLyAgIHRoaXMuZW50aXR5LnBvbHlsaW5lICYmXHJcbiAgICAvLyAgICh0aGlzLmVudGl0eS5wb2x5bGluZS53aWR0aCA9IHRoaXMub3B0aW9ucy53aWR0aCkgJiYgKHRoaXMuZW50aXR5LnBvbHlsaW5lLm9yaVdpZHRoID0gdGhpcy5vcHRpb25zLndpZHRoKVxyXG4gIH1cclxuXHJcbiAgZ2V0IGxpbmVUeXBlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy50eXBlXHJcbiAgfVxyXG5cclxuICBzZXQgbGluZVR5cGUodikge1xyXG4gICAgbGV0IGxpbmVUeXBlRGF0YSA9IFtcclxuICAgICAge1xyXG4gICAgICAgIG5hbWU6ICc8aSBjbGFzcz1cImljb24gbGluZVwiPjwvaT7lrp7nur8nLFxyXG4gICAgICAgIHZhbHVlOiAn5a6e57q/JyxcclxuICAgICAgICBrZXk6IDAsXHJcbiAgICAgICAgaWNvbjogJ2xpbmUnXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBuYW1lOiAnPGkgY2xhc3M9XCJpY29uIGRhc2gtbGluZVwiPjwvaT7omZrnur8nLFxyXG4gICAgICAgIHZhbHVlOiAn6Jma57q/JyxcclxuICAgICAgICBrZXk6IDEsXHJcbiAgICAgICAgaWNvbjogJ2Rhc2gtbGluZSdcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIG5hbWU6ICc8aSBjbGFzcz1cImljb24gbGlnaHQtbGluZVwiPjwvaT7ms5vlhYknLFxyXG4gICAgICAgIHZhbHVlOiAn5rOb5YWJJyxcclxuICAgICAgICBrZXk6IDIsXHJcbiAgICAgICAgaWNvbjogJ2xpZ2h0LWxpbmUnXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBuYW1lOiAnPGkgY2xhc3M9XCJpY29uIHRhaWwtbGluZVwiPjwvaT7lsL7ov7nlhYnnur8nLFxyXG4gICAgICAgIHZhbHVlOiAn5bC+6L+55YWJ57q/JyxcclxuICAgICAgICBrZXk6IDMsXHJcbiAgICAgICAgaWNvbjogJ3RhaWwtbGluZSdcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIG5hbWU6ICc8aSBjbGFzcz1cImljb24gbXVsdC10YWlsLWxpbmVcIj48L2k+5aSa5bC+6L+55YWJ57q/JyxcclxuICAgICAgICB2YWx1ZTogJ+WkmuWwvui/ueWFiee6vycsXHJcbiAgICAgICAga2V5OiA0LFxyXG4gICAgICAgIGljb246ICdtdWx0LXRhaWwtbGluZSdcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIG5hbWU6ICc8aSBjbGFzcz1cImljb24gZmxvdy1kYXNoLWxpbmUxXCI+PC9pPua1geWKqOiZmue6vzEnLFxyXG4gICAgICAgIHZhbHVlOiAn5rWB5Yqo6Jma57q/MScsXHJcbiAgICAgICAga2V5OiA1LFxyXG4gICAgICAgIGljb246ICdmbG93LWRhc2gtbGluZTEnXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBuYW1lOiAnPGkgY2xhc3M9XCJpY29uIGZsb3ctZGFzaC1saW5lMlwiPjwvaT7mtYHliqjomZrnur8yJyxcclxuICAgICAgICB2YWx1ZTogJ+a1geWKqOiZmue6vzInLFxyXG4gICAgICAgIGtleTogNixcclxuICAgICAgICBpY29uOiAnZmxvdy1kYXNoLWxpbmUyJ1xyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgbmFtZTogJzxpIGNsYXNzPVwiaWNvbiBwaWMtbGluZTFcIj48L2k+5rWB5Yqo566t5aS0MScsXHJcbiAgICAgICAgdmFsdWU6ICfmtYHliqjnrq3lpLQxJyxcclxuICAgICAgICBrZXk6IDcsXHJcbiAgICAgICAgaWNvbjogJ3BpYy1saW5lMSdcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIG5hbWU6ICc8aSBjbGFzcz1cImljb24gcGljLWxpbmUyXCI+PC9pPua1geWKqOeureWktDInLFxyXG4gICAgICAgIHZhbHVlOiAn5rWB5Yqo566t5aS0MicsXHJcbiAgICAgICAga2V5OiA4LFxyXG4gICAgICAgIGljb246ICdwaWMtbGluZTInXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBuYW1lOiAnPGkgY2xhc3M9XCJpY29uIHBpYy1saW5lM1wiPjwvaT7mtYHliqjnrq3lpLQzJyxcclxuICAgICAgICB2YWx1ZTogJ+a1geWKqOeureWktDMnLFxyXG4gICAgICAgIGtleTogOSxcclxuICAgICAgICBpY29uOiAncGljLWxpbmUzJ1xyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgbmFtZTogJzxpIGNsYXNzPVwiaWNvbiBwaWMtbGluZTRcIj48L2k+5rWB5Yqo566t5aS0NCcsXHJcbiAgICAgICAgdmFsdWU6ICfmtYHliqjnrq3lpLQ0JyxcclxuICAgICAgICBrZXk6IDEwLFxyXG4gICAgICAgIGljb246ICdwaWMtbGluZTQnXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBuYW1lOiAnPGkgY2xhc3M9XCJpY29uIHBpYy1saW5lNVwiPjwvaT7mtYHliqjnrq3lpLQ1JyxcclxuICAgICAgICB2YWx1ZTogJ+a1geWKqOeureWktDUnLFxyXG4gICAgICAgIGtleTogMTEsXHJcbiAgICAgICAgaWNvbjogJ3BpYy1saW5lNSdcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIG5hbWU6ICc8aSBjbGFzcz1cImljb24gcGljLWxpbmU2XCI+PC9pPua1geWKqOeureWktDYnLFxyXG4gICAgICAgIHZhbHVlOiAn5rWB5Yqo566t5aS0NicsXHJcbiAgICAgICAga2V5OiAxMixcclxuICAgICAgICBpY29uOiAncGljLWxpbmU2J1xyXG4gICAgICB9XHJcbiAgICBdXHJcbiAgICB0aGlzLm9wdGlvbnMudHlwZSA9IE51bWJlcih2KVxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lVHlwZURhdGEubGVuZ3RoOyBpKyspIHtcclxuICAgICAgaWYgKGxpbmVUeXBlRGF0YVtpXS5rZXkgPT09IE51bWJlcih2KSkge1xyXG4gICAgICAgIHRoaXMuX2VsbXMubGluZVR5cGUgJiZcclxuICAgICAgICAgIHRoaXMuX2VsbXMubGluZVR5cGUuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICAgICAgaXRlbS52YWx1ZSA9IGxpbmVUeXBlRGF0YVtpXS52YWx1ZVxyXG4gICAgICAgICAgICBpZiAoMiA8IGl0ZW0udmFsdWUgJiYgaXRlbS52YWx1ZSA8IDEzKSB7Ly/otLTlm77lj4LmlbBcclxuICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGFzaFRleHR1cmVEb20nKSAmJiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rhc2hUZXh0dXJlRG9tJykuc3R5bGUuZGlzcGxheSA9ICdmbGV4JylcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGFzaFRleHR1cmVEb20nKSAmJiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rhc2hUZXh0dXJlRG9tJykuc3R5bGUuZGlzcGxheSA9ICdub25lJylcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoMiA8IGl0ZW0udmFsdWUgJiYgaXRlbS52YWx1ZSA8IDUpIHsvL+Wwvui/ueWPguaVsFxyXG4gICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xpbmVTcGFjZScpWzBdICYmIChkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdsaW5lU3BhY2UnKVswXS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnKVxyXG4gICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xpbmVTcGFjZScpWzFdICYmIChkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdsaW5lU3BhY2UnKVsxXS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnKVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xpbmVTcGFjZScpWzBdICYmIChkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdsaW5lU3BhY2UnKVswXS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnKVxyXG4gICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xpbmVTcGFjZScpWzFdICYmIChkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdsaW5lU3BhY2UnKVsxXS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIGJyZWFrXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGxldCBwYXJhbXMgPSB7IC4uLnRoaXMub3B0aW9ucyB9XHJcbiAgICBwYXJhbXMuc3BlZWQgPSB0aGlzLmlucHV0U3BlZWRcclxuICAgIHRoaXMuZW50aXR5ICYmXHJcbiAgICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lICYmXHJcbiAgICAgICh0aGlzLmVudGl0eS5wb2x5bGluZS5tYXRlcmlhbCA9IHRoaXMuZ2V0TWF0ZXJpYWwoXHJcbiAgICAgICAgdGhpcy5vcHRpb25zLmNvbG9yLFxyXG4gICAgICAgIHRoaXMub3B0aW9ucy50eXBlLFxyXG4gICAgICAgIHRoaXMuZW50aXR5LFxyXG4gICAgICAgIHBhcmFtc1xyXG4gICAgICApKVxyXG4gIH1cclxuICBnZXQgbm9zZVRvVGFpbCgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubm9zZVRvVGFpbFxyXG4gIH1cclxuXHJcbiAgc2V0IG5vc2VUb1RhaWwodikge1xyXG4gICAgdGhpcy5vcHRpb25zLm5vc2VUb1RhaWwgPSB2XHJcbiAgICB0aGlzLmNsb3NlTm9kZUVkaXQoKVxyXG4gICAgdGhpcy5fZWxtcy5ub3NlVG9UYWlsICYmXHJcbiAgICAgIHRoaXMuX2VsbXMubm9zZVRvVGFpbC5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgIGl0ZW0uY2hlY2tlZCA9IHZcclxuICAgICAgfSlcclxuICAgIGlmICh0aGlzLmVudGl0eSkge1xyXG4gICAgICBsZXQgZnJvbURlZ3JlZXNBcnJheSA9IHRoaXMucmVuZXdQb3NpdGlvbnModGhpcy5vcHRpb25zLnBvc2l0aW9ucylcclxuICAgICAgdGhpcy5lbnRpdHkucG9seWxpbmUucG9zaXRpb25zID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXNBcnJheUhlaWdodHMoXHJcbiAgICAgICAgZnJvbURlZ3JlZXNBcnJheVxyXG4gICAgICApXHJcbiAgICAgIHRoaXMucmVuZXdQb2x5Z29uKGZyb21EZWdyZWVzQXJyYXkpXHJcbiAgICB9XHJcbiAgICAvLyBpZiAodikge1xyXG4gICAgLy8gICBpZiAodGhpcy5vcHRpb25zLmZpdExlbmd0aEJ5TWV0ZXIgPiAxMDAwIHx8IHRoaXMub3B0aW9ucy5maXRMZW5ndGhCeU1ldGVyID09IDEwMDApIHtcclxuICAgIC8vICAgICBsZXQgZG9tID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaW5wdXQtc2VsZWN0LXVuaXQnKVsxXVxyXG4gICAgLy8gICAgIGRvbSAmJiBkb20ucXVlcnlTZWxlY3RvckFsbCgnZGQnKVsxXSAmJiBkb20ucXVlcnlTZWxlY3RvckFsbCgnZGQnKVsxXS5jbGljaygpXHJcbiAgICAvLyAgIH0gZWxzZSB7XHJcbiAgICAvLyAgICAgbGV0IGRvbSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2lucHV0LXNlbGVjdC11bml0JylbMV1cclxuICAgIC8vICAgICBkb20gJiYgZG9tLnF1ZXJ5U2VsZWN0b3JBbGwoJ2RkJylbMF0gJiYgZG9tLnF1ZXJ5U2VsZWN0b3JBbGwoJ2RkJylbMF0uY2xpY2soKVxyXG4gICAgLy8gICB9XHJcblxyXG4gICAgLy8gfSBlbHNlIHtcclxuICAgIC8vICAgaWYgKHRoaXMub3B0aW9ucy5sZW5ndGhCeU1ldGVyID4gMTAwMCB8fCB0aGlzLm9wdGlvbnMubGVuZ3RoQnlNZXRlciA9PSAxMDAwKSB7XHJcbiAgICAvLyAgICAgbGV0IGRvbSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2lucHV0LXNlbGVjdC11bml0JylbMV1cclxuICAgIC8vICAgICBkb20gJiYgZG9tLnF1ZXJ5U2VsZWN0b3JBbGwoJ2RkJylbMV0gJiYgZG9tLnF1ZXJ5U2VsZWN0b3JBbGwoJ2RkJylbMV0uY2xpY2soKVxyXG4gICAgLy8gICB9IGVsc2Uge1xyXG4gICAgLy8gICAgIGxldCBkb20gPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdpbnB1dC1zZWxlY3QtdW5pdCcpWzFdXHJcbiAgICAvLyAgICAgZG9tICYmIGRvbS5xdWVyeVNlbGVjdG9yQWxsKCdkZCcpWzBdICYmIGRvbS5xdWVyeVNlbGVjdG9yQWxsKCdkZCcpWzBdLmNsaWNrKClcclxuICAgIC8vICAgfVxyXG4gICAgLy8gfVxyXG4gIH1cclxuXHJcblxyXG4gIGdldCBoZWlnaHRNb2RlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5oZWlnaHRNb2RlID8gdGhpcy5vcHRpb25zLmhlaWdodE1vZGUgOiAwXHJcbiAgfVxyXG4gIHNldCBoZWlnaHRNb2RlKHYpIHtcclxuICAgIHRoaXMucG9zaXRpb25FZGl0aW5nID0gZmFsc2VcclxuICAgIHRoaXMub3B0aW9ucy5oZWlnaHRNb2RlID0gKHYgfHwgdiA9PSAwKSA/IHYgOiAyXHJcbiAgICBsZXQgaGVpZ2h0TW9kZU5hbWUgPSAnJ1xyXG4gICAgdGhpcy5jbG9zZU5vZGVFZGl0KClcclxuICAgIGxldCBncm91bmQgPSBmYWxzZVxyXG4gICAgbGV0IGRpc2FibGVkID0gZmFsc2VcclxuICAgIGxldCBmcm9tRGVncmVlc0FycmF5ID0gdGhpcy5yZW5ld1Bvc2l0aW9ucyh0aGlzLm9wdGlvbnMucG9zaXRpb25zKVxyXG4gICAgdGhpcy5lbnRpdHkucG9seWxpbmUucG9zaXRpb25zID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXNBcnJheUhlaWdodHMoXHJcbiAgICAgIGZyb21EZWdyZWVzQXJyYXlcclxuICAgIClcclxuICAgIHRoaXMucmVuZXdQb2x5Z29uKGZyb21EZWdyZWVzQXJyYXkpXHJcbiAgICBzd2l0Y2ggKHRoaXMub3B0aW9ucy5oZWlnaHRNb2RlKSB7XHJcbiAgICAgIGNhc2UgJzAnOlxyXG4gICAgICBjYXNlIDA6XHJcbiAgICAgICAgdGhpcy5lbnRpdHkucG9seWxpbmUuY2xhbXBUb0dyb3VuZCA9IGdyb3VuZFxyXG4gICAgICAgIHRoaXMuZXh0ZW5kID0gZmFsc2VcclxuICAgICAgICBoZWlnaHRNb2RlTmFtZSA9ICfmtbfmi5Tpq5jluqYnXHJcbiAgICAgICAgYnJlYWtcclxuICAgICAgY2FzZSAnMSc6XHJcbiAgICAgIGNhc2UgMTpcclxuICAgICAgICB0aGlzLmVudGl0eS5wb2x5bGluZS5jbGFtcFRvR3JvdW5kID0gZ3JvdW5kXHJcbiAgICAgICAgdGhpcy5leHRlbmQgPSBmYWxzZVxyXG4gICAgICAgIGhlaWdodE1vZGVOYW1lID0gJ+ebuOWvueWcsOihqCdcclxuICAgICAgICBicmVha1xyXG4gICAgICBjYXNlICcyJzpcclxuICAgICAgY2FzZSAyOlxyXG4gICAgICAgIGdyb3VuZCA9IHRydWVcclxuICAgICAgICBkaXNhYmxlZCA9IHRydWVcclxuICAgICAgICB0aGlzLmVudGl0eS5wb2x5bGluZS5jbGFtcFRvR3JvdW5kID0gZ3JvdW5kXHJcbiAgICAgICAgaGVpZ2h0TW9kZU5hbWUgPSAn5L6d6ZmE5qih5Z6LJ1xyXG4gICAgICAgIGJyZWFrXHJcbiAgICB9XHJcblxyXG4gICAgLy8gdGhpcy5vcHRpb25zLmxlbmd0aEJ5TWV0ZXIgPSB0aGlzLmNvbXB1dGVEaXN0YW5jZTIoXHJcbiAgICAvLyAgIHRoaXMuc21vb3RoSGFuZGxlKHRoaXMub3B0aW9ucy5wb3NpdGlvbnMpLFxyXG4gICAgLy8gICAyLFxyXG4gICAgLy8gICBncm91bmRcclxuICAgIC8vIClcclxuICAgIC8vIHRoaXMubGVuZ3RoVW5pdCA9IHRoaXMubGVuZ3RoVW5pdFxyXG4gICAgdGhpcy5fZWxtcy5oZWlnaHRNb2RlICYmICh0aGlzLl9lbG1zLmhlaWdodE1vZGUudmFsdWUgPSBoZWlnaHRNb2RlTmFtZSlcclxuICAgIHRoaXMuX2VsbXMuaGVpZ2h0TW9kZU9iamVjdCAmJiAodGhpcy5fZWxtcy5oZWlnaHRNb2RlT2JqZWN0LmxlZ3Bfc2VhcmNoQWN0aXZlKFxyXG4gICAgICBoZWlnaHRNb2RlTmFtZVxyXG4gICAgKSlcclxuICAgIGlmIChkaXNhYmxlZCkge1xyXG4gICAgICB0aGlzLl9lbG1zLmhlaWdodEJveCAmJiAodGhpcy5fZWxtcy5oZWlnaHRCb3guY2xhc3NOYW1lID0gJ2lucHV0LW51bWJlciBpbnB1dC1udW1iZXItdW5pdC0xIGhlaWdodC1ib3ggZGlzYWJsZWQnKTtcclxuICAgICAgdGhpcy5fZWxtcy5oZWlnaHRDb25maXJtICYmIHRoaXMuX2VsbXMuaGVpZ2h0Q29uZmlybS5zZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJywgJ2Rpc2FibGVkJyk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5fZWxtcy5oZWlnaHRCb3ggJiYgKHRoaXMuX2VsbXMuaGVpZ2h0Qm94LmNsYXNzTmFtZSA9ICdpbnB1dC1udW1iZXIgaW5wdXQtbnVtYmVyLXVuaXQtMSBoZWlnaHQtYm94Jyk7XHJcbiAgICAgIHRoaXMuX2VsbXMuaGVpZ2h0Q29uZmlybSAmJiB0aGlzLl9lbG1zLmhlaWdodENvbmZpcm0ucmVtb3ZlQXR0cmlidXRlKCdkaXNhYmxlZCcpO1xyXG4gICAgfVxyXG5cclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICBpZiAoZ3JvdW5kKSB7XHJcbiAgICAgICAgdGhpcy5sYWJlbC5ncm91bmQgPSBncm91bmRcclxuICAgICAgICB0aGlzLl9lbG1zLmhlaWdodE1vZGUgJiYgKHRoaXMuX2VsbXMuaGVpZ2h0TW9kZS52YWx1ZSA9ICfkvp3pmYTmqKHlnosnKVxyXG4gICAgICAgIHRoaXMubGFiZWwucG9zaXRpb24gPSBbXHJcbiAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zWzBdLmxuZyxcclxuICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0ubGF0XHJcbiAgICAgICAgXVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRoaXMubGFiZWwuZ3JvdW5kID0gZ3JvdW5kXHJcbiAgICAgICAgdGhpcy5sYWJlbC5wb3NpdGlvbiA9IFtcclxuICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0ubG5nLFxyXG4gICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXS5sYXQsXHJcbiAgICAgICAgICBmcm9tRGVncmVlc0FycmF5WzJdXHJcbiAgICAgICAgXVxyXG4gICAgICAgIHRoaXMub3B0aW9ucy5sYWJlbC5wb3NpdGlvbiA9IHtcclxuICAgICAgICAgIGxuZzogdGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXS5sbmcsXHJcbiAgICAgICAgICBsYXQ6IHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0ubGF0LFxyXG4gICAgICAgICAgYWx0OiBmcm9tRGVncmVlc0FycmF5WzJdXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9LCAwKTtcclxuICB9XHJcblxyXG4gIGdldCBleHRlbmQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmV4dGVuZFxyXG4gIH1cclxuXHJcbiAgc2V0IGV4dGVuZCh2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMuZXh0ZW5kID0gdlxyXG4gICAgdGhpcy5jbG9zZU5vZGVFZGl0KClcclxuICAgIGlmICh2KSB7XHJcbiAgICAgIHRoaXMuaGVpZ2h0TW9kZSA9IDJcclxuICAgIH1cclxuICAgIHRoaXMuX2VsbXMuZXh0ZW5kICYmXHJcbiAgICAgIHRoaXMuX2VsbXMuZXh0ZW5kLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgaXRlbS5jaGVja2VkID0gdlxyXG4gICAgICB9KVxyXG4gICAgaWYgKHRoaXMuZW50aXR5KSB7XHJcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuZXh0ZW5kKSB7XHJcbiAgICAgICAgbGV0IGZyb21EZWdyZWVzQXJyYXkgPSB0aGlzLnJlbmV3UG9zaXRpb25zKHRoaXMub3B0aW9ucy5wb3NpdGlvbnMpXHJcbiAgICAgICAgdGhpcy5yZW5ld1BvbHlnb24oZnJvbURlZ3JlZXNBcnJheSlcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmVudGl0eS5wb2x5Z29uID0gdW5kZWZpbmVkXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCBleHRlbmRXaWR0aCgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuZXh0ZW5kV2lkdGhcclxuICB9XHJcblxyXG4gIHNldCBleHRlbmRXaWR0aCh2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMuZXh0ZW5kV2lkdGggPSB2XHJcbiAgICB0aGlzLl9lbG1zLmV4dGVuZFdpZHRoICYmXHJcbiAgICAgIHRoaXMuX2VsbXMuZXh0ZW5kV2lkdGguZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICBpdGVtLnZhbHVlID0gdlxyXG4gICAgICB9KVxyXG4gICAgbGV0IGZyb21EZWdyZWVzQXJyYXkgPSB0aGlzLnJlbmV3UG9zaXRpb25zKHRoaXMub3B0aW9ucy5wb3NpdGlvbnMpXHJcbiAgICB0aGlzLnJlbmV3UG9seWdvbihmcm9tRGVncmVlc0FycmF5KVxyXG4gIH1cclxuXHJcbiAgZ2V0IGV4dGVuZENvbG9yKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5leHRlbmRDb2xvclxyXG4gIH1cclxuICBzZXQgZXh0ZW5kQ29sb3Iodikge1xyXG4gICAgdGhpcy5vcHRpb25zLmV4dGVuZENvbG9yID0gdlxyXG4gICAgaWYgKHRoaXMuX2VsbXMuZXh0ZW5kQ29sb3IpIHtcclxuICAgICAgdGhpcy5fZWxtcy5leHRlbmRDb2xvci5mb3JFYWNoKChpdGVtLCBpKSA9PiB7XHJcbiAgICAgICAgbGV0IGV4dGVuZENvbG9yUGlja2VyID0gbmV3IFlKQ29sb3JQaWNrZXIoe1xyXG4gICAgICAgICAgZWw6IGl0ZW0uZWwsXHJcbiAgICAgICAgICBzaXplOiAnbWluaScsIC8v6aKc6ImyYm9457G75Z6LXHJcbiAgICAgICAgICBhbHBoYTogdHJ1ZSwgLy/mmK/lkKblvIDlkK/pgI/mmI7luqZcclxuICAgICAgICAgIGRlZmF1bHRDb2xvcjogdGhpcy5leHRlbmRDb2xvcixcclxuICAgICAgICAgIGRpc2FibGVkOiBmYWxzZSwgLy/mmK/lkKbnpoHmraLmiZPlvIDpopzoibLpgInmi6nlmahcclxuICAgICAgICAgIG9wZW5QaWNrZXJBbmk6ICdvcGFjaXR5JywgLy/miZPlvIDpopzoibLpgInmi6nlmajliqjnlLtcclxuICAgICAgICAgIHN1cmU6IGNvbG9yID0+IHtcclxuICAgICAgICAgICAgdGhpcy5leHRlbmRDb2xvciA9IGNvbG9yXHJcbiAgICAgICAgICB9LCAvL+eCueWHu+ehruiupOaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICAgICAgY2xlYXI6ICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5leHRlbmRDb2xvciA9ICdyZ2JhKDI1NSwyNTUsMjU1LDEpJ1xyXG4gICAgICAgICAgfSAvL+eCueWHu+a4heepuuaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgdGhpcy5fZWxtcy5leHRlbmRDb2xvcltpXSA9IGV4dGVuZENvbG9yUGlja2VyXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgICB0aGlzLmVudGl0eSAmJlxyXG4gICAgICB0aGlzLmVudGl0eS5wb2x5Z29uICYmXHJcbiAgICAgICh0aGlzLmVudGl0eS5wb2x5Z29uLm1hdGVyaWFsID0gQ2VzaXVtLkNvbG9yLmZyb21Dc3NDb2xvclN0cmluZyhcclxuICAgICAgICB0aGlzLm9wdGlvbnMuZXh0ZW5kQ29sb3JcclxuICAgICAgKSlcclxuICB9XHJcblxyXG4gIGdldCBsYWJlbFNob3coKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmxhYmVsLnNob3dcclxuICB9XHJcbiAgc2V0IGxhYmVsU2hvdyh2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMubGFiZWwuc2hvdyA9IHZcclxuICAgIGlmICh0aGlzLnNob3cgJiYgIXRoaXMuc2hvd1ZpZXcgfHwgdGhpcy5zaG93VmlldyA9PSAzKSB7XHJcbiAgICAgIHRoaXMubGFiZWwuc2hvdyA9IHZcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5sYWJlbC5wb3NpdGlvbiA9IFtcclxuICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0ubG5nLFxyXG4gICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXS5sYXQsXHJcbiAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zWzBdLmFsdFxyXG4gICAgICAgIF1cclxuICAgICAgfSwgMClcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMubGFiZWwuc2hvdyA9IGZhbHNlXHJcbiAgICB9XHJcbiAgICB0aGlzLl9lbG1zLmxhYmVsU2hvdyAmJlxyXG4gICAgICB0aGlzLl9lbG1zLmxhYmVsU2hvdy5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgIGl0ZW0uY2hlY2tlZCA9IHZcclxuICAgICAgfSlcclxuICB9XHJcblxyXG4gIGdldCBsYWJlbEZvbnRGYW1pbHkoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmxhYmVsLmZvbnRGYW1pbHlcclxuICB9XHJcblxyXG4gIHNldCBsYWJlbEZvbnRGYW1pbHkodikge1xyXG4gICAgdGhpcy5vcHRpb25zLmxhYmVsLmZvbnRGYW1pbHkgPSB2IHx8IDBcclxuICAgIHRoaXMubGFiZWwgJiYgKHRoaXMubGFiZWwuZm9udEZhbWlseSA9IHRoaXMub3B0aW9ucy5sYWJlbC5mb250RmFtaWx5KVxyXG5cclxuICAgIGxldCBuYW1lID0gZ2V0Rm9udEZhbWlseU5hbWUodGhpcy5sYWJlbEZvbnRGYW1pbHkpIHx8ICcnXHJcbiAgICB0aGlzLl9lbG1zLmxhYmVsRm9udEZhbWlseSAmJlxyXG4gICAgICB0aGlzLl9lbG1zLmxhYmVsRm9udEZhbWlseS5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgIGl0ZW0udmFsdWUgPSBuYW1lXHJcbiAgICAgIH0pXHJcbiAgfVxyXG5cclxuICBnZXQgbGFiZWxDb2xvcigpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubGFiZWwuY29sb3JcclxuICB9XHJcbiAgc2V0IGxhYmVsQ29sb3Iodikge1xyXG4gICAgdGhpcy5vcHRpb25zLmxhYmVsLmNvbG9yID0gdlxyXG4gICAgdGhpcy5sYWJlbC5jb2xvciA9IHZcclxuICAgIGlmICh0aGlzLl9lbG1zLmxhYmVsQ29sb3IpIHtcclxuICAgICAgdGhpcy5fZWxtcy5sYWJlbENvbG9yLmZvckVhY2goKGl0ZW0sIGkpID0+IHtcclxuICAgICAgICBsZXQgbGFiZWxDb2xvclBpY2tlciA9IG5ldyBZSkNvbG9yUGlja2VyKHtcclxuICAgICAgICAgIGVsOiBpdGVtLmVsLFxyXG4gICAgICAgICAgc2l6ZTogJ21pbmknLCAvL+minOiJsmJveOexu+Wei1xyXG4gICAgICAgICAgYWxwaGE6IHRydWUsIC8v5piv5ZCm5byA5ZCv6YCP5piO5bqmXHJcbiAgICAgICAgICBkZWZhdWx0Q29sb3I6IHRoaXMubGFiZWxDb2xvcixcclxuICAgICAgICAgIGRpc2FibGVkOiBmYWxzZSwgLy/mmK/lkKbnpoHmraLmiZPlvIDpopzoibLpgInmi6nlmahcclxuICAgICAgICAgIG9wZW5QaWNrZXJBbmk6ICdvcGFjaXR5JywgLy/miZPlvIDpopzoibLpgInmi6nlmajliqjnlLtcclxuICAgICAgICAgIHN1cmU6IGNvbG9yID0+IHtcclxuICAgICAgICAgICAgdGhpcy5sYWJlbENvbG9yID0gY29sb3JcclxuICAgICAgICAgIH0sIC8v54K55Ye756Gu6K6k5oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgICAgICBjbGVhcjogKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxhYmVsQ29sb3IgPSAncmdiYSgyNTUsMjU1LDI1NSwxKSdcclxuICAgICAgICAgIH0gLy/ngrnlh7vmuIXnqbrmjInpkq7kuovku7blm57osINcclxuICAgICAgICB9KVxyXG4gICAgICAgIHRoaXMuX2VsbXMubGFiZWxDb2xvcltpXSA9IGxhYmVsQ29sb3JQaWNrZXJcclxuICAgICAgfSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCBsYWJlbEZvbnRTaXplKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5sYWJlbC5mb250U2l6ZVxyXG4gIH1cclxuICBzZXQgbGFiZWxGb250U2l6ZSh2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMubGFiZWwuZm9udFNpemUgPSB2XHJcbiAgICB0aGlzLmxhYmVsLmZvbnRTaXplID0gdlxyXG4gICAgdGhpcy5fZWxtcy5sYWJlbEZvbnRTaXplICYmXHJcbiAgICAgIHRoaXMuX2VsbXMubGFiZWxGb250U2l6ZS5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgIGl0ZW0udmFsdWUgPSB2XHJcbiAgICAgIH0pXHJcbiAgfVxyXG5cclxuICBnZXQgbGFiZWxTY2FsZUJ5RGlzdGFuY2UoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmxhYmVsLnNjYWxlQnlEaXN0YW5jZVxyXG4gIH1cclxuICBzZXQgbGFiZWxTY2FsZUJ5RGlzdGFuY2Uodikge1xyXG4gICAgdGhpcy5vcHRpb25zLmxhYmVsLnNjYWxlQnlEaXN0YW5jZSA9IHZcclxuICAgIHRoaXMubGFiZWwuc2NhbGVCeURpc3RhbmNlID0gdlxyXG4gICAgdGhpcy5fZWxtcy5sYWJlbFNjYWxlQnlEaXN0YW5jZSAmJlxyXG4gICAgICB0aGlzLl9lbG1zLmxhYmVsU2NhbGVCeURpc3RhbmNlLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgaXRlbS5jaGVja2VkID0gdlxyXG4gICAgICB9KVxyXG4gIH1cclxuXHJcbiAgZ2V0IGxhYmVsTmVhcigpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubGFiZWwubmVhclxyXG4gIH1cclxuICBzZXQgbGFiZWxOZWFyKHYpIHtcclxuICAgIGxldCBuZWFyID0gdlxyXG4gICAgaWYgKG5lYXIgPiB0aGlzLmxhYmVsRmFyKSB7XHJcbiAgICAgIG5lYXIgPSB0aGlzLmxhYmVsRmFyXHJcbiAgICB9XHJcbiAgICB0aGlzLm9wdGlvbnMubGFiZWwubmVhciA9IG5lYXJcclxuICAgIHRoaXMubGFiZWwubmVhciA9IG5lYXJcclxuICAgIHRoaXMuX2VsbXMubGFiZWxOZWFyICYmIHRoaXMuX2VsbXMubGFiZWxOZWFyLmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgaXRlbS52YWx1ZSA9IG5lYXJcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBnZXQgbGFiZWxGYXIoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmxhYmVsLmZhclxyXG4gIH1cclxuICBzZXQgbGFiZWxGYXIodikge1xyXG4gICAgbGV0IGZhciA9IHZcclxuICAgIGlmIChmYXIgPCB0aGlzLmxhYmVsTmVhcikge1xyXG4gICAgICBmYXIgPSB0aGlzLmxhYmVsTmVhclxyXG4gICAgfVxyXG4gICAgdGhpcy5vcHRpb25zLmxhYmVsLmZhciA9IGZhclxyXG4gICAgdGhpcy5sYWJlbC5mYXIgPSBmYXJcclxuICAgIHRoaXMuX2VsbXMubGFiZWxGYXIgJiYgdGhpcy5fZWxtcy5sYWJlbEZhci5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgIGl0ZW0udmFsdWUgPSBmYXJcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBnZXQgbGFiZWxMaW5lV2lkdGgoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmxhYmVsLmxpbmVXaWR0aFxyXG4gIH1cclxuICBzZXQgbGFiZWxMaW5lV2lkdGgodikge1xyXG4gICAgdGhpcy5vcHRpb25zLmxhYmVsLmxpbmVXaWR0aCA9IHZcclxuICAgIHRoaXMubGFiZWwubGluZVdpZHRoID0gdlxyXG4gICAgdGhpcy5fZWxtcy5sYWJlbExpbmVXaWR0aCAmJlxyXG4gICAgICB0aGlzLl9lbG1zLmxhYmVsTGluZVdpZHRoLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgaXRlbS52YWx1ZSA9IHZcclxuICAgICAgfSlcclxuICB9XHJcblxyXG4gIGdldCBsYWJlbFBpeGVsT2Zmc2V0KCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5sYWJlbC5waXhlbE9mZnNldFxyXG4gIH1cclxuICBzZXQgbGFiZWxQaXhlbE9mZnNldCh2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMubGFiZWwucGl4ZWxPZmZzZXQgPSB2XHJcbiAgICB0aGlzLmxhYmVsLnBpeGVsT2Zmc2V0ID0gdlxyXG4gICAgdGhpcy5fZWxtcy5sYWJlbFBpeGVsT2Zmc2V0ICYmXHJcbiAgICAgIHRoaXMuX2VsbXMubGFiZWxQaXhlbE9mZnNldC5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgIGl0ZW0udmFsdWUgPSB2XHJcbiAgICAgIH0pXHJcbiAgfVxyXG4gIGdldCBsYWJlbExpbmVDb2xvcigpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubGFiZWwubGluZUNvbG9yXHJcbiAgfVxyXG4gIHNldCBsYWJlbExpbmVDb2xvcih2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMubGFiZWwubGluZUNvbG9yID0gdlxyXG4gICAgdGhpcy5sYWJlbC5saW5lQ29sb3IgPSB2XHJcbiAgICBpZiAodGhpcy5fZWxtcy5sYWJlbExpbmVDb2xvcikge1xyXG4gICAgICB0aGlzLl9lbG1zLmxhYmVsTGluZUNvbG9yLmZvckVhY2goKGl0ZW0sIGkpID0+IHtcclxuICAgICAgICBsZXQgbGluZUNvbG9yUGlja2VyID0gbmV3IFlKQ29sb3JQaWNrZXIoe1xyXG4gICAgICAgICAgZWw6IGl0ZW0uZWwsXHJcbiAgICAgICAgICBzaXplOiAnbWluaScsIC8v6aKc6ImyYm9457G75Z6LXHJcbiAgICAgICAgICBhbHBoYTogdHJ1ZSwgLy/mmK/lkKblvIDlkK/pgI/mmI7luqZcclxuICAgICAgICAgIGRlZmF1bHRDb2xvcjogdGhpcy5sYWJlbExpbmVDb2xvcixcclxuICAgICAgICAgIGRpc2FibGVkOiBmYWxzZSwgLy/mmK/lkKbnpoHmraLmiZPlvIDpopzoibLpgInmi6nlmahcclxuICAgICAgICAgIG9wZW5QaWNrZXJBbmk6ICdvcGFjaXR5JywgLy/miZPlvIDpopzoibLpgInmi6nlmajliqjnlLtcclxuICAgICAgICAgIHN1cmU6IGNvbG9yID0+IHtcclxuICAgICAgICAgICAgdGhpcy5sYWJlbExpbmVDb2xvciA9IGNvbG9yXHJcbiAgICAgICAgICB9LCAvL+eCueWHu+ehruiupOaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICAgICAgY2xlYXI6ICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5sYWJlbExpbmVDb2xvciA9ICdyZ2JhKDAsMjU1LDI1NSwwLjUpJ1xyXG4gICAgICAgICAgfSAvL+eCueWHu+a4heepuuaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgdGhpcy5fZWxtcy5sYWJlbExpbmVDb2xvcltpXSA9IGxpbmVDb2xvclBpY2tlclxyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IGxhYmVsQmFja2dyb3VuZENvbG9yU3RhcnQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmxhYmVsLmJhY2tncm91bmRDb2xvclswXVxyXG4gIH1cclxuICBzZXQgbGFiZWxCYWNrZ3JvdW5kQ29sb3JTdGFydCh2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMubGFiZWwuYmFja2dyb3VuZENvbG9yWzBdID0gdlxyXG4gICAgdGhpcy5sYWJlbC5iYWNrZ3JvdW5kQ29sb3IgPSBbdiwgdGhpcy5sYWJlbC5iYWNrZ3JvdW5kQ29sb3JbMV1dXHJcbiAgICBpZiAodGhpcy5fZWxtcy5sYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0KSB7XHJcbiAgICAgIHRoaXMuX2VsbXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JTdGFydC5mb3JFYWNoKChpdGVtLCBpKSA9PiB7XHJcbiAgICAgICAgbGV0IGxhYmVsQmFja2dyb3VuZENvbG9yU3RhcnRQaWNrZXIgPSBuZXcgWUpDb2xvclBpY2tlcih7XHJcbiAgICAgICAgICBlbDogaXRlbS5lbCxcclxuICAgICAgICAgIHNpemU6ICdtaW5pJywgLy/popzoibJib3jnsbvlnotcclxuICAgICAgICAgIGFscGhhOiB0cnVlLCAvL+aYr+WQpuW8gOWQr+mAj+aYjuW6plxyXG4gICAgICAgICAgZGVmYXVsdENvbG9yOiB0aGlzLmxhYmVsQmFja2dyb3VuZENvbG9yU3RhcnQsXHJcbiAgICAgICAgICBkaXNhYmxlZDogZmFsc2UsIC8v5piv5ZCm56aB5q2i5omT5byA6aKc6Imy6YCJ5oup5ZmoXHJcbiAgICAgICAgICBvcGVuUGlja2VyQW5pOiAnb3BhY2l0eScsIC8v5omT5byA6aKc6Imy6YCJ5oup5Zmo5Yqo55S7XHJcbiAgICAgICAgICBzdXJlOiBjb2xvciA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JTdGFydCA9IGNvbG9yXHJcbiAgICAgICAgICB9LCAvL+eCueWHu+ehruiupOaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICAgICAgY2xlYXI6ICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5sYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0ID0gJ3JnYmEoMjU1LDI1NSwyNTUsMSknXHJcbiAgICAgICAgICB9IC8v54K55Ye75riF56m65oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgICAgfSlcclxuICAgICAgICB0aGlzLl9lbG1zLmxhYmVsQmFja2dyb3VuZENvbG9yU3RhcnRbXHJcbiAgICAgICAgICBpXHJcbiAgICAgICAgXSA9IGxhYmVsQmFja2dyb3VuZENvbG9yU3RhcnRQaWNrZXJcclxuICAgICAgfSlcclxuICAgIH1cclxuICB9XHJcbiAgZ2V0IGxhYmVsQmFja2dyb3VuZENvbG9yRW5kKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5sYWJlbC5iYWNrZ3JvdW5kQ29sb3JbMV1cclxuICB9XHJcbiAgc2V0IGxhYmVsQmFja2dyb3VuZENvbG9yRW5kKHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5sYWJlbC5iYWNrZ3JvdW5kQ29sb3JbMV0gPSB2XHJcbiAgICB0aGlzLmxhYmVsLmJhY2tncm91bmRDb2xvciA9IFt0aGlzLmxhYmVsLmJhY2tncm91bmRDb2xvclswXSwgdl1cclxuICAgIGlmICh0aGlzLl9lbG1zLmxhYmVsQmFja2dyb3VuZENvbG9yRW5kKSB7XHJcbiAgICAgIHRoaXMuX2VsbXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmQuZm9yRWFjaCgoaXRlbSwgaSkgPT4ge1xyXG4gICAgICAgIGxldCBsYWJlbEJhY2tncm91bmRDb2xvckVuZFBpY2tlciA9IG5ldyBZSkNvbG9yUGlja2VyKHtcclxuICAgICAgICAgIGVsOiBpdGVtLmVsLFxyXG4gICAgICAgICAgc2l6ZTogJ21pbmknLCAvL+minOiJsmJveOexu+Wei1xyXG4gICAgICAgICAgYWxwaGE6IHRydWUsIC8v5piv5ZCm5byA5ZCv6YCP5piO5bqmXHJcbiAgICAgICAgICBkZWZhdWx0Q29sb3I6IHRoaXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmQsXHJcbiAgICAgICAgICBkaXNhYmxlZDogZmFsc2UsIC8v5piv5ZCm56aB5q2i5omT5byA6aKc6Imy6YCJ5oup5ZmoXHJcbiAgICAgICAgICBvcGVuUGlja2VyQW5pOiAnb3BhY2l0eScsIC8v5omT5byA6aKc6Imy6YCJ5oup5Zmo5Yqo55S7XHJcbiAgICAgICAgICBzdXJlOiBjb2xvciA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmQgPSBjb2xvclxyXG4gICAgICAgICAgfSwgLy/ngrnlh7vnoa7orqTmjInpkq7kuovku7blm57osINcclxuICAgICAgICAgIGNsZWFyOiAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmQgPSAncmdiYSgyNTUsMjU1LDI1NSwxKSdcclxuICAgICAgICAgIH0gLy/ngrnlh7vmuIXnqbrmjInpkq7kuovku7blm57osINcclxuICAgICAgICB9KVxyXG4gICAgICAgIHRoaXMuX2VsbXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmRbaV0gPSBsYWJlbEJhY2tncm91bmRDb2xvckVuZFBpY2tlclxyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gIH1cclxuICAvLyBnZXQgYXR0cmlidXRlQ2FtZXJhKCkge1xyXG4gIC8vICAgcmV0dXJuIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUuY2FtZXJhLmNvbnRlbnRcclxuICAvLyB9XHJcblxyXG4gIC8vIHNldCBhdHRyaWJ1dGVDYW1lcmEodikge1xyXG4gIC8vICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5jYW1lcmEuY29udGVudCA9IHZcclxuICAvLyB9XHJcblxyXG4gIC8vIGdldCBhdHRyaWJ1dGVWcigpIHtcclxuICAvLyAgIHJldHVybiB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnRcclxuICAvLyB9XHJcblxyXG4gIC8vIHNldCBhdHRyaWJ1dGVWcih2KSB7XHJcbiAgLy8gICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnQgPSB2XHJcbiAgLy8gICBpZiAoXHJcbiAgLy8gICAgICF0aGlzLl9EaWFsb2dPYmplY3QgfHxcclxuICAvLyAgICAgIXRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudCB8fFxyXG4gIC8vICAgICAhdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQgfHxcclxuICAvLyAgICAgdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcclxuICAvLyAgICAgICAnYXR0cmlidXRlLWNvbnRlbnQtdnInXHJcbiAgLy8gICAgICkubGVuZ3RoID09IDBcclxuICAvLyAgICkge1xyXG4gIC8vICAgICByZXR1cm5cclxuICAvLyAgIH1cclxuICAvLyAgIGxldCB0YWJsZSA9IHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50XHJcbiAgLy8gICAgIC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdhdHRyaWJ1dGUtY29udGVudC12cicpWzFdXHJcbiAgLy8gICAgIC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0YWJsZScpWzBdXHJcbiAgLy8gICBsZXQgdGFibGVDb250ZW50ID0gdGFibGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndGFibGUtYm9keScpWzBdXHJcbiAgLy8gICB0YWJsZUNvbnRlbnQuaW5uZXJIVE1MID0gJydcclxuICAvLyAgIGlmICh0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnQubGVuZ3RoID4gMCkge1xyXG4gIC8vICAgICB0YWJsZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0YWJsZS1lbXB0eScpWzBdLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSdcclxuICAvLyAgIH0gZWxzZSB7XHJcbiAgLy8gICAgIHRhYmxlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RhYmxlLWVtcHR5JylbMF0uc3R5bGUuZGlzcGxheSA9ICdmbGV4J1xyXG4gIC8vICAgfVxyXG4gIC8vICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnQubGVuZ3RoOyBpKyspIHtcclxuICAvLyAgICAgbGV0IHRyID1cclxuICAvLyAgICAgICBgXHJcbiAgLy8gICAgIDxkaXYgY2xhc3M9XCJ0clwiPlxyXG4gIC8vICAgICAgICAgPGRpdiBjbGFzcz1cInRkXCI+YCArXHJcbiAgLy8gICAgICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52ci5jb250ZW50W2ldLm5hbWUgK1xyXG4gIC8vICAgICAgIGA8L2Rpdj5cclxuICAvLyAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZFwiPmAgK1xyXG4gIC8vICAgICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudFtpXS51cmwgK1xyXG4gIC8vICAgICAgIGA8L2Rpdj5cclxuICAvLyAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZFwiPlxyXG4gIC8vICAgICAgICAgICAgIDxidXR0b24gQGNsaWNrPVwidnJFZGl0XCI+57yW6L6RPC9idXR0b24+XHJcbiAgLy8gICAgICAgICAgICAgPGJ1dHRvbiBAY2xpY2s9XCJ2ckRlbGV0ZVwiPuWIoOmZpDwvYnV0dG9uPlxyXG4gIC8vICAgICAgICAgPC9kaXY+XHJcbiAgLy8gICAgIDwvZGl2PmBcclxuICAvLyAgICAgbGV0IHRyRWxtID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKS5jcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQodHIpXHJcbiAgLy8gICAgIHRhYmxlQ29udGVudC5hcHBlbmRDaGlsZCh0ckVsbSlcclxuICAvLyAgIH1cclxuICAvLyAgIGxldCBpdGVtID0gdGFibGVDb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RyJylcclxuICAvLyAgIGxldCBmdW4gPSB7XHJcbiAgLy8gICAgIHZyRWRpdDogYXN5bmMgaW5kZXggPT4ge1xyXG4gIC8vICAgICAgIHRoaXMuYXR0cmlidXRlVnIgPSBhd2FpdCB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnRcclxuICAvLyAgICAgICBsZXQgdGFibGUgPSB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudFxyXG4gIC8vICAgICAgICAgLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2F0dHJpYnV0ZS1jb250ZW50LXZyJylbMV1cclxuICAvLyAgICAgICAgIC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0YWJsZScpWzBdXHJcbiAgLy8gICAgICAgbGV0IHRhYmxlQ29udGVudCA9IHRhYmxlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RhYmxlLWJvZHknKVswXVxyXG4gIC8vICAgICAgIGxldCBpdGVtID0gdGFibGVDb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RyJylcclxuICAvLyAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW0ubGVuZ3RoOyBpKyspIHtcclxuICAvLyAgICAgICAgIGlmIChpbmRleCA9PT0gaSkge1xyXG4gIC8vICAgICAgICAgICBsZXQgaGVpZ2h0ID0gaXRlbVtpXS5vZmZzZXRIZWlnaHRcclxuICAvLyAgICAgICAgICAgbGV0IGh0bWwgPSBgXHJcbiAgLy8gICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRkXCI+XHJcbiAgLy8gICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJpbnB1dFwiIHR5cGU9XCJ0ZXh0XCI+XHJcbiAgLy8gICAgICAgICAgICAgPC9kaXY+XHJcbiAgLy8gICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRkXCI+XHJcbiAgLy8gICAgICAgICAgICAgICA8dGV4dGFyZWEgY2xhc3M9XCJpbnB1dCBsaW5rLWVkaXRcIiB0eXBlPVwidGV4dFwiPjwvdGV4dGFyZWE+XHJcbiAgLy8gICAgICAgICAgICAgPC9kaXY+XHJcbiAgLy8gICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRkXCI+XHJcbiAgLy8gICAgICAgICAgICAgICAgIDxidXR0b24gQGNsaWNrPVwiY29uZmlybUVkaXRcIj7noa7orqQ8L2J1dHRvbj5cclxuICAvLyAgICAgICAgICAgICAgICAgPGJ1dHRvbiBAY2xpY2s9XCJjYW5jZWxFZGl0XCI+5Y+W5raIPC9idXR0b24+XHJcbiAgLy8gICAgICAgICAgICAgPC9kaXY+YFxyXG4gIC8vICAgICAgICAgICBpdGVtW2ldLmlubmVySFRNTCA9IGh0bWxcclxuICAvLyAgICAgICAgICAgbGV0IHRleHRhcmVhRWxtID0gaXRlbVtpXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdsaW5rLWVkaXQnKVswXVxyXG4gIC8vICAgICAgICAgICB0ZXh0YXJlYUVsbS5zdHlsZS5oZWlnaHQgPSBoZWlnaHQgLSAxMCArICdweCdcclxuICAvLyAgICAgICAgICAgbGV0IHRkID0gaXRlbVtpXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0ZCcpXHJcbiAgLy8gICAgICAgICAgIHRkWzBdLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXHJcbiAgLy8gICAgICAgICAgICAgJ2lucHV0J1xyXG4gIC8vICAgICAgICAgICApWzBdLnZhbHVlID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52ci5jb250ZW50W2luZGV4XS5uYW1lXHJcbiAgLy8gICAgICAgICAgIHRkWzFdLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXHJcbiAgLy8gICAgICAgICAgICAgJ2lucHV0J1xyXG4gIC8vICAgICAgICAgICApWzBdLnZhbHVlID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52ci5jb250ZW50W2luZGV4XS51cmxcclxuICAvLyAgICAgICAgICAgbGV0IGJ0biA9IGl0ZW1baV0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2J1dHRvbicpXHJcbiAgLy8gICAgICAgICAgIGZvciAobGV0IG4gPSAwOyBuIDwgYnRuLmxlbmd0aDsgbisrKSB7XHJcbiAgLy8gICAgICAgICAgICAgaWYgKCFidG5bbl0gfHwgIWJ0bltuXS5hdHRyaWJ1dGVzKSB7XHJcbiAgLy8gICAgICAgICAgICAgICBjb250aW51ZVxyXG4gIC8vICAgICAgICAgICAgIH1cclxuICAvLyAgICAgICAgICAgICBmb3IgKGxldCBtIG9mIGJ0bltuXS5hdHRyaWJ1dGVzKSB7XHJcbiAgLy8gICAgICAgICAgICAgICBpZiAobS5uYW1lID09PSAnQGNsaWNrJykge1xyXG4gIC8vICAgICAgICAgICAgICAgICBidG5bbl0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBlID0+IHtcclxuICAvLyAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGZ1blttLnZhbHVlXSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gIC8vICAgICAgICAgICAgICAgICAgICAgZnVuW20udmFsdWVdKFxyXG4gIC8vICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogdGRbMF0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaW5wdXQnKVswXS52YWx1ZSxcclxuICAvLyAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6IHRkWzFdLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2lucHV0JylbMF0udmFsdWVcclxuICAvLyAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAvLyAgICAgICAgICAgICAgICAgICAgICAgaVxyXG4gIC8vICAgICAgICAgICAgICAgICAgICAgKVxyXG4gIC8vICAgICAgICAgICAgICAgICAgIH1cclxuICAvLyAgICAgICAgICAgICAgICAgfSlcclxuICAvLyAgICAgICAgICAgICAgICAgYnRuW25dLmF0dHJpYnV0ZXMucmVtb3ZlTmFtZWRJdGVtKG0ubmFtZSlcclxuICAvLyAgICAgICAgICAgICAgICAgYnJlYWtcclxuICAvLyAgICAgICAgICAgICAgIH1cclxuICAvLyAgICAgICAgICAgICB9XHJcbiAgLy8gICAgICAgICAgIH1cclxuICAvLyAgICAgICAgICAgYnJlYWtcclxuICAvLyAgICAgICAgIH1cclxuICAvLyAgICAgICB9XHJcbiAgLy8gICAgIH0sXHJcbiAgLy8gICAgIHZyRGVsZXRlOiBpID0+IHtcclxuICAvLyAgICAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnQuc3BsaWNlKGksIDEpXHJcbiAgLy8gICAgICAgdGhpcy5hdHRyaWJ1dGVWciA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudFxyXG4gIC8vICAgICB9LFxyXG5cclxuICAvLyAgICAgY29uZmlybUVkaXQ6ICh2YWx1ZSwgaSkgPT4ge1xyXG4gIC8vICAgICAgIGxldCBuYW1lID0gdmFsdWUubmFtZSAmJiB2YWx1ZS5uYW1lLnJlcGxhY2UoL1xccy9nLCAnJylcclxuICAvLyAgICAgICBsZXQgdXJsID0gdmFsdWUudXJsICYmIHZhbHVlLnVybC5yZXBsYWNlKC9cXHMvZywgJycpXHJcbiAgLy8gICAgICAgaWYgKG5hbWUgJiYgdXJsKSB7XHJcbiAgLy8gICAgICAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnRbaV0gPSB2YWx1ZVxyXG4gIC8vICAgICAgIH0gZWxzZSB7XHJcbiAgLy8gICAgICAgICB3aW5kb3cuRUxFTUVOVCAmJlxyXG4gIC8vICAgICAgICAgICB3aW5kb3cuRUxFTUVOVC5NZXNzYWdlKHtcclxuICAvLyAgICAgICAgICAgICBtZXNzYWdlOiAn5ZCN56ew5oiW6ZO+5o6l5LiN6IO95Li656m677yBJyxcclxuICAvLyAgICAgICAgICAgICB0eXBlOiAnd2FybmluZycsXHJcbiAgLy8gICAgICAgICAgICAgZHVyYXRpb246IDE1MDBcclxuICAvLyAgICAgICAgICAgfSlcclxuICAvLyAgICAgICB9XHJcbiAgLy8gICAgICAgdGhpcy5hdHRyaWJ1dGVWciA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudFxyXG4gIC8vICAgICB9LFxyXG4gIC8vICAgICBjYW5jZWxFZGl0OiAoKSA9PiB7XHJcbiAgLy8gICAgICAgdGhpcy5hdHRyaWJ1dGVWciA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudFxyXG4gIC8vICAgICB9LFxyXG4gIC8vICAgICBmaWxlU2VsZWN0OiAodmFsdWUsIGkpID0+IHtcclxuICAvLyAgICAgICBsZXQgZmlsZUVsbSA9IGl0ZW1baV0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnZmlsZS1zZWxlY3QnKVswXVxyXG4gIC8vICAgICAgIGZpbGVFbG0uY2xpY2soKVxyXG4gIC8vICAgICAgIGZpbGVFbG0ucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgZmlsZVNlbGVjdClcclxuICAvLyAgICAgICBmaWxlRWxtLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGZpbGVTZWxlY3QpXHJcbiAgLy8gICAgIH1cclxuICAvLyAgIH1cclxuICAvLyAgIGxldCBmaWxlU2VsZWN0ID0gZXZlbnQgPT4ge1xyXG4gIC8vICAgICBpZiAoZXZlbnQudGFyZ2V0LnZhbHVlKSB7XHJcbiAgLy8gICAgICAgbGV0IHRkID0gaXRlbVtcclxuICAvLyAgICAgICAgIGV2ZW50LnRhcmdldC5nZXRBdHRyaWJ1dGUoJ2luZGV4JylcclxuICAvLyAgICAgICBdLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RkJylcclxuICAvLyAgICAgICB0ZFsxXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdpbnB1dCcpWzBdLnZhbHVlID0gZXZlbnQudGFyZ2V0LnZhbHVlXHJcbiAgLy8gICAgICAgZXZlbnQudGFyZ2V0LnZhbHVlID0gbnVsbFxyXG4gIC8vICAgICB9XHJcbiAgLy8gICB9XHJcbiAgLy8gICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW0ubGVuZ3RoOyBpKyspIHtcclxuICAvLyAgICAgbGV0IGJ0biA9IGl0ZW1baV0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2J1dHRvbicpXHJcbiAgLy8gICAgIGZvciAobGV0IG4gPSAwOyBuIDwgYnRuLmxlbmd0aDsgbisrKSB7XHJcbiAgLy8gICAgICAgaWYgKCFidG5bbl0gfHwgIWJ0bltuXS5hdHRyaWJ1dGVzKSB7XHJcbiAgLy8gICAgICAgICBjb250aW51ZVxyXG4gIC8vICAgICAgIH1cclxuICAvLyAgICAgICBmb3IgKGxldCBtIG9mIGJ0bltuXS5hdHRyaWJ1dGVzKSB7XHJcbiAgLy8gICAgICAgICBpZiAobS5uYW1lID09PSAnQGNsaWNrJykge1xyXG4gIC8vICAgICAgICAgICBidG5bbl0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBlID0+IHtcclxuICAvLyAgICAgICAgICAgICBpZiAodHlwZW9mIGZ1blttLnZhbHVlXSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gIC8vICAgICAgICAgICAgICAgZnVuW20udmFsdWVdKGkpXHJcbiAgLy8gICAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgICB9KVxyXG4gIC8vICAgICAgICAgICBidG5bbl0uYXR0cmlidXRlcy5yZW1vdmVOYW1lZEl0ZW0obS5uYW1lKVxyXG4gIC8vICAgICAgICAgICBicmVha1xyXG4gIC8vICAgICAgICAgfVxyXG4gIC8vICAgICAgIH1cclxuICAvLyAgICAgfVxyXG4gIC8vICAgfVxyXG4gIC8vIH1cclxuXHJcbiAgLy8gZ2V0IGF0dHJpYnV0ZUdvb2RzKCkge1xyXG4gIC8vICAgcmV0dXJuIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUuZ29vZHMuY29udGVudFxyXG4gIC8vIH1cclxuXHJcbiAgLy8gc2V0IGF0dHJpYnV0ZUdvb2RzKHYpIHtcclxuICAvLyAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUuZ29vZHMuY29udGVudCA9IHZcclxuICAvLyB9XHJcblxyXG4gIHN0YXRpYyBhc3luYyBjcmVhdGVMYWJlbCh0aGF0KSB7XHJcbiAgICBsZXQgaGVpZ2h0XHJcbiAgICBsZXQgZ3JvdW5kXHJcbiAgICBsZXQgb2JqZWN0c1RvRXhjbHVkZSA9IFsuLi50aGF0LnNkay52aWV3ZXIuZW50aXRpZXMudmFsdWVzXVxyXG4gICAgc3dpdGNoICh0aGF0Lm9wdGlvbnMuaGVpZ2h0TW9kZSkge1xyXG4gICAgICBjYXNlICcwJzpcclxuICAgICAgY2FzZSAwOlxyXG4gICAgICAgIGdyb3VuZCA9IGZhbHNlXHJcbiAgICAgICAgaGVpZ2h0ID0gdGhhdC5vcHRpb25zLnBvc2l0aW9uc1swXS5hbHRcclxuICAgICAgICBicmVha1xyXG4gICAgICBjYXNlICcxJzpcclxuICAgICAgY2FzZSAxOlxyXG4gICAgICAgIGdyb3VuZCA9IGZhbHNlXHJcbiAgICAgICAgaGVpZ2h0ID0gYXdhaXQgdGhhdC5nZXRDbGFtcFRvSGVpZ2h0KHtcclxuICAgICAgICAgIGxuZzogdGhhdC5vcHRpb25zLnBvc2l0aW9uc1swXS5sbmcsXHJcbiAgICAgICAgICBsYXQ6IHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbMF0ubGF0XHJcbiAgICAgICAgfSwgb2JqZWN0c1RvRXhjbHVkZSkgKyB0aGF0Lm9wdGlvbnMucG9zaXRpb25zWzBdLmFsdFxyXG4gICAgICAgIGJyZWFrXHJcbiAgICAgIGNhc2UgJzInOlxyXG4gICAgICBjYXNlIDI6XHJcbiAgICAgICAgZ3JvdW5kID0gdHJ1ZVxyXG4gICAgICAgIGhlaWdodCA9IGF3YWl0IHRoYXQuZ2V0Q2xhbXBUb0hlaWdodCh7XHJcbiAgICAgICAgICBsbmc6IHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbMF0ubG5nLFxyXG4gICAgICAgICAgbGF0OiB0aGF0Lm9wdGlvbnMucG9zaXRpb25zWzBdLmxhdFxyXG4gICAgICAgIH0sIG9iamVjdHNUb0V4Y2x1ZGUpXHJcbiAgICAgICAgYnJlYWtcclxuICAgIH1cclxuICAgIGlmICghdGhhdC5vcHRpb25zLmxhYmVsLnBvc2l0aW9uKSB7XHJcbiAgICAgIHRoYXQub3B0aW9ucy5sYWJlbC5wb3NpdGlvbiA9IHtcclxuICAgICAgICBsbmc6IHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbMF0ubG5nLFxyXG4gICAgICAgIGxhdDogdGhhdC5vcHRpb25zLnBvc2l0aW9uc1swXS5sYXQsXHJcbiAgICAgICAgYWx0OiBoZWlnaHRcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhhdC5sYWJlbCA9IG5ldyBMYWJlbE9iamVjdCh0aGF0LnNkaywge1xyXG4gICAgICBpZDogdGhhdC5vcHRpb25zLmlkLFxyXG4gICAgICBzaG93OiB0aGF0Lm9wdGlvbnMuc2hvdyA/IHRoYXQub3B0aW9ucy5sYWJlbC5zaG93IDogZmFsc2UsXHJcbiAgICAgIHBvc2l0aW9uOiBbXHJcbiAgICAgICAgdGhhdC5vcHRpb25zLmxhYmVsLnBvc2l0aW9uLmxuZyxcclxuICAgICAgICB0aGF0Lm9wdGlvbnMubGFiZWwucG9zaXRpb24ubGF0LFxyXG4gICAgICAgIHRoYXQub3B0aW9ucy5sYWJlbC5wb3NpdGlvbi5hbHRcclxuICAgICAgXSxcclxuICAgICAgdGV4dDogdGhhdC5vcHRpb25zLm5hbWUsXHJcbiAgICAgIGZvbnRTaXplOiB0aGF0Lm9wdGlvbnMubGFiZWwuZm9udFNpemUsXHJcbiAgICAgIGZvbnRGYW1pbHk6IHRoYXQub3B0aW9ucy5sYWJlbC5mb250RmFtaWx5LFxyXG4gICAgICBjb2xvcjogdGhhdC5vcHRpb25zLmxhYmVsLmNvbG9yLFxyXG4gICAgICBwaXhlbE9mZnNldDogdGhhdC5vcHRpb25zLmxhYmVsLnBpeGVsT2Zmc2V0LFxyXG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRoYXQub3B0aW9ucy5sYWJlbC5iYWNrZ3JvdW5kQ29sb3IsXHJcbiAgICAgIGxpbmVDb2xvcjogdGhhdC5vcHRpb25zLmxhYmVsLmxpbmVDb2xvcixcclxuICAgICAgbGluZVdpZHRoOiB0aGF0Lm9wdGlvbnMubGFiZWwubGluZVdpZHRoLFxyXG4gICAgICBzY2FsZUJ5RGlzdGFuY2U6IHRoYXQub3B0aW9ucy5sYWJlbC5zY2FsZUJ5RGlzdGFuY2UsXHJcbiAgICAgIG5lYXI6IHRoYXQub3B0aW9ucy5sYWJlbC5uZWFyLFxyXG4gICAgICBmYXI6IHRoYXQub3B0aW9ucy5sYWJlbC5mYXIsXHJcbiAgICAgIGdyb3VuZDogZ3JvdW5kXHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgc3RhdGljIGNyZWF0ZSh0aGF0KSB7XHJcbiAgICBsZXQgZ3JvdW5kXHJcbiAgICBpZiAodGhhdC5oZWlnaHRNb2RlID09IDIpIHtcclxuICAgICAgZ3JvdW5kID0gdHJ1ZVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZ3JvdW5kID0gZmFsc2VcclxuICAgIH1cclxuICAgIGxldCBwb3NpdGlvbnMgPSB0aGF0Lm9wdGlvbnMucG9zaXRpb25zXHJcbiAgICBsZXQgZnJvbURlZ3JlZXNBcnJheSA9IHRoYXQucmVuZXdQb3NpdGlvbnMocG9zaXRpb25zKVxyXG4gICAgdGhhdC5lbnRpdHkgPSB0aGF0LnNkay52aWV3ZXIuZW50aXRpZXMuYWRkKHtcclxuICAgICAgaWQ6IHRoYXQub3B0aW9ucy5pZCxcclxuICAgICAgc2hvdzogdGhhdC5vcHRpb25zLnNob3csXHJcbiAgICAgIHBvbHlsaW5lOiB7XHJcbiAgICAgICAgcG9zaXRpb25zOiBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlc0FycmF5SGVpZ2h0cyhmcm9tRGVncmVlc0FycmF5KSxcclxuICAgICAgICB3aWR0aDogdGhhdC5vcHRpb25zLndpZHRoLFxyXG4gICAgICAgIGNsYW1wVG9Hcm91bmQ6IGdyb3VuZCxcclxuICAgICAgICAvLyBtYXRlcmlhbDogdGhhdC5nZXRNYXRlcmlhbCh0aGF0Lm9wdGlvbnMuY29sb3IsIHRoYXQub3B0aW9ucy50eXBlKSxcclxuICAgICAgICB6SW5kZXg6IHRoYXQuc2RrLl9lbnRpdHlaSW5kZXhcclxuICAgICAgfVxyXG4gICAgfSlcclxuXHJcbiAgICB0aGF0LmVudGl0eS5wb2x5bGluZS5vcmlXaWR0aCA9IHRoYXQub3B0aW9ucy53aWR0aFxyXG4gICAgdGhhdC5qdWRnZUxpbmUodGhhdC5lbnRpdHksIHRoYXQub3B0aW9ucylcclxuXHJcbiAgICBsZXQgcGFyYW1zID0geyAuLi50aGF0Lm9wdGlvbnMgfVxyXG4gICAgcGFyYW1zLnNwZWVkID0gdGhhdC5pbnB1dFNwZWVkXHJcbiAgICB0aGF0LmVudGl0eS5wb2x5bGluZS5tYXRlcmlhbCA9IHRoYXQuZ2V0TWF0ZXJpYWwoXHJcbiAgICAgIHRoYXQub3B0aW9ucy5jb2xvcixcclxuICAgICAgdGhhdC5vcHRpb25zLnR5cGUsXHJcbiAgICAgIHRoYXQuZW50aXR5LFxyXG4gICAgICBwYXJhbXNcclxuICAgIClcclxuXHJcbiAgICB0aGF0LnNkay5fZW50aXR5WkluZGV4KytcclxuICAgIEN1cnZlbGluZU9iamVjdC5jcmVhdGVMYWJlbCh0aGF0KVxyXG4gICAgLy8gdGhhdC5lbnRpdHkucG9seWxpbmUucG9zaXRpb25zTG5nTGF0ID0gcG9zaXRpb25zXHJcbiAgICB0aGF0LnJlbmV3UG9seWdvbihmcm9tRGVncmVlc0FycmF5KVxyXG4gICAgLy8gdGhhdC5vcHRpb25zLmxlbmd0aEJ5TWV0ZXIgPSB0aGF0LmNvbXB1dGVEaXN0YW5jZTIodGhhdC5zbW9vdGhIYW5kbGUocG9zaXRpb25zKSwgMiwgZ3JvdW5kKVxyXG4gICAgLy8gdGhhdC5sZW5ndGhVbml0ID0gdGhhdC5vcHRpb25zWydsZW5ndGgtdW5pdCddXHJcbiAgICAvLyBzeW5jRGF0YSh0aGF0LnNkaywgdGhhdC5vcHRpb25zLmlkKVxyXG4gICAgLy8gaWYgKHRoYXQub3B0aW9ucy5zaG93KSB7XHJcbiAgICAvLyAgIHNldFNwbGl0RGlyZWN0aW9uKDAsIHRoYXQub3B0aW9ucy5pZClcclxuICAgIC8vIH1cclxuXHJcbiAgICB0aGF0LmNvbXB1dGVEaXN0YW5jZShcclxuICAgICAgdGhhdC5zbW9vdGhIYW5kbGUocG9zaXRpb25zKSxcclxuICAgICAgMixcclxuICAgICAgdGhhdC5vcHRpb25zLndvcmRzTmFtZVxyXG4gICAgKS50aGVuKHJlcyA9PiB7XHJcbiAgICAgIHRoYXQubGVuZ3RoQnlNZXRlciA9IHJlc1xyXG4gICAgICB0aGF0Lmxlbmd0aENoYW5nZUNhbGxCYWNrICYmIHRoYXQubGVuZ3RoQ2hhbmdlQ2FsbEJhY2soKVxyXG4gICAgICBzeW5jRGF0YSh0aGF0LnNkaywgdGhhdC5vcHRpb25zLmlkKVxyXG4gICAgfSlcclxuICAgIGlmICh0aGF0Lm9wdGlvbnMuc2hvdykge1xyXG4gICAgICBzZXRTcGxpdERpcmVjdGlvbigwLCB0aGF0Lm9wdGlvbnMuaWQpXHJcbiAgICB9XHJcblxyXG4gICAgLy8gaWYgKHRoaXMub3B0aW9ucy5ub3NlVG9UYWlsKSB7XHJcbiAgICAvLyAgIGxldCBhcnJheSA9IFtdXHJcbiAgICAvLyAgIGZvciAobGV0IGkgPSAwOyBpIDwgZnJvbURlZ3JlZXNBcnJheS5sZW5ndGg7IGkgKz0gMikge1xyXG4gICAgLy8gICAgIGFycmF5LnB1c2goeyBsbmc6IGZyb21EZWdyZWVzQXJyYXlbaV0sIGxhdDogZnJvbURlZ3JlZXNBcnJheVtpICsgMV0gfSlcclxuICAgIC8vICAgfVxyXG4gICAgLy8gICB0aGlzLm9wdGlvbnMuZml0X2xlbmd0aCA9IHRvb2wuY29tcHV0ZURpc3RhbmNlMihhcnJheSlcclxuICAgIC8vIH1cclxuICAgIC8vIGVsc2Uge1xyXG4gICAgLy8gICB0aGlzLm9wdGlvbnMuZml0X2xlbmd0aCA9IHRvb2wuY29tcHV0ZURpc3RhbmNlMihwb3NpdGlvbnMpXHJcbiAgICAvLyB9XHJcbiAgICAvLyBpZiAodGhpcy5vcHRpb25zLmZpdF9sZW5ndGhfdW5pdCA9PT0gJ2ttJykge1xyXG4gICAgLy8gICB0aGlzLm9wdGlvbnMuZml0X2xlbmd0aCA9IHRoaXMub3B0aW9ucy5maXRfbGVuZ3RoIC8gMTAwMFxyXG4gICAgLy8gfVxyXG5cclxuICAgIGxldCBzY2VuZSA9IHRoYXQuc2RrLnZpZXdlci5zY2VuZVxyXG4gIH1cclxuICBqdWRnZUxpbmUoZW50aXR5LCBuZXdQYXJhbSkge1xyXG4gICAgaWYgKCFlbnRpdHkucG9seWxpbmUub3JpUmVwZWF0KSB7XHJcbiAgICAgIGxldCBwYXJhbSA9IHtcclxuICAgICAgICBjb2xvcjogbmV3UGFyYW0uY29sb3IsXHJcbiAgICAgICAgaW1hZ2U6IHRoaXMuZ2V0U291cmNlUm9vdFBhdGgoKSArIGAvaW1nL2Fycm93LzEucG5nYCxcclxuICAgICAgICBzcGFjZTogbmV3UGFyYW0uc3BhY2UsXHJcbiAgICAgICAgc3BlZWQ6IG5ld1BhcmFtLnNwZWVkXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHBhcmFtLnNwZWVkID0gbmV3UGFyYW0ucm90YXRlID8gcGFyYW0uc3BlZWQgOiAwIC0gcGFyYW0uc3BlZWRcclxuXHJcbiAgICAgIGNvbnN0IGNhbnZhc0VsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xyXG4gICAgICBjb25zdCBjdHggPSBjYW52YXNFbGUuZ2V0Q29udGV4dCgnMmQnKVxyXG4gICAgICBjb25zdCBteUltZyA9IG5ldyBJbWFnZSgpXHJcbiAgICAgIC8vIG15SW1nLnNyYyA9IHRoYXQuZ2V0U291cmNlUm9vdFBhdGgoKSArICcvaW1nL2Fycm93LzEucG5nJ1xyXG4gICAgICBteUltZy5zcmMgPSBwYXJhbS5pbWFnZVxyXG4gICAgICBsZXQgdGhhdCA9IHRoaXNcclxuICAgICAgbXlJbWcub25sb2FkID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGNhbnZhc0VsZS53aWR0aCA9IG15SW1nLndpZHRoICogKHBhcmFtLnNwYWNlICsgMSlcclxuICAgICAgICBjYW52YXNFbGUuaGVpZ2h0ID0gbXlJbWcuaGVpZ2h0XHJcblxyXG4gICAgICAgIGxldCBvcmlSZXBlYXQgPSB0aGF0LmdldFNjZWVuTGluZShlbnRpdHksIHBhcmFtLCBjYW52YXNFbGUpXHJcbiAgICAgICAgb3JpUmVwZWF0ICYmIChlbnRpdHkucG9seWxpbmUub3JpUmVwZWF0ID0gb3JpUmVwZWF0KVxyXG5cclxuXHJcbiAgICAgICAgdmFyIHBvc2l0aW9uUHJvcGVydHkgPSBlbnRpdHkucG9seWxpbmUucG9zaXRpb25zO1xyXG4gICAgICAgIHZhciBwb3NpdGlvbnMgPSBwb3NpdGlvblByb3BlcnR5LmdldFZhbHVlKHRoYXQuc2RrLnZpZXdlci5jbG9jay5jdXJyZW50VGltZSk7XHJcblxyXG4gICAgICAgIGlmICghQ2VzaXVtLmRlZmluZWQocG9zaXRpb25zKSkge1xyXG4gICAgICAgICAgcmV0dXJuIG5ldyBDZXNpdW0uQ2FydGVzaWFuMigxLjAsIDEuMCk7XHJcbiAgICAgICAgICAvLyByZXR1cm4gMS4wO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIGRpc3RhbmNlID0gMDtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGggLSAxOyArK2kpIHtcclxuICAgICAgICAgIGRpc3RhbmNlICs9IENlc2l1bS5DYXJ0ZXNpYW4zLmRpc3RhbmNlKHBvc2l0aW9uc1tpXSwgcG9zaXRpb25zW2kgKyAxXSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgcmVwZWF0WCA9IGRpc3RhbmNlIC8gZW50aXR5LnBvbHlsaW5lLndpZHRoLmdldFZhbHVlKCk7XHJcbiAgICAgICAgLy8g5qC55o2u5Zyw5Zu+57yp5pS+56iL5bqm6LCD5pW0cmVwZWF0WFxyXG4gICAgICAgIHZhciBjYW1lcmFIZWlnaHQgPSB0aGF0LnNkay52aWV3ZXIuY2FtZXJhLnBvc2l0aW9uQ2FydG9ncmFwaGljLmhlaWdodDtcclxuICAgICAgICB2YXIgYm91bmRpbmdTcGhlcmUgPSBuZXcgQ2VzaXVtLkJvdW5kaW5nU3BoZXJlKFxyXG4gICAgICAgICAgbmV3IENlc2l1bS5DYXJ0ZXNpYW4zKC0xMDAwMDAwLCAwLCAwKSwgLy8g5Lit5b+D54K55Z2Q5qCHXHJcbiAgICAgICAgICA1MDAwMDAgLy8g5Y2K5b6E77yI6Led56a777yJXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgLy8g6I635Y+W57uY5Zu+57yT5Yay5Yy655qE5a695bqm5ZKM6auY5bqm77yI6YCa5bi45piv5bGP5bmV55qE5YiG6L6o546H77yJXHJcbiAgICAgICAgdmFyIGRyYXdpbmdCdWZmZXJXaWR0aCA9IHRoYXQuc2RrLnZpZXdlci5jYW52YXMuY2xpZW50V2lkdGg7XHJcbiAgICAgICAgdmFyIGRyYXdpbmdCdWZmZXJIZWlnaHQgPSB0aGF0LnNkay52aWV3ZXIuY2FudmFzLmNsaWVudEhlaWdodDtcclxuXHJcbiAgICAgICAgLy8g5L2/55SoIGdldFBpeGVsU2l6ZSDmlrnms5Xojrflj5bljIXlm7TnkIPlnKjlsY/luZXkuIrnmoTlg4/ntKDlpKflsI9cclxuICAgICAgICB2YXIgZ3JvdW5kUmVzb2x1dGlvbiA9IHRoYXQuc2RrLnZpZXdlci5zY2VuZS5jYW1lcmEuZ2V0UGl4ZWxTaXplKGJvdW5kaW5nU3BoZXJlLCBkcmF3aW5nQnVmZmVyV2lkdGgsIGRyYXdpbmdCdWZmZXJIZWlnaHQpXHJcbiAgICAgICAgcmVwZWF0WCAqPSBncm91bmRSZXNvbHV0aW9uIC8gY2FtZXJhSGVpZ2h0IC8gKHBhcmFtLnNwYWNlICogKGNhbnZhc0VsZS53aWR0aCAvIGNhbnZhc0VsZS5oZWlnaHQgKiA1KSArIDEpO1xyXG4gICAgICAgIC8vIGlmIChlbnRpdHkucG9seWxpbmUubWF0ZXJpYWwub3JpUmVwZWF0KSB7XHJcblxyXG4gICAgICAgIGlmICh0aGF0LnNkay52aWV3ZXIuc2NlbmUubW9kZSA9PT0gQ2VzaXVtLlNjZW5lTW9kZS5TQ0VORTNEKSB7XHJcbiAgICAgICAgICBsZXQgc3BlZWQgPSByZXBlYXRYIC8gZW50aXR5LnBvbHlsaW5lLm9yaVJlcGVhdFxyXG4gICAgICAgICAgZW50aXR5LnBvbHlsaW5lLm9yaVNwZWVkID0gc3BlZWRcclxuICAgICAgICAgIGVudGl0eS5wb2x5bGluZS5vcmlSZXBlYXRYID0gcmVwZWF0WFxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBsZXQgc2RrM2QgPSBnZXQzRFZpZXcoKVxyXG4gICAgICAgICAgbGV0IHNkazNkRW50aXR5ID0gc2RrM2Qudmlld2VyLmVudGl0aWVzLmdldEJ5SWQodGhhdC5vcHRpb25zLmlkKVxyXG4gICAgICAgICAgZW50aXR5LnBvbHlsaW5lLm9yaVNwZWVkID0gc2RrM2RFbnRpdHkucG9seWxpbmUub3JpU3BlZWRcclxuICAgICAgICAgIGVudGl0eS5wb2x5bGluZS5vcmlSZXBlYXRYID0gc2RrM2RFbnRpdHkucG9seWxpbmUub3JpUmVwZWF0WFxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgIH1cclxuICB9XHJcbiAgLyoq6I635Y+W5b2T5YmN5ruh5bGP5qiq57q/6YCf5bqmICovXHJcbiAgZ2V0U2NlZW5MaW5lKGVudGl0eSwgb3B0aW9ucywgY2FudmFzRWxlKSB7XHJcbiAgICBsZXQgcG9pbnQxID0gbmV3IENlc2l1bS5DYXJ0ZXNpYW4yKDAsIHRoaXMuc2RrLnZpZXdlci5jYW52YXMuY2xpZW50SGVpZ2h0KVxyXG4gICAgbGV0IHBvaW50MiA9IG5ldyBDZXNpdW0uQ2FydGVzaWFuMih0aGlzLnNkay52aWV3ZXIuY2FudmFzLmNsaWVudFdpZHRoIC8gMiwgdGhpcy5zZGsudmlld2VyLmNhbnZhcy5jbGllbnRIZWlnaHQpXHJcbiAgICAvLyB2YXIgY2FydGVzaWFuMSA9IHRoaXMuc2RrLnZpZXdlci5zY2VuZS5waWNrUG9zaXRpb24ocG9pbnQxKVxyXG4gICAgLy8gdmFyIGNhcnRlc2lhbjIgPSB0aGlzLnNkay52aWV3ZXIuc2NlbmUucGlja1Bvc2l0aW9uKHBvaW50MilcclxuXHJcbiAgICBsZXQgcmF5ID0gdGhpcy5zZGsudmlld2VyLmNhbWVyYS5nZXRQaWNrUmF5KHBvaW50MSk7XHJcbiAgICBsZXQgY2FydGVzaWFuMSA9IHRoaXMuc2RrLnZpZXdlci5zY2VuZS5nbG9iZS5waWNrKHJheSwgdGhpcy5zZGsudmlld2VyLnNjZW5lKTtcclxuXHJcbiAgICBsZXQgcmF5MiA9IHRoaXMuc2RrLnZpZXdlci5jYW1lcmEuZ2V0UGlja1JheShwb2ludDIpO1xyXG4gICAgbGV0IGNhcnRlc2lhbjIgPSB0aGlzLnNkay52aWV3ZXIuc2NlbmUuZ2xvYmUucGljayhyYXkyLCB0aGlzLnNkay52aWV3ZXIuc2NlbmUpO1xyXG4gICAgLy8gaWYgKCFjYXJ0ZXNpYW4xIHx8ICFjYXJ0ZXNpYW4yKSB7XHJcbiAgICAvLyAgIGxldCByYXkgPSB0aGlzLnNkay52aWV3ZXIuY2FtZXJhLmdldFBpY2tSYXkocG9pbnQxKTtcclxuICAgIC8vICAgY2FydGVzaWFuMSA9IHRoaXMuc2RrLnZpZXdlci5zY2VuZS5nbG9iZS5waWNrKHJheSwgdGhpcy5zZGsudmlld2VyLnNjZW5lKTtcclxuXHJcbiAgICAvLyAgIGxldCByYXkyID0gdGhpcy5zZGsudmlld2VyLmNhbWVyYS5nZXRQaWNrUmF5KHBvaW50Mik7XHJcbiAgICAvLyAgIGNhcnRlc2lhbjIgPSB0aGlzLnNkay52aWV3ZXIuc2NlbmUuZ2xvYmUucGljayhyYXkyLCB0aGlzLnNkay52aWV3ZXIuc2NlbmUpO1xyXG4gICAgLy8gfVxyXG4gICAgaWYgKGNhcnRlc2lhbjEgJiYgY2FydGVzaWFuMikge1xyXG5cclxuXHJcbiAgICAgIHZhciBkaXN0YW5jZSA9IENlc2l1bS5DYXJ0ZXNpYW4zLmRpc3RhbmNlKGNhcnRlc2lhbjEsIGNhcnRlc2lhbjIpO1xyXG5cclxuICAgICAgdmFyIHJlcGVhdFggPSBkaXN0YW5jZSAvIGVudGl0eS5wb2x5bGluZS53aWR0aC5nZXRWYWx1ZSgpO1xyXG4gICAgICAvLyDmoLnmja7lnLDlm77nvKnmlL7nqIvluqbosIPmlbRyZXBlYXRYXHJcbiAgICAgIHZhciBjYW1lcmFIZWlnaHQgPSB0aGlzLnNkay52aWV3ZXIuY2FtZXJhLnBvc2l0aW9uQ2FydG9ncmFwaGljLmhlaWdodDtcclxuICAgICAgdmFyIGJvdW5kaW5nU3BoZXJlID0gbmV3IENlc2l1bS5Cb3VuZGluZ1NwaGVyZShcclxuICAgICAgICBuZXcgQ2VzaXVtLkNhcnRlc2lhbjMoLTEwMDAwMDAsIDAsIDApLCAvLyDkuK3lv4PngrnlnZDmoIdcclxuICAgICAgICA1MDAwMDAgLy8g5Y2K5b6E77yI6Led56a777yJXHJcbiAgICAgICk7XHJcblxyXG5cclxuICAgICAgLy8g6I635Y+W57uY5Zu+57yT5Yay5Yy655qE5a695bqm5ZKM6auY5bqm77yI6YCa5bi45piv5bGP5bmV55qE5YiG6L6o546H77yJXHJcbiAgICAgIHZhciBkcmF3aW5nQnVmZmVyV2lkdGggPSB0aGlzLnNkay52aWV3ZXIuY2FudmFzLmNsaWVudFdpZHRoO1xyXG4gICAgICB2YXIgZHJhd2luZ0J1ZmZlckhlaWdodCA9IHRoaXMuc2RrLnZpZXdlci5jYW52YXMuY2xpZW50SGVpZ2h0O1xyXG5cclxuICAgICAgLy8g5L2/55SoIGdldFBpeGVsU2l6ZSDmlrnms5Xojrflj5bljIXlm7TnkIPlnKjlsY/luZXkuIrnmoTlg4/ntKDlpKflsI9cclxuICAgICAgdmFyIGdyb3VuZFJlc29sdXRpb24gPSB0aGlzLnNkay52aWV3ZXIuc2NlbmUuY2FtZXJhLmdldFBpeGVsU2l6ZShib3VuZGluZ1NwaGVyZSwgZHJhd2luZ0J1ZmZlcldpZHRoLCBkcmF3aW5nQnVmZmVySGVpZ2h0KVxyXG4gICAgICAvLyByZXBlYXRYICo9IGdyb3VuZFJlc29sdXRpb24gLyBjYW1lcmFIZWlnaHQgLyAoKG15SW1nLndpZHRoIC8gbXlJbWcuaGVpZ2h0ICogNSkgKyAxKTtcclxuICAgICAgaWYgKGdyb3VuZFJlc29sdXRpb24gPiA3MDApIHtcclxuICAgICAgICByZXBlYXRYICo9IGdyb3VuZFJlc29sdXRpb24gLyBjYW1lcmFIZWlnaHQgLyAob3B0aW9ucy5zcGFjZSAqIChjYW52YXNFbGUud2lkdGggLyBjYW52YXNFbGUuaGVpZ2h0ICogNSkgKyAxKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXBlYXRYID0gdW5kZWZpbmVkO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodGhpcy5zZGsudmlld2VyLnNjZW5lLm1vZGUgPT09IENlc2l1bS5TY2VuZU1vZGUuU0NFTkUzRCkge1xyXG4gICAgICAgIHJldHVybiByZXBlYXRYXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgbGV0IHNkazNkID0gZ2V0M0RWaWV3KClcclxuICAgICAgICBsZXQgc2RrM2RFbnRpdHkgPSBzZGszZC52aWV3ZXIuZW50aXRpZXMuZ2V0QnlJZCh0aGlzLm9wdGlvbnMuaWQpXHJcbiAgICAgICAgcmV0dXJuIHNkazNkRW50aXR5LnBvbHlsaW5lLm9yaVJlcGVhdFhcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuICAvKipcclxuICAgKiDnvJbovpHmoYZcclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHN0YXRlIHRydWXmiZPlvIDvvIxmYWxzZeWFs+mXrVxyXG4gICAqL1xyXG4gIGFzeW5jIGVkaXQoc3RhdGUpIHtcclxuICAgIHJldHVyblxyXG4gICAgbGV0IF90aGlzID0gdGhpc1xyXG4gICAgdGhpcy5vcmlnaW5hbE9wdGlvbnMgPSB0aGlzLmRlZXBDb3B5T2JqKHRoaXMub3B0aW9ucylcclxuICAgIGlmICh0aGlzLl9EaWFsb2dPYmplY3QgJiYgdGhpcy5fRGlhbG9nT2JqZWN0LmNsb3NlKSB7XHJcbiAgICAgIHRoaXMuX0RpYWxvZ09iamVjdC5jbG9zZSgpXHJcbiAgICAgIHRoaXMuX0RpYWxvZ09iamVjdCA9IG51bGxcclxuICAgIH1cclxuICAgIGlmIChzdGF0ZSkge1xyXG4gICAgICB0aGlzLl9EaWFsb2dPYmplY3QgPSBhd2FpdCBuZXcgRGlhbG9nKHRoaXMuc2RrLCB0aGlzLm9wdGlvbnMsIHtcclxuICAgICAgICB0aXRsZTogJ+absue6v+WxnuaApycsXHJcbiAgICAgICAgbGVmdDogJzE4MHB4JyxcclxuICAgICAgICB0b3A6ICcxMDBweCcsXHJcbiAgICAgICAgY29uZmlybUNhbGxCYWNrOiBvcHRpb25zID0+IHtcclxuICAgICAgICAgIHRoaXMubmFtZSA9IHRoaXMubmFtZS50cmltKClcclxuICAgICAgICAgIGlmICghdGhpcy5uYW1lKSB7XHJcbiAgICAgICAgICAgIHRoaXMubmFtZSA9ICfmnKrlkb3lkI3lr7nosaEnXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLm9wdGlvbnMubGFiZWwucG9zaXRpb24gPSB7XHJcbiAgICAgICAgICAgIGxuZzogdGhpcy5sYWJlbC5wb3NpdGlvblswXSxcclxuICAgICAgICAgICAgbGF0OiB0aGlzLmxhYmVsLnBvc2l0aW9uWzFdLFxyXG4gICAgICAgICAgICBhbHQ6IHRoaXMubGFiZWwucG9zaXRpb25bMl1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMub3JpZ2luYWxPcHRpb25zID0gdGhpcy5kZWVwQ29weU9iaih0aGlzLm9wdGlvbnMpXHJcbiAgICAgICAgICB0aGlzLl9EaWFsb2dPYmplY3QuY2xvc2UoKVxyXG4gICAgICAgICAgdGhpcy5EaWFsb2cuY29uZmlybUNhbGxCYWNrICYmXHJcbiAgICAgICAgICAgIHRoaXMuRGlhbG9nLmNvbmZpcm1DYWxsQmFjayh0aGlzLm9yaWdpbmFsT3B0aW9ucylcclxuICAgICAgICAgIHN5bmNEYXRhKHRoaXMuc2RrLCB0aGlzLm9wdGlvbnMuaWQpXHJcbiAgICAgICAgICBzeW5jU3BsaXREYXRhKHRoaXMuc2RrLCB0aGlzLm9wdGlvbnMuaWQpXHJcbiAgICAgICAgfSxcclxuICAgICAgICByZXNldENhbGxCYWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnJlc2V0KClcclxuICAgICAgICAgIHRoaXMuRGlhbG9nLnJlc2V0Q2FsbEJhY2sgJiYgdGhpcy5EaWFsb2cucmVzZXRDYWxsQmFjaygpXHJcbiAgICAgICAgfSxcclxuICAgICAgICByZW1vdmVDYWxsQmFjazogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5EaWFsb2cucmVtb3ZlQ2FsbEJhY2sgJiYgdGhpcy5EaWFsb2cucmVtb3ZlQ2FsbEJhY2soKVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgY2xvc2VDYWxsQmFjazogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5yZXNldCgpXHJcbiAgICAgICAgICB0aGlzLkRpYWxvZy5jbG9zZUNhbGxCYWNrICYmIHRoaXMuRGlhbG9nLmNsb3NlQ2FsbEJhY2soKVxyXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm5vZGVQb2ludHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdGhpcy5zZGsudmlld2VyLmVudGl0aWVzLnJlbW92ZSh0aGlzLm5vZGVQb2ludHNbaV0pXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLm5vZGVQb2ludHMgPSBbXVxyXG4gICAgICAgICAgdGhpcy5wb3NpdGlvbkVkaXRpbmcgPSBmYWxzZVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgc2hvd0NhbGxCYWNrOiBzaG93ID0+IHtcclxuICAgICAgICAgIHRoaXMub3B0aW9ucy5zaG93ID0gc2hvd1xyXG4gICAgICAgICAgdGhpcy5vcmlnaW5hbE9wdGlvbnMuc2hvdyA9IHNob3dcclxuICAgICAgICAgIHRoaXMuc2hvdyA9IHNob3dcclxuICAgICAgICAgIHRoaXMuRGlhbG9nLnNob3dDYWxsQmFjayAmJiB0aGlzLkRpYWxvZy5zaG93Q2FsbEJhY2soKVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgdHJhbnNsYXRpb25hbENhbGxCYWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnBvc2l0aW9uRWRpdGluZyA9ICF0aGlzLnBvc2l0aW9uRWRpdGluZ1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgLy8g5LqM5qyh57yW6L6R5Zue6LCDXHJcbiAgICAgICAgc2Vjb25kYXJ5RWRpdENhbGxCYWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnBvc2l0aW9uRWRpdGluZyA9IGZhbHNlXHJcbiAgICAgICAgICB0aGlzLm5vc2VUb1RhaWwgPSBmYWxzZVxyXG4gICAgICAgICAgdGhpcy5oZWlnaHRNb2RlID0gMFxyXG4gICAgICAgICAgdGhpcy5ub2RlRWRpdCgpXHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgICB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuYm9keS5jbGFzc05hbWUgPVxyXG4gICAgICAgIHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5ib2R5LmNsYXNzTmFtZSArICcgcG9seWxpbmUnXHJcbiAgICAgIGxldCBjb250ZW50RWxtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcclxuICAgICAgY29udGVudEVsbS5pbm5lckhUTUwgPSBodG1sKHRoaXMpXHJcbiAgICAgIHRoaXMuX0RpYWxvZ09iamVjdC5jb250ZW50QXBwQ2hpbGQoY29udGVudEVsbSlcclxuICAgICAgdGhpcy5hdHRyaWJ1dGVUeXBlID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZVR5cGVcclxuICAgICAgLy8gdGhpcy5hdHRyaWJ1dGVDYW1lcmEgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmNhbWVyYS5jb250ZW50XHJcbiAgICAgIC8vIHRoaXMuYXR0cmlidXRlR29vZHMgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmdvb2RzLmNvbnRlbnRcclxuICAgICAgZnVuY3Rpb24gdGFiQ2xpY2soZSkge1xyXG4gICAgICAgIGlmIChlID09PSAnMicgfHwgZSA9PT0gMikgey8v54K55Ye757q/5p2h5qC35byPXHJcbiAgICAgICAgICBpZiAoMiA8IF90aGlzLm9wdGlvbnMudHlwZSAmJiBfdGhpcy5vcHRpb25zLnR5cGUgPCAxMykgey8v6LS05Zu+5Y+C5pWwXHJcbiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkYXNoVGV4dHVyZURvbScpICYmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGFzaFRleHR1cmVEb20nKS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnKVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rhc2hUZXh0dXJlRG9tJykgJiYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkYXNoVGV4dHVyZURvbScpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZScpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyDliJvlu7rmoIfnrb7pobVcclxuICAgICAgbGV0IHRhYnNFbG0gPSBuZXcgY3lfdGFicyhcclxuICAgICAgICAncG9seWxpbmUtb2JqZWN0LWVkaXQtdGFicycsXHJcbiAgICAgICAgdW5kZWZpbmVkLFxyXG4gICAgICAgIHRoaXMuc2RrXHJcbiAgICAgIClcclxuICAgICAgLy8g6aKc6Imy57uE5Lu2XHJcbiAgICAgIGxldCBjb2xvclBpY2tlciA9IG5ldyBZSkNvbG9yUGlja2VyKHtcclxuICAgICAgICBlbDogY29udGVudEVsbS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdjb2xvcicpWzBdLFxyXG4gICAgICAgIHNpemU6ICdtaW5pJywgLy/popzoibJib3jnsbvlnotcclxuICAgICAgICBhbHBoYTogdHJ1ZSwgLy/mmK/lkKblvIDlkK/pgI/mmI7luqZcclxuICAgICAgICBkZWZhdWx0Q29sb3I6IHRoaXMuY29sb3IsXHJcbiAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLCAvL+aYr+WQpuemgeatouaJk+W8gOminOiJsumAieaLqeWZqFxyXG4gICAgICAgIG9wZW5QaWNrZXJBbmk6ICdvcGFjaXR5JywgLy/miZPlvIDpopzoibLpgInmi6nlmajliqjnlLtcclxuICAgICAgICBzdXJlOiBjb2xvciA9PiB7XHJcbiAgICAgICAgICB0aGlzLmNvbG9yID0gY29sb3JcclxuICAgICAgICB9LCAvL+eCueWHu+ehruiupOaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICAgIGNsZWFyOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmNvbG9yID0gJ3JnYmEoMjU1LDI1NSwyNTUsMSknXHJcbiAgICAgICAgfSAvL+eCueWHu+a4heepuuaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICB9KVxyXG4gICAgICBsZXQgbGFiZWxDb2xvclBpY2tlciA9IG5ldyBZSkNvbG9yUGlja2VyKHtcclxuICAgICAgICBlbDogY29udGVudEVsbS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdsYWJlbENvbG9yJylbMF0sXHJcbiAgICAgICAgc2l6ZTogJ21pbmknLCAvL+minOiJsmJveOexu+Wei1xyXG4gICAgICAgIGFscGhhOiB0cnVlLCAvL+aYr+WQpuW8gOWQr+mAj+aYjuW6plxyXG4gICAgICAgIGRlZmF1bHRDb2xvcjogdGhpcy5sYWJlbENvbG9yLFxyXG4gICAgICAgIGRpc2FibGVkOiBmYWxzZSwgLy/mmK/lkKbnpoHmraLmiZPlvIDpopzoibLpgInmi6nlmahcclxuICAgICAgICBvcGVuUGlja2VyQW5pOiAnb3BhY2l0eScsIC8v5omT5byA6aKc6Imy6YCJ5oup5Zmo5Yqo55S7XHJcbiAgICAgICAgc3VyZTogY29sb3IgPT4ge1xyXG4gICAgICAgICAgdGhpcy5sYWJlbENvbG9yID0gY29sb3JcclxuICAgICAgICB9LCAvL+eCueWHu+ehruiupOaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICAgIGNsZWFyOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmxhYmVsQ29sb3IgPSAncmdiYSgyNTUsMjU1LDI1NSwxKSdcclxuICAgICAgICB9IC8v54K55Ye75riF56m65oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgIH0pXHJcbiAgICAgIGxldCBleHRlbmRDb2xvclBpY2tlciA9IG5ldyBZSkNvbG9yUGlja2VyKHtcclxuICAgICAgICBlbDogY29udGVudEVsbS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdleHRlbmRDb2xvcicpWzBdLFxyXG4gICAgICAgIHNpemU6ICdtaW5pJywgLy/popzoibJib3jnsbvlnotcclxuICAgICAgICBhbHBoYTogdHJ1ZSwgLy/mmK/lkKblvIDlkK/pgI/mmI7luqZcclxuICAgICAgICBkZWZhdWx0Q29sb3I6IHRoaXMuZXh0ZW5kQ29sb3IsXHJcbiAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLCAvL+aYr+WQpuemgeatouaJk+W8gOminOiJsumAieaLqeWZqFxyXG4gICAgICAgIG9wZW5QaWNrZXJBbmk6ICdvcGFjaXR5JywgLy/miZPlvIDpopzoibLpgInmi6nlmajliqjnlLtcclxuICAgICAgICBzdXJlOiBjb2xvciA9PiB7XHJcbiAgICAgICAgICB0aGlzLmV4dGVuZENvbG9yID0gY29sb3JcclxuICAgICAgICB9LCAvL+eCueWHu+ehruiupOaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICAgIGNsZWFyOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmV4dGVuZENvbG9yID0gJ3JnYmEoMjU1LDI1NSwyNTUsMSknXHJcbiAgICAgICAgfSAvL+eCueWHu+a4heepuuaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICB9KVxyXG4gICAgICBsZXQgbGluZUNvbG9yUGlja2VyID0gbmV3IFlKQ29sb3JQaWNrZXIoe1xyXG4gICAgICAgIGVsOiBjb250ZW50RWxtLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xhYmVsTGluZUNvbG9yJylbMF0sXHJcbiAgICAgICAgc2l6ZTogJ21pbmknLCAvL+minOiJsmJveOexu+Wei1xyXG4gICAgICAgIGFscGhhOiB0cnVlLCAvL+aYr+WQpuW8gOWQr+mAj+aYjuW6plxyXG4gICAgICAgIGRlZmF1bHRDb2xvcjogdGhpcy5sYWJlbExpbmVDb2xvcixcclxuICAgICAgICBkaXNhYmxlZDogZmFsc2UsIC8v5piv5ZCm56aB5q2i5omT5byA6aKc6Imy6YCJ5oup5ZmoXHJcbiAgICAgICAgb3BlblBpY2tlckFuaTogJ29wYWNpdHknLCAvL+aJk+W8gOminOiJsumAieaLqeWZqOWKqOeUu1xyXG4gICAgICAgIHN1cmU6IGNvbG9yID0+IHtcclxuICAgICAgICAgIHRoaXMubGFiZWxMaW5lQ29sb3IgPSBjb2xvclxyXG4gICAgICAgIH0sIC8v54K55Ye756Gu6K6k5oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgICAgY2xlYXI6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMubGFiZWxMaW5lQ29sb3IgPSAncmdiYSgyNTUsMjU1LDI1NSwxKSdcclxuICAgICAgICB9IC8v54K55Ye75riF56m65oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgIH0pXHJcbiAgICAgIGxldCBsYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0UGlja2VyID0gbmV3IFlKQ29sb3JQaWNrZXIoe1xyXG4gICAgICAgIGVsOiBjb250ZW50RWxtLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xhYmVsQmFja2dyb3VuZENvbG9yU3RhcnQnKVswXSxcclxuICAgICAgICBzaXplOiAnbWluaScsXHJcbiAgICAgICAgYWxwaGE6IHRydWUsXHJcbiAgICAgICAgZGVmYXVsdENvbG9yOiB0aGlzLmxhYmVsQmFja2dyb3VuZENvbG9yU3RhcnQsXHJcbiAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLFxyXG4gICAgICAgIG9wZW5QaWNrZXJBbmk6ICdvcGFjaXR5JyxcclxuICAgICAgICBzdXJlOiBjb2xvciA9PiB7XHJcbiAgICAgICAgICB0aGlzLmxhYmVsQmFja2dyb3VuZENvbG9yU3RhcnQgPSBjb2xvclxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgY2xlYXI6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JTdGFydCA9ICdyZ2JhKDI1NSwyNTUsMjU1LDEpJ1xyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgICAgbGV0IGxhYmVsQmFja2dyb3VuZENvbG9yRW5kUGlja2VyID0gbmV3IFlKQ29sb3JQaWNrZXIoe1xyXG4gICAgICAgIGVsOiBjb250ZW50RWxtLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xhYmVsQmFja2dyb3VuZENvbG9yRW5kJylbMF0sXHJcbiAgICAgICAgc2l6ZTogJ21pbmknLFxyXG4gICAgICAgIGFscGhhOiB0cnVlLFxyXG4gICAgICAgIGRlZmF1bHRDb2xvcjogdGhpcy5sYWJlbEJhY2tncm91bmRDb2xvckVuZCxcclxuICAgICAgICBkaXNhYmxlZDogZmFsc2UsXHJcbiAgICAgICAgb3BlblBpY2tlckFuaTogJ29wYWNpdHknLFxyXG4gICAgICAgIHN1cmU6IGNvbG9yID0+IHtcclxuICAgICAgICAgIHRoaXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmQgPSBjb2xvclxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgY2xlYXI6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmQgPSAncmdiYSgyNTUsMjU1LDI1NSwxKSdcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICAgIGxldCBhbGxfZWxtID0gY29udGVudEVsbS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnKicpXHJcbiAgICAgIEV2ZW50QmluZGluZy5vbih0aGlzLCBhbGxfZWxtKVxyXG4gICAgICB0aGlzLl9lbG1zID0gRXZlbnRCaW5kaW5nLmVsZW1lbnRcclxuICAgICAgdGhpcy5fZWxtcy5jb2xvciA9IFtjb2xvclBpY2tlcl1cclxuICAgICAgdGhpcy5fZWxtcy5sYWJlbENvbG9yID0gW2xhYmVsQ29sb3JQaWNrZXJdXHJcbiAgICAgIHRoaXMuX2VsbXMuZXh0ZW5kQ29sb3IgPSBbZXh0ZW5kQ29sb3JQaWNrZXJdXHJcbiAgICAgIHRoaXMuX2VsbXMubGFiZWxMaW5lQ29sb3IgPSBbbGluZUNvbG9yUGlja2VyXVxyXG4gICAgICB0aGlzLl9lbG1zLmxhYmVsQmFja2dyb3VuZENvbG9yU3RhcnQgPSBbbGFiZWxCYWNrZ3JvdW5kQ29sb3JTdGFydFBpY2tlcl1cclxuICAgICAgdGhpcy5fZWxtcy5sYWJlbEJhY2tncm91bmRDb2xvckVuZCA9IFtsYWJlbEJhY2tncm91bmRDb2xvckVuZFBpY2tlcl1cclxuXHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuYXR0cmlidXRlTGluayA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50XHJcbiAgICAgICAgLy8gdGhpcy5hdHRyaWJ1dGVWciA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudFxyXG4gICAgICAgIC8vIHRoaXMuY2FtZXJhU2VsZWN0ICYmIHRoaXMuY2FtZXJhU2VsZWN0KClcclxuICAgICAgICAvLyB0aGlzLmdvb2RzU2VsZWN0ICYmIHRoaXMuZ29vZHNTZWxlY3QoKVxyXG4gICAgICAgIGxldCB0YWdEYXRhID0gdGhpcy5hdHRyaWJ1dGVTZWxlY3RcclxuICAgICAgICBsZXQgYXR0cmlidXRlRWxtID0gdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcclxuICAgICAgICAgICdhdHRyaWJ1dGUtc2VsZWN0LWJveCdcclxuICAgICAgICApWzBdXHJcbiAgICAgICAgaWYgKGF0dHJpYnV0ZUVsbSkge1xyXG4gICAgICAgICAgbGV0IGxlZ3BPYmplY3QgPSBsZWdwKGF0dHJpYnV0ZUVsbSwgJy5hdHRyaWJ1dGUtc2VsZWN0JylcclxuICAgICAgICAgIGxlZ3BPYmplY3QubGVncF9zZWFyY2godGFnRGF0YSlcclxuICAgICAgICAgIGxldCBhdHRyaWJ1dGVTZWxlY3RFbG0gPSB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudFxyXG4gICAgICAgICAgICAuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnYXR0cmlidXRlLXNlbGVjdCcpWzBdXHJcbiAgICAgICAgICAgIC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaW5wdXQnKVswXVxyXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YWdEYXRhLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmICh0YWdEYXRhW2ldLmtleSA9PT0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZVR5cGUpIHtcclxuICAgICAgICAgICAgICBhdHRyaWJ1dGVTZWxlY3RFbG0udmFsdWUgPSB0YWdEYXRhW2ldLnZhbHVlXHJcbiAgICAgICAgICAgICAgbGVncE9iamVjdC5sZWdwX3NlYXJjaEFjdGl2ZSh0YWdEYXRhW2ldLnZhbHVlKVxyXG4gICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGF0dHJpYnV0ZVNlbGVjdEVsbS5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICgpID0+IHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YWdEYXRhLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgaWYgKHRhZ0RhdGFbaV0udmFsdWUgPT09IGF0dHJpYnV0ZVNlbGVjdEVsbS52YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hdHRyaWJ1dGVUeXBlID0gdGFnRGF0YVtpXS5rZXlcclxuICAgICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IG5hbWVEYXRhID0gW1xyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lOiAn56m66Ze06ZW/5bqmJyxcclxuICAgICAgICAgICAgdmFsdWU6ICfnqbrpl7Tplb/luqYnXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lOiAn5oqV5b2x6ZW/5bqmJyxcclxuICAgICAgICAgICAgdmFsdWU6ICfmipXlvbHplb/luqYnXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lOiAn5Zyw6KGo6ZW/5bqmJyxcclxuICAgICAgICAgICAgdmFsdWU6ICflnLDooajplb/luqYnXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgXVxyXG5cclxuICAgICAgICBsZXQgbmFtZURhdGFMZWdwT2JqZWN0ID0gbGVncChcclxuICAgICAgICAgIHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXHJcbiAgICAgICAgICAgICdpbnB1dC1zZWxlY3QtdW5pdC1ib3gnXHJcbiAgICAgICAgICApWzBdLFxyXG4gICAgICAgICAgJy5pbnB1dC1zZWxlY3QtdW5pdCdcclxuICAgICAgICApXHJcbiAgICAgICAgaWYgKG5hbWVEYXRhTGVncE9iamVjdCkge1xyXG4gICAgICAgICAgbmFtZURhdGFMZWdwT2JqZWN0LmxlZ3Bfc2VhcmNoKG5hbWVEYXRhKVxyXG4gICAgICAgICAgbGV0IG5hbWVEYXRhTGVncEVsbSA9IHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50XHJcbiAgICAgICAgICAgIC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdpbnB1dC1zZWxlY3QtdW5pdCcpWzBdXHJcbiAgICAgICAgICAgIC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaW5wdXQnKVswXVxyXG4gICAgICAgICAgdGhpcy5fZWxtcy53b3Jkc05hbWUgPSBbbmFtZURhdGFMZWdwRWxtXVxyXG4gICAgICAgICAgbmFtZURhdGFMZWdwRWxtLnZhbHVlID0gdGhpcy5vcHRpb25zLndvcmRzTmFtZVxyXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYW1lRGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAobmFtZURhdGFbaV0udmFsdWUgPT09IG5hbWVEYXRhTGVncEVsbS52YWx1ZSkge1xyXG4gICAgICAgICAgICAgIG5hbWVEYXRhTGVncE9iamVjdC5sZWdwX3NlYXJjaEFjdGl2ZShuYW1lRGF0YVtpXS52YWx1ZSlcclxuICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBuYW1lRGF0YUxlZ3BFbG0uYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmFtZURhdGEubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICBpZiAobmFtZURhdGFbaV0udmFsdWUgPT09IG5hbWVEYXRhTGVncEVsbS52YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy53b3Jkc05hbWUgPSBuYW1lRGF0YVtpXS52YWx1ZVxyXG4gICAgICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyDljp/lp4vplb/luqbljZXkvY1cclxuICAgICAgICBsZXQgdW5pdERhdGEgPSBbXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIG5hbWU6ICfnsbMnLFxyXG4gICAgICAgICAgICB2YWx1ZTogJ+exsydcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIG5hbWU6ICfljYPnsbMnLFxyXG4gICAgICAgICAgICB2YWx1ZTogJ+WNg+exsydcclxuICAgICAgICAgIH1cclxuICAgICAgICBdXHJcblxyXG4gICAgICAgIGxldCB1bml0RGF0YUxlZ3BPYmplY3QgPSBsZWdwKFxyXG4gICAgICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcclxuICAgICAgICAgICAgJ2lucHV0LXNlbGVjdC11bml0LWJveCdcclxuICAgICAgICAgIClbMF0sXHJcbiAgICAgICAgICAnLmlucHV0LXNlbGVjdC11bml0JyxcclxuICAgICAgICAgIDFcclxuICAgICAgICApXHJcbiAgICAgICAgaWYgKHVuaXREYXRhTGVncE9iamVjdCkge1xyXG4gICAgICAgICAgdW5pdERhdGFMZWdwT2JqZWN0LmxlZ3Bfc2VhcmNoKHVuaXREYXRhKVxyXG4gICAgICAgICAgbGV0IHVuaXREYXRhTGVncEVsbSA9IHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50XHJcbiAgICAgICAgICAgIC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdpbnB1dC1zZWxlY3QtdW5pdCcpWzFdXHJcbiAgICAgICAgICAgIC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaW5wdXQnKVswXVxyXG4gICAgICAgICAgdGhpcy5fZWxtcy5sZW5ndGhVbml0ID0gW3VuaXREYXRhTGVncEVsbV1cclxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdW5pdERhdGEubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKHVuaXREYXRhW2ldLnZhbHVlID09PSB1bml0RGF0YUxlZ3BFbG0udmFsdWUpIHtcclxuICAgICAgICAgICAgICB1bml0RGF0YUxlZ3BPYmplY3QubGVncF9zZWFyY2hBY3RpdmUodW5pdERhdGFbaV0udmFsdWUpXHJcbiAgICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdW5pdERhdGFMZWdwRWxtLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKCkgPT4ge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHVuaXREYXRhLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgaWYgKHVuaXREYXRhW2ldLnZhbHVlID09PSB1bml0RGF0YUxlZ3BFbG0udmFsdWUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubGVuZ3RoVW5pdCA9IHVuaXREYXRhW2ldLnZhbHVlXHJcbiAgICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIOaLn+WQiOmVv+W6puWNleS9jVxyXG4gICAgICAgIC8vIGxldCBmaXRVbml0RGF0YSA9IFtcclxuICAgICAgICAvLyAgIHtcclxuICAgICAgICAvLyAgICAgbmFtZTogJ+exsycsXHJcbiAgICAgICAgLy8gICAgIHZhbHVlOiAn57GzJ1xyXG4gICAgICAgIC8vICAgfSxcclxuICAgICAgICAvLyAgIHtcclxuICAgICAgICAvLyAgICAgbmFtZTogJ+WNg+exsycsXHJcbiAgICAgICAgLy8gICAgIHZhbHVlOiAn5Y2D57GzJ1xyXG4gICAgICAgIC8vICAgfVxyXG4gICAgICAgIC8vIF1cclxuXHJcbiAgICAgICAgLy8gbGV0IGZpdFVuaXREYXRhTGVncE9iamVjdCA9IGxlZ3AoXHJcbiAgICAgICAgLy8gICB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFxyXG4gICAgICAgIC8vICAgICAnaW5wdXQtc2VsZWN0LWZpdC11bml0LWJveCdcclxuICAgICAgICAvLyAgIClbMF0sXHJcbiAgICAgICAgLy8gICAnLmlucHV0LXNlbGVjdC1maXQtdW5pdCdcclxuICAgICAgICAvLyApXHJcbiAgICAgICAgLy8gaWYgKGZpdFVuaXREYXRhTGVncE9iamVjdCkge1xyXG4gICAgICAgIC8vICAgZml0VW5pdERhdGFMZWdwT2JqZWN0LmxlZ3Bfc2VhcmNoKGZpdFVuaXREYXRhKVxyXG4gICAgICAgIC8vICAgbGV0IGZpdFVuaXREYXRhTGVncEVsbSA9IHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50XHJcbiAgICAgICAgLy8gICAgIC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdpbnB1dC1zZWxlY3QtZml0LXVuaXQnKVswXVxyXG4gICAgICAgIC8vICAgICAuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2lucHV0JylbMF1cclxuICAgICAgICAvLyAgIHRoaXMuX2VsbXMuZml0TGVuZ3RoVW5pdCA9IFtmaXRVbml0RGF0YUxlZ3BFbG1dXHJcbiAgICAgICAgLy8gICBmaXRVbml0RGF0YUxlZ3BFbG0udmFsdWUgPSB0aGlzLm9wdGlvbnNbJ2ZpdC1sZW5ndGgtdW5pdCddXHJcbiAgICAgICAgLy8gICBmb3IgKGxldCBpID0gMDsgaSA8IGZpdFVuaXREYXRhLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgLy8gICAgIGlmIChmaXRVbml0RGF0YVtpXS52YWx1ZSA9PT0gZml0VW5pdERhdGFMZWdwRWxtLnZhbHVlKSB7XHJcbiAgICAgICAgLy8gICAgICAgZml0VW5pdERhdGFMZWdwT2JqZWN0LmxlZ3Bfc2VhcmNoQWN0aXZlKGZpdFVuaXREYXRhW2ldLnZhbHVlKVxyXG4gICAgICAgIC8vICAgICAgIGJyZWFrXHJcbiAgICAgICAgLy8gICAgIH1cclxuICAgICAgICAvLyAgIH1cclxuICAgICAgICAvLyAgIGZpdFVuaXREYXRhTGVncEVsbS5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICgpID0+IHtcclxuICAgICAgICAvLyAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaXRVbml0RGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIC8vICAgICAgIGlmIChmaXRVbml0RGF0YVtpXS52YWx1ZSA9PT0gZml0VW5pdERhdGFMZWdwRWxtLnZhbHVlKSB7XHJcbiAgICAgICAgLy8gICAgICAgICB0aGlzLmZpdExlbmd0aFVuaXQgPSBmaXRVbml0RGF0YVtpXS52YWx1ZVxyXG4gICAgICAgIC8vICAgICAgICAgYnJlYWtcclxuICAgICAgICAvLyAgICAgICB9XHJcbiAgICAgICAgLy8gICAgIH1cclxuICAgICAgICAvLyAgIH0pXHJcbiAgICAgICAgLy8gfVxyXG5cclxuICAgICAgICBsZXQgbGluZVR5cGVEYXRhID0gW1xyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lOiAnPGkgY2xhc3M9XCJpY29uIGxpbmVcIj48L2k+5a6e57q/JyxcclxuICAgICAgICAgICAgdmFsdWU6ICflrp7nur8nLFxyXG4gICAgICAgICAgICBrZXk6IDAsXHJcbiAgICAgICAgICAgIGljb246ICdsaW5lJ1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJzxpIGNsYXNzPVwiaWNvbiBkYXNoLWxpbmVcIj48L2k+6Jma57q/JyxcclxuICAgICAgICAgICAgdmFsdWU6ICfomZrnur8nLFxyXG4gICAgICAgICAgICBrZXk6IDEsXHJcbiAgICAgICAgICAgIGljb246ICdkYXNoLWxpbmUnXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lOiAnPGkgY2xhc3M9XCJpY29uIGxpZ2h0LWxpbmVcIj48L2k+5rOb5YWJJyxcclxuICAgICAgICAgICAgdmFsdWU6ICfms5vlhYknLFxyXG4gICAgICAgICAgICBrZXk6IDIsXHJcbiAgICAgICAgICAgIGljb246ICdsaWdodC1saW5lJ1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJzxpIGNsYXNzPVwiaWNvbiB0YWlsLWxpbmVcIj48L2k+5bC+6L+55YWJ57q/JyxcclxuICAgICAgICAgICAgdmFsdWU6ICflsL7ov7nlhYnnur8nLFxyXG4gICAgICAgICAgICBrZXk6IDMsXHJcbiAgICAgICAgICAgIGljb246ICd0YWlsLWxpbmUnXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lOiAnPGkgY2xhc3M9XCJpY29uIG11bHQtdGFpbC1saW5lXCI+PC9pPuWkmuWwvui/ueWFiee6vycsXHJcbiAgICAgICAgICAgIHZhbHVlOiAn5aSa5bC+6L+55YWJ57q/JyxcclxuICAgICAgICAgICAga2V5OiA0LFxyXG4gICAgICAgICAgICBpY29uOiAnbXVsdC10YWlsLWxpbmUnXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lOiAnPGkgY2xhc3M9XCJpY29uIGZsb3ctZGFzaC1saW5lMVwiPjwvaT7mtYHliqjomZrnur8xJyxcclxuICAgICAgICAgICAgdmFsdWU6ICfmtYHliqjomZrnur8xJyxcclxuICAgICAgICAgICAga2V5OiA1LFxyXG4gICAgICAgICAgICBpY29uOiAnZmxvdy1kYXNoLWxpbmUxJ1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJzxpIGNsYXNzPVwiaWNvbiBmbG93LWRhc2gtbGluZTJcIj48L2k+5rWB5Yqo6Jma57q/MicsXHJcbiAgICAgICAgICAgIHZhbHVlOiAn5rWB5Yqo6Jma57q/MicsXHJcbiAgICAgICAgICAgIGtleTogNixcclxuICAgICAgICAgICAgaWNvbjogJ2Zsb3ctZGFzaC1saW5lMidcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIG5hbWU6ICc8aSBjbGFzcz1cImljb24gcGljLWxpbmUxXCI+PC9pPua1geWKqOeureWktDEnLFxyXG4gICAgICAgICAgICB2YWx1ZTogJ+a1geWKqOeureWktDEnLFxyXG4gICAgICAgICAgICBrZXk6IDcsXHJcbiAgICAgICAgICAgIGljb246ICdwaWMtbGluZTEnXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lOiAnPGkgY2xhc3M9XCJpY29uIHBpYy1saW5lMlwiPjwvaT7mtYHliqjnrq3lpLQyJyxcclxuICAgICAgICAgICAgdmFsdWU6ICfmtYHliqjnrq3lpLQyJyxcclxuICAgICAgICAgICAga2V5OiA4LFxyXG4gICAgICAgICAgICBpY29uOiAncGljLWxpbmUyJ1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJzxpIGNsYXNzPVwiaWNvbiBwaWMtbGluZTNcIj48L2k+5rWB5Yqo566t5aS0MycsXHJcbiAgICAgICAgICAgIHZhbHVlOiAn5rWB5Yqo566t5aS0MycsXHJcbiAgICAgICAgICAgIGtleTogOSxcclxuICAgICAgICAgICAgaWNvbjogJ3BpYy1saW5lMydcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIG5hbWU6ICc8aSBjbGFzcz1cImljb24gcGljLWxpbmU0XCI+PC9pPua1geWKqOeureWktDQnLFxyXG4gICAgICAgICAgICB2YWx1ZTogJ+a1geWKqOeureWktDQnLFxyXG4gICAgICAgICAgICBrZXk6IDEwLFxyXG4gICAgICAgICAgICBpY29uOiAncGljLWxpbmU0J1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJzxpIGNsYXNzPVwiaWNvbiBwaWMtbGluZTVcIj48L2k+5rWB5Yqo566t5aS0NScsXHJcbiAgICAgICAgICAgIHZhbHVlOiAn5rWB5Yqo566t5aS0NScsXHJcbiAgICAgICAgICAgIGtleTogMTEsXHJcbiAgICAgICAgICAgIGljb246ICdwaWMtbGluZTUnXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lOiAnPGkgY2xhc3M9XCJpY29uIHBpYy1saW5lNlwiPjwvaT7mtYHliqjnrq3lpLQ2JyxcclxuICAgICAgICAgICAgdmFsdWU6ICfmtYHliqjnrq3lpLQ2JyxcclxuICAgICAgICAgICAga2V5OiAxMixcclxuICAgICAgICAgICAgaWNvbjogJ3BpYy1saW5lNidcclxuICAgICAgICAgIH1cclxuICAgICAgICBdXHJcbiAgICAgICAgbGV0IGxpbmVUeXBlRGF0YUxlZ3BPYmplY3QgPSBsZWdwKFxyXG4gICAgICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcclxuICAgICAgICAgICAgJ2lucHV0LXNlbGVjdC1saW5lLXR5cGUtYm94J1xyXG4gICAgICAgICAgKVswXSxcclxuICAgICAgICAgICcuaW5wdXQtc2VsZWN0LWxpbmUtdHlwZSdcclxuICAgICAgICApXHJcbiAgICAgICAgaWYgKGxpbmVUeXBlRGF0YUxlZ3BPYmplY3QpIHtcclxuICAgICAgICAgIGxpbmVUeXBlRGF0YUxlZ3BPYmplY3QubGVncF9zZWFyY2gobGluZVR5cGVEYXRhKVxyXG5cclxuICAgICAgICAgIGxldCBpQWN0aXZlRWxtMiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2knKVxyXG4gICAgICAgICAgaUFjdGl2ZUVsbTIuY2xhc3NOYW1lID0gJ2ljb24gaWNvbi1hY3RpdmUnXHJcbiAgICAgICAgICB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdpbnB1dC1zZWxlY3QtbGluZS10eXBlJylbMF0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnY3lfZGF0YWxpc3QnKVswXS5hcHBlbmRDaGlsZChpQWN0aXZlRWxtMilcclxuXHJcbiAgICAgICAgICBsZXQgbGluZVR5cGVEYXRhTGVncEVsbSA9IHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50XHJcbiAgICAgICAgICAgIC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdpbnB1dC1zZWxlY3QtbGluZS10eXBlJylbMF1cclxuICAgICAgICAgICAgLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdpbnB1dCcpWzBdXHJcbiAgICAgICAgICB0aGlzLl9lbG1zLmxpbmVUeXBlID0gW2xpbmVUeXBlRGF0YUxlZ3BFbG1dXHJcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmVUeXBlRGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAobGluZVR5cGVEYXRhW2ldLmtleSA9PT0gdGhpcy5vcHRpb25zLnR5cGUpIHtcclxuICAgICAgICAgICAgICBsaW5lVHlwZURhdGFMZWdwT2JqZWN0LmxlZ3Bfc2VhcmNoQWN0aXZlKGxpbmVUeXBlRGF0YVtpXS52YWx1ZSlcclxuICAgICAgICAgICAgICBsaW5lVHlwZURhdGFMZWdwRWxtLnZhbHVlID0gbGluZVR5cGVEYXRhW2ldLnZhbHVlXHJcbiAgICAgICAgICAgICAgaUFjdGl2ZUVsbTIuY2xhc3NOYW1lID0gYGljb24gaWNvbi1hY3RpdmUgJHtsaW5lVHlwZURhdGFbaV0uaWNvbn1gXHJcbiAgICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgbGluZVR5cGVEYXRhTGVncEVsbS5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICgpID0+IHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lVHlwZURhdGEubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICBpZiAobGluZVR5cGVEYXRhW2ldLnZhbHVlID09PSBsaW5lVHlwZURhdGFMZWdwRWxtLnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxpbmVUeXBlID0gbGluZVR5cGVEYXRhW2ldLmtleVxyXG4gICAgICAgICAgICAgICAgaUFjdGl2ZUVsbTIuY2xhc3NOYW1lID0gYGljb24gaWNvbi1hY3RpdmUgJHtsaW5lVHlwZURhdGFbaV0uaWNvbn1gXHJcblxyXG4gICAgICAgICAgICAgICAgLy/mjqfliLblj4LmlbDmmL7pmpBcclxuICAgICAgICAgICAgICAgIGlmICgyIDwgdGhpcy5saW5lVHlwZSAmJiB0aGlzLmxpbmVUeXBlIDwgMTMpIHsvL+i0tOWbvuWPguaVsFxyXG4gICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGFzaFRleHR1cmVEb20nKSAmJiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rhc2hUZXh0dXJlRG9tJykuc3R5bGUuZGlzcGxheSA9ICdmbGV4JylcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkYXNoVGV4dHVyZURvbScpICYmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGFzaFRleHR1cmVEb20nKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKDIgPCB0aGlzLmxpbmVUeXBlICYmIHRoaXMubGluZVR5cGUgPCA1KSB7Ly/lsL7ov7nlj4LmlbBcclxuICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbGluZVNwYWNlJylbMF0gJiYgKGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xpbmVTcGFjZScpWzBdLnN0eWxlLmRpc3BsYXkgPSAnbm9uZScpXHJcbiAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xpbmVTcGFjZScpWzFdICYmIChkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdsaW5lU3BhY2UnKVsxXS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnKVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbGluZVNwYWNlJylbMF0gJiYgKGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xpbmVTcGFjZScpWzBdLnN0eWxlLmRpc3BsYXkgPSAnZmxleCcpXHJcbiAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xpbmVTcGFjZScpWzFdICYmIChkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdsaW5lU3BhY2UnKVsxXS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgaGVpZ2h0Qm94RWxtID0gdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaGVpZ2h0LWJveCcpWzBdXHJcbiAgICAgICAgbGV0IGhlaWdodEVsbSA9IGhlaWdodEJveEVsbS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdoZWlnaHQnKVswXVxyXG4gICAgICAgIGxldCBoZWlnaHRDb25maXJtRWxtID0gdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaGVpZ2h0LWNvbmZpcm0nKVswXVxyXG4gICAgICAgIGhlaWdodEVsbS52YWx1ZSA9IDEwXHJcbiAgICAgICAgaWYgKHRoaXMuaGVpZ2h0TW9kZSA9PSAyKSB7XHJcbiAgICAgICAgICBoZWlnaHRCb3hFbG0gJiYgKGhlaWdodEJveEVsbS5jbGFzc05hbWUgPSAnaW5wdXQtbnVtYmVyIGlucHV0LW51bWJlci11bml0LTEgaGVpZ2h0LWJveCBkaXNhYmxlZCcpO1xyXG4gICAgICAgICAgaGVpZ2h0Q29uZmlybUVsbSAmJiBoZWlnaHRDb25maXJtRWxtLnNldEF0dHJpYnV0ZSgnZGlzYWJsZWQnLCAnZGlzYWJsZWQnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBoZWlnaHRCb3hFbG0gJiYgKGhlaWdodEJveEVsbS5jbGFzc05hbWUgPSAnaW5wdXQtbnVtYmVyIGlucHV0LW51bWJlci11bml0LTEgaGVpZ2h0LWJveCcpO1xyXG4gICAgICAgICAgaGVpZ2h0Q29uZmlybUVsbSAmJiBoZWlnaHRDb25maXJtRWxtLnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZWQnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IGhlaWdodE1vZGVEYXRhID0gW1xyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lOiAn5rW35ouU6auY5bqmJyxcclxuICAgICAgICAgICAgdmFsdWU6ICfmtbfmi5Tpq5jluqYnLFxyXG4gICAgICAgICAgICBrZXk6ICcwJyxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIG5hbWU6ICfnm7jlr7nlnLDooagnLFxyXG4gICAgICAgICAgICB2YWx1ZTogJ+ebuOWvueWcsOihqCcsXHJcbiAgICAgICAgICAgIGtleTogJzEnLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJ+S+nemZhOaooeWeiycsXHJcbiAgICAgICAgICAgIHZhbHVlOiAn5L6d6ZmE5qih5Z6LJyxcclxuICAgICAgICAgICAga2V5OiAnMicsXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgXVxyXG4gICAgICAgIGxldCBoZWlnaHRNb2RlT2JqZWN0ID0gbGVncChcclxuICAgICAgICAgIHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXHJcbiAgICAgICAgICAgICdoZWlnaHQtbW9kZS1ib3gnXHJcbiAgICAgICAgICApWzBdLFxyXG4gICAgICAgICAgJy5oZWlnaHQtbW9kZSdcclxuICAgICAgICApXHJcbiAgICAgICAgaWYgKGhlaWdodE1vZGVPYmplY3QpIHtcclxuICAgICAgICAgIGhlaWdodE1vZGVPYmplY3QubGVncF9zZWFyY2goaGVpZ2h0TW9kZURhdGEpXHJcbiAgICAgICAgICBsZXQgaGVpZ2h0TW9kZURhdGFMZWdwRWxtID0gdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnRcclxuICAgICAgICAgICAgLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2hlaWdodC1tb2RlJylbMF1cclxuICAgICAgICAgICAgLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdpbnB1dCcpWzBdXHJcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhlaWdodE1vZGVEYXRhLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChoZWlnaHRNb2RlRGF0YVtpXS5rZXkgPT0gdGhpcy5oZWlnaHRNb2RlKSB7XHJcbiAgICAgICAgICAgICAgaGVpZ2h0TW9kZURhdGFMZWdwRWxtLnZhbHVlID0gaGVpZ2h0TW9kZURhdGFbaV0udmFsdWVcclxuICAgICAgICAgICAgICBoZWlnaHRNb2RlT2JqZWN0LmxlZ3Bfc2VhcmNoQWN0aXZlKFxyXG4gICAgICAgICAgICAgICAgaGVpZ2h0TW9kZURhdGFbaV0udmFsdWVcclxuICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaGVpZ2h0TW9kZURhdGFMZWdwRWxtLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKCkgPT4ge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhlaWdodE1vZGVEYXRhLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgaWYgKGhlaWdodE1vZGVEYXRhW2ldLnZhbHVlID09PSBoZWlnaHRNb2RlRGF0YUxlZ3BFbG0udmFsdWUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaGVpZ2h0TW9kZSA9IGhlaWdodE1vZGVEYXRhW2ldLmtleVxyXG4gICAgICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pXHJcblxyXG4gICAgICAgICAgaGVpZ2h0RWxtLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKCkgPT4ge1xyXG4gICAgICAgICAgICBzd2l0Y2ggKHRoaXMuaGVpZ2h0TW9kZSkge1xyXG4gICAgICAgICAgICAgIGNhc2UgMDpcclxuICAgICAgICAgICAgICBjYXNlICcwJzpcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgIGNhc2UgMTpcclxuICAgICAgICAgICAgICBjYXNlICcxJzpcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgIGNhc2UgMjpcclxuICAgICAgICAgICAgICBjYXNlICcyJzpcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KVxyXG5cclxuICAgICAgICAgIHRoaXMuX2VsbXMuaGVpZ2h0ID0gaGVpZ2h0RWxtXHJcbiAgICAgICAgICB0aGlzLl9lbG1zLmhlaWdodEJveCA9IGhlaWdodEJveEVsbVxyXG4gICAgICAgICAgdGhpcy5fZWxtcy5oZWlnaHRNb2RlID0gaGVpZ2h0TW9kZURhdGFMZWdwRWxtXHJcbiAgICAgICAgICB0aGlzLl9lbG1zLmhlaWdodENvbmZpcm0gPSBoZWlnaHRDb25maXJtRWxtXHJcbiAgICAgICAgICB0aGlzLl9lbG1zLmhlaWdodE1vZGVPYmplY3QgPSBoZWlnaHRNb2RlT2JqZWN0XHJcblxyXG4gICAgICAgICAgaGVpZ2h0Q29uZmlybUVsbS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5wb3NpdGlvbkVkaXRpbmcgPSBmYWxzZVxyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMub3B0aW9ucy5wb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmFsdCA9IE51bWJlcigodGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5hbHQgKyBOdW1iZXIoaGVpZ2h0RWxtLnZhbHVlKSkudG9GaXhlZCgyKSlcclxuICAgICAgICAgICAgICB0aGlzLl9lbG1zLmFsdFtpXS5pbm5lckhUTUwgPSB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmFsdFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGxldCBmcm9tRGVncmVlc0FycmF5ID0gdGhpcy5yZW5ld1Bvc2l0aW9ucyh0aGlzLm9wdGlvbnMucG9zaXRpb25zKVxyXG4gICAgICAgICAgICB0aGlzLmVudGl0eS5wb2x5bGluZS5wb3NpdGlvbnMgPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlc0FycmF5SGVpZ2h0cyhcclxuICAgICAgICAgICAgICBmcm9tRGVncmVlc0FycmF5XHJcbiAgICAgICAgICAgIClcclxuXHJcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb25FZGl0aW5nID0gZmFsc2VcclxuICAgICAgICAgICAgdGhpcy5jbG9zZU5vZGVFZGl0KClcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgdGFibGVFbG0gPSBjb250ZW50RWxtLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3NwYXRpYWwtaW5mby10YWJsZScpWzBdXHJcbiAgICAgICAgbGV0IHRCb2R5RWxtID0gdGFibGVFbG0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndGFibGUtYm9keScpWzBdXHJcbiAgICAgICAgdGhpcy5fZWxtcy5sbmcgPSBbXVxyXG4gICAgICAgIHRoaXMuX2VsbXMubG5nSW5wdXQgPSBbXVxyXG4gICAgICAgIHRoaXMuX2VsbXMubGF0ID0gW11cclxuICAgICAgICB0aGlzLl9lbG1zLmxhdElucHV0ID0gW11cclxuICAgICAgICB0aGlzLl9lbG1zLmFsdCA9IFtdXHJcbiAgICAgICAgdGhpcy5fZWxtcy5hbHRJbnB1dCA9IFtdXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm9wdGlvbnMucG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBsZXQgdHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKVxyXG4gICAgICAgICAgdHIuY2xhc3NOYW1lID0gJ3RyJ1xyXG4gICAgICAgICAgdHIuaW5uZXJIVE1MID0gYFxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGRcIj4ke2kgKyAxfTwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGQgbG5nIGFsaWduLWNlbnRlclwiPjwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGQgbGF0IGFsaWduLWNlbnRlclwiPjwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGQgYWx0IGFsaWduLWNlbnRlclwiPjwvZGl2PlxyXG4gICAgICAgICAgYFxyXG4gICAgICAgICAgbGV0IGxuZ0JveCA9IHRyLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xuZycpWzBdXHJcbiAgICAgICAgICBsZXQgbG5nID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpXHJcbiAgICAgICAgICBsbmcuaW5uZXJIVE1MID0gKHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubG5nKS50b0ZpeGVkKDgpXHJcbiAgICAgICAgICBsbmdCb3guYXBwZW5kQ2hpbGQobG5nKVxyXG4gICAgICAgICAgbGV0IGxuZ0lucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKVxyXG4gICAgICAgICAgbG5nSW5wdXQuY2xhc3NOYW1lID0gJ2lucHV0J1xyXG4gICAgICAgICAgbG5nSW5wdXQudHlwZSA9ICdudW1iZXInXHJcbiAgICAgICAgICBsbmdJbnB1dC50aXRsZSA9ICcnXHJcbiAgICAgICAgICBsbmdJbnB1dC5taW4gPSAtMTgwXHJcbiAgICAgICAgICBsbmdJbnB1dC5tYXggPSAxODBcclxuICAgICAgICAgIGxuZ0lucHV0LnZhbHVlID0gKHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubG5nKS50b0ZpeGVkKDgpXHJcblxyXG4gICAgICAgICAgbGV0IGxhdEJveCA9IHRyLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xhdCcpWzBdXHJcbiAgICAgICAgICBsZXQgbGF0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpXHJcbiAgICAgICAgICBsYXQuaW5uZXJIVE1MID0gKHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubGF0KS50b0ZpeGVkKDgpXHJcbiAgICAgICAgICBsYXRCb3guYXBwZW5kQ2hpbGQobGF0KVxyXG4gICAgICAgICAgbGV0IGxhdElucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKVxyXG4gICAgICAgICAgbGF0SW5wdXQuY2xhc3NOYW1lID0gJ2lucHV0J1xyXG4gICAgICAgICAgbGF0SW5wdXQudHlwZSA9ICdudW1iZXInXHJcbiAgICAgICAgICBsYXRJbnB1dC50aXRsZSA9ICcnXHJcbiAgICAgICAgICBsYXRJbnB1dC5taW4gPSAtOTBcclxuICAgICAgICAgIGxhdElucHV0Lm1heCA9IDkwXHJcbiAgICAgICAgICBsYXRJbnB1dC52YWx1ZSA9ICh0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxhdCkudG9GaXhlZCg4KVxyXG5cclxuICAgICAgICAgIGxldCBhbHRCb3ggPSB0ci5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdhbHQnKVswXVxyXG4gICAgICAgICAgbGV0IGFsdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKVxyXG4gICAgICAgICAgYWx0LmlubmVySFRNTCA9ICh0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmFsdCkudG9GaXhlZCgyKVxyXG4gICAgICAgICAgYWx0Qm94LmFwcGVuZENoaWxkKGFsdClcclxuICAgICAgICAgIGxldCBhbHRJbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0JylcclxuICAgICAgICAgIGFsdElucHV0LmNsYXNzTmFtZSA9ICdpbnB1dCdcclxuICAgICAgICAgIGFsdElucHV0LnR5cGUgPSAnbnVtYmVyJ1xyXG4gICAgICAgICAgYWx0SW5wdXQudGl0bGUgPSAnJ1xyXG4gICAgICAgICAgYWx0SW5wdXQubWluID0gLTk5OTk5OTlcclxuICAgICAgICAgIGFsdElucHV0Lm1heCA9IDk5OTk5OTk5OVxyXG4gICAgICAgICAgYWx0SW5wdXQudmFsdWUgPSAodGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5hbHQpLnRvRml4ZWQoMilcclxuXHJcbiAgICAgICAgICBsbmdCb3guYWRkRXZlbnRMaXN0ZW5lcignZGJsY2xpY2snLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGxuZ0JveC5pbm5lckhUTUwgPSAnJ1xyXG4gICAgICAgICAgICBsbmdJbnB1dC52YWx1ZSA9IE51bWJlcih0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxuZy50b0ZpeGVkKDgpKVxyXG4gICAgICAgICAgICBsbmdCb3guYXBwZW5kQ2hpbGQobG5nSW5wdXQpXHJcbiAgICAgICAgICAgIGxuZ0lucHV0LmZvY3VzKClcclxuICAgICAgICAgICAgdGhpcy5wb3NpdGlvbkVkaXRpbmcgPSBmYWxzZVxyXG4gICAgICAgICAgICB0aGlzLmNsb3NlTm9kZUVkaXQoKVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIGxuZ0lucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2JsdXInLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGxuZ0lucHV0LnZhbHVlID0gTnVtYmVyKHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubG5nLnRvRml4ZWQoOCkpXHJcbiAgICAgICAgICAgIGxuZ0JveC5pbm5lckhUTUwgPSAnJ1xyXG4gICAgICAgICAgICBsbmdCb3guYXBwZW5kQ2hpbGQobG5nKVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIGxuZ0lucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxuZyA9IE51bWJlcihOdW1iZXIobG5nSW5wdXQudmFsdWUpLnRvRml4ZWQoOCkpXHJcbiAgICAgICAgICAgIGxuZy5pbm5lckhUTUwgPSB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxuZy50b0ZpeGVkKDgpXHJcbiAgICAgICAgICAgIGxldCBmcm9tRGVncmVlc0FycmF5ID0gdGhpcy5yZW5ld1Bvc2l0aW9ucyh0aGlzLm9wdGlvbnMucG9zaXRpb25zKVxyXG4gICAgICAgICAgICB0aGlzLmVudGl0eS5wb2x5bGluZS5wb3NpdGlvbnMgPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlc0FycmF5SGVpZ2h0cyhmcm9tRGVncmVlc0FycmF5KVxyXG4gICAgICAgICAgICB0aGlzLmxhYmVsLnBvc2l0aW9uID0gW3RoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0ubG5nLCB0aGlzLm9wdGlvbnMucG9zaXRpb25zWzBdLmxhdCwgZnJvbURlZ3JlZXNBcnJheVsyXV1cclxuICAgICAgICAgIH0pXHJcblxyXG4gICAgICAgICAgbGF0Qm94LmFkZEV2ZW50TGlzdGVuZXIoJ2RibGNsaWNrJywgKCkgPT4ge1xyXG4gICAgICAgICAgICBsYXRCb3guaW5uZXJIVE1MID0gJydcclxuICAgICAgICAgICAgbGF0SW5wdXQudmFsdWUgPSBOdW1iZXIodGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sYXQudG9GaXhlZCg4KSlcclxuICAgICAgICAgICAgbGF0Qm94LmFwcGVuZENoaWxkKGxhdElucHV0KVxyXG4gICAgICAgICAgICBsYXRJbnB1dC5mb2N1cygpXHJcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb25FZGl0aW5nID0gZmFsc2VcclxuICAgICAgICAgICAgdGhpcy5jbG9zZU5vZGVFZGl0KClcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICBsYXRJbnB1dC5hZGRFdmVudExpc3RlbmVyKCdibHVyJywgKCkgPT4ge1xyXG4gICAgICAgICAgICBsYXRJbnB1dC52YWx1ZSA9IE51bWJlcih0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxhdC50b0ZpeGVkKDgpKVxyXG4gICAgICAgICAgICBsYXRCb3guaW5uZXJIVE1MID0gJydcclxuICAgICAgICAgICAgbGF0Qm94LmFwcGVuZENoaWxkKGxhdClcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICBsYXRJbnB1dC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sYXQgPSBOdW1iZXIoTnVtYmVyKGxhdElucHV0LnZhbHVlKS50b0ZpeGVkKDgpKVxyXG4gICAgICAgICAgICBsYXQuaW5uZXJIVE1MID0gdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sYXQudG9GaXhlZCg4KVxyXG4gICAgICAgICAgICBsZXQgZnJvbURlZ3JlZXNBcnJheSA9IHRoaXMucmVuZXdQb3NpdGlvbnModGhpcy5vcHRpb25zLnBvc2l0aW9ucylcclxuICAgICAgICAgICAgdGhpcy5lbnRpdHkucG9seWxpbmUucG9zaXRpb25zID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXNBcnJheUhlaWdodHMoZnJvbURlZ3JlZXNBcnJheSlcclxuICAgICAgICAgICAgdGhpcy5sYWJlbC5wb3NpdGlvbiA9IFt0aGlzLm9wdGlvbnMucG9zaXRpb25zWzBdLmxuZywgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXS5sYXQsIGZyb21EZWdyZWVzQXJyYXlbMl1dXHJcbiAgICAgICAgICB9KVxyXG5cclxuICAgICAgICAgIGFsdEJveC5hZGRFdmVudExpc3RlbmVyKCdkYmxjbGljaycsICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuaGVpZ2h0TW9kZSA9PSAyKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGFsdEJveC5pbm5lckhUTUwgPSAnJ1xyXG4gICAgICAgICAgICBhbHRJbnB1dC52YWx1ZSA9IE51bWJlcih0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmFsdC50b0ZpeGVkKDIpKVxyXG4gICAgICAgICAgICBhbHRCb3guYXBwZW5kQ2hpbGQoYWx0SW5wdXQpXHJcbiAgICAgICAgICAgIGFsdElucHV0LmZvY3VzKClcclxuICAgICAgICAgICAgdGhpcy5wb3NpdGlvbkVkaXRpbmcgPSBmYWxzZVxyXG4gICAgICAgICAgICB0aGlzLmNsb3NlTm9kZUVkaXQoKVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIGFsdElucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2JsdXInLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGFsdElucHV0LnZhbHVlID0gTnVtYmVyKHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0uYWx0LnRvRml4ZWQoMikpXHJcbiAgICAgICAgICAgIGFsdEJveC5pbm5lckhUTUwgPSAnJ1xyXG4gICAgICAgICAgICBhbHRCb3guYXBwZW5kQ2hpbGQoYWx0KVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIGFsdElucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmFsdCA9IE51bWJlcihOdW1iZXIoYWx0SW5wdXQudmFsdWUpLnRvRml4ZWQoMikpXHJcbiAgICAgICAgICAgIGFsdC5pbm5lckhUTUwgPSB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmFsdC50b0ZpeGVkKDIpXHJcbiAgICAgICAgICAgIGxldCBmcm9tRGVncmVlc0FycmF5ID0gdGhpcy5yZW5ld1Bvc2l0aW9ucyh0aGlzLm9wdGlvbnMucG9zaXRpb25zKVxyXG4gICAgICAgICAgICB0aGlzLmVudGl0eS5wb2x5bGluZS5wb3NpdGlvbnMgPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlc0FycmF5SGVpZ2h0cyhmcm9tRGVncmVlc0FycmF5KVxyXG4gICAgICAgICAgICB0aGlzLmxhYmVsLnBvc2l0aW9uID0gW3RoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0ubG5nLCB0aGlzLm9wdGlvbnMucG9zaXRpb25zWzBdLmxhdCwgZnJvbURlZ3JlZXNBcnJheVsyXV1cclxuICAgICAgICAgIH0pXHJcblxyXG4gICAgICAgICAgdGhpcy5fZWxtcy5sbmcucHVzaChsbmcpXHJcbiAgICAgICAgICB0aGlzLl9lbG1zLmxuZ0lucHV0LnB1c2gobG5nSW5wdXQpXHJcbiAgICAgICAgICB0aGlzLl9lbG1zLmxhdC5wdXNoKGxhdClcclxuICAgICAgICAgIHRoaXMuX2VsbXMubGF0SW5wdXQucHVzaChsYXRJbnB1dClcclxuICAgICAgICAgIHRoaXMuX2VsbXMuYWx0LnB1c2goYWx0KVxyXG4gICAgICAgICAgdGhpcy5fZWxtcy5hbHRJbnB1dC5wdXNoKGFsdElucHV0KVxyXG4gICAgICAgICAgdEJvZHlFbG0uYXBwZW5kQ2hpbGQodHIpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgZm9udERhdGEgPSBnZXRGb250TGlzdCgpXHJcbiAgICAgICAgbGV0IGZvbnRPYmplY3QgPSBsZWdwKFxyXG4gICAgICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcclxuICAgICAgICAgICAgJ2ZvbnQtc2VsZWN0LWJveCdcclxuICAgICAgICAgIClbMF0sXHJcbiAgICAgICAgICAnLmZvbnQtc2VsZWN0J1xyXG4gICAgICAgIClcclxuICAgICAgICBpZiAoZm9udE9iamVjdCkge1xyXG4gICAgICAgICAgZm9udE9iamVjdC5sZWdwX3NlYXJjaChmb250RGF0YSlcclxuICAgICAgICAgIGxldCBmb250RGF0YUxlZ3BFbG0gPSB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudFxyXG4gICAgICAgICAgICAuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnZm9udC1zZWxlY3QnKVswXVxyXG4gICAgICAgICAgICAuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2lucHV0JylbMF1cclxuICAgICAgICAgIGZvbnREYXRhTGVncEVsbS52YWx1ZSA9IGZvbnREYXRhW3RoaXMubGFiZWxGb250RmFtaWx5XS52YWx1ZVxyXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmb250RGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoZm9udERhdGFbaV0udmFsdWUgPT0gZm9udERhdGFMZWdwRWxtLnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgZm9udE9iamVjdC5sZWdwX3NlYXJjaEFjdGl2ZShmb250RGF0YVtpXS52YWx1ZSlcclxuICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBmb250RGF0YUxlZ3BFbG0uYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZm9udERhdGEubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICBpZiAoZm9udERhdGFbaV0udmFsdWUgPT09IGZvbnREYXRhTGVncEVsbS52YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sYWJlbEZvbnRGYW1pbHkgPSBmb250RGF0YVtpXS5rZXlcclxuICAgICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgdGhpcy5fZWxtcy5sYWJlbEZvbnRGYW1pbHkgPSBbZm9udERhdGFMZWdwRWxtXVxyXG4gICAgICAgIH1cclxuICAgICAgfSwgMClcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmICh0aGlzLl9EaWFsb2dPYmplY3QgJiYgdGhpcy5fRGlhbG9nT2JqZWN0LmNsb3NlKSB7XHJcbiAgICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0LmNsb3NlKClcclxuICAgICAgICB0aGlzLl9EaWFsb2dPYmplY3QgPSBudWxsXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIOW5s+a7keWkhOeQhlxyXG4gIHNtb290aEhhbmRsZShwb3NpdGlvbnMpIHtcclxuICAgIGxldCBuZXdQb3NpdGlvbnMgPSBbXVxyXG4gICAgbGV0IHRpbWUgPSBbXVxyXG4gICAgbGV0IGZyb21EZWdyZWVzQXJyYXlIZWlnaHRzID0gW11cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGZyb21EZWdyZWVzQXJyYXlIZWlnaHRzLnB1c2goXHJcbiAgICAgICAgcG9zaXRpb25zW2ldLmxuZyxcclxuICAgICAgICBwb3NpdGlvbnNbaV0ubGF0LFxyXG4gICAgICAgIHBvc2l0aW9uc1tpXS5hbHRcclxuICAgICAgKVxyXG4gICAgICB0aW1lLnB1c2goaSAvIChwb3NpdGlvbnMubGVuZ3RoIC0gMSkpXHJcbiAgICB9XHJcbiAgICBsZXQgc3BsaW5lID0gbmV3IENlc2l1bS5DYXRtdWxsUm9tU3BsaW5lKHtcclxuICAgICAgdGltZXM6IHRpbWUsXHJcbiAgICAgIHBvaW50czogQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXNBcnJheUhlaWdodHMoZnJvbURlZ3JlZXNBcnJheUhlaWdodHMpXHJcbiAgICB9KVxyXG4gICAgbGV0IGxlbmd0aCA9IHBvc2l0aW9ucy5sZW5ndGggKiAyMFxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gbGVuZ3RoOyBpKyspIHtcclxuICAgICAgbGV0IGNhcnRlc2lhbjMgPSBzcGxpbmUuZXZhbHVhdGUoaSAvIGxlbmd0aClcclxuICAgICAgbmV3UG9zaXRpb25zLnB1c2godGhpcy5jYXJ0ZXNpYW4zVG93Z3M4NChjYXJ0ZXNpYW4zLCB0aGlzLnNkay52aWV3ZXIpKVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5ld1Bvc2l0aW9uc1xyXG4gIH1cclxuXHJcbiAgLy8g5pu05paw5Z2Q5qCHXHJcbiAgcmVuZXdQb3NpdGlvbnMocG9zaXRpb25zQXJyYXksIGNkKSB7XHJcbiAgICBpZiAodGhpcy5fZXJyb3IpIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcbiAgICBsZXQgcG9zaXRpb25zID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShwb3NpdGlvbnNBcnJheSkpXHJcbiAgICBsZXQgZ3JvdW5kXHJcbiAgICBzd2l0Y2ggKHRoaXMuaGVpZ2h0TW9kZSkge1xyXG4gICAgICBjYXNlIDA6XHJcbiAgICAgIGNhc2UgJzAnOlxyXG4gICAgICAgIGdyb3VuZCA9IGZhbHNlXHJcbiAgICAgICAgYnJlYWtcclxuICAgICAgY2FzZSAxOlxyXG4gICAgICBjYXNlICcxJzpcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgbGV0IGhlaWdodCA9IHRoaXMuc2RrLnZpZXdlci5zY2VuZS5nbG9iZS5nZXRIZWlnaHQoQ2VzaXVtLkNhcnRvZ3JhcGhpYy5mcm9tRGVncmVlcyhwb3NpdGlvbnNbaV0ubG5nLCBwb3NpdGlvbnNbaV0ubGF0KSlcclxuICAgICAgICAgIHBvc2l0aW9uc1tpXS5hbHQgPSBoZWlnaHQgPyBOdW1iZXIoKHBvc2l0aW9uc1tpXS5hbHQgKyBOdW1iZXIoaGVpZ2h0KSkudG9GaXhlZCgyKSkgOiBOdW1iZXIoKHBvc2l0aW9uc1tpXS5hbHQpLnRvRml4ZWQoMikpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGdyb3VuZCA9IGZhbHNlXHJcbiAgICAgICAgYnJlYWtcclxuICAgICAgY2FzZSAyOlxyXG4gICAgICBjYXNlICcyJzpcclxuICAgICAgICBncm91bmQgPSB0cnVlXHJcbiAgICAgICAgYnJlYWtcclxuICAgIH1cclxuICAgIGxldCBuZXdQb3NpdGlvbnNcclxuICAgIGxldCBmcm9tRGVncmVlc0FycmF5ID0gW11cclxuICAgIGlmIChcclxuICAgICAgdGhpcy5vcHRpb25zLm5vc2VUb1RhaWwgJiZcclxuICAgICAgdGhpcy5vcHRpb25zLm5vc2VUb1RhaWwgIT09ICdmYWxzZSdcclxuICAgICkge1xyXG4gICAgICBuZXdQb3NpdGlvbnMgPSBbLi4ucG9zaXRpb25zLCBwb3NpdGlvbnNbMF1dXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBuZXdQb3NpdGlvbnMgPSBbLi4ucG9zaXRpb25zXVxyXG4gICAgfVxyXG4gICAgbmV3UG9zaXRpb25zID0gdGhpcy5zbW9vdGhIYW5kbGUobmV3UG9zaXRpb25zKVxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuZXdQb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgZnJvbURlZ3JlZXNBcnJheS5wdXNoKFxyXG4gICAgICAgIG5ld1Bvc2l0aW9uc1tpXS5sbmcsXHJcbiAgICAgICAgbmV3UG9zaXRpb25zW2ldLmxhdCxcclxuICAgICAgICBuZXdQb3NpdGlvbnNbaV0uYWx0XHJcbiAgICAgIClcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy8g6K6h566X6ZW/5bqmXHJcbiAgICAvLyBsZXQgYXJyYXkgPSBbXVxyXG4gICAgLy8gZm9yIChsZXQgaSA9IDA7IGkgPCBmcm9tRGVncmVlc0FycmF5Lmxlbmd0aDsgaSArPSAzKSB7XHJcbiAgICAvLyAgIGFycmF5LnB1c2goe1xyXG4gICAgLy8gICAgIGxuZzogZnJvbURlZ3JlZXNBcnJheVtpXSxcclxuICAgIC8vICAgICBsYXQ6IGZyb21EZWdyZWVzQXJyYXlbaSArIDFdLFxyXG4gICAgLy8gICAgIGFsdDogZnJvbURlZ3JlZXNBcnJheVtpICsgMl1cclxuICAgIC8vICAgfSlcclxuICAgIC8vIH1cclxuICAgIC8vIHRoaXMub3B0aW9ucy5maXRMZW5ndGhCeU1ldGVyID0gdGhpcy5jb21wdXRlRGlzdGFuY2UyKFxyXG4gICAgLy8gICBhcnJheSxcclxuICAgIC8vICAgMixcclxuICAgIC8vICAgZ3JvdW5kXHJcbiAgICAvLyApXHJcbiAgICAvLyB0aGlzLmZpdExlbmd0aFVuaXQgPSB0aGlzLm9wdGlvbnNbJ2ZpdC1sZW5ndGgtdW5pdCddXHJcbiAgICAvLyB0aGlzLm9wdGlvbnMubGVuZ3RoQnlNZXRlciA9IHRoaXMuY29tcHV0ZURpc3RhbmNlMih0aGlzLnNtb290aEhhbmRsZShwb3NpdGlvbnMpLCAyLCBncm91bmQpXHJcbiAgICAvLyB0aGlzLmxlbmd0aFVuaXQgPSB0aGlzLm9wdGlvbnNbJ2xlbmd0aC11bml0J11cclxuXHJcblxyXG4gICAgaWYgKFxyXG4gICAgICAodGhpcy5vcHRpb25zLm5vc2VUb1RhaWwgJiZcclxuICAgICAgICB0aGlzLm9wdGlvbnMubm9zZVRvVGFpbCAhPT0gJ2ZhbHNlJykgfHxcclxuICAgICAgKHRoaXMub3B0aW9ucy5zbW9vdGggJiYgdGhpcy5vcHRpb25zLnNtb290aCAhPT0gJ2ZhbHNlJylcclxuICAgICkge1xyXG4gICAgICBsZXQgYXJyYXkgPSBbXVxyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZyb21EZWdyZWVzQXJyYXkubGVuZ3RoOyBpICs9IDMpIHtcclxuICAgICAgICBhcnJheS5wdXNoKHtcclxuICAgICAgICAgIGxuZzogZnJvbURlZ3JlZXNBcnJheVtpXSxcclxuICAgICAgICAgIGxhdDogZnJvbURlZ3JlZXNBcnJheVtpICsgMV0sXHJcbiAgICAgICAgICBhbHQ6IGZyb21EZWdyZWVzQXJyYXlbaSArIDJdXHJcbiAgICAgICAgfSlcclxuICAgICAgfVxyXG4gICAgICAvLyB0aGlzLm9wdGlvbnMuZml0TGVuZ3RoQnlNZXRlciA9IHRoaXMuY29tcHV0ZURpc3RhbmNlKFxyXG4gICAgICAvLyAgIGFycmF5LFxyXG4gICAgICAvLyAgIDIsXHJcbiAgICAgIC8vICAgZ3JvdW5kXHJcbiAgICAgIC8vIClcclxuICAgICAgbGV0IF90aGlzID0gdGhpc1xyXG4gICAgICB0aGlzLmNvbXB1dGVEaXN0YW5jZShcclxuICAgICAgICBhcnJheSxcclxuICAgICAgICAyLFxyXG4gICAgICAgIHRoaXMub3B0aW9ucy53b3Jkc05hbWVcclxuICAgICAgKS50aGVuKHJlcyA9PiB7XHJcbiAgICAgICAgX3RoaXMubGVuZ3RoQnlNZXRlciA9IHJlc1xyXG4gICAgICAgIHRoaXMubGVuZ3RoQ2hhbmdlQ2FsbEJhY2sgJiYgdGhpcy5sZW5ndGhDaGFuZ2VDYWxsQmFjaygpXHJcbiAgICAgICAgY2QgJiYgY2QoKVxyXG4gICAgICB9KVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbGV0IF90aGlzID0gdGhpc1xyXG4gICAgICB0aGlzLmNvbXB1dGVEaXN0YW5jZShcclxuICAgICAgICBfdGhpcy5zbW9vdGhIYW5kbGUocG9zaXRpb25zKSxcclxuICAgICAgICAyLFxyXG4gICAgICAgIHRoaXMub3B0aW9ucy53b3Jkc05hbWVcclxuICAgICAgKS50aGVuKHJlcyA9PiB7XHJcbiAgICAgICAgX3RoaXMubGVuZ3RoQnlNZXRlciA9IHJlc1xyXG4gICAgICAgIHRoaXMubGVuZ3RoQ2hhbmdlQ2FsbEJhY2sgJiYgdGhpcy5sZW5ndGhDaGFuZ2VDYWxsQmFjaygpXHJcbiAgICAgICAgY2QgJiYgY2QoKVxyXG4gICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBmcm9tRGVncmVlc0FycmF5XHJcbiAgfVxyXG5cclxuICAvLyDmm7TmlrDlpJrovrnlvaLvvIjnur/mianlsZXvvIlcclxuICByZW5ld1BvbHlnb24oZnJvbURlZ3JlZXNBcnJheSkge1xyXG4gICAgbGV0IGxpbmVQb3NpdGlvbnMgPSBbXVxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5leHRlbmQgJiYgdGhpcy5vcHRpb25zLmV4dGVuZCAhPT0gJ2ZhbHNlJykge1xyXG4gICAgICBsZXQgb3V0ZXJIb2xlID0gW11cclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmcm9tRGVncmVlc0FycmF5Lmxlbmd0aDsgaSArPSAzKSB7XHJcbiAgICAgICAgbGluZVBvc2l0aW9ucy5wdXNoKFtmcm9tRGVncmVlc0FycmF5W2ldLCBmcm9tRGVncmVlc0FycmF5W2kgKyAxXV0pXHJcbiAgICAgIH1cclxuICAgICAgbGV0IGxpbmVzdHJpbmcgPSB0dXJmLmxpbmVTdHJpbmcobGluZVBvc2l0aW9ucylcclxuICAgICAgbGV0IGJ1ZmZlcmVkID0gdHVyZi5idWZmZXIoXHJcbiAgICAgICAgbGluZXN0cmluZyxcclxuICAgICAgICB0aGlzLm9wdGlvbnMuZXh0ZW5kV2lkdGggLyAxMDAwLFxyXG4gICAgICAgIHsgdW5pdHM6ICdraWxvbWV0ZXJzJyB9XHJcbiAgICAgIClcclxuXHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnVmZmVyZWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMF0ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBvdXRlckhvbGUucHVzaChcclxuICAgICAgICAgIGJ1ZmZlcmVkLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzBdW2ldWzBdLFxyXG4gICAgICAgICAgYnVmZmVyZWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMF1baV1bMV1cclxuICAgICAgICApXHJcbiAgICAgIH1cclxuICAgICAgbGV0IGhvbGVzID0gW10gLy8g5a2UXHJcbiAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgYnVmZmVyZWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBsZXQgYXJyYXkgPSBbXVxyXG4gICAgICAgIGZvciAobGV0IG0gPSAwOyBtIDwgYnVmZmVyZWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbaV0ubGVuZ3RoOyBtKyspIHtcclxuICAgICAgICAgIGFycmF5LnB1c2goXHJcbiAgICAgICAgICAgIGJ1ZmZlcmVkLmdlb21ldHJ5LmNvb3JkaW5hdGVzW2ldW21dWzBdLFxyXG4gICAgICAgICAgICBidWZmZXJlZC5nZW9tZXRyeS5jb29yZGluYXRlc1tpXVttXVsxXVxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIH1cclxuICAgICAgICBob2xlcy5wdXNoKHsgcG9zaXRpb25zOiBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlc0FycmF5KGFycmF5KSB9KVxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuZW50aXR5LnBvbHlnb24gPSBuZXcgQ2VzaXVtLlBvbHlnb25HcmFwaGljcyh7XHJcbiAgICAgICAgaGllcmFyY2h5OiB7XHJcbiAgICAgICAgICBwb3NpdGlvbnM6IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzQXJyYXkob3V0ZXJIb2xlKSxcclxuICAgICAgICAgIGhvbGVzOiBob2xlc1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgbWF0ZXJpYWw6IENlc2l1bS5Db2xvci5mcm9tQ3NzQ29sb3JTdHJpbmcodGhpcy5vcHRpb25zLmV4dGVuZENvbG9yKVxyXG4gICAgICB9KVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5lbnRpdHkucG9seWdvbiA9IHVuZGVmaW5lZFxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgcmVzZXQoKSB7XHJcbiAgICBpZiAoIXRoaXMuZW50aXR5KSB7XHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG4gICAgdGhpcy5vcHRpb25zID0gdGhpcy5kZWVwQ29weU9iaih0aGlzLm9yaWdpbmFsT3B0aW9ucylcclxuICAgIHRoaXMubmFtZSA9IHRoaXMub3JpZ2luYWxPcHRpb25zLm5hbWVcclxuICAgIHRoaXMuY29sb3IgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5jb2xvclxyXG4gICAgdGhpcy5saW5lV2lkdGggPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy53aWR0aFxyXG4gICAgdGhpcy5saW5lVHlwZSA9IHRoaXMub3JpZ2luYWxPcHRpb25zLnR5cGVcclxuICAgIHRoaXMubm9zZVRvVGFpbCA9IHRoaXMub3JpZ2luYWxPcHRpb25zLm5vc2VUb1RhaWxcclxuICAgIHRoaXMuZXh0ZW5kID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMuZXh0ZW5kXHJcbiAgICB0aGlzLmV4dGVuZFdpZHRoID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMuZXh0ZW5kV2lkdGhcclxuICAgIHRoaXMuZXh0ZW5kQ29sb3IgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5leHRlbmRDb2xvclxyXG4gICAgdGhpcy5sYWJlbFNob3cgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5sYWJlbC5zaG93XHJcbiAgICB0aGlzLmxhYmVsQ29sb3IgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5sYWJlbC5jb2xvclxyXG4gICAgdGhpcy5sYWJlbEZvbnRTaXplID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMubGFiZWwuZm9udFNpemVcclxuICAgIHRoaXMubGFiZWxGb250RmFtaWx5ID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMubGFiZWwuZm9udEZhbWlseVxyXG4gICAgdGhpcy5sYWJlbFNjYWxlQnlEaXN0YW5jZSA9IHRoaXMub3JpZ2luYWxPcHRpb25zLmxhYmVsLnNjYWxlQnlEaXN0YW5jZVxyXG4gICAgdGhpcy5sYWJlbE5lYXIgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5sYWJlbC5uZWFyXHJcbiAgICB0aGlzLmxhYmVsRmFyID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMubGFiZWwuZmFyXHJcbiAgICB0aGlzLmxhYmVsTGluZVdpZHRoID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMubGFiZWwubGluZVdpZHRoXHJcbiAgICB0aGlzLmxhYmVsUGl4ZWxPZmZzZXQgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5sYWJlbC5waXhlbE9mZnNldFxyXG4gICAgdGhpcy5sYWJlbExpbmVDb2xvciA9IHRoaXMub3JpZ2luYWxPcHRpb25zLmxhYmVsLmxpbmVDb2xvclxyXG4gICAgdGhpcy5sYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0ID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMubGFiZWwuYmFja2dyb3VuZENvbG9yWzBdXHJcbiAgICB0aGlzLmxhYmVsQmFja2dyb3VuZENvbG9yRW5kID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMubGFiZWwuYmFja2dyb3VuZENvbG9yWzFdXHJcbiAgICAvLyB0aGlzLmF0dHJpYnV0ZVZyID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52ci5jb250ZW50XHJcbiAgICAvLyB0aGlzLmF0dHJpYnV0ZUNhbWVyYSA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUuY2FtZXJhLmNvbnRlbnRcclxuICAgIC8vIHRoaXMuYXR0cmlidXRlR29vZHMgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmdvb2RzLmNvbnRlbnRcclxuICAgIHRoaXMucm90YXRlID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMucm90YXRlXHJcbiAgICB0aGlzLnNwZWVkID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMuc3BlZWRcclxuICAgIC8vIHRoaXMuZGFzaFNpemUgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5kYXNoU2l6ZVxyXG4gICAgdGhpcy5zcGFjZSA9IHRoaXMub3JpZ2luYWxPcHRpb25zLnNwYWNlXHJcbiAgICAvLyB0aGlzLmNhbWVyYVNlbGVjdCAmJiB0aGlzLmNhbWVyYVNlbGVjdCgpXHJcbiAgICAvLyB0aGlzLmdvb2RzU2VsZWN0ICYmIHRoaXMuZ29vZHNTZWxlY3QoKVxyXG5cclxuICAgIHRoaXMuaGVpZ2h0TW9kZSA9IHRoaXMub3B0aW9ucy5oZWlnaHRNb2RlXHJcblxyXG4gICAgLy8gbGV0IGhlaWdodFxyXG4gICAgLy8gaWYgKHRoaXMuZ3JvdW5kKSB7XHJcbiAgICAvLyAgIGhlaWdodCA9IGF3YWl0IHRoYXQuZ2V0Q2xhbXBUb0hlaWdodCh7XHJcbiAgICAvLyAgICAgbG5nOiB0aGlzLm9wdGlvbnMucG9zaXRpb25zWzBdLmxuZyxcclxuICAgIC8vICAgICBsYXQ6IHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0ubGF0XHJcbiAgICAvLyAgIH0pXHJcbiAgICAvLyB9IGVsc2Uge1xyXG4gICAgLy8gICBoZWlnaHQgPSB0aGlzLm9wdGlvbnMucG9zaXRpb25zWzBdLmFsdFxyXG4gICAgLy8gfVxyXG4gICAgLy8gdGhpcy5vcHRpb25zLmxhYmVsLnBvc2l0aW9uID0ge1xyXG4gICAgLy8gICBsbmc6IHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0ubG5nLFxyXG4gICAgLy8gICBsYXQ6IHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0ubGF0LFxyXG4gICAgLy8gICBhbHQ6IGhlaWdodFxyXG4gICAgLy8gfVxyXG4gICAgLy8gdGhpcy5sYWJlbC5wb3NpdGlvbiA9IFtcclxuICAgIC8vICAgdGhpcy5vcHRpb25zLmxhYmVsLnBvc2l0aW9uLmxuZyxcclxuICAgIC8vICAgdGhpcy5vcHRpb25zLmxhYmVsLnBvc2l0aW9uLmxhdCxcclxuICAgIC8vICAgdGhpcy5vcHRpb25zLmxhYmVsLnBvc2l0aW9uLmFsdFxyXG4gICAgLy8gXVxyXG4gIH1cclxuXHJcbiAgLy8gX2FkZFJyKCkge1xyXG4gIC8vICAgaWYgKFxyXG4gIC8vICAgICB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFxyXG4gIC8vICAgICAgICd2cl9hZGQnXHJcbiAgLy8gICAgIClbMF0udmFsdWVcclxuICAvLyAgICkge1xyXG4gIC8vICAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnQucHVzaCh7XHJcbiAgLy8gICAgICAgbmFtZTogJ+WFqOaZr+WbvicsXHJcbiAgLy8gICAgICAgdXJsOiB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFxyXG4gIC8vICAgICAgICAgJ3ZyX2FkZCdcclxuICAvLyAgICAgICApWzBdLnZhbHVlXHJcbiAgLy8gICAgIH0pXHJcbiAgLy8gICAgIHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXHJcbiAgLy8gICAgICAgJ3ZyX2FkZCdcclxuICAvLyAgICAgKVswXS52YWx1ZSA9ICcnXHJcbiAgLy8gICAgIHRoaXMuYXR0cmlidXRlVnIgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnRcclxuICAvLyAgIH0gZWxzZSB7XHJcbiAgLy8gICAgIHRoaXMuRGlhbG9nLmNsaWNrQWRkVnIgJiYgdGhpcy5EaWFsb2cuY2xpY2tBZGRWcigpXHJcbiAgLy8gICB9XHJcbiAgLy8gfVxyXG5cclxuICAvLyBhZGRBdHRyaWJ1dGVScih2cikge1xyXG4gIC8vICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52ci5jb250ZW50LnB1c2goe1xyXG4gIC8vICAgICBuYW1lOiAn5YWo5pmv5Zu+JyxcclxuICAvLyAgICAgdXJsOiB2clxyXG4gIC8vICAgfSlcclxuICAvLyAgIHRoaXMuYXR0cmlidXRlVnIgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnRcclxuICAvLyB9XHJcblxyXG4gIC8qKlxyXG4gICAqIOmjnuWIsFxyXG4gICAqL1xyXG4gIGFzeW5jIGZseVRvKG9wdGlvbnMgPSB7fSkge1xyXG4gICAgaWYgKHRoaXMuX2Vycm9yKSB7XHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG4gICAgY2xvc2VSb3RhdGVBcm91bmQodGhpcy5zZGspXHJcbiAgICBjbG9zZVZpZXdGb2xsb3codGhpcy5zZGspXHJcblxyXG4gICAgc2V0QWN0aXZlVmlld2VyKDApXHJcbiAgICBpZiAodGhpcy5vcHRpb25zLmN1c3RvbVZpZXcpIHtcclxuICAgICAgbGV0IG9yaWVudGF0aW9uID0ge1xyXG4gICAgICAgIGhlYWRpbmc6IENlc2l1bS5NYXRoLnRvUmFkaWFucyh0aGlzLm9wdGlvbnMuY3VzdG9tVmlldy5vcmllbnRhdGlvbi5oZWFkaW5nIHx8IDAuMCksXHJcbiAgICAgICAgcGl0Y2g6IENlc2l1bS5NYXRoLnRvUmFkaWFucyh0aGlzLm9wdGlvbnMuY3VzdG9tVmlldy5vcmllbnRhdGlvbi5waXRjaCB8fCAtNjAuMCksXHJcbiAgICAgICAgcm9sbDogQ2VzaXVtLk1hdGgudG9SYWRpYW5zKHRoaXMub3B0aW9ucy5jdXN0b21WaWV3Lm9yaWVudGF0aW9uLnJvbGwgfHwgMC4wKVxyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgbG5nID0gdGhpcy5vcHRpb25zLmN1c3RvbVZpZXcucmVsYXRpdmVQb3NpdGlvbi5sbmdcclxuICAgICAgbGV0IGxhdCA9IHRoaXMub3B0aW9ucy5jdXN0b21WaWV3LnJlbGF0aXZlUG9zaXRpb24ubGF0XHJcbiAgICAgIGxldCBhbHQgPSB0aGlzLm9wdGlvbnMuY3VzdG9tVmlldy5yZWxhdGl2ZVBvc2l0aW9uLmFsdFxyXG4gICAgICBsZXQgZGVzdGluYXRpb24gPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlcyhsbmcsIGxhdCwgYWx0KVxyXG5cclxuICAgICAgbGV0IHBvc2l0aW9uID0geyBsbmc6IDAsIGxhdDogMCB9XHJcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMucG9zaXRpb24pIHtcclxuICAgICAgICBwb3NpdGlvbiA9IHsgLi4udGhpcy5vcHRpb25zLnBvc2l0aW9uIH1cclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmICh0aGlzLm9wdGlvbnMucG9zaXRpb25zKSB7XHJcbiAgICAgICAgcG9zaXRpb24gPSB7IC4uLnRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0gfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKHRoaXMub3B0aW9ucy5jZW50ZXIpIHtcclxuICAgICAgICBwb3NpdGlvbiA9IHsgLi4udGhpcy5vcHRpb25zLmNlbnRlciB9XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAodGhpcy5vcHRpb25zLnN0YXJ0KSB7XHJcbiAgICAgICAgcG9zaXRpb24gPSB7IC4uLnRoaXMub3B0aW9ucy5zdGFydCB9XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgnbG5nJykpIHtcclxuICAgICAgICAgIHBvc2l0aW9uLmxuZyA9IHRoaXMub3B0aW9ucy5sbmdcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgnbGF0JykpIHtcclxuICAgICAgICAgIHBvc2l0aW9uLmxhdCA9IHRoaXMub3B0aW9ucy5sYXRcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgnYWx0JykpIHtcclxuICAgICAgICAgIHBvc2l0aW9uLmFsdCA9IHRoaXMub3B0aW9ucy5hbHRcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgLy8g5aaC5p6c5rKh5pyJ6auY5bqm5YC877yM5YiZ6I635Y+W57Sn6LS06auY5bqm6K6h566XXHJcbiAgICAgIGlmICghcG9zaXRpb24uaGFzT3duUHJvcGVydHkoJ2FsdCcpKSB7XHJcbiAgICAgICAgcG9zaXRpb24uYWx0ID0gYXdhaXQgdGhpcy5nZXRDbGFtcFRvSGVpZ2h0KHBvc2l0aW9uKVxyXG4gICAgICB9XHJcbiAgICAgIGxuZyA9IHRoaXMub3B0aW9ucy5jdXN0b21WaWV3LnJlbGF0aXZlUG9zaXRpb24ubG5nICsgcG9zaXRpb24ubG5nXHJcbiAgICAgIGxhdCA9IHRoaXMub3B0aW9ucy5jdXN0b21WaWV3LnJlbGF0aXZlUG9zaXRpb24ubGF0ICsgcG9zaXRpb24ubGF0XHJcbiAgICAgIGFsdCA9IHRoaXMub3B0aW9ucy5jdXN0b21WaWV3LnJlbGF0aXZlUG9zaXRpb24uYWx0ICsgcG9zaXRpb24uYWx0XHJcbiAgICAgIGRlc3RpbmF0aW9uID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXMobG5nLCBsYXQsIGFsdClcclxuICAgICAgdGhpcy5zZGsudmlld2VyLmNhbWVyYS5mbHlUbyh7XHJcbiAgICAgICAgZGVzdGluYXRpb246IGRlc3RpbmF0aW9uLFxyXG4gICAgICAgIG9yaWVudGF0aW9uOiBvcmllbnRhdGlvblxyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGxldCBwb3NpdGlvbkFycmF5ID0gW11cclxuICAgICAgbGV0IGhlaWdodFxyXG4gICAgICBzd2l0Y2ggKHRoaXMub3B0aW9ucy5oZWlnaHRNb2RlKSB7XHJcbiAgICAgICAgY2FzZSAnMCc6XHJcbiAgICAgICAgY2FzZSAwOlxyXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm9wdGlvbnMucG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGxldCBhID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXMoXHJcbiAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sbmcsXHJcbiAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sYXQsXHJcbiAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5hbHRcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICBwb3NpdGlvbkFycmF5LnB1c2goYS54LCBhLnksIGEueilcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgY2FzZSAnMSc6XHJcbiAgICAgICAgY2FzZSAxOlxyXG4gICAgICAgICAgaGVpZ2h0ID0gYXdhaXQgdGhpcy5nZXRDbGFtcFRvSGVpZ2h0KHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0pXHJcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMub3B0aW9ucy5wb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgbGV0IGEgPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlcyhcclxuICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxuZyxcclxuICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxhdCxcclxuICAgICAgICAgICAgICBoZWlnaHQgKyB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmFsdFxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICAgIHBvc2l0aW9uQXJyYXkucHVzaChhLngsIGEueSwgYS56KVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWtcclxuICAgICAgICBjYXNlICcyJzpcclxuICAgICAgICBjYXNlIDI6XHJcbiAgICAgICAgICBoZWlnaHQgPSBhd2FpdCB0aGlzLmdldENsYW1wVG9IZWlnaHQodGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXSlcclxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5vcHRpb25zLnBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBsZXQgYSA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzKFxyXG4gICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubG5nLFxyXG4gICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubGF0LFxyXG4gICAgICAgICAgICAgIGhlaWdodFxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICAgIHBvc2l0aW9uQXJyYXkucHVzaChhLngsIGEueSwgYS56KVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWtcclxuICAgICAgfVxyXG4gICAgICBsZXQgQm91bmRpbmdTcGhlcmUgPSBDZXNpdW0uQm91bmRpbmdTcGhlcmUuZnJvbVZlcnRpY2VzKHBvc2l0aW9uQXJyYXkpXHJcbiAgICAgIHRoaXMuc2RrLnZpZXdlci5jYW1lcmEuZmx5VG9Cb3VuZGluZ1NwaGVyZShCb3VuZGluZ1NwaGVyZSwge1xyXG4gICAgICAgIG9mZnNldDogb3B0aW9ucy5vcmllbnRhdGlvbiB8fCB7XHJcbiAgICAgICAgICBoZWFkaW5nOiBDZXNpdW0uTWF0aC50b1JhZGlhbnMoMC4wKSxcclxuICAgICAgICAgIHBpdGNoOiBDZXNpdW0uTWF0aC50b1JhZGlhbnMoLTkwLjApLFxyXG4gICAgICAgICAgcm9sbDogQ2VzaXVtLk1hdGgudG9SYWRpYW5zKDAuMClcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiDmiZPlvIDlr4zmlofmnKzmoYZcclxuICAgKi9cclxuICBvcGVuUmljaFRleHRFZGl0b3IoZSkge1xyXG4gICAgLy8gdmFyIHVlID0gVUUuZ2V0RWRpdG9yKCdhcHAnKTtcclxuICAgIHJpY2hUZXh0Lm9wZW4oXHJcbiAgICAgIHRoaXMub3B0aW9ucy5pZCxcclxuICAgICAgdGhpcy5vcHRpb25zLm5hbWUsXHJcbiAgICAgIHRoaXMub3B0aW9ucy5yaWNoVGV4dENvbnRlbnRcclxuICAgIClcclxuICAgIHJpY2hUZXh0LnByaW1hcnlDYWxsQmFjayA9IGNvbnRlbnQgPT4ge1xyXG4gICAgICB0aGlzLm9wdGlvbnMucmljaFRleHRDb250ZW50ID0gY29udGVudFxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gc3RhdGljIG5vZGVFZGl0Mih0aGF0LCBjYiA9ICgpID0+IHsgfSkge1xyXG4gIC8vICAgdGhhdC5wb3NpdGlvbkVkaXRpbmcgPSBmYWxzZVxyXG4gIC8vICAgaWYgKFlKLk1lYXN1cmUuR2V0TWVhc3VyZVN0YXR1cygpKSB7XHJcbiAgLy8gICAgIGNiKCfkuIrkuIDmrKHmtYvph4/mnKrnu5PmnZ8nKVxyXG4gIC8vICAgfSBlbHNlIHtcclxuICAvLyAgICAgWUouTWVhc3VyZS5TZXRNZWFzdXJlU3RhdHVzKHRydWUpXHJcbiAgLy8gICAgIHRoYXQudGlwID0gbmV3IE1vdXNlVGlwKCfor7fpgInmi6nkuIDkuKrpobbngrnvvIzlj7PplK7lj5bmtognLCB0aGF0LnNkaylcclxuICAvLyAgICAgdGhhdC5ldmVudCA9IG5ldyBNb3VzZUV2ZW50KHRoYXQuc2RrKVxyXG4gIC8vICAgICB0aGF0Lm5vZGVQb2ludHMgPSBbXVxyXG4gIC8vICAgICBsZXQgc2VsZWN0UG9pbnRcclxuICAvLyAgICAgbGV0IG9yaWdpbmFsUG9zaXRpb25cclxuICAvLyAgICAgbGV0IG5ld3Bvc2l0aW9ucyA9IFtdXHJcbiAgLy8gICAgIGxldCBmcm9tRGVncmVlc0FycmF5ID0gW11cclxuICAvLyAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGF0Lm9wdGlvbnMucG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgLy8gICAgICAgZnJvbURlZ3JlZXNBcnJheS5wdXNoKFxyXG4gIC8vICAgICAgICAgdGhhdC5vcHRpb25zLnBvc2l0aW9uc1tpXS5sbmcsXHJcbiAgLy8gICAgICAgICB0aGF0Lm9wdGlvbnMucG9zaXRpb25zW2ldLmxhdCxcclxuICAvLyAgICAgICAgIHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbaV0uYWx0XHJcbiAgLy8gICAgICAgKVxyXG4gIC8vICAgICB9XHJcbiAgLy8gICAgIG5ld3Bvc2l0aW9ucyA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzQXJyYXlIZWlnaHRzKGZyb21EZWdyZWVzQXJyYXkpXHJcblxyXG4gIC8vICAgICB0aGF0LmV2ZW50Lm1vdXNlX2xlZnQoKG1vdmVtZW50LCBjYXJ0ZXNpYW4pID0+IHtcclxuICAvLyAgICAgICBpZiAoc2VsZWN0UG9pbnQpIHtcclxuICAvLyAgICAgICAgIHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbc2VsZWN0UG9pbnQuaW5kZXhdID0gdGhhdC5jYXJ0ZXNpYW4zVG93Z3M4NChcclxuICAvLyAgICAgICAgICAgY2FydGVzaWFuLFxyXG4gIC8vICAgICAgICAgICB0aGF0LnNkay52aWV3ZXJcclxuICAvLyAgICAgICAgIClcclxuICAvLyAgICAgICAgIG9yaWdpbmFsUG9zaXRpb24gPSB0aGF0Lm9wdGlvbnMucG9zaXRpb25zW3NlbGVjdFBvaW50LmluZGV4XVxyXG4gIC8vICAgICAgICAgbGV0IGVudGl0eSA9IHRoYXQuc2RrLnZpZXdlci5lbnRpdGllcy5hZGQoe1xyXG4gIC8vICAgICAgICAgICBuYW1lOiAnbm9kZS1zZWNvbmRhcnktZWRpdC1wb2ludCcsXHJcbiAgLy8gICAgICAgICAgIHBvc2l0aW9uOiBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlcyhcclxuICAvLyAgICAgICAgICAgICB0aGF0Lm9wdGlvbnMucG9zaXRpb25zW3NlbGVjdFBvaW50LmluZGV4XS5sbmcsXHJcbiAgLy8gICAgICAgICAgICAgdGhhdC5vcHRpb25zLnBvc2l0aW9uc1tzZWxlY3RQb2ludC5pbmRleF0ubGF0LFxyXG4gIC8vICAgICAgICAgICAgIHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbc2VsZWN0UG9pbnQuaW5kZXhdLmFsdFxyXG4gIC8vICAgICAgICAgICApLFxyXG4gIC8vICAgICAgICAgICBiaWxsYm9hcmQ6IHtcclxuICAvLyAgICAgICAgICAgICBpbWFnZTogdGhhdC5nZXRTb3VyY2VSb290UGF0aCgpICsgJy9pbWcvcG9pbnQucG5nJyxcclxuICAvLyAgICAgICAgICAgICB3aWR0aDogMTUsXHJcbiAgLy8gICAgICAgICAgICAgaGVpZ2h0OiAxNSxcclxuICAvLyAgICAgICAgICAgICBkaXNhYmxlRGVwdGhUZXN0RGlzdGFuY2U6IE51bWJlci5QT1NJVElWRV9JTkZJTklUWVxyXG4gIC8vICAgICAgICAgICB9XHJcbiAgLy8gICAgICAgICB9KVxyXG4gIC8vICAgICAgICAgdGhhdC5ub2RlUG9pbnRzLnNwbGljZShzZWxlY3RQb2ludC5pbmRleCwgMCwgZW50aXR5KVxyXG4gIC8vICAgICAgICAgdGhhdC5vcHRpb25zLnBvc2l0aW9ucy5zcGxpY2UoXHJcbiAgLy8gICAgICAgICAgIHNlbGVjdFBvaW50LmluZGV4LFxyXG4gIC8vICAgICAgICAgICAwLFxyXG4gIC8vICAgICAgICAgICB0aGF0Lm9wdGlvbnMucG9zaXRpb25zW3NlbGVjdFBvaW50LmluZGV4XVxyXG4gIC8vICAgICAgICAgKVxyXG4gIC8vICAgICAgICAgbGV0IGZyb21EZWdyZWVzQXJyYXkgPSB0aGF0LnJlbmV3UG9zaXRpb25zKHRoYXQub3B0aW9ucy5wb3NpdGlvbnMpXHJcbiAgLy8gICAgICAgICB0aGF0LnJlbmV3UG9seWdvbihmcm9tRGVncmVlc0FycmF5KVxyXG4gIC8vICAgICAgICAgdGhhdC5vcHRpb25zLmxlbmd0aEJ5TWV0ZXIgPSB0aGF0LmNvbXB1dGVEaXN0YW5jZTIoXHJcbiAgLy8gICAgICAgICAgIHRoYXQub3B0aW9ucy5wb3NpdGlvbnMsXHJcbiAgLy8gICAgICAgICAgIDIsXHJcbiAgLy8gICAgICAgICAgIHRoYXQuZ3JvdW5kXHJcbiAgLy8gICAgICAgICApXHJcbiAgLy8gICAgICAgICB0aGF0Lmxlbmd0aFVuaXQgPSB0aGF0Lm9wdGlvbnNbJ2xlbmd0aC11bml0J11cclxuICAvLyAgICAgICB9IGVsc2Uge1xyXG4gIC8vICAgICAgICAgdmFyIHBpY2sgPSB0aGF0LnNkay52aWV3ZXIuc2NlbmUucGljayhtb3ZlbWVudC5wb3NpdGlvbilcclxuICAvLyAgICAgICAgIGlmIChcclxuICAvLyAgICAgICAgICAgcGljayAmJlxyXG4gIC8vICAgICAgICAgICBwaWNrLmlkICYmXHJcbiAgLy8gICAgICAgICAgIHBpY2suaWQubmFtZSAmJlxyXG4gIC8vICAgICAgICAgICBwaWNrLmlkLm5hbWUgPT09ICdub2RlLXNlY29uZGFyeS1lZGl0LXBvaW50J1xyXG4gIC8vICAgICAgICAgKSB7XHJcbiAgLy8gICAgICAgICAgIHNlbGVjdFBvaW50ID0gcGljay5pZFxyXG4gIC8vICAgICAgICAgICB0aGF0Lm5vZGVQb2ludHMuc3BsaWNlKHBpY2suaWQuaW5kZXgsIDEpXHJcbiAgLy8gICAgICAgICAgIHRoYXQuc2RrLnZpZXdlci5lbnRpdGllcy5yZW1vdmUocGljay5pZClcclxuICAvLyAgICAgICAgICAgdGhhdC50aXAuc2V0X3RleHQoJ+W3pumUruW8gOWni++8jOWPs+mUrue7k+adn++8jENUUkwr5Y+z6ZSu5pKk6ZSAJylcclxuICAvLyAgICAgICAgICAgb3JpZ2luYWxQb3NpdGlvbiA9IHRoYXQuY2FydGVzaWFuM1Rvd2dzODQoXHJcbiAgLy8gICAgICAgICAgICAgY2FydGVzaWFuLFxyXG4gIC8vICAgICAgICAgICAgIHRoYXQuc2RrLnZpZXdlclxyXG4gIC8vICAgICAgICAgICApXHJcbiAgLy8gICAgICAgICB9XHJcbiAgLy8gICAgICAgfVxyXG4gIC8vICAgICB9KVxyXG5cclxuICAvLyAgICAgdGhhdC5ldmVudC5tb3VzZV9yaWdodCgobW92ZW1lbnQsIGNhcnRlc2lhbikgPT4ge1xyXG4gIC8vICAgICAgIGlmIChzZWxlY3RQb2ludCkge1xyXG4gIC8vICAgICAgICAgdGhhdC5vcHRpb25zLnBvc2l0aW9uc1tzZWxlY3RQb2ludC5pbmRleF0gPSBvcmlnaW5hbFBvc2l0aW9uXHJcbiAgLy8gICAgICAgICBjYihudWxsLCB0aGF0Lm9wdGlvbnMucG9zaXRpb25zKVxyXG4gIC8vICAgICAgIH1cclxuICAvLyAgICAgICBsZXQgcG9zaXRpb25zID0gdGhhdC5vcHRpb25zLnBvc2l0aW9uc1xyXG4gIC8vICAgICAgIGxldCBmcm9tRGVncmVlc0FycmF5ID0gW11cclxuICAvLyAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gIC8vICAgICAgICAgZnJvbURlZ3JlZXNBcnJheS5wdXNoKFxyXG4gIC8vICAgICAgICAgICBwb3NpdGlvbnNbaV0ubG5nLFxyXG4gIC8vICAgICAgICAgICBwb3NpdGlvbnNbaV0ubGF0LFxyXG4gIC8vICAgICAgICAgICBwb3NpdGlvbnNbaV0uYWx0XHJcbiAgLy8gICAgICAgICApXHJcbiAgLy8gICAgICAgfVxyXG4gIC8vICAgICAgIG5ld3Bvc2l0aW9ucyA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzQXJyYXlIZWlnaHRzKFxyXG4gIC8vICAgICAgICAgZnJvbURlZ3JlZXNBcnJheVxyXG4gIC8vICAgICAgIClcclxuICAvLyAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoYXQubm9kZVBvaW50cy5sZW5ndGg7IGkrKykge1xyXG4gIC8vICAgICAgICAgdGhhdC5zZGsudmlld2VyLmVudGl0aWVzLnJlbW92ZSh0aGF0Lm5vZGVQb2ludHNbaV0pXHJcbiAgLy8gICAgICAgfVxyXG4gIC8vICAgICAgIHRoYXQubm9kZVBvaW50cyA9IFtdXHJcbiAgLy8gICAgICAgdGhhdC5ldmVudC5kZXN0cm95KClcclxuICAvLyAgICAgICB0aGF0LnRpcC5kZXN0cm95KClcclxuICAvLyAgICAgfSlcclxuXHJcbiAgLy8gICAgIHRoYXQuZXZlbnQubW91c2VfbW92ZSgobW92ZW1lbnQsIGNhcnRlc2lhbikgPT4ge1xyXG4gIC8vICAgICAgIGlmIChzZWxlY3RQb2ludCkge1xyXG4gIC8vICAgICAgICAgdGhhdC5vcHRpb25zLnBvc2l0aW9uc1tzZWxlY3RQb2ludC5pbmRleF0gPSB0aGF0LmNhcnRlc2lhbjNUb3dnczg0KFxyXG4gIC8vICAgICAgICAgICBjYXJ0ZXNpYW4sXHJcbiAgLy8gICAgICAgICAgIHRoYXQuc2RrLnZpZXdlclxyXG4gIC8vICAgICAgICAgKVxyXG4gIC8vICAgICAgICAgbGV0IHBvc2l0aW9ucyA9IHRoYXQub3B0aW9ucy5wb3NpdGlvbnNcclxuICAvLyAgICAgICAgIGxldCBmcm9tRGVncmVlc0FycmF5ID0gW11cclxuICAvLyAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgLy8gICAgICAgICAgIGZyb21EZWdyZWVzQXJyYXkucHVzaChcclxuICAvLyAgICAgICAgICAgICBwb3NpdGlvbnNbaV0ubG5nLFxyXG4gIC8vICAgICAgICAgICAgIHBvc2l0aW9uc1tpXS5sYXQsXHJcbiAgLy8gICAgICAgICAgICAgcG9zaXRpb25zW2ldLmFsdFxyXG4gIC8vICAgICAgICAgICApXHJcbiAgLy8gICAgICAgICB9XHJcbiAgLy8gICAgICAgICBuZXdwb3NpdGlvbnMgPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlc0FycmF5SGVpZ2h0cyhcclxuICAvLyAgICAgICAgICAgZnJvbURlZ3JlZXNBcnJheVxyXG4gIC8vICAgICAgICAgKVxyXG4gIC8vICAgICAgICAgaWYgKHRoYXQub3B0aW9ucy5wb3NpdGlvbnMubGVuZ3RoID09PSAxKSB7XHJcbiAgLy8gICAgICAgICAgIHRoYXQubGFiZWwucG9zaXRpb24gPSBbXHJcbiAgLy8gICAgICAgICAgICAgdGhhdC5vcHRpb25zLnBvc2l0aW9uc1swXS5sbmcsXHJcbiAgLy8gICAgICAgICAgICAgdGhhdC5vcHRpb25zLnBvc2l0aW9uc1swXS5sYXQsXHJcbiAgLy8gICAgICAgICAgICAgdGhhdC5vcHRpb25zLnBvc2l0aW9uc1swXS5hbHRcclxuICAvLyAgICAgICAgICAgXVxyXG4gIC8vICAgICAgICAgICB0aGF0Lm9wdGlvbnMubGFiZWwucG9zaXRpb24gPSB7XHJcbiAgLy8gICAgICAgICAgICAgbG5nOiB0aGF0Lm9wdGlvbnMucG9zaXRpb25zWzBdLmxuZyxcclxuICAvLyAgICAgICAgICAgICBsYXQ6IHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbMF0ubGF0LFxyXG4gIC8vICAgICAgICAgICAgIGFsdDogdGhhdC5vcHRpb25zLnBvc2l0aW9uc1swXS5hbHRcclxuICAvLyAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgfVxyXG4gIC8vICAgICAgIH1cclxuICAvLyAgICAgICB0aGF0LnRpcC5zZXRQb3NpdGlvbihcclxuICAvLyAgICAgICAgIGNhcnRlc2lhbixcclxuICAvLyAgICAgICAgIG1vdmVtZW50LmVuZFBvc2l0aW9uLngsXHJcbiAgLy8gICAgICAgICBtb3ZlbWVudC5lbmRQb3NpdGlvbi55XHJcbiAgLy8gICAgICAgKVxyXG4gIC8vICAgICB9KVxyXG5cclxuICAvLyAgICAgdGhhdC5ldmVudC5tb3VzZV9yaWdodF9rZXlib2FyZF9jdHJsKChtb3ZlbWVudCwgY2FydGVzaWFuKSA9PiB7XHJcbiAgLy8gICAgICAgaWYgKHNlbGVjdFBvaW50KSB7XHJcbiAgLy8gICAgICAgICB0aGF0Lm9wdGlvbnMucG9zaXRpb25zLnBvcCgpXHJcbiAgLy8gICAgICAgICB0aGF0LnNkay52aWV3ZXIuZW50aXRpZXMucmVtb3ZlKFxyXG4gIC8vICAgICAgICAgICB0aGF0Lm5vZGVQb2ludHNbdGhhdC5ub2RlUG9pbnRzLmxlbmd0aCAtIDFdXHJcbiAgLy8gICAgICAgICApXHJcbiAgLy8gICAgICAgICB0aGF0Lm5vZGVQb2ludHMucG9wKClcclxuICAvLyAgICAgICAgIGlmIChzZWxlY3RQb2ludC5pbmRleCA9PT0gdGhhdC5vcHRpb25zLnBvc2l0aW9ucy5sZW5ndGgpIHtcclxuICAvLyAgICAgICAgICAgaWYgKHRoYXQubm9kZVBvaW50c1tzZWxlY3RQb2ludC5pbmRleCAtIDFdKSB7XHJcbiAgLy8gICAgICAgICAgICAgc2VsZWN0UG9pbnQgPSB0aGF0Lm5vZGVQb2ludHNbc2VsZWN0UG9pbnQuaW5kZXggLSAxXVxyXG4gIC8vICAgICAgICAgICB9IGVsc2Uge1xyXG4gIC8vICAgICAgICAgICAgIHNlbGVjdFBvaW50LmluZGV4ID0gMFxyXG4gIC8vICAgICAgICAgICB9XHJcbiAgLy8gICAgICAgICB9XHJcbiAgLy8gICAgICAgfVxyXG4gIC8vICAgICB9KVxyXG5cclxuICAvLyAgICAgdGhhdC5lbnRpdHkucG9seWxpbmUucG9zaXRpb25zID0gbmV3IENlc2l1bS5DYWxsYmFja1Byb3BlcnR5KGZ1bmN0aW9uICgpIHtcclxuICAvLyAgICAgICByZXR1cm4gbmV3cG9zaXRpb25zXHJcbiAgLy8gICAgIH0sIGZhbHNlKVxyXG5cclxuICAvLyAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGF0Lm9wdGlvbnMucG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgLy8gICAgICAgbGV0IGVudGl0eSA9IHRoYXQuc2RrLnZpZXdlci5lbnRpdGllcy5hZGQoe1xyXG4gIC8vICAgICAgICAgbmFtZTogJ25vZGUtc2Vjb25kYXJ5LWVkaXQtcG9pbnQnLFxyXG4gIC8vICAgICAgICAgaW5kZXg6IGksXHJcbiAgLy8gICAgICAgICBwb3NpdGlvbjogQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXMoXHJcbiAgLy8gICAgICAgICAgIHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbaV0ubG5nLFxyXG4gIC8vICAgICAgICAgICB0aGF0Lm9wdGlvbnMucG9zaXRpb25zW2ldLmxhdCxcclxuICAvLyAgICAgICAgICAgdGhhdC5vcHRpb25zLnBvc2l0aW9uc1tpXS5hbHRcclxuICAvLyAgICAgICAgICksXHJcbiAgLy8gICAgICAgICBiaWxsYm9hcmQ6IHtcclxuICAvLyAgICAgICAgICAgaW1hZ2U6IHRoYXQuZ2V0U291cmNlUm9vdFBhdGgoKSArICcvaW1nL3BvaW50LnBuZycsXHJcbiAgLy8gICAgICAgICAgIHdpZHRoOiAxNSxcclxuICAvLyAgICAgICAgICAgaGVpZ2h0OiAxNSxcclxuICAvLyAgICAgICAgICAgZGlzYWJsZURlcHRoVGVzdERpc3RhbmNlOiBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFlcclxuICAvLyAgICAgICAgIH1cclxuICAvLyAgICAgICB9KVxyXG4gIC8vICAgICAgIHRoYXQubm9kZVBvaW50cy5wdXNoKGVudGl0eSlcclxuICAvLyAgICAgfVxyXG4gIC8vICAgfVxyXG4gIC8vIH1cclxuXHJcbiAgbm9kZUVkaXQoY2QpIHtcclxuICAgIHRoaXMucG9zaXRpb25FZGl0aW5nID0gZmFsc2VcclxuICAgIGlmIChZSi5NZWFzdXJlLkdldE1lYXN1cmVTdGF0dXMoKSkge1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5jbG9zZU5vZGVFZGl0KClcclxuICAgICAgdGhpcy50aXAgPSBuZXcgTW91c2VUaXAoJ+ivt+mAieaLqeS4gOS4qumhtueCue+8jOWPs+mUruWPlua2iCcsIHRoaXMuc2RrKVxyXG4gICAgICB0aGlzLmV2ZW50ID0gbmV3IE1vdXNlRXZlbnQodGhpcy5zZGspXHJcbiAgICAgIHRoaXMuQ29udHJvbGxlck9iamVjdCA9IG5ldyBDb250cm9sbGVyKHRoaXMuc2RrKVxyXG5cclxuICAgICAgdGhpcy5fbm9kZUVkaXRDYWxsYmFjayA9IGNkXHJcbiAgICAgIGxldCBzZWxlY3RQb2ludFxyXG4gICAgICB0aGlzLmV2ZW50Lm1vdXNlX2xlZnQoKG1vdmVtZW50LCBjYXJ0ZXNpYW4pID0+IHtcclxuICAgICAgICB2YXIgcGljayA9IHRoaXMuc2RrLnZpZXdlci5zY2VuZS5waWNrKG1vdmVtZW50LnBvc2l0aW9uKVxyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgIHBpY2sgJiZcclxuICAgICAgICAgIHBpY2suaWQgJiZcclxuICAgICAgICAgIHBpY2suaWQubmFtZSAmJlxyXG4gICAgICAgICAgcGljay5pZC5uYW1lID09PSAnbm9kZS1zZWNvbmRhcnktZWRpdC1wb2ludCdcclxuICAgICAgICApIHtcclxuICAgICAgICAgIHNlbGVjdFBvaW50ID0gcGljay5pZFxyXG4gICAgICAgICAgdGhpcy5Db250cm9sbGVyT2JqZWN0LnBvc2l0aW9uID1cclxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tzZWxlY3RQb2ludC5pbmRleF1cclxuICAgICAgICAgIHRoaXMuQ29udHJvbGxlck9iamVjdC5lZGl0VHJhbnNsYXRpb25hbCgpXHJcbiAgICAgICAgICB0aGlzLnRpcCAmJiB0aGlzLnRpcC5kZXN0cm95KClcclxuICAgICAgICAgIHRoaXMuQ29udHJvbGxlck9iamVjdC5jb250cm9sbGVyQ2FsbEJhY2sgPSBwYXJhbXMgPT4ge1xyXG4gICAgICAgICAgICBpZiAoc2VsZWN0UG9pbnQuaW5kZXggPT09IDApIHtcclxuICAgICAgICAgICAgICB0aGlzLmxhYmVsLnBvc2l0aW9uID0gW1xyXG4gICAgICAgICAgICAgICAgcGFyYW1zLnBvc2l0aW9uLmxuZyxcclxuICAgICAgICAgICAgICAgIHBhcmFtcy5wb3NpdGlvbi5sYXQsXHJcbiAgICAgICAgICAgICAgICBwYXJhbXMucG9zaXRpb24uYWx0XHJcbiAgICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5sYWJlbC5wb3NpdGlvbiA9IHtcclxuICAgICAgICAgICAgICAgIGxuZzogcGFyYW1zLnBvc2l0aW9uLmxuZyxcclxuICAgICAgICAgICAgICAgIGxhdDogcGFyYW1zLnBvc2l0aW9uLmxhdCxcclxuICAgICAgICAgICAgICAgIGFsdDogcGFyYW1zLnBvc2l0aW9uLmFsdFxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zW3NlbGVjdFBvaW50LmluZGV4XSA9IHBhcmFtcy5wb3NpdGlvblxyXG4gICAgICAgICAgICB0aGlzLl9lbG1zLmxuZyAmJiAodGhpcy5fZWxtcy5sbmdbc2VsZWN0UG9pbnQuaW5kZXhdLmlubmVySFRNTCA9IHBhcmFtcy5wb3NpdGlvbi5sbmcudG9GaXhlZCg4KSlcclxuICAgICAgICAgICAgdGhpcy5fZWxtcy5sbmdJbnB1dCAmJiAodGhpcy5fZWxtcy5sbmdJbnB1dFtzZWxlY3RQb2ludC5pbmRleF0udmFsdWUgPSBwYXJhbXMucG9zaXRpb24ubG5nLnRvRml4ZWQoOCkpXHJcbiAgICAgICAgICAgIHRoaXMuX2VsbXMubGF0ICYmICh0aGlzLl9lbG1zLmxhdFtzZWxlY3RQb2ludC5pbmRleF0uaW5uZXJIVE1MID0gcGFyYW1zLnBvc2l0aW9uLmxhdC50b0ZpeGVkKDgpKVxyXG4gICAgICAgICAgICB0aGlzLl9lbG1zLmxhdElucHV0ICYmICh0aGlzLl9lbG1zLmxhdElucHV0W3NlbGVjdFBvaW50LmluZGV4XS52YWx1ZSA9IHBhcmFtcy5wb3NpdGlvbi5sYXQudG9GaXhlZCg4KSlcclxuICAgICAgICAgICAgdGhpcy5fZWxtcy5hbHQgJiYgKHRoaXMuX2VsbXMuYWx0W3NlbGVjdFBvaW50LmluZGV4XS5pbm5lckhUTUwgPSBwYXJhbXMucG9zaXRpb24uYWx0LnRvRml4ZWQoMikpXHJcbiAgICAgICAgICAgIHRoaXMuX2VsbXMuYWx0SW5wdXQgJiYgKHRoaXMuX2VsbXMuYWx0SW5wdXRbc2VsZWN0UG9pbnQuaW5kZXhdLnZhbHVlID0gcGFyYW1zLnBvc2l0aW9uLmFsdC50b0ZpeGVkKDIpKVxyXG4gICAgICAgICAgICBzZWxlY3RQb2ludC5wb3NpdGlvbiA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzKFxyXG4gICAgICAgICAgICAgIHBhcmFtcy5wb3NpdGlvbi5sbmcsXHJcbiAgICAgICAgICAgICAgcGFyYW1zLnBvc2l0aW9uLmxhdCxcclxuICAgICAgICAgICAgICBwYXJhbXMucG9zaXRpb24uYWx0XHJcbiAgICAgICAgICAgIClcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcblxyXG4gICAgICB0aGlzLmV2ZW50Lm1vdXNlX3JpZ2h0KChtb3ZlbWVudCwgY2FydGVzaWFuKSA9PiB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm5vZGVQb2ludHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIHRoaXMuc2RrLnZpZXdlci5lbnRpdGllcy5yZW1vdmUodGhpcy5ub2RlUG9pbnRzW2ldKVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLm5vZGVQb2ludHMgPSBbXVxyXG4gICAgICAgIHRoaXMuZXZlbnQuZGVzdHJveSgpXHJcbiAgICAgICAgdGhpcy50aXAgJiYgdGhpcy50aXAuZGVzdHJveSgpXHJcbiAgICAgICAgdGhpcy50aXAgPSBudWxsXHJcbiAgICAgICAgdGhpcy5Db250cm9sbGVyT2JqZWN0LmRlc3Ryb3koKVxyXG5cclxuICAgICAgICBsZXQgZnJvbURlZ3JlZXNBcnJheSA9IHRoaXMucmVuZXdQb3NpdGlvbnModGhpcy5vcHRpb25zLnBvc2l0aW9ucylcclxuICAgICAgICB0aGlzLmVudGl0eS5wb2x5bGluZS5wb3NpdGlvbnMgPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlc0FycmF5SGVpZ2h0cyhmcm9tRGVncmVlc0FycmF5KVxyXG4gICAgICAgIFlKLk1lYXN1cmUuU2V0TWVhc3VyZVN0YXR1cyhmYWxzZSlcclxuICAgICAgICB0aGlzLl9ub2RlRWRpdENhbGxiYWNrID0gbnVsbFxyXG4gICAgICB9KVxyXG5cclxuICAgICAgdGhpcy5ldmVudC5tb3VzZV9tb3ZlKChtb3ZlbWVudCwgY2FydGVzaWFuKSA9PiB7XHJcbiAgICAgICAgdGhpcy50aXAuc2V0UG9zaXRpb24oXHJcbiAgICAgICAgICBjYXJ0ZXNpYW4sXHJcbiAgICAgICAgICBtb3ZlbWVudC5lbmRQb3NpdGlvbi54LFxyXG4gICAgICAgICAgbW92ZW1lbnQuZW5kUG9zaXRpb24ueVxyXG4gICAgICAgIClcclxuICAgICAgfSlcclxuXHJcbiAgICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLnBvc2l0aW9ucyA9IG5ldyBDZXNpdW0uQ2FsbGJhY2tQcm9wZXJ0eSggKCkgPT4ge1xyXG4gICAgICAgIGxldCBmcm9tRGVncmVlc0FycmF5ID0gdGhpcy5yZW5ld1Bvc2l0aW9ucyh0aGlzLm9wdGlvbnMucG9zaXRpb25zKVxyXG4gICAgICAgIHRoaXMuX25vZGVFZGl0Q2FsbGJhY2sodGhpcy5vcHRpb25zLnBvc2l0aW9ucywgdGhpcy5sZW5ndGhCeU1ldGVyKVxyXG4gICAgICAgIHJldHVybiBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlc0FycmF5SGVpZ2h0cyhmcm9tRGVncmVlc0FycmF5KVxyXG4gICAgICB9LCBmYWxzZSlcclxuXHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5vcHRpb25zLnBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGxldCBlbnRpdHkgPSB0aGlzLnNkay52aWV3ZXIuZW50aXRpZXMuYWRkKHtcclxuICAgICAgICAgIG5hbWU6ICdub2RlLXNlY29uZGFyeS1lZGl0LXBvaW50JyxcclxuICAgICAgICAgIGluZGV4OiBpLFxyXG4gICAgICAgICAgcG9zaXRpb246IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzKFxyXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxuZyxcclxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sYXQsXHJcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0uYWx0XHJcbiAgICAgICAgICApLFxyXG4gICAgICAgICAgYmlsbGJvYXJkOiB7XHJcbiAgICAgICAgICAgIGltYWdlOiB0aGlzLmdldFNvdXJjZVJvb3RQYXRoKCkgKyAnL2ltZy9wb2ludC5wbmcnLFxyXG4gICAgICAgICAgICB3aWR0aDogMTUsXHJcbiAgICAgICAgICAgIGhlaWdodDogMTUsXHJcbiAgICAgICAgICAgIGRpc2FibGVEZXB0aFRlc3REaXN0YW5jZTogTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLFxyXG4gICAgICAgICAgICBjb2xvcjogQ2VzaXVtLkNvbG9yLldISVRFLndpdGhBbHBoYSgwLjk5KVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgdGhpcy5ub2RlUG9pbnRzLnB1c2goZW50aXR5KVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjbG9zZU5vZGVFZGl0KCkge1xyXG4gICAgdGhpcy5Db250cm9sbGVyT2JqZWN0ICYmIHRoaXMuQ29udHJvbGxlck9iamVjdC5kZXN0cm95KClcclxuICAgIHRoaXMuZXZlbnQgJiYgdGhpcy5ldmVudC5kZXN0cm95KClcclxuICAgIHRoaXMudGlwICYmIHRoaXMudGlwLmRlc3Ryb3koKVxyXG4gICAgdGhpcy50aXAgPSBudWxsXHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm5vZGVQb2ludHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgdGhpcy5zZGsudmlld2VyLmVudGl0aWVzLnJlbW92ZSh0aGlzLm5vZGVQb2ludHNbaV0pXHJcbiAgICB9XHJcbiAgICB0aGlzLm5vZGVQb2ludHMgPSBbXVxyXG4gICAgdGhpcy5fbm9kZUVkaXRDYWxsYmFjayA9IG51bGxcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIOWIoOmZpFxyXG4gICAqL1xyXG4gIGFzeW5jIHJlbW92ZSgpIHtcclxuICAgIHRoaXMuZXZlbnQgJiYgdGhpcy5ldmVudC5kZXN0cm95KClcclxuICAgIHRoaXMudGlwICYmIHRoaXMudGlwLmRlc3Ryb3koKVxyXG4gICAgdGhpcy5sYWJlbCAmJiB0aGlzLmxhYmVsLnJlbW92ZSgpXHJcbiAgICB0aGlzLnNkay52aWV3ZXIuZW50aXRpZXMucmVtb3ZlKHRoaXMuZW50aXR5KVxyXG4gICAgdGhpcy5lbnRpdHkgPSBudWxsXHJcbiAgICBpZiAodGhpcy5fRGlhbG9nT2JqZWN0ICYmICF0aGlzLl9EaWFsb2dPYmplY3QuaXNEZXN0cm95KSB7XHJcbiAgICAgIHRoaXMuX0RpYWxvZ09iamVjdC5jbG9zZSgpXHJcbiAgICAgIHRoaXMuX0RpYWxvZ09iamVjdCA9IG51bGxcclxuICAgIH1cclxuICAgIGF3YWl0IHRoaXMuc2RrLnJlbW92ZUluY2V0YW5jZSh0aGlzLm9wdGlvbnMuaWQpXHJcbiAgICBhd2FpdCBzeW5jRGF0YSh0aGlzLnNkaywgdGhpcy5vcHRpb25zLmlkKVxyXG4gIH1cclxuXHJcbiAgLyoqQGRlc2Mg5omT5byA5bmz56e75Yqf6IO9XHJcbiAgICpcclxuICAgKiBAbWVtYmVyT2YgU291cmNlXHJcbiAgICogQHBhcmFtIHN0YXR1cyB7Ym9vbGVhbn1cclxuICAgKlxyXG4gICAqICovXHJcbiAgc2V0IHBvc2l0aW9uRWRpdGluZyhzdGF0dXMpIHtcclxuICAgIGlmIChZSi5NZWFzdXJlLkdldE1lYXN1cmVTdGF0dXMoKSB8fCAhdGhpcy5zZGsgfHwgIXRoaXMuc2RrLnZpZXdlciB8fCAhdGhpcy5lbnRpdHkpIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcbiAgICB0aGlzLm9wZXJhdGUucG9zaXRpb25FZGl0aW5nID0gc3RhdHVzXHJcbiAgICBpZiAoc3RhdHVzID09PSB0cnVlKSB7XHJcbiAgICAgIHRoaXMuY2xvc2VOb2RlRWRpdCgpXHJcbiAgICAgIHRoaXMuZXZlbnQgJiYgdGhpcy5ldmVudC5kZXN0cm95KClcclxuICAgICAgdGhpcy5ldmVudCA9IG5ldyBNb3VzZUV2ZW50KHRoaXMuc2RrKVxyXG4gICAgICB0aGlzLnRpcCAmJiB0aGlzLnRpcC5kZXN0cm95KClcclxuICAgICAgdGhpcy50aXAgPSBuZXcgTW91c2VUaXAoJ+eCueWHu+m8oOagh+W3pumUruehruiupO+8jOWPs+mUruWPlua2iCcsIHRoaXMuc2RrKVxyXG4gICAgICB0aGlzLmxhYmVsICYmXHJcbiAgICAgICAgKHRoaXMubGFiZWwuZW50aXR5LmJpbGxib2FyZC5jb2xvciA9IENlc2l1bS5Db2xvci5mcm9tQ3NzQ29sb3JTdHJpbmcoXHJcbiAgICAgICAgICBgcmdiYSgyNTUsMjU1LDI1NSwwLjkpYFxyXG4gICAgICAgICkpXHJcbiAgICAgIHRoaXMucGlja2luZyA9IGZhbHNlXHJcbiAgICAgIGxldCBwb3NpdGlvbnMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMub3B0aW9ucy5wb3NpdGlvbnMpKVxyXG4gICAgICBsZXQgcG9zaXRpb25zMiA9IHRoaXMucmVuZXdQb3NpdGlvbnModGhpcy5vcHRpb25zLnBvc2l0aW9ucylcclxuICAgICAgLy8gbGV0IHBvc2l0aW9uczIgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHBvc2l0aW9ucykpXHJcbiAgICAgIC8vIGZvciAobGV0IGkgPSAwOyBpIDwgcG9zaXRpb25zMi5sZW5ndGg7IGkrKykge1xyXG4gICAgICAvLyAgIGxldCBoZWlnaHQgPSB0aGlzLnNkay52aWV3ZXIuc2NlbmUuZ2xvYmUuZ2V0SGVpZ2h0KENlc2l1bS5DYXJ0b2dyYXBoaWMuZnJvbURlZ3JlZXMocG9zaXRpb25zMltpXS5sbmcsIHBvc2l0aW9uczJbaV0ubGF0KSlcclxuICAgICAgLy8gICBwb3NpdGlvbnMyW2ldID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXMoXHJcbiAgICAgIC8vICAgICBwb3NpdGlvbnMyW2ldLmxuZyxcclxuICAgICAgLy8gICAgIHBvc2l0aW9uczJbaV0ubGF0LFxyXG4gICAgICAvLyAgICAgTnVtYmVyKChwb3NpdGlvbnMyW2ldLmFsdCArIE51bWJlcihoZWlnaHQpKS50b0ZpeGVkKDIpKVxyXG4gICAgICAvLyAgIClcclxuICAgICAgLy8gfVxyXG4gICAgICB0aGlzLnByZXZpb3VzID0ge1xyXG4gICAgICAgIHBvc2l0aW9uczogWy4uLnRoaXMub3B0aW9ucy5wb3NpdGlvbnNdXHJcbiAgICAgIH1cclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBwb3NpdGlvbnNbaV0gPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlcyhcclxuICAgICAgICAgIHBvc2l0aW9uc1tpXS5sbmcsXHJcbiAgICAgICAgICBwb3NpdGlvbnNbaV0ubGF0LFxyXG4gICAgICAgICAgcG9zaXRpb25zW2ldLmFsdFxyXG4gICAgICAgIClcclxuICAgICAgfVxyXG4gICAgICBsZXQgY2VudGVyID0gcG9zaXRpb25zW01hdGguZmxvb3IocG9zaXRpb25zLmxlbmd0aCAvIDIpXVxyXG4gICAgICBsZXQgZGlzcGFyaXR5ID0gW11cclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBkaXNwYXJpdHkucHVzaCh7XHJcbiAgICAgICAgICB4OiBjZW50ZXIueCAtIHBvc2l0aW9uc1tpXS54LFxyXG4gICAgICAgICAgeTogY2VudGVyLnkgLSBwb3NpdGlvbnNbaV0ueSxcclxuICAgICAgICAgIHo6IGNlbnRlci56IC0gcG9zaXRpb25zW2ldLnpcclxuICAgICAgICB9KVxyXG4gICAgICB9XHJcbiAgICAgIGxldCBuZXdwb3NpdGlvbnMgPSBbXVxyXG4gICAgICBsZXQgbmV3cG9zaXRpb25zODQgPSBbXVxyXG4gICAgICB0aGlzLmV2ZW50Lm1vdXNlX21vdmUoKG1vdmVtZW50LCBjYXJ0ZXNpYW4pID0+IHtcclxuICAgICAgICBuZXdwb3NpdGlvbnMgPSBbXVxyXG4gICAgICAgIG5ld3Bvc2l0aW9uczg0ID0gW11cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRpc3Bhcml0eS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgbGV0IG5ld1AgPSB7XHJcbiAgICAgICAgICAgIHg6IGNhcnRlc2lhbi54IC0gZGlzcGFyaXR5W2ldLngsXHJcbiAgICAgICAgICAgIHk6IGNhcnRlc2lhbi55IC0gZGlzcGFyaXR5W2ldLnksXHJcbiAgICAgICAgICAgIHo6IGNhcnRlc2lhbi56IC0gZGlzcGFyaXR5W2ldLnpcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGxldCBwb3M4NCA9IHRoaXMuY2FydGVzaWFuM1Rvd2dzODQoXHJcbiAgICAgICAgICAgIG5ld1AsXHJcbiAgICAgICAgICAgIHRoaXMuc2RrLnZpZXdlclxyXG4gICAgICAgICAgKVxyXG4gICAgICAgICAgcG9zODQuYWx0ID0gdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5hbHRcclxuICAgICAgICAgIC8vIGxldCBoZWlnaHQgPSB0aGlzLnNkay52aWV3ZXIuc2NlbmUuZ2xvYmUuZ2V0SGVpZ2h0KENlc2l1bS5DYXJ0b2dyYXBoaWMuZnJvbURlZ3JlZXMocG9zODQubG5nLCBwb3M4NC5sYXQpKVxyXG4gICAgICAgICAgLy8gcG9zODQuYWx0ID0gTnVtYmVyKChwb3M4NC5hbHQgKyBOdW1iZXIoaGVpZ2h0KSkudG9GaXhlZCgyKSlcclxuICAgICAgICAgIC8vIG5ld1AgPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlcyhcclxuICAgICAgICAgIC8vICAgcG9zODQubG5nLFxyXG4gICAgICAgICAgLy8gICBwb3M4NC5sYXQsXHJcbiAgICAgICAgICAvLyAgIHBvczg0LmFsdFxyXG4gICAgICAgICAgLy8gKVxyXG4gICAgICAgICAgbmV3cG9zaXRpb25zLnB1c2gobmV3UClcclxuICAgICAgICAgIG5ld3Bvc2l0aW9uczg0LnB1c2gocG9zODQpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBwb3NpdGlvbjg0ID0gbmV3cG9zaXRpb25zODRbMF1cclxuICAgICAgICBwb3NpdGlvbnMyID0gdGhpcy5yZW5ld1Bvc2l0aW9ucyhuZXdwb3NpdGlvbnM4NClcclxuICAgICAgICB0aGlzLmxhYmVsLnBvc2l0aW9uID0gW3Bvc2l0aW9uODQubG5nLCBwb3NpdGlvbjg0LmxhdCwgcG9zaXRpb244NC5hbHRdXHJcbiAgICAgICAgdGhpcy5vcHRpb25zLmxhYmVsLnBvc2l0aW9uID0ge1xyXG4gICAgICAgICAgbG5nOiBwb3NpdGlvbjg0LmxuZyxcclxuICAgICAgICAgIGxhdDogcG9zaXRpb244NC5sYXQsXHJcbiAgICAgICAgICBhbHQ6IHBvc2l0aW9uODQuYWx0XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMudGlwLnNldFBvc2l0aW9uKFxyXG4gICAgICAgICAgY2FydGVzaWFuLFxyXG4gICAgICAgICAgbW92ZW1lbnQuZW5kUG9zaXRpb24ueCxcclxuICAgICAgICAgIG1vdmVtZW50LmVuZFBvc2l0aW9uLnlcclxuICAgICAgICApXHJcbiAgICAgIH0pXHJcbiAgICAgIHRoaXMuZXZlbnQubW91c2VfbGVmdCgobW92ZW1lbnQsIGNhcnRlc2lhbikgPT4ge1xyXG4gICAgICAgIHRoaXMuZXZlbnQubW91c2VfbW92ZSgoKSA9PiB7IH0pXHJcbiAgICAgICAgdGhpcy5ldmVudC5tb3VzZV9sZWZ0KCgpID0+IHsgfSlcclxuICAgICAgICB0aGlzLmV2ZW50Lm1vdXNlX3JpZ2h0KCgpID0+IHsgfSlcclxuICAgICAgICBuZXdwb3NpdGlvbnMgPSBbXVxyXG4gICAgICAgIG5ld3Bvc2l0aW9uczg0ID0gW11cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRpc3Bhcml0eS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgbGV0IG5ld1AgPSB7XHJcbiAgICAgICAgICAgIHg6IGNhcnRlc2lhbi54IC0gZGlzcGFyaXR5W2ldLngsXHJcbiAgICAgICAgICAgIHk6IGNhcnRlc2lhbi55IC0gZGlzcGFyaXR5W2ldLnksXHJcbiAgICAgICAgICAgIHo6IGNhcnRlc2lhbi56IC0gZGlzcGFyaXR5W2ldLnpcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGxldCBwb3M4NCA9IHRoaXMuY2FydGVzaWFuM1Rvd2dzODQoXHJcbiAgICAgICAgICAgIG5ld1AsXHJcbiAgICAgICAgICAgIHRoaXMuc2RrLnZpZXdlclxyXG4gICAgICAgICAgKVxyXG4gICAgICAgICAgcG9zODQuYWx0ID0gdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5hbHRcclxuICAgICAgICAgIG5ld3Bvc2l0aW9ucy5wdXNoKG5ld1ApXHJcbiAgICAgICAgICBuZXdwb3NpdGlvbnM4NC5wdXNoKHBvczg0KVxyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgcG9zaXRpb25zTG5nTGF0ID0gW11cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5ld3Bvc2l0aW9uczg0Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBsZXQgcG9zaXRpb24gPSBuZXdwb3NpdGlvbnM4NFtpXVxyXG4gICAgICAgICAgcG9zaXRpb25zTG5nTGF0LnB1c2gocG9zaXRpb24pXHJcblxyXG4gICAgICAgICAgdGhpcy5fZWxtcy5sbmcgJiYgKHRoaXMuX2VsbXMubG5nW2ldLmlubmVySFRNTCA9IHBvc2l0aW9uLmxuZy50b0ZpeGVkKDgpKVxyXG4gICAgICAgICAgdGhpcy5fZWxtcy5sbmdJbnB1dCAmJiAodGhpcy5fZWxtcy5sbmdJbnB1dFtpXS52YWx1ZSA9IHBvc2l0aW9uLmxuZy50b0ZpeGVkKDgpKVxyXG4gICAgICAgICAgdGhpcy5fZWxtcy5sYXQgJiYgKHRoaXMuX2VsbXMubGF0W2ldLmlubmVySFRNTCA9IHBvc2l0aW9uLmxhdC50b0ZpeGVkKDgpKVxyXG4gICAgICAgICAgdGhpcy5fZWxtcy5sYXRJbnB1dCAmJiAodGhpcy5fZWxtcy5sYXRJbnB1dFtpXS52YWx1ZSA9IHBvc2l0aW9uLmxhdC50b0ZpeGVkKDgpKVxyXG4gICAgICAgICAgdGhpcy5fZWxtcy5hbHQgJiYgKHRoaXMuX2VsbXMuYWx0W2ldLmlubmVySFRNTCA9IHBvc2l0aW9uLmFsdC50b0ZpeGVkKDIpKVxyXG4gICAgICAgICAgdGhpcy5fZWxtcy5hbHRJbnB1dCAmJiAodGhpcy5fZWxtcy5hbHRJbnB1dFtpXS52YWx1ZSA9IHBvc2l0aW9uLmFsdC50b0ZpeGVkKDIpKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9ucyA9IHBvc2l0aW9uc0xuZ0xhdFxyXG4gICAgICAgIHRoaXMucHJldmlvdXMucG9zaXRpb25zID0gcG9zaXRpb25zTG5nTGF0XHJcblxyXG4gICAgICAgIC8vIHRoaXMuZW50aXR5LnBvbHlsaW5lLnBvc2l0aW9uc0xuZ0xhdCA9IHBvc2l0aW9uc0xuZ0xhdFxyXG4gICAgICAgIGxldCBmcm9tRGVncmVlc0FycmF5ID0gdGhpcy5yZW5ld1Bvc2l0aW9ucyh0aGlzLm9wdGlvbnMucG9zaXRpb25zLCAoKT0+e1xyXG4gICAgICAgICAgaWYodGhpcy5fcG9zaXRpb25FZGl0aW5nQ2FsbGJhY2spIHtcclxuICAgICAgICAgICAgdGhpcy5fcG9zaXRpb25FZGl0aW5nQ2FsbGJhY2soKVxyXG4gICAgICAgICAgICB0aGlzLl9wb3NpdGlvbkVkaXRpbmdDYWxsYmFjayA9IG51bGxcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLnBvc2l0aW9ucyA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzQXJyYXlIZWlnaHRzKFxyXG4gICAgICAgICAgZnJvbURlZ3JlZXNBcnJheVxyXG4gICAgICAgIClcclxuICAgICAgICB0aGlzLnJlbmV3UG9seWdvbihmcm9tRGVncmVlc0FycmF5KVxyXG4gICAgICAgIHRoaXMucG9zaXRpb25FZGl0aW5nID0gZmFsc2VcclxuICAgICAgfSlcclxuXHJcbiAgICAgIHRoaXMuZXZlbnQubW91c2VfcmlnaHQoKG1vdmVtZW50LCBjYXJ0ZXNpYW4pID0+IHtcclxuICAgICAgICB0aGlzLmV2ZW50Lm1vdXNlX21vdmUoKCkgPT4geyB9KVxyXG4gICAgICAgIHRoaXMuZXZlbnQubW91c2VfbGVmdCgoKSA9PiB7IH0pXHJcbiAgICAgICAgdGhpcy5ldmVudC5tb3VzZV9yaWdodCgoKSA9PiB7IH0pXHJcbiAgICAgICAgdGhpcy5wb3NpdGlvbkVkaXRpbmcgPSBmYWxzZVxyXG4gICAgICB9KVxyXG4gICAgICB0aGlzLmV2ZW50Lmdlc3R1cmVfcGluY2tfc3RhcnQoKG1vdmVtZW50LCBjYXJ0ZXNpYW4pID0+IHtcclxuICAgICAgICBsZXQgc3RhcnRUaW1lID0gbmV3IERhdGUoKVxyXG4gICAgICAgIHRoaXMuZXZlbnQuZ2VzdHVyZV9waW5ja19lbmQoKCkgPT4ge1xyXG4gICAgICAgICAgbGV0IGVuZFRpbWUgPSBuZXcgRGF0ZSgpXHJcbiAgICAgICAgICBsZXQgcG9zID0ge1xyXG4gICAgICAgICAgICBwb3NpdGlvbjoge1xyXG4gICAgICAgICAgICAgIHg6IChtb3ZlbWVudC5wb3NpdGlvbjEueCArIG1vdmVtZW50LnBvc2l0aW9uMi54KSAvIDIsXHJcbiAgICAgICAgICAgICAgeTogKG1vdmVtZW50LnBvc2l0aW9uMS55ICsgbW92ZW1lbnQucG9zaXRpb24yLnkpIC8gMlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAoZW5kVGltZSAtIHN0YXJ0VGltZSA+PSA1MDApIHtcclxuICAgICAgICAgICAgLy8g6ZW/5oyJ5Y+W5raIXHJcbiAgICAgICAgICAgIHRoaXMuZXZlbnQubW91c2VfbW92ZSgoKSA9PiB7IH0pXHJcbiAgICAgICAgICAgIHRoaXMuZXZlbnQubW91c2VfbGVmdCgoKSA9PiB7IH0pXHJcbiAgICAgICAgICAgIHRoaXMuZXZlbnQubW91c2VfcmlnaHQoKCkgPT4geyB9KVxyXG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uRWRpdGluZyA9IGZhbHNlXHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBsZWZ0RXZlbnQocG9zLCBjYXJ0ZXNpYW4pXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgfSlcclxuXHJcbiAgICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLnBvc2l0aW9ucyA9IG5ldyBDZXNpdW0uQ2FsbGJhY2tQcm9wZXJ0eShmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgcmV0dXJuIENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzQXJyYXlIZWlnaHRzKFxyXG4gICAgICAgICAgcG9zaXRpb25zMlxyXG4gICAgICAgIClcclxuICAgICAgfSwgZmFsc2UpXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAoIXRoaXMuc2RrIHx8ICF0aGlzLnNkay52aWV3ZXIgfHwgIXRoaXMubGFiZWwgfHwgIXRoaXMubGFiZWwuZW50aXR5KSB7XHJcbiAgICAgICAgdGhpcy5sYWJlbC5lbnRpdHkuYmlsbGJvYXJkLmNvbG9yID0gQ2VzaXVtLkNvbG9yLmZyb21Dc3NDb2xvclN0cmluZyhcclxuICAgICAgICAgIGByZ2JhKDI1NSwyNTUsMjU1LDEpYFxyXG4gICAgICAgIClcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnBpY2tpbmcgPSB0cnVlXHJcbiAgICAgIGlmICh0aGlzLmV2ZW50KSB7XHJcbiAgICAgICAgdGhpcy5ldmVudC5tb3VzZV9tb3ZlKCgpID0+IHsgfSlcclxuICAgICAgICB0aGlzLmV2ZW50Lm1vdXNlX2xlZnQoKCkgPT4geyB9KVxyXG4gICAgICAgIHRoaXMuZXZlbnQubW91c2VfcmlnaHQoKCkgPT4geyB9KVxyXG4gICAgICAgIHRoaXMuZXZlbnQuZGVzdHJveSgpXHJcbiAgICAgIH1cclxuICAgICAgdGhpcy50aXAgJiYgdGhpcy50aXAuZGVzdHJveSgpXHJcbiAgICAgIGxldCBmcm9tRGVncmVlc0FycmF5ID0gdGhpcy5yZW5ld1Bvc2l0aW9ucyh0aGlzLm9wdGlvbnMucG9zaXRpb25zKVxyXG4gICAgICB0aGlzLmVudGl0eS5wb2x5bGluZS5wb3NpdGlvbnMgPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlc0FycmF5SGVpZ2h0cyhcclxuICAgICAgICBmcm9tRGVncmVlc0FycmF5XHJcbiAgICAgIClcclxuICAgICAgdGhpcy5yZW5ld1BvbHlnb24oZnJvbURlZ3JlZXNBcnJheSlcclxuXHJcbiAgICAgIHN3aXRjaCAodGhpcy5oZWlnaHRNb2RlKSB7XHJcbiAgICAgICAgY2FzZSAwOlxyXG4gICAgICAgIGNhc2UgJzAnOlxyXG4gICAgICAgIGNhc2UgMTpcclxuICAgICAgICBjYXNlICcxJzpcclxuICAgICAgICAgIHRoaXMubGFiZWwucG9zaXRpb24gPSBbXHJcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0ubG5nLFxyXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zWzBdLmxhdCxcclxuICAgICAgICAgICAgZnJvbURlZ3JlZXNBcnJheVsyXVxyXG4gICAgICAgICAgXVxyXG4gICAgICAgICAgdGhpcy5vcHRpb25zLmxhYmVsLnBvc2l0aW9uID0ge1xyXG4gICAgICAgICAgICBsbmc6IHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0ubG5nLFxyXG4gICAgICAgICAgICBsYXQ6IHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0ubGF0LFxyXG4gICAgICAgICAgICBhbHQ6IGZyb21EZWdyZWVzQXJyYXlbMl1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgMjpcclxuICAgICAgICBjYXNlICcyJzpcclxuICAgICAgICAgIHRoaXMubGFiZWwucG9zaXRpb24gPSBbXHJcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0ubG5nLFxyXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zWzBdLmxhdCxcclxuICAgICAgICAgIF1cclxuICAgICAgICAgIHRoaXMub3B0aW9ucy5sYWJlbC5wb3NpdGlvbiA9IHtcclxuICAgICAgICAgICAgbG5nOiB0aGlzLm9wdGlvbnMucG9zaXRpb25zWzBdLmxuZyxcclxuICAgICAgICAgICAgbGF0OiB0aGlzLm9wdGlvbnMucG9zaXRpb25zWzBdLmxhdCxcclxuICAgICAgICAgICAgYWx0OiBmcm9tRGVncmVlc0FycmF5WzJdXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IHBvc2l0aW9uRWRpdGluZygpIHtcclxuICAgIHJldHVybiB0aGlzLm9wZXJhdGUucG9zaXRpb25FZGl0aW5nXHJcbiAgfVxyXG4gIG9wZW5Qb3NpdGlvbkVkaXRpbmcoY2QpIHtcclxuICAgIHRoaXMucG9zaXRpb25FZGl0aW5nID0gdHJ1ZVxyXG4gICAgdGhpcy5fcG9zaXRpb25FZGl0aW5nQ2FsbGJhY2sgPSBjZFxyXG4gIH1cclxuICBcclxuICBnZXQgbGVuZ3RoQ2hhbmdlQ2FsbEJhY2soKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fbGVuZ3RoQ2hhbmdlQ2FsbEJhY2tcclxuICB9XHJcblxyXG4gIHNldCBsZW5ndGhDaGFuZ2VDYWxsQmFjayAoY2QpIHtcclxuICAgIHRoaXMuX2xlbmd0aENoYW5nZUNhbGxCYWNrID0gY2RcclxuICB9XHJcblxyXG4gIHNldERJVihvcHRpb25zID0geyBkb21pZDogJycsIHg6IDEwLCB5OiAxMCB9KSB7XHJcbiAgICBvcHRpb25zLnggPSBvcHRpb25zLnggfHwgb3B0aW9ucy54ID09PSAwID8gb3B0aW9ucy54IDogMTBcclxuICAgIG9wdGlvbnMueSA9IG9wdGlvbnMueSB8fCBvcHRpb25zLnkgPT09IDAgPyBvcHRpb25zLnkgOiAxMFxyXG5cclxuICAgIGxldCBwb2ludHMgPSBbXVxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm9wdGlvbnMucG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIHBvaW50cy5wdXNoKFtcclxuICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxuZyxcclxuICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxhdFxyXG4gICAgICBdKVxyXG4gICAgfVxyXG4gICAgbGV0IGxpbmUgPSB0dXJmLmxpbmVTdHJpbmcocG9pbnRzKVxyXG4gICAgbGV0IGxlbmd0aCA9IHR1cmYubGVuZ3RoKGxpbmUsIHsgdW5pdHM6ICdraWxvbWV0ZXJzJyB9KVxyXG4gICAgbGV0IHNsaWNlZCA9IHR1cmYubGluZVNsaWNlQWxvbmcobGluZSwgMCwgbGVuZ3RoIC8gMiwge1xyXG4gICAgICB1bml0czogJ2tpbG9tZXRlcnMnXHJcbiAgICB9KVxyXG5cclxuICAgIGxldCBzaXRlSW5mb0RvbSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKG9wdGlvbnMuZG9taWQpXHJcbiAgICBsZXQgc2l0ZUluZm9Qb3NpdGlvbiA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzKFxyXG4gICAgICAuLi5zbGljZWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbc2xpY2VkLmdlb21ldHJ5LmNvb3JkaW5hdGVzLmxlbmd0aCAtIDFdXHJcbiAgICApXHJcbiAgICB0aGlzLnNkay52aWV3ZXIuc2NlbmUucG9zdFJlbmRlci5hZGRFdmVudExpc3RlbmVyKHBlcmNlbnRhZ2UgPT4ge1xyXG4gICAgICAvL+i9rOaNouWIsOWxj+W5leWdkOagh1xyXG4gICAgICBpZiAoXHJcbiAgICAgICAgc2l0ZUluZm9Eb20uc3R5bGUuZGlzcGxheSA9PT0gJ2Jsb2NrJyB8fFxyXG4gICAgICAgIHNpdGVJbmZvRG9tLnN0eWxlLmRpc3BsYXkgPT09ICcnXHJcbiAgICAgICkge1xyXG4gICAgICAgIGxldCB3aW5wb3MgPSB0aGlzLnNkay52aWV3ZXIuc2NlbmUuY2FydGVzaWFuVG9DYW52YXNDb29yZGluYXRlcyhcclxuICAgICAgICAgIHNpdGVJbmZvUG9zaXRpb25cclxuICAgICAgICApXHJcbiAgICAgICAgaWYgKHdpbnBvcykge1xyXG4gICAgICAgICAgc2l0ZUluZm9Eb20uc3R5bGUubGVmdCA9ICh3aW5wb3MueCArIG9wdGlvbnMueCkudG9GaXhlZCgwKSArICdweCdcclxuICAgICAgICAgIHNpdGVJbmZvRG9tLnN0eWxlLnRvcCA9ICh3aW5wb3MueSArIG9wdGlvbnMueSkudG9GaXhlZCgwKSArICdweCdcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG59XHJcbmV4cG9ydCBkZWZhdWx0IEN1cnZlbGluZU9iamVjdFxyXG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUlBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFwQkE7QUFBQTtBQWtCQTtBQUdBO0FBQ0E7QUFDQTtBQVFBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUlBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFFQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUtBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQXFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUdBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUFBO0FBQUE7QUFBQTtBQUlBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBU0E7QUFzREE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFXQTtBQUNBO0FBTUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBR0E7QUFNQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBR0E7QUFPQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBTUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBTUE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQXRIQTtBQUFBO0FBQUE7QUF3SEE7QUFDQTtBQU1BO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUF4dEJBO0FBQUE7QUFBQTtBQUFBO0FBMHRCQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUtBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQUE7QUFHQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUF4REE7QUFBQTtBQUFBO0FBQUE7QUEyREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUZBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUVBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFBQTtBQUVBO0FBeUJBO0FBQUE7QUF0QkE7QUFDQTtBQUtBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUlBO0FBQUE7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBSUE7QUFBQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQTFHQTtBQUFBO0FBQUE7QUFBQTtBQTRHQTtBQUNBO0FBQ0E7QUFGQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFNQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUtBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFaQTtBQUFBO0FBQUE7QUFBQTtBQWNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUxBO0FBQUE7QUFBQTtBQUFBO0FBb09BO0FBQ0E7QUFBQTtBQS9OQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFNQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFJQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUF0N0RBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFBQTtBQUNBO0FBZUE7QUFBQTtBQVpBO0FBQ0E7QUFBQTtBQUFBO0FBSUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBSEE7QUFBQTtBQUFBO0FBT0E7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFIQTtBQUFBO0FBQUE7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQXZEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQTBEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBdXpEQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/Obj/Base/CurvelineObject/index.js\n"); /***/ }), @@ -2339,7 +2339,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) * /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ \"./node_modules/@babel/runtime/helpers/defineProperty.js\");\n/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ \"./node_modules/@babel/runtime/helpers/asyncToGenerator.js\");\n/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/toConsumableArray */ \"./node_modules/@babel/runtime/helpers/toConsumableArray.js\");\n/* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ \"./node_modules/@babel/runtime/helpers/classCallCheck.js\");\n/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ \"./node_modules/@babel/runtime/helpers/createClass.js\");\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ \"./node_modules/@babel/runtime/helpers/possibleConstructorReturn.js\");\n/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ \"./node_modules/@babel/runtime/helpers/getPrototypeOf.js\");\n/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ \"./node_modules/@babel/runtime/helpers/inherits.js\");\n/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @babel/runtime/regenerator */ \"./node_modules/@babel/runtime/regenerator/index.js\");\n/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8__);\n/* harmony import */ var _Element_Dialog__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../Element/Dialog */ \"./src/Obj/Element/Dialog/index.js\");\n/* harmony import */ var _Element_cy_html_tabs__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../Element/cy_html_tabs */ \"./src/Obj/Element/cy_html_tabs.js\");\n/* harmony import */ var _Element_richText__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../Element/richText */ \"./src/Obj/Element/richText.js\");\n/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./_element */ \"./src/Obj/Base/PincerArrowObject/_element.js\");\n/* harmony import */ var _index__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../index */ \"./src/Obj/Base/index.js\");\n/* harmony import */ var _LabelObject__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../LabelObject */ \"./src/Obj/Base/LabelObject/index.js\");\n/* harmony import */ var _Event_index__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../../../Event/index */ \"./src/Event/index.js\");\n/* harmony import */ var _MouseTip__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../../../MouseTip */ \"./src/MouseTip/index.js\");\n/* harmony import */ var _Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../../../Global/MultiViewportMode */ \"./src/Global/MultiViewportMode/index.js\");\n/* harmony import */ var _Element_datalist__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../../Element/datalist */ \"./src/Obj/Element/datalist.js\");\n/* harmony import */ var _Element_fontSelect__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../../Element/fontSelect */ \"./src/Obj/Element/fontSelect.js\");\n/* harmony import */ var _Global_SplitScreen__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../../../Global/SplitScreen */ \"./src/Global/SplitScreen/index.js\");\n/* harmony import */ var _Global_global__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../../../Global/global */ \"./src/Global/global.js\");\n\n\n\n\n\n\n\n\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default()(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\n\nfunction _createForOfIteratorHelper(r, e) { var t = \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && \"number\" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t.return || t.return(); } finally { if (u) throw o; } } }; }\nfunction _unsupportedIterableToArray(r, a) { if (r) { if (\"string\" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }\nfunction _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }\nfunction _callSuper(t, o, e) { return o = _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6___default()(o), _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_5___default()(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6___default()(t).constructor) : o.apply(t, e)); }\nfunction _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }\n/**\r\n * 双箭头\r\n */\n\n\n\n\n\n\n\n\n\n\n\n\n\n// import EditParticle from \"../../ModelController/EditParticle\";\nvar PincerArrowObject = /*#__PURE__*/function (_Base) {\n /**\r\n * @constructor\r\n * @param sdk \r\n * @description 双箭头\r\n * @param options {object} 属性\r\n * @param options.id {string} 唯一标识\r\n * @param options.show=true {boolean} 显示/隐藏\r\n * @param options.name {string} 名称\r\n * @param options.color='rgba(255, 0, 0, 0.5)' {string} 颜色\r\n * @param options.height {number} 高度\r\n * @param options.heightMode=2{number} 高度模式(0:海拔高度;1:相对地表;2:依附模式)\r\n * @param options.areaUnit='平方米' {string} 面积单位\r\n * @param options.line {object} 边框\r\n * @param options.line.width=2 {string} 边框宽\r\n * @param options.line.color=\"rgba(155, 155, 124, 0.89)\" {string} 边框颜色\r\n * @param {Array.} options.positions 必填,经纬度和高度的列表,值交替 [{lon,lat,alt},...]\r\n * @param options.positions[].lng {number} 经度\r\n * @param options.positions[].lat {number} 纬度\r\n * @param options.positions[].alt {number} 高度\r\n * @param options.spreadState=false {boolean} 动画\r\n * @param options.loop=false {loop} 动画重复\r\n * @param options.spreadTime=3000 {number} 动画持续时长(毫秒)\r\n * @param options.label {object} 标签对象\r\n * @param options.label.text {string} 标签文本\r\n * @param options.label.show {string} 标签显隐\r\n * @param options.label.position {string} 标签位置\r\n * @param options.label.position {object} 标签位置\r\n * @param options.label.position.lng {number} 经度\r\n * @param options.label.position.lat {number} 纬度\r\n * @param options.label.position.alt {number} 高度\r\n * @param options.label.fontSize=20 {number} 字体大小\r\n * @param options.label.fontFamily=0 {number} 字体项 0:黑体;1:思源黑体;2:庞门正道标题体;3:数黑体\r\n * @param options.label.color=#ffffff {string} 字体颜色\r\n * @param options.label.lineWidth=4 {number} 引线宽\r\n * @param options.label.lineColor=#00ffff80 {string} 引线颜色\r\n * @param options.label.pixelOffset=20 {number} 字体偏移(引线长度)\r\n * @param options.label.backgroundColor=['#00ffff80', '#00ffff80'] {array} 背景颜色\r\n * @param options.label.scaleByDistance {boolean} 距离缩放\r\n * @param options.label.near=2000 {number} 视野缩放最近距离\r\n * @param options.label.far=100000 {number} 视野缩放最远距离\r\n * @param options.attribute {object} 属性内容\r\n * @param options.attribute.link={} {object} 链接\r\n * @param options.attribute.link.content=[]] {array} 链接内容\r\n * @param options.attribute.link.content[].name {string} 链接名称\r\n * @param options.attribute.link.content[].url {string} 链接地址\r\n * @param options.richTextContent {string} 富文本内容\r\n * @param options.customView {object} 默认视角\r\n * @param options.customView.orientation {object} 默认视角方位\r\n * @param options.customView.orientation.heading {number} 航向角\r\n * @param options.customView.orientation.pitch {number} 俯仰角\r\n * @param options.customView.orientation.roll {number} 翻滚角\r\n * @param options.customView.relativePosition {object} 视角相对位置\r\n * @param options.customView.relativePosition.lng {number} 经度\r\n * @param options.customView.relativePosition.lat {number} 纬度\r\n * @param options.customView.relativePosition.alt {number} 高度\r\n * */\n function PincerArrowObject(sdk) {\n var _this2;\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var _Dialog = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3___default()(this, PincerArrowObject);\n _this2 = _callSuper(this, PincerArrowObject, [sdk, options]);\n _this2.options.name = options.name || '未命名对象';\n _this2.options.color = options.color || \"#ff000080\";\n _this2.options.show = options.show || options.show === false ? options.show : true;\n _this2.options.positions = options.positions || [];\n _this2.options.heightMode = options.heightMode || options.heightMode == 0 ? options.heightMode : 2;\n _this2.options.line = options.line || {};\n _this2.options.line.width = _this2.options.line.width || _this2.options.line.width === 0 ? _this2.options.line.width : 3;\n _this2.options.line.color = _this2.options.line.color || 'rgba(255, 0, 0, 1)';\n _this2.options['area-unit'] = options['area-unit'] || '平方米';\n _this2.options.height = options.height;\n _this2.options.loop = options.loop || false;\n _this2.options.spreadState = options.spreadState || false;\n _this2._elms = {};\n _this2.nodePoints = [];\n _this2.spreadTime = options.spreadTime;\n _this2.entity;\n _this2.event;\n _this2.operate = {};\n _this2.Dialog = _Dialog;\n options.label = options.label || {};\n _this2.options.label = {\n text: _this2.options.name,\n show: options.label.show || false,\n position: options.label.position,\n fontSize: options.label.fontSize || options.label.fontSize === 0 ? options.label.fontSize : 20,\n fontFamily: options.label.fontFamily ? options.label.fontFamily : 0,\n color: options.label.color || '#ffffff',\n lineWidth: options.label.lineWidth || options.label.lineWidth === 0 ? options.label.lineWidth : 4,\n pixelOffset: options.label.pixelOffset || options.label.pixelOffset === 0 ? options.label.pixelOffset : 20,\n backgroundColor: options.label.backgroundColor || ['#00ffff80', '#00ffff80'],\n lineColor: options.label.lineColor || '#00ffff80',\n scaleByDistance: options.label.scaleByDistance || false,\n near: options.label.near || options.label.near === 0 ? options.label.near : 2000,\n far: options.label.far || options.label.far === 0 ? options.label.far : 100000\n };\n _this2.options.attribute = options.attribute || {};\n _this2.options.attribute.link = _this2.options.attribute.link || {};\n _this2.options.attribute.link.content = _this2.options.attribute.link.content || [];\n _this2.options.attribute.camera = _this2.options.attribute.camera || {};\n _this2.options.attribute.camera.content = _this2.options.attribute.camera.content || [];\n _this2.options.attribute.vr = _this2.options.attribute.vr || {};\n _this2.options.attribute.vr.content = _this2.options.attribute.vr.content || [];\n _this2.options.attribute.goods = _this2.options.attribute.goods || {};\n _this2.options.attribute.goods.content = _this2.options.attribute.goods.content || [];\n _this2.options.attributeType = options.attributeType || 'richText';\n if (!_this2.options.positions || _this2.options.positions.length < 5) {\n _this2._error = '双箭头最少需要五个坐标!';\n console.warn(_this2._error);\n window.ELEMENT && window.ELEMENT.Message({\n message: _this2._error,\n type: 'warning',\n duration: 1500\n });\n } else {\n if (!_this2.options.height && _this2.options.height !== 0) {\n var height = _this2.options.positions[0].alt;\n for (var i = 1; i < _this2.options.positions.length; i++) {\n if (height < _this2.options.positions[i].alt) {\n height = _this2.options.positions[i].alt;\n }\n }\n _this2.options.height = height;\n }\n _this2.sdk.addIncetance(_this2.options.id, _this2);\n PincerArrowObject.create(_this2);\n }\n return _this2;\n }\n _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_7___default()(PincerArrowObject, _Base);\n return _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4___default()(PincerArrowObject, [{\n key: \"type\",\n get: function get() {\n return 'PincerArrowObject';\n }\n }, {\n key: \"name\",\n get: function get() {\n return this.options.name;\n },\n set: function set(v) {\n this.options.name = v;\n this.label.text = v;\n this._elms.name && this._elms.name.forEach(function (item) {\n item.value = v;\n });\n }\n }, {\n key: \"color\",\n get: function get() {\n return this.options.color;\n },\n set: function set(v) {\n var _this3 = this;\n this.options.color = v || 'rgba(255, 0, 0, 0.5)';\n if (!this.sdk || !this.sdk.viewer || !this.entity || !this.entity.polygon) {\n return;\n }\n var material = Cesium.Color.fromCssColorString(this.options.color);\n if (this.sdk.viewer.scene.mode === 2) {\n material = new Cesium.CustomColorMaterialSource({\n color: this.options.color\n });\n }\n this.entity.polygon.material = material;\n if (this._elms.color) {\n this._elms.color.forEach(function (item, i) {\n var colorPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: _this3.options.color,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(c) {\n _this3.color = c;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this3.color = 'rgba(255,0,0,0.5)';\n } //点击清空按钮事件回调\n });\n _this3._elms.color[i] = colorPicker;\n });\n }\n }\n }, {\n key: \"heightMode\",\n get: function get() {\n return this.options.heightMode ? this.options.heightMode : 0;\n },\n set: function set(v) {\n var _this4 = this;\n this.entity.polygon.hierarchy = [];\n setTimeout(function () {\n _this4.options.heightMode = v || v == 0 ? v : 2;\n _this4.positionEditing = false;\n if (!_this4.entity) {\n return;\n }\n var heightModeName = '';\n PincerArrowObject.closeNodeEdit(_this4);\n var ground = false;\n var disabled = false;\n _this4.renewPositions();\n _this4.entity.polyline.positions = [].concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(_this4.positionsH), [_this4.positionsH[0], _this4.positionsH[1]]);\n _this4.entity.polygon.hierarchy = new Cesium.PolygonHierarchy(_this4.positionsH);\n switch (_this4.options.heightMode) {\n case '0':\n case 0:\n heightModeName = '海拔高度';\n break;\n case '1':\n case 1:\n heightModeName = '相对地表';\n break;\n case '2':\n case 2:\n ground = true;\n disabled = true;\n heightModeName = '依附模型';\n break;\n }\n _this4.label.ground = ground;\n _this4.entity.polyline.clampToGround = ground;\n _this4.entity.polyline.arcType = !ground ? Cesium.ArcType.NONE : Cesium.ArcType.GEODESIC, _this4.entity.polygon.perPositionHeight = !ground ? true : false;\n _this4._elms.heightMode && (_this4._elms.heightMode.value = heightModeName);\n _this4._elms.heightModeObject && _this4._elms.heightModeObject.legp_searchActive(heightModeName);\n if (disabled) {\n _this4._elms.heightBox && (_this4._elms.heightBox.className = 'input-number input-number-unit-1 height-box disabled');\n _this4._elms.heightConfirm && _this4._elms.heightConfirm.setAttribute('disabled', 'disabled');\n } else {\n _this4._elms.heightBox && (_this4._elms.heightBox.className = 'input-number input-number-unit-1 height-box');\n _this4._elms.heightConfirm && _this4._elms.heightConfirm.removeAttribute('disabled');\n }\n }, 50);\n }\n }, {\n key: \"height\",\n get: function get() {\n return this.options.height;\n },\n set: function set(v) {\n var _this5 = this;\n if (!v || isNaN(Number(v))) {\n this.options.height = 0;\n } else {\n this.options.height = Number(Number(v).toFixed(2));\n }\n var ground;\n if (this.heightMode == 2) {\n ground = true;\n } else {\n ground = false;\n }\n this.renewPositions();\n setTimeout(function () {\n _this5.entity.polygon.hierarchy = new Cesium.PolygonHierarchy(_this5.positionsH);\n _this5.entity.polygon.perPositionHeight = !ground ? true : false;\n _this5.entity.polyline.positions = [].concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(_this5.positionsH), [_this5.positionsH[0], _this5.positionsH[1]]);\n _this5.entity.polyline.clampToGround = !ground ? false : true;\n _this5.entity.polyline.arcType = !ground ? Cesium.ArcType.NONE : Cesium.ArcType.GEODESIC;\n }, 0);\n this._elms.alt && this._elms.alt.forEach(function (item) {\n item.innerHTML = _this5.options.height;\n });\n }\n }, {\n key: \"lineColor\",\n get: function get() {\n return this.options.line.color;\n },\n set: function set(v) {\n var _this6 = this;\n this.options.line.color = v || 'rgba(255, 0, 0, 0.5)';\n if (!this.sdk || !this.sdk.viewer || !this.entity || !this.entity.polyline) {\n return;\n }\n this.entity.polyline.material = Cesium.Color.fromCssColorString(this.options.line.color);\n if (this._elms.lineColor) {\n this._elms.lineColor.forEach(function (item, i) {\n var lineColorPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: _this6.options.line.color,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(c) {\n _this6.lineColor = c;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this6.lineColor = 'rgba(255,0,0,0.5)';\n } //点击清空按钮事件回调\n });\n _this6._elms.lineColor[i] = lineColorPicker;\n });\n }\n }\n }, {\n key: \"lineWidth\",\n get: function get() {\n return this.options.line.width;\n },\n set: function set(v) {\n var _this7 = this;\n this.options.line.width = v || v === 0 ? v : 3;\n this.entity.polyline.width = this.options.line.width;\n this._elms.lineWidth && this._elms.lineWidth.forEach(function (item) {\n item.value = _this7.options.line.width;\n });\n }\n }, {\n key: \"area\",\n get: function get() {\n return this.options.area;\n },\n set: function set(v) {\n this.options.area = v;\n this._elms.area && this._elms.area.forEach(function (item) {\n item.value = v;\n });\n }\n }, {\n key: \"areaUnit\",\n get: function get() {\n return this.options['area-unit'];\n },\n set: function set(v) {\n this.options['area-unit'] = v;\n this._elms.areaUnit && this._elms.areaUnit.forEach(function (item) {\n item.value = v;\n });\n if (this.options.areaByMeter) {\n switch (v) {\n case '平方米':\n this.area = this.options.areaByMeter;\n break;\n case '平方千米':\n this.area = Number((this.options.areaByMeter / 1000000).toFixed(8));\n break;\n case '亩':\n this.area = Number((this.options.areaByMeter / 666.6666667).toFixed(4));\n break;\n case '公顷':\n this.area = Number((this.options.areaByMeter / 10000).toFixed(6));\n break;\n default:\n this.area = this.options.areaByMeter;\n }\n }\n }\n }, {\n key: \"labelShow\",\n get: function get() {\n return this.options.label.show;\n },\n set: function set(v) {\n this.options.label.show = v;\n if (this.show && !this.showView || this.showView == 3) {\n this.label.show = v;\n } else {\n this.label.show = false;\n }\n this._elms.labelShow && this._elms.labelShow.forEach(function (item) {\n item.checked = v;\n });\n }\n }, {\n key: \"labelFontFamily\",\n get: function get() {\n return this.options.label.fontFamily;\n },\n set: function set(v) {\n this.options.label.fontFamily = v || 0;\n this.label && (this.label.fontFamily = this.options.label.fontFamily);\n var name = Object(_Element_fontSelect__WEBPACK_IMPORTED_MODULE_19__[\"getFontFamilyName\"])(this.labelFontFamily) || '';\n this._elms.labelFontFamily && this._elms.labelFontFamily.forEach(function (item) {\n item.value = name;\n });\n }\n }, {\n key: \"labelColor\",\n get: function get() {\n return this.options.label.color;\n },\n set: function set(v) {\n var _this8 = this;\n this.options.label.color = v;\n this.label.color = v;\n if (this._elms.labelColor) {\n this._elms.labelColor.forEach(function (item, i) {\n var labelColorPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: _this8.labelColor,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this8.labelColor = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this8.labelColor = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n _this8._elms.labelColor[i] = labelColorPicker;\n });\n }\n }\n }, {\n key: \"labelFontSize\",\n get: function get() {\n return this.options.label.fontSize;\n },\n set: function set(v) {\n this.options.label.fontSize = v;\n this.label.fontSize = v;\n this._elms.labelFontSize && this._elms.labelFontSize.forEach(function (item) {\n item.value = v;\n });\n }\n }, {\n key: \"labelScaleByDistance\",\n get: function get() {\n return this.options.label.scaleByDistance;\n },\n set: function set(v) {\n this.options.label.scaleByDistance = v;\n this.label.scaleByDistance = v;\n this._elms.labelScaleByDistance && this._elms.labelScaleByDistance.forEach(function (item) {\n item.checked = v;\n });\n }\n }, {\n key: \"labelNear\",\n get: function get() {\n return this.options.label.near;\n },\n set: function set(v) {\n var near = v;\n if (near > this.labelFar) {\n near = this.labelFar;\n }\n this.options.label.near = near;\n this.label.near = near;\n this._elms.labelNear && this._elms.labelNear.forEach(function (item) {\n item.value = near;\n });\n }\n }, {\n key: \"labelFar\",\n get: function get() {\n return this.options.label.far;\n },\n set: function set(v) {\n var far = v;\n if (far < this.labelNear) {\n far = this.labelNear;\n }\n this.options.label.far = far;\n this.label.far = far;\n this._elms.labelFar && this._elms.labelFar.forEach(function (item) {\n item.value = far;\n });\n }\n }, {\n key: \"labelLineWidth\",\n get: function get() {\n return this.options.label.lineWidth;\n },\n set: function set(v) {\n this.options.label.lineWidth = v;\n this.label.lineWidth = v;\n this._elms.labelLineWidth && this._elms.labelLineWidth.forEach(function (item) {\n item.value = v;\n });\n }\n }, {\n key: \"labelPixelOffset\",\n get: function get() {\n return this.options.label.pixelOffset;\n },\n set: function set(v) {\n this.options.label.pixelOffset = v;\n this.label.pixelOffset = v;\n this._elms.labelPixelOffset && this._elms.labelPixelOffset.forEach(function (item) {\n item.value = v;\n });\n }\n }, {\n key: \"labelLineColor\",\n get: function get() {\n return this.options.label.lineColor;\n },\n set: function set(v) {\n var _this9 = this;\n this.options.label.lineColor = v;\n this.label.lineColor = v;\n if (this._elms.labelLineColor) {\n this._elms.labelLineColor.forEach(function (item, i) {\n var lineColorPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: _this9.labelLineColor,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this9.labelLineColor = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this9.labelLineColor = 'rgba(0,255,255,0.5)';\n } //点击清空按钮事件回调\n });\n _this9._elms.labelLineColor[i] = lineColorPicker;\n });\n }\n }\n }, {\n key: \"labelBackgroundColorStart\",\n get: function get() {\n return this.options.label.backgroundColor[0];\n },\n set: function set(v) {\n var _this10 = this;\n this.options.label.backgroundColor[0] = v;\n this.label.backgroundColor = [v, this.label.backgroundColor[1]];\n if (this._elms.labelBackgroundColorStart) {\n this._elms.labelBackgroundColorStart.forEach(function (item, i) {\n var labelBackgroundColorStartPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: _this10.labelBackgroundColorStart,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this10.labelBackgroundColorStart = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this10.labelBackgroundColorStart = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n _this10._elms.labelBackgroundColorStart[i] = labelBackgroundColorStartPicker;\n });\n }\n }\n }, {\n key: \"labelBackgroundColorEnd\",\n get: function get() {\n return this.options.label.backgroundColor[1];\n },\n set: function set(v) {\n var _this11 = this;\n this.options.label.backgroundColor[1] = v;\n this.label.backgroundColor = [this.label.backgroundColor[0], v];\n if (this._elms.labelBackgroundColorEnd) {\n this._elms.labelBackgroundColorEnd.forEach(function (item, i) {\n var labelBackgroundColorEndPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: _this11.labelBackgroundColorEnd,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this11.labelBackgroundColorEnd = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this11.labelBackgroundColorEnd = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n _this11._elms.labelBackgroundColorEnd[i] = labelBackgroundColorEndPicker;\n });\n }\n }\n }, {\n key: \"attributeType\",\n get: function get() {\n return this.options.attributeType;\n },\n set: function set(v) {\n this.options.attributeType = v;\n this._elms.attributeType && this._elms.attributeType.forEach(function (item) {\n item.value = v;\n });\n var attributeContent = this._DialogObject._element.content.getElementsByClassName('attribute-content');\n for (var i = 0; i < attributeContent.length; i++) {\n if (attributeContent[i].className.indexOf('attribute-content-' + v) > -1) {\n attributeContent[i].style.display = 'block';\n } else {\n attributeContent[i].style.display = 'none';\n }\n }\n }\n }, {\n key: \"attributeLink\",\n get: function get() {\n return this.options.attribute.link.content;\n },\n set: function set(v) {\n var _this12 = this;\n this.options.attribute.link.content = v;\n if (!this._DialogObject || !this._DialogObject._element || !this._DialogObject._element.content || this._DialogObject._element.content.getElementsByClassName('attribute-content-link').length == 0) {\n return;\n }\n var table = this._DialogObject._element.content.getElementsByClassName('attribute-content-link')[1].getElementsByClassName('table')[0];\n var tableContent = table.getElementsByClassName('table-body')[0];\n tableContent.innerHTML = '';\n if (this.options.attribute.link.content.length > 0) {\n table.getElementsByClassName('table-empty')[0].style.display = 'none';\n } else {\n table.getElementsByClassName('table-empty')[0].style.display = 'flex';\n }\n for (var i = 0; i < this.options.attribute.link.content.length; i++) {\n var tr = \"\\n
\\n
\" + this.options.attribute.link.content[i].name + \"
\\n
\" + this.options.attribute.link.content[i].url + \"
\\n
\\n \\n \\n
\\n
\";\n var trElm = document.createRange().createContextualFragment(tr);\n tableContent.appendChild(trElm);\n }\n var item = tableContent.getElementsByClassName('tr');\n var fun = {\n linkEdit: function () {\n var _linkEdit = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee(index) {\n var table, tableContent, item, _loop, _i;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee$(_context3) {\n while (1) switch (_context3.prev = _context3.next) {\n case 0:\n _context3.next = 2;\n return _this12.options.attribute.link.content;\n case 2:\n _this12.attributeLink = _context3.sent;\n table = _this12._DialogObject._element.content.getElementsByClassName('attribute-content-link')[1].getElementsByClassName('table')[0];\n tableContent = table.getElementsByClassName('table-body')[0];\n item = tableContent.getElementsByClassName('tr');\n _loop = /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _loop(_i) {\n var height, _html, textareaElm, td, btn, n, _iterator, _step, _loop2;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _loop$(_context2) {\n while (1) switch (_context2.prev = _context2.next) {\n case 0:\n if (!(index === _i)) {\n _context2.next = 36;\n break;\n }\n height = item[_i].offsetHeight;\n _html = \"\\n
\\n \\n
\\n
\\n \\n
\\n
\\n \\n \\n
\";\n item[_i].innerHTML = _html;\n textareaElm = item[_i].getElementsByClassName('link-edit')[0];\n textareaElm.style.height = height - 10 + 'px';\n td = item[_i].getElementsByClassName('td');\n td[0].getElementsByClassName('input')[0].value = _this12.options.attribute.link.content[index].name;\n td[1].getElementsByClassName('input')[0].value = _this12.options.attribute.link.content[index].url;\n btn = item[_i].getElementsByTagName('button');\n n = 0;\n case 11:\n if (!(n < btn.length)) {\n _context2.next = 35;\n break;\n }\n if (!(!btn[n] || !btn[n].attributes)) {\n _context2.next = 14;\n break;\n }\n return _context2.abrupt(\"continue\", 32);\n case 14:\n _iterator = _createForOfIteratorHelper(btn[n].attributes);\n _context2.prev = 15;\n _loop2 = /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _loop2() {\n var m;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _loop2$(_context) {\n while (1) switch (_context.prev = _context.next) {\n case 0:\n m = _step.value;\n if (!(m.name === '@click')) {\n _context.next = 5;\n break;\n }\n btn[n].addEventListener('click', function (e) {\n if (typeof fun[m.value] === 'function') {\n fun[m.value]({\n name: td[0].getElementsByClassName('input')[0].value,\n url: td[1].getElementsByClassName('input')[0].value\n }, _i);\n }\n });\n btn[n].attributes.removeNamedItem(m.name);\n return _context.abrupt(\"return\", 1);\n case 5:\n case \"end\":\n return _context.stop();\n }\n }, _loop2);\n });\n _iterator.s();\n case 18:\n if ((_step = _iterator.n()).done) {\n _context2.next = 24;\n break;\n }\n return _context2.delegateYield(_loop2(), \"t0\", 20);\n case 20:\n if (!_context2.t0) {\n _context2.next = 22;\n break;\n }\n return _context2.abrupt(\"break\", 24);\n case 22:\n _context2.next = 18;\n break;\n case 24:\n _context2.next = 29;\n break;\n case 26:\n _context2.prev = 26;\n _context2.t1 = _context2[\"catch\"](15);\n _iterator.e(_context2.t1);\n case 29:\n _context2.prev = 29;\n _iterator.f();\n return _context2.finish(29);\n case 32:\n n++;\n _context2.next = 11;\n break;\n case 35:\n return _context2.abrupt(\"return\", 1);\n case 36:\n case \"end\":\n return _context2.stop();\n }\n }, _loop, null, [[15, 26, 29, 32]]);\n });\n _i = 0;\n case 8:\n if (!(_i < item.length)) {\n _context3.next = 15;\n break;\n }\n return _context3.delegateYield(_loop(_i), \"t0\", 10);\n case 10:\n if (!_context3.t0) {\n _context3.next = 12;\n break;\n }\n return _context3.abrupt(\"break\", 15);\n case 12:\n _i++;\n _context3.next = 8;\n break;\n case 15:\n case \"end\":\n return _context3.stop();\n }\n }, _callee);\n }));\n function linkEdit(_x) {\n return _linkEdit.apply(this, arguments);\n }\n return linkEdit;\n }(),\n linkDelete: function linkDelete(i) {\n _this12.options.attribute.link.content.splice(i, 1);\n _this12.attributeLink = _this12.options.attribute.link.content;\n },\n confirmEdit: function confirmEdit(value, i) {\n var name = value.name && value.name.replace(/\\s/g, \"\");\n var url = value.url && value.url.replace(/\\s/g, \"\");\n if (name && url) {\n _this12.options.attribute.link.content[i] = value;\n } else {\n window.ELEMENT && window.ELEMENT.Message({\n message: '名称或链接不能为空!',\n type: 'warning',\n duration: 1500\n });\n }\n _this12.attributeLink = _this12.options.attribute.link.content;\n },\n cancelEdit: function cancelEdit() {\n _this12.attributeLink = _this12.options.attribute.link.content;\n },\n fileSelect: function fileSelect(value, i) {\n var fileElm = item[i].getElementsByClassName('file-select')[0];\n fileElm.click();\n fileElm.removeEventListener('change', _fileSelect);\n fileElm.addEventListener('change', _fileSelect);\n }\n };\n var _fileSelect = function _fileSelect(event) {\n if (event.target.value) {\n var td = item[event.target.getAttribute('index')].getElementsByClassName('td');\n td[1].getElementsByClassName('input')[0].value = event.target.value;\n event.target.value = null;\n }\n };\n var _loop3 = function _loop3(_i2) {\n var btn = item[_i2].getElementsByTagName('button');\n for (var n = 0; n < btn.length; n++) {\n if (!btn[n] || !btn[n].attributes) {\n continue;\n }\n var _iterator2 = _createForOfIteratorHelper(btn[n].attributes),\n _step2;\n try {\n var _loop4 = function _loop4() {\n var m = _step2.value;\n if (m.name === '@click') {\n btn[n].addEventListener('click', function (e) {\n if (typeof fun[m.value] === 'function') {\n fun[m.value](_i2);\n }\n });\n btn[n].attributes.removeNamedItem(m.name);\n return 1; // break\n }\n };\n for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {\n if (_loop4()) break;\n }\n } catch (err) {\n _iterator2.e(err);\n } finally {\n _iterator2.f();\n }\n }\n };\n for (var _i2 = 0; _i2 < item.length; _i2++) {\n _loop3(_i2);\n }\n }\n }, {\n key: \"attributeCamera\",\n get: function get() {\n return this.options.attribute.camera.content;\n },\n set: function set(v) {\n this.options.attribute.camera.content = v;\n }\n }, {\n key: \"attributeVr\",\n get: function get() {\n return this.options.attribute.vr.content;\n },\n set: function set(v) {\n var _this13 = this;\n this.options.attribute.vr.content = v;\n if (!this._DialogObject || !this._DialogObject._element || !this._DialogObject._element.content || this._DialogObject._element.content.getElementsByClassName('attribute-content-vr').length == 0) {\n return;\n }\n var table = this._DialogObject._element.content.getElementsByClassName('attribute-content-vr')[1].getElementsByClassName('table')[0];\n var tableContent = table.getElementsByClassName('table-body')[0];\n tableContent.innerHTML = '';\n if (this.options.attribute.vr.content.length > 0) {\n table.getElementsByClassName('table-empty')[0].style.display = 'none';\n } else {\n table.getElementsByClassName('table-empty')[0].style.display = 'flex';\n }\n for (var i = 0; i < this.options.attribute.vr.content.length; i++) {\n var tr = \"\\n
\\n
\" + this.options.attribute.vr.content[i].name + \"
\\n
\" + this.options.attribute.vr.content[i].url + \"
\\n
\\n \\n \\n
\\n
\";\n var trElm = document.createRange().createContextualFragment(tr);\n tableContent.appendChild(trElm);\n }\n var item = tableContent.getElementsByClassName('tr');\n var fun = {\n vrEdit: function () {\n var _vrEdit = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee2(index) {\n var table, tableContent, item, _loop5, _i3;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee2$(_context6) {\n while (1) switch (_context6.prev = _context6.next) {\n case 0:\n _context6.next = 2;\n return _this13.options.attribute.vr.content;\n case 2:\n _this13.attributeVr = _context6.sent;\n table = _this13._DialogObject._element.content.getElementsByClassName('attribute-content-vr')[1].getElementsByClassName('table')[0];\n tableContent = table.getElementsByClassName('table-body')[0];\n item = tableContent.getElementsByClassName('tr');\n _loop5 = /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _loop5(_i3) {\n var height, _html2, textareaElm, td, btn, n, _iterator3, _step3, _loop6;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _loop5$(_context5) {\n while (1) switch (_context5.prev = _context5.next) {\n case 0:\n if (!(index === _i3)) {\n _context5.next = 36;\n break;\n }\n height = item[_i3].offsetHeight;\n _html2 = \"\\n
\\n \\n
\\n
\\n \\n
\\n
\\n \\n \\n
\";\n item[_i3].innerHTML = _html2;\n textareaElm = item[_i3].getElementsByClassName('link-edit')[0];\n textareaElm.style.height = height - 10 + 'px';\n td = item[_i3].getElementsByClassName('td');\n td[0].getElementsByClassName('input')[0].value = _this13.options.attribute.vr.content[index].name;\n td[1].getElementsByClassName('input')[0].value = _this13.options.attribute.vr.content[index].url;\n btn = item[_i3].getElementsByTagName('button');\n n = 0;\n case 11:\n if (!(n < btn.length)) {\n _context5.next = 35;\n break;\n }\n if (!(!btn[n] || !btn[n].attributes)) {\n _context5.next = 14;\n break;\n }\n return _context5.abrupt(\"continue\", 32);\n case 14:\n _iterator3 = _createForOfIteratorHelper(btn[n].attributes);\n _context5.prev = 15;\n _loop6 = /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _loop6() {\n var m;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _loop6$(_context4) {\n while (1) switch (_context4.prev = _context4.next) {\n case 0:\n m = _step3.value;\n if (!(m.name === '@click')) {\n _context4.next = 5;\n break;\n }\n btn[n].addEventListener('click', function (e) {\n if (typeof fun[m.value] === 'function') {\n fun[m.value]({\n name: td[0].getElementsByClassName('input')[0].value,\n url: td[1].getElementsByClassName('input')[0].value\n }, _i3);\n }\n });\n btn[n].attributes.removeNamedItem(m.name);\n return _context4.abrupt(\"return\", 1);\n case 5:\n case \"end\":\n return _context4.stop();\n }\n }, _loop6);\n });\n _iterator3.s();\n case 18:\n if ((_step3 = _iterator3.n()).done) {\n _context5.next = 24;\n break;\n }\n return _context5.delegateYield(_loop6(), \"t0\", 20);\n case 20:\n if (!_context5.t0) {\n _context5.next = 22;\n break;\n }\n return _context5.abrupt(\"break\", 24);\n case 22:\n _context5.next = 18;\n break;\n case 24:\n _context5.next = 29;\n break;\n case 26:\n _context5.prev = 26;\n _context5.t1 = _context5[\"catch\"](15);\n _iterator3.e(_context5.t1);\n case 29:\n _context5.prev = 29;\n _iterator3.f();\n return _context5.finish(29);\n case 32:\n n++;\n _context5.next = 11;\n break;\n case 35:\n return _context5.abrupt(\"return\", 1);\n case 36:\n case \"end\":\n return _context5.stop();\n }\n }, _loop5, null, [[15, 26, 29, 32]]);\n });\n _i3 = 0;\n case 8:\n if (!(_i3 < item.length)) {\n _context6.next = 15;\n break;\n }\n return _context6.delegateYield(_loop5(_i3), \"t0\", 10);\n case 10:\n if (!_context6.t0) {\n _context6.next = 12;\n break;\n }\n return _context6.abrupt(\"break\", 15);\n case 12:\n _i3++;\n _context6.next = 8;\n break;\n case 15:\n case \"end\":\n return _context6.stop();\n }\n }, _callee2);\n }));\n function vrEdit(_x2) {\n return _vrEdit.apply(this, arguments);\n }\n return vrEdit;\n }(),\n vrDelete: function vrDelete(i) {\n _this13.options.attribute.vr.content.splice(i, 1);\n _this13.attributeVr = _this13.options.attribute.vr.content;\n },\n confirmEdit: function confirmEdit(value, i) {\n var name = value.name && value.name.replace(/\\s/g, \"\");\n var url = value.url && value.url.replace(/\\s/g, \"\");\n if (name && url) {\n _this13.options.attribute.vr.content[i] = value;\n } else {\n window.ELEMENT && window.ELEMENT.Message({\n message: '名称或链接不能为空!',\n type: 'warning',\n duration: 1500\n });\n }\n _this13.attributeVr = _this13.options.attribute.vr.content;\n },\n cancelEdit: function cancelEdit() {\n _this13.attributeVr = _this13.options.attribute.vr.content;\n },\n fileSelect: function fileSelect(value, i) {\n var fileElm = item[i].getElementsByClassName('file-select')[0];\n fileElm.click();\n fileElm.removeEventListener('change', _fileSelect2);\n fileElm.addEventListener('change', _fileSelect2);\n }\n };\n var _fileSelect2 = function _fileSelect2(event) {\n if (event.target.value) {\n var td = item[event.target.getAttribute('index')].getElementsByClassName('td');\n td[1].getElementsByClassName('input')[0].value = event.target.value;\n event.target.value = null;\n }\n };\n var _loop7 = function _loop7(_i4) {\n var btn = item[_i4].getElementsByTagName('button');\n for (var n = 0; n < btn.length; n++) {\n if (!btn[n] || !btn[n].attributes) {\n continue;\n }\n var _iterator4 = _createForOfIteratorHelper(btn[n].attributes),\n _step4;\n try {\n var _loop8 = function _loop8() {\n var m = _step4.value;\n if (m.name === '@click') {\n btn[n].addEventListener('click', function (e) {\n if (typeof fun[m.value] === 'function') {\n fun[m.value](_i4);\n }\n });\n btn[n].attributes.removeNamedItem(m.name);\n return 1; // break\n }\n };\n for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {\n if (_loop8()) break;\n }\n } catch (err) {\n _iterator4.e(err);\n } finally {\n _iterator4.f();\n }\n }\n };\n for (var _i4 = 0; _i4 < item.length; _i4++) {\n _loop7(_i4);\n }\n }\n }, {\n key: \"attributeGoods\",\n get: function get() {\n return this.options.attribute.goods.content;\n },\n set: function set(v) {\n this.options.attribute.goods.content = v;\n }\n }, {\n key: \"edit\",\n value: // 编辑框\n function () {\n var _edit = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee3(state) {\n var _this14 = this;\n var _this, createSpatialInfoTableContent, contentElm, tabsElm, colorPicker, linecolorPicker, labelColorPicker, lineColorPicker, labelBackgroundColorStartPicker, labelBackgroundColorEndPicker, all_elm, heightBoxElm, heightElm, heightConfirmElm, heightModeData, heightModeObject, heightModeDataLegpElm, i;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee3$(_context7) {\n while (1) switch (_context7.prev = _context7.next) {\n case 0:\n if (!this._error) {\n _context7.next = 2;\n break;\n }\n return _context7.abrupt(\"return\");\n case 2:\n _this = this;\n this.originalOptions = this.deepCopyObj(this.options);\n if (this._DialogObject && this._DialogObject.close) {\n this._DialogObject.close();\n this._DialogObject = null;\n }\n if (!state) {\n _context7.next = 61;\n break;\n }\n createSpatialInfoTableContent = function createSpatialInfoTableContent() {\n var tableElm = contentElm.getElementsByClassName('spatial-info-table')[0];\n var tBodyElm = tableElm.getElementsByClassName('table-body')[0];\n tBodyElm.innerHTML = '';\n _this._elms.lng = [];\n _this._elms.lngInput = [];\n _this._elms.lat = [];\n _this._elms.latInput = [];\n _this._elms.alt = [];\n _this._elms.altInput = [];\n var _loop9 = function _loop9(i) {\n var tr = document.createElement('div');\n tr.className = 'tr';\n tr.innerHTML = \"\\n
\".concat(i + 1, \"
\\n
\\n
\\n
\\n \");\n var lngBox = tr.getElementsByClassName('lng')[0];\n var lng = document.createElement('span');\n lng.innerHTML = _this.options.positions[i].lng.toFixed(8);\n lngBox.appendChild(lng);\n var lngInput = document.createElement('input');\n lngInput.className = 'input';\n lngInput.type = 'number';\n lngInput.title = '';\n lngInput.min = -180;\n lngInput.max = 180;\n lngInput.value = _this.options.positions[i].lng.toFixed(8);\n var latBox = tr.getElementsByClassName('lat')[0];\n var lat = document.createElement('span');\n lat.innerHTML = _this.options.positions[i].lat.toFixed(8);\n latBox.appendChild(lat);\n var latInput = document.createElement('input');\n latInput.className = 'input';\n latInput.type = 'number';\n latInput.title = '';\n latInput.min = -90;\n latInput.max = 90;\n latInput.value = _this.options.positions[i].lat.toFixed(8);\n var altBox = tr.getElementsByClassName('alt')[0];\n var alt = document.createElement('span');\n alt.innerHTML = _this.height.toFixed(2);\n altBox.appendChild(alt);\n var altInput = document.createElement('input');\n altInput.className = 'input';\n altInput.type = 'number';\n altInput.title = '';\n altInput.min = -9999999;\n altInput.max = 999999999;\n altInput.value = _this.height.toFixed(2);\n lngBox.addEventListener('dblclick', function () {\n lngBox.innerHTML = '';\n lngInput.value = Number(_this.options.positions[i].lng.toFixed(8));\n lngBox.appendChild(lngInput);\n lngInput.focus();\n if (_this.operate.positionEditing) {\n _this.positionEditing = false;\n }\n PincerArrowObject.closeNodeEdit(_this);\n _this.heightMode = _this.heightMode;\n });\n lngInput.addEventListener('blur', function () {\n lngInput.value = Number(_this.options.positions[i].lng.toFixed(8));\n lngBox.innerHTML = '';\n lngBox.appendChild(lng);\n });\n lngInput.addEventListener('input', function () {\n _this.options.positions[i].lng = Number(Number(lngInput.value).toFixed(8));\n lng.innerHTML = _this.options.positions[i].lng.toFixed(8);\n _this.height = _this.height;\n });\n latBox.addEventListener('dblclick', function () {\n latBox.innerHTML = '';\n latInput.value = Number(_this.options.positions[i].lat.toFixed(8));\n latBox.appendChild(latInput);\n latInput.focus();\n if (_this.operate.positionEditing) {\n _this.positionEditing = false;\n }\n PincerArrowObject.closeNodeEdit(_this);\n _this.heightMode = _this.heightMode;\n });\n latInput.addEventListener('blur', function () {\n latInput.value = Number(_this.options.positions[i].lat.toFixed(8));\n latBox.innerHTML = '';\n latBox.appendChild(lat);\n });\n latInput.addEventListener('input', function () {\n _this.options.positions[i].lat = Number(Number(latInput.value).toFixed(8));\n lat.innerHTML = _this.options.positions[i].lat.toFixed(8);\n _this.height = _this.height;\n });\n altBox.addEventListener('dblclick', function () {\n if (_this.heightMode == 2) {\n return;\n }\n altBox.innerHTML = '';\n altInput.value = Number(_this.height.toFixed(2));\n altBox.appendChild(altInput);\n altInput.focus();\n if (_this.operate.positionEditing) {\n _this.positionEditing = false;\n }\n PincerArrowObject.closeNodeEdit(_this);\n _this.heightMode = _this.heightMode;\n });\n altInput.addEventListener('blur', function () {\n altInput.value = Number(_this.height.toFixed(2));\n altBox.innerHTML = '';\n altBox.appendChild(alt);\n });\n altInput.addEventListener('input', function () {\n _this.height = Number(Number(altInput.value).toFixed(2));\n alt.innerHTML = Number(_this.height.toFixed(2));\n });\n _this._elms.lng.push(lng);\n _this._elms.lngInput.push(lngInput);\n _this._elms.lat.push(lat);\n _this._elms.latInput.push(latInput);\n _this._elms.alt.push(alt);\n _this._elms.altInput.push(altInput);\n tBodyElm.appendChild(tr);\n };\n for (var i = 0; i < _this.options.positions.length; i++) {\n _loop9(i);\n }\n };\n _context7.next = 9;\n return new _Element_Dialog__WEBPACK_IMPORTED_MODULE_9__[\"default\"](this.sdk, this.options, {\n title: '双箭头属性',\n left: '180px',\n top: '100px',\n confirmCallBack: function confirmCallBack(options) {\n _this14.name = _this14.name.trim();\n if (!_this14.name) {\n _this14.name = '未命名对象';\n }\n _this14.options.label.position = {\n lng: _this14.label.position[0],\n lat: _this14.label.position[1],\n alt: _this14.label.position[2]\n };\n _this14.originalOptions = _this14.deepCopyObj(_this14.options);\n _this14._DialogObject.close();\n _this14.Dialog.confirmCallBack && _this14.Dialog.confirmCallBack(_this14.originalOptions);\n },\n resetCallBack: function resetCallBack() {\n _this14.reset();\n _this14.Dialog.resetCallBack && _this14.Dialog.resetCallBack();\n },\n removeCallBack: function removeCallBack() {\n _this14.Dialog.removeCallBack && _this14.Dialog.removeCallBack();\n },\n closeCallBack: function closeCallBack() {\n var spreadState = _this14.options.spreadState;\n _this14.positionEditing = false;\n setTimeout(function () {\n _this14.options.spreadState = spreadState;\n _this14.reset();\n }, 10);\n _this14.Dialog.closeCallBack && _this14.Dialog.closeCallBack();\n },\n showCallBack: function showCallBack(show) {\n _this14.options.show = show;\n _this14.originalOptions.show = show;\n _this14.show = show;\n _this14.Dialog.showCallBack && _this14.Dialog.showCallBack();\n },\n translationalCallBack: function translationalCallBack() {\n _this14.positionEditing = !_this14.positionEditing;\n },\n // 二次编辑回调\n secondaryEditCallBack: function secondaryEditCallBack() {\n PincerArrowObject.nodeEdit(_this14, function () {\n createSpatialInfoTableContent();\n });\n }\n });\n case 9:\n this._DialogObject = _context7.sent;\n this._DialogObject._element.body.className = this._DialogObject._element.body.className + ' pincerArrow';\n contentElm = document.createElement('div');\n contentElm.innerHTML = Object(_element__WEBPACK_IMPORTED_MODULE_12__[\"html\"])(this);\n this._DialogObject.contentAppChild(contentElm);\n this.attributeType = this.options.attributeType;\n this.attributeCamera = this.options.attribute.camera.content;\n\n // 创建标签页\n tabsElm = new _Element_cy_html_tabs__WEBPACK_IMPORTED_MODULE_10__[\"default\"]('pincer-arrow-object-edit-tabs', undefined, this.sdk); // 颜色组件\n colorPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName(\"color\")[0],\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: this.color,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this14.color = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this14.color = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n linecolorPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName(\"lineColor\")[0],\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: this.lineColor,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this14.lineColor = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this14.lineColor = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n labelColorPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName(\"labelColor\")[0],\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: this.labelColor,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this14.labelColor = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this14.labelColor = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n lineColorPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName(\"labelLineColor\")[0],\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: this.labelLineColor,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this14.labelLineColor = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this14.labelLineColor = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n labelBackgroundColorStartPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName(\"labelBackgroundColorStart\")[0],\n size: 'mini',\n alpha: true,\n defaultColor: this.labelBackgroundColorStart,\n disabled: false,\n openPickerAni: 'opacity',\n sure: function sure(color) {\n _this14.labelBackgroundColorStart = color;\n },\n clear: function clear() {\n _this14.labelBackgroundColorStart = 'rgba(255,255,255,1)';\n }\n });\n labelBackgroundColorEndPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName(\"labelBackgroundColorEnd\")[0],\n size: 'mini',\n alpha: true,\n defaultColor: this.labelBackgroundColorEnd,\n disabled: false,\n openPickerAni: 'opacity',\n sure: function sure(color) {\n _this14.labelBackgroundColorEnd = color;\n },\n clear: function clear() {\n _this14.labelBackgroundColorEnd = 'rgba(255,255,255,1)';\n }\n });\n all_elm = contentElm.getElementsByTagName(\"*\");\n PincerArrowObject.EventBinding(this, all_elm);\n this._elms.color = [colorPicker];\n this._elms.lineColor = [linecolorPicker];\n this._elms.labelColor = [labelColorPicker];\n this._elms.labelLineColor = [lineColorPicker];\n this._elms.labelBackgroundColorStart = [labelBackgroundColorStartPicker];\n this._elms.labelBackgroundColorEnd = [labelBackgroundColorEndPicker];\n heightBoxElm = this._DialogObject._element.content.getElementsByClassName('height-box')[0];\n heightElm = heightBoxElm.getElementsByClassName('height')[0];\n heightConfirmElm = this._DialogObject._element.content.getElementsByClassName('height-confirm')[0];\n heightElm.value = 10;\n if (this.heightMode == 2) {\n heightBoxElm && (heightBoxElm.className = 'input-number input-number-unit-1 height-box disabled');\n heightConfirmElm && heightConfirmElm.setAttribute('disabled', 'disabled');\n } else {\n heightBoxElm && (heightBoxElm.className = 'input-number input-number-unit-1 height-box');\n heightConfirmElm && heightConfirmElm.removeAttribute('disabled');\n }\n heightModeData = [{\n name: '海拔高度',\n value: '海拔高度',\n key: '0'\n }, {\n name: '相对地表',\n value: '相对地表',\n key: '1'\n }, {\n name: '依附模型',\n value: '依附模型',\n key: '2'\n }];\n heightModeObject = Object(_Element_datalist__WEBPACK_IMPORTED_MODULE_18__[\"legp\"])(this._DialogObject._element.content.getElementsByClassName('height-mode-box')[0], '.height-mode');\n if (!heightModeObject) {\n _context7.next = 58;\n break;\n }\n heightModeObject.legp_search(heightModeData);\n heightModeDataLegpElm = this._DialogObject._element.content.getElementsByClassName('height-mode')[0].getElementsByTagName('input')[0];\n i = 0;\n case 42:\n if (!(i < heightModeData.length)) {\n _context7.next = 50;\n break;\n }\n if (!(heightModeData[i].key == this.heightMode)) {\n _context7.next = 47;\n break;\n }\n heightModeDataLegpElm.value = heightModeData[i].value;\n heightModeObject.legp_searchActive(heightModeData[i].value);\n return _context7.abrupt(\"break\", 50);\n case 47:\n i++;\n _context7.next = 42;\n break;\n case 50:\n heightModeDataLegpElm.addEventListener('input', function () {\n for (var _i5 = 0; _i5 < heightModeData.length; _i5++) {\n if (heightModeData[_i5].value === heightModeDataLegpElm.value) {\n _this14.heightMode = heightModeData[_i5].key;\n break;\n }\n }\n });\n heightElm.addEventListener('input', function () {\n switch (_this14.heightMode) {\n case 0:\n case '0':\n break;\n case 1:\n case '1':\n break;\n case 2:\n case '2':\n break;\n }\n });\n this._elms.height = heightElm;\n this._elms.heightBox = heightBoxElm;\n this._elms.heightMode = heightModeDataLegpElm;\n this._elms.heightConfirm = heightConfirmElm;\n this._elms.heightModeObject = heightModeObject;\n heightConfirmElm.addEventListener('click', function () {\n if (_this14.operate.positionEditing) {\n _this14.positionEditing = false;\n _this14.height = _this14.height + Number(heightElm.value);\n } else {\n PincerArrowObject.closeNodeEdit(_this14);\n _this14.heightMode = _this14.heightMode;\n setTimeout(function () {\n _this14.height = _this14.height + Number(heightElm.value);\n }, 100);\n }\n });\n case 58:\n setTimeout(function () {\n _this14.attributeLink = _this14.options.attribute.link.content;\n _this14.attributeVr = _this14.options.attribute.vr.content;\n _this14.cameraSelect && _this14.cameraSelect();\n _this14.goodsSelect && _this14.goodsSelect();\n var tagData = _this14.attributeSelect;\n var attributeElm = _this14._DialogObject._element.content.getElementsByClassName('attribute-select-box')[0];\n if (attributeElm) {\n var legpObject = Object(_Element_datalist__WEBPACK_IMPORTED_MODULE_18__[\"legp\"])(attributeElm, \".attribute-select\");\n legpObject.legp_search(tagData);\n var attributeSelectElm = _this14._DialogObject._element.content.getElementsByClassName('attribute-select')[0].getElementsByTagName('input')[0];\n for (var _i6 = 0; _i6 < tagData.length; _i6++) {\n if (tagData[_i6].key === _this14.options.attributeType) {\n attributeSelectElm.value = tagData[_i6].value;\n legpObject.legp_searchActive(tagData[_i6].value);\n break;\n }\n }\n attributeSelectElm.addEventListener('input', function () {\n for (var _i7 = 0; _i7 < tagData.length; _i7++) {\n if (tagData[_i7].value === attributeSelectElm.value) {\n _this14.attributeType = tagData[_i7].key;\n break;\n }\n }\n });\n }\n var unitData = [{\n name: '平方米',\n value: '平方米'\n }, {\n name: '平方千米',\n value: '平方千米'\n }, {\n name: '亩',\n value: '亩'\n }, {\n name: '公顷',\n value: '公顷'\n }];\n var unitDataLegpObject = Object(_Element_datalist__WEBPACK_IMPORTED_MODULE_18__[\"legp\"])(_this14._DialogObject._element.content.getElementsByClassName('input-select-unit-box')[0], \".input-select-unit\");\n if (unitDataLegpObject) {\n unitDataLegpObject.legp_search(unitData);\n var unitDataLegpElm = _this14._DialogObject._element.content.getElementsByClassName('input-select-unit')[0].getElementsByTagName('input')[0];\n unitDataLegpElm.value = _this14.options['area-unit'];\n for (var _i8 = 0; _i8 < unitData.length; _i8++) {\n if (unitData[_i8].value === unitDataLegpElm.value) {\n unitDataLegpObject.legp_searchActive(unitData[_i8].value);\n break;\n }\n }\n unitDataLegpElm.addEventListener('input', function () {\n for (var _i9 = 0; _i9 < unitData.length; _i9++) {\n if (unitData[_i9].value === unitDataLegpElm.value) {\n _this14.areaUnit = unitData[_i9].value;\n break;\n }\n }\n });\n }\n var fontData = Object(_Element_fontSelect__WEBPACK_IMPORTED_MODULE_19__[\"getFontList\"])();\n var fontObject = Object(_Element_datalist__WEBPACK_IMPORTED_MODULE_18__[\"legp\"])(_this14._DialogObject._element.content.getElementsByClassName('font-select-box')[0], '.font-select');\n if (fontObject) {\n fontObject.legp_search(fontData);\n var fontDataLegpElm = _this14._DialogObject._element.content.getElementsByClassName('font-select')[0].getElementsByTagName('input')[0];\n fontDataLegpElm.value = fontData[_this14.labelFontFamily].value;\n for (var _i10 = 0; _i10 < fontData.length; _i10++) {\n if (fontData[_i10].value == fontDataLegpElm.value) {\n fontObject.legp_searchActive(fontData[_i10].value);\n break;\n }\n }\n fontDataLegpElm.addEventListener('input', function () {\n for (var _i11 = 0; _i11 < fontData.length; _i11++) {\n if (fontData[_i11].value === fontDataLegpElm.value) {\n _this14.labelFontFamily = fontData[_i11].key;\n break;\n }\n }\n });\n _this14._elms.labelFontFamily = [fontDataLegpElm];\n }\n createSpatialInfoTableContent();\n }, 0);\n _context7.next = 62;\n break;\n case 61:\n if (this._DialogObject && this._DialogObject.remove) {\n this._DialogObject.remove();\n this._DialogObject = null;\n }\n case 62:\n case \"end\":\n return _context7.stop();\n }\n }, _callee3, this);\n }));\n function edit(_x3) {\n return _edit.apply(this, arguments);\n }\n return edit;\n }()\n }, {\n key: \"reset\",\n value: function reset() {\n var _this15 = this;\n if (!this.entity) {\n return;\n }\n this.options = this.deepCopyObj(this.originalOptions);\n this.name = this.originalOptions.name;\n this.color = this.originalOptions.color;\n this.lineColor = this.originalOptions.line.color;\n this.lineWidth = this.originalOptions.line.width;\n this.area = this.originalOptions.area;\n this.areaUnit = this.originalOptions['area-unit'];\n this.labelShow = this.originalOptions.label.show;\n this.labelColor = this.originalOptions.label.color;\n this.labelFontSize = this.originalOptions.label.fontSize;\n this.labelFontFamily = this.originalOptions.label.fontFamily;\n this.labelScaleByDistance = this.originalOptions.label.scaleByDistance;\n this.labelNear = this.originalOptions.label.near;\n this.labelFar = this.originalOptions.label.far;\n this.labelLineWidth = this.originalOptions.label.lineWidth;\n this.labelPixelOffset = this.originalOptions.label.pixelOffset;\n this.labelLineColor = this.originalOptions.label.lineColor;\n this.labelBackgroundColorStart = this.originalOptions.label.backgroundColor[0];\n this.labelBackgroundColorEnd = this.originalOptions.label.backgroundColor[1];\n this.attributeLink = this.options.attribute.link.content;\n this.attributeVr = this.options.attribute.vr.content;\n this.attributeCamera = this.options.attribute.camera.content;\n this.attributeGoods = this.options.attribute.goods.content;\n this.cameraSelect && this.cameraSelect();\n this.goodsSelect && this.goodsSelect();\n for (var i = 0; i < this.options.positions.length; i++) {\n if (this._elms.lng && this._elms.lng[i]) {\n this._elms.lng[i].innerHTML = this.options.positions[i].lng.toFixed(8);\n }\n if (this._elms.lat && this._elms.lat[i]) {\n this._elms.lat[i].innerHTML = this.options.positions[i].lat.toFixed(8);\n }\n if (this._elms.alt && this._elms.alt[i]) {\n this._elms.alt[i].innerHTML = Number(this.options.height.toFixed(2));\n }\n }\n this.heightMode = this.heightMode;\n for (var _i12 = 0; _i12 < this.nodePoints.length; _i12++) {\n this.sdk.viewer.entities.remove(this.nodePoints[_i12]);\n }\n this.nodePoints = [];\n YJ.Measure.SetMeasureStatus(false);\n this.event && this.event.destroy();\n this.tip && this.tip.destroy();\n var spreadState = this.options.spreadState;\n this.removeAnimate();\n setTimeout(function () {\n _this15.loop = _this15.options.loop;\n _this15.spreadState = spreadState;\n Object(_Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_17__[\"syncData\"])(_this15.sdk, _this15.options.id);\n Object(_Global_SplitScreen__WEBPACK_IMPORTED_MODULE_20__[\"syncSplitData\"])(_this15.sdk, _this15.options.id);\n }, 200);\n setTimeout(function () {\n _this15.previous = null;\n }, 50);\n }\n }, {\n key: \"remove\",\n value: function () {\n var _remove = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee4() {\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee4$(_context8) {\n while (1) switch (_context8.prev = _context8.next) {\n case 0:\n this.removeAnimate();\n this.event && this.event.destroy();\n this.tip && this.tip.destroy();\n this.label && this.label.remove();\n this.entity && this.sdk.viewer.entities.remove(this.entity);\n this.entity = null;\n if (this._DialogObject && !this._DialogObject.isDestroy) {\n this._DialogObject.close();\n this._DialogObject = null;\n }\n _context8.next = 9;\n return this.sdk.removeIncetance(this.options.id);\n case 9:\n _context8.next = 11;\n return Object(_Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_17__[\"syncData\"])(this.sdk, this.options.id);\n case 11:\n case \"end\":\n return _context8.stop();\n }\n }, _callee4, this);\n }));\n function remove() {\n return _remove.apply(this, arguments);\n }\n return remove;\n }()\n }, {\n key: \"_addLink\",\n value: function _addLink() {\n // document.getElementsByClassName\n if (this._DialogObject._element.content.getElementsByClassName('link_add')[0].value) {\n this.options.attribute.link.content.push({\n name: '链接',\n url: this._DialogObject._element.content.getElementsByClassName('link_add')[0].value\n });\n this._DialogObject._element.content.getElementsByClassName('link_add')[0].value = '';\n this.attributeLink = this.options.attribute.link.content;\n } else {\n this.Dialog.clickAddLink && this.Dialog.clickAddLink();\n }\n }\n }, {\n key: \"addAttributeLink\",\n value: function addAttributeLink(link) {\n this.options.attribute.link.content.push({\n name: '链接',\n url: link\n });\n this.attributeLink = this.options.attribute.link.content;\n }\n }, {\n key: \"_addRr\",\n value: function _addRr() {\n if (this._DialogObject._element.content.getElementsByClassName('vr_add')[0].value) {\n this.options.attribute.vr.content.push({\n name: '全景图',\n url: this._DialogObject._element.content.getElementsByClassName('vr_add')[0].value\n });\n this._DialogObject._element.content.getElementsByClassName('vr_add')[0].value = '';\n this.attributeVr = this.options.attribute.vr.content;\n } else {\n this.Dialog.clickAddVr && this.Dialog.clickAddVr();\n }\n }\n }, {\n key: \"addAttributeRr\",\n value: function addAttributeRr(vr) {\n this.options.attribute.vr.content.push({\n name: '全景图',\n url: vr\n });\n this.attributeVr = this.options.attribute.vr.content;\n }\n\n /**\r\n * 飞到\r\n */\n }, {\n key: \"flyTo\",\n value: (function () {\n var _flyTo = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee5() {\n var options,\n orientation,\n lng,\n lat,\n alt,\n destination,\n position,\n positionArray,\n ground,\n i,\n height,\n a,\n _i13,\n BoundingSphere,\n _args9 = arguments;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee5$(_context9) {\n while (1) switch (_context9.prev = _context9.next) {\n case 0:\n options = _args9.length > 0 && _args9[0] !== undefined ? _args9[0] : {};\n if (!this._error) {\n _context9.next = 3;\n break;\n }\n return _context9.abrupt(\"return\");\n case 3:\n Object(_Global_global__WEBPACK_IMPORTED_MODULE_21__[\"setActiveViewer\"])(0);\n Object(_Global_global__WEBPACK_IMPORTED_MODULE_21__[\"closeRotateAround\"])(this.sdk);\n Object(_Global_global__WEBPACK_IMPORTED_MODULE_21__[\"closeViewFollow\"])(this.sdk);\n if (!(this.options.customView && this.options.customView.relativePosition && this.options.customView.orientation)) {\n _context9.next = 25;\n break;\n }\n orientation = {\n heading: Cesium.Math.toRadians(this.options.customView.orientation.heading || 0.0),\n pitch: Cesium.Math.toRadians(this.options.customView.orientation.pitch || -60.0),\n roll: Cesium.Math.toRadians(this.options.customView.orientation.roll || 0.0)\n };\n lng = this.options.customView.relativePosition.lng;\n lat = this.options.customView.relativePosition.lat;\n alt = this.options.customView.relativePosition.alt;\n destination = Cesium.Cartesian3.fromDegrees(lng, lat, alt);\n position = {\n lng: 0,\n lat: 0\n };\n if (this.options.position) {\n position = _objectSpread({}, this.options.position);\n } else if (this.options.positions) {\n position = _objectSpread({}, this.options.positions[0]);\n } else if (this.options.center) {\n position = _objectSpread({}, this.options.center);\n } else if (this.options.start) {\n position = _objectSpread({}, this.options.start);\n } else {\n if (this.options.hasOwnProperty('lng')) {\n position.lng = this.options.lng;\n }\n if (this.options.hasOwnProperty('lat')) {\n position.lat = this.options.lat;\n }\n if (this.options.hasOwnProperty('alt')) {\n position.alt = this.options.alt;\n }\n }\n // 如果没有高度值,则获取紧贴高度计算\n if (position.hasOwnProperty('alt')) {\n _context9.next = 18;\n break;\n }\n _context9.next = 17;\n return this.getClampToHeight(position);\n case 17:\n position.alt = _context9.sent;\n case 18:\n lng = this.options.customView.relativePosition.lng + position.lng;\n lat = this.options.customView.relativePosition.lat + position.lat;\n alt = this.options.customView.relativePosition.alt + position.alt;\n destination = Cesium.Cartesian3.fromDegrees(lng, lat, alt);\n this.sdk.viewer.camera.flyTo({\n destination: destination,\n orientation: orientation\n });\n _context9.next = 51;\n break;\n case 25:\n positionArray = [];\n _context9.t0 = this.heightMode;\n _context9.next = _context9.t0 === 0 ? 29 : _context9.t0 === '0' ? 29 : _context9.t0 === 1 ? 31 : _context9.t0 === '1' ? 31 : _context9.t0 === 2 ? 33 : _context9.t0 === '2' ? 33 : 35;\n break;\n case 29:\n ground = false;\n return _context9.abrupt(\"break\", 35);\n case 31:\n ground = false;\n return _context9.abrupt(\"break\", 35);\n case 33:\n ground = true;\n return _context9.abrupt(\"break\", 35);\n case 35:\n if (!ground) {\n _context9.next = 48;\n break;\n }\n i = 0;\n case 37:\n if (!(i < this.options.positions.length)) {\n _context9.next = 46;\n break;\n }\n _context9.next = 40;\n return this.getClampToHeight(this.options.positions[i]);\n case 40:\n height = _context9.sent;\n a = Cesium.Cartesian3.fromDegrees(this.options.positions[i].lng, this.options.positions[i].lat, height);\n positionArray.push(a.x, a.y, a.z);\n case 43:\n i++;\n _context9.next = 37;\n break;\n case 46:\n _context9.next = 49;\n break;\n case 48:\n if (this.positionsH) {\n for (_i13 = 0; _i13 < this.positionsH.length; _i13++) {\n positionArray.push(this.positionsH[_i13].x, this.positionsH[_i13].y, this.positionsH[_i13].z);\n }\n }\n case 49:\n BoundingSphere = Cesium.BoundingSphere.fromVertices(positionArray);\n this.sdk.viewer.camera.flyToBoundingSphere(BoundingSphere, {\n offset: options.orientation || {\n heading: Cesium.Math.toRadians(0.0),\n pitch: Cesium.Math.toRadians(-90.0),\n roll: Cesium.Math.toRadians(0.0)\n }\n });\n case 51:\n case \"end\":\n return _context9.stop();\n }\n }, _callee5, this);\n }));\n function flyTo() {\n return _flyTo.apply(this, arguments);\n }\n return flyTo;\n }()\n /**\r\n * 打开富文本框\r\n */\n )\n }, {\n key: \"openRichTextEditor\",\n value: function openRichTextEditor(e) {\n var _this16 = this;\n _Element_richText__WEBPACK_IMPORTED_MODULE_11__[\"default\"].open(this.options.id, this.options.name, this.options.richTextContent);\n _Element_richText__WEBPACK_IMPORTED_MODULE_11__[\"default\"].primaryCallBack = function (content) {\n _this16.options.richTextContent = content;\n };\n }\n\n /**@desc 打开平移功能\r\n *\r\n * @memberOf Source\r\n * @param status {boolean}\r\n *\r\n * */\n }, {\n key: \"positionEditing\",\n get: function get() {\n return this.operate.positionEditing;\n },\n set: function set(status) {\n var _this17 = this;\n if (YJ.Measure.GetMeasureStatus() || !this.sdk || !this.sdk.viewer || !this.entity) {\n return;\n }\n this.removeAnimate();\n var _this = this;\n this.event && this.event.destroy();\n this.event = new _Event_index__WEBPACK_IMPORTED_MODULE_15__[\"default\"](this.sdk);\n this.operate.positionEditing = status;\n if (status === true) {\n var _Cesium$Cartesian;\n this.previous = {\n positions: _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(this.positions)\n };\n this.tip && this.tip.destroy();\n this.tip = new _MouseTip__WEBPACK_IMPORTED_MODULE_16__[\"default\"]('点击鼠标左键确认,右键取消', this.sdk);\n this.label && (this.label.entity.billboard.color = Cesium.Color.fromCssColorString(\"rgba(255,255,255,0.9)\"));\n this.picking = false;\n var array = [];\n var positions = _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(this.positions);\n var disparity = [];\n for (var i = 0; i < positions.length; i++) {\n var position = this.cartesian3Towgs84(positions[i], this.sdk.viewer);\n array.push([position.lng, position.lat]);\n }\n var firstposition = this.cartesian3Towgs84(positions[0], this.sdk.viewer);\n array.push([firstposition.lng, firstposition.lat]);\n var polygon = turf.polygon([array]);\n var centroid = turf.centroid(polygon);\n var center = (_Cesium$Cartesian = Cesium.Cartesian3).fromDegrees.apply(_Cesium$Cartesian, _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(centroid.geometry.coordinates));\n for (var _i14 = 0; _i14 < positions.length; _i14++) {\n center.x - positions[_i14].x;\n disparity.push({\n x: center.x - positions[_i14].x,\n y: center.y - positions[_i14].y,\n z: center.z - positions[_i14].z\n });\n }\n var newpositions = [];\n this.event.mouse_move(function (movement, cartesian) {\n newpositions = [];\n for (var _i15 = 0; _i15 < disparity.length; _i15++) {\n newpositions.push({\n x: cartesian.x - disparity[_i15].x,\n y: cartesian.y - disparity[_i15].y,\n z: cartesian.z - disparity[_i15].z\n });\n }\n _this17.tip.setPosition(cartesian, movement.endPosition.x, movement.endPosition.y);\n });\n this.event.mouse_left(function (movement, cartesian) {\n _this17.event.mouse_move(function () {});\n _this17.event.mouse_left(function () {});\n _this17.event.mouse_right(function () {});\n _this17.event.gesture_pinck_start(function () {});\n newpositions = [];\n for (var _i16 = 0; _i16 < disparity.length; _i16++) {\n var pos3 = {\n x: cartesian.x - disparity[_i16].x,\n y: cartesian.y - disparity[_i16].y,\n z: cartesian.z - disparity[_i16].z\n };\n newpositions.push(pos3);\n _this17.options.positions[_i16] = _this17.cartesian3Towgs84(pos3, _this17.sdk.viewer);\n if (_this17._elms.lng && _this17._elms.lng[_i16]) {\n _this17._elms.lng[_i16].innerHTML = _this17.options.positions[_i16].lng.toFixed(8);\n }\n if (_this17._elms.lat && _this17._elms.lat[_i16]) {\n _this17._elms.lat[_i16].innerHTML = _this17.options.positions[_i16].lat.toFixed(8);\n }\n }\n _this17.positions = newpositions;\n _this17.previous = {\n positions: _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(_this17.positions)\n };\n _this17.positionEditing = false;\n });\n this.event.mouse_right(function (movement, cartesian) {\n _this17.positionEditing = false;\n });\n this.event.gesture_pinck_start(function (movement, cartesian) {\n var startTime = new Date();\n _this17.event.gesture_pinck_end(function () {\n var endTime = new Date();\n if (endTime - startTime >= 500) {\n // 长按取消\n _this17.positionEditing = false;\n } else {\n _this17.event.mouse_move(function () {});\n _this17.event.mouse_left(function () {});\n _this17.event.mouse_right(function () {});\n _this17.event.gesture_pinck_start(function () {});\n newpositions = [];\n for (var _i17 = 0; _i17 < disparity.length; _i17++) {\n var pos3 = {\n x: cartesian.x - disparity[_i17].x,\n y: cartesian.y - disparity[_i17].y,\n z: cartesian.z - disparity[_i17].z\n };\n newpositions.push(pos3);\n _this17.options.positions[_i17] = _this17.cartesian3Towgs84(pos3, _this17.sdk.viewer);\n if (_this17._elms.lng && _this17._elms.lng[_i17]) {\n _this17._elms.lng[_i17].innerHTML = _this17.options.positions[_i17].lng.toFixed(8);\n }\n if (_this17._elms.lat && _this17._elms.lat[_i17]) {\n _this17._elms.lat[_i17].innerHTML = _this17.options.positions[_i17].lat.toFixed(8);\n }\n }\n _this17.positions = newpositions;\n _this17.previous = {\n positions: _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(_this17.positions)\n };\n _this17.positionEditing = false;\n }\n });\n });\n this.entity.polygon.hierarchy = new Cesium.CallbackProperty(function () {\n var position84 = [];\n if (newpositions.length > 0) {\n for (var _i18 = 0; _i18 < newpositions.length; _i18++) {\n position84.push(_this.cartesian3Towgs84(newpositions[_i18], _this.sdk.viewer));\n }\n } else {\n for (var _i19 = 0; _i19 < positions.length; _i19++) {\n position84.push(_this.cartesian3Towgs84(positions[_i19], _this.sdk.viewer));\n }\n }\n _this.renewPositions(position84);\n return new Cesium.PolygonHierarchy(_this.positionsH);\n }, false);\n this.entity.polyline.positions = new Cesium.CallbackProperty(function () {\n return [].concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(_this.positionsH), [_this.positionsH[0], _this.positionsH[1]]);\n }, false);\n } else {\n if (this.label && this.label.entity && this.label.entity.billboard) {\n this.label.entity.billboard.color = Cesium.Color.fromCssColorString(\"rgba(255,255,255,1)\");\n }\n this.picking = true;\n if (this.event) {\n this.event.mouse_move(function () {});\n this.event.mouse_left(function () {});\n this.event.mouse_right(function () {});\n this.event.gesture_pinck_start(function () {});\n this.event.destroy();\n }\n this.tip && this.tip.destroy();\n if (!this.previous) {\n this.previous = {\n positions: _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(this.positions)\n };\n } else {\n this.positions = _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(this.previous.positions);\n }\n var position84 = [];\n for (var _i20 = 0; _i20 < this.positions.length; _i20++) {\n position84.push(this.cartesian3Towgs84(this.positions[_i20], this.sdk.viewer));\n }\n this.renewPositions(position84);\n this.entity.polygon.hierarchy = new Cesium.CallbackProperty(function () {\n return new Cesium.PolygonHierarchy(_this.positionsH);\n }, true);\n this.entity.polyline.positions = new Cesium.CallbackProperty(function () {\n return [].concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(_this.positionsH), [_this.positionsH[0], _this.positionsH[1]]);\n }, true);\n }\n }\n }, {\n key: \"setPosition\",\n value: function setPosition(v) {\n var _Cesium$Cartesian2;\n var cartesian = Cesium.Cartesian3.fromDegrees(v.position.lng, v.position.lat, v.position.alt);\n var positions = _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(this.positions);\n var array = [];\n var disparity = [];\n for (var i = 0; i < positions.length; i++) {\n var position = this.cartesian3Towgs84(positions[i], this.sdk.viewer);\n array.push([position.lng, position.lat]);\n }\n var firstposition = this.cartesian3Towgs84(positions[0], this.sdk.viewer);\n array.push([firstposition.lng, firstposition.lat]);\n var polygon = turf.polygon([array]);\n var centroid = turf.centroid(polygon);\n var center = (_Cesium$Cartesian2 = Cesium.Cartesian3).fromDegrees.apply(_Cesium$Cartesian2, _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(centroid.geometry.coordinates));\n for (var _i21 = 0; _i21 < positions.length; _i21++) {\n disparity.push({\n x: center.x - positions[_i21].x,\n y: center.y - positions[_i21].y,\n z: center.z - positions[_i21].z\n });\n }\n var newpositions = [];\n for (var _i22 = 0; _i22 < disparity.length; _i22++) {\n newpositions.push({\n x: cartesian.x - disparity[_i22].x,\n y: cartesian.y - disparity[_i22].y,\n z: cartesian.z - disparity[_i22].z\n });\n }\n this.label.position = [v.position.lng, v.position.lat, v.position.alt];\n var positions84 = [];\n if (newpositions.length > 0) {\n for (var _i23 = 0; _i23 < newpositions.length; _i23++) {\n positions84.push(this.cartesian3Towgs84(newpositions[_i23], this.sdk.viewer));\n }\n }\n var arr = this.computePincerArrow(positions84);\n if (arr.length == 0) {\n return;\n }\n this.entity.polygon.hierarchy = new Cesium.CallbackProperty(function () {\n return new Cesium.PolygonHierarchy(arr);\n }, false);\n this.entity.polyline.positions = new Cesium.CallbackProperty(function () {\n if (arr.length >= 3) {\n return [].concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(arr), [arr[0], arr[1]]);\n } else {\n return _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(arr);\n }\n }, false);\n }\n }, {\n key: \"setDIV\",\n value: function setDIV() {\n var _this18 = this;\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {\n domid: \"\",\n x: 10,\n y: 10\n };\n options.x = options.x || options.x === 0 ? options.x : 10;\n options.y = options.y || options.y === 0 ? options.y : 10;\n var positions = this.computePincerArrow(this.options.positions);\n if (positions.length == 0) {\n return;\n }\n var points = [[]];\n for (var i = 0; i < positions.length; i++) {\n var _position = this.cartesian3Towgs84(positions[i], this.sdk.viewer);\n points[0].push([_position.lng, _position.lat]);\n }\n var position = this.cartesian3Towgs84(positions[0], this.sdk.viewer);\n points[0].push([position.lng, position.lat]);\n var polygon = turf.polygon(points);\n // let centroid = turf.centroid(polygon);\n var centroid = turf.pointOnFeature(polygon);\n var siteInfoDom = document.getElementById(options.domid);\n var siteInfoPosition = Cesium.Cartesian3.fromDegrees(centroid.geometry.coordinates[0], centroid.geometry.coordinates[1]);\n this.sdk.viewer.scene.postRender.addEventListener(function (percentage) {\n //转换到屏幕坐标\n if (siteInfoDom.style.display === 'block' || siteInfoDom.style.display === '') {\n var winpos = _this18.sdk.viewer.scene.cartesianToCanvasCoordinates(siteInfoPosition);\n if (winpos) {\n siteInfoDom.style.left = (winpos.x + options.x).toFixed(0) + 'px';\n siteInfoDom.style.top = (winpos.y + options.y).toFixed(0) + 'px';\n }\n }\n });\n }\n }, {\n key: \"spreadTime\",\n get: function get() {\n return this.options.spreadTime;\n },\n set: function set(v) {\n var spreadTime = Number(v);\n if (isNaN(spreadTime)) {\n spreadTime = 3000;\n } else if (spreadTime < 500) {\n spreadTime = 500;\n } else if (spreadTime > 9999999) {\n spreadTime = 9999999;\n }\n this.options.spreadTime = spreadTime;\n if (this.spreadState) {\n this.setSpreadProgressByTime();\n }\n this._elms.spreadTime && this._elms.spreadTime.forEach(function (item) {\n item.value = spreadTime;\n });\n }\n }, {\n key: \"loop\",\n get: function get() {\n return this.options.loop;\n },\n set: function set(v) {\n this.options.loop = v;\n if (this.TweenAnimate) {\n if (v) {\n this.TweenAnimate.repeat(Infinity);\n } else {\n this.TweenAnimate.repeat();\n }\n }\n this._elms.loop && this._elms.loop.forEach(function (item) {\n item.checked = v;\n });\n }\n }, {\n key: \"spreadState\",\n get: function get() {\n return this.options.spreadState;\n },\n set: function set(v) {\n this.options.spreadState = v;\n if (this.TweenAnimate) {\n if (v) {\n this.lineEdit = false;\n this.setSpreadProgressByTime(this.TweenAnimate._object.distance1 / this.TweenAnimate._valuesEnd.distance1 * this.spreadTime);\n } else {\n this.TweenAnimate.pause();\n }\n } else {\n if (v) {\n this.setSpreadProgressByTime();\n }\n }\n this._elms.spreadState && this._elms.spreadState.forEach(function (item) {\n item.checked = v;\n });\n }\n }, {\n key: \"setSpreadProgressByTime\",\n value: function setSpreadProgressByTime() {\n var _this19 = this;\n var time = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n if (!this.entity) {\n return;\n }\n var that = this;\n for (var i = 0; i < this.nodePoints.length; i++) {\n this.sdk.viewer.entities.remove(this.nodePoints[i]);\n }\n this.nodePoints = [];\n YJ.Measure.SetMeasureStatus(false);\n this.event && this.event.destroy();\n this.tip && this.tip.destroy();\n var PincerArrowArr = this.computePincerArrow(this.options.positions);\n if (PincerArrowArr.length == 0) {\n return;\n }\n var arr;\n var lineArr;\n // if (arr.length >= 3) {\n // lineArr = [...arr, arr[0], arr[1]]\n // }\n // else {\n // lineArr = [...arr]\n // }\n if (this.TweenAnimate) {\n TWEEN.remove(this.TweenAnimate);\n this.TweenAnimate = null;\n }\n var _getSdk = Object(_Global_SplitScreen__WEBPACK_IMPORTED_MODULE_20__[\"getSdk\"])(),\n sdkP = _getSdk.sdkP,\n sdkD = _getSdk.sdkD;\n var thatP;\n if (sdkD && sdkP) {\n if (this.sdk === sdkD) {\n thatP = sdkP.entityMap.get(this.options.id);\n if (thatP && thatP.entity && thatP.entity.polygon && thatP.positionsH) {\n this.entity.polygon.hierarchy = new Cesium.CallbackProperty(function () {\n return new Cesium.PolygonHierarchy(thatP.positionsH);\n }, false);\n this.entity.polyline.positions = new Cesium.CallbackProperty(function () {\n return [].concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(thatP.positionsH), [thatP.positionsH[0], thatP.positionsH[1]]);\n }, false);\n }\n return;\n }\n }\n\n // this.entity.polygon.hierarchy = arr\n // this.entity.polyline.positions = lineArr\n\n var linePos841 = [];\n var linePos842 = [];\n var linePos843 = [];\n var turfLine = [];\n for (var _i24 = 0; _i24 <= 2; _i24++) {\n turfLine.push([this.options.positions[_i24].lng, this.options.positions[_i24].lat]);\n }\n turfLine.push([this.options.positions[0].lng, this.options.positions[0].lat]);\n var clockwiseRing = turf.lineString(turfLine);\n var isClockwise = turf.booleanClockwise(clockwiseRing);\n for (var _i25 = 0; _i25 <= 100; _i25++) {\n var pos84 = this.cartesian3Towgs84(PincerArrowArr[_i25], this.sdk.viewer);\n linePos841.push([pos84.lng, pos84.lat, pos84.alt]);\n }\n if (isClockwise) {\n linePos841.push([this.options.positions[3].lng, this.options.positions[3].lat, this.options.positions[3].alt]);\n } else {\n linePos841.push([this.options.positions[2].lng, this.options.positions[2].lat, this.options.positions[2].alt]);\n }\n for (var _i26 = 312; _i26 >= 212; _i26--) {\n var _pos = this.cartesian3Towgs84(PincerArrowArr[_i26], this.sdk.viewer);\n linePos842.push([_pos.lng, _pos.lat, _pos.alt]);\n }\n if (isClockwise) {\n linePos842.push([this.options.positions[2].lng, this.options.positions[2].lat, this.options.positions[2].alt]);\n } else {\n linePos842.push([this.options.positions[3].lng, this.options.positions[3].lat, this.options.positions[3].alt]);\n }\n linePos843.push([(this.options.positions[0].lng + this.options.positions[1].lng) / 2, (this.options.positions[0].lat + this.options.positions[1].lat) / 2], [this.options.positions[4].lng, this.options.positions[4].lat]);\n var positions = this.deepCopyObj(this.options.positions);\n var line1 = turf.lineString(linePos841);\n var distance1 = turf.length(line1, {\n units: 'kilometers'\n });\n var line2 = turf.lineString(linePos842);\n var distance2 = turf.length(line2, {\n units: 'kilometers'\n });\n var line3 = turf.lineString(linePos843);\n var distance3 = turf.length(line3, {\n units: 'kilometers'\n });\n var timeRatio = time / this.spreadTime;\n var m = 0;\n this.TweenAnimate = new TWEEN.Tween({\n distance1: distance1 * timeRatio,\n distance2: distance2 * timeRatio,\n distance3: distance3 * timeRatio\n }).to({\n distance1: distance1,\n distance2: distance2,\n distance3: distance3\n }, this.spreadTime - time).easing(TWEEN.Easing.Linear.None).repeat(this.options.loop ? Infinity : 0).onRepeat(function () {\n if (time) {\n _this19.setSpreadProgressByTime();\n }\n }).onUpdate(/*#__PURE__*/function () {\n var _ref = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee6(r, a) {\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee6$(_context10) {\n while (1) switch (_context10.prev = _context10.next) {\n case 0:\n if (!(_this19.TweenAnimate._duration == Infinity)) {\n _context10.next = 2;\n break;\n }\n return _context10.abrupt(\"return\");\n case 2:\n m++;\n if (_this19.sdk.viewer) {\n _context10.next = 6;\n break;\n }\n _this19.removeAnimate();\n return _context10.abrupt(\"return\");\n case 6:\n setSpread(r);\n case 7:\n case \"end\":\n return _context10.stop();\n }\n }, _callee6);\n }));\n return function (_x4, _x5) {\n return _ref.apply(this, arguments);\n };\n }()).onStart(function () {\n _this19.options.spreadState = true;\n _this19._elms.spreadState && _this19._elms.spreadState.forEach(function (item) {\n item.checked = true;\n });\n }).onComplete(function (d) {\n _this19.removeAnimate();\n });\n if (this.spreadState) {\n this.TweenAnimate.start();\n } else {\n setSpread({\n distance1: distance1 * timeRatio,\n distance2: distance2 * timeRatio,\n distance3: distance3 * timeRatio\n });\n }\n function setSpread(_x6) {\n return _setSpread.apply(this, arguments);\n }\n function _setSpread() {\n _setSpread = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee7(v) {\n var index2, index3, sliced1, coordinates1, sliced2, coordinates2, sliced3, coordinates3;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee7$(_context11) {\n while (1) switch (_context11.prev = _context11.next) {\n case 0:\n if (that.show) {\n _context11.next = 2;\n break;\n }\n return _context11.abrupt(\"return\");\n case 2:\n index2 = 2;\n index3 = 3;\n if (isClockwise) {\n index2 = 3;\n index3 = 2;\n }\n if (v.distance1) {\n _context11.next = 10;\n break;\n }\n positions[index2].lng = positions[1].lng;\n positions[index2].lat = positions[1].lat;\n _context11.next = 16;\n break;\n case 10:\n _context11.next = 12;\n return turf.lineSliceAlong(line1, 0, v.distance1, {\n units: 'kilometers'\n });\n case 12:\n sliced1 = _context11.sent;\n coordinates1 = _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(sliced1.geometry.coordinates[sliced1.geometry.coordinates.length - 1]);\n positions[index2].lng = coordinates1[0];\n positions[index2].lat = coordinates1[1];\n case 16:\n if (v.distance2) {\n _context11.next = 21;\n break;\n }\n positions[index3].lng = positions[0].lng;\n positions[3].lat = positions[0].lat;\n _context11.next = 27;\n break;\n case 21:\n _context11.next = 23;\n return turf.lineSliceAlong(line2, 0, v.distance2, {\n units: 'kilometers'\n });\n case 23:\n sliced2 = _context11.sent;\n coordinates2 = _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(sliced2.geometry.coordinates[sliced2.geometry.coordinates.length - 1]);\n positions[index3].lng = coordinates2[0];\n positions[index3].lat = coordinates2[1];\n case 27:\n if (v.distance3) {\n _context11.next = 32;\n break;\n }\n positions[4].lng = linePos843[0][0];\n positions[4].lat = linePos843[0][1];\n _context11.next = 38;\n break;\n case 32:\n _context11.next = 34;\n return turf.lineSliceAlong(line3, 0, v.distance3, {\n units: 'kilometers'\n });\n case 34:\n sliced3 = _context11.sent;\n coordinates3 = _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(sliced3.geometry.coordinates[sliced3.geometry.coordinates.length - 1]);\n positions[4].lng = coordinates3[0];\n positions[4].lat = coordinates3[1];\n case 38:\n that.renewPositions(positions);\n case 39:\n case \"end\":\n return _context11.stop();\n }\n }, _callee7);\n }));\n return _setSpread.apply(this, arguments);\n }\n this.entity.polygon.hierarchy = new Cesium.CallbackProperty(function () {\n return new Cesium.PolygonHierarchy(that.positionsH);\n }, false);\n this.entity.polyline.positions = new Cesium.CallbackProperty(function () {\n return [].concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(that.positionsH), [that.positionsH[0], that.positionsH[1]]);\n }, false);\n }\n\n // 移除动画\n }, {\n key: \"removeAnimate\",\n value: function removeAnimate() {\n this.spreadState = false;\n if (this.TweenAnimate) {\n TWEEN.remove(this.TweenAnimate);\n this.TweenAnimate = null;\n this.renewPositions();\n this.entity.polygon.hierarchy = new Cesium.PolygonHierarchy(this.positionsH);\n this.entity.polyline.positions = [].concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(this.positionsH), [this.positionsH[0], this.positionsH[1]]);\n }\n }\n\n // 更新坐标\n }, {\n key: \"renewPositions\",\n value: function renewPositions(position84) {\n var _this20 = this;\n if (this._error || !this.sdk.viewer) {\n return;\n }\n var ground = false;\n var array = [];\n var positions = this.options.positions;\n if (position84) {\n positions = position84;\n }\n var fromDegreesArray = [];\n for (var i = 0; i < positions.length; i++) {\n fromDegreesArray.push(positions[i].lng, positions[i].lat);\n }\n this.positions = Cesium.Cartesian3.fromDegreesArray(fromDegreesArray);\n var positionsA = this.computePincerArrow(positions);\n if (positionsA.length == 0) {\n return;\n }\n var points = [[]];\n var pos84 = [];\n for (var _i27 = 0; _i27 < positionsA.length; _i27++) {\n var _position2 = this.cartesian3Towgs84(positionsA[_i27], this.sdk.viewer);\n pos84.push(_position2);\n points[0].push([_position2.lng, _position2.lat]);\n }\n var position = this.cartesian3Towgs84(positionsA[0], this.sdk.viewer);\n points[0].push([position.lng, position.lat]);\n var height = 0;\n var polygon = turf.polygon(points);\n var centroid = turf.pointOnFeature(polygon);\n switch (this.options.heightMode) {\n case '0':\n case 0:\n ground = false;\n break;\n case '1':\n case 1:\n height = this.sdk.viewer.scene.globe.getHeight(Cesium.Cartographic.fromDegrees(centroid.geometry.coordinates[0], centroid.geometry.coordinates[1])) || 0;\n ground = false;\n break;\n case '2':\n case 2:\n ground = true;\n break;\n }\n var fromDegreesArray2 = [];\n if (!ground && this.nodePoints.length == 0) {\n for (var _i28 = 0; _i28 < points[0].length; _i28++) {\n fromDegreesArray2.push(points[0][_i28][0], points[0][_i28][1], this.height + height);\n }\n this.positionsH = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray2);\n this.label && (this.label.position = [centroid.geometry.coordinates[0], centroid.geometry.coordinates[1], this.height + height]);\n } else {\n this.positionsH = positionsA;\n setTimeout(function () {\n if (!_this20.sdk.viewer) {\n return;\n }\n var objectsToExclude = _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(_this20.sdk.viewer.entities.values);\n _this20.getClampToHeight({\n lng: centroid.geometry.coordinates[0],\n lat: centroid.geometry.coordinates[1]\n }, objectsToExclude).then(function (height) {\n _this20.label && (_this20.label.position = [centroid.geometry.coordinates[0], centroid.geometry.coordinates[1], height]);\n });\n }, 100);\n }\n\n // 计算投影面积\n if (!this.spreadState) {\n this.options.areaByMeter = this.computeArea(pos84);\n this.areaUnit = this.areaUnit;\n }\n return fromDegreesArray;\n }\n }], [{\n key: \"create\",\n value: function create(that) {\n var positions = that.options.positions;\n var fromDegreesArray = [];\n for (var i = 0; i < positions.length; i++) {\n fromDegreesArray.push(positions[i].lng, positions[i].lat);\n }\n that.positions = Cesium.Cartesian3.fromDegreesArray(fromDegreesArray);\n var positionsA = that.computePincerArrow(that.options.positions);\n if (positionsA.length == 0) {\n return;\n }\n var points = [[]];\n for (var _i29 = 0; _i29 < positionsA.length; _i29++) {\n var _position3 = that.cartesian3Towgs84(positionsA[_i29], that.sdk.viewer);\n points[0].push([_position3.lng, _position3.lat]);\n }\n var position = that.cartesian3Towgs84(positionsA[0], that.sdk.viewer);\n points[0].push([position.lng, position.lat]);\n var polygon = turf.polygon(points);\n // let centroid = turf.centroid(polygon);\n var centroid = turf.pointOnFeature(polygon);\n var ground;\n var height = 0;\n switch (that.options.heightMode) {\n case '0':\n case 0:\n ground = false;\n break;\n case '1':\n case 1:\n height = that.sdk.viewer.scene.globe.getHeight(Cesium.Cartographic.fromDegrees(centroid.geometry.coordinates[0], centroid.geometry.coordinates[1])) || 0;\n ground = false;\n break;\n case '2':\n case 2:\n ground = true;\n break;\n }\n if (!that.options.label.position) {\n that.options.label.position = {\n lng: centroid.geometry.coordinates[0],\n lat: centroid.geometry.coordinates[1],\n alt: that.height + height\n };\n }\n var fromDegreesArray2 = [];\n for (var _i30 = 0; _i30 < points[0].length; _i30++) {\n fromDegreesArray2.push(points[0][_i30][0], points[0][_i30][1], that.height + height);\n }\n var material = Cesium.Color.fromCssColorString(that.options.color);\n if (that.sdk.viewer.scene.mode === 2) {\n ground = false;\n material = new Cesium.CustomColorMaterialSource({\n color: that.options.color\n });\n }\n that.options.label.ground = ground;\n that.positionsH = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray2);\n that.entity = that.sdk.viewer.entities.add({\n id: that.options.id,\n show: that.options.show,\n polygon: {\n hierarchy: !ground ? new Cesium.PolygonHierarchy(that.positionsH) : new Cesium.PolygonHierarchy(positionsA),\n perPositionHeight: !ground ? true : false,\n material: material,\n zIndex: that.sdk._entityZIndex\n },\n polyline: {\n positions: [].concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(that.positionsH), [that.positionsH[0], that.positionsH[1]]),\n width: that.options.line.width,\n material: Cesium.Color.fromCssColorString(that.options.line.color),\n clampToGround: !ground ? false : true,\n arcType: !ground ? Cesium.ArcType.NONE : Cesium.ArcType.GEODESIC,\n zIndex: that.sdk._entityZIndex\n }\n });\n that.sdk._entityZIndex++;\n PincerArrowObject.createLabel(that);\n var pos84 = [];\n for (var _i31 = 0; _i31 < positionsA.length; _i31++) {\n pos84.push(that.cartesian3Towgs84(positionsA[_i31], that.sdk.viewer));\n }\n that.options.areaByMeter = that.computeArea(pos84);\n switch (that.options['area-unit']) {\n case '平方米':\n that.options.area = that.options.areaByMeter;\n break;\n case '平方千米':\n that.options.area = Number((that.options.areaByMeter / 1000000).toFixed(8));\n break;\n case '亩':\n that.options.area = Number((that.options.areaByMeter / 666.6666667).toFixed(4));\n break;\n case '公顷':\n that.options.area = Number((that.options.areaByMeter / 10000).toFixed(6));\n break;\n default:\n that.options.area = that.options.areaByMeter;\n }\n Object(_Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_17__[\"syncData\"])(that.sdk, that.options.id);\n if (that.options.show) {\n Object(_Global_SplitScreen__WEBPACK_IMPORTED_MODULE_20__[\"setSplitDirection\"])(0, that.options.id);\n }\n that.spreadState = that.options.spreadState;\n }\n }, {\n key: \"createLabel\",\n value: function () {\n var _createLabel = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee8(that) {\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee8$(_context12) {\n while (1) switch (_context12.prev = _context12.next) {\n case 0:\n // 标签\n that.label = new _LabelObject__WEBPACK_IMPORTED_MODULE_14__[\"default\"](that.sdk, {\n id: that.options.id,\n show: that.options.show ? that.options.label.show : false,\n position: [that.options.label.position.lng, that.options.label.position.lat, that.options.label.position.alt],\n text: that.options.name,\n fontSize: that.options.label.fontSize,\n fontFamily: that.options.label.fontFamily,\n color: that.options.label.color,\n pixelOffset: that.options.label.pixelOffset,\n backgroundColor: that.options.label.backgroundColor,\n lineColor: that.options.label.lineColor,\n lineWidth: that.options.label.lineWidth,\n scaleByDistance: that.options.label.scaleByDistance,\n near: that.options.label.near,\n far: that.options.label.far,\n ground: that.options.label.ground\n });\n case 1:\n case \"end\":\n return _context12.stop();\n }\n }, _callee8);\n }));\n function createLabel(_x7) {\n return _createLabel.apply(this, arguments);\n }\n return createLabel;\n }()\n }, {\n key: \"EventBinding\",\n value: function EventBinding(that, elements) {\n var _loop10 = function _loop10() {\n var Event = [];\n var isEvent = false;\n var removeName = [];\n if (!elements[i] || !elements[i].attributes) {\n return 1; // continue\n }\n var _iterator5 = _createForOfIteratorHelper(elements[i].attributes),\n _step5;\n try {\n var _loop11 = function _loop11() {\n var m = _step5.value;\n switch (m.name) {\n case '@model':\n {\n isEvent = true;\n if (elements[i].type == 'checkbox') {\n Event.push(function (e) {\n that[m.value] = e.target.checked;\n });\n elements[i].checked = that[m.value];\n } else {\n Event.push(function (e) {\n var value = e.target.value;\n if (e.target.type == 'number') {\n if (e.data != '.' && (e.data != '-' || e.target.value)) {\n value = Number(value);\n if (e.target.max && value > Number(e.target.max)) {\n value = Number(e.target.max);\n }\n if (e.target.min && value < Number(e.target.min)) {\n value = Number(e.target.min);\n }\n that[m.value] = value;\n }\n } else {\n that[m.value] = value;\n }\n });\n if (elements[i].nodeName == 'IMG') {\n elements[i].src = that[m.value];\n } else {\n elements[i].value = that[m.value];\n }\n }\n if (that._elms[m.value]) {\n that._elms[m.value].push(elements[i]);\n } else {\n that._elms[m.value] = [elements[i]];\n }\n removeName.push(m.name);\n break;\n }\n case '@click':\n {\n elements[i].addEventListener('click', function (e) {\n if (typeof that[m.value] === 'function') {\n that[m.value](e);\n }\n });\n removeName.push(m.name);\n // elements[i].attributes.removeNamedItem(m.name)\n break;\n }\n case '@change':\n {\n isEvent = true;\n Event.push(function (e) {\n var value = e.target.value;\n if (e.target.type == 'number' && value != '') {\n value = Number(value);\n e.target.value = value;\n }\n if (typeof that[m.value] === 'function') {\n that[m.value](e, value);\n }\n });\n break;\n }\n }\n // elements[i].attributes[m] = undefined\n };\n for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {\n _loop11();\n }\n } catch (err) {\n _iterator5.e(err);\n } finally {\n _iterator5.f();\n }\n for (var n = 0; n < removeName.length; n++) {\n elements[i].attributes.removeNamedItem(removeName[n]);\n }\n if (isEvent) {\n var ventType = 'input';\n if (elements[i].tagName != 'INPUT' || elements[i].type == 'checkbox') {\n ventType = 'change';\n }\n if (elements[i].className.indexOf('blur') !== -1) {\n ventType = 'blur';\n }\n elements[i].addEventListener(ventType, function (e) {\n for (var t = 0; t < Event.length; t++) {\n Event[t](e);\n }\n });\n }\n };\n for (var i = 0; i < elements.length; i++) {\n if (_loop10()) continue;\n }\n }\n }, {\n key: \"nodeEdit\",\n value: function nodeEdit(that) {\n var cb = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};\n that.positionEditing = false;\n setTimeout(function () {\n if (YJ.Measure.GetMeasureStatus()) {\n cb('上一次测量未结束');\n } else {\n var createNodePoints = /*#__PURE__*/function () {\n var _ref2 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee9() {\n var objectsToExclude, i, height, entity;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee9$(_context13) {\n while (1) switch (_context13.prev = _context13.next) {\n case 0:\n objectsToExclude = _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(that.sdk.viewer.entities.values);\n i = 0;\n case 2:\n if (!(i < optionsPositions.length)) {\n _context13.next = 11;\n break;\n }\n _context13.next = 5;\n return that.getClampToHeight(that.options.positions[i], objectsToExclude);\n case 5:\n height = _context13.sent;\n entity = that.sdk.viewer.entities.add({\n name: 'node-secondary-edit-point',\n index: i,\n position: Cesium.Cartesian3.fromDegrees(optionsPositions[i].lng, optionsPositions[i].lat, height),\n billboard: {\n image: that.getSourceRootPath() + '/img/point.png',\n width: 15,\n height: 15,\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\n color: Cesium.Color.WHITE.withAlpha(0.99)\n }\n });\n that.nodePoints.push(entity);\n case 8:\n i++;\n _context13.next = 2;\n break;\n case 11:\n case \"end\":\n return _context13.stop();\n }\n }, _callee9);\n }));\n return function createNodePoints() {\n return _ref2.apply(this, arguments);\n };\n }();\n that.removeAnimate();\n YJ.Measure.SetMeasureStatus(true);\n that.tip = new _MouseTip__WEBPACK_IMPORTED_MODULE_16__[\"default\"]('请选择一个顶点,右键取消', that.sdk);\n that.event = new _Event_index__WEBPACK_IMPORTED_MODULE_15__[\"default\"](that.sdk);\n that.nodePoints = [];\n var selectPoint;\n var originalPosition;\n var optionsPositions = _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(that.options.positions);\n var leftEvent = function leftEvent(movement, cartesian) {\n if (selectPoint) {\n that.options.positions[selectPoint.index] = that.cartesian3Towgs84(cartesian, that.sdk.viewer);\n optionsPositions[selectPoint.index] = that.options.positions[selectPoint.index];\n var index = selectPoint.index;\n var entity = that.sdk.viewer.entities.add({\n name: 'node-secondary-edit-point',\n index: index,\n position: Cesium.Cartesian3.fromDegrees(optionsPositions[selectPoint.index].lng, optionsPositions[selectPoint.index].lat, optionsPositions[selectPoint.index].alt),\n billboard: {\n image: that.getSourceRootPath() + '/img/point.png',\n width: 15,\n height: 15,\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\n color: Cesium.Color.WHITE.withAlpha(0.99)\n }\n });\n that.nodePoints.splice(selectPoint.index, 0, entity);\n selectPoint = null;\n that.tip.set_text('请选择一个顶点,右键取消');\n } else {\n var pick = that.sdk.viewer.scene.pick(movement.position);\n if (pick && pick.id && pick.id.name && pick.id.name === 'node-secondary-edit-point') {\n selectPoint = pick.id;\n originalPosition = that.cartesian3Towgs84(pick.id.position.getValue(), that.sdk.viewer);\n that.nodePoints.splice(pick.id.index, 1);\n that.sdk.viewer.entities.remove(pick.id);\n that.tip.set_text('左键确定,右键取消');\n }\n }\n that.renewPositions();\n that.tip.setPosition(cartesian, movement.position.x, movement.position.y);\n };\n var rightEvent = function rightEvent() {\n that.event.mouse_move(function () {});\n that.event.mouse_left(function () {});\n that.event.mouse_right(function () {});\n that.event.gesture_pinck_start(function () {});\n if (selectPoint) {\n optionsPositions[selectPoint.index] = originalPosition;\n if (that._elms.lng && that._elms.lng[selectPoint.index]) {\n that._elms.lng[selectPoint.index].innerHTML = that.options.positions[selectPoint.index].lng.toFixed(8);\n }\n if (that._elms.lat && that._elms.lat[selectPoint.index]) {\n that._elms.lat[selectPoint.index].innerHTML = that.options.positions[selectPoint.index].lat.toFixed(8);\n }\n cb(null, optionsPositions);\n }\n that.options.positions = _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(optionsPositions);\n that.heightMode = that.heightMode;\n that.previous = null;\n };\n that.entity.polyline.clampToGround = true;\n that.entity.polyline.arcType = Cesium.ArcType.GEODESIC;\n that.entity.polygon.perPositionHeight = false;\n that.entity.polygon.hierarchy = new Cesium.CallbackProperty(function () {\n return new Cesium.PolygonHierarchy(that.positionsH);\n }, false);\n that.entity.polyline.positions = new Cesium.CallbackProperty(function () {\n return [].concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(that.positionsH), [that.positionsH[0], that.positionsH[1]]);\n }, false);\n setTimeout(function () {\n that.event.mouse_left(leftEvent);\n that.event.mouse_right(rightEvent);\n that.event.mouse_move(function (movement, cartesian) {\n if (selectPoint) {\n that.options.positions[selectPoint.index] = that.cartesian3Towgs84(cartesian, that.sdk.viewer);\n that.renewPositions();\n }\n that.tip.setPosition(cartesian, movement.endPosition.x, movement.endPosition.y);\n });\n that.event.gesture_pinck_start(function (movement, cartesian) {\n var startTime = new Date();\n var pos = {\n position: {\n x: (movement.position1.x + movement.position2.x) / 2,\n y: (movement.position1.y + movement.position2.y) / 2\n }\n };\n that.event.gesture_pinck_end(function () {\n var endTime = new Date();\n if (endTime - startTime >= 500) {\n // 长按取消\n rightEvent();\n } else {\n leftEvent(pos, cartesian);\n }\n });\n });\n var points = [[]];\n var pos84 = [];\n for (var i = 0; i < that.positionsH.length; i++) {\n var _position4 = that.cartesian3Towgs84(that.positionsH[i], that.sdk.viewer);\n pos84.push(_position4);\n points[0].push([_position4.lng, _position4.lat]);\n }\n var position = that.cartesian3Towgs84(that.positionsH[0], that.sdk.viewer);\n points[0].push([position.lng, position.lat]);\n var polygon = turf.polygon(points);\n var centroid = turf.pointOnFeature(polygon);\n var objectsToExclude = _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(that.sdk.viewer.entities.values);\n that.getClampToHeight({\n lng: centroid.geometry.coordinates[0],\n lat: centroid.geometry.coordinates[1]\n }, objectsToExclude).then(function (height) {\n that.label.position = [centroid.geometry.coordinates[0], centroid.geometry.coordinates[1], height];\n });\n createNodePoints();\n }, 200);\n }\n }, 0);\n }\n }, {\n key: \"closeNodeEdit\",\n value: function closeNodeEdit(that) {\n YJ.Measure.SetMeasureStatus(false);\n that.event && that.event.destroy();\n that.tip && that.tip.destroy();\n that.tip = null;\n for (var i = 0; i < that.nodePoints.length; i++) {\n that.sdk.viewer.entities.remove(that.nodePoints[i]);\n }\n that.nodePoints = [];\n that.picking = true;\n }\n }]);\n}(_index__WEBPACK_IMPORTED_MODULE_13__[\"default\"]);\n/* harmony default export */ __webpack_exports__[\"default\"] = (PincerArrowObject);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvT2JqL0Jhc2UvUGluY2VyQXJyb3dPYmplY3QvaW5kZXguanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvT2JqL0Jhc2UvUGluY2VyQXJyb3dPYmplY3QvaW5kZXguanM/MTYxMyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICog5Y+M566t5aS0XHJcbiAqL1xyXG5pbXBvcnQgRGlhbG9nIGZyb20gJy4uLy4uL0VsZW1lbnQvRGlhbG9nJztcclxuaW1wb3J0IGN5X3RhYnMgZnJvbSBcIi4uLy4uL0VsZW1lbnQvY3lfaHRtbF90YWJzXCI7XHJcbmltcG9ydCByaWNoVGV4dCBmcm9tIFwiLi4vLi4vRWxlbWVudC9yaWNoVGV4dFwiO1xyXG5pbXBvcnQgeyBodG1sIH0gZnJvbSBcIi4vX2VsZW1lbnRcIjtcclxuaW1wb3J0IEJhc2UgZnJvbSBcIi4uL2luZGV4XCI7XHJcbmltcG9ydCBMYWJlbE9iamVjdCBmcm9tICcuLi9MYWJlbE9iamVjdCdcclxuaW1wb3J0IE1vdXNlRXZlbnQgZnJvbSAnLi4vLi4vLi4vRXZlbnQvaW5kZXgnXHJcbmltcG9ydCBNb3VzZVRpcCBmcm9tICcuLi8uLi8uLi9Nb3VzZVRpcCdcclxuaW1wb3J0IHsgc3luY0RhdGEgfSBmcm9tICcuLi8uLi8uLi9HbG9iYWwvTXVsdGlWaWV3cG9ydE1vZGUnXHJcbmltcG9ydCB7IGxlZ3AgfSBmcm9tICcuLi8uLi9FbGVtZW50L2RhdGFsaXN0JztcclxuaW1wb3J0IHsgZ2V0Rm9udExpc3QsIGdldEZvbnRGYW1pbHlOYW1lIH0gZnJvbSAnLi4vLi4vRWxlbWVudC9mb250U2VsZWN0J1xyXG5pbXBvcnQgeyBzZXRTcGxpdERpcmVjdGlvbiwgc3luY1NwbGl0RGF0YSwgZ2V0U2RrLCBzZXRBY3RpdmVJZCB9IGZyb20gJy4uLy4uLy4uL0dsb2JhbC9TcGxpdFNjcmVlbidcclxuaW1wb3J0IHsgc2V0QWN0aXZlVmlld2VyLCBjbG9zZVJvdGF0ZUFyb3VuZCwgY2xvc2VWaWV3Rm9sbG93IH0gZnJvbSAnLi4vLi4vLi4vR2xvYmFsL2dsb2JhbCdcclxuLy8gaW1wb3J0IEVkaXRQYXJ0aWNsZSBmcm9tIFwiLi4vLi4vTW9kZWxDb250cm9sbGVyL0VkaXRQYXJ0aWNsZVwiO1xyXG5cclxuY2xhc3MgUGluY2VyQXJyb3dPYmplY3QgZXh0ZW5kcyBCYXNlIHtcclxuICAvKipcclxuICAgKiBAY29uc3RydWN0b3JcclxuICAgKiBAcGFyYW0gc2RrIFxyXG4gICAqIEBkZXNjcmlwdGlvbiDlj4znrq3lpLRcclxuICAgKiBAcGFyYW0gb3B0aW9ucyB7b2JqZWN0fSDlsZ7mgKdcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5pZCB7c3RyaW5nfSDllK/kuIDmoIfor4ZcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5zaG93PXRydWUge2Jvb2xlYW59IOaYvuekui/pmpDol49cclxuICAgKiBAcGFyYW0gb3B0aW9ucy5uYW1lIHtzdHJpbmd9IOWQjeensFxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmNvbG9yPSdyZ2JhKDI1NSwgMCwgMCwgMC41KScge3N0cmluZ30g6aKc6ImyXHJcbiAgICogQHBhcmFtIG9wdGlvbnMuaGVpZ2h0IHtudW1iZXJ9IOmrmOW6plxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmhlaWdodE1vZGU9MntudW1iZXJ9IOmrmOW6puaooeW8j++8iDDvvJrmtbfmi5Tpq5jluqbvvJsx77ya55u45a+55Zyw6KGo77ybMu+8muS+nemZhOaooeW8j++8iVxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmFyZWFVbml0PSflubPmlrnnsbMnIHtzdHJpbmd9IOmdouenr+WNleS9jVxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxpbmUge29iamVjdH0g6L655qGGXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGluZS53aWR0aD0yIHtzdHJpbmd9IOi+ueahhuWuvVxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxpbmUuY29sb3I9XCJyZ2JhKDE1NSwgMTU1LCAxMjQsIDAuODkpXCIge3N0cmluZ30g6L655qGG6aKc6ImyXHJcbiAgICogQHBhcmFtIHtBcnJheS48b2JqZWN0Pn0gb3B0aW9ucy5wb3NpdGlvbnMg5b+F5aGr77yM57uP57qs5bqm5ZKM6auY5bqm55qE5YiX6KGo77yM5YC85Lqk5pu/IFt7bG9uLGxhdCxhbHR9LC4uLl1cclxuICAgKiBAcGFyYW0gb3B0aW9ucy5wb3NpdGlvbnNbXS5sbmcge251bWJlcn0g57uP5bqmXHJcbiAgICogQHBhcmFtIG9wdGlvbnMucG9zaXRpb25zW10ubGF0IHtudW1iZXJ9IOe6rOW6plxyXG4gICAqIEBwYXJhbSBvcHRpb25zLnBvc2l0aW9uc1tdLmFsdCB7bnVtYmVyfSDpq5jluqZcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5zcHJlYWRTdGF0ZT1mYWxzZSB7Ym9vbGVhbn0g5Yqo55S7XHJcbiAgICogQHBhcmFtIG9wdGlvbnMubG9vcD1mYWxzZSB7bG9vcH0g5Yqo55S76YeN5aSNXHJcbiAgICogQHBhcmFtIG9wdGlvbnMuc3ByZWFkVGltZT0zMDAwIHtudW1iZXJ9IOWKqOeUu+aMgee7reaXtumVvyjmr6vnp5IpXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwge29iamVjdH0g5qCH562+5a+56LGhXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwudGV4dCB7c3RyaW5nfSDmoIfnrb7mlofmnKxcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5sYWJlbC5zaG93IHtzdHJpbmd9IOagh+etvuaYvumakFxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLnBvc2l0aW9uIHtzdHJpbmd9IOagh+etvuS9jee9rlxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLnBvc2l0aW9uIHtvYmplY3R9IOagh+etvuS9jee9rlxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLnBvc2l0aW9uLmxuZyB7bnVtYmVyfSDnu4/luqZcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5sYWJlbC5wb3NpdGlvbi5sYXQge251bWJlcn0g57qs5bqmXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwucG9zaXRpb24uYWx0IHtudW1iZXJ9IOmrmOW6plxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLmZvbnRTaXplPTIwIHtudW1iZXJ9IOWtl+S9k+Wkp+Wwj1xyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLmZvbnRGYW1pbHk9MCB7bnVtYmVyfSDlrZfkvZPpobkgMO+8mum7keS9k++8mzHvvJrmgJ3mupDpu5HkvZPvvJsy77ya5bqe6Zeo5q2j6YGT5qCH6aKY5L2T77ybM++8muaVsOm7keS9k1xyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLmNvbG9yPSNmZmZmZmYge3N0cmluZ30g5a2X5L2T6aKc6ImyXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwubGluZVdpZHRoPTQge251bWJlcn0g5byV57q/5a69XHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwubGluZUNvbG9yPSMwMGZmZmY4MCB7c3RyaW5nfSDlvJXnur/popzoibJcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5sYWJlbC5waXhlbE9mZnNldD0yMCB7bnVtYmVyfSDlrZfkvZPlgY/np7so5byV57q/6ZW/5bqmKVxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLmJhY2tncm91bmRDb2xvcj1bJyMwMGZmZmY4MCcsICcjMDBmZmZmODAnXSB7YXJyYXl9IOiDjOaZr+minOiJslxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLnNjYWxlQnlEaXN0YW5jZSB7Ym9vbGVhbn0g6Led56a757yp5pS+XHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwubmVhcj0yMDAwIHtudW1iZXJ9IOinhumHjue8qeaUvuacgOi/kei3neemu1xyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLmZhcj0xMDAwMDAge251bWJlcn0g6KeG6YeO57yp5pS+5pyA6L+c6Led56a7XHJcbiAgICogQHBhcmFtIG9wdGlvbnMuYXR0cmlidXRlIHtvYmplY3R9IOWxnuaAp+WGheWuuVxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmF0dHJpYnV0ZS5saW5rPXt9IHtvYmplY3R9IOmTvuaOpVxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnQ9W11dIHthcnJheX0g6ZO+5o6l5YaF5a65XHJcbiAgICogQHBhcmFtIG9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudFtdLm5hbWUge3N0cmluZ30g6ZO+5o6l5ZCN56ewXHJcbiAgICogQHBhcmFtIG9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudFtdLnVybCB7c3RyaW5nfSDpk77mjqXlnLDlnYBcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5yaWNoVGV4dENvbnRlbnQge3N0cmluZ30g5a+M5paH5pys5YaF5a65XHJcbiAgICogQHBhcmFtIG9wdGlvbnMuY3VzdG9tVmlldyB7b2JqZWN0fSDpu5jorqTop4bop5JcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5jdXN0b21WaWV3Lm9yaWVudGF0aW9uIHtvYmplY3R9IOm7mOiupOinhuinkuaWueS9jVxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmN1c3RvbVZpZXcub3JpZW50YXRpb24uaGVhZGluZyB7bnVtYmVyfSDoiKrlkJHop5JcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5jdXN0b21WaWV3Lm9yaWVudGF0aW9uLnBpdGNoIHtudW1iZXJ9IOS/r+S7sOinklxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmN1c3RvbVZpZXcub3JpZW50YXRpb24ucm9sbCB7bnVtYmVyfSDnv7vmu5rop5JcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5jdXN0b21WaWV3LnJlbGF0aXZlUG9zaXRpb24ge29iamVjdH0g6KeG6KeS55u45a+55L2N572uXHJcbiAgICogQHBhcmFtIG9wdGlvbnMuY3VzdG9tVmlldy5yZWxhdGl2ZVBvc2l0aW9uLmxuZyB7bnVtYmVyfSDnu4/luqZcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5jdXN0b21WaWV3LnJlbGF0aXZlUG9zaXRpb24ubGF0IHtudW1iZXJ9IOe6rOW6plxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmN1c3RvbVZpZXcucmVsYXRpdmVQb3NpdGlvbi5hbHQge251bWJlcn0g6auY5bqmXHJcbiAgICogKi9cclxuICBjb25zdHJ1Y3RvcihzZGssIG9wdGlvbnMgPSB7fSwgX0RpYWxvZyA9IHt9KSB7XHJcbiAgICBzdXBlcihzZGssIG9wdGlvbnMpO1xyXG4gICAgdGhpcy5vcHRpb25zLm5hbWUgPSBvcHRpb25zLm5hbWUgfHwgJ+acquWRveWQjeWvueixoSdcclxuICAgIHRoaXMub3B0aW9ucy5jb2xvciA9IG9wdGlvbnMuY29sb3IgfHwgXCIjZmYwMDAwODBcIlxyXG4gICAgdGhpcy5vcHRpb25zLnNob3cgPSAob3B0aW9ucy5zaG93IHx8IG9wdGlvbnMuc2hvdyA9PT0gZmFsc2UpID8gb3B0aW9ucy5zaG93IDogdHJ1ZVxyXG4gICAgdGhpcy5vcHRpb25zLnBvc2l0aW9ucyA9IG9wdGlvbnMucG9zaXRpb25zIHx8IFtdXHJcbiAgICB0aGlzLm9wdGlvbnMuaGVpZ2h0TW9kZSA9IChvcHRpb25zLmhlaWdodE1vZGUgfHwgb3B0aW9ucy5oZWlnaHRNb2RlID09IDApID8gb3B0aW9ucy5oZWlnaHRNb2RlIDogMlxyXG4gICAgdGhpcy5vcHRpb25zLmxpbmUgPSBvcHRpb25zLmxpbmUgfHwge31cclxuICAgIHRoaXMub3B0aW9ucy5saW5lLndpZHRoID0gKCh0aGlzLm9wdGlvbnMubGluZS53aWR0aCB8fCB0aGlzLm9wdGlvbnMubGluZS53aWR0aCA9PT0gMCkgPyB0aGlzLm9wdGlvbnMubGluZS53aWR0aCA6IDMpXHJcbiAgICB0aGlzLm9wdGlvbnMubGluZS5jb2xvciA9IHRoaXMub3B0aW9ucy5saW5lLmNvbG9yIHx8ICdyZ2JhKDI1NSwgMCwgMCwgMSknXHJcbiAgICB0aGlzLm9wdGlvbnNbJ2FyZWEtdW5pdCddID0gb3B0aW9uc1snYXJlYS11bml0J10gfHwgJ+W5s+aWueexsydcclxuICAgIHRoaXMub3B0aW9ucy5oZWlnaHQgPSBvcHRpb25zLmhlaWdodFxyXG4gICAgdGhpcy5vcHRpb25zLmxvb3AgPSBvcHRpb25zLmxvb3AgfHwgZmFsc2VcclxuICAgIHRoaXMub3B0aW9ucy5zcHJlYWRTdGF0ZSA9IG9wdGlvbnMuc3ByZWFkU3RhdGUgfHwgZmFsc2VcclxuICAgIHRoaXMuX2VsbXMgPSB7fTtcclxuICAgIHRoaXMubm9kZVBvaW50cyA9IFtdXHJcbiAgICB0aGlzLnNwcmVhZFRpbWUgPSBvcHRpb25zLnNwcmVhZFRpbWVcclxuICAgIHRoaXMuZW50aXR5XHJcbiAgICB0aGlzLmV2ZW50XHJcbiAgICB0aGlzLm9wZXJhdGUgPSB7fVxyXG4gICAgdGhpcy5EaWFsb2cgPSBfRGlhbG9nXHJcbiAgICBvcHRpb25zLmxhYmVsID0gb3B0aW9ucy5sYWJlbCB8fCB7fVxyXG4gICAgdGhpcy5vcHRpb25zLmxhYmVsID0ge1xyXG4gICAgICB0ZXh0OiB0aGlzLm9wdGlvbnMubmFtZSxcclxuICAgICAgc2hvdzogb3B0aW9ucy5sYWJlbC5zaG93IHx8IGZhbHNlLFxyXG4gICAgICBwb3NpdGlvbjogb3B0aW9ucy5sYWJlbC5wb3NpdGlvbixcclxuICAgICAgZm9udFNpemU6IChvcHRpb25zLmxhYmVsLmZvbnRTaXplIHx8IG9wdGlvbnMubGFiZWwuZm9udFNpemUgPT09IDApID8gb3B0aW9ucy5sYWJlbC5mb250U2l6ZSA6IDIwLFxyXG4gICAgICBmb250RmFtaWx5OiBvcHRpb25zLmxhYmVsLmZvbnRGYW1pbHkgPyBvcHRpb25zLmxhYmVsLmZvbnRGYW1pbHkgOiAwLFxyXG4gICAgICBjb2xvcjogb3B0aW9ucy5sYWJlbC5jb2xvciB8fCAnI2ZmZmZmZicsXHJcbiAgICAgIGxpbmVXaWR0aDogKG9wdGlvbnMubGFiZWwubGluZVdpZHRoIHx8IG9wdGlvbnMubGFiZWwubGluZVdpZHRoID09PSAwKSA/IG9wdGlvbnMubGFiZWwubGluZVdpZHRoIDogNCxcclxuICAgICAgcGl4ZWxPZmZzZXQ6IChvcHRpb25zLmxhYmVsLnBpeGVsT2Zmc2V0IHx8IG9wdGlvbnMubGFiZWwucGl4ZWxPZmZzZXQgPT09IDApID8gb3B0aW9ucy5sYWJlbC5waXhlbE9mZnNldCA6IDIwLFxyXG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6IG9wdGlvbnMubGFiZWwuYmFja2dyb3VuZENvbG9yIHx8IFsnIzAwZmZmZjgwJywgJyMwMGZmZmY4MCddLFxyXG4gICAgICBsaW5lQ29sb3I6IG9wdGlvbnMubGFiZWwubGluZUNvbG9yIHx8ICcjMDBmZmZmODAnLFxyXG4gICAgICBzY2FsZUJ5RGlzdGFuY2U6IG9wdGlvbnMubGFiZWwuc2NhbGVCeURpc3RhbmNlIHx8IGZhbHNlLFxyXG4gICAgICBuZWFyOiAob3B0aW9ucy5sYWJlbC5uZWFyIHx8IG9wdGlvbnMubGFiZWwubmVhciA9PT0gMCkgPyBvcHRpb25zLmxhYmVsLm5lYXIgOiAyMDAwLFxyXG4gICAgICBmYXI6IChvcHRpb25zLmxhYmVsLmZhciB8fCBvcHRpb25zLmxhYmVsLmZhciA9PT0gMCkgPyBvcHRpb25zLmxhYmVsLmZhciA6IDEwMDAwMCxcclxuICAgIH1cclxuICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUgPSBvcHRpb25zLmF0dHJpYnV0ZSB8fCB7fVxyXG4gICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rIHx8IHt9XHJcbiAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudCA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50IHx8IFtdXHJcbiAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmNhbWVyYSA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUuY2FtZXJhIHx8IHt9XHJcbiAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmNhbWVyYS5jb250ZW50ID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5jYW1lcmEuY29udGVudCB8fCBbXVxyXG4gICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52ciA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIgfHwge31cclxuICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudCA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudCB8fCBbXVxyXG4gICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5nb29kcyA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUuZ29vZHMgfHwge31cclxuICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUuZ29vZHMuY29udGVudCA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUuZ29vZHMuY29udGVudCB8fCBbXVxyXG4gICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZVR5cGUgPSBvcHRpb25zLmF0dHJpYnV0ZVR5cGUgfHwgJ3JpY2hUZXh0J1xyXG5cclxuICAgIGlmICghdGhpcy5vcHRpb25zLnBvc2l0aW9ucyB8fCB0aGlzLm9wdGlvbnMucG9zaXRpb25zLmxlbmd0aCA8IDUpIHtcclxuICAgICAgdGhpcy5fZXJyb3IgPSAn5Y+M566t5aS05pyA5bCR6ZyA6KaB5LqU5Liq5Z2Q5qCH77yBJ1xyXG4gICAgICBjb25zb2xlLndhcm4odGhpcy5fZXJyb3IpXHJcbiAgICAgIHdpbmRvdy5FTEVNRU5UICYmIHdpbmRvdy5FTEVNRU5ULk1lc3NhZ2Uoe1xyXG4gICAgICAgIG1lc3NhZ2U6IHRoaXMuX2Vycm9yLFxyXG4gICAgICAgIHR5cGU6ICd3YXJuaW5nJyxcclxuICAgICAgICBkdXJhdGlvbjogMTUwMFxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBpZiAoIXRoaXMub3B0aW9ucy5oZWlnaHQgJiYgdGhpcy5vcHRpb25zLmhlaWdodCAhPT0gMCkge1xyXG4gICAgICAgIGxldCBoZWlnaHQgPSB0aGlzLm9wdGlvbnMucG9zaXRpb25zWzBdLmFsdFxyXG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgdGhpcy5vcHRpb25zLnBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgaWYgKGhlaWdodCA8IHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0uYWx0KSB7XHJcbiAgICAgICAgICAgIGhlaWdodCA9IHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0uYWx0XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMub3B0aW9ucy5oZWlnaHQgPSBoZWlnaHRcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnNkay5hZGRJbmNldGFuY2UodGhpcy5vcHRpb25zLmlkLCB0aGlzKVxyXG4gICAgICBQaW5jZXJBcnJvd09iamVjdC5jcmVhdGUodGhpcylcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCB0eXBlKCkge1xyXG4gICAgcmV0dXJuICdQaW5jZXJBcnJvd09iamVjdCdcclxuICB9XHJcblxyXG4gIGdldCBuYW1lKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5uYW1lXHJcbiAgfVxyXG4gIHNldCBuYW1lKHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5uYW1lID0gdlxyXG4gICAgdGhpcy5sYWJlbC50ZXh0ID0gdlxyXG4gICAgdGhpcy5fZWxtcy5uYW1lICYmIHRoaXMuX2VsbXMubmFtZS5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgIGl0ZW0udmFsdWUgPSB2XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgZ2V0IGNvbG9yKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5jb2xvclxyXG4gIH1cclxuICBzZXQgY29sb3Iodikge1xyXG4gICAgdGhpcy5vcHRpb25zLmNvbG9yID0gdiB8fCAncmdiYSgyNTUsIDAsIDAsIDAuNSknXHJcbiAgICBpZiAoIXRoaXMuc2RrIHx8ICF0aGlzLnNkay52aWV3ZXIgfHwgIXRoaXMuZW50aXR5IHx8ICF0aGlzLmVudGl0eS5wb2x5Z29uKSB7XHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG4gICAgbGV0IG1hdGVyaWFsID0gQ2VzaXVtLkNvbG9yLmZyb21Dc3NDb2xvclN0cmluZyh0aGlzLm9wdGlvbnMuY29sb3IpXHJcbiAgICBpZiAodGhpcy5zZGsudmlld2VyLnNjZW5lLm1vZGUgPT09IDIpIHtcclxuICAgICAgbWF0ZXJpYWwgPSBuZXcgQ2VzaXVtLkN1c3RvbUNvbG9yTWF0ZXJpYWxTb3VyY2Uoe1xyXG4gICAgICAgIGNvbG9yOiB0aGlzLm9wdGlvbnMuY29sb3JcclxuICAgICAgfSlcclxuICAgIH1cclxuICAgIHRoaXMuZW50aXR5LnBvbHlnb24ubWF0ZXJpYWwgPSBtYXRlcmlhbFxyXG4gICAgaWYgKHRoaXMuX2VsbXMuY29sb3IpIHtcclxuICAgICAgdGhpcy5fZWxtcy5jb2xvci5mb3JFYWNoKChpdGVtLCBpKSA9PiB7XHJcbiAgICAgICAgbGV0IGNvbG9yUGlja2VyID0gbmV3IFlKQ29sb3JQaWNrZXIoe1xyXG4gICAgICAgICAgZWw6IGl0ZW0uZWwsXHJcbiAgICAgICAgICBzaXplOiAnbWluaScsLy/popzoibJib3jnsbvlnotcclxuICAgICAgICAgIGFscGhhOiB0cnVlLC8v5piv5ZCm5byA5ZCv6YCP5piO5bqmXHJcbiAgICAgICAgICBkZWZhdWx0Q29sb3I6IHRoaXMub3B0aW9ucy5jb2xvcixcclxuICAgICAgICAgIGRpc2FibGVkOiBmYWxzZSwvL+aYr+WQpuemgeatouaJk+W8gOminOiJsumAieaLqeWZqFxyXG4gICAgICAgICAgb3BlblBpY2tlckFuaTogJ29wYWNpdHknLC8v5omT5byA6aKc6Imy6YCJ5oup5Zmo5Yqo55S7XHJcbiAgICAgICAgICBzdXJlOiAoYykgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmNvbG9yID0gY1xyXG4gICAgICAgICAgfSwvL+eCueWHu+ehruiupOaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICAgICAgY2xlYXI6ICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5jb2xvciA9ICdyZ2JhKDI1NSwwLDAsMC41KSdcclxuICAgICAgICAgIH0sLy/ngrnlh7vmuIXnqbrmjInpkq7kuovku7blm57osINcclxuICAgICAgICB9KVxyXG4gICAgICAgIHRoaXMuX2VsbXMuY29sb3JbaV0gPSBjb2xvclBpY2tlclxyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IGhlaWdodE1vZGUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmhlaWdodE1vZGUgPyB0aGlzLm9wdGlvbnMuaGVpZ2h0TW9kZSA6IDBcclxuICB9XHJcbiAgc2V0IGhlaWdodE1vZGUodikge1xyXG4gICAgdGhpcy5lbnRpdHkucG9seWdvbi5oaWVyYXJjaHkgPSBbXVxyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMub3B0aW9ucy5oZWlnaHRNb2RlID0gKHYgfHwgdiA9PSAwKSA/IHYgOiAyXHJcbiAgICAgIHRoaXMucG9zaXRpb25FZGl0aW5nID0gZmFsc2VcclxuICAgICAgaWYgKCF0aGlzLmVudGl0eSkge1xyXG4gICAgICAgIHJldHVyblxyXG4gICAgICB9XHJcbiAgICAgIGxldCBoZWlnaHRNb2RlTmFtZSA9ICcnXHJcbiAgICAgIFBpbmNlckFycm93T2JqZWN0LmNsb3NlTm9kZUVkaXQodGhpcylcclxuICAgICAgbGV0IGdyb3VuZCA9IGZhbHNlXHJcbiAgICAgIGxldCBkaXNhYmxlZCA9IGZhbHNlXHJcbiAgICAgIHRoaXMucmVuZXdQb3NpdGlvbnMoKVxyXG4gICAgICB0aGlzLmVudGl0eS5wb2x5bGluZS5wb3NpdGlvbnMgPSBbXHJcbiAgICAgICAgLi4udGhpcy5wb3NpdGlvbnNILFxyXG4gICAgICAgIHRoaXMucG9zaXRpb25zSFswXSxcclxuICAgICAgICB0aGlzLnBvc2l0aW9uc0hbMV1cclxuICAgICAgXVxyXG4gICAgICB0aGlzLmVudGl0eS5wb2x5Z29uLmhpZXJhcmNoeSA9IG5ldyBDZXNpdW0uUG9seWdvbkhpZXJhcmNoeShcclxuICAgICAgICB0aGlzLnBvc2l0aW9uc0hcclxuICAgICAgKVxyXG4gICAgICBzd2l0Y2ggKHRoaXMub3B0aW9ucy5oZWlnaHRNb2RlKSB7XHJcbiAgICAgICAgY2FzZSAnMCc6XHJcbiAgICAgICAgY2FzZSAwOlxyXG4gICAgICAgICAgaGVpZ2h0TW9kZU5hbWUgPSAn5rW35ouU6auY5bqmJ1xyXG4gICAgICAgICAgYnJlYWtcclxuICAgICAgICBjYXNlICcxJzpcclxuICAgICAgICBjYXNlIDE6XHJcbiAgICAgICAgICBoZWlnaHRNb2RlTmFtZSA9ICfnm7jlr7nlnLDooagnXHJcbiAgICAgICAgICBicmVha1xyXG4gICAgICAgIGNhc2UgJzInOlxyXG4gICAgICAgIGNhc2UgMjpcclxuICAgICAgICAgIGdyb3VuZCA9IHRydWVcclxuICAgICAgICAgIGRpc2FibGVkID0gdHJ1ZVxyXG4gICAgICAgICAgaGVpZ2h0TW9kZU5hbWUgPSAn5L6d6ZmE5qih5Z6LJ1xyXG4gICAgICAgICAgYnJlYWtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmxhYmVsLmdyb3VuZCA9IGdyb3VuZFxyXG4gICAgICB0aGlzLmVudGl0eS5wb2x5bGluZS5jbGFtcFRvR3JvdW5kID0gZ3JvdW5kXHJcbiAgICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLmFyY1R5cGUgPSAhZ3JvdW5kID8gQ2VzaXVtLkFyY1R5cGUuTk9ORSA6IENlc2l1bS5BcmNUeXBlLkdFT0RFU0lDLFxyXG4gICAgICAgIHRoaXMuZW50aXR5LnBvbHlnb24ucGVyUG9zaXRpb25IZWlnaHQgPSAhZ3JvdW5kID8gdHJ1ZSA6IGZhbHNlXHJcbiAgICAgIHRoaXMuX2VsbXMuaGVpZ2h0TW9kZSAmJiAodGhpcy5fZWxtcy5oZWlnaHRNb2RlLnZhbHVlID0gaGVpZ2h0TW9kZU5hbWUpXHJcbiAgICAgIHRoaXMuX2VsbXMuaGVpZ2h0TW9kZU9iamVjdCAmJiAodGhpcy5fZWxtcy5oZWlnaHRNb2RlT2JqZWN0LmxlZ3Bfc2VhcmNoQWN0aXZlKFxyXG4gICAgICAgIGhlaWdodE1vZGVOYW1lXHJcbiAgICAgICkpXHJcbiAgICAgIGlmIChkaXNhYmxlZCkge1xyXG4gICAgICAgIHRoaXMuX2VsbXMuaGVpZ2h0Qm94ICYmICh0aGlzLl9lbG1zLmhlaWdodEJveC5jbGFzc05hbWUgPSAnaW5wdXQtbnVtYmVyIGlucHV0LW51bWJlci11bml0LTEgaGVpZ2h0LWJveCBkaXNhYmxlZCcpO1xyXG4gICAgICAgIHRoaXMuX2VsbXMuaGVpZ2h0Q29uZmlybSAmJiB0aGlzLl9lbG1zLmhlaWdodENvbmZpcm0uc2V0QXR0cmlidXRlKCdkaXNhYmxlZCcsICdkaXNhYmxlZCcpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRoaXMuX2VsbXMuaGVpZ2h0Qm94ICYmICh0aGlzLl9lbG1zLmhlaWdodEJveC5jbGFzc05hbWUgPSAnaW5wdXQtbnVtYmVyIGlucHV0LW51bWJlci11bml0LTEgaGVpZ2h0LWJveCcpO1xyXG4gICAgICAgIHRoaXMuX2VsbXMuaGVpZ2h0Q29uZmlybSAmJiB0aGlzLl9lbG1zLmhlaWdodENvbmZpcm0ucmVtb3ZlQXR0cmlidXRlKCdkaXNhYmxlZCcpO1xyXG4gICAgICB9XHJcbiAgICB9LCA1MCk7XHJcbiAgfVxyXG5cclxuICBnZXQgaGVpZ2h0KCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5oZWlnaHRcclxuICB9XHJcblxyXG4gIHNldCBoZWlnaHQodikge1xyXG4gICAgaWYgKCF2IHx8IGlzTmFOKE51bWJlcih2KSkpIHtcclxuICAgICAgdGhpcy5vcHRpb25zLmhlaWdodCA9IDBcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLm9wdGlvbnMuaGVpZ2h0ID0gTnVtYmVyKE51bWJlcih2KS50b0ZpeGVkKDIpKVxyXG4gICAgfVxyXG4gICAgbGV0IGdyb3VuZFxyXG4gICAgaWYgKHRoaXMuaGVpZ2h0TW9kZSA9PSAyKSB7XHJcbiAgICAgIGdyb3VuZCA9IHRydWVcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGdyb3VuZCA9IGZhbHNlXHJcbiAgICB9XHJcbiAgICB0aGlzLnJlbmV3UG9zaXRpb25zKClcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLmVudGl0eS5wb2x5Z29uLmhpZXJhcmNoeSA9IG5ldyBDZXNpdW0uUG9seWdvbkhpZXJhcmNoeSh0aGlzLnBvc2l0aW9uc0gpXHJcbiAgICAgIHRoaXMuZW50aXR5LnBvbHlnb24ucGVyUG9zaXRpb25IZWlnaHQgPSAhZ3JvdW5kID8gdHJ1ZSA6IGZhbHNlXHJcbiAgICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLnBvc2l0aW9ucyA9IFtcclxuICAgICAgICAuLi50aGlzLnBvc2l0aW9uc0gsXHJcbiAgICAgICAgdGhpcy5wb3NpdGlvbnNIWzBdLFxyXG4gICAgICAgIHRoaXMucG9zaXRpb25zSFsxXVxyXG4gICAgICBdXHJcbiAgICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLmNsYW1wVG9Hcm91bmQgPSAhZ3JvdW5kID8gZmFsc2UgOiB0cnVlXHJcbiAgICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLmFyY1R5cGUgPSAhZ3JvdW5kID8gQ2VzaXVtLkFyY1R5cGUuTk9ORSA6IENlc2l1bS5BcmNUeXBlLkdFT0RFU0lDXHJcbiAgICB9LCAwKTtcclxuXHJcbiAgICB0aGlzLl9lbG1zLmFsdCAmJlxyXG4gICAgICB0aGlzLl9lbG1zLmFsdC5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgIGl0ZW0uaW5uZXJIVE1MID0gdGhpcy5vcHRpb25zLmhlaWdodFxyXG4gICAgICB9KVxyXG4gIH1cclxuXHJcbiAgZ2V0IGxpbmVDb2xvcigpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubGluZS5jb2xvclxyXG4gIH1cclxuICBzZXQgbGluZUNvbG9yKHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5saW5lLmNvbG9yID0gdiB8fCAncmdiYSgyNTUsIDAsIDAsIDAuNSknXHJcbiAgICBpZiAoIXRoaXMuc2RrIHx8ICF0aGlzLnNkay52aWV3ZXIgfHwgIXRoaXMuZW50aXR5IHx8ICF0aGlzLmVudGl0eS5wb2x5bGluZSkge1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLm1hdGVyaWFsID0gQ2VzaXVtLkNvbG9yLmZyb21Dc3NDb2xvclN0cmluZyh0aGlzLm9wdGlvbnMubGluZS5jb2xvcilcclxuICAgIGlmICh0aGlzLl9lbG1zLmxpbmVDb2xvcikge1xyXG4gICAgICB0aGlzLl9lbG1zLmxpbmVDb2xvci5mb3JFYWNoKChpdGVtLCBpKSA9PiB7XHJcbiAgICAgICAgbGV0IGxpbmVDb2xvclBpY2tlciA9IG5ldyBZSkNvbG9yUGlja2VyKHtcclxuICAgICAgICAgIGVsOiBpdGVtLmVsLFxyXG4gICAgICAgICAgc2l6ZTogJ21pbmknLC8v6aKc6ImyYm9457G75Z6LXHJcbiAgICAgICAgICBhbHBoYTogdHJ1ZSwvL+aYr+WQpuW8gOWQr+mAj+aYjuW6plxyXG4gICAgICAgICAgZGVmYXVsdENvbG9yOiB0aGlzLm9wdGlvbnMubGluZS5jb2xvcixcclxuICAgICAgICAgIGRpc2FibGVkOiBmYWxzZSwvL+aYr+WQpuemgeatouaJk+W8gOminOiJsumAieaLqeWZqFxyXG4gICAgICAgICAgb3BlblBpY2tlckFuaTogJ29wYWNpdHknLC8v5omT5byA6aKc6Imy6YCJ5oup5Zmo5Yqo55S7XHJcbiAgICAgICAgICBzdXJlOiAoYykgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxpbmVDb2xvciA9IGNcclxuICAgICAgICAgIH0sLy/ngrnlh7vnoa7orqTmjInpkq7kuovku7blm57osINcclxuICAgICAgICAgIGNsZWFyOiAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubGluZUNvbG9yID0gJ3JnYmEoMjU1LDAsMCwwLjUpJ1xyXG4gICAgICAgICAgfSwvL+eCueWHu+a4heepuuaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgdGhpcy5fZWxtcy5saW5lQ29sb3JbaV0gPSBsaW5lQ29sb3JQaWNrZXJcclxuICAgICAgfSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCBsaW5lV2lkdGgoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmxpbmUud2lkdGhcclxuICB9XHJcbiAgc2V0IGxpbmVXaWR0aCh2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMubGluZS53aWR0aCA9ICgodiB8fCB2ID09PSAwKSA/IHYgOiAzKVxyXG4gICAgdGhpcy5lbnRpdHkucG9seWxpbmUud2lkdGggPSB0aGlzLm9wdGlvbnMubGluZS53aWR0aFxyXG4gICAgdGhpcy5fZWxtcy5saW5lV2lkdGggJiYgdGhpcy5fZWxtcy5saW5lV2lkdGguZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICBpdGVtLnZhbHVlID0gdGhpcy5vcHRpb25zLmxpbmUud2lkdGhcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBnZXQgYXJlYSgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuYXJlYVxyXG4gIH1cclxuXHJcbiAgc2V0IGFyZWEodikge1xyXG4gICAgdGhpcy5vcHRpb25zLmFyZWEgPSB2XHJcbiAgICB0aGlzLl9lbG1zLmFyZWEgJiYgdGhpcy5fZWxtcy5hcmVhLmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgaXRlbS52YWx1ZSA9IHZcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBnZXQgYXJlYVVuaXQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zWydhcmVhLXVuaXQnXVxyXG4gIH1cclxuICBzZXQgYXJlYVVuaXQodikge1xyXG4gICAgdGhpcy5vcHRpb25zWydhcmVhLXVuaXQnXSA9IHZcclxuICAgIHRoaXMuX2VsbXMuYXJlYVVuaXQgJiYgdGhpcy5fZWxtcy5hcmVhVW5pdC5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgIGl0ZW0udmFsdWUgPSB2XHJcbiAgICB9KVxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5hcmVhQnlNZXRlcikge1xyXG4gICAgICBzd2l0Y2ggKHYpIHtcclxuICAgICAgICBjYXNlICflubPmlrnnsbMnOlxyXG4gICAgICAgICAgdGhpcy5hcmVhID0gdGhpcy5vcHRpb25zLmFyZWFCeU1ldGVyXHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlICflubPmlrnljYPnsbMnOlxyXG4gICAgICAgICAgdGhpcy5hcmVhID0gTnVtYmVyKCh0aGlzLm9wdGlvbnMuYXJlYUJ5TWV0ZXIgLyAxMDAwMDAwKS50b0ZpeGVkKDgpKVxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSAn5LqpJzpcclxuICAgICAgICAgIHRoaXMuYXJlYSA9IE51bWJlcigodGhpcy5vcHRpb25zLmFyZWFCeU1ldGVyIC8gNjY2LjY2NjY2NjcpLnRvRml4ZWQoNCkpXHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlICflhazpobcnOlxyXG4gICAgICAgICAgdGhpcy5hcmVhID0gTnVtYmVyKCh0aGlzLm9wdGlvbnMuYXJlYUJ5TWV0ZXIgLyAxMDAwMCkudG9GaXhlZCg2KSlcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICB0aGlzLmFyZWEgPSB0aGlzLm9wdGlvbnMuYXJlYUJ5TWV0ZXJcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IGxhYmVsU2hvdygpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubGFiZWwuc2hvd1xyXG4gIH1cclxuICBzZXQgbGFiZWxTaG93KHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5sYWJlbC5zaG93ID0gdlxyXG4gICAgaWYgKHRoaXMuc2hvdyAmJiAhdGhpcy5zaG93VmlldyB8fCB0aGlzLnNob3dWaWV3ID09IDMpIHtcclxuICAgICAgdGhpcy5sYWJlbC5zaG93ID0gdlxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMubGFiZWwuc2hvdyA9IGZhbHNlXHJcbiAgICB9XHJcbiAgICB0aGlzLl9lbG1zLmxhYmVsU2hvdyAmJiB0aGlzLl9lbG1zLmxhYmVsU2hvdy5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgIGl0ZW0uY2hlY2tlZCA9IHZcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBnZXQgbGFiZWxGb250RmFtaWx5KCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5sYWJlbC5mb250RmFtaWx5XHJcbiAgfVxyXG5cclxuICBzZXQgbGFiZWxGb250RmFtaWx5KHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5sYWJlbC5mb250RmFtaWx5ID0gdiB8fCAwXHJcbiAgICB0aGlzLmxhYmVsICYmICh0aGlzLmxhYmVsLmZvbnRGYW1pbHkgPSB0aGlzLm9wdGlvbnMubGFiZWwuZm9udEZhbWlseSlcclxuXHJcbiAgICBsZXQgbmFtZSA9IGdldEZvbnRGYW1pbHlOYW1lKHRoaXMubGFiZWxGb250RmFtaWx5KSB8fCAnJ1xyXG4gICAgdGhpcy5fZWxtcy5sYWJlbEZvbnRGYW1pbHkgJiZcclxuICAgICAgdGhpcy5fZWxtcy5sYWJlbEZvbnRGYW1pbHkuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICBpdGVtLnZhbHVlID0gbmFtZVxyXG4gICAgICB9KVxyXG4gIH1cclxuXHJcbiAgZ2V0IGxhYmVsQ29sb3IoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmxhYmVsLmNvbG9yXHJcbiAgfVxyXG4gIHNldCBsYWJlbENvbG9yKHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5sYWJlbC5jb2xvciA9IHZcclxuICAgIHRoaXMubGFiZWwuY29sb3IgPSB2XHJcbiAgICBpZiAodGhpcy5fZWxtcy5sYWJlbENvbG9yKSB7XHJcbiAgICAgIHRoaXMuX2VsbXMubGFiZWxDb2xvci5mb3JFYWNoKChpdGVtLCBpKSA9PiB7XHJcbiAgICAgICAgbGV0IGxhYmVsQ29sb3JQaWNrZXIgPSBuZXcgWUpDb2xvclBpY2tlcih7XHJcbiAgICAgICAgICBlbDogaXRlbS5lbCxcclxuICAgICAgICAgIHNpemU6ICdtaW5pJywvL+minOiJsmJveOexu+Wei1xyXG4gICAgICAgICAgYWxwaGE6IHRydWUsLy/mmK/lkKblvIDlkK/pgI/mmI7luqZcclxuICAgICAgICAgIGRlZmF1bHRDb2xvcjogdGhpcy5sYWJlbENvbG9yLFxyXG4gICAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLC8v5piv5ZCm56aB5q2i5omT5byA6aKc6Imy6YCJ5oup5ZmoXHJcbiAgICAgICAgICBvcGVuUGlja2VyQW5pOiAnb3BhY2l0eScsLy/miZPlvIDpopzoibLpgInmi6nlmajliqjnlLtcclxuICAgICAgICAgIHN1cmU6IChjb2xvcikgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxhYmVsQ29sb3IgPSBjb2xvclxyXG4gICAgICAgICAgfSwvL+eCueWHu+ehruiupOaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICAgICAgY2xlYXI6ICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5sYWJlbENvbG9yID0gJ3JnYmEoMjU1LDI1NSwyNTUsMSknXHJcbiAgICAgICAgICB9LC8v54K55Ye75riF56m65oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgICAgfSlcclxuICAgICAgICB0aGlzLl9lbG1zLmxhYmVsQ29sb3JbaV0gPSBsYWJlbENvbG9yUGlja2VyXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgbGFiZWxGb250U2l6ZSgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubGFiZWwuZm9udFNpemVcclxuICB9XHJcbiAgc2V0IGxhYmVsRm9udFNpemUodikge1xyXG4gICAgdGhpcy5vcHRpb25zLmxhYmVsLmZvbnRTaXplID0gdlxyXG4gICAgdGhpcy5sYWJlbC5mb250U2l6ZSA9IHZcclxuICAgIHRoaXMuX2VsbXMubGFiZWxGb250U2l6ZSAmJiB0aGlzLl9lbG1zLmxhYmVsRm9udFNpemUuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICBpdGVtLnZhbHVlID0gdlxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGdldCBsYWJlbFNjYWxlQnlEaXN0YW5jZSgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubGFiZWwuc2NhbGVCeURpc3RhbmNlXHJcbiAgfVxyXG4gIHNldCBsYWJlbFNjYWxlQnlEaXN0YW5jZSh2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMubGFiZWwuc2NhbGVCeURpc3RhbmNlID0gdlxyXG4gICAgdGhpcy5sYWJlbC5zY2FsZUJ5RGlzdGFuY2UgPSB2XHJcbiAgICB0aGlzLl9lbG1zLmxhYmVsU2NhbGVCeURpc3RhbmNlICYmIHRoaXMuX2VsbXMubGFiZWxTY2FsZUJ5RGlzdGFuY2UuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICBpdGVtLmNoZWNrZWQgPSB2XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgZ2V0IGxhYmVsTmVhcigpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubGFiZWwubmVhclxyXG4gIH1cclxuICBzZXQgbGFiZWxOZWFyKHYpIHtcclxuICAgIGxldCBuZWFyID0gdlxyXG4gICAgaWYgKG5lYXIgPiB0aGlzLmxhYmVsRmFyKSB7XHJcbiAgICAgIG5lYXIgPSB0aGlzLmxhYmVsRmFyXHJcbiAgICB9XHJcbiAgICB0aGlzLm9wdGlvbnMubGFiZWwubmVhciA9IG5lYXJcclxuICAgIHRoaXMubGFiZWwubmVhciA9IG5lYXJcclxuICAgIHRoaXMuX2VsbXMubGFiZWxOZWFyICYmIHRoaXMuX2VsbXMubGFiZWxOZWFyLmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgaXRlbS52YWx1ZSA9IG5lYXJcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBnZXQgbGFiZWxGYXIoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmxhYmVsLmZhclxyXG4gIH1cclxuICBzZXQgbGFiZWxGYXIodikge1xyXG4gICAgbGV0IGZhciA9IHZcclxuICAgIGlmIChmYXIgPCB0aGlzLmxhYmVsTmVhcikge1xyXG4gICAgICBmYXIgPSB0aGlzLmxhYmVsTmVhclxyXG4gICAgfVxyXG4gICAgdGhpcy5vcHRpb25zLmxhYmVsLmZhciA9IGZhclxyXG4gICAgdGhpcy5sYWJlbC5mYXIgPSBmYXJcclxuICAgIHRoaXMuX2VsbXMubGFiZWxGYXIgJiYgdGhpcy5fZWxtcy5sYWJlbEZhci5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgIGl0ZW0udmFsdWUgPSBmYXJcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBnZXQgbGFiZWxMaW5lV2lkdGgoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmxhYmVsLmxpbmVXaWR0aFxyXG4gIH1cclxuICBzZXQgbGFiZWxMaW5lV2lkdGgodikge1xyXG4gICAgdGhpcy5vcHRpb25zLmxhYmVsLmxpbmVXaWR0aCA9IHZcclxuICAgIHRoaXMubGFiZWwubGluZVdpZHRoID0gdlxyXG4gICAgdGhpcy5fZWxtcy5sYWJlbExpbmVXaWR0aCAmJiB0aGlzLl9lbG1zLmxhYmVsTGluZVdpZHRoLmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgaXRlbS52YWx1ZSA9IHZcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBnZXQgbGFiZWxQaXhlbE9mZnNldCgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubGFiZWwucGl4ZWxPZmZzZXRcclxuICB9XHJcbiAgc2V0IGxhYmVsUGl4ZWxPZmZzZXQodikge1xyXG4gICAgdGhpcy5vcHRpb25zLmxhYmVsLnBpeGVsT2Zmc2V0ID0gdlxyXG4gICAgdGhpcy5sYWJlbC5waXhlbE9mZnNldCA9IHZcclxuICAgIHRoaXMuX2VsbXMubGFiZWxQaXhlbE9mZnNldCAmJiB0aGlzLl9lbG1zLmxhYmVsUGl4ZWxPZmZzZXQuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICBpdGVtLnZhbHVlID0gdlxyXG4gICAgfSlcclxuICB9XHJcbiAgZ2V0IGxhYmVsTGluZUNvbG9yKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5sYWJlbC5saW5lQ29sb3JcclxuICB9XHJcbiAgc2V0IGxhYmVsTGluZUNvbG9yKHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5sYWJlbC5saW5lQ29sb3IgPSB2XHJcbiAgICB0aGlzLmxhYmVsLmxpbmVDb2xvciA9IHZcclxuICAgIGlmICh0aGlzLl9lbG1zLmxhYmVsTGluZUNvbG9yKSB7XHJcbiAgICAgIHRoaXMuX2VsbXMubGFiZWxMaW5lQ29sb3IuZm9yRWFjaCgoaXRlbSwgaSkgPT4ge1xyXG4gICAgICAgIGxldCBsaW5lQ29sb3JQaWNrZXIgPSBuZXcgWUpDb2xvclBpY2tlcih7XHJcbiAgICAgICAgICBlbDogaXRlbS5lbCxcclxuICAgICAgICAgIHNpemU6ICdtaW5pJywvL+minOiJsmJveOexu+Wei1xyXG4gICAgICAgICAgYWxwaGE6IHRydWUsLy/mmK/lkKblvIDlkK/pgI/mmI7luqZcclxuICAgICAgICAgIGRlZmF1bHRDb2xvcjogdGhpcy5sYWJlbExpbmVDb2xvcixcclxuICAgICAgICAgIGRpc2FibGVkOiBmYWxzZSwvL+aYr+WQpuemgeatouaJk+W8gOminOiJsumAieaLqeWZqFxyXG4gICAgICAgICAgb3BlblBpY2tlckFuaTogJ29wYWNpdHknLC8v5omT5byA6aKc6Imy6YCJ5oup5Zmo5Yqo55S7XHJcbiAgICAgICAgICBzdXJlOiAoY29sb3IpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5sYWJlbExpbmVDb2xvciA9IGNvbG9yXHJcbiAgICAgICAgICB9LC8v54K55Ye756Gu6K6k5oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgICAgICBjbGVhcjogKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxhYmVsTGluZUNvbG9yID0gJ3JnYmEoMCwyNTUsMjU1LDAuNSknXHJcbiAgICAgICAgICB9LC8v54K55Ye75riF56m65oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgICAgfSlcclxuICAgICAgICB0aGlzLl9lbG1zLmxhYmVsTGluZUNvbG9yW2ldID0gbGluZUNvbG9yUGlja2VyXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgbGFiZWxCYWNrZ3JvdW5kQ29sb3JTdGFydCgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubGFiZWwuYmFja2dyb3VuZENvbG9yWzBdXHJcbiAgfVxyXG4gIHNldCBsYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0KHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5sYWJlbC5iYWNrZ3JvdW5kQ29sb3JbMF0gPSB2XHJcbiAgICB0aGlzLmxhYmVsLmJhY2tncm91bmRDb2xvciA9IFt2LCB0aGlzLmxhYmVsLmJhY2tncm91bmRDb2xvclsxXV1cclxuICAgIGlmICh0aGlzLl9lbG1zLmxhYmVsQmFja2dyb3VuZENvbG9yU3RhcnQpIHtcclxuICAgICAgdGhpcy5fZWxtcy5sYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0LmZvckVhY2goKGl0ZW0sIGkpID0+IHtcclxuICAgICAgICBsZXQgbGFiZWxCYWNrZ3JvdW5kQ29sb3JTdGFydFBpY2tlciA9IG5ldyBZSkNvbG9yUGlja2VyKHtcclxuICAgICAgICAgIGVsOiBpdGVtLmVsLFxyXG4gICAgICAgICAgc2l6ZTogJ21pbmknLC8v6aKc6ImyYm9457G75Z6LXHJcbiAgICAgICAgICBhbHBoYTogdHJ1ZSwvL+aYr+WQpuW8gOWQr+mAj+aYjuW6plxyXG4gICAgICAgICAgZGVmYXVsdENvbG9yOiB0aGlzLmxhYmVsQmFja2dyb3VuZENvbG9yU3RhcnQsXHJcbiAgICAgICAgICBkaXNhYmxlZDogZmFsc2UsLy/mmK/lkKbnpoHmraLmiZPlvIDpopzoibLpgInmi6nlmahcclxuICAgICAgICAgIG9wZW5QaWNrZXJBbmk6ICdvcGFjaXR5JywvL+aJk+W8gOminOiJsumAieaLqeWZqOWKqOeUu1xyXG4gICAgICAgICAgc3VyZTogKGNvbG9yKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JTdGFydCA9IGNvbG9yXHJcbiAgICAgICAgICB9LC8v54K55Ye756Gu6K6k5oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgICAgICBjbGVhcjogKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxhYmVsQmFja2dyb3VuZENvbG9yU3RhcnQgPSAncmdiYSgyNTUsMjU1LDI1NSwxKSdcclxuICAgICAgICAgIH0sLy/ngrnlh7vmuIXnqbrmjInpkq7kuovku7blm57osINcclxuICAgICAgICB9KVxyXG4gICAgICAgIHRoaXMuX2VsbXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JTdGFydFtpXSA9IGxhYmVsQmFja2dyb3VuZENvbG9yU3RhcnRQaWNrZXJcclxuICAgICAgfSlcclxuICAgIH1cclxuICB9XHJcbiAgZ2V0IGxhYmVsQmFja2dyb3VuZENvbG9yRW5kKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5sYWJlbC5iYWNrZ3JvdW5kQ29sb3JbMV1cclxuICB9XHJcbiAgc2V0IGxhYmVsQmFja2dyb3VuZENvbG9yRW5kKHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5sYWJlbC5iYWNrZ3JvdW5kQ29sb3JbMV0gPSB2XHJcbiAgICB0aGlzLmxhYmVsLmJhY2tncm91bmRDb2xvciA9IFt0aGlzLmxhYmVsLmJhY2tncm91bmRDb2xvclswXSwgdl1cclxuICAgIGlmICh0aGlzLl9lbG1zLmxhYmVsQmFja2dyb3VuZENvbG9yRW5kKSB7XHJcbiAgICAgIHRoaXMuX2VsbXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmQuZm9yRWFjaCgoaXRlbSwgaSkgPT4ge1xyXG4gICAgICAgIGxldCBsYWJlbEJhY2tncm91bmRDb2xvckVuZFBpY2tlciA9IG5ldyBZSkNvbG9yUGlja2VyKHtcclxuICAgICAgICAgIGVsOiBpdGVtLmVsLFxyXG4gICAgICAgICAgc2l6ZTogJ21pbmknLC8v6aKc6ImyYm9457G75Z6LXHJcbiAgICAgICAgICBhbHBoYTogdHJ1ZSwvL+aYr+WQpuW8gOWQr+mAj+aYjuW6plxyXG4gICAgICAgICAgZGVmYXVsdENvbG9yOiB0aGlzLmxhYmVsQmFja2dyb3VuZENvbG9yRW5kLFxyXG4gICAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLC8v5piv5ZCm56aB5q2i5omT5byA6aKc6Imy6YCJ5oup5ZmoXHJcbiAgICAgICAgICBvcGVuUGlja2VyQW5pOiAnb3BhY2l0eScsLy/miZPlvIDpopzoibLpgInmi6nlmajliqjnlLtcclxuICAgICAgICAgIHN1cmU6IChjb2xvcikgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxhYmVsQmFja2dyb3VuZENvbG9yRW5kID0gY29sb3JcclxuICAgICAgICAgIH0sLy/ngrnlh7vnoa7orqTmjInpkq7kuovku7blm57osINcclxuICAgICAgICAgIGNsZWFyOiAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmQgPSAncmdiYSgyNTUsMjU1LDI1NSwxKSdcclxuICAgICAgICAgIH0sLy/ngrnlh7vmuIXnqbrmjInpkq7kuovku7blm57osINcclxuICAgICAgICB9KVxyXG4gICAgICAgIHRoaXMuX2VsbXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmRbaV0gPSBsYWJlbEJhY2tncm91bmRDb2xvckVuZFBpY2tlclxyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IGF0dHJpYnV0ZVR5cGUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZVR5cGVcclxuICB9XHJcblxyXG4gIHNldCBhdHRyaWJ1dGVUeXBlKHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGVUeXBlID0gdlxyXG4gICAgdGhpcy5fZWxtcy5hdHRyaWJ1dGVUeXBlICYmIHRoaXMuX2VsbXMuYXR0cmlidXRlVHlwZS5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgIGl0ZW0udmFsdWUgPSB2XHJcbiAgICB9KVxyXG4gICAgbGV0IGF0dHJpYnV0ZUNvbnRlbnQgPSB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdhdHRyaWJ1dGUtY29udGVudCcpXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGF0dHJpYnV0ZUNvbnRlbnQubGVuZ3RoOyBpKyspIHtcclxuICAgICAgaWYgKGF0dHJpYnV0ZUNvbnRlbnRbaV0uY2xhc3NOYW1lLmluZGV4T2YoJ2F0dHJpYnV0ZS1jb250ZW50LScgKyB2KSA+IC0xKSB7XHJcbiAgICAgICAgYXR0cmlidXRlQ29udGVudFtpXS5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBhdHRyaWJ1dGVDb250ZW50W2ldLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCBhdHRyaWJ1dGVMaW5rKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50XHJcbiAgfVxyXG5cclxuICBzZXQgYXR0cmlidXRlTGluayh2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudCA9IHZcclxuICAgIGlmICghdGhpcy5fRGlhbG9nT2JqZWN0IHx8ICF0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQgfHwgIXRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50IHx8IHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2F0dHJpYnV0ZS1jb250ZW50LWxpbmsnKS5sZW5ndGggPT0gMCkge1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuICAgIGxldCB0YWJsZSA9IHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2F0dHJpYnV0ZS1jb250ZW50LWxpbmsnKVsxXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0YWJsZScpWzBdXHJcbiAgICBsZXQgdGFibGVDb250ZW50ID0gdGFibGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndGFibGUtYm9keScpWzBdXHJcbiAgICB0YWJsZUNvbnRlbnQuaW5uZXJIVE1MID0gJydcclxuICAgIGlmICh0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudC5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRhYmxlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RhYmxlLWVtcHR5JylbMF0uc3R5bGUuZGlzcGxheSA9ICdub25lJ1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRhYmxlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RhYmxlLWVtcHR5JylbMF0uc3R5bGUuZGlzcGxheSA9ICdmbGV4J1xyXG4gICAgfVxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudC5sZW5ndGg7IGkrKykge1xyXG4gICAgICBsZXQgdHIgPSBgXHJcbiAgICAgIDxkaXYgY2xhc3M9XCJ0clwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRkXCI+YCArIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50W2ldLm5hbWUgKyBgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidGRcIj5gICsgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnRbaV0udXJsICsgYDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRkXCI+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvbiBAY2xpY2s9XCJsaW5rRWRpdFwiPue8lui+kTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gQGNsaWNrPVwibGlua0RlbGV0ZVwiPuWIoOmZpDwvYnV0dG9uPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PmBcclxuICAgICAgbGV0IHRyRWxtID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKS5jcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQodHIpXHJcbiAgICAgIHRhYmxlQ29udGVudC5hcHBlbmRDaGlsZCh0ckVsbSlcclxuICAgIH1cclxuICAgIGxldCBpdGVtID0gdGFibGVDb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RyJylcclxuICAgIGxldCBmdW4gPSB7XHJcbiAgICAgIGxpbmtFZGl0OiBhc3luYyAoaW5kZXgpID0+IHtcclxuICAgICAgICB0aGlzLmF0dHJpYnV0ZUxpbmsgPSBhd2FpdCB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudFxyXG4gICAgICAgIGxldCB0YWJsZSA9IHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2F0dHJpYnV0ZS1jb250ZW50LWxpbmsnKVsxXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0YWJsZScpWzBdXHJcbiAgICAgICAgbGV0IHRhYmxlQ29udGVudCA9IHRhYmxlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RhYmxlLWJvZHknKVswXVxyXG4gICAgICAgIGxldCBpdGVtID0gdGFibGVDb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RyJylcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW0ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGlmIChpbmRleCA9PT0gaSkge1xyXG4gICAgICAgICAgICBsZXQgaGVpZ2h0ID0gaXRlbVtpXS5vZmZzZXRIZWlnaHRcclxuICAgICAgICAgICAgbGV0IGh0bWwgPSBgXHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRkXCI+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJpbnB1dFwiIHR5cGU9XCJ0ZXh0XCI+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRkXCI+XHJcbiAgICAgICAgICAgICAgICA8dGV4dGFyZWEgY2xhc3M9XCJpbnB1dCBsaW5rLWVkaXRcIiB0eXBlPVwidGV4dFwiPjwvdGV4dGFyZWE+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRkXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxidXR0b24gQGNsaWNrPVwiY29uZmlybUVkaXRcIj7noa7orqQ8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBAY2xpY2s9XCJjYW5jZWxFZGl0XCI+5Y+W5raIPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgPC9kaXY+YFxyXG4gICAgICAgICAgICBpdGVtW2ldLmlubmVySFRNTCA9IGh0bWxcclxuICAgICAgICAgICAgbGV0IHRleHRhcmVhRWxtID0gaXRlbVtpXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdsaW5rLWVkaXQnKVswXVxyXG4gICAgICAgICAgICB0ZXh0YXJlYUVsbS5zdHlsZS5oZWlnaHQgPSAoaGVpZ2h0IC0gMTApICsgJ3B4J1xyXG4gICAgICAgICAgICBsZXQgdGQgPSBpdGVtW2ldLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RkJylcclxuICAgICAgICAgICAgdGRbMF0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaW5wdXQnKVswXS52YWx1ZSA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50W2luZGV4XS5uYW1lXHJcbiAgICAgICAgICAgIHRkWzFdLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2lucHV0JylbMF0udmFsdWUgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudFtpbmRleF0udXJsXHJcbiAgICAgICAgICAgIGxldCBidG4gPSBpdGVtW2ldLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdidXR0b24nKVxyXG4gICAgICAgICAgICBmb3IgKGxldCBuID0gMDsgbiA8IGJ0bi5sZW5ndGg7IG4rKykge1xyXG4gICAgICAgICAgICAgIGlmICghYnRuW25dIHx8ICFidG5bbl0uYXR0cmlidXRlcykge1xyXG4gICAgICAgICAgICAgICAgY29udGludWVcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgZm9yIChsZXQgbSBvZiBidG5bbl0uYXR0cmlidXRlcykge1xyXG4gICAgICAgICAgICAgICAgaWYgKG0ubmFtZSA9PT0gJ0BjbGljaycpIHtcclxuICAgICAgICAgICAgICAgICAgYnRuW25dLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIChmdW5bbS52YWx1ZV0pID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBmdW5bbS52YWx1ZV0oeyBuYW1lOiB0ZFswXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdpbnB1dCcpWzBdLnZhbHVlLCB1cmw6IHRkWzFdLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2lucHV0JylbMF0udmFsdWUgfSwgaSlcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICBidG5bbl0uYXR0cmlidXRlcy5yZW1vdmVOYW1lZEl0ZW0obS5uYW1lKVxyXG4gICAgICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgbGlua0RlbGV0ZTogKGkpID0+IHtcclxuICAgICAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudC5zcGxpY2UoaSwgMSlcclxuICAgICAgICB0aGlzLmF0dHJpYnV0ZUxpbmsgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudFxyXG4gICAgICB9LFxyXG5cclxuICAgICAgY29uZmlybUVkaXQ6ICh2YWx1ZSwgaSkgPT4ge1xyXG4gICAgICAgIGxldCBuYW1lID0gdmFsdWUubmFtZSAmJiB2YWx1ZS5uYW1lLnJlcGxhY2UoL1xccy9nLCBcIlwiKVxyXG4gICAgICAgIGxldCB1cmwgPSB2YWx1ZS51cmwgJiYgdmFsdWUudXJsLnJlcGxhY2UoL1xccy9nLCBcIlwiKVxyXG4gICAgICAgIGlmIChuYW1lICYmIHVybCkge1xyXG4gICAgICAgICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnRbaV0gPSB2YWx1ZVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIHdpbmRvdy5FTEVNRU5UICYmIHdpbmRvdy5FTEVNRU5ULk1lc3NhZ2Uoe1xyXG4gICAgICAgICAgICBtZXNzYWdlOiAn5ZCN56ew5oiW6ZO+5o6l5LiN6IO95Li656m677yBJyxcclxuICAgICAgICAgICAgdHlwZTogJ3dhcm5pbmcnLFxyXG4gICAgICAgICAgICBkdXJhdGlvbjogMTUwMFxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuYXR0cmlidXRlTGluayA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50XHJcbiAgICAgIH0sXHJcbiAgICAgIGNhbmNlbEVkaXQ6ICgpID0+IHtcclxuICAgICAgICB0aGlzLmF0dHJpYnV0ZUxpbmsgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudFxyXG4gICAgICB9LFxyXG4gICAgICBmaWxlU2VsZWN0OiAodmFsdWUsIGkpID0+IHtcclxuICAgICAgICBsZXQgZmlsZUVsbSA9IGl0ZW1baV0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnZmlsZS1zZWxlY3QnKVswXVxyXG4gICAgICAgIGZpbGVFbG0uY2xpY2soKVxyXG4gICAgICAgIGZpbGVFbG0ucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgZmlsZVNlbGVjdClcclxuICAgICAgICBmaWxlRWxtLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGZpbGVTZWxlY3QpXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGxldCBmaWxlU2VsZWN0ID0gKGV2ZW50KSA9PiB7XHJcbiAgICAgIGlmIChldmVudC50YXJnZXQudmFsdWUpIHtcclxuICAgICAgICBsZXQgdGQgPSBpdGVtW2V2ZW50LnRhcmdldC5nZXRBdHRyaWJ1dGUoJ2luZGV4JyldLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RkJylcclxuICAgICAgICB0ZFsxXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdpbnB1dCcpWzBdLnZhbHVlID0gZXZlbnQudGFyZ2V0LnZhbHVlXHJcbiAgICAgICAgZXZlbnQudGFyZ2V0LnZhbHVlID0gbnVsbFxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW0ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgbGV0IGJ0biA9IGl0ZW1baV0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2J1dHRvbicpXHJcbiAgICAgIGZvciAobGV0IG4gPSAwOyBuIDwgYnRuLmxlbmd0aDsgbisrKSB7XHJcbiAgICAgICAgaWYgKCFidG5bbl0gfHwgIWJ0bltuXS5hdHRyaWJ1dGVzKSB7XHJcbiAgICAgICAgICBjb250aW51ZVxyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKGxldCBtIG9mIGJ0bltuXS5hdHRyaWJ1dGVzKSB7XHJcbiAgICAgICAgICBpZiAobS5uYW1lID09PSAnQGNsaWNrJykge1xyXG4gICAgICAgICAgICBidG5bbl0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgKGZ1blttLnZhbHVlXSkgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgICAgIGZ1blttLnZhbHVlXShpKVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGJ0bltuXS5hdHRyaWJ1dGVzLnJlbW92ZU5hbWVkSXRlbShtLm5hbWUpXHJcbiAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuXHJcblxyXG4gIH1cclxuXHJcbiAgZ2V0IGF0dHJpYnV0ZUNhbWVyYSgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmNhbWVyYS5jb250ZW50XHJcbiAgfVxyXG5cclxuICBzZXQgYXR0cmlidXRlQ2FtZXJhKHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUuY2FtZXJhLmNvbnRlbnQgPSB2XHJcbiAgfVxyXG5cclxuICBnZXQgYXR0cmlidXRlVnIoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52ci5jb250ZW50XHJcbiAgfVxyXG5cclxuICBzZXQgYXR0cmlidXRlVnIodikge1xyXG4gICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52ci5jb250ZW50ID0gdlxyXG4gICAgaWYgKCF0aGlzLl9EaWFsb2dPYmplY3QgfHwgIXRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudCB8fCAhdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQgfHwgdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnYXR0cmlidXRlLWNvbnRlbnQtdnInKS5sZW5ndGggPT0gMCkge1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuICAgIGxldCB0YWJsZSA9IHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2F0dHJpYnV0ZS1jb250ZW50LXZyJylbMV0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndGFibGUnKVswXVxyXG4gICAgbGV0IHRhYmxlQ29udGVudCA9IHRhYmxlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RhYmxlLWJvZHknKVswXVxyXG4gICAgdGFibGVDb250ZW50LmlubmVySFRNTCA9ICcnXHJcbiAgICBpZiAodGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52ci5jb250ZW50Lmxlbmd0aCA+IDApIHtcclxuICAgICAgdGFibGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndGFibGUtZW1wdHknKVswXS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnXHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGFibGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndGFibGUtZW1wdHknKVswXS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnXHJcbiAgICB9XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudC5sZW5ndGg7IGkrKykge1xyXG4gICAgICBsZXQgdHIgPSBgXHJcbiAgICAgIDxkaXYgY2xhc3M9XCJ0clwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRkXCI+YCArIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudFtpXS5uYW1lICsgYDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRkXCI+YCArIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudFtpXS51cmwgKyBgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidGRcIj5cclxuICAgICAgICAgICAgICA8YnV0dG9uIEBjbGljaz1cInZyRWRpdFwiPue8lui+kTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gQGNsaWNrPVwidnJEZWxldGVcIj7liKDpmaQ8L2J1dHRvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5gXHJcbiAgICAgIGxldCB0ckVsbSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCkuY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50KHRyKVxyXG4gICAgICB0YWJsZUNvbnRlbnQuYXBwZW5kQ2hpbGQodHJFbG0pXHJcbiAgICB9XHJcbiAgICBsZXQgaXRlbSA9IHRhYmxlQ29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0cicpXHJcbiAgICBsZXQgZnVuID0ge1xyXG4gICAgICB2ckVkaXQ6IGFzeW5jIChpbmRleCkgPT4ge1xyXG4gICAgICAgIHRoaXMuYXR0cmlidXRlVnIgPSBhd2FpdCB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnRcclxuICAgICAgICBsZXQgdGFibGUgPSB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdhdHRyaWJ1dGUtY29udGVudC12cicpWzFdLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RhYmxlJylbMF1cclxuICAgICAgICBsZXQgdGFibGVDb250ZW50ID0gdGFibGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndGFibGUtYm9keScpWzBdXHJcbiAgICAgICAgbGV0IGl0ZW0gPSB0YWJsZUNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndHInKVxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgaWYgKGluZGV4ID09PSBpKSB7XHJcbiAgICAgICAgICAgIGxldCBoZWlnaHQgPSBpdGVtW2ldLm9mZnNldEhlaWdodFxyXG4gICAgICAgICAgICBsZXQgaHRtbCA9IGBcclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGRcIj5cclxuICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImlucHV0XCIgdHlwZT1cInRleHRcIj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGRcIj5cclxuICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBjbGFzcz1cImlucHV0IGxpbmstZWRpdFwiIHR5cGU9XCJ0ZXh0XCI+PC90ZXh0YXJlYT5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGRcIj5cclxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBAY2xpY2s9XCJjb25maXJtRWRpdFwiPuehruiupDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICA8YnV0dG9uIEBjbGljaz1cImNhbmNlbEVkaXRcIj7lj5bmtog8L2J1dHRvbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5gXHJcbiAgICAgICAgICAgIGl0ZW1baV0uaW5uZXJIVE1MID0gaHRtbFxyXG4gICAgICAgICAgICBsZXQgdGV4dGFyZWFFbG0gPSBpdGVtW2ldLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xpbmstZWRpdCcpWzBdXHJcbiAgICAgICAgICAgIHRleHRhcmVhRWxtLnN0eWxlLmhlaWdodCA9IChoZWlnaHQgLSAxMCkgKyAncHgnXHJcbiAgICAgICAgICAgIGxldCB0ZCA9IGl0ZW1baV0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndGQnKVxyXG4gICAgICAgICAgICB0ZFswXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdpbnB1dCcpWzBdLnZhbHVlID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52ci5jb250ZW50W2luZGV4XS5uYW1lXHJcbiAgICAgICAgICAgIHRkWzFdLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2lucHV0JylbMF0udmFsdWUgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnRbaW5kZXhdLnVybFxyXG4gICAgICAgICAgICBsZXQgYnRuID0gaXRlbVtpXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnYnV0dG9uJylcclxuICAgICAgICAgICAgZm9yIChsZXQgbiA9IDA7IG4gPCBidG4ubGVuZ3RoOyBuKyspIHtcclxuICAgICAgICAgICAgICBpZiAoIWJ0bltuXSB8fCAhYnRuW25dLmF0dHJpYnV0ZXMpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGZvciAobGV0IG0gb2YgYnRuW25dLmF0dHJpYnV0ZXMpIHtcclxuICAgICAgICAgICAgICAgIGlmIChtLm5hbWUgPT09ICdAY2xpY2snKSB7XHJcbiAgICAgICAgICAgICAgICAgIGJ0bltuXS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiAoZnVuW20udmFsdWVdKSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgZnVuW20udmFsdWVdKHsgbmFtZTogdGRbMF0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaW5wdXQnKVswXS52YWx1ZSwgdXJsOiB0ZFsxXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdpbnB1dCcpWzBdLnZhbHVlIH0sIGkpXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgYnRuW25dLmF0dHJpYnV0ZXMucmVtb3ZlTmFtZWRJdGVtKG0ubmFtZSlcclxuICAgICAgICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIHZyRGVsZXRlOiAoaSkgPT4ge1xyXG4gICAgICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudC5zcGxpY2UoaSwgMSlcclxuICAgICAgICB0aGlzLmF0dHJpYnV0ZVZyID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52ci5jb250ZW50XHJcbiAgICAgIH0sXHJcblxyXG4gICAgICBjb25maXJtRWRpdDogKHZhbHVlLCBpKSA9PiB7XHJcbiAgICAgICAgbGV0IG5hbWUgPSB2YWx1ZS5uYW1lICYmIHZhbHVlLm5hbWUucmVwbGFjZSgvXFxzL2csIFwiXCIpXHJcbiAgICAgICAgbGV0IHVybCA9IHZhbHVlLnVybCAmJiB2YWx1ZS51cmwucmVwbGFjZSgvXFxzL2csIFwiXCIpXHJcbiAgICAgICAgaWYgKG5hbWUgJiYgdXJsKSB7XHJcbiAgICAgICAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnRbaV0gPSB2YWx1ZVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIHdpbmRvdy5FTEVNRU5UICYmIHdpbmRvdy5FTEVNRU5ULk1lc3NhZ2Uoe1xyXG4gICAgICAgICAgICBtZXNzYWdlOiAn5ZCN56ew5oiW6ZO+5o6l5LiN6IO95Li656m677yBJyxcclxuICAgICAgICAgICAgdHlwZTogJ3dhcm5pbmcnLFxyXG4gICAgICAgICAgICBkdXJhdGlvbjogMTUwMFxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuYXR0cmlidXRlVnIgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnRcclxuICAgICAgfSxcclxuICAgICAgY2FuY2VsRWRpdDogKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuYXR0cmlidXRlVnIgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnRcclxuICAgICAgfSxcclxuICAgICAgZmlsZVNlbGVjdDogKHZhbHVlLCBpKSA9PiB7XHJcbiAgICAgICAgbGV0IGZpbGVFbG0gPSBpdGVtW2ldLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2ZpbGUtc2VsZWN0JylbMF1cclxuICAgICAgICBmaWxlRWxtLmNsaWNrKClcclxuICAgICAgICBmaWxlRWxtLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGZpbGVTZWxlY3QpXHJcbiAgICAgICAgZmlsZUVsbS5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBmaWxlU2VsZWN0KVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBsZXQgZmlsZVNlbGVjdCA9IChldmVudCkgPT4ge1xyXG4gICAgICBpZiAoZXZlbnQudGFyZ2V0LnZhbHVlKSB7XHJcbiAgICAgICAgbGV0IHRkID0gaXRlbVtldmVudC50YXJnZXQuZ2V0QXR0cmlidXRlKCdpbmRleCcpXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0ZCcpXHJcbiAgICAgICAgdGRbMV0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaW5wdXQnKVswXS52YWx1ZSA9IGV2ZW50LnRhcmdldC52YWx1ZVxyXG4gICAgICAgIGV2ZW50LnRhcmdldC52YWx1ZSA9IG51bGxcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpdGVtLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGxldCBidG4gPSBpdGVtW2ldLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdidXR0b24nKVxyXG4gICAgICBmb3IgKGxldCBuID0gMDsgbiA8IGJ0bi5sZW5ndGg7IG4rKykge1xyXG4gICAgICAgIGlmICghYnRuW25dIHx8ICFidG5bbl0uYXR0cmlidXRlcykge1xyXG4gICAgICAgICAgY29udGludWVcclxuICAgICAgICB9XHJcbiAgICAgICAgZm9yIChsZXQgbSBvZiBidG5bbl0uYXR0cmlidXRlcykge1xyXG4gICAgICAgICAgaWYgKG0ubmFtZSA9PT0gJ0BjbGljaycpIHtcclxuICAgICAgICAgICAgYnRuW25dLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcclxuICAgICAgICAgICAgICBpZiAodHlwZW9mIChmdW5bbS52YWx1ZV0pID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgICAgICBmdW5bbS52YWx1ZV0oaSlcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBidG5bbl0uYXR0cmlidXRlcy5yZW1vdmVOYW1lZEl0ZW0obS5uYW1lKVxyXG4gICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IGF0dHJpYnV0ZUdvb2RzKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUuZ29vZHMuY29udGVudFxyXG4gIH1cclxuXHJcbiAgc2V0IGF0dHJpYnV0ZUdvb2RzKHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUuZ29vZHMuY29udGVudCA9IHZcclxuICB9XHJcblxyXG4gIHN0YXRpYyBjcmVhdGUodGhhdCkge1xyXG4gICAgbGV0IHBvc2l0aW9ucyA9IHRoYXQub3B0aW9ucy5wb3NpdGlvbnNcclxuICAgIGxldCBmcm9tRGVncmVlc0FycmF5ID0gW11cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGZyb21EZWdyZWVzQXJyYXkucHVzaChwb3NpdGlvbnNbaV0ubG5nLCBwb3NpdGlvbnNbaV0ubGF0KVxyXG4gICAgfVxyXG4gICAgdGhhdC5wb3NpdGlvbnMgPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlc0FycmF5KGZyb21EZWdyZWVzQXJyYXkpXHJcbiAgICBsZXQgcG9zaXRpb25zQSA9IHRoYXQuY29tcHV0ZVBpbmNlckFycm93KHRoYXQub3B0aW9ucy5wb3NpdGlvbnMpXHJcbiAgICBpZiAocG9zaXRpb25zQS5sZW5ndGggPT0gMCkge1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuXHJcbiAgICBsZXQgcG9pbnRzID0gW1tdXVxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb3NpdGlvbnNBLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGxldCBwb3NpdGlvbiA9IHRoYXQuY2FydGVzaWFuM1Rvd2dzODQocG9zaXRpb25zQVtpXSwgdGhhdC5zZGsudmlld2VyKVxyXG4gICAgICBwb2ludHNbMF0ucHVzaChbcG9zaXRpb24ubG5nLCBwb3NpdGlvbi5sYXRdKVxyXG4gICAgfVxyXG4gICAgbGV0IHBvc2l0aW9uID0gdGhhdC5jYXJ0ZXNpYW4zVG93Z3M4NChwb3NpdGlvbnNBWzBdLCB0aGF0LnNkay52aWV3ZXIpXHJcbiAgICBwb2ludHNbMF0ucHVzaChbcG9zaXRpb24ubG5nLCBwb3NpdGlvbi5sYXRdKVxyXG4gICAgbGV0IHBvbHlnb24gPSB0dXJmLnBvbHlnb24ocG9pbnRzKTtcclxuICAgIC8vIGxldCBjZW50cm9pZCA9IHR1cmYuY2VudHJvaWQocG9seWdvbik7XHJcbiAgICBsZXQgY2VudHJvaWQgPSB0dXJmLnBvaW50T25GZWF0dXJlKHBvbHlnb24pO1xyXG5cclxuXHJcbiAgICBsZXQgZ3JvdW5kXHJcbiAgICBsZXQgaGVpZ2h0ID0gMFxyXG5cclxuICAgIHN3aXRjaCAodGhhdC5vcHRpb25zLmhlaWdodE1vZGUpIHtcclxuICAgICAgY2FzZSAnMCc6XHJcbiAgICAgIGNhc2UgMDpcclxuICAgICAgICBncm91bmQgPSBmYWxzZVxyXG4gICAgICAgIGJyZWFrXHJcbiAgICAgIGNhc2UgJzEnOlxyXG4gICAgICBjYXNlIDE6XHJcbiAgICAgICAgaGVpZ2h0ID0gdGhhdC5zZGsudmlld2VyLnNjZW5lLmdsb2JlLmdldEhlaWdodChDZXNpdW0uQ2FydG9ncmFwaGljLmZyb21EZWdyZWVzKGNlbnRyb2lkLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzBdLCBjZW50cm9pZC5nZW9tZXRyeS5jb29yZGluYXRlc1sxXSkpIHx8IDBcclxuICAgICAgICBncm91bmQgPSBmYWxzZVxyXG4gICAgICAgIGJyZWFrXHJcbiAgICAgIGNhc2UgJzInOlxyXG4gICAgICBjYXNlIDI6XHJcbiAgICAgICAgZ3JvdW5kID0gdHJ1ZVxyXG4gICAgICAgIGJyZWFrXHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCF0aGF0Lm9wdGlvbnMubGFiZWwucG9zaXRpb24pIHtcclxuICAgICAgdGhhdC5vcHRpb25zLmxhYmVsLnBvc2l0aW9uID0geyBsbmc6IGNlbnRyb2lkLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzBdLCBsYXQ6IGNlbnRyb2lkLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzFdLCBhbHQ6IHRoYXQuaGVpZ2h0ICsgaGVpZ2h0IH1cclxuICAgIH1cclxuXHJcbiAgICBsZXQgZnJvbURlZ3JlZXNBcnJheTIgPSBbXVxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb2ludHNbMF0ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgZnJvbURlZ3JlZXNBcnJheTIucHVzaChcclxuICAgICAgICBwb2ludHNbMF1baV1bMF0sXHJcbiAgICAgICAgcG9pbnRzWzBdW2ldWzFdLFxyXG4gICAgICAgIHRoYXQuaGVpZ2h0ICsgaGVpZ2h0XHJcbiAgICAgIClcclxuICAgIH1cclxuXHJcbiAgICBsZXQgbWF0ZXJpYWwgPSBDZXNpdW0uQ29sb3IuZnJvbUNzc0NvbG9yU3RyaW5nKHRoYXQub3B0aW9ucy5jb2xvcilcclxuICAgIGlmICh0aGF0LnNkay52aWV3ZXIuc2NlbmUubW9kZSA9PT0gMikge1xyXG4gICAgICBncm91bmQgPSBmYWxzZVxyXG4gICAgICBtYXRlcmlhbCA9IG5ldyBDZXNpdW0uQ3VzdG9tQ29sb3JNYXRlcmlhbFNvdXJjZSh7XHJcbiAgICAgICAgY29sb3I6IHRoYXQub3B0aW9ucy5jb2xvclxyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gICAgdGhhdC5vcHRpb25zLmxhYmVsLmdyb3VuZCA9IGdyb3VuZFxyXG5cclxuICAgIHRoYXQucG9zaXRpb25zSCA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzQXJyYXlIZWlnaHRzKGZyb21EZWdyZWVzQXJyYXkyKVxyXG5cclxuICAgIHRoYXQuZW50aXR5ID0gdGhhdC5zZGsudmlld2VyLmVudGl0aWVzLmFkZCh7XHJcbiAgICAgIGlkOiB0aGF0Lm9wdGlvbnMuaWQsXHJcbiAgICAgIHNob3c6IHRoYXQub3B0aW9ucy5zaG93LFxyXG4gICAgICBwb2x5Z29uOiB7XHJcbiAgICAgICAgaGllcmFyY2h5OiAhZ3JvdW5kID8gbmV3IENlc2l1bS5Qb2x5Z29uSGllcmFyY2h5KHRoYXQucG9zaXRpb25zSCkgOiBuZXcgQ2VzaXVtLlBvbHlnb25IaWVyYXJjaHkocG9zaXRpb25zQSksXHJcbiAgICAgICAgcGVyUG9zaXRpb25IZWlnaHQ6ICFncm91bmQgPyB0cnVlIDogZmFsc2UsXHJcbiAgICAgICAgbWF0ZXJpYWw6IG1hdGVyaWFsLFxyXG4gICAgICAgIHpJbmRleDogdGhhdC5zZGsuX2VudGl0eVpJbmRleFxyXG4gICAgICB9LFxyXG4gICAgICBwb2x5bGluZToge1xyXG4gICAgICAgIHBvc2l0aW9uczogWy4uLnRoYXQucG9zaXRpb25zSCwgdGhhdC5wb3NpdGlvbnNIWzBdLCB0aGF0LnBvc2l0aW9uc0hbMV1dLFxyXG4gICAgICAgIHdpZHRoOiB0aGF0Lm9wdGlvbnMubGluZS53aWR0aCxcclxuICAgICAgICBtYXRlcmlhbDogQ2VzaXVtLkNvbG9yLmZyb21Dc3NDb2xvclN0cmluZyh0aGF0Lm9wdGlvbnMubGluZS5jb2xvciksXHJcbiAgICAgICAgY2xhbXBUb0dyb3VuZDogIWdyb3VuZCA/IGZhbHNlIDogdHJ1ZSxcclxuICAgICAgICBhcmNUeXBlOiAhZ3JvdW5kID8gQ2VzaXVtLkFyY1R5cGUuTk9ORSA6IENlc2l1bS5BcmNUeXBlLkdFT0RFU0lDLFxyXG4gICAgICAgIHpJbmRleDogdGhhdC5zZGsuX2VudGl0eVpJbmRleFxyXG4gICAgICB9LFxyXG4gICAgfSlcclxuICAgIHRoYXQuc2RrLl9lbnRpdHlaSW5kZXgrK1xyXG4gICAgUGluY2VyQXJyb3dPYmplY3QuY3JlYXRlTGFiZWwodGhhdClcclxuICAgIGxldCBwb3M4NCA9IFtdXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvc2l0aW9uc0EubGVuZ3RoOyBpKyspIHtcclxuICAgICAgcG9zODQucHVzaCh0aGF0LmNhcnRlc2lhbjNUb3dnczg0KHBvc2l0aW9uc0FbaV0sIHRoYXQuc2RrLnZpZXdlcikpXHJcbiAgICB9XHJcbiAgICB0aGF0Lm9wdGlvbnMuYXJlYUJ5TWV0ZXIgPSB0aGF0LmNvbXB1dGVBcmVhKHBvczg0KTtcclxuICAgIHN3aXRjaCAodGhhdC5vcHRpb25zWydhcmVhLXVuaXQnXSkge1xyXG4gICAgICBjYXNlICflubPmlrnnsbMnOlxyXG4gICAgICAgIHRoYXQub3B0aW9ucy5hcmVhID0gdGhhdC5vcHRpb25zLmFyZWFCeU1ldGVyXHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ+W5s+aWueWNg+exsyc6XHJcbiAgICAgICAgdGhhdC5vcHRpb25zLmFyZWEgPSBOdW1iZXIoKHRoYXQub3B0aW9ucy5hcmVhQnlNZXRlciAvIDEwMDAwMDApLnRvRml4ZWQoOCkpXHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ+S6qSc6XHJcbiAgICAgICAgdGhhdC5vcHRpb25zLmFyZWEgPSBOdW1iZXIoKHRoYXQub3B0aW9ucy5hcmVhQnlNZXRlciAvIDY2Ni42NjY2NjY3KS50b0ZpeGVkKDQpKVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICflhazpobcnOlxyXG4gICAgICAgIHRoYXQub3B0aW9ucy5hcmVhID0gTnVtYmVyKCh0aGF0Lm9wdGlvbnMuYXJlYUJ5TWV0ZXIgLyAxMDAwMCkudG9GaXhlZCg2KSlcclxuICAgICAgICBicmVhaztcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICB0aGF0Lm9wdGlvbnMuYXJlYSA9IHRoYXQub3B0aW9ucy5hcmVhQnlNZXRlclxyXG4gICAgfVxyXG4gICAgc3luY0RhdGEodGhhdC5zZGssIHRoYXQub3B0aW9ucy5pZClcclxuICAgIGlmICh0aGF0Lm9wdGlvbnMuc2hvdykge1xyXG5cclxuICAgICAgc2V0U3BsaXREaXJlY3Rpb24oMCwgdGhhdC5vcHRpb25zLmlkKVxyXG4gICAgfVxyXG5cclxuICAgIHRoYXQuc3ByZWFkU3RhdGUgPSB0aGF0Lm9wdGlvbnMuc3ByZWFkU3RhdGVcclxuICB9XHJcblxyXG4gIHN0YXRpYyBhc3luYyBjcmVhdGVMYWJlbCh0aGF0KSB7XHJcbiAgICAvLyDmoIfnrb5cclxuICAgIHRoYXQubGFiZWwgPSBuZXcgTGFiZWxPYmplY3QodGhhdC5zZGssIHtcclxuICAgICAgaWQ6IHRoYXQub3B0aW9ucy5pZCxcclxuICAgICAgc2hvdzogdGhhdC5vcHRpb25zLnNob3cgPyB0aGF0Lm9wdGlvbnMubGFiZWwuc2hvdyA6IGZhbHNlLFxyXG4gICAgICBwb3NpdGlvbjogW3RoYXQub3B0aW9ucy5sYWJlbC5wb3NpdGlvbi5sbmcsIHRoYXQub3B0aW9ucy5sYWJlbC5wb3NpdGlvbi5sYXQsIHRoYXQub3B0aW9ucy5sYWJlbC5wb3NpdGlvbi5hbHRdLFxyXG4gICAgICB0ZXh0OiB0aGF0Lm9wdGlvbnMubmFtZSxcclxuICAgICAgZm9udFNpemU6IHRoYXQub3B0aW9ucy5sYWJlbC5mb250U2l6ZSxcclxuICAgICAgZm9udEZhbWlseTogdGhhdC5vcHRpb25zLmxhYmVsLmZvbnRGYW1pbHksXHJcbiAgICAgIGNvbG9yOiB0aGF0Lm9wdGlvbnMubGFiZWwuY29sb3IsXHJcbiAgICAgIHBpeGVsT2Zmc2V0OiB0aGF0Lm9wdGlvbnMubGFiZWwucGl4ZWxPZmZzZXQsXHJcbiAgICAgIGJhY2tncm91bmRDb2xvcjogdGhhdC5vcHRpb25zLmxhYmVsLmJhY2tncm91bmRDb2xvcixcclxuICAgICAgbGluZUNvbG9yOiB0aGF0Lm9wdGlvbnMubGFiZWwubGluZUNvbG9yLFxyXG4gICAgICBsaW5lV2lkdGg6IHRoYXQub3B0aW9ucy5sYWJlbC5saW5lV2lkdGgsXHJcbiAgICAgIHNjYWxlQnlEaXN0YW5jZTogdGhhdC5vcHRpb25zLmxhYmVsLnNjYWxlQnlEaXN0YW5jZSxcclxuICAgICAgbmVhcjogdGhhdC5vcHRpb25zLmxhYmVsLm5lYXIsXHJcbiAgICAgIGZhcjogdGhhdC5vcHRpb25zLmxhYmVsLmZhcixcclxuICAgICAgZ3JvdW5kOiB0aGF0Lm9wdGlvbnMubGFiZWwuZ3JvdW5kLFxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIC8vIOe8lui+keahhlxyXG4gIGFzeW5jIGVkaXQoc3RhdGUpIHtcclxuICAgIGlmICh0aGlzLl9lcnJvcikge1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuICAgIGxldCBfdGhpcyA9IHRoaXNcclxuICAgIHRoaXMub3JpZ2luYWxPcHRpb25zID0gdGhpcy5kZWVwQ29weU9iaih0aGlzLm9wdGlvbnMpXHJcblxyXG4gICAgaWYgKHRoaXMuX0RpYWxvZ09iamVjdCAmJiB0aGlzLl9EaWFsb2dPYmplY3QuY2xvc2UpIHtcclxuICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0LmNsb3NlKClcclxuICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0ID0gbnVsbFxyXG4gICAgfVxyXG4gICAgaWYgKHN0YXRlKSB7XHJcbiAgICAgIGZ1bmN0aW9uIGNyZWF0ZVNwYXRpYWxJbmZvVGFibGVDb250ZW50KCkge1xyXG4gICAgICAgIGxldCB0YWJsZUVsbSA9IGNvbnRlbnRFbG0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnc3BhdGlhbC1pbmZvLXRhYmxlJylbMF1cclxuICAgICAgICBsZXQgdEJvZHlFbG0gPSB0YWJsZUVsbS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0YWJsZS1ib2R5JylbMF1cclxuICAgICAgICB0Qm9keUVsbS5pbm5lckhUTUwgPSAnJ1xyXG4gICAgICAgIF90aGlzLl9lbG1zLmxuZyA9IFtdXHJcbiAgICAgICAgX3RoaXMuX2VsbXMubG5nSW5wdXQgPSBbXVxyXG4gICAgICAgIF90aGlzLl9lbG1zLmxhdCA9IFtdXHJcbiAgICAgICAgX3RoaXMuX2VsbXMubGF0SW5wdXQgPSBbXVxyXG4gICAgICAgIF90aGlzLl9lbG1zLmFsdCA9IFtdXHJcbiAgICAgICAgX3RoaXMuX2VsbXMuYWx0SW5wdXQgPSBbXVxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgX3RoaXMub3B0aW9ucy5wb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGxldCB0ciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpXHJcbiAgICAgICAgICB0ci5jbGFzc05hbWUgPSAndHInXHJcbiAgICAgICAgICB0ci5pbm5lckhUTUwgPSBgXHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidGRcIj4ke2kgKyAxfTwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRkIGxuZyBhbGlnbi1jZW50ZXJcIj48L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZCBsYXQgYWxpZ24tY2VudGVyXCI+PC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidGQgYWx0IGFsaWduLWNlbnRlclwiPjwvZGl2PlxyXG4gICAgICAgIGBcclxuICAgICAgICAgIGxldCBsbmdCb3ggPSB0ci5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdsbmcnKVswXVxyXG4gICAgICAgICAgbGV0IGxuZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKVxyXG4gICAgICAgICAgbG5nLmlubmVySFRNTCA9IChfdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sbmcpLnRvRml4ZWQoOClcclxuICAgICAgICAgIGxuZ0JveC5hcHBlbmRDaGlsZChsbmcpXHJcbiAgICAgICAgICBsZXQgbG5nSW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpXHJcbiAgICAgICAgICBsbmdJbnB1dC5jbGFzc05hbWUgPSAnaW5wdXQnXHJcbiAgICAgICAgICBsbmdJbnB1dC50eXBlID0gJ251bWJlcidcclxuICAgICAgICAgIGxuZ0lucHV0LnRpdGxlID0gJydcclxuICAgICAgICAgIGxuZ0lucHV0Lm1pbiA9IC0xODBcclxuICAgICAgICAgIGxuZ0lucHV0Lm1heCA9IDE4MFxyXG4gICAgICAgICAgbG5nSW5wdXQudmFsdWUgPSAoX3RoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubG5nKS50b0ZpeGVkKDgpXHJcblxyXG4gICAgICAgICAgbGV0IGxhdEJveCA9IHRyLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xhdCcpWzBdXHJcbiAgICAgICAgICBsZXQgbGF0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpXHJcbiAgICAgICAgICBsYXQuaW5uZXJIVE1MID0gKF90aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxhdCkudG9GaXhlZCg4KVxyXG4gICAgICAgICAgbGF0Qm94LmFwcGVuZENoaWxkKGxhdClcclxuICAgICAgICAgIGxldCBsYXRJbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0JylcclxuICAgICAgICAgIGxhdElucHV0LmNsYXNzTmFtZSA9ICdpbnB1dCdcclxuICAgICAgICAgIGxhdElucHV0LnR5cGUgPSAnbnVtYmVyJ1xyXG4gICAgICAgICAgbGF0SW5wdXQudGl0bGUgPSAnJ1xyXG4gICAgICAgICAgbGF0SW5wdXQubWluID0gLTkwXHJcbiAgICAgICAgICBsYXRJbnB1dC5tYXggPSA5MFxyXG4gICAgICAgICAgbGF0SW5wdXQudmFsdWUgPSAoX3RoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubGF0KS50b0ZpeGVkKDgpXHJcblxyXG4gICAgICAgICAgbGV0IGFsdEJveCA9IHRyLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2FsdCcpWzBdXHJcbiAgICAgICAgICBsZXQgYWx0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpXHJcbiAgICAgICAgICBhbHQuaW5uZXJIVE1MID0gKF90aGlzLmhlaWdodCkudG9GaXhlZCgyKVxyXG4gICAgICAgICAgYWx0Qm94LmFwcGVuZENoaWxkKGFsdClcclxuICAgICAgICAgIGxldCBhbHRJbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0JylcclxuICAgICAgICAgIGFsdElucHV0LmNsYXNzTmFtZSA9ICdpbnB1dCdcclxuICAgICAgICAgIGFsdElucHV0LnR5cGUgPSAnbnVtYmVyJ1xyXG4gICAgICAgICAgYWx0SW5wdXQudGl0bGUgPSAnJ1xyXG4gICAgICAgICAgYWx0SW5wdXQubWluID0gLTk5OTk5OTlcclxuICAgICAgICAgIGFsdElucHV0Lm1heCA9IDk5OTk5OTk5OVxyXG4gICAgICAgICAgYWx0SW5wdXQudmFsdWUgPSAoX3RoaXMuaGVpZ2h0KS50b0ZpeGVkKDIpXHJcblxyXG4gICAgICAgICAgbG5nQm94LmFkZEV2ZW50TGlzdGVuZXIoJ2RibGNsaWNrJywgKCkgPT4ge1xyXG4gICAgICAgICAgICBsbmdCb3guaW5uZXJIVE1MID0gJydcclxuICAgICAgICAgICAgbG5nSW5wdXQudmFsdWUgPSBOdW1iZXIoKF90aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxuZykudG9GaXhlZCg4KSlcclxuICAgICAgICAgICAgbG5nQm94LmFwcGVuZENoaWxkKGxuZ0lucHV0KVxyXG4gICAgICAgICAgICBsbmdJbnB1dC5mb2N1cygpXHJcbiAgICAgICAgICAgIGlmIChfdGhpcy5vcGVyYXRlLnBvc2l0aW9uRWRpdGluZykge1xyXG4gICAgICAgICAgICAgIF90aGlzLnBvc2l0aW9uRWRpdGluZyA9IGZhbHNlXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgUGluY2VyQXJyb3dPYmplY3QuY2xvc2VOb2RlRWRpdChfdGhpcylcclxuICAgICAgICAgICAgX3RoaXMuaGVpZ2h0TW9kZSA9IF90aGlzLmhlaWdodE1vZGVcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICBsbmdJbnB1dC5hZGRFdmVudExpc3RlbmVyKCdibHVyJywgKCkgPT4ge1xyXG4gICAgICAgICAgICBsbmdJbnB1dC52YWx1ZSA9IE51bWJlcigoX3RoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubG5nKS50b0ZpeGVkKDgpKVxyXG4gICAgICAgICAgICBsbmdCb3guaW5uZXJIVE1MID0gJydcclxuICAgICAgICAgICAgbG5nQm94LmFwcGVuZENoaWxkKGxuZylcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICBsbmdJbnB1dC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICgpID0+IHtcclxuICAgICAgICAgICAgX3RoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubG5nID0gTnVtYmVyKE51bWJlcihsbmdJbnB1dC52YWx1ZSkudG9GaXhlZCg4KSlcclxuICAgICAgICAgICAgbG5nLmlubmVySFRNTCA9IF90aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxuZy50b0ZpeGVkKDgpXHJcbiAgICAgICAgICAgIF90aGlzLmhlaWdodCA9IF90aGlzLmhlaWdodFxyXG4gICAgICAgICAgfSlcclxuXHJcbiAgICAgICAgICBsYXRCb3guYWRkRXZlbnRMaXN0ZW5lcignZGJsY2xpY2snLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGxhdEJveC5pbm5lckhUTUwgPSAnJ1xyXG4gICAgICAgICAgICBsYXRJbnB1dC52YWx1ZSA9IE51bWJlcigoX3RoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubGF0KS50b0ZpeGVkKDgpKVxyXG4gICAgICAgICAgICBsYXRCb3guYXBwZW5kQ2hpbGQobGF0SW5wdXQpXHJcbiAgICAgICAgICAgIGxhdElucHV0LmZvY3VzKClcclxuICAgICAgICAgICAgaWYgKF90aGlzLm9wZXJhdGUucG9zaXRpb25FZGl0aW5nKSB7XHJcbiAgICAgICAgICAgICAgX3RoaXMucG9zaXRpb25FZGl0aW5nID0gZmFsc2VcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBQaW5jZXJBcnJvd09iamVjdC5jbG9zZU5vZGVFZGl0KF90aGlzKVxyXG4gICAgICAgICAgICBfdGhpcy5oZWlnaHRNb2RlID0gX3RoaXMuaGVpZ2h0TW9kZVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIGxhdElucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2JsdXInLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGxhdElucHV0LnZhbHVlID0gTnVtYmVyKChfdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sYXQpLnRvRml4ZWQoOCkpXHJcbiAgICAgICAgICAgIGxhdEJveC5pbm5lckhUTUwgPSAnJ1xyXG4gICAgICAgICAgICBsYXRCb3guYXBwZW5kQ2hpbGQobGF0KVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIGxhdElucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKCkgPT4ge1xyXG4gICAgICAgICAgICBfdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sYXQgPSBOdW1iZXIoTnVtYmVyKGxhdElucHV0LnZhbHVlKS50b0ZpeGVkKDgpKVxyXG4gICAgICAgICAgICBsYXQuaW5uZXJIVE1MID0gX3RoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubGF0LnRvRml4ZWQoOClcclxuICAgICAgICAgICAgX3RoaXMuaGVpZ2h0ID0gX3RoaXMuaGVpZ2h0XHJcbiAgICAgICAgICB9KVxyXG5cclxuICAgICAgICAgIGFsdEJveC5hZGRFdmVudExpc3RlbmVyKCdkYmxjbGljaycsICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKF90aGlzLmhlaWdodE1vZGUgPT0gMikge1xyXG4gICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBhbHRCb3guaW5uZXJIVE1MID0gJydcclxuICAgICAgICAgICAgYWx0SW5wdXQudmFsdWUgPSBOdW1iZXIoKF90aGlzLmhlaWdodCkudG9GaXhlZCgyKSlcclxuICAgICAgICAgICAgYWx0Qm94LmFwcGVuZENoaWxkKGFsdElucHV0KVxyXG4gICAgICAgICAgICBhbHRJbnB1dC5mb2N1cygpXHJcbiAgICAgICAgICAgIGlmIChfdGhpcy5vcGVyYXRlLnBvc2l0aW9uRWRpdGluZykge1xyXG4gICAgICAgICAgICAgIF90aGlzLnBvc2l0aW9uRWRpdGluZyA9IGZhbHNlXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgUGluY2VyQXJyb3dPYmplY3QuY2xvc2VOb2RlRWRpdChfdGhpcylcclxuICAgICAgICAgICAgX3RoaXMuaGVpZ2h0TW9kZSA9IF90aGlzLmhlaWdodE1vZGVcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICBhbHRJbnB1dC5hZGRFdmVudExpc3RlbmVyKCdibHVyJywgKCkgPT4ge1xyXG4gICAgICAgICAgICBhbHRJbnB1dC52YWx1ZSA9IE51bWJlcigoX3RoaXMuaGVpZ2h0KS50b0ZpeGVkKDIpKVxyXG4gICAgICAgICAgICBhbHRCb3guaW5uZXJIVE1MID0gJydcclxuICAgICAgICAgICAgYWx0Qm94LmFwcGVuZENoaWxkKGFsdClcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICBhbHRJbnB1dC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICgpID0+IHtcclxuICAgICAgICAgICAgX3RoaXMuaGVpZ2h0ID0gTnVtYmVyKE51bWJlcihhbHRJbnB1dC52YWx1ZSkudG9GaXhlZCgyKSlcclxuICAgICAgICAgICAgYWx0LmlubmVySFRNTCA9IE51bWJlcihfdGhpcy5oZWlnaHQudG9GaXhlZCgyKSlcclxuICAgICAgICAgIH0pXHJcblxyXG5cclxuICAgICAgICAgIF90aGlzLl9lbG1zLmxuZy5wdXNoKGxuZylcclxuICAgICAgICAgIF90aGlzLl9lbG1zLmxuZ0lucHV0LnB1c2gobG5nSW5wdXQpXHJcbiAgICAgICAgICBfdGhpcy5fZWxtcy5sYXQucHVzaChsYXQpXHJcbiAgICAgICAgICBfdGhpcy5fZWxtcy5sYXRJbnB1dC5wdXNoKGxhdElucHV0KVxyXG4gICAgICAgICAgX3RoaXMuX2VsbXMuYWx0LnB1c2goYWx0KVxyXG4gICAgICAgICAgX3RoaXMuX2VsbXMuYWx0SW5wdXQucHVzaChhbHRJbnB1dClcclxuICAgICAgICAgIHRCb2R5RWxtLmFwcGVuZENoaWxkKHRyKVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICB0aGlzLl9EaWFsb2dPYmplY3QgPSBhd2FpdCBuZXcgRGlhbG9nKHRoaXMuc2RrLCB0aGlzLm9wdGlvbnMsIHtcclxuICAgICAgICB0aXRsZTogJ+WPjOeureWktOWxnuaApycsIGxlZnQ6ICcxODBweCcsIHRvcDogJzEwMHB4JyxcclxuICAgICAgICBjb25maXJtQ2FsbEJhY2s6IChvcHRpb25zKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLm5hbWUgPSB0aGlzLm5hbWUudHJpbSgpXHJcbiAgICAgICAgICBpZiAoIXRoaXMubmFtZSkge1xyXG4gICAgICAgICAgICB0aGlzLm5hbWUgPSAn5pyq5ZG95ZCN5a+56LGhJ1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5vcHRpb25zLmxhYmVsLnBvc2l0aW9uID0geyBsbmc6IHRoaXMubGFiZWwucG9zaXRpb25bMF0sIGxhdDogdGhpcy5sYWJlbC5wb3NpdGlvblsxXSwgYWx0OiB0aGlzLmxhYmVsLnBvc2l0aW9uWzJdIH1cclxuICAgICAgICAgIHRoaXMub3JpZ2luYWxPcHRpb25zID0gdGhpcy5kZWVwQ29weU9iaih0aGlzLm9wdGlvbnMpXHJcbiAgICAgICAgICB0aGlzLl9EaWFsb2dPYmplY3QuY2xvc2UoKVxyXG4gICAgICAgICAgdGhpcy5EaWFsb2cuY29uZmlybUNhbGxCYWNrICYmIHRoaXMuRGlhbG9nLmNvbmZpcm1DYWxsQmFjayh0aGlzLm9yaWdpbmFsT3B0aW9ucylcclxuICAgICAgICB9LFxyXG4gICAgICAgIHJlc2V0Q2FsbEJhY2s6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMucmVzZXQoKVxyXG4gICAgICAgICAgdGhpcy5EaWFsb2cucmVzZXRDYWxsQmFjayAmJiB0aGlzLkRpYWxvZy5yZXNldENhbGxCYWNrKClcclxuICAgICAgICB9LFxyXG4gICAgICAgIHJlbW92ZUNhbGxCYWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLkRpYWxvZy5yZW1vdmVDYWxsQmFjayAmJiB0aGlzLkRpYWxvZy5yZW1vdmVDYWxsQmFjaygpXHJcbiAgICAgICAgfSxcclxuICAgICAgICBjbG9zZUNhbGxCYWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICBsZXQgc3ByZWFkU3RhdGUgPSB0aGlzLm9wdGlvbnMuc3ByZWFkU3RhdGVcclxuICAgICAgICAgIHRoaXMucG9zaXRpb25FZGl0aW5nID0gZmFsc2VcclxuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMuc3ByZWFkU3RhdGUgPSBzcHJlYWRTdGF0ZVxyXG4gICAgICAgICAgICB0aGlzLnJlc2V0KClcclxuICAgICAgICAgIH0sIDEwKTtcclxuICAgICAgICAgIHRoaXMuRGlhbG9nLmNsb3NlQ2FsbEJhY2sgJiYgdGhpcy5EaWFsb2cuY2xvc2VDYWxsQmFjaygpXHJcbiAgICAgICAgfSxcclxuICAgICAgICBzaG93Q2FsbEJhY2s6IChzaG93KSA9PiB7XHJcbiAgICAgICAgICB0aGlzLm9wdGlvbnMuc2hvdyA9IHNob3dcclxuICAgICAgICAgIHRoaXMub3JpZ2luYWxPcHRpb25zLnNob3cgPSBzaG93XHJcbiAgICAgICAgICB0aGlzLnNob3cgPSBzaG93XHJcbiAgICAgICAgICB0aGlzLkRpYWxvZy5zaG93Q2FsbEJhY2sgJiYgdGhpcy5EaWFsb2cuc2hvd0NhbGxCYWNrKClcclxuICAgICAgICB9LFxyXG4gICAgICAgIHRyYW5zbGF0aW9uYWxDYWxsQmFjazogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5wb3NpdGlvbkVkaXRpbmcgPSAhdGhpcy5wb3NpdGlvbkVkaXRpbmdcclxuICAgICAgICB9LFxyXG4gICAgICAgIC8vIOS6jOasoee8lui+keWbnuiwg1xyXG4gICAgICAgIHNlY29uZGFyeUVkaXRDYWxsQmFjazogKCkgPT4ge1xyXG4gICAgICAgICAgUGluY2VyQXJyb3dPYmplY3Qubm9kZUVkaXQodGhpcywgKCkgPT4ge1xyXG4gICAgICAgICAgICBjcmVhdGVTcGF0aWFsSW5mb1RhYmxlQ29udGVudCgpXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmJvZHkuY2xhc3NOYW1lID0gdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmJvZHkuY2xhc3NOYW1lICsgJyBwaW5jZXJBcnJvdydcclxuICAgICAgbGV0IGNvbnRlbnRFbG0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgY29udGVudEVsbS5pbm5lckhUTUwgPSBodG1sKHRoaXMpXHJcbiAgICAgIHRoaXMuX0RpYWxvZ09iamVjdC5jb250ZW50QXBwQ2hpbGQoY29udGVudEVsbSlcclxuICAgICAgdGhpcy5hdHRyaWJ1dGVUeXBlID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZVR5cGVcclxuICAgICAgdGhpcy5hdHRyaWJ1dGVDYW1lcmEgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmNhbWVyYS5jb250ZW50XHJcblxyXG4gICAgICAvLyDliJvlu7rmoIfnrb7pobVcclxuICAgICAgbGV0IHRhYnNFbG0gPSBuZXcgY3lfdGFicygncGluY2VyLWFycm93LW9iamVjdC1lZGl0LXRhYnMnLCB1bmRlZmluZWQsIHRoaXMuc2RrKVxyXG4gICAgICAvLyDpopzoibLnu4Tku7ZcclxuICAgICAgbGV0IGNvbG9yUGlja2VyID0gbmV3IFlKQ29sb3JQaWNrZXIoe1xyXG4gICAgICAgIGVsOiBjb250ZW50RWxtLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXCJjb2xvclwiKVswXSxcclxuICAgICAgICBzaXplOiAnbWluaScsLy/popzoibJib3jnsbvlnotcclxuICAgICAgICBhbHBoYTogdHJ1ZSwvL+aYr+WQpuW8gOWQr+mAj+aYjuW6plxyXG4gICAgICAgIGRlZmF1bHRDb2xvcjogdGhpcy5jb2xvcixcclxuICAgICAgICBkaXNhYmxlZDogZmFsc2UsLy/mmK/lkKbnpoHmraLmiZPlvIDpopzoibLpgInmi6nlmahcclxuICAgICAgICBvcGVuUGlja2VyQW5pOiAnb3BhY2l0eScsLy/miZPlvIDpopzoibLpgInmi6nlmajliqjnlLtcclxuICAgICAgICBzdXJlOiAoY29sb3IpID0+IHtcclxuICAgICAgICAgIHRoaXMuY29sb3IgPSBjb2xvclxyXG4gICAgICAgIH0sLy/ngrnlh7vnoa7orqTmjInpkq7kuovku7blm57osINcclxuICAgICAgICBjbGVhcjogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5jb2xvciA9ICdyZ2JhKDI1NSwyNTUsMjU1LDEpJ1xyXG4gICAgICAgIH0sLy/ngrnlh7vmuIXnqbrmjInpkq7kuovku7blm57osINcclxuICAgICAgfSlcclxuICAgICAgbGV0IGxpbmVjb2xvclBpY2tlciA9IG5ldyBZSkNvbG9yUGlja2VyKHtcclxuICAgICAgICBlbDogY29udGVudEVsbS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFwibGluZUNvbG9yXCIpWzBdLFxyXG4gICAgICAgIHNpemU6ICdtaW5pJywvL+minOiJsmJveOexu+Wei1xyXG4gICAgICAgIGFscGhhOiB0cnVlLC8v5piv5ZCm5byA5ZCv6YCP5piO5bqmXHJcbiAgICAgICAgZGVmYXVsdENvbG9yOiB0aGlzLmxpbmVDb2xvcixcclxuICAgICAgICBkaXNhYmxlZDogZmFsc2UsLy/mmK/lkKbnpoHmraLmiZPlvIDpopzoibLpgInmi6nlmahcclxuICAgICAgICBvcGVuUGlja2VyQW5pOiAnb3BhY2l0eScsLy/miZPlvIDpopzoibLpgInmi6nlmajliqjnlLtcclxuICAgICAgICBzdXJlOiAoY29sb3IpID0+IHtcclxuICAgICAgICAgIHRoaXMubGluZUNvbG9yID0gY29sb3JcclxuICAgICAgICB9LC8v54K55Ye756Gu6K6k5oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgICAgY2xlYXI6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMubGluZUNvbG9yID0gJ3JnYmEoMjU1LDI1NSwyNTUsMSknXHJcbiAgICAgICAgfSwvL+eCueWHu+a4heepuuaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICB9KVxyXG4gICAgICBsZXQgbGFiZWxDb2xvclBpY2tlciA9IG5ldyBZSkNvbG9yUGlja2VyKHtcclxuICAgICAgICBlbDogY29udGVudEVsbS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFwibGFiZWxDb2xvclwiKVswXSxcclxuICAgICAgICBzaXplOiAnbWluaScsLy/popzoibJib3jnsbvlnotcclxuICAgICAgICBhbHBoYTogdHJ1ZSwvL+aYr+WQpuW8gOWQr+mAj+aYjuW6plxyXG4gICAgICAgIGRlZmF1bHRDb2xvcjogdGhpcy5sYWJlbENvbG9yLFxyXG4gICAgICAgIGRpc2FibGVkOiBmYWxzZSwvL+aYr+WQpuemgeatouaJk+W8gOminOiJsumAieaLqeWZqFxyXG4gICAgICAgIG9wZW5QaWNrZXJBbmk6ICdvcGFjaXR5JywvL+aJk+W8gOminOiJsumAieaLqeWZqOWKqOeUu1xyXG4gICAgICAgIHN1cmU6IChjb2xvcikgPT4ge1xyXG4gICAgICAgICAgdGhpcy5sYWJlbENvbG9yID0gY29sb3JcclxuICAgICAgICB9LC8v54K55Ye756Gu6K6k5oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgICAgY2xlYXI6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMubGFiZWxDb2xvciA9ICdyZ2JhKDI1NSwyNTUsMjU1LDEpJ1xyXG4gICAgICAgIH0sLy/ngrnlh7vmuIXnqbrmjInpkq7kuovku7blm57osINcclxuICAgICAgfSlcclxuICAgICAgbGV0IGxpbmVDb2xvclBpY2tlciA9IG5ldyBZSkNvbG9yUGlja2VyKHtcclxuICAgICAgICBlbDogY29udGVudEVsbS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFwibGFiZWxMaW5lQ29sb3JcIilbMF0sXHJcbiAgICAgICAgc2l6ZTogJ21pbmknLC8v6aKc6ImyYm9457G75Z6LXHJcbiAgICAgICAgYWxwaGE6IHRydWUsLy/mmK/lkKblvIDlkK/pgI/mmI7luqZcclxuICAgICAgICBkZWZhdWx0Q29sb3I6IHRoaXMubGFiZWxMaW5lQ29sb3IsXHJcbiAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLC8v5piv5ZCm56aB5q2i5omT5byA6aKc6Imy6YCJ5oup5ZmoXHJcbiAgICAgICAgb3BlblBpY2tlckFuaTogJ29wYWNpdHknLC8v5omT5byA6aKc6Imy6YCJ5oup5Zmo5Yqo55S7XHJcbiAgICAgICAgc3VyZTogKGNvbG9yKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmxhYmVsTGluZUNvbG9yID0gY29sb3JcclxuICAgICAgICB9LC8v54K55Ye756Gu6K6k5oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgICAgY2xlYXI6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMubGFiZWxMaW5lQ29sb3IgPSAncmdiYSgyNTUsMjU1LDI1NSwxKSdcclxuICAgICAgICB9LC8v54K55Ye75riF56m65oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgIH0pXHJcbiAgICAgIGxldCBsYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0UGlja2VyID0gbmV3IFlKQ29sb3JQaWNrZXIoe1xyXG4gICAgICAgIGVsOiBjb250ZW50RWxtLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXCJsYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0XCIpWzBdLFxyXG4gICAgICAgIHNpemU6ICdtaW5pJyxcclxuICAgICAgICBhbHBoYTogdHJ1ZSxcclxuICAgICAgICBkZWZhdWx0Q29sb3I6IHRoaXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JTdGFydCxcclxuICAgICAgICBkaXNhYmxlZDogZmFsc2UsXHJcbiAgICAgICAgb3BlblBpY2tlckFuaTogJ29wYWNpdHknLFxyXG4gICAgICAgIHN1cmU6IChjb2xvcikgPT4ge1xyXG4gICAgICAgICAgdGhpcy5sYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0ID0gY29sb3JcclxuICAgICAgICB9LFxyXG4gICAgICAgIGNsZWFyOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmxhYmVsQmFja2dyb3VuZENvbG9yU3RhcnQgPSAncmdiYSgyNTUsMjU1LDI1NSwxKSdcclxuICAgICAgICB9LFxyXG4gICAgICB9KVxyXG4gICAgICBsZXQgbGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmRQaWNrZXIgPSBuZXcgWUpDb2xvclBpY2tlcih7XHJcbiAgICAgICAgZWw6IGNvbnRlbnRFbG0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcImxhYmVsQmFja2dyb3VuZENvbG9yRW5kXCIpWzBdLFxyXG4gICAgICAgIHNpemU6ICdtaW5pJyxcclxuICAgICAgICBhbHBoYTogdHJ1ZSxcclxuICAgICAgICBkZWZhdWx0Q29sb3I6IHRoaXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmQsXHJcbiAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLFxyXG4gICAgICAgIG9wZW5QaWNrZXJBbmk6ICdvcGFjaXR5JyxcclxuICAgICAgICBzdXJlOiAoY29sb3IpID0+IHtcclxuICAgICAgICAgIHRoaXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmQgPSBjb2xvclxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgY2xlYXI6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmQgPSAncmdiYSgyNTUsMjU1LDI1NSwxKSdcclxuICAgICAgICB9LFxyXG4gICAgICB9KVxyXG4gICAgICBsZXQgYWxsX2VsbSA9IGNvbnRlbnRFbG0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCIqXCIpXHJcbiAgICAgIFBpbmNlckFycm93T2JqZWN0LkV2ZW50QmluZGluZyh0aGlzLCBhbGxfZWxtKVxyXG4gICAgICB0aGlzLl9lbG1zLmNvbG9yID0gW2NvbG9yUGlja2VyXVxyXG4gICAgICB0aGlzLl9lbG1zLmxpbmVDb2xvciA9IFtsaW5lY29sb3JQaWNrZXJdXHJcbiAgICAgIHRoaXMuX2VsbXMubGFiZWxDb2xvciA9IFtsYWJlbENvbG9yUGlja2VyXVxyXG4gICAgICB0aGlzLl9lbG1zLmxhYmVsTGluZUNvbG9yID0gW2xpbmVDb2xvclBpY2tlcl1cclxuICAgICAgdGhpcy5fZWxtcy5sYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0ID0gW2xhYmVsQmFja2dyb3VuZENvbG9yU3RhcnRQaWNrZXJdXHJcbiAgICAgIHRoaXMuX2VsbXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmQgPSBbbGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmRQaWNrZXJdXHJcblxyXG4gICAgICBsZXQgaGVpZ2h0Qm94RWxtID0gdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaGVpZ2h0LWJveCcpWzBdXHJcbiAgICAgIGxldCBoZWlnaHRFbG0gPSBoZWlnaHRCb3hFbG0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaGVpZ2h0JylbMF1cclxuICAgICAgbGV0IGhlaWdodENvbmZpcm1FbG0gPSB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdoZWlnaHQtY29uZmlybScpWzBdXHJcbiAgICAgIGhlaWdodEVsbS52YWx1ZSA9IDEwXHJcbiAgICAgIGlmICh0aGlzLmhlaWdodE1vZGUgPT0gMikge1xyXG4gICAgICAgIGhlaWdodEJveEVsbSAmJiAoaGVpZ2h0Qm94RWxtLmNsYXNzTmFtZSA9ICdpbnB1dC1udW1iZXIgaW5wdXQtbnVtYmVyLXVuaXQtMSBoZWlnaHQtYm94IGRpc2FibGVkJyk7XHJcbiAgICAgICAgaGVpZ2h0Q29uZmlybUVsbSAmJiBoZWlnaHRDb25maXJtRWxtLnNldEF0dHJpYnV0ZSgnZGlzYWJsZWQnLCAnZGlzYWJsZWQnKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBoZWlnaHRCb3hFbG0gJiYgKGhlaWdodEJveEVsbS5jbGFzc05hbWUgPSAnaW5wdXQtbnVtYmVyIGlucHV0LW51bWJlci11bml0LTEgaGVpZ2h0LWJveCcpO1xyXG4gICAgICAgIGhlaWdodENvbmZpcm1FbG0gJiYgaGVpZ2h0Q29uZmlybUVsbS5yZW1vdmVBdHRyaWJ1dGUoJ2Rpc2FibGVkJyk7XHJcbiAgICAgIH1cclxuICAgICAgbGV0IGhlaWdodE1vZGVEYXRhID0gW1xyXG4gICAgICAgIHtcclxuICAgICAgICAgIG5hbWU6ICfmtbfmi5Tpq5jluqYnLFxyXG4gICAgICAgICAgdmFsdWU6ICfmtbfmi5Tpq5jluqYnLFxyXG4gICAgICAgICAga2V5OiAnMCcsXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBuYW1lOiAn55u45a+55Zyw6KGoJyxcclxuICAgICAgICAgIHZhbHVlOiAn55u45a+55Zyw6KGoJyxcclxuICAgICAgICAgIGtleTogJzEnLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgbmFtZTogJ+S+nemZhOaooeWeiycsXHJcbiAgICAgICAgICB2YWx1ZTogJ+S+nemZhOaooeWeiycsXHJcbiAgICAgICAgICBrZXk6ICcyJyxcclxuICAgICAgICB9XHJcbiAgICAgIF1cclxuICAgICAgbGV0IGhlaWdodE1vZGVPYmplY3QgPSBsZWdwKFxyXG4gICAgICAgIHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXHJcbiAgICAgICAgICAnaGVpZ2h0LW1vZGUtYm94J1xyXG4gICAgICAgIClbMF0sXHJcbiAgICAgICAgJy5oZWlnaHQtbW9kZSdcclxuICAgICAgKVxyXG4gICAgICBpZiAoaGVpZ2h0TW9kZU9iamVjdCkge1xyXG4gICAgICAgIGhlaWdodE1vZGVPYmplY3QubGVncF9zZWFyY2goaGVpZ2h0TW9kZURhdGEpXHJcbiAgICAgICAgbGV0IGhlaWdodE1vZGVEYXRhTGVncEVsbSA9IHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50XHJcbiAgICAgICAgICAuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaGVpZ2h0LW1vZGUnKVswXVxyXG4gICAgICAgICAgLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdpbnB1dCcpWzBdXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoZWlnaHRNb2RlRGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgaWYgKGhlaWdodE1vZGVEYXRhW2ldLmtleSA9PSB0aGlzLmhlaWdodE1vZGUpIHtcclxuICAgICAgICAgICAgaGVpZ2h0TW9kZURhdGFMZWdwRWxtLnZhbHVlID0gaGVpZ2h0TW9kZURhdGFbaV0udmFsdWVcclxuICAgICAgICAgICAgaGVpZ2h0TW9kZU9iamVjdC5sZWdwX3NlYXJjaEFjdGl2ZShcclxuICAgICAgICAgICAgICBoZWlnaHRNb2RlRGF0YVtpXS52YWx1ZVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGhlaWdodE1vZGVEYXRhTGVncEVsbS5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICgpID0+IHtcclxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaGVpZ2h0TW9kZURhdGEubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKGhlaWdodE1vZGVEYXRhW2ldLnZhbHVlID09PSBoZWlnaHRNb2RlRGF0YUxlZ3BFbG0udmFsdWUpIHtcclxuICAgICAgICAgICAgICB0aGlzLmhlaWdodE1vZGUgPSBoZWlnaHRNb2RlRGF0YVtpXS5rZXlcclxuICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuXHJcbiAgICAgICAgaGVpZ2h0RWxtLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKCkgPT4ge1xyXG4gICAgICAgICAgc3dpdGNoICh0aGlzLmhlaWdodE1vZGUpIHtcclxuICAgICAgICAgICAgY2FzZSAwOlxyXG4gICAgICAgICAgICBjYXNlICcwJzpcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAxOlxyXG4gICAgICAgICAgICBjYXNlICcxJzpcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAyOlxyXG4gICAgICAgICAgICBjYXNlICcyJzpcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG5cclxuICAgICAgICB0aGlzLl9lbG1zLmhlaWdodCA9IGhlaWdodEVsbVxyXG4gICAgICAgIHRoaXMuX2VsbXMuaGVpZ2h0Qm94ID0gaGVpZ2h0Qm94RWxtXHJcbiAgICAgICAgdGhpcy5fZWxtcy5oZWlnaHRNb2RlID0gaGVpZ2h0TW9kZURhdGFMZWdwRWxtXHJcbiAgICAgICAgdGhpcy5fZWxtcy5oZWlnaHRDb25maXJtID0gaGVpZ2h0Q29uZmlybUVsbVxyXG4gICAgICAgIHRoaXMuX2VsbXMuaGVpZ2h0TW9kZU9iamVjdCA9IGhlaWdodE1vZGVPYmplY3RcclxuXHJcbiAgICAgICAgaGVpZ2h0Q29uZmlybUVsbS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcclxuICAgICAgICAgIGlmICh0aGlzLm9wZXJhdGUucG9zaXRpb25FZGl0aW5nKSB7XHJcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb25FZGl0aW5nID0gZmFsc2VcclxuICAgICAgICAgICAgdGhpcy5oZWlnaHQgPSB0aGlzLmhlaWdodCArIE51bWJlcihoZWlnaHRFbG0udmFsdWUpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgUGluY2VyQXJyb3dPYmplY3QuY2xvc2VOb2RlRWRpdCh0aGlzKVxyXG4gICAgICAgICAgICB0aGlzLmhlaWdodE1vZGUgPSB0aGlzLmhlaWdodE1vZGVcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgdGhpcy5oZWlnaHQgPSB0aGlzLmhlaWdodCArIE51bWJlcihoZWlnaHRFbG0udmFsdWUpXHJcbiAgICAgICAgICAgIH0sIDEwMCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgfVxyXG5cclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5hdHRyaWJ1dGVMaW5rID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnRcclxuICAgICAgICB0aGlzLmF0dHJpYnV0ZVZyID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52ci5jb250ZW50XHJcbiAgICAgICAgdGhpcy5jYW1lcmFTZWxlY3QgJiYgdGhpcy5jYW1lcmFTZWxlY3QoKVxyXG4gICAgICAgIHRoaXMuZ29vZHNTZWxlY3QgJiYgdGhpcy5nb29kc1NlbGVjdCgpXHJcbiAgICAgICAgbGV0IHRhZ0RhdGEgPSB0aGlzLmF0dHJpYnV0ZVNlbGVjdFxyXG4gICAgICAgIGxldCBhdHRyaWJ1dGVFbG0gPSB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdhdHRyaWJ1dGUtc2VsZWN0LWJveCcpWzBdXHJcbiAgICAgICAgaWYgKGF0dHJpYnV0ZUVsbSkge1xyXG4gICAgICAgICAgbGV0IGxlZ3BPYmplY3QgPSBsZWdwKGF0dHJpYnV0ZUVsbSwgXCIuYXR0cmlidXRlLXNlbGVjdFwiKVxyXG4gICAgICAgICAgbGVncE9iamVjdC5sZWdwX3NlYXJjaCh0YWdEYXRhKVxyXG4gICAgICAgICAgbGV0IGF0dHJpYnV0ZVNlbGVjdEVsbSA9IHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2F0dHJpYnV0ZS1zZWxlY3QnKVswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaW5wdXQnKVswXVxyXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YWdEYXRhLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmICh0YWdEYXRhW2ldLmtleSA9PT0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZVR5cGUpIHtcclxuICAgICAgICAgICAgICBhdHRyaWJ1dGVTZWxlY3RFbG0udmFsdWUgPSB0YWdEYXRhW2ldLnZhbHVlXHJcbiAgICAgICAgICAgICAgbGVncE9iamVjdC5sZWdwX3NlYXJjaEFjdGl2ZSh0YWdEYXRhW2ldLnZhbHVlKVxyXG4gICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGF0dHJpYnV0ZVNlbGVjdEVsbS5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICgpID0+IHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YWdEYXRhLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgaWYgKHRhZ0RhdGFbaV0udmFsdWUgPT09IGF0dHJpYnV0ZVNlbGVjdEVsbS52YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hdHRyaWJ1dGVUeXBlID0gdGFnRGF0YVtpXS5rZXlcclxuICAgICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgdW5pdERhdGEgPSBbe1xyXG4gICAgICAgICAgbmFtZTogJ+W5s+aWueexsycsXHJcbiAgICAgICAgICB2YWx1ZTogJ+W5s+aWueexsydcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIG5hbWU6ICflubPmlrnljYPnsbMnLFxyXG4gICAgICAgICAgdmFsdWU6ICflubPmlrnljYPnsbMnXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBuYW1lOiAn5LqpJyxcclxuICAgICAgICAgIHZhbHVlOiAn5LqpJ1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgbmFtZTogJ+WFrOmhtycsXHJcbiAgICAgICAgICB2YWx1ZTogJ+WFrOmhtydcclxuICAgICAgICB9LFxyXG4gICAgICAgIF1cclxuICAgICAgICBsZXQgdW5pdERhdGFMZWdwT2JqZWN0ID0gbGVncCh0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdpbnB1dC1zZWxlY3QtdW5pdC1ib3gnKVswXSwgXCIuaW5wdXQtc2VsZWN0LXVuaXRcIilcclxuICAgICAgICBpZiAodW5pdERhdGFMZWdwT2JqZWN0KSB7XHJcbiAgICAgICAgICB1bml0RGF0YUxlZ3BPYmplY3QubGVncF9zZWFyY2godW5pdERhdGEpXHJcbiAgICAgICAgICBsZXQgdW5pdERhdGFMZWdwRWxtID0gdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaW5wdXQtc2VsZWN0LXVuaXQnKVswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaW5wdXQnKVswXVxyXG4gICAgICAgICAgdW5pdERhdGFMZWdwRWxtLnZhbHVlID0gdGhpcy5vcHRpb25zWydhcmVhLXVuaXQnXVxyXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB1bml0RGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAodW5pdERhdGFbaV0udmFsdWUgPT09IHVuaXREYXRhTGVncEVsbS52YWx1ZSkge1xyXG4gICAgICAgICAgICAgIHVuaXREYXRhTGVncE9iamVjdC5sZWdwX3NlYXJjaEFjdGl2ZSh1bml0RGF0YVtpXS52YWx1ZSlcclxuICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB1bml0RGF0YUxlZ3BFbG0uYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdW5pdERhdGEubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICBpZiAodW5pdERhdGFbaV0udmFsdWUgPT09IHVuaXREYXRhTGVncEVsbS52YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hcmVhVW5pdCA9IHVuaXREYXRhW2ldLnZhbHVlXHJcbiAgICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBmb250RGF0YSA9IGdldEZvbnRMaXN0KClcclxuICAgICAgICBsZXQgZm9udE9iamVjdCA9IGxlZ3AoXHJcbiAgICAgICAgICB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFxyXG4gICAgICAgICAgICAnZm9udC1zZWxlY3QtYm94J1xyXG4gICAgICAgICAgKVswXSxcclxuICAgICAgICAgICcuZm9udC1zZWxlY3QnXHJcbiAgICAgICAgKVxyXG4gICAgICAgIGlmIChmb250T2JqZWN0KSB7XHJcbiAgICAgICAgICBmb250T2JqZWN0LmxlZ3Bfc2VhcmNoKGZvbnREYXRhKVxyXG4gICAgICAgICAgbGV0IGZvbnREYXRhTGVncEVsbSA9IHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50XHJcbiAgICAgICAgICAgIC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdmb250LXNlbGVjdCcpWzBdXHJcbiAgICAgICAgICAgIC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaW5wdXQnKVswXVxyXG4gICAgICAgICAgZm9udERhdGFMZWdwRWxtLnZhbHVlID0gZm9udERhdGFbdGhpcy5sYWJlbEZvbnRGYW1pbHldLnZhbHVlXHJcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZvbnREYXRhLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChmb250RGF0YVtpXS52YWx1ZSA9PSBmb250RGF0YUxlZ3BFbG0udmFsdWUpIHtcclxuICAgICAgICAgICAgICBmb250T2JqZWN0LmxlZ3Bfc2VhcmNoQWN0aXZlKGZvbnREYXRhW2ldLnZhbHVlKVxyXG4gICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGZvbnREYXRhTGVncEVsbS5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICgpID0+IHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmb250RGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgIGlmIChmb250RGF0YVtpXS52YWx1ZSA9PT0gZm9udERhdGFMZWdwRWxtLnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxhYmVsRm9udEZhbWlseSA9IGZvbnREYXRhW2ldLmtleVxyXG4gICAgICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICB0aGlzLl9lbG1zLmxhYmVsRm9udEZhbWlseSA9IFtmb250RGF0YUxlZ3BFbG1dXHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIGNyZWF0ZVNwYXRpYWxJbmZvVGFibGVDb250ZW50KClcclxuICAgICAgfSwgMCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAodGhpcy5fRGlhbG9nT2JqZWN0ICYmIHRoaXMuX0RpYWxvZ09iamVjdC5yZW1vdmUpIHtcclxuICAgICAgICB0aGlzLl9EaWFsb2dPYmplY3QucmVtb3ZlKClcclxuICAgICAgICB0aGlzLl9EaWFsb2dPYmplY3QgPSBudWxsXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlc2V0KCkge1xyXG4gICAgaWYgKCF0aGlzLmVudGl0eSkge1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuICAgIHRoaXMub3B0aW9ucyA9IHRoaXMuZGVlcENvcHlPYmoodGhpcy5vcmlnaW5hbE9wdGlvbnMpXHJcbiAgICB0aGlzLm5hbWUgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5uYW1lXHJcbiAgICB0aGlzLmNvbG9yID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMuY29sb3JcclxuICAgIHRoaXMubGluZUNvbG9yID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMubGluZS5jb2xvclxyXG4gICAgdGhpcy5saW5lV2lkdGggPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5saW5lLndpZHRoXHJcbiAgICB0aGlzLmFyZWEgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5hcmVhXHJcbiAgICB0aGlzLmFyZWFVbml0ID0gdGhpcy5vcmlnaW5hbE9wdGlvbnNbJ2FyZWEtdW5pdCddXHJcbiAgICB0aGlzLmxhYmVsU2hvdyA9IHRoaXMub3JpZ2luYWxPcHRpb25zLmxhYmVsLnNob3dcclxuICAgIHRoaXMubGFiZWxDb2xvciA9IHRoaXMub3JpZ2luYWxPcHRpb25zLmxhYmVsLmNvbG9yXHJcbiAgICB0aGlzLmxhYmVsRm9udFNpemUgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5sYWJlbC5mb250U2l6ZVxyXG4gICAgdGhpcy5sYWJlbEZvbnRGYW1pbHkgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5sYWJlbC5mb250RmFtaWx5XHJcbiAgICB0aGlzLmxhYmVsU2NhbGVCeURpc3RhbmNlID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMubGFiZWwuc2NhbGVCeURpc3RhbmNlXHJcbiAgICB0aGlzLmxhYmVsTmVhciA9IHRoaXMub3JpZ2luYWxPcHRpb25zLmxhYmVsLm5lYXJcclxuICAgIHRoaXMubGFiZWxGYXIgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5sYWJlbC5mYXJcclxuICAgIHRoaXMubGFiZWxMaW5lV2lkdGggPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5sYWJlbC5saW5lV2lkdGhcclxuICAgIHRoaXMubGFiZWxQaXhlbE9mZnNldCA9IHRoaXMub3JpZ2luYWxPcHRpb25zLmxhYmVsLnBpeGVsT2Zmc2V0XHJcbiAgICB0aGlzLmxhYmVsTGluZUNvbG9yID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMubGFiZWwubGluZUNvbG9yXHJcbiAgICB0aGlzLmxhYmVsQmFja2dyb3VuZENvbG9yU3RhcnQgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5sYWJlbC5iYWNrZ3JvdW5kQ29sb3JbMF1cclxuICAgIHRoaXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmQgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5sYWJlbC5iYWNrZ3JvdW5kQ29sb3JbMV1cclxuICAgIHRoaXMuYXR0cmlidXRlTGluayA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50XHJcbiAgICB0aGlzLmF0dHJpYnV0ZVZyID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52ci5jb250ZW50XHJcbiAgICB0aGlzLmF0dHJpYnV0ZUNhbWVyYSA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUuY2FtZXJhLmNvbnRlbnRcclxuICAgIHRoaXMuYXR0cmlidXRlR29vZHMgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmdvb2RzLmNvbnRlbnRcclxuICAgIHRoaXMuY2FtZXJhU2VsZWN0ICYmIHRoaXMuY2FtZXJhU2VsZWN0KClcclxuICAgIHRoaXMuZ29vZHNTZWxlY3QgJiYgdGhpcy5nb29kc1NlbGVjdCgpXHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm9wdGlvbnMucG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGlmICh0aGlzLl9lbG1zLmxuZyAmJiB0aGlzLl9lbG1zLmxuZ1tpXSkge1xyXG4gICAgICAgIHRoaXMuX2VsbXMubG5nW2ldLmlubmVySFRNTCA9IHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubG5nLnRvRml4ZWQoOClcclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy5fZWxtcy5sYXQgJiYgdGhpcy5fZWxtcy5sYXRbaV0pIHtcclxuICAgICAgICB0aGlzLl9lbG1zLmxhdFtpXS5pbm5lckhUTUwgPSB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxhdC50b0ZpeGVkKDgpXHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRoaXMuX2VsbXMuYWx0ICYmIHRoaXMuX2VsbXMuYWx0W2ldKSB7XHJcbiAgICAgICAgdGhpcy5fZWxtcy5hbHRbaV0uaW5uZXJIVE1MID0gTnVtYmVyKHRoaXMub3B0aW9ucy5oZWlnaHQudG9GaXhlZCgyKSlcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaGVpZ2h0TW9kZSA9IHRoaXMuaGVpZ2h0TW9kZVxyXG5cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5ub2RlUG9pbnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIHRoaXMuc2RrLnZpZXdlci5lbnRpdGllcy5yZW1vdmUodGhpcy5ub2RlUG9pbnRzW2ldKVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMubm9kZVBvaW50cyA9IFtdXHJcbiAgICBZSi5NZWFzdXJlLlNldE1lYXN1cmVTdGF0dXMoZmFsc2UpXHJcbiAgICB0aGlzLmV2ZW50ICYmIHRoaXMuZXZlbnQuZGVzdHJveSgpXHJcbiAgICB0aGlzLnRpcCAmJiB0aGlzLnRpcC5kZXN0cm95KClcclxuXHJcbiAgICBsZXQgc3ByZWFkU3RhdGUgPSB0aGlzLm9wdGlvbnMuc3ByZWFkU3RhdGVcclxuICAgIHRoaXMucmVtb3ZlQW5pbWF0ZSgpXHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5sb29wID0gdGhpcy5vcHRpb25zLmxvb3BcclxuICAgICAgdGhpcy5zcHJlYWRTdGF0ZSA9IHNwcmVhZFN0YXRlXHJcbiAgICAgIHN5bmNEYXRhKHRoaXMuc2RrLCB0aGlzLm9wdGlvbnMuaWQpXHJcbiAgICAgIHN5bmNTcGxpdERhdGEodGhpcy5zZGssIHRoaXMub3B0aW9ucy5pZClcclxuICAgIH0sIDIwMCk7XHJcblxyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMucHJldmlvdXMgPSBudWxsXHJcbiAgICB9LCA1MCk7XHJcbiAgfVxyXG5cclxuICBhc3luYyByZW1vdmUoKSB7XHJcbiAgICB0aGlzLnJlbW92ZUFuaW1hdGUoKVxyXG4gICAgdGhpcy5ldmVudCAmJiB0aGlzLmV2ZW50LmRlc3Ryb3koKVxyXG4gICAgdGhpcy50aXAgJiYgdGhpcy50aXAuZGVzdHJveSgpXHJcbiAgICB0aGlzLmxhYmVsICYmIHRoaXMubGFiZWwucmVtb3ZlKClcclxuICAgIHRoaXMuZW50aXR5ICYmIHRoaXMuc2RrLnZpZXdlci5lbnRpdGllcy5yZW1vdmUodGhpcy5lbnRpdHkpXHJcbiAgICB0aGlzLmVudGl0eSA9IG51bGxcclxuICAgIGlmICh0aGlzLl9EaWFsb2dPYmplY3QgJiYgIXRoaXMuX0RpYWxvZ09iamVjdC5pc0Rlc3Ryb3kpIHtcclxuICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0LmNsb3NlKClcclxuICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0ID0gbnVsbFxyXG4gICAgfVxyXG4gICAgYXdhaXQgdGhpcy5zZGsucmVtb3ZlSW5jZXRhbmNlKHRoaXMub3B0aW9ucy5pZClcclxuICAgIGF3YWl0IHN5bmNEYXRhKHRoaXMuc2RrLCB0aGlzLm9wdGlvbnMuaWQpXHJcbiAgfVxyXG5cclxuICBfYWRkTGluaygpIHtcclxuICAgIC8vIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWVcclxuICAgIGlmICh0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdsaW5rX2FkZCcpWzBdLnZhbHVlKSB7XHJcbiAgICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50LnB1c2goe1xyXG4gICAgICAgIG5hbWU6ICfpk77mjqUnLFxyXG4gICAgICAgIHVybDogdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbGlua19hZGQnKVswXS52YWx1ZVxyXG4gICAgICB9KVxyXG4gICAgICB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdsaW5rX2FkZCcpWzBdLnZhbHVlID0gJydcclxuICAgICAgdGhpcy5hdHRyaWJ1dGVMaW5rID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnRcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLkRpYWxvZy5jbGlja0FkZExpbmsgJiYgdGhpcy5EaWFsb2cuY2xpY2tBZGRMaW5rKClcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFkZEF0dHJpYnV0ZUxpbmsobGluaykge1xyXG4gICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnQucHVzaCh7XHJcbiAgICAgIG5hbWU6ICfpk77mjqUnLFxyXG4gICAgICB1cmw6IGxpbmtcclxuICAgIH0pXHJcbiAgICB0aGlzLmF0dHJpYnV0ZUxpbmsgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudFxyXG4gIH1cclxuXHJcbiAgX2FkZFJyKCkge1xyXG4gICAgaWYgKHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3ZyX2FkZCcpWzBdLnZhbHVlKSB7XHJcbiAgICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudC5wdXNoKHtcclxuICAgICAgICBuYW1lOiAn5YWo5pmv5Zu+JyAsXHJcbiAgICAgICAgdXJsOiB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd2cl9hZGQnKVswXS52YWx1ZVxyXG4gICAgICB9KVxyXG4gICAgICB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd2cl9hZGQnKVswXS52YWx1ZSA9ICcnXHJcbiAgICAgIHRoaXMuYXR0cmlidXRlVnIgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnRcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLkRpYWxvZy5jbGlja0FkZFZyICYmIHRoaXMuRGlhbG9nLmNsaWNrQWRkVnIoKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYWRkQXR0cmlidXRlUnIodnIpIHtcclxuICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudC5wdXNoKHtcclxuICAgICAgbmFtZTogJ+WFqOaZr+WbvicgLFxyXG4gICAgICB1cmw6IHZyXHJcbiAgICB9KVxyXG4gICAgdGhpcy5hdHRyaWJ1dGVWciA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudFxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICog6aOe5YiwXHJcbiAgKi9cclxuICBhc3luYyBmbHlUbyhvcHRpb25zID0ge30pIHtcclxuICAgIGlmICh0aGlzLl9lcnJvcikge1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuICAgIHNldEFjdGl2ZVZpZXdlcigwKVxyXG4gICAgY2xvc2VSb3RhdGVBcm91bmQodGhpcy5zZGspXHJcbiAgICBjbG9zZVZpZXdGb2xsb3codGhpcy5zZGspXHJcblxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5jdXN0b21WaWV3ICYmIHRoaXMub3B0aW9ucy5jdXN0b21WaWV3LnJlbGF0aXZlUG9zaXRpb24gJiYgdGhpcy5vcHRpb25zLmN1c3RvbVZpZXcub3JpZW50YXRpb24pIHtcclxuICAgICAgbGV0IG9yaWVudGF0aW9uID0ge1xyXG4gICAgICAgIGhlYWRpbmc6IENlc2l1bS5NYXRoLnRvUmFkaWFucyh0aGlzLm9wdGlvbnMuY3VzdG9tVmlldy5vcmllbnRhdGlvbi5oZWFkaW5nIHx8IDAuMCksXHJcbiAgICAgICAgcGl0Y2g6IENlc2l1bS5NYXRoLnRvUmFkaWFucyh0aGlzLm9wdGlvbnMuY3VzdG9tVmlldy5vcmllbnRhdGlvbi5waXRjaCB8fCAtNjAuMCksXHJcbiAgICAgICAgcm9sbDogQ2VzaXVtLk1hdGgudG9SYWRpYW5zKHRoaXMub3B0aW9ucy5jdXN0b21WaWV3Lm9yaWVudGF0aW9uLnJvbGwgfHwgMC4wKVxyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgbG5nID0gdGhpcy5vcHRpb25zLmN1c3RvbVZpZXcucmVsYXRpdmVQb3NpdGlvbi5sbmdcclxuICAgICAgbGV0IGxhdCA9IHRoaXMub3B0aW9ucy5jdXN0b21WaWV3LnJlbGF0aXZlUG9zaXRpb24ubGF0XHJcbiAgICAgIGxldCBhbHQgPSB0aGlzLm9wdGlvbnMuY3VzdG9tVmlldy5yZWxhdGl2ZVBvc2l0aW9uLmFsdFxyXG4gICAgICBsZXQgZGVzdGluYXRpb24gPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlcyhsbmcsIGxhdCwgYWx0KVxyXG5cclxuICAgICAgbGV0IHBvc2l0aW9uID0geyBsbmc6IDAsIGxhdDogMCB9XHJcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMucG9zaXRpb24pIHtcclxuICAgICAgICBwb3NpdGlvbiA9IHsgLi4udGhpcy5vcHRpb25zLnBvc2l0aW9uIH1cclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmICh0aGlzLm9wdGlvbnMucG9zaXRpb25zKSB7XHJcbiAgICAgICAgcG9zaXRpb24gPSB7IC4uLnRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0gfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKHRoaXMub3B0aW9ucy5jZW50ZXIpIHtcclxuICAgICAgICBwb3NpdGlvbiA9IHsgLi4udGhpcy5vcHRpb25zLmNlbnRlciB9XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAodGhpcy5vcHRpb25zLnN0YXJ0KSB7XHJcbiAgICAgICAgcG9zaXRpb24gPSB7IC4uLnRoaXMub3B0aW9ucy5zdGFydCB9XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgnbG5nJykpIHtcclxuICAgICAgICAgIHBvc2l0aW9uLmxuZyA9IHRoaXMub3B0aW9ucy5sbmdcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgnbGF0JykpIHtcclxuICAgICAgICAgIHBvc2l0aW9uLmxhdCA9IHRoaXMub3B0aW9ucy5sYXRcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgnYWx0JykpIHtcclxuICAgICAgICAgIHBvc2l0aW9uLmFsdCA9IHRoaXMub3B0aW9ucy5hbHRcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgLy8g5aaC5p6c5rKh5pyJ6auY5bqm5YC877yM5YiZ6I635Y+W57Sn6LS06auY5bqm6K6h566XXHJcbiAgICAgIGlmICghcG9zaXRpb24uaGFzT3duUHJvcGVydHkoJ2FsdCcpKSB7XHJcbiAgICAgICAgcG9zaXRpb24uYWx0ID0gYXdhaXQgdGhpcy5nZXRDbGFtcFRvSGVpZ2h0KHBvc2l0aW9uKVxyXG4gICAgICB9XHJcbiAgICAgIGxuZyA9IHRoaXMub3B0aW9ucy5jdXN0b21WaWV3LnJlbGF0aXZlUG9zaXRpb24ubG5nICsgcG9zaXRpb24ubG5nXHJcbiAgICAgIGxhdCA9IHRoaXMub3B0aW9ucy5jdXN0b21WaWV3LnJlbGF0aXZlUG9zaXRpb24ubGF0ICsgcG9zaXRpb24ubGF0XHJcbiAgICAgIGFsdCA9IHRoaXMub3B0aW9ucy5jdXN0b21WaWV3LnJlbGF0aXZlUG9zaXRpb24uYWx0ICsgcG9zaXRpb24uYWx0XHJcbiAgICAgIGRlc3RpbmF0aW9uID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXMobG5nLCBsYXQsIGFsdClcclxuICAgICAgdGhpcy5zZGsudmlld2VyLmNhbWVyYS5mbHlUbyh7XHJcbiAgICAgICAgZGVzdGluYXRpb246IGRlc3RpbmF0aW9uLFxyXG4gICAgICAgIG9yaWVudGF0aW9uOiBvcmllbnRhdGlvblxyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGxldCBwb3NpdGlvbkFycmF5ID0gW11cclxuICAgICAgbGV0IGdyb3VuZFxyXG4gICAgICBzd2l0Y2ggKHRoaXMuaGVpZ2h0TW9kZSkge1xyXG4gICAgICAgIGNhc2UgMDpcclxuICAgICAgICBjYXNlICcwJzpcclxuICAgICAgICAgIGdyb3VuZCA9IGZhbHNlXHJcbiAgICAgICAgICBicmVha1xyXG4gICAgICAgIGNhc2UgMTpcclxuICAgICAgICBjYXNlICcxJzpcclxuICAgICAgICAgIGdyb3VuZCA9IGZhbHNlXHJcbiAgICAgICAgICBicmVha1xyXG4gICAgICAgIGNhc2UgMjpcclxuICAgICAgICBjYXNlICcyJzpcclxuICAgICAgICAgIGdyb3VuZCA9IHRydWVcclxuICAgICAgICAgIGJyZWFrXHJcbiAgICAgIH1cclxuICAgICAgaWYgKGdyb3VuZCkge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5vcHRpb25zLnBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgbGV0IGhlaWdodCA9IGF3YWl0IHRoaXMuZ2V0Q2xhbXBUb0hlaWdodCh0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldKVxyXG4gICAgICAgICAgbGV0IGEgPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlcyhcclxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sbmcsXHJcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubGF0LFxyXG4gICAgICAgICAgICBoZWlnaHRcclxuICAgICAgICAgIClcclxuICAgICAgICAgIHBvc2l0aW9uQXJyYXkucHVzaChhLngsIGEueSwgYS56KVxyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpZiAodGhpcy5wb3NpdGlvbnNIKSB7XHJcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucG9zaXRpb25zSC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBwb3NpdGlvbkFycmF5LnB1c2godGhpcy5wb3NpdGlvbnNIW2ldLngsIHRoaXMucG9zaXRpb25zSFtpXS55LCB0aGlzLnBvc2l0aW9uc0hbaV0ueilcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgbGV0IEJvdW5kaW5nU3BoZXJlID0gQ2VzaXVtLkJvdW5kaW5nU3BoZXJlLmZyb21WZXJ0aWNlcyhwb3NpdGlvbkFycmF5KVxyXG4gICAgICB0aGlzLnNkay52aWV3ZXIuY2FtZXJhLmZseVRvQm91bmRpbmdTcGhlcmUoQm91bmRpbmdTcGhlcmUsIHtcclxuICAgICAgICBvZmZzZXQ6IG9wdGlvbnMub3JpZW50YXRpb24gfHwge1xyXG4gICAgICAgICAgaGVhZGluZzogQ2VzaXVtLk1hdGgudG9SYWRpYW5zKDAuMCksXHJcbiAgICAgICAgICBwaXRjaDogQ2VzaXVtLk1hdGgudG9SYWRpYW5zKC05MC4wKSxcclxuICAgICAgICAgIHJvbGw6IENlc2l1bS5NYXRoLnRvUmFkaWFucygwLjApXHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICog5omT5byA5a+M5paH5pys5qGGXHJcbiAgICovXHJcbiAgb3BlblJpY2hUZXh0RWRpdG9yKGUpIHtcclxuICAgIHJpY2hUZXh0Lm9wZW4odGhpcy5vcHRpb25zLmlkLCB0aGlzLm9wdGlvbnMubmFtZSwgdGhpcy5vcHRpb25zLnJpY2hUZXh0Q29udGVudClcclxuICAgIHJpY2hUZXh0LnByaW1hcnlDYWxsQmFjayA9IChjb250ZW50KSA9PiB7XHJcbiAgICAgIHRoaXMub3B0aW9ucy5yaWNoVGV4dENvbnRlbnQgPSBjb250ZW50XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipAZGVzYyDmiZPlvIDlubPnp7vlip/og71cclxuICAgKlxyXG4gICAqIEBtZW1iZXJPZiBTb3VyY2VcclxuICAgKiBAcGFyYW0gc3RhdHVzIHtib29sZWFufVxyXG4gICAqXHJcbiAgICogKi9cclxuICBzZXQgcG9zaXRpb25FZGl0aW5nKHN0YXR1cykge1xyXG4gICAgaWYgKFlKLk1lYXN1cmUuR2V0TWVhc3VyZVN0YXR1cygpIHx8ICF0aGlzLnNkayB8fCAhdGhpcy5zZGsudmlld2VyIHx8ICF0aGlzLmVudGl0eSkge1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuICAgIHRoaXMucmVtb3ZlQW5pbWF0ZSgpXHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzXHJcbiAgICB0aGlzLmV2ZW50ICYmIHRoaXMuZXZlbnQuZGVzdHJveSgpXHJcbiAgICB0aGlzLmV2ZW50ID0gbmV3IE1vdXNlRXZlbnQodGhpcy5zZGspXHJcbiAgICB0aGlzLm9wZXJhdGUucG9zaXRpb25FZGl0aW5nID0gc3RhdHVzXHJcbiAgICBpZiAoc3RhdHVzID09PSB0cnVlKSB7XHJcbiAgICAgIHRoaXMucHJldmlvdXMgPSB7XHJcbiAgICAgICAgcG9zaXRpb25zOiBbLi4udGhpcy5wb3NpdGlvbnNdXHJcbiAgICAgIH1cclxuICAgICAgdGhpcy50aXAgJiYgdGhpcy50aXAuZGVzdHJveSgpXHJcbiAgICAgIHRoaXMudGlwID0gbmV3IE1vdXNlVGlwKCfngrnlh7vpvKDmoIflt6bplK7noa7orqTvvIzlj7PplK7lj5bmtognLCB0aGlzLnNkaylcclxuICAgICAgdGhpcy5sYWJlbCAmJiAodGhpcy5sYWJlbC5lbnRpdHkuYmlsbGJvYXJkLmNvbG9yID0gQ2VzaXVtLkNvbG9yLmZyb21Dc3NDb2xvclN0cmluZyhgcmdiYSgyNTUsMjU1LDI1NSwwLjkpYCkpXHJcbiAgICAgIHRoaXMucGlja2luZyA9IGZhbHNlXHJcbiAgICAgIGxldCBhcnJheSA9IFtdXHJcbiAgICAgIGxldCBwb3NpdGlvbnMgPSBbLi4udGhpcy5wb3NpdGlvbnNdXHJcbiAgICAgIGxldCBkaXNwYXJpdHkgPSBbXVxyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGxldCBwb3NpdGlvbiA9IHRoaXMuY2FydGVzaWFuM1Rvd2dzODQocG9zaXRpb25zW2ldLCB0aGlzLnNkay52aWV3ZXIpXHJcbiAgICAgICAgYXJyYXkucHVzaChbcG9zaXRpb24ubG5nLCBwb3NpdGlvbi5sYXRdKVxyXG4gICAgICB9XHJcbiAgICAgIGxldCBmaXJzdHBvc2l0aW9uID0gdGhpcy5jYXJ0ZXNpYW4zVG93Z3M4NChwb3NpdGlvbnNbMF0sIHRoaXMuc2RrLnZpZXdlcilcclxuICAgICAgYXJyYXkucHVzaChbZmlyc3Rwb3NpdGlvbi5sbmcsIGZpcnN0cG9zaXRpb24ubGF0XSlcclxuICAgICAgdmFyIHBvbHlnb24gPSB0dXJmLnBvbHlnb24oW2FycmF5XSk7XHJcbiAgICAgIHZhciBjZW50cm9pZCA9IHR1cmYuY2VudHJvaWQocG9seWdvbik7XHJcbiAgICAgIGxldCBjZW50ZXIgPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlcyguLi5jZW50cm9pZC5nZW9tZXRyeS5jb29yZGluYXRlcylcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBjZW50ZXIueCAtIHBvc2l0aW9uc1tpXS54XHJcbiAgICAgICAgZGlzcGFyaXR5LnB1c2goe1xyXG4gICAgICAgICAgeDogY2VudGVyLnggLSBwb3NpdGlvbnNbaV0ueCxcclxuICAgICAgICAgIHk6IGNlbnRlci55IC0gcG9zaXRpb25zW2ldLnksXHJcbiAgICAgICAgICB6OiBjZW50ZXIueiAtIHBvc2l0aW9uc1tpXS56LFxyXG4gICAgICAgIH0pXHJcbiAgICAgIH1cclxuICAgICAgbGV0IG5ld3Bvc2l0aW9ucyA9IFtdXHJcbiAgICAgIHRoaXMuZXZlbnQubW91c2VfbW92ZSgobW92ZW1lbnQsIGNhcnRlc2lhbikgPT4ge1xyXG4gICAgICAgIG5ld3Bvc2l0aW9ucyA9IFtdXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkaXNwYXJpdHkubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIG5ld3Bvc2l0aW9ucy5wdXNoKHtcclxuICAgICAgICAgICAgeDogY2FydGVzaWFuLnggLSBkaXNwYXJpdHlbaV0ueCxcclxuICAgICAgICAgICAgeTogY2FydGVzaWFuLnkgLSBkaXNwYXJpdHlbaV0ueSxcclxuICAgICAgICAgICAgejogY2FydGVzaWFuLnogLSBkaXNwYXJpdHlbaV0ueixcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMudGlwLnNldFBvc2l0aW9uKFxyXG4gICAgICAgICAgY2FydGVzaWFuLFxyXG4gICAgICAgICAgbW92ZW1lbnQuZW5kUG9zaXRpb24ueCxcclxuICAgICAgICAgIG1vdmVtZW50LmVuZFBvc2l0aW9uLnlcclxuICAgICAgICApXHJcbiAgICAgIH0pXHJcbiAgICAgIHRoaXMuZXZlbnQubW91c2VfbGVmdCgobW92ZW1lbnQsIGNhcnRlc2lhbikgPT4ge1xyXG4gICAgICAgIHRoaXMuZXZlbnQubW91c2VfbW92ZSgoKSA9PiB7IH0pXHJcbiAgICAgICAgdGhpcy5ldmVudC5tb3VzZV9sZWZ0KCgpID0+IHsgfSlcclxuICAgICAgICB0aGlzLmV2ZW50Lm1vdXNlX3JpZ2h0KCgpID0+IHsgfSlcclxuICAgICAgICB0aGlzLmV2ZW50Lmdlc3R1cmVfcGluY2tfc3RhcnQoKCkgPT4geyB9KVxyXG4gICAgICAgIG5ld3Bvc2l0aW9ucyA9IFtdXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkaXNwYXJpdHkubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGxldCBwb3MzID0ge1xyXG4gICAgICAgICAgICB4OiBjYXJ0ZXNpYW4ueCAtIGRpc3Bhcml0eVtpXS54LFxyXG4gICAgICAgICAgICB5OiBjYXJ0ZXNpYW4ueSAtIGRpc3Bhcml0eVtpXS55LFxyXG4gICAgICAgICAgICB6OiBjYXJ0ZXNpYW4ueiAtIGRpc3Bhcml0eVtpXS56LFxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgbmV3cG9zaXRpb25zLnB1c2gocG9zMylcclxuICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0gPSB0aGlzLmNhcnRlc2lhbjNUb3dnczg0KHBvczMsIHRoaXMuc2RrLnZpZXdlcilcclxuICAgICAgICAgIGlmICh0aGlzLl9lbG1zLmxuZyAmJiB0aGlzLl9lbG1zLmxuZ1tpXSkge1xyXG4gICAgICAgICAgICB0aGlzLl9lbG1zLmxuZ1tpXS5pbm5lckhUTUwgPSB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxuZy50b0ZpeGVkKDgpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAodGhpcy5fZWxtcy5sYXQgJiYgdGhpcy5fZWxtcy5sYXRbaV0pIHtcclxuICAgICAgICAgICAgdGhpcy5fZWxtcy5sYXRbaV0uaW5uZXJIVE1MID0gdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sYXQudG9GaXhlZCg4KVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnBvc2l0aW9ucyA9IG5ld3Bvc2l0aW9uc1xyXG4gICAgICAgIHRoaXMucHJldmlvdXMgPSB7XHJcbiAgICAgICAgICBwb3NpdGlvbnM6IFsuLi50aGlzLnBvc2l0aW9uc11cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5wb3NpdGlvbkVkaXRpbmcgPSBmYWxzZVxyXG4gICAgICB9KVxyXG4gICAgICB0aGlzLmV2ZW50Lm1vdXNlX3JpZ2h0KChtb3ZlbWVudCwgY2FydGVzaWFuKSA9PiB7XHJcbiAgICAgICAgdGhpcy5wb3NpdGlvbkVkaXRpbmcgPSBmYWxzZVxyXG4gICAgICB9KVxyXG5cclxuICAgICAgdGhpcy5ldmVudC5nZXN0dXJlX3BpbmNrX3N0YXJ0KChtb3ZlbWVudCwgY2FydGVzaWFuKSA9PiB7XHJcbiAgICAgICAgbGV0IHN0YXJ0VGltZSA9IG5ldyBEYXRlKClcclxuICAgICAgICB0aGlzLmV2ZW50Lmdlc3R1cmVfcGluY2tfZW5kKCgpID0+IHtcclxuICAgICAgICAgIGxldCBlbmRUaW1lID0gbmV3IERhdGUoKVxyXG4gICAgICAgICAgaWYgKGVuZFRpbWUgLSBzdGFydFRpbWUgPj0gNTAwKSB7XHJcbiAgICAgICAgICAgIC8vIOmVv+aMieWPlua2iFxyXG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uRWRpdGluZyA9IGZhbHNlXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5ldmVudC5tb3VzZV9tb3ZlKCgpID0+IHsgfSlcclxuICAgICAgICAgICAgdGhpcy5ldmVudC5tb3VzZV9sZWZ0KCgpID0+IHsgfSlcclxuICAgICAgICAgICAgdGhpcy5ldmVudC5tb3VzZV9yaWdodCgoKSA9PiB7IH0pXHJcbiAgICAgICAgICAgIHRoaXMuZXZlbnQuZ2VzdHVyZV9waW5ja19zdGFydCgoKSA9PiB7IH0pXHJcbiAgICAgICAgICAgIG5ld3Bvc2l0aW9ucyA9IFtdXHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGlzcGFyaXR5Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgbGV0IHBvczMgPSB7XHJcbiAgICAgICAgICAgICAgICB4OiBjYXJ0ZXNpYW4ueCAtIGRpc3Bhcml0eVtpXS54LFxyXG4gICAgICAgICAgICAgICAgeTogY2FydGVzaWFuLnkgLSBkaXNwYXJpdHlbaV0ueSxcclxuICAgICAgICAgICAgICAgIHo6IGNhcnRlc2lhbi56IC0gZGlzcGFyaXR5W2ldLnosXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIG5ld3Bvc2l0aW9ucy5wdXNoKHBvczMpXHJcbiAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXSA9IHRoaXMuY2FydGVzaWFuM1Rvd2dzODQocG9zMywgdGhpcy5zZGsudmlld2VyKVxyXG4gICAgICAgICAgICAgIGlmICh0aGlzLl9lbG1zLmxuZyAmJiB0aGlzLl9lbG1zLmxuZ1tpXSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZWxtcy5sbmdbaV0uaW5uZXJIVE1MID0gdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sbmcudG9GaXhlZCg4KVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBpZiAodGhpcy5fZWxtcy5sYXQgJiYgdGhpcy5fZWxtcy5sYXRbaV0pIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2VsbXMubGF0W2ldLmlubmVySFRNTCA9IHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubGF0LnRvRml4ZWQoOClcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5wb3NpdGlvbnMgPSBuZXdwb3NpdGlvbnNcclxuICAgICAgICAgICAgdGhpcy5wcmV2aW91cyA9IHtcclxuICAgICAgICAgICAgICBwb3NpdGlvbnM6IFsuLi50aGlzLnBvc2l0aW9uc11cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uRWRpdGluZyA9IGZhbHNlXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgfSlcclxuXHJcbiAgICAgIHRoaXMuZW50aXR5LnBvbHlnb24uaGllcmFyY2h5ID0gbmV3IENlc2l1bS5DYWxsYmFja1Byb3BlcnR5KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBsZXQgcG9zaXRpb244NCA9IFtdXHJcbiAgICAgICAgaWYgKG5ld3Bvc2l0aW9ucy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5ld3Bvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBwb3NpdGlvbjg0LnB1c2goX3RoaXMuY2FydGVzaWFuM1Rvd2dzODQobmV3cG9zaXRpb25zW2ldLCBfdGhpcy5zZGsudmlld2VyKSlcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBwb3NpdGlvbjg0LnB1c2goX3RoaXMuY2FydGVzaWFuM1Rvd2dzODQocG9zaXRpb25zW2ldLCBfdGhpcy5zZGsudmlld2VyKSlcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgX3RoaXMucmVuZXdQb3NpdGlvbnMocG9zaXRpb244NClcclxuICAgICAgICByZXR1cm4gbmV3IENlc2l1bS5Qb2x5Z29uSGllcmFyY2h5KF90aGlzLnBvc2l0aW9uc0gpXHJcbiAgICAgIH0sIGZhbHNlKVxyXG4gICAgICB0aGlzLmVudGl0eS5wb2x5bGluZS5wb3NpdGlvbnMgPSBuZXcgQ2VzaXVtLkNhbGxiYWNrUHJvcGVydHkoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHJldHVybiBbLi4uX3RoaXMucG9zaXRpb25zSCwgX3RoaXMucG9zaXRpb25zSFswXSwgX3RoaXMucG9zaXRpb25zSFsxXV1cclxuICAgICAgfSwgZmFsc2UpXHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKHRoaXMubGFiZWwgJiYgdGhpcy5sYWJlbC5lbnRpdHkgJiYgdGhpcy5sYWJlbC5lbnRpdHkuYmlsbGJvYXJkKSB7XHJcbiAgICAgICAgdGhpcy5sYWJlbC5lbnRpdHkuYmlsbGJvYXJkLmNvbG9yID0gQ2VzaXVtLkNvbG9yLmZyb21Dc3NDb2xvclN0cmluZyhgcmdiYSgyNTUsMjU1LDI1NSwxKWApXHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5waWNraW5nID0gdHJ1ZVxyXG4gICAgICBpZiAodGhpcy5ldmVudCkge1xyXG4gICAgICAgIHRoaXMuZXZlbnQubW91c2VfbW92ZSgoKSA9PiB7IH0pXHJcbiAgICAgICAgdGhpcy5ldmVudC5tb3VzZV9sZWZ0KCgpID0+IHsgfSlcclxuICAgICAgICB0aGlzLmV2ZW50Lm1vdXNlX3JpZ2h0KCgpID0+IHsgfSlcclxuICAgICAgICB0aGlzLmV2ZW50Lmdlc3R1cmVfcGluY2tfc3RhcnQoKCkgPT4geyB9KVxyXG4gICAgICAgIHRoaXMuZXZlbnQuZGVzdHJveSgpXHJcbiAgICAgIH1cclxuICAgICAgdGhpcy50aXAgJiYgdGhpcy50aXAuZGVzdHJveSgpXHJcblxyXG4gICAgICBpZiAoIXRoaXMucHJldmlvdXMpIHtcclxuICAgICAgICB0aGlzLnByZXZpb3VzID0ge1xyXG4gICAgICAgICAgcG9zaXRpb25zOiBbLi4udGhpcy5wb3NpdGlvbnNdXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRoaXMucG9zaXRpb25zID0gWy4uLnRoaXMucHJldmlvdXMucG9zaXRpb25zXVxyXG4gICAgICB9XHJcbiAgICAgIGxldCBwb3NpdGlvbjg0ID0gW11cclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIHBvc2l0aW9uODQucHVzaCh0aGlzLmNhcnRlc2lhbjNUb3dnczg0KHRoaXMucG9zaXRpb25zW2ldLCB0aGlzLnNkay52aWV3ZXIpKVxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMucmVuZXdQb3NpdGlvbnMocG9zaXRpb244NClcclxuXHJcbiAgICAgIHRoaXMuZW50aXR5LnBvbHlnb24uaGllcmFyY2h5ID0gbmV3IENlc2l1bS5DYWxsYmFja1Byb3BlcnR5KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICByZXR1cm4gbmV3IENlc2l1bS5Qb2x5Z29uSGllcmFyY2h5KF90aGlzLnBvc2l0aW9uc0gpXHJcbiAgICAgIH0sIHRydWUpXHJcbiAgICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLnBvc2l0aW9ucyA9IG5ldyBDZXNpdW0uQ2FsbGJhY2tQcm9wZXJ0eShmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgcmV0dXJuIFsuLi5fdGhpcy5wb3NpdGlvbnNILCBfdGhpcy5wb3NpdGlvbnNIWzBdLCBfdGhpcy5wb3NpdGlvbnNIWzFdXVxyXG4gICAgICB9LCB0cnVlKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IHBvc2l0aW9uRWRpdGluZygpIHtcclxuICAgIHJldHVybiB0aGlzLm9wZXJhdGUucG9zaXRpb25FZGl0aW5nXHJcbiAgfVxyXG5cclxuICBzdGF0aWMgRXZlbnRCaW5kaW5nKHRoYXQsIGVsZW1lbnRzKSB7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGxldCBFdmVudCA9IFtdXHJcbiAgICAgIGxldCBpc0V2ZW50ID0gZmFsc2VcclxuICAgICAgbGV0IHJlbW92ZU5hbWUgPSBbXVxyXG4gICAgICBpZiAoIWVsZW1lbnRzW2ldIHx8ICFlbGVtZW50c1tpXS5hdHRyaWJ1dGVzKSB7XHJcbiAgICAgICAgY29udGludWVcclxuICAgICAgfVxyXG4gICAgICBmb3IgKGxldCBtIG9mIGVsZW1lbnRzW2ldLmF0dHJpYnV0ZXMpIHtcclxuICAgICAgICBzd2l0Y2ggKG0ubmFtZSkge1xyXG4gICAgICAgICAgY2FzZSAnQG1vZGVsJzoge1xyXG4gICAgICAgICAgICBpc0V2ZW50ID0gdHJ1ZVxyXG4gICAgICAgICAgICBpZiAoZWxlbWVudHNbaV0udHlwZSA9PSAnY2hlY2tib3gnKSB7XHJcbiAgICAgICAgICAgICAgRXZlbnQucHVzaCgoZSkgPT4geyB0aGF0W20udmFsdWVdID0gZS50YXJnZXQuY2hlY2tlZCB9KVxyXG4gICAgICAgICAgICAgIGVsZW1lbnRzW2ldLmNoZWNrZWQgPSB0aGF0W20udmFsdWVdXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgRXZlbnQucHVzaCgoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gZS50YXJnZXQudmFsdWVcclxuICAgICAgICAgICAgICAgIGlmIChlLnRhcmdldC50eXBlID09ICdudW1iZXInKSB7XHJcbiAgICAgICAgICAgICAgICAgIGlmIChlLmRhdGEgIT0gJy4nICYmIChlLmRhdGEgIT0gJy0nIHx8IGUudGFyZ2V0LnZhbHVlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gTnVtYmVyKHZhbHVlKVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICgoZS50YXJnZXQubWF4KSAmJiB2YWx1ZSA+IE51bWJlcihlLnRhcmdldC5tYXgpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IE51bWJlcihlLnRhcmdldC5tYXgpXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICgoZS50YXJnZXQubWluKSAmJiB2YWx1ZSA8IE51bWJlcihlLnRhcmdldC5taW4pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IE51bWJlcihlLnRhcmdldC5taW4pXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoYXRbbS52YWx1ZV0gPSB2YWx1ZVxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgdGhhdFttLnZhbHVlXSA9IHZhbHVlXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICBpZiAoZWxlbWVudHNbaV0ubm9kZU5hbWUgPT0gJ0lNRycpIHtcclxuICAgICAgICAgICAgICAgIGVsZW1lbnRzW2ldLnNyYyA9IHRoYXRbbS52YWx1ZV1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBlbGVtZW50c1tpXS52YWx1ZSA9IHRoYXRbbS52YWx1ZV1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHRoYXQuX2VsbXNbbS52YWx1ZV0pIHtcclxuICAgICAgICAgICAgICB0aGF0Ll9lbG1zW20udmFsdWVdLnB1c2goZWxlbWVudHNbaV0pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgdGhhdC5fZWxtc1ttLnZhbHVlXSA9IFtlbGVtZW50c1tpXV1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZW1vdmVOYW1lLnB1c2gobS5uYW1lKVxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGNhc2UgJ0BjbGljayc6IHtcclxuICAgICAgICAgICAgZWxlbWVudHNbaV0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgKHRoYXRbbS52YWx1ZV0pID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgICAgICB0aGF0W20udmFsdWVdKGUpXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgcmVtb3ZlTmFtZS5wdXNoKG0ubmFtZSlcclxuICAgICAgICAgICAgLy8gZWxlbWVudHNbaV0uYXR0cmlidXRlcy5yZW1vdmVOYW1lZEl0ZW0obS5uYW1lKVxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGNhc2UgJ0BjaGFuZ2UnOiB7XHJcbiAgICAgICAgICAgIGlzRXZlbnQgPSB0cnVlXHJcbiAgICAgICAgICAgIEV2ZW50LnB1c2goKGUpID0+IHtcclxuICAgICAgICAgICAgICBsZXQgdmFsdWUgPSBlLnRhcmdldC52YWx1ZVxyXG4gICAgICAgICAgICAgIGlmIChlLnRhcmdldC50eXBlID09ICdudW1iZXInICYmIHZhbHVlICE9ICcnKSB7XHJcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IE51bWJlcih2YWx1ZSlcclxuICAgICAgICAgICAgICAgIGUudGFyZ2V0LnZhbHVlID0gdmFsdWVcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiAodGhhdFttLnZhbHVlXSkgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgICAgIHRoYXRbbS52YWx1ZV0oZSwgdmFsdWUpXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gZWxlbWVudHNbaV0uYXR0cmlidXRlc1ttXSA9IHVuZGVmaW5lZFxyXG4gICAgICB9XHJcbiAgICAgIGZvciAobGV0IG4gPSAwOyBuIDwgcmVtb3ZlTmFtZS5sZW5ndGg7IG4rKykge1xyXG4gICAgICAgIGVsZW1lbnRzW2ldLmF0dHJpYnV0ZXMucmVtb3ZlTmFtZWRJdGVtKHJlbW92ZU5hbWVbbl0pXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChpc0V2ZW50KSB7XHJcbiAgICAgICAgbGV0IHZlbnRUeXBlID0gJ2lucHV0J1xyXG4gICAgICAgIGlmIChlbGVtZW50c1tpXS50YWdOYW1lICE9ICdJTlBVVCcgfHwgZWxlbWVudHNbaV0udHlwZSA9PSAnY2hlY2tib3gnKSB7XHJcbiAgICAgICAgICB2ZW50VHlwZSA9ICdjaGFuZ2UnXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChlbGVtZW50c1tpXS5jbGFzc05hbWUuaW5kZXhPZignYmx1cicpICE9PSAtMSkge1xyXG4gICAgICAgICAgdmVudFR5cGUgPSAnYmx1cidcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxlbWVudHNbaV0uYWRkRXZlbnRMaXN0ZW5lcih2ZW50VHlwZSwgKGUpID0+IHtcclxuICAgICAgICAgIGZvciAobGV0IHQgPSAwOyB0IDwgRXZlbnQubGVuZ3RoOyB0KyspIHtcclxuICAgICAgICAgICAgRXZlbnRbdF0oZSlcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc3RhdGljIG5vZGVFZGl0KHRoYXQsIGNiID0gKCkgPT4geyB9KSB7XHJcbiAgICB0aGF0LnBvc2l0aW9uRWRpdGluZyA9IGZhbHNlXHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgaWYgKFlKLk1lYXN1cmUuR2V0TWVhc3VyZVN0YXR1cygpKSB7XHJcbiAgICAgICAgY2IoJ+S4iuS4gOasoea1i+mHj+acque7k+adnycpXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhhdC5yZW1vdmVBbmltYXRlKClcclxuICAgICAgICBZSi5NZWFzdXJlLlNldE1lYXN1cmVTdGF0dXModHJ1ZSlcclxuICAgICAgICB0aGF0LnRpcCA9IG5ldyBNb3VzZVRpcCgn6K+36YCJ5oup5LiA5Liq6aG254K577yM5Y+z6ZSu5Y+W5raIJywgdGhhdC5zZGspXHJcbiAgICAgICAgdGhhdC5ldmVudCA9IG5ldyBNb3VzZUV2ZW50KHRoYXQuc2RrKVxyXG4gICAgICAgIHRoYXQubm9kZVBvaW50cyA9IFtdXHJcbiAgICAgICAgbGV0IHNlbGVjdFBvaW50XHJcbiAgICAgICAgbGV0IG9yaWdpbmFsUG9zaXRpb25cclxuICAgICAgICBsZXQgb3B0aW9uc1Bvc2l0aW9ucyA9IFsuLi50aGF0Lm9wdGlvbnMucG9zaXRpb25zXVxyXG5cclxuICAgICAgICBsZXQgbGVmdEV2ZW50ID0gKG1vdmVtZW50LCBjYXJ0ZXNpYW4pID0+IHtcclxuICAgICAgICAgIGlmIChzZWxlY3RQb2ludCkge1xyXG4gICAgICAgICAgICB0aGF0Lm9wdGlvbnMucG9zaXRpb25zW3NlbGVjdFBvaW50LmluZGV4XSA9IHRoYXQuY2FydGVzaWFuM1Rvd2dzODQoY2FydGVzaWFuLCB0aGF0LnNkay52aWV3ZXIpXHJcbiAgICAgICAgICAgIG9wdGlvbnNQb3NpdGlvbnNbc2VsZWN0UG9pbnQuaW5kZXhdID0gdGhhdC5vcHRpb25zLnBvc2l0aW9uc1tzZWxlY3RQb2ludC5pbmRleF1cclxuICAgICAgICAgICAgbGV0IGluZGV4ID0gc2VsZWN0UG9pbnQuaW5kZXhcclxuICAgICAgICAgICAgbGV0IGVudGl0eSA9IHRoYXQuc2RrLnZpZXdlci5lbnRpdGllcy5hZGQoe1xyXG4gICAgICAgICAgICAgIG5hbWU6ICdub2RlLXNlY29uZGFyeS1lZGl0LXBvaW50JyxcclxuICAgICAgICAgICAgICBpbmRleDogaW5kZXgsXHJcbiAgICAgICAgICAgICAgcG9zaXRpb246IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzKG9wdGlvbnNQb3NpdGlvbnNbc2VsZWN0UG9pbnQuaW5kZXhdLmxuZywgb3B0aW9uc1Bvc2l0aW9uc1tzZWxlY3RQb2ludC5pbmRleF0ubGF0LCBvcHRpb25zUG9zaXRpb25zW3NlbGVjdFBvaW50LmluZGV4XS5hbHQpLFxyXG4gICAgICAgICAgICAgIGJpbGxib2FyZDoge1xyXG4gICAgICAgICAgICAgICAgaW1hZ2U6IHRoYXQuZ2V0U291cmNlUm9vdFBhdGgoKSArICcvaW1nL3BvaW50LnBuZycsXHJcbiAgICAgICAgICAgICAgICB3aWR0aDogMTUsXHJcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IDE1LFxyXG4gICAgICAgICAgICAgICAgZGlzYWJsZURlcHRoVGVzdERpc3RhbmNlOiBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksXHJcbiAgICAgICAgICAgICAgICBjb2xvcjogQ2VzaXVtLkNvbG9yLldISVRFLndpdGhBbHBoYSgwLjk5KVxyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIHRoYXQubm9kZVBvaW50cy5zcGxpY2Uoc2VsZWN0UG9pbnQuaW5kZXgsIDAsIGVudGl0eSlcclxuICAgICAgICAgICAgc2VsZWN0UG9pbnQgPSBudWxsXHJcbiAgICAgICAgICAgIHRoYXQudGlwLnNldF90ZXh0KCfor7fpgInmi6nkuIDkuKrpobbngrnvvIzlj7PplK7lj5bmtognKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHZhciBwaWNrID0gdGhhdC5zZGsudmlld2VyLnNjZW5lLnBpY2sobW92ZW1lbnQucG9zaXRpb24pO1xyXG4gICAgICAgICAgICBpZiAocGljayAmJiBwaWNrLmlkICYmIHBpY2suaWQubmFtZSAmJiBwaWNrLmlkLm5hbWUgPT09ICdub2RlLXNlY29uZGFyeS1lZGl0LXBvaW50Jykge1xyXG4gICAgICAgICAgICAgIHNlbGVjdFBvaW50ID0gcGljay5pZFxyXG4gICAgICAgICAgICAgIG9yaWdpbmFsUG9zaXRpb24gPSB0aGF0LmNhcnRlc2lhbjNUb3dnczg0KHBpY2suaWQucG9zaXRpb24uZ2V0VmFsdWUoKSwgdGhhdC5zZGsudmlld2VyKVxyXG4gICAgICAgICAgICAgIHRoYXQubm9kZVBvaW50cy5zcGxpY2UocGljay5pZC5pbmRleCwgMSlcclxuICAgICAgICAgICAgICB0aGF0LnNkay52aWV3ZXIuZW50aXRpZXMucmVtb3ZlKHBpY2suaWQpXHJcbiAgICAgICAgICAgICAgdGhhdC50aXAuc2V0X3RleHQoJ+W3pumUruehruWumu+8jOWPs+mUruWPlua2iCcpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoYXQucmVuZXdQb3NpdGlvbnMoKVxyXG4gICAgICAgICAgdGhhdC50aXAuc2V0UG9zaXRpb24oXHJcbiAgICAgICAgICAgIGNhcnRlc2lhbixcclxuICAgICAgICAgICAgbW92ZW1lbnQucG9zaXRpb24ueCxcclxuICAgICAgICAgICAgbW92ZW1lbnQucG9zaXRpb24ueVxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgcmlnaHRFdmVudCA9ICgpID0+IHtcclxuICAgICAgICAgIHRoYXQuZXZlbnQubW91c2VfbW92ZSgoKSA9PiB7IH0pXHJcbiAgICAgICAgICB0aGF0LmV2ZW50Lm1vdXNlX2xlZnQoKCkgPT4geyB9KVxyXG4gICAgICAgICAgdGhhdC5ldmVudC5tb3VzZV9yaWdodCgoKSA9PiB7IH0pXHJcbiAgICAgICAgICB0aGF0LmV2ZW50Lmdlc3R1cmVfcGluY2tfc3RhcnQoKCkgPT4geyB9KVxyXG4gICAgICAgICAgaWYgKHNlbGVjdFBvaW50KSB7XHJcbiAgICAgICAgICAgIG9wdGlvbnNQb3NpdGlvbnNbc2VsZWN0UG9pbnQuaW5kZXhdID0gb3JpZ2luYWxQb3NpdGlvblxyXG4gICAgICAgICAgICBpZiAodGhhdC5fZWxtcy5sbmcgJiYgdGhhdC5fZWxtcy5sbmdbc2VsZWN0UG9pbnQuaW5kZXhdKSB7XHJcbiAgICAgICAgICAgICAgdGhhdC5fZWxtcy5sbmdbc2VsZWN0UG9pbnQuaW5kZXhdLmlubmVySFRNTCA9IHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbc2VsZWN0UG9pbnQuaW5kZXhdLmxuZy50b0ZpeGVkKDgpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHRoYXQuX2VsbXMubGF0ICYmIHRoYXQuX2VsbXMubGF0W3NlbGVjdFBvaW50LmluZGV4XSkge1xyXG4gICAgICAgICAgICAgIHRoYXQuX2VsbXMubGF0W3NlbGVjdFBvaW50LmluZGV4XS5pbm5lckhUTUwgPSB0aGF0Lm9wdGlvbnMucG9zaXRpb25zW3NlbGVjdFBvaW50LmluZGV4XS5sYXQudG9GaXhlZCg4KVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNiKG51bGwsIG9wdGlvbnNQb3NpdGlvbnMpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGF0Lm9wdGlvbnMucG9zaXRpb25zID0gWy4uLm9wdGlvbnNQb3NpdGlvbnNdXHJcbiAgICAgICAgICB0aGF0LmhlaWdodE1vZGUgPSB0aGF0LmhlaWdodE1vZGVcclxuICAgICAgICAgIHRoYXQucHJldmlvdXMgPSBudWxsXHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgdGhhdC5lbnRpdHkucG9seWxpbmUuY2xhbXBUb0dyb3VuZCA9IHRydWVcclxuICAgICAgICB0aGF0LmVudGl0eS5wb2x5bGluZS5hcmNUeXBlID0gQ2VzaXVtLkFyY1R5cGUuR0VPREVTSUNcclxuICAgICAgICB0aGF0LmVudGl0eS5wb2x5Z29uLnBlclBvc2l0aW9uSGVpZ2h0ID0gZmFsc2VcclxuICAgICAgICB0aGF0LmVudGl0eS5wb2x5Z29uLmhpZXJhcmNoeSA9IG5ldyBDZXNpdW0uQ2FsbGJhY2tQcm9wZXJ0eShmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICByZXR1cm4gbmV3IENlc2l1bS5Qb2x5Z29uSGllcmFyY2h5KHRoYXQucG9zaXRpb25zSClcclxuICAgICAgICB9LCBmYWxzZSlcclxuICAgICAgICB0aGF0LmVudGl0eS5wb2x5bGluZS5wb3NpdGlvbnMgPSBuZXcgQ2VzaXVtLkNhbGxiYWNrUHJvcGVydHkoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgcmV0dXJuIFsuLi50aGF0LnBvc2l0aW9uc0gsIHRoYXQucG9zaXRpb25zSFswXSwgdGhhdC5wb3NpdGlvbnNIWzFdXVxyXG4gICAgICAgIH0sIGZhbHNlKVxyXG5cclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgIHRoYXQuZXZlbnQubW91c2VfbGVmdChsZWZ0RXZlbnQpXHJcblxyXG4gICAgICAgICAgdGhhdC5ldmVudC5tb3VzZV9yaWdodChyaWdodEV2ZW50KVxyXG5cclxuICAgICAgICAgIHRoYXQuZXZlbnQubW91c2VfbW92ZSgobW92ZW1lbnQsIGNhcnRlc2lhbikgPT4ge1xyXG4gICAgICAgICAgICBpZiAoc2VsZWN0UG9pbnQpIHtcclxuICAgICAgICAgICAgICB0aGF0Lm9wdGlvbnMucG9zaXRpb25zW3NlbGVjdFBvaW50LmluZGV4XSA9IHRoYXQuY2FydGVzaWFuM1Rvd2dzODQoY2FydGVzaWFuLCB0aGF0LnNkay52aWV3ZXIpXHJcbiAgICAgICAgICAgICAgdGhhdC5yZW5ld1Bvc2l0aW9ucygpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhhdC50aXAuc2V0UG9zaXRpb24oXHJcbiAgICAgICAgICAgICAgY2FydGVzaWFuLFxyXG4gICAgICAgICAgICAgIG1vdmVtZW50LmVuZFBvc2l0aW9uLngsXHJcbiAgICAgICAgICAgICAgbW92ZW1lbnQuZW5kUG9zaXRpb24ueVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICB9KVxyXG5cclxuICAgICAgICAgIHRoYXQuZXZlbnQuZ2VzdHVyZV9waW5ja19zdGFydCgobW92ZW1lbnQsIGNhcnRlc2lhbikgPT4ge1xyXG4gICAgICAgICAgICBsZXQgc3RhcnRUaW1lID0gbmV3IERhdGUoKVxyXG4gICAgICAgICAgICBsZXQgcG9zID0ge1xyXG4gICAgICAgICAgICAgIHBvc2l0aW9uOiB7XHJcbiAgICAgICAgICAgICAgICB4OiAobW92ZW1lbnQucG9zaXRpb24xLnggKyBtb3ZlbWVudC5wb3NpdGlvbjIueCkgLyAyLFxyXG4gICAgICAgICAgICAgICAgeTogKG1vdmVtZW50LnBvc2l0aW9uMS55ICsgbW92ZW1lbnQucG9zaXRpb24yLnkpIC8gMlxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGF0LmV2ZW50Lmdlc3R1cmVfcGluY2tfZW5kKCgpID0+IHtcclxuICAgICAgICAgICAgICBsZXQgZW5kVGltZSA9IG5ldyBEYXRlKClcclxuICAgICAgICAgICAgICBpZiAoZW5kVGltZSAtIHN0YXJ0VGltZSA+PSA1MDApIHtcclxuICAgICAgICAgICAgICAgIC8vIOmVv+aMieWPlua2iFxyXG4gICAgICAgICAgICAgICAgcmlnaHRFdmVudCgpXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgbGVmdEV2ZW50KHBvcywgY2FydGVzaWFuKVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgIH0pXHJcblxyXG5cclxuICAgICAgICAgIGxldCBwb2ludHMgPSBbW11dXHJcbiAgICAgICAgICBsZXQgcG9zODQgPSBbXVxyXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGF0LnBvc2l0aW9uc0gubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgbGV0IHBvc2l0aW9uID0gdGhhdC5jYXJ0ZXNpYW4zVG93Z3M4NCh0aGF0LnBvc2l0aW9uc0hbaV0sIHRoYXQuc2RrLnZpZXdlcilcclxuICAgICAgICAgICAgcG9zODQucHVzaChwb3NpdGlvbilcclxuICAgICAgICAgICAgcG9pbnRzWzBdLnB1c2goW3Bvc2l0aW9uLmxuZywgcG9zaXRpb24ubGF0XSlcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGxldCBwb3NpdGlvbiA9IHRoYXQuY2FydGVzaWFuM1Rvd2dzODQodGhhdC5wb3NpdGlvbnNIWzBdLCB0aGF0LnNkay52aWV3ZXIpXHJcbiAgICAgICAgICBwb2ludHNbMF0ucHVzaChbcG9zaXRpb24ubG5nLCBwb3NpdGlvbi5sYXRdKVxyXG4gICAgICAgICAgbGV0IHBvbHlnb24gPSB0dXJmLnBvbHlnb24ocG9pbnRzKVxyXG4gICAgICAgICAgbGV0IGNlbnRyb2lkID0gdHVyZi5wb2ludE9uRmVhdHVyZShwb2x5Z29uKVxyXG4gICAgICAgICAgbGV0IG9iamVjdHNUb0V4Y2x1ZGUgPSBbLi4udGhhdC5zZGsudmlld2VyLmVudGl0aWVzLnZhbHVlc11cclxuICAgICAgICAgIHRoYXRcclxuICAgICAgICAgICAgLmdldENsYW1wVG9IZWlnaHQoe1xyXG4gICAgICAgICAgICAgIGxuZzogY2VudHJvaWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMF0sXHJcbiAgICAgICAgICAgICAgbGF0OiBjZW50cm9pZC5nZW9tZXRyeS5jb29yZGluYXRlc1sxXVxyXG4gICAgICAgICAgICB9LCBvYmplY3RzVG9FeGNsdWRlKVxyXG4gICAgICAgICAgICAudGhlbihoZWlnaHQgPT4ge1xyXG4gICAgICAgICAgICAgIHRoYXQubGFiZWwucG9zaXRpb24gPSBbXHJcbiAgICAgICAgICAgICAgICBjZW50cm9pZC5nZW9tZXRyeS5jb29yZGluYXRlc1swXSxcclxuICAgICAgICAgICAgICAgIGNlbnRyb2lkLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzFdLFxyXG4gICAgICAgICAgICAgICAgaGVpZ2h0XHJcbiAgICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgY3JlYXRlTm9kZVBvaW50cygpXHJcbiAgICAgICAgfSwgMjAwKTtcclxuICAgICAgICBhc3luYyBmdW5jdGlvbiBjcmVhdGVOb2RlUG9pbnRzKCkge1xyXG4gICAgICAgICAgbGV0IG9iamVjdHNUb0V4Y2x1ZGUgPSBbLi4udGhhdC5zZGsudmlld2VyLmVudGl0aWVzLnZhbHVlc11cclxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3B0aW9uc1Bvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBsZXQgaGVpZ2h0ID0gYXdhaXQgdGhhdC5nZXRDbGFtcFRvSGVpZ2h0KHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbaV0sIG9iamVjdHNUb0V4Y2x1ZGUpXHJcbiAgICAgICAgICAgIGxldCBlbnRpdHkgPSB0aGF0LnNkay52aWV3ZXIuZW50aXRpZXMuYWRkKHtcclxuICAgICAgICAgICAgICBuYW1lOiAnbm9kZS1zZWNvbmRhcnktZWRpdC1wb2ludCcsXHJcbiAgICAgICAgICAgICAgaW5kZXg6IGksXHJcbiAgICAgICAgICAgICAgcG9zaXRpb246IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzKG9wdGlvbnNQb3NpdGlvbnNbaV0ubG5nLCBvcHRpb25zUG9zaXRpb25zW2ldLmxhdCwgaGVpZ2h0KSxcclxuICAgICAgICAgICAgICBiaWxsYm9hcmQ6IHtcclxuICAgICAgICAgICAgICAgIGltYWdlOiB0aGF0LmdldFNvdXJjZVJvb3RQYXRoKCkgKyAnL2ltZy9wb2ludC5wbmcnLFxyXG4gICAgICAgICAgICAgICAgd2lkdGg6IDE1LFxyXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiAxNSxcclxuICAgICAgICAgICAgICAgIGRpc2FibGVEZXB0aFRlc3REaXN0YW5jZTogTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLFxyXG4gICAgICAgICAgICAgICAgY29sb3I6IENlc2l1bS5Db2xvci5XSElURS53aXRoQWxwaGEoMC45OSlcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB0aGF0Lm5vZGVQb2ludHMucHVzaChlbnRpdHkpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9LCAwKTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBjbG9zZU5vZGVFZGl0KHRoYXQpIHtcclxuICAgIFlKLk1lYXN1cmUuU2V0TWVhc3VyZVN0YXR1cyhmYWxzZSlcclxuICAgIHRoYXQuZXZlbnQgJiYgdGhhdC5ldmVudC5kZXN0cm95KClcclxuICAgIHRoYXQudGlwICYmIHRoYXQudGlwLmRlc3Ryb3koKVxyXG4gICAgdGhhdC50aXAgPSBudWxsXHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGF0Lm5vZGVQb2ludHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgdGhhdC5zZGsudmlld2VyLmVudGl0aWVzLnJlbW92ZSh0aGF0Lm5vZGVQb2ludHNbaV0pXHJcbiAgICB9XHJcbiAgICB0aGF0Lm5vZGVQb2ludHMgPSBbXVxyXG4gICAgdGhhdC5waWNraW5nID0gdHJ1ZVxyXG4gIH1cclxuXHJcbiAgc2V0UG9zaXRpb24odikge1xyXG4gICAgbGV0IGNhcnRlc2lhbiA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzKHYucG9zaXRpb24ubG5nLCB2LnBvc2l0aW9uLmxhdCwgdi5wb3NpdGlvbi5hbHQpXHJcbiAgICBsZXQgcG9zaXRpb25zID0gWy4uLnRoaXMucG9zaXRpb25zXVxyXG4gICAgbGV0IGFycmF5ID0gW11cclxuICAgIGxldCBkaXNwYXJpdHkgPSBbXVxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgbGV0IHBvc2l0aW9uID0gdGhpcy5jYXJ0ZXNpYW4zVG93Z3M4NChwb3NpdGlvbnNbaV0sIHRoaXMuc2RrLnZpZXdlcilcclxuICAgICAgYXJyYXkucHVzaChbcG9zaXRpb24ubG5nLCBwb3NpdGlvbi5sYXRdKVxyXG4gICAgfVxyXG4gICAgbGV0IGZpcnN0cG9zaXRpb24gPSB0aGlzLmNhcnRlc2lhbjNUb3dnczg0KHBvc2l0aW9uc1swXSwgdGhpcy5zZGsudmlld2VyKVxyXG4gICAgYXJyYXkucHVzaChbZmlyc3Rwb3NpdGlvbi5sbmcsIGZpcnN0cG9zaXRpb24ubGF0XSlcclxuICAgIHZhciBwb2x5Z29uID0gdHVyZi5wb2x5Z29uKFthcnJheV0pO1xyXG4gICAgdmFyIGNlbnRyb2lkID0gdHVyZi5jZW50cm9pZChwb2x5Z29uKTtcclxuICAgIGxldCBjZW50ZXIgPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlcyguLi5jZW50cm9pZC5nZW9tZXRyeS5jb29yZGluYXRlcylcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGRpc3Bhcml0eS5wdXNoKHtcclxuICAgICAgICB4OiBjZW50ZXIueCAtIHBvc2l0aW9uc1tpXS54LFxyXG4gICAgICAgIHk6IGNlbnRlci55IC0gcG9zaXRpb25zW2ldLnksXHJcbiAgICAgICAgejogY2VudGVyLnogLSBwb3NpdGlvbnNbaV0ueixcclxuICAgICAgfSlcclxuICAgIH1cclxuICAgIGxldCBuZXdwb3NpdGlvbnMgPSBbXVxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkaXNwYXJpdHkubGVuZ3RoOyBpKyspIHtcclxuICAgICAgbmV3cG9zaXRpb25zLnB1c2goe1xyXG4gICAgICAgIHg6IGNhcnRlc2lhbi54IC0gZGlzcGFyaXR5W2ldLngsXHJcbiAgICAgICAgeTogY2FydGVzaWFuLnkgLSBkaXNwYXJpdHlbaV0ueSxcclxuICAgICAgICB6OiBjYXJ0ZXNpYW4ueiAtIGRpc3Bhcml0eVtpXS56LFxyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gICAgdGhpcy5sYWJlbC5wb3NpdGlvbiA9IFt2LnBvc2l0aW9uLmxuZywgdi5wb3NpdGlvbi5sYXQsIHYucG9zaXRpb24uYWx0XVxyXG5cclxuICAgIGxldCBwb3NpdGlvbnM4NCA9IFtdXHJcbiAgICBpZiAobmV3cG9zaXRpb25zLmxlbmd0aCA+IDApIHtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuZXdwb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBwb3NpdGlvbnM4NC5wdXNoKHRoaXMuY2FydGVzaWFuM1Rvd2dzODQobmV3cG9zaXRpb25zW2ldLCB0aGlzLnNkay52aWV3ZXIpKVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBsZXQgYXJyID0gdGhpcy5jb21wdXRlUGluY2VyQXJyb3cocG9zaXRpb25zODQpXHJcbiAgICBpZiAoYXJyLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG4gICAgdGhpcy5lbnRpdHkucG9seWdvbi5oaWVyYXJjaHkgPSBuZXcgQ2VzaXVtLkNhbGxiYWNrUHJvcGVydHkoZnVuY3Rpb24gKCkge1xyXG4gICAgICByZXR1cm4gbmV3IENlc2l1bS5Qb2x5Z29uSGllcmFyY2h5KGFycilcclxuICAgIH0sIGZhbHNlKVxyXG4gICAgdGhpcy5lbnRpdHkucG9seWxpbmUucG9zaXRpb25zID0gbmV3IENlc2l1bS5DYWxsYmFja1Byb3BlcnR5KGZ1bmN0aW9uICgpIHtcclxuICAgICAgaWYgKGFyci5sZW5ndGggPj0gMykge1xyXG4gICAgICAgIHJldHVybiBbLi4uYXJyLCBhcnJbMF0sIGFyclsxXV1cclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICByZXR1cm4gWy4uLmFycl1cclxuICAgICAgfVxyXG4gICAgfSwgZmFsc2UpXHJcbiAgfVxyXG5cclxuICBzZXRESVYob3B0aW9ucyA9IHsgZG9taWQ6IFwiXCIsIHg6IDEwLCB5OiAxMCB9KSB7XHJcbiAgICBvcHRpb25zLnggPSAob3B0aW9ucy54IHx8IG9wdGlvbnMueCA9PT0gMCkgPyBvcHRpb25zLnggOiAxMFxyXG4gICAgb3B0aW9ucy55ID0gKG9wdGlvbnMueSB8fCBvcHRpb25zLnkgPT09IDApID8gb3B0aW9ucy55IDogMTBcclxuXHJcbiAgICBsZXQgcG9zaXRpb25zID0gdGhpcy5jb21wdXRlUGluY2VyQXJyb3codGhpcy5vcHRpb25zLnBvc2l0aW9ucylcclxuICAgIGlmIChwb3NpdGlvbnMubGVuZ3RoID09IDApIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcbiAgICBsZXQgcG9pbnRzID0gW1tdXVxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgbGV0IHBvc2l0aW9uID0gdGhpcy5jYXJ0ZXNpYW4zVG93Z3M4NChwb3NpdGlvbnNbaV0sIHRoaXMuc2RrLnZpZXdlcilcclxuICAgICAgcG9pbnRzWzBdLnB1c2goW3Bvc2l0aW9uLmxuZywgcG9zaXRpb24ubGF0XSlcclxuICAgIH1cclxuICAgIGxldCBwb3NpdGlvbiA9IHRoaXMuY2FydGVzaWFuM1Rvd2dzODQocG9zaXRpb25zWzBdLCB0aGlzLnNkay52aWV3ZXIpXHJcbiAgICBwb2ludHNbMF0ucHVzaChbcG9zaXRpb24ubG5nLCBwb3NpdGlvbi5sYXRdKVxyXG4gICAgbGV0IHBvbHlnb24gPSB0dXJmLnBvbHlnb24ocG9pbnRzKTtcclxuICAgIC8vIGxldCBjZW50cm9pZCA9IHR1cmYuY2VudHJvaWQocG9seWdvbik7XHJcbiAgICBsZXQgY2VudHJvaWQgPSB0dXJmLnBvaW50T25GZWF0dXJlKHBvbHlnb24pO1xyXG4gICAgbGV0IHNpdGVJbmZvRG9tID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQob3B0aW9ucy5kb21pZClcclxuICAgIGxldCBzaXRlSW5mb1Bvc2l0aW9uID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXMoY2VudHJvaWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMF0sIGNlbnRyb2lkLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzFdKVxyXG5cclxuICAgIHRoaXMuc2RrLnZpZXdlci5zY2VuZS5wb3N0UmVuZGVyLmFkZEV2ZW50TGlzdGVuZXIoKHBlcmNlbnRhZ2UpID0+IHtcclxuICAgICAgLy/ovazmjaLliLDlsY/luZXlnZDmoIdcclxuICAgICAgaWYgKHNpdGVJbmZvRG9tLnN0eWxlLmRpc3BsYXkgPT09ICdibG9jaycgfHwgc2l0ZUluZm9Eb20uc3R5bGUuZGlzcGxheSA9PT0gJycpIHtcclxuICAgICAgICBsZXQgd2lucG9zID0gdGhpcy5zZGsudmlld2VyLnNjZW5lLmNhcnRlc2lhblRvQ2FudmFzQ29vcmRpbmF0ZXMoc2l0ZUluZm9Qb3NpdGlvbik7XHJcbiAgICAgICAgaWYgKHdpbnBvcykge1xyXG4gICAgICAgICAgc2l0ZUluZm9Eb20uc3R5bGUubGVmdCA9ICh3aW5wb3MueCArIG9wdGlvbnMueCkudG9GaXhlZCgwKSArICdweCc7XHJcbiAgICAgICAgICBzaXRlSW5mb0RvbS5zdHlsZS50b3AgPSAod2lucG9zLnkgKyBvcHRpb25zLnkpLnRvRml4ZWQoMCkgKyAncHgnO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBnZXQgc3ByZWFkVGltZSgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuc3ByZWFkVGltZVxyXG4gIH1cclxuXHJcbiAgc2V0IHNwcmVhZFRpbWUodikge1xyXG4gICAgbGV0IHNwcmVhZFRpbWUgPSBOdW1iZXIodilcclxuICAgIGlmIChpc05hTihzcHJlYWRUaW1lKSkge1xyXG4gICAgICBzcHJlYWRUaW1lID0gMzAwMFxyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoc3ByZWFkVGltZSA8IDUwMCkge1xyXG4gICAgICBzcHJlYWRUaW1lID0gNTAwXHJcbiAgICB9IGVsc2UgaWYgKHNwcmVhZFRpbWUgPiA5OTk5OTk5KSB7XHJcbiAgICAgIHNwcmVhZFRpbWUgPSA5OTk5OTk5XHJcbiAgICB9XHJcbiAgICB0aGlzLm9wdGlvbnMuc3ByZWFkVGltZSA9IHNwcmVhZFRpbWVcclxuICAgIGlmICh0aGlzLnNwcmVhZFN0YXRlKSB7XHJcbiAgICAgIHRoaXMuc2V0U3ByZWFkUHJvZ3Jlc3NCeVRpbWUoKVxyXG4gICAgfVxyXG4gICAgdGhpcy5fZWxtcy5zcHJlYWRUaW1lICYmIHRoaXMuX2VsbXMuc3ByZWFkVGltZS5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgIGl0ZW0udmFsdWUgPSBzcHJlYWRUaW1lXHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgZ2V0IGxvb3AoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmxvb3BcclxuICB9XHJcbiAgc2V0IGxvb3Aodikge1xyXG4gICAgdGhpcy5vcHRpb25zLmxvb3AgPSB2XHJcbiAgICBpZiAodGhpcy5Ud2VlbkFuaW1hdGUpIHtcclxuICAgICAgaWYgKHYpIHtcclxuICAgICAgICB0aGlzLlR3ZWVuQW5pbWF0ZS5yZXBlYXQoSW5maW5pdHkpXHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdGhpcy5Ud2VlbkFuaW1hdGUucmVwZWF0KClcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5fZWxtcy5sb29wICYmIHRoaXMuX2VsbXMubG9vcC5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgIGl0ZW0uY2hlY2tlZCA9IHZcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBnZXQgc3ByZWFkU3RhdGUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLnNwcmVhZFN0YXRlXHJcbiAgfVxyXG4gIHNldCBzcHJlYWRTdGF0ZSh2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMuc3ByZWFkU3RhdGUgPSB2XHJcbiAgICBpZiAodGhpcy5Ud2VlbkFuaW1hdGUpIHtcclxuICAgICAgaWYgKHYpIHtcclxuICAgICAgICB0aGlzLmxpbmVFZGl0ID0gZmFsc2VcclxuICAgICAgICB0aGlzLnNldFNwcmVhZFByb2dyZXNzQnlUaW1lKHRoaXMuVHdlZW5BbmltYXRlLl9vYmplY3QuZGlzdGFuY2UxIC8gdGhpcy5Ud2VlbkFuaW1hdGUuX3ZhbHVlc0VuZC5kaXN0YW5jZTEgKiB0aGlzLnNwcmVhZFRpbWUpXHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdGhpcy5Ud2VlbkFuaW1hdGUucGF1c2UoKVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKHYpIHtcclxuICAgICAgICB0aGlzLnNldFNwcmVhZFByb2dyZXNzQnlUaW1lKClcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5fZWxtcy5zcHJlYWRTdGF0ZSAmJiB0aGlzLl9lbG1zLnNwcmVhZFN0YXRlLmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgaXRlbS5jaGVja2VkID0gdlxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIHNldFNwcmVhZFByb2dyZXNzQnlUaW1lKHRpbWUgPSAwKSB7XHJcbiAgICBpZiAoIXRoaXMuZW50aXR5KSB7XHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG4gICAgbGV0IHRoYXQgPSB0aGlzXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubm9kZVBvaW50cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICB0aGlzLnNkay52aWV3ZXIuZW50aXRpZXMucmVtb3ZlKHRoaXMubm9kZVBvaW50c1tpXSlcclxuICAgIH1cclxuICAgIHRoaXMubm9kZVBvaW50cyA9IFtdXHJcbiAgICBZSi5NZWFzdXJlLlNldE1lYXN1cmVTdGF0dXMoZmFsc2UpXHJcbiAgICB0aGlzLmV2ZW50ICYmIHRoaXMuZXZlbnQuZGVzdHJveSgpXHJcbiAgICB0aGlzLnRpcCAmJiB0aGlzLnRpcC5kZXN0cm95KClcclxuXHJcbiAgICBsZXQgUGluY2VyQXJyb3dBcnIgPSB0aGlzLmNvbXB1dGVQaW5jZXJBcnJvdyh0aGlzLm9wdGlvbnMucG9zaXRpb25zKVxyXG4gICAgaWYgKFBpbmNlckFycm93QXJyLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG4gICAgbGV0IGFyclxyXG4gICAgbGV0IGxpbmVBcnJcclxuICAgIC8vIGlmIChhcnIubGVuZ3RoID49IDMpIHtcclxuICAgIC8vICAgbGluZUFyciA9IFsuLi5hcnIsIGFyclswXSwgYXJyWzFdXVxyXG4gICAgLy8gfVxyXG4gICAgLy8gZWxzZSB7XHJcbiAgICAvLyAgIGxpbmVBcnIgPSBbLi4uYXJyXVxyXG4gICAgLy8gfVxyXG4gICAgaWYgKHRoaXMuVHdlZW5BbmltYXRlKSB7XHJcbiAgICAgIFRXRUVOLnJlbW92ZSh0aGlzLlR3ZWVuQW5pbWF0ZSlcclxuICAgICAgdGhpcy5Ud2VlbkFuaW1hdGUgPSBudWxsXHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHsgc2RrUCwgc2RrRCB9ID0gZ2V0U2RrKClcclxuICAgIGxldCB0aGF0UFxyXG4gICAgaWYgKHNka0QgJiYgc2RrUCkge1xyXG4gICAgICBpZiAodGhpcy5zZGsgPT09IHNka0QpIHtcclxuICAgICAgICB0aGF0UCA9IHNka1AuZW50aXR5TWFwLmdldCh0aGlzLm9wdGlvbnMuaWQpXHJcbiAgICAgICAgaWYgKHRoYXRQICYmIHRoYXRQLmVudGl0eSAmJiB0aGF0UC5lbnRpdHkucG9seWdvbiAmJiB0aGF0UC5wb3NpdGlvbnNIKSB7XHJcbiAgICAgICAgICB0aGlzLmVudGl0eS5wb2x5Z29uLmhpZXJhcmNoeSA9IG5ldyBDZXNpdW0uQ2FsbGJhY2tQcm9wZXJ0eShmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgQ2VzaXVtLlBvbHlnb25IaWVyYXJjaHkodGhhdFAucG9zaXRpb25zSClcclxuICAgICAgICAgIH0sIGZhbHNlKVxyXG4gICAgICAgICAgdGhpcy5lbnRpdHkucG9seWxpbmUucG9zaXRpb25zID0gbmV3IENlc2l1bS5DYWxsYmFja1Byb3BlcnR5KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFsuLi50aGF0UC5wb3NpdGlvbnNILCB0aGF0UC5wb3NpdGlvbnNIWzBdLCB0aGF0UC5wb3NpdGlvbnNIWzFdXVxyXG4gICAgICAgICAgfSwgZmFsc2UpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVyblxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gdGhpcy5lbnRpdHkucG9seWdvbi5oaWVyYXJjaHkgPSBhcnJcclxuICAgIC8vIHRoaXMuZW50aXR5LnBvbHlsaW5lLnBvc2l0aW9ucyA9IGxpbmVBcnJcclxuXHJcbiAgICBsZXQgbGluZVBvczg0MSA9IFtdXHJcbiAgICBsZXQgbGluZVBvczg0MiA9IFtdXHJcbiAgICBsZXQgbGluZVBvczg0MyA9IFtdXHJcblxyXG4gICAgbGV0IHR1cmZMaW5lID0gW11cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IDI7IGkrKykge1xyXG4gICAgICB0dXJmTGluZS5wdXNoKFt0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxuZywgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sYXRdKVxyXG4gICAgfVxyXG4gICAgdHVyZkxpbmUucHVzaChbdGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXS5sbmcsIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0ubGF0XSlcclxuICAgIGxldCBjbG9ja3dpc2VSaW5nID0gdHVyZi5saW5lU3RyaW5nKHR1cmZMaW5lKTtcclxuICAgIGxldCBpc0Nsb2Nrd2lzZSA9IHR1cmYuYm9vbGVhbkNsb2Nrd2lzZShjbG9ja3dpc2VSaW5nKVxyXG5cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IDEwMDsgaSsrKSB7XHJcbiAgICAgIGxldCBwb3M4NCA9IHRoaXMuY2FydGVzaWFuM1Rvd2dzODQoUGluY2VyQXJyb3dBcnJbaV0sIHRoaXMuc2RrLnZpZXdlcilcclxuICAgICAgbGluZVBvczg0MS5wdXNoKFtwb3M4NC5sbmcsIHBvczg0LmxhdCwgcG9zODQuYWx0XSlcclxuICAgIH1cclxuICAgIGlmIChpc0Nsb2Nrd2lzZSkge1xyXG4gICAgICBsaW5lUG9zODQxLnB1c2goW3RoaXMub3B0aW9ucy5wb3NpdGlvbnNbM10ubG5nLCB0aGlzLm9wdGlvbnMucG9zaXRpb25zWzNdLmxhdCwgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1szXS5hbHRdKVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGxpbmVQb3M4NDEucHVzaChbdGhpcy5vcHRpb25zLnBvc2l0aW9uc1syXS5sbmcsIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMl0ubGF0LCB0aGlzLm9wdGlvbnMucG9zaXRpb25zWzJdLmFsdF0pXHJcbiAgICB9XHJcblxyXG5cclxuXHJcbiAgICBmb3IgKGxldCBpID0gMzEyOyBpID49IDIxMjsgaS0tKSB7XHJcbiAgICAgIGxldCBwb3M4NCA9IHRoaXMuY2FydGVzaWFuM1Rvd2dzODQoUGluY2VyQXJyb3dBcnJbaV0sIHRoaXMuc2RrLnZpZXdlcilcclxuICAgICAgbGluZVBvczg0Mi5wdXNoKFtwb3M4NC5sbmcsIHBvczg0LmxhdCwgcG9zODQuYWx0XSlcclxuICAgIH1cclxuICAgIGlmIChpc0Nsb2Nrd2lzZSkge1xyXG4gICAgICBsaW5lUG9zODQyLnB1c2goW3RoaXMub3B0aW9ucy5wb3NpdGlvbnNbMl0ubG5nLCB0aGlzLm9wdGlvbnMucG9zaXRpb25zWzJdLmxhdCwgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1syXS5hbHRdKVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGxpbmVQb3M4NDIucHVzaChbdGhpcy5vcHRpb25zLnBvc2l0aW9uc1szXS5sbmcsIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbM10ubGF0LCB0aGlzLm9wdGlvbnMucG9zaXRpb25zWzNdLmFsdF0pXHJcbiAgICB9XHJcblxyXG4gICAgbGluZVBvczg0My5wdXNoKFsodGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXS5sbmcgKyB0aGlzLm9wdGlvbnMucG9zaXRpb25zWzFdLmxuZykgLyAyLCAodGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXS5sYXQgKyB0aGlzLm9wdGlvbnMucG9zaXRpb25zWzFdLmxhdCkgLyAyXSwgW3RoaXMub3B0aW9ucy5wb3NpdGlvbnNbNF0ubG5nLCB0aGlzLm9wdGlvbnMucG9zaXRpb25zWzRdLmxhdF0pXHJcblxyXG5cclxuICAgIGxldCBwb3NpdGlvbnMgPSB0aGlzLmRlZXBDb3B5T2JqKHRoaXMub3B0aW9ucy5wb3NpdGlvbnMpXHJcblxyXG4gICAgbGV0IGxpbmUxID0gdHVyZi5saW5lU3RyaW5nKGxpbmVQb3M4NDEpO1xyXG4gICAgbGV0IGRpc3RhbmNlMSA9IHR1cmYubGVuZ3RoKGxpbmUxLCB7IHVuaXRzOiAna2lsb21ldGVycycgfSk7XHJcbiAgICBsZXQgbGluZTIgPSB0dXJmLmxpbmVTdHJpbmcobGluZVBvczg0Mik7XHJcbiAgICBsZXQgZGlzdGFuY2UyID0gdHVyZi5sZW5ndGgobGluZTIsIHsgdW5pdHM6ICdraWxvbWV0ZXJzJyB9KTtcclxuICAgIGxldCBsaW5lMyA9IHR1cmYubGluZVN0cmluZyhsaW5lUG9zODQzKTtcclxuICAgIGxldCBkaXN0YW5jZTMgPSB0dXJmLmxlbmd0aChsaW5lMywgeyB1bml0czogJ2tpbG9tZXRlcnMnIH0pO1xyXG4gICAgbGV0IHRpbWVSYXRpbyA9IHRpbWUgLyB0aGlzLnNwcmVhZFRpbWVcclxuICAgIGxldCBtID0gMFxyXG4gICAgdGhpcy5Ud2VlbkFuaW1hdGUgPSBuZXcgVFdFRU4uVHdlZW4oeyBkaXN0YW5jZTE6IGRpc3RhbmNlMSAqIHRpbWVSYXRpbywgZGlzdGFuY2UyOiBkaXN0YW5jZTIgKiB0aW1lUmF0aW8sIGRpc3RhbmNlMzogZGlzdGFuY2UzICogdGltZVJhdGlvIH0pLnRvKHsgZGlzdGFuY2UxOiBkaXN0YW5jZTEsIGRpc3RhbmNlMjogZGlzdGFuY2UyLCBkaXN0YW5jZTM6IGRpc3RhbmNlMyB9LCB0aGlzLnNwcmVhZFRpbWUgLSB0aW1lKS5lYXNpbmcoVFdFRU4uRWFzaW5nLkxpbmVhci5Ob25lKS5yZXBlYXQodGhpcy5vcHRpb25zLmxvb3AgPyBJbmZpbml0eSA6IDApLm9uUmVwZWF0KCgpID0+IHtcclxuICAgICAgaWYgKHRpbWUpIHtcclxuICAgICAgICB0aGlzLnNldFNwcmVhZFByb2dyZXNzQnlUaW1lKClcclxuICAgICAgfVxyXG4gICAgfSkub25VcGRhdGUoYXN5bmMgKHIsIGEpID0+IHtcclxuICAgICAgaWYgKHRoaXMuVHdlZW5BbmltYXRlLl9kdXJhdGlvbiA9PSBJbmZpbml0eSkge1xyXG4gICAgICAgIHJldHVyblxyXG4gICAgICB9XHJcbiAgICAgIG0rK1xyXG4gICAgICBpZiAoIXRoaXMuc2RrLnZpZXdlcikge1xyXG4gICAgICAgIHRoaXMucmVtb3ZlQW5pbWF0ZSgpXHJcbiAgICAgICAgcmV0dXJuXHJcbiAgICAgIH1cclxuICAgICAgc2V0U3ByZWFkKHIpXHJcbiAgICB9KS5vblN0YXJ0KCgpID0+IHtcclxuICAgICAgdGhpcy5vcHRpb25zLnNwcmVhZFN0YXRlID0gdHJ1ZVxyXG4gICAgICB0aGlzLl9lbG1zLnNwcmVhZFN0YXRlICYmIHRoaXMuX2VsbXMuc3ByZWFkU3RhdGUuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICAgIGl0ZW0uY2hlY2tlZCA9IHRydWVcclxuICAgICAgfSlcclxuICAgIH0pLm9uQ29tcGxldGUoKGQpID0+IHtcclxuICAgICAgdGhpcy5yZW1vdmVBbmltYXRlKClcclxuICAgIH0pXHJcbiAgICBpZiAodGhpcy5zcHJlYWRTdGF0ZSkge1xyXG4gICAgICB0aGlzLlR3ZWVuQW5pbWF0ZS5zdGFydCgpXHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgc2V0U3ByZWFkKHsgZGlzdGFuY2UxOiBkaXN0YW5jZTEgKiB0aW1lUmF0aW8sIGRpc3RhbmNlMjogZGlzdGFuY2UyICogdGltZVJhdGlvLCBkaXN0YW5jZTM6IGRpc3RhbmNlMyAqIHRpbWVSYXRpbyB9KVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGZ1bmN0aW9uIHNldFNwcmVhZCh2KSB7XHJcbiAgICAgIGlmICghdGhhdC5zaG93KSB7XHJcbiAgICAgICAgcmV0dXJuXHJcbiAgICAgIH1cclxuICAgICAgbGV0IGluZGV4MiA9IDJcclxuICAgICAgbGV0IGluZGV4MyA9IDNcclxuICAgICAgaWYgKGlzQ2xvY2t3aXNlKSB7XHJcbiAgICAgICAgaW5kZXgyID0gM1xyXG4gICAgICAgIGluZGV4MyA9IDJcclxuICAgICAgfVxyXG4gICAgICBpZiAoIXYuZGlzdGFuY2UxKSB7XHJcbiAgICAgICAgcG9zaXRpb25zW2luZGV4Ml0ubG5nID0gcG9zaXRpb25zWzFdLmxuZ1xyXG4gICAgICAgIHBvc2l0aW9uc1tpbmRleDJdLmxhdCA9IHBvc2l0aW9uc1sxXS5sYXRcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBsZXQgc2xpY2VkMSA9IGF3YWl0IHR1cmYubGluZVNsaWNlQWxvbmcobGluZTEsIDAsIHYuZGlzdGFuY2UxLCB7IHVuaXRzOiAna2lsb21ldGVycycgfSk7XHJcbiAgICAgICAgbGV0IGNvb3JkaW5hdGVzMSA9IFsuLi5zbGljZWQxLmdlb21ldHJ5LmNvb3JkaW5hdGVzW3NsaWNlZDEuZ2VvbWV0cnkuY29vcmRpbmF0ZXMubGVuZ3RoIC0gMV1dXHJcbiAgICAgICAgcG9zaXRpb25zW2luZGV4Ml0ubG5nID0gY29vcmRpbmF0ZXMxWzBdXHJcbiAgICAgICAgcG9zaXRpb25zW2luZGV4Ml0ubGF0ID0gY29vcmRpbmF0ZXMxWzFdXHJcbiAgICAgIH1cclxuICAgICAgaWYgKCF2LmRpc3RhbmNlMikge1xyXG4gICAgICAgIHBvc2l0aW9uc1tpbmRleDNdLmxuZyA9IHBvc2l0aW9uc1swXS5sbmdcclxuICAgICAgICBwb3NpdGlvbnNbM10ubGF0ID0gcG9zaXRpb25zWzBdLmxhdFxyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGxldCBzbGljZWQyID0gYXdhaXQgdHVyZi5saW5lU2xpY2VBbG9uZyhsaW5lMiwgMCwgdi5kaXN0YW5jZTIsIHsgdW5pdHM6ICdraWxvbWV0ZXJzJyB9KTtcclxuICAgICAgICBsZXQgY29vcmRpbmF0ZXMyID0gWy4uLnNsaWNlZDIuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbc2xpY2VkMi5nZW9tZXRyeS5jb29yZGluYXRlcy5sZW5ndGggLSAxXV1cclxuICAgICAgICBwb3NpdGlvbnNbaW5kZXgzXS5sbmcgPSBjb29yZGluYXRlczJbMF1cclxuICAgICAgICBwb3NpdGlvbnNbaW5kZXgzXS5sYXQgPSBjb29yZGluYXRlczJbMV1cclxuICAgICAgfVxyXG4gICAgICBpZiAoIXYuZGlzdGFuY2UzKSB7XHJcbiAgICAgICAgcG9zaXRpb25zWzRdLmxuZyA9IGxpbmVQb3M4NDNbMF1bMF1cclxuICAgICAgICBwb3NpdGlvbnNbNF0ubGF0ID0gbGluZVBvczg0M1swXVsxXVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGxldCBzbGljZWQzID0gYXdhaXQgdHVyZi5saW5lU2xpY2VBbG9uZyhsaW5lMywgMCwgdi5kaXN0YW5jZTMsIHsgdW5pdHM6ICdraWxvbWV0ZXJzJyB9KTtcclxuICAgICAgICBsZXQgY29vcmRpbmF0ZXMzID0gWy4uLnNsaWNlZDMuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbc2xpY2VkMy5nZW9tZXRyeS5jb29yZGluYXRlcy5sZW5ndGggLSAxXV1cclxuICAgICAgICBwb3NpdGlvbnNbNF0ubG5nID0gY29vcmRpbmF0ZXMzWzBdXHJcbiAgICAgICAgcG9zaXRpb25zWzRdLmxhdCA9IGNvb3JkaW5hdGVzM1sxXVxyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGF0LnJlbmV3UG9zaXRpb25zKHBvc2l0aW9ucylcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmVudGl0eS5wb2x5Z29uLmhpZXJhcmNoeSA9IG5ldyBDZXNpdW0uQ2FsbGJhY2tQcm9wZXJ0eShmdW5jdGlvbiAoKSB7XHJcbiAgICAgIHJldHVybiBuZXcgQ2VzaXVtLlBvbHlnb25IaWVyYXJjaHkodGhhdC5wb3NpdGlvbnNIKVxyXG4gICAgfSwgZmFsc2UpXHJcbiAgICB0aGlzLmVudGl0eS5wb2x5bGluZS5wb3NpdGlvbnMgPSBuZXcgQ2VzaXVtLkNhbGxiYWNrUHJvcGVydHkoZnVuY3Rpb24gKCkge1xyXG4gICAgICByZXR1cm4gWy4uLnRoYXQucG9zaXRpb25zSCwgdGhhdC5wb3NpdGlvbnNIWzBdLCB0aGF0LnBvc2l0aW9uc0hbMV1dXHJcbiAgICB9LCBmYWxzZSlcclxuICB9XHJcblxyXG4gIC8vIOenu+mZpOWKqOeUu1xyXG4gIHJlbW92ZUFuaW1hdGUoKSB7XHJcbiAgICB0aGlzLnNwcmVhZFN0YXRlID0gZmFsc2VcclxuICAgIGlmICh0aGlzLlR3ZWVuQW5pbWF0ZSkge1xyXG4gICAgICBUV0VFTi5yZW1vdmUodGhpcy5Ud2VlbkFuaW1hdGUpXHJcbiAgICAgIHRoaXMuVHdlZW5BbmltYXRlID0gbnVsbFxyXG5cclxuICAgICAgdGhpcy5yZW5ld1Bvc2l0aW9ucygpXHJcbiAgICAgIHRoaXMuZW50aXR5LnBvbHlnb24uaGllcmFyY2h5ID0gbmV3IENlc2l1bS5Qb2x5Z29uSGllcmFyY2h5KHRoaXMucG9zaXRpb25zSClcclxuICAgICAgdGhpcy5lbnRpdHkucG9seWxpbmUucG9zaXRpb25zID0gWy4uLnRoaXMucG9zaXRpb25zSCwgdGhpcy5wb3NpdGlvbnNIWzBdLCB0aGlzLnBvc2l0aW9uc0hbMV1dXHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcbiAgLy8g5pu05paw5Z2Q5qCHXHJcbiAgcmVuZXdQb3NpdGlvbnMocG9zaXRpb244NCkge1xyXG4gICAgaWYgKHRoaXMuX2Vycm9yIHx8ICF0aGlzLnNkay52aWV3ZXIpIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcbiAgICBsZXQgZ3JvdW5kID0gZmFsc2VcclxuXHJcbiAgICBsZXQgYXJyYXkgPSBbXVxyXG4gICAgbGV0IHBvc2l0aW9ucyA9IHRoaXMub3B0aW9ucy5wb3NpdGlvbnNcclxuICAgIGlmIChwb3NpdGlvbjg0KSB7XHJcbiAgICAgIHBvc2l0aW9ucyA9IHBvc2l0aW9uODRcclxuICAgIH1cclxuICAgIGxldCBmcm9tRGVncmVlc0FycmF5ID0gW11cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGZyb21EZWdyZWVzQXJyYXkucHVzaChwb3NpdGlvbnNbaV0ubG5nLCBwb3NpdGlvbnNbaV0ubGF0KVxyXG4gICAgfVxyXG4gICAgdGhpcy5wb3NpdGlvbnMgPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlc0FycmF5KGZyb21EZWdyZWVzQXJyYXkpXHJcblxyXG4gICAgbGV0IHBvc2l0aW9uc0EgPSB0aGlzLmNvbXB1dGVQaW5jZXJBcnJvdyhwb3NpdGlvbnMpXHJcbiAgICBpZiAocG9zaXRpb25zQS5sZW5ndGggPT0gMCkge1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuICAgIGxldCBwb2ludHMgPSBbW11dXHJcbiAgICBsZXQgcG9zODQgPSBbXVxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb3NpdGlvbnNBLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGxldCBwb3NpdGlvbiA9IHRoaXMuY2FydGVzaWFuM1Rvd2dzODQocG9zaXRpb25zQVtpXSwgdGhpcy5zZGsudmlld2VyKVxyXG4gICAgICBwb3M4NC5wdXNoKHBvc2l0aW9uKVxyXG4gICAgICBwb2ludHNbMF0ucHVzaChbcG9zaXRpb24ubG5nLCBwb3NpdGlvbi5sYXRdKVxyXG4gICAgfVxyXG4gICAgbGV0IHBvc2l0aW9uID0gdGhpcy5jYXJ0ZXNpYW4zVG93Z3M4NChwb3NpdGlvbnNBWzBdLCB0aGlzLnNkay52aWV3ZXIpXHJcbiAgICBwb2ludHNbMF0ucHVzaChbcG9zaXRpb24ubG5nLCBwb3NpdGlvbi5sYXRdKVxyXG4gICAgbGV0IGhlaWdodCA9IDBcclxuICAgIGxldCBwb2x5Z29uID0gdHVyZi5wb2x5Z29uKHBvaW50cylcclxuICAgIGxldCBjZW50cm9pZCA9IHR1cmYucG9pbnRPbkZlYXR1cmUocG9seWdvbilcclxuICAgIHN3aXRjaCAodGhpcy5vcHRpb25zLmhlaWdodE1vZGUpIHtcclxuICAgICAgY2FzZSAnMCc6XHJcbiAgICAgIGNhc2UgMDpcclxuICAgICAgICBncm91bmQgPSBmYWxzZVxyXG4gICAgICAgIGJyZWFrXHJcbiAgICAgIGNhc2UgJzEnOlxyXG4gICAgICBjYXNlIDE6XHJcbiAgICAgICAgaGVpZ2h0ID0gdGhpcy5zZGsudmlld2VyLnNjZW5lLmdsb2JlLmdldEhlaWdodChDZXNpdW0uQ2FydG9ncmFwaGljLmZyb21EZWdyZWVzKGNlbnRyb2lkLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzBdLCBjZW50cm9pZC5nZW9tZXRyeS5jb29yZGluYXRlc1sxXSkpIHx8IDBcclxuICAgICAgICBncm91bmQgPSBmYWxzZVxyXG4gICAgICAgIGJyZWFrXHJcbiAgICAgIGNhc2UgJzInOlxyXG4gICAgICBjYXNlIDI6XHJcbiAgICAgICAgZ3JvdW5kID0gdHJ1ZVxyXG4gICAgICAgIGJyZWFrXHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGZyb21EZWdyZWVzQXJyYXkyID0gW11cclxuICAgIGlmICghZ3JvdW5kICYmIHRoaXMubm9kZVBvaW50cy5sZW5ndGggPT0gMCkge1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvaW50c1swXS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGZyb21EZWdyZWVzQXJyYXkyLnB1c2goXHJcbiAgICAgICAgICBwb2ludHNbMF1baV1bMF0sXHJcbiAgICAgICAgICBwb2ludHNbMF1baV1bMV0sXHJcbiAgICAgICAgICB0aGlzLmhlaWdodCArIGhlaWdodFxyXG4gICAgICAgIClcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnBvc2l0aW9uc0ggPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlc0FycmF5SGVpZ2h0cyhmcm9tRGVncmVlc0FycmF5MilcclxuXHJcbiAgICAgIHRoaXMubGFiZWwgJiYgKHRoaXMubGFiZWwucG9zaXRpb24gPSBbXHJcbiAgICAgICAgY2VudHJvaWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMF0sXHJcbiAgICAgICAgY2VudHJvaWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMV0sXHJcbiAgICAgICAgdGhpcy5oZWlnaHQgKyBoZWlnaHRcclxuICAgICAgXSlcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMucG9zaXRpb25zSCA9IHBvc2l0aW9uc0FcclxuXHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIGlmICghdGhpcy5zZGsudmlld2VyKSB7XHJcbiAgICAgICAgICByZXR1cm5cclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IG9iamVjdHNUb0V4Y2x1ZGUgPSBbLi4udGhpcy5zZGsudmlld2VyLmVudGl0aWVzLnZhbHVlc11cclxuICAgICAgICB0aGlzLmdldENsYW1wVG9IZWlnaHQoe1xyXG4gICAgICAgICAgbG5nOiBjZW50cm9pZC5nZW9tZXRyeS5jb29yZGluYXRlc1swXSxcclxuICAgICAgICAgIGxhdDogY2VudHJvaWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMV1cclxuICAgICAgICB9LCBvYmplY3RzVG9FeGNsdWRlKS50aGVuKGhlaWdodCA9PiB7XHJcbiAgICAgICAgICB0aGlzLmxhYmVsICYmICh0aGlzLmxhYmVsLnBvc2l0aW9uID0gW1xyXG4gICAgICAgICAgICBjZW50cm9pZC5nZW9tZXRyeS5jb29yZGluYXRlc1swXSxcclxuICAgICAgICAgICAgY2VudHJvaWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMV0sXHJcbiAgICAgICAgICAgIGhlaWdodFxyXG4gICAgICAgICAgXSlcclxuICAgICAgICB9KVxyXG4gICAgICB9LCAxMDApXHJcbiAgICB9XHJcblxyXG4gICAgLy8g6K6h566X5oqV5b2x6Z2i56evXHJcbiAgICBpZiAoIXRoaXMuc3ByZWFkU3RhdGUpIHtcclxuICAgICAgdGhpcy5vcHRpb25zLmFyZWFCeU1ldGVyID0gdGhpcy5jb21wdXRlQXJlYShwb3M4NClcclxuICAgICAgdGhpcy5hcmVhVW5pdCA9IHRoaXMuYXJlYVVuaXRcclxuICAgIH1cclxuICAgIHJldHVybiBmcm9tRGVncmVlc0FycmF5XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBQaW5jZXJBcnJvd09iamVjdFxyXG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFTQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBV0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBWEE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQXJCQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBd0NBO0FBN0NBO0FBQUE7QUFBQTtBQUFBO0FBOENBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFWQTtBQUFBO0FBUUE7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQWxCQTtBQUFBO0FBQUE7QUF1QkE7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBU0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQVdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQVhBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFyQkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQXdDQTtBQTdDQTtBQUFBO0FBQUE7QUFBQTtBQThDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBVkE7QUFBQTtBQVFBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFsQkE7QUFBQTtBQUFBO0FBbUJBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQTRJQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBekhBO0FBQUE7QUFBQTtBQTBIQTtBQUFBO0FBQUE7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBM0NBO0FBNENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFLQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFHQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBTEE7QUFBQTtBQUFBO0FBQUE7QUFTQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBTUE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBeGVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBMGVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFiQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQWdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFBQTtBQUVBO0FBVUE7QUFBQTtBQVBBO0FBQUE7QUFBQTtBQUlBO0FBQUE7QUFBQTtBQUlBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUtBO0FBQUE7QUFQQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQVVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQXBHQTtBQUFBO0FBQUE7QUFBQTtBQXNHQTtBQUNBO0FBQ0E7QUFGQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTEE7QUFBQTtBQUFBO0FBeUxBO0FBQ0E7QUFBQTtBQXBMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQWlTQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUdBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBR0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBRUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBR0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBRUE7QUFLQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBcHZEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBS0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQW5CQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQTg2QkE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFyRUE7QUFBQTtBQUFBO0FBcUVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUEvRkE7QUFBQTtBQUtBO0FBMkZBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUErSUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBZEE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBZ0JBO0FBbEJBO0FBQUE7QUFBQTtBQTlJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFLQTtBQUNBO0FBQ0E7QUFvQkE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBNGJBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/Obj/Base/PincerArrowObject/index.js\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ \"./node_modules/@babel/runtime/helpers/defineProperty.js\");\n/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ \"./node_modules/@babel/runtime/helpers/asyncToGenerator.js\");\n/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/toConsumableArray */ \"./node_modules/@babel/runtime/helpers/toConsumableArray.js\");\n/* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ \"./node_modules/@babel/runtime/helpers/classCallCheck.js\");\n/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ \"./node_modules/@babel/runtime/helpers/createClass.js\");\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ \"./node_modules/@babel/runtime/helpers/possibleConstructorReturn.js\");\n/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ \"./node_modules/@babel/runtime/helpers/getPrototypeOf.js\");\n/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ \"./node_modules/@babel/runtime/helpers/inherits.js\");\n/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @babel/runtime/regenerator */ \"./node_modules/@babel/runtime/regenerator/index.js\");\n/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8__);\n/* harmony import */ var _Element_Dialog__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../Element/Dialog */ \"./src/Obj/Element/Dialog/index.js\");\n/* harmony import */ var _Element_cy_html_tabs__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../Element/cy_html_tabs */ \"./src/Obj/Element/cy_html_tabs.js\");\n/* harmony import */ var _Element_richText__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../Element/richText */ \"./src/Obj/Element/richText.js\");\n/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./_element */ \"./src/Obj/Base/PincerArrowObject/_element.js\");\n/* harmony import */ var _index__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../index */ \"./src/Obj/Base/index.js\");\n/* harmony import */ var _LabelObject__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../LabelObject */ \"./src/Obj/Base/LabelObject/index.js\");\n/* harmony import */ var _Event_index__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../../../Event/index */ \"./src/Event/index.js\");\n/* harmony import */ var _MouseTip__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../../../MouseTip */ \"./src/MouseTip/index.js\");\n/* harmony import */ var _Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../../../Global/MultiViewportMode */ \"./src/Global/MultiViewportMode/index.js\");\n/* harmony import */ var _Element_datalist__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../../Element/datalist */ \"./src/Obj/Element/datalist.js\");\n/* harmony import */ var _Element_fontSelect__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../../Element/fontSelect */ \"./src/Obj/Element/fontSelect.js\");\n/* harmony import */ var _Global_SplitScreen__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../../../Global/SplitScreen */ \"./src/Global/SplitScreen/index.js\");\n/* harmony import */ var _Global_global__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../../../Global/global */ \"./src/Global/global.js\");\n\n\n\n\n\n\n\n\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default()(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\n\nfunction _callSuper(t, o, e) { return o = _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6___default()(o), _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_5___default()(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6___default()(t).constructor) : o.apply(t, e)); }\nfunction _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }\n/**\r\n * 双箭头\r\n */\n\n\n\n\n\n\n\n\n\n\n\n\n\n// import EditParticle from \"../../ModelController/EditParticle\";\nvar PincerArrowObject = /*#__PURE__*/function (_Base) {\n /**\r\n * @constructor\r\n * @param sdk \r\n * @description 双箭头\r\n * @param options {object} 属性\r\n * @param options.id {string} 唯一标识\r\n * @param options.show=true {boolean} 显示/隐藏\r\n * @param options.name {string} 名称\r\n * @param options.color='rgba(255, 0, 0, 0.5)' {string} 颜色\r\n * @param options.height {number} 高度\r\n * @param options.heightMode=2{number} 高度模式(0:海拔高度;1:相对地表;2:依附模式)\r\n * @param options.line {object} 边框\r\n * @param options.line.width=2 {string} 边框宽\r\n * @param options.line.color=\"rgba(155, 155, 124, 0.89)\" {string} 边框颜色\r\n * @param {Array.} options.positions 必填,经纬度和高度的列表,值交替 [{lon,lat,alt},...]\r\n * @param options.positions[].lng {number} 经度\r\n * @param options.positions[].lat {number} 纬度\r\n * @param options.positions[].alt {number} 高度\r\n * @param options.spreadState=false {boolean} 动画\r\n * @param options.loop=false {loop} 动画重复\r\n * @param options.spreadTime=3000 {number} 动画持续时长(毫秒)\r\n * @param options.label {object} 标签对象\r\n * @param options.label.text {string} 标签文本\r\n * @param options.label.show {string} 标签显隐\r\n * @param options.label.position {string} 标签位置\r\n * @param options.label.position {object} 标签位置\r\n * @param options.label.position.lng {number} 经度\r\n * @param options.label.position.lat {number} 纬度\r\n * @param options.label.position.alt {number} 高度\r\n * @param options.label.fontSize=20 {number} 字体大小\r\n * @param options.label.fontFamily=0 {number} 字体项 0:黑体;1:思源黑体;2:庞门正道标题体;3:数黑体\r\n * @param options.label.color=#ffffff {string} 字体颜色\r\n * @param options.label.lineWidth=4 {number} 引线宽\r\n * @param options.label.lineColor=#00ffff80 {string} 引线颜色\r\n * @param options.label.pixelOffset=20 {number} 字体偏移(引线长度)\r\n * @param options.label.backgroundColor=['#00ffff80', '#00ffff80'] {array} 背景颜色\r\n * @param options.label.scaleByDistance {boolean} 距离缩放\r\n * @param options.label.near=2000 {number} 视野缩放最近距离\r\n * @param options.label.far=100000 {number} 视野缩放最远距离\r\n * @param options.attribute {object} 属性内容\r\n * @param options.attribute.link={} {object} 链接\r\n * @param options.attribute.link.content=[]] {array} 链接内容\r\n * @param options.attribute.link.content[].name {string} 链接名称\r\n * @param options.attribute.link.content[].url {string} 链接地址\r\n * @param options.richTextContent {string} 富文本内容\r\n * @param options.customView {object} 默认视角\r\n * @param options.customView.orientation {object} 默认视角方位\r\n * @param options.customView.orientation.heading {number} 航向角\r\n * @param options.customView.orientation.pitch {number} 俯仰角\r\n * @param options.customView.orientation.roll {number} 翻滚角\r\n * @param options.customView.relativePosition {object} 视角相对位置\r\n * @param options.customView.relativePosition.lng {number} 经度\r\n * @param options.customView.relativePosition.lat {number} 纬度\r\n * @param options.customView.relativePosition.alt {number} 高度\r\n * */\n function PincerArrowObject(sdk) {\n var _this2;\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var _Dialog = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3___default()(this, PincerArrowObject);\n _this2 = _callSuper(this, PincerArrowObject, [sdk, options]);\n _this2.options.name = options.name || '未命名对象';\n _this2.options.color = options.color || \"#ff000080\";\n _this2.options.show = options.show || options.show === false ? options.show : true;\n _this2.options.positions = options.positions || [];\n _this2.options.heightMode = options.heightMode || options.heightMode == 0 ? options.heightMode : 2;\n _this2.options.line = options.line || {};\n _this2.options.line.width = _this2.options.line.width || _this2.options.line.width === 0 ? _this2.options.line.width : 3;\n _this2.options.line.color = _this2.options.line.color || 'rgba(255, 0, 0, 1)';\n _this2.options.height = options.height;\n _this2.options.loop = options.loop || false;\n _this2.options.spreadState = options.spreadState || false;\n _this2._elms = {};\n _this2.nodePoints = [];\n _this2.spreadTime = options.spreadTime;\n _this2.entity;\n _this2.event;\n _this2.operate = {};\n _this2.Dialog = _Dialog;\n options.label = options.label || {};\n _this2.options.label = {\n text: _this2.options.name,\n show: options.label.show || false,\n position: options.label.position,\n fontSize: options.label.fontSize || options.label.fontSize === 0 ? options.label.fontSize : 20,\n fontFamily: options.label.fontFamily ? options.label.fontFamily : 0,\n color: options.label.color || '#ffffff',\n lineWidth: options.label.lineWidth || options.label.lineWidth === 0 ? options.label.lineWidth : 4,\n pixelOffset: options.label.pixelOffset || options.label.pixelOffset === 0 ? options.label.pixelOffset : 20,\n backgroundColor: options.label.backgroundColor || ['#00ffff80', '#00ffff80'],\n lineColor: options.label.lineColor || '#00ffff80',\n scaleByDistance: options.label.scaleByDistance || false,\n near: options.label.near || options.label.near === 0 ? options.label.near : 2000,\n far: options.label.far || options.label.far === 0 ? options.label.far : 100000\n };\n _this2.options.attribute = options.attribute || {};\n _this2.options.attribute.link = _this2.options.attribute.link || {};\n _this2.options.attribute.link.content = _this2.options.attribute.link.content || [];\n delete _this2.options.attribute.camera;\n delete _this2.options.attribute.vr;\n delete _this2.options.attribute.goods;\n if (!_this2.options.positions || _this2.options.positions.length < 5) {\n _this2._error = '双箭头最少需要五个坐标!';\n console.warn(_this2._error);\n window.ELEMENT && window.ELEMENT.Message({\n message: _this2._error,\n type: 'warning',\n duration: 1500\n });\n } else {\n if (!_this2.options.height && _this2.options.height !== 0) {\n var height = _this2.options.positions[0].alt;\n for (var i = 1; i < _this2.options.positions.length; i++) {\n if (height < _this2.options.positions[i].alt) {\n height = _this2.options.positions[i].alt;\n }\n }\n _this2.options.height = height;\n }\n _this2.sdk.addIncetance(_this2.options.id, _this2);\n PincerArrowObject.create(_this2);\n }\n return _this2;\n }\n _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_7___default()(PincerArrowObject, _Base);\n return _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4___default()(PincerArrowObject, [{\n key: \"type\",\n get: function get() {\n return 'PincerArrowObject';\n }\n }, {\n key: \"name\",\n get: function get() {\n return this.options.name;\n },\n set: function set(v) {\n this.options.name = v;\n this.label.text = v;\n this._elms.name && this._elms.name.forEach(function (item) {\n item.value = v;\n });\n }\n }, {\n key: \"color\",\n get: function get() {\n return this.options.color;\n },\n set: function set(v) {\n var _this3 = this;\n this.options.color = v || 'rgba(255, 0, 0, 0.5)';\n if (!this.sdk || !this.sdk.viewer || !this.entity || !this.entity.polygon) {\n return;\n }\n var material = Cesium.Color.fromCssColorString(this.options.color);\n if (this.sdk.viewer.scene.mode === 2) {\n material = new Cesium.CustomColorMaterialSource({\n color: this.options.color\n });\n }\n this.entity.polygon.material = material;\n if (this._elms.color) {\n this._elms.color.forEach(function (item, i) {\n var colorPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: _this3.options.color,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(c) {\n _this3.color = c;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this3.color = 'rgba(255,0,0,0.5)';\n } //点击清空按钮事件回调\n });\n _this3._elms.color[i] = colorPicker;\n });\n }\n }\n }, {\n key: \"heightMode\",\n get: function get() {\n return this.options.heightMode ? this.options.heightMode : 0;\n },\n set: function set(v) {\n var _this4 = this;\n this.entity.polygon.hierarchy = [];\n setTimeout(function () {\n _this4.options.heightMode = v || v == 0 ? v : 2;\n _this4.positionEditing = false;\n if (!_this4.entity) {\n return;\n }\n var heightModeName = '';\n _this4.closeNodeEdit();\n var ground = false;\n var disabled = false;\n _this4.renewPositions();\n _this4.entity.polyline.positions = [].concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(_this4.positionsH), [_this4.positionsH[0], _this4.positionsH[1]]);\n _this4.entity.polygon.hierarchy = new Cesium.PolygonHierarchy(_this4.positionsH);\n switch (_this4.options.heightMode) {\n case '0':\n case 0:\n heightModeName = '海拔高度';\n break;\n case '1':\n case 1:\n heightModeName = '相对地表';\n break;\n case '2':\n case 2:\n ground = true;\n disabled = true;\n heightModeName = '依附模型';\n break;\n }\n _this4.label.ground = ground;\n _this4.entity.polyline.clampToGround = ground;\n _this4.entity.polyline.arcType = !ground ? Cesium.ArcType.NONE : Cesium.ArcType.GEODESIC, _this4.entity.polygon.perPositionHeight = !ground ? true : false;\n _this4._elms.heightMode && (_this4._elms.heightMode.value = heightModeName);\n _this4._elms.heightModeObject && _this4._elms.heightModeObject.legp_searchActive(heightModeName);\n if (disabled) {\n _this4._elms.heightBox && (_this4._elms.heightBox.className = 'input-number input-number-unit-1 height-box disabled');\n _this4._elms.heightConfirm && _this4._elms.heightConfirm.setAttribute('disabled', 'disabled');\n } else {\n _this4._elms.heightBox && (_this4._elms.heightBox.className = 'input-number input-number-unit-1 height-box');\n _this4._elms.heightConfirm && _this4._elms.heightConfirm.removeAttribute('disabled');\n }\n }, 50);\n }\n }, {\n key: \"height\",\n get: function get() {\n return this.options.height;\n },\n set: function set(v) {\n var _this5 = this;\n if (!v || isNaN(Number(v))) {\n this.options.height = 0;\n } else {\n this.options.height = Number(Number(v).toFixed(2));\n }\n var ground;\n if (this.heightMode == 2) {\n ground = true;\n } else {\n ground = false;\n }\n this.renewPositions();\n setTimeout(function () {\n _this5.entity.polygon.hierarchy = new Cesium.PolygonHierarchy(_this5.positionsH);\n _this5.entity.polygon.perPositionHeight = !ground ? true : false;\n _this5.entity.polyline.positions = [].concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(_this5.positionsH), [_this5.positionsH[0], _this5.positionsH[1]]);\n _this5.entity.polyline.clampToGround = !ground ? false : true;\n _this5.entity.polyline.arcType = !ground ? Cesium.ArcType.NONE : Cesium.ArcType.GEODESIC;\n }, 0);\n this._elms.alt && this._elms.alt.forEach(function (item) {\n item.innerHTML = _this5.options.height;\n });\n }\n }, {\n key: \"lineColor\",\n get: function get() {\n return this.options.line.color;\n },\n set: function set(v) {\n var _this6 = this;\n this.options.line.color = v || 'rgba(255, 0, 0, 0.5)';\n if (!this.sdk || !this.sdk.viewer || !this.entity || !this.entity.polyline) {\n return;\n }\n this.entity.polyline.material = Cesium.Color.fromCssColorString(this.options.line.color);\n if (this._elms.lineColor) {\n this._elms.lineColor.forEach(function (item, i) {\n var lineColorPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: _this6.options.line.color,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(c) {\n _this6.lineColor = c;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this6.lineColor = 'rgba(255,0,0,0.5)';\n } //点击清空按钮事件回调\n });\n _this6._elms.lineColor[i] = lineColorPicker;\n });\n }\n }\n }, {\n key: \"lineWidth\",\n get: function get() {\n return this.options.line.width;\n },\n set: function set(v) {\n var _this7 = this;\n this.options.line.width = v || v === 0 ? v : 3;\n this.entity.polyline.width = this.options.line.width;\n this._elms.lineWidth && this._elms.lineWidth.forEach(function (item) {\n item.value = _this7.options.line.width;\n });\n }\n }, {\n key: \"labelShow\",\n get: function get() {\n return this.options.label.show;\n },\n set: function set(v) {\n this.options.label.show = v;\n if (this.show && !this.showView || this.showView == 3) {\n this.label.show = v;\n } else {\n this.label.show = false;\n }\n this._elms.labelShow && this._elms.labelShow.forEach(function (item) {\n item.checked = v;\n });\n }\n }, {\n key: \"labelFontFamily\",\n get: function get() {\n return this.options.label.fontFamily;\n },\n set: function set(v) {\n this.options.label.fontFamily = v || 0;\n this.label && (this.label.fontFamily = this.options.label.fontFamily);\n var name = Object(_Element_fontSelect__WEBPACK_IMPORTED_MODULE_19__[\"getFontFamilyName\"])(this.labelFontFamily) || '';\n this._elms.labelFontFamily && this._elms.labelFontFamily.forEach(function (item) {\n item.value = name;\n });\n }\n }, {\n key: \"labelColor\",\n get: function get() {\n return this.options.label.color;\n },\n set: function set(v) {\n var _this8 = this;\n this.options.label.color = v;\n this.label.color = v;\n if (this._elms.labelColor) {\n this._elms.labelColor.forEach(function (item, i) {\n var labelColorPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: _this8.labelColor,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this8.labelColor = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this8.labelColor = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n _this8._elms.labelColor[i] = labelColorPicker;\n });\n }\n }\n }, {\n key: \"labelFontSize\",\n get: function get() {\n return this.options.label.fontSize;\n },\n set: function set(v) {\n this.options.label.fontSize = v;\n this.label.fontSize = v;\n this._elms.labelFontSize && this._elms.labelFontSize.forEach(function (item) {\n item.value = v;\n });\n }\n }, {\n key: \"labelScaleByDistance\",\n get: function get() {\n return this.options.label.scaleByDistance;\n },\n set: function set(v) {\n this.options.label.scaleByDistance = v;\n this.label.scaleByDistance = v;\n this._elms.labelScaleByDistance && this._elms.labelScaleByDistance.forEach(function (item) {\n item.checked = v;\n });\n }\n }, {\n key: \"labelNear\",\n get: function get() {\n return this.options.label.near;\n },\n set: function set(v) {\n var near = v;\n if (near > this.labelFar) {\n near = this.labelFar;\n }\n this.options.label.near = near;\n this.label.near = near;\n this._elms.labelNear && this._elms.labelNear.forEach(function (item) {\n item.value = near;\n });\n }\n }, {\n key: \"labelFar\",\n get: function get() {\n return this.options.label.far;\n },\n set: function set(v) {\n var far = v;\n if (far < this.labelNear) {\n far = this.labelNear;\n }\n this.options.label.far = far;\n this.label.far = far;\n this._elms.labelFar && this._elms.labelFar.forEach(function (item) {\n item.value = far;\n });\n }\n }, {\n key: \"labelLineWidth\",\n get: function get() {\n return this.options.label.lineWidth;\n },\n set: function set(v) {\n this.options.label.lineWidth = v;\n this.label.lineWidth = v;\n this._elms.labelLineWidth && this._elms.labelLineWidth.forEach(function (item) {\n item.value = v;\n });\n }\n }, {\n key: \"labelPixelOffset\",\n get: function get() {\n return this.options.label.pixelOffset;\n },\n set: function set(v) {\n this.options.label.pixelOffset = v;\n this.label.pixelOffset = v;\n this._elms.labelPixelOffset && this._elms.labelPixelOffset.forEach(function (item) {\n item.value = v;\n });\n }\n }, {\n key: \"labelLineColor\",\n get: function get() {\n return this.options.label.lineColor;\n },\n set: function set(v) {\n var _this9 = this;\n this.options.label.lineColor = v;\n this.label.lineColor = v;\n if (this._elms.labelLineColor) {\n this._elms.labelLineColor.forEach(function (item, i) {\n var lineColorPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: _this9.labelLineColor,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this9.labelLineColor = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this9.labelLineColor = 'rgba(0,255,255,0.5)';\n } //点击清空按钮事件回调\n });\n _this9._elms.labelLineColor[i] = lineColorPicker;\n });\n }\n }\n }, {\n key: \"labelBackgroundColorStart\",\n get: function get() {\n return this.options.label.backgroundColor[0];\n },\n set: function set(v) {\n var _this10 = this;\n this.options.label.backgroundColor[0] = v;\n this.label.backgroundColor = [v, this.label.backgroundColor[1]];\n if (this._elms.labelBackgroundColorStart) {\n this._elms.labelBackgroundColorStart.forEach(function (item, i) {\n var labelBackgroundColorStartPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: _this10.labelBackgroundColorStart,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this10.labelBackgroundColorStart = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this10.labelBackgroundColorStart = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n _this10._elms.labelBackgroundColorStart[i] = labelBackgroundColorStartPicker;\n });\n }\n }\n }, {\n key: \"labelBackgroundColorEnd\",\n get: function get() {\n return this.options.label.backgroundColor[1];\n },\n set: function set(v) {\n var _this11 = this;\n this.options.label.backgroundColor[1] = v;\n this.label.backgroundColor = [this.label.backgroundColor[0], v];\n if (this._elms.labelBackgroundColorEnd) {\n this._elms.labelBackgroundColorEnd.forEach(function (item, i) {\n var labelBackgroundColorEndPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: _this11.labelBackgroundColorEnd,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this11.labelBackgroundColorEnd = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this11.labelBackgroundColorEnd = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n _this11._elms.labelBackgroundColorEnd[i] = labelBackgroundColorEndPicker;\n });\n }\n }\n }, {\n key: \"edit\",\n value: // 编辑框\n function () {\n var _edit = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee(state) {\n var _this12 = this;\n var _this, createSpatialInfoTableContent, contentElm, tabsElm, colorPicker, linecolorPicker, labelColorPicker, lineColorPicker, labelBackgroundColorStartPicker, labelBackgroundColorEndPicker, all_elm, heightBoxElm, heightElm, heightConfirmElm, heightModeData, heightModeObject, heightModeDataLegpElm, i;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee$(_context) {\n while (1) switch (_context.prev = _context.next) {\n case 0:\n return _context.abrupt(\"return\");\n case 3:\n _this = this;\n this.originalOptions = this.deepCopyObj(this.options);\n if (this._DialogObject && this._DialogObject.close) {\n this._DialogObject.close();\n this._DialogObject = null;\n }\n if (!state) {\n _context.next = 62;\n break;\n }\n createSpatialInfoTableContent = function createSpatialInfoTableContent() {\n var tableElm = contentElm.getElementsByClassName('spatial-info-table')[0];\n var tBodyElm = tableElm.getElementsByClassName('table-body')[0];\n tBodyElm.innerHTML = '';\n _this._elms.lng = [];\n _this._elms.lngInput = [];\n _this._elms.lat = [];\n _this._elms.latInput = [];\n _this._elms.alt = [];\n _this._elms.altInput = [];\n var _loop = function _loop(i) {\n var tr = document.createElement('div');\n tr.className = 'tr';\n tr.innerHTML = \"\\n
\".concat(i + 1, \"
\\n
\\n
\\n
\\n \");\n var lngBox = tr.getElementsByClassName('lng')[0];\n var lng = document.createElement('span');\n lng.innerHTML = _this.options.positions[i].lng.toFixed(8);\n lngBox.appendChild(lng);\n var lngInput = document.createElement('input');\n lngInput.className = 'input';\n lngInput.type = 'number';\n lngInput.title = '';\n lngInput.min = -180;\n lngInput.max = 180;\n lngInput.value = _this.options.positions[i].lng.toFixed(8);\n var latBox = tr.getElementsByClassName('lat')[0];\n var lat = document.createElement('span');\n lat.innerHTML = _this.options.positions[i].lat.toFixed(8);\n latBox.appendChild(lat);\n var latInput = document.createElement('input');\n latInput.className = 'input';\n latInput.type = 'number';\n latInput.title = '';\n latInput.min = -90;\n latInput.max = 90;\n latInput.value = _this.options.positions[i].lat.toFixed(8);\n var altBox = tr.getElementsByClassName('alt')[0];\n var alt = document.createElement('span');\n alt.innerHTML = _this.height.toFixed(2);\n altBox.appendChild(alt);\n var altInput = document.createElement('input');\n altInput.className = 'input';\n altInput.type = 'number';\n altInput.title = '';\n altInput.min = -9999999;\n altInput.max = 999999999;\n altInput.value = _this.height.toFixed(2);\n lngBox.addEventListener('dblclick', function () {\n lngBox.innerHTML = '';\n lngInput.value = Number(_this.options.positions[i].lng.toFixed(8));\n lngBox.appendChild(lngInput);\n lngInput.focus();\n if (_this.operate.positionEditing) {\n _this.positionEditing = false;\n }\n PincerArrowObject.closeNodeEdit(_this);\n _this.heightMode = _this.heightMode;\n });\n lngInput.addEventListener('blur', function () {\n lngInput.value = Number(_this.options.positions[i].lng.toFixed(8));\n lngBox.innerHTML = '';\n lngBox.appendChild(lng);\n });\n lngInput.addEventListener('input', function () {\n _this.options.positions[i].lng = Number(Number(lngInput.value).toFixed(8));\n lng.innerHTML = _this.options.positions[i].lng.toFixed(8);\n _this.height = _this.height;\n });\n latBox.addEventListener('dblclick', function () {\n latBox.innerHTML = '';\n latInput.value = Number(_this.options.positions[i].lat.toFixed(8));\n latBox.appendChild(latInput);\n latInput.focus();\n if (_this.operate.positionEditing) {\n _this.positionEditing = false;\n }\n PincerArrowObject.closeNodeEdit(_this);\n _this.heightMode = _this.heightMode;\n });\n latInput.addEventListener('blur', function () {\n latInput.value = Number(_this.options.positions[i].lat.toFixed(8));\n latBox.innerHTML = '';\n latBox.appendChild(lat);\n });\n latInput.addEventListener('input', function () {\n _this.options.positions[i].lat = Number(Number(latInput.value).toFixed(8));\n lat.innerHTML = _this.options.positions[i].lat.toFixed(8);\n _this.height = _this.height;\n });\n altBox.addEventListener('dblclick', function () {\n if (_this.heightMode == 2) {\n return;\n }\n altBox.innerHTML = '';\n altInput.value = Number(_this.height.toFixed(2));\n altBox.appendChild(altInput);\n altInput.focus();\n if (_this.operate.positionEditing) {\n _this.positionEditing = false;\n }\n PincerArrowObject.closeNodeEdit(_this);\n _this.heightMode = _this.heightMode;\n });\n altInput.addEventListener('blur', function () {\n altInput.value = Number(_this.height.toFixed(2));\n altBox.innerHTML = '';\n altBox.appendChild(alt);\n });\n altInput.addEventListener('input', function () {\n _this.height = Number(Number(altInput.value).toFixed(2));\n alt.innerHTML = Number(_this.height.toFixed(2));\n });\n _this._elms.lng.push(lng);\n _this._elms.lngInput.push(lngInput);\n _this._elms.lat.push(lat);\n _this._elms.latInput.push(latInput);\n _this._elms.alt.push(alt);\n _this._elms.altInput.push(altInput);\n tBodyElm.appendChild(tr);\n };\n for (var i = 0; i < _this.options.positions.length; i++) {\n _loop(i);\n }\n };\n _context.next = 10;\n return new _Element_Dialog__WEBPACK_IMPORTED_MODULE_9__[\"default\"](this.sdk, this.options, {\n title: '双箭头属性',\n left: '180px',\n top: '100px',\n confirmCallBack: function confirmCallBack(options) {\n _this12.name = _this12.name.trim();\n if (!_this12.name) {\n _this12.name = '未命名对象';\n }\n _this12.options.label.position = {\n lng: _this12.label.position[0],\n lat: _this12.label.position[1],\n alt: _this12.label.position[2]\n };\n _this12.originalOptions = _this12.deepCopyObj(_this12.options);\n _this12._DialogObject.close();\n _this12.Dialog.confirmCallBack && _this12.Dialog.confirmCallBack(_this12.originalOptions);\n },\n resetCallBack: function resetCallBack() {\n _this12.reset();\n _this12.Dialog.resetCallBack && _this12.Dialog.resetCallBack();\n },\n removeCallBack: function removeCallBack() {\n _this12.Dialog.removeCallBack && _this12.Dialog.removeCallBack();\n },\n closeCallBack: function closeCallBack() {\n var spreadState = _this12.options.spreadState;\n _this12.positionEditing = false;\n setTimeout(function () {\n _this12.options.spreadState = spreadState;\n _this12.reset();\n }, 10);\n _this12.Dialog.closeCallBack && _this12.Dialog.closeCallBack();\n },\n showCallBack: function showCallBack(show) {\n _this12.options.show = show;\n _this12.originalOptions.show = show;\n _this12.show = show;\n _this12.Dialog.showCallBack && _this12.Dialog.showCallBack();\n },\n translationalCallBack: function translationalCallBack() {\n _this12.positionEditing = !_this12.positionEditing;\n },\n // 二次编辑回调\n secondaryEditCallBack: function secondaryEditCallBack() {\n PincerArrowObject.nodeEdit(_this12, function () {\n createSpatialInfoTableContent();\n });\n }\n });\n case 10:\n this._DialogObject = _context.sent;\n this._DialogObject._element.body.className = this._DialogObject._element.body.className + ' pincerArrow';\n contentElm = document.createElement('div');\n contentElm.innerHTML = Object(_element__WEBPACK_IMPORTED_MODULE_12__[\"html\"])(this);\n this._DialogObject.contentAppChild(contentElm);\n this.attributeType = this.options.attributeType;\n this.attributeCamera = this.options.attribute.camera.content;\n\n // 创建标签页\n tabsElm = new _Element_cy_html_tabs__WEBPACK_IMPORTED_MODULE_10__[\"default\"]('pincer-arrow-object-edit-tabs', undefined, this.sdk); // 颜色组件\n colorPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName(\"color\")[0],\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: this.color,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this12.color = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this12.color = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n linecolorPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName(\"lineColor\")[0],\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: this.lineColor,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this12.lineColor = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this12.lineColor = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n labelColorPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName(\"labelColor\")[0],\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: this.labelColor,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this12.labelColor = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this12.labelColor = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n lineColorPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName(\"labelLineColor\")[0],\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: this.labelLineColor,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this12.labelLineColor = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this12.labelLineColor = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n labelBackgroundColorStartPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName(\"labelBackgroundColorStart\")[0],\n size: 'mini',\n alpha: true,\n defaultColor: this.labelBackgroundColorStart,\n disabled: false,\n openPickerAni: 'opacity',\n sure: function sure(color) {\n _this12.labelBackgroundColorStart = color;\n },\n clear: function clear() {\n _this12.labelBackgroundColorStart = 'rgba(255,255,255,1)';\n }\n });\n labelBackgroundColorEndPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName(\"labelBackgroundColorEnd\")[0],\n size: 'mini',\n alpha: true,\n defaultColor: this.labelBackgroundColorEnd,\n disabled: false,\n openPickerAni: 'opacity',\n sure: function sure(color) {\n _this12.labelBackgroundColorEnd = color;\n },\n clear: function clear() {\n _this12.labelBackgroundColorEnd = 'rgba(255,255,255,1)';\n }\n });\n all_elm = contentElm.getElementsByTagName(\"*\");\n PincerArrowObject.EventBinding(this, all_elm);\n this._elms.color = [colorPicker];\n this._elms.lineColor = [linecolorPicker];\n this._elms.labelColor = [labelColorPicker];\n this._elms.labelLineColor = [lineColorPicker];\n this._elms.labelBackgroundColorStart = [labelBackgroundColorStartPicker];\n this._elms.labelBackgroundColorEnd = [labelBackgroundColorEndPicker];\n heightBoxElm = this._DialogObject._element.content.getElementsByClassName('height-box')[0];\n heightElm = heightBoxElm.getElementsByClassName('height')[0];\n heightConfirmElm = this._DialogObject._element.content.getElementsByClassName('height-confirm')[0];\n heightElm.value = 10;\n if (this.heightMode == 2) {\n heightBoxElm && (heightBoxElm.className = 'input-number input-number-unit-1 height-box disabled');\n heightConfirmElm && heightConfirmElm.setAttribute('disabled', 'disabled');\n } else {\n heightBoxElm && (heightBoxElm.className = 'input-number input-number-unit-1 height-box');\n heightConfirmElm && heightConfirmElm.removeAttribute('disabled');\n }\n heightModeData = [{\n name: '海拔高度',\n value: '海拔高度',\n key: '0'\n }, {\n name: '相对地表',\n value: '相对地表',\n key: '1'\n }, {\n name: '依附模型',\n value: '依附模型',\n key: '2'\n }];\n heightModeObject = Object(_Element_datalist__WEBPACK_IMPORTED_MODULE_18__[\"legp\"])(this._DialogObject._element.content.getElementsByClassName('height-mode-box')[0], '.height-mode');\n if (!heightModeObject) {\n _context.next = 59;\n break;\n }\n heightModeObject.legp_search(heightModeData);\n heightModeDataLegpElm = this._DialogObject._element.content.getElementsByClassName('height-mode')[0].getElementsByTagName('input')[0];\n i = 0;\n case 43:\n if (!(i < heightModeData.length)) {\n _context.next = 51;\n break;\n }\n if (!(heightModeData[i].key == this.heightMode)) {\n _context.next = 48;\n break;\n }\n heightModeDataLegpElm.value = heightModeData[i].value;\n heightModeObject.legp_searchActive(heightModeData[i].value);\n return _context.abrupt(\"break\", 51);\n case 48:\n i++;\n _context.next = 43;\n break;\n case 51:\n heightModeDataLegpElm.addEventListener('input', function () {\n for (var _i = 0; _i < heightModeData.length; _i++) {\n if (heightModeData[_i].value === heightModeDataLegpElm.value) {\n _this12.heightMode = heightModeData[_i].key;\n break;\n }\n }\n });\n heightElm.addEventListener('input', function () {\n switch (_this12.heightMode) {\n case 0:\n case '0':\n break;\n case 1:\n case '1':\n break;\n case 2:\n case '2':\n break;\n }\n });\n this._elms.height = heightElm;\n this._elms.heightBox = heightBoxElm;\n this._elms.heightMode = heightModeDataLegpElm;\n this._elms.heightConfirm = heightConfirmElm;\n this._elms.heightModeObject = heightModeObject;\n heightConfirmElm.addEventListener('click', function () {\n if (_this12.operate.positionEditing) {\n _this12.positionEditing = false;\n _this12.height = _this12.height + Number(heightElm.value);\n } else {\n PincerArrowObject.closeNodeEdit(_this12);\n _this12.heightMode = _this12.heightMode;\n setTimeout(function () {\n _this12.height = _this12.height + Number(heightElm.value);\n }, 100);\n }\n });\n case 59:\n setTimeout(function () {\n _this12.attributeLink = _this12.options.attribute.link.content;\n _this12.attributeVr = _this12.options.attribute.vr.content;\n _this12.cameraSelect && _this12.cameraSelect();\n _this12.goodsSelect && _this12.goodsSelect();\n var tagData = _this12.attributeSelect;\n var attributeElm = _this12._DialogObject._element.content.getElementsByClassName('attribute-select-box')[0];\n if (attributeElm) {\n var legpObject = Object(_Element_datalist__WEBPACK_IMPORTED_MODULE_18__[\"legp\"])(attributeElm, \".attribute-select\");\n legpObject.legp_search(tagData);\n var attributeSelectElm = _this12._DialogObject._element.content.getElementsByClassName('attribute-select')[0].getElementsByTagName('input')[0];\n for (var _i2 = 0; _i2 < tagData.length; _i2++) {\n if (tagData[_i2].key === _this12.options.attributeType) {\n attributeSelectElm.value = tagData[_i2].value;\n legpObject.legp_searchActive(tagData[_i2].value);\n break;\n }\n }\n attributeSelectElm.addEventListener('input', function () {\n for (var _i3 = 0; _i3 < tagData.length; _i3++) {\n if (tagData[_i3].value === attributeSelectElm.value) {\n _this12.attributeType = tagData[_i3].key;\n break;\n }\n }\n });\n }\n var unitData = [{\n name: '平方米',\n value: '平方米'\n }, {\n name: '平方千米',\n value: '平方千米'\n }, {\n name: '亩',\n value: '亩'\n }, {\n name: '公顷',\n value: '公顷'\n }];\n var unitDataLegpObject = Object(_Element_datalist__WEBPACK_IMPORTED_MODULE_18__[\"legp\"])(_this12._DialogObject._element.content.getElementsByClassName('input-select-unit-box')[0], \".input-select-unit\");\n if (unitDataLegpObject) {\n unitDataLegpObject.legp_search(unitData);\n var unitDataLegpElm = _this12._DialogObject._element.content.getElementsByClassName('input-select-unit')[0].getElementsByTagName('input')[0];\n unitDataLegpElm.value = _this12.options['area-unit'];\n for (var _i4 = 0; _i4 < unitData.length; _i4++) {\n if (unitData[_i4].value === unitDataLegpElm.value) {\n unitDataLegpObject.legp_searchActive(unitData[_i4].value);\n break;\n }\n }\n unitDataLegpElm.addEventListener('input', function () {\n for (var _i5 = 0; _i5 < unitData.length; _i5++) {\n if (unitData[_i5].value === unitDataLegpElm.value) {\n _this12.areaUnit = unitData[_i5].value;\n break;\n }\n }\n });\n }\n var fontData = Object(_Element_fontSelect__WEBPACK_IMPORTED_MODULE_19__[\"getFontList\"])();\n var fontObject = Object(_Element_datalist__WEBPACK_IMPORTED_MODULE_18__[\"legp\"])(_this12._DialogObject._element.content.getElementsByClassName('font-select-box')[0], '.font-select');\n if (fontObject) {\n fontObject.legp_search(fontData);\n var fontDataLegpElm = _this12._DialogObject._element.content.getElementsByClassName('font-select')[0].getElementsByTagName('input')[0];\n fontDataLegpElm.value = fontData[_this12.labelFontFamily].value;\n for (var _i6 = 0; _i6 < fontData.length; _i6++) {\n if (fontData[_i6].value == fontDataLegpElm.value) {\n fontObject.legp_searchActive(fontData[_i6].value);\n break;\n }\n }\n fontDataLegpElm.addEventListener('input', function () {\n for (var _i7 = 0; _i7 < fontData.length; _i7++) {\n if (fontData[_i7].value === fontDataLegpElm.value) {\n _this12.labelFontFamily = fontData[_i7].key;\n break;\n }\n }\n });\n _this12._elms.labelFontFamily = [fontDataLegpElm];\n }\n createSpatialInfoTableContent();\n }, 0);\n _context.next = 63;\n break;\n case 62:\n if (this._DialogObject && this._DialogObject.remove) {\n this._DialogObject.remove();\n this._DialogObject = null;\n }\n case 63:\n case \"end\":\n return _context.stop();\n }\n }, _callee, this);\n }));\n function edit(_x) {\n return _edit.apply(this, arguments);\n }\n return edit;\n }()\n }, {\n key: \"reset\",\n value: function reset() {\n var _this13 = this;\n if (!this.entity) {\n return;\n }\n this.options = this.deepCopyObj(this.originalOptions);\n this.name = this.originalOptions.name;\n this.color = this.originalOptions.color;\n this.lineColor = this.originalOptions.line.color;\n this.lineWidth = this.originalOptions.line.width;\n this.labelShow = this.originalOptions.label.show;\n this.labelColor = this.originalOptions.label.color;\n this.labelFontSize = this.originalOptions.label.fontSize;\n this.labelFontFamily = this.originalOptions.label.fontFamily;\n this.labelScaleByDistance = this.originalOptions.label.scaleByDistance;\n this.labelNear = this.originalOptions.label.near;\n this.labelFar = this.originalOptions.label.far;\n this.labelLineWidth = this.originalOptions.label.lineWidth;\n this.labelPixelOffset = this.originalOptions.label.pixelOffset;\n this.labelLineColor = this.originalOptions.label.lineColor;\n this.labelBackgroundColorStart = this.originalOptions.label.backgroundColor[0];\n this.labelBackgroundColorEnd = this.originalOptions.label.backgroundColor[1];\n for (var i = 0; i < this.options.positions.length; i++) {\n if (this._elms.lng && this._elms.lng[i]) {\n this._elms.lng[i].innerHTML = this.options.positions[i].lng.toFixed(8);\n }\n if (this._elms.lat && this._elms.lat[i]) {\n this._elms.lat[i].innerHTML = this.options.positions[i].lat.toFixed(8);\n }\n if (this._elms.alt && this._elms.alt[i]) {\n this._elms.alt[i].innerHTML = Number(this.options.height.toFixed(2));\n }\n }\n this.heightMode = this.heightMode;\n for (var _i8 = 0; _i8 < this.nodePoints.length; _i8++) {\n this.sdk.viewer.entities.remove(this.nodePoints[_i8]);\n }\n this.nodePoints = [];\n YJ.Measure.SetMeasureStatus(false);\n this.event && this.event.destroy();\n this.tip && this.tip.destroy();\n var spreadState = this.options.spreadState;\n this.removeAnimate();\n setTimeout(function () {\n _this13.loop = _this13.options.loop;\n _this13.spreadState = spreadState;\n Object(_Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_17__[\"syncData\"])(_this13.sdk, _this13.options.id);\n Object(_Global_SplitScreen__WEBPACK_IMPORTED_MODULE_20__[\"syncSplitData\"])(_this13.sdk, _this13.options.id);\n }, 200);\n setTimeout(function () {\n _this13.previous = null;\n }, 50);\n }\n }, {\n key: \"remove\",\n value: function () {\n var _remove = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee2() {\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee2$(_context2) {\n while (1) switch (_context2.prev = _context2.next) {\n case 0:\n this.removeAnimate();\n this.event && this.event.destroy();\n this.tip && this.tip.destroy();\n this.label && this.label.remove();\n this.entity && this.sdk.viewer.entities.remove(this.entity);\n this.entity = null;\n if (this._DialogObject && !this._DialogObject.isDestroy) {\n this._DialogObject.close();\n this._DialogObject = null;\n }\n _context2.next = 9;\n return this.sdk.removeIncetance(this.options.id);\n case 9:\n _context2.next = 11;\n return Object(_Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_17__[\"syncData\"])(this.sdk, this.options.id);\n case 11:\n case \"end\":\n return _context2.stop();\n }\n }, _callee2, this);\n }));\n function remove() {\n return _remove.apply(this, arguments);\n }\n return remove;\n }()\n /**\r\n * 飞到\r\n */\n }, {\n key: \"flyTo\",\n value: (function () {\n var _flyTo = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee3() {\n var options,\n orientation,\n lng,\n lat,\n alt,\n destination,\n position,\n positionArray,\n ground,\n i,\n height,\n a,\n _i9,\n BoundingSphere,\n _args3 = arguments;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee3$(_context3) {\n while (1) switch (_context3.prev = _context3.next) {\n case 0:\n options = _args3.length > 0 && _args3[0] !== undefined ? _args3[0] : {};\n if (!this._error) {\n _context3.next = 3;\n break;\n }\n return _context3.abrupt(\"return\");\n case 3:\n Object(_Global_global__WEBPACK_IMPORTED_MODULE_21__[\"setActiveViewer\"])(0);\n Object(_Global_global__WEBPACK_IMPORTED_MODULE_21__[\"closeRotateAround\"])(this.sdk);\n Object(_Global_global__WEBPACK_IMPORTED_MODULE_21__[\"closeViewFollow\"])(this.sdk);\n if (!(this.options.customView && this.options.customView.relativePosition && this.options.customView.orientation)) {\n _context3.next = 25;\n break;\n }\n orientation = {\n heading: Cesium.Math.toRadians(this.options.customView.orientation.heading || 0.0),\n pitch: Cesium.Math.toRadians(this.options.customView.orientation.pitch || -60.0),\n roll: Cesium.Math.toRadians(this.options.customView.orientation.roll || 0.0)\n };\n lng = this.options.customView.relativePosition.lng;\n lat = this.options.customView.relativePosition.lat;\n alt = this.options.customView.relativePosition.alt;\n destination = Cesium.Cartesian3.fromDegrees(lng, lat, alt);\n position = {\n lng: 0,\n lat: 0\n };\n if (this.options.position) {\n position = _objectSpread({}, this.options.position);\n } else if (this.options.positions) {\n position = _objectSpread({}, this.options.positions[0]);\n } else if (this.options.center) {\n position = _objectSpread({}, this.options.center);\n } else if (this.options.start) {\n position = _objectSpread({}, this.options.start);\n } else {\n if (this.options.hasOwnProperty('lng')) {\n position.lng = this.options.lng;\n }\n if (this.options.hasOwnProperty('lat')) {\n position.lat = this.options.lat;\n }\n if (this.options.hasOwnProperty('alt')) {\n position.alt = this.options.alt;\n }\n }\n // 如果没有高度值,则获取紧贴高度计算\n if (position.hasOwnProperty('alt')) {\n _context3.next = 18;\n break;\n }\n _context3.next = 17;\n return this.getClampToHeight(position);\n case 17:\n position.alt = _context3.sent;\n case 18:\n lng = this.options.customView.relativePosition.lng + position.lng;\n lat = this.options.customView.relativePosition.lat + position.lat;\n alt = this.options.customView.relativePosition.alt + position.alt;\n destination = Cesium.Cartesian3.fromDegrees(lng, lat, alt);\n this.sdk.viewer.camera.flyTo({\n destination: destination,\n orientation: orientation\n });\n _context3.next = 51;\n break;\n case 25:\n positionArray = [];\n _context3.t0 = this.heightMode;\n _context3.next = _context3.t0 === 0 ? 29 : _context3.t0 === '0' ? 29 : _context3.t0 === 1 ? 31 : _context3.t0 === '1' ? 31 : _context3.t0 === 2 ? 33 : _context3.t0 === '2' ? 33 : 35;\n break;\n case 29:\n ground = false;\n return _context3.abrupt(\"break\", 35);\n case 31:\n ground = false;\n return _context3.abrupt(\"break\", 35);\n case 33:\n ground = true;\n return _context3.abrupt(\"break\", 35);\n case 35:\n if (!ground) {\n _context3.next = 48;\n break;\n }\n i = 0;\n case 37:\n if (!(i < this.options.positions.length)) {\n _context3.next = 46;\n break;\n }\n _context3.next = 40;\n return this.getClampToHeight(this.options.positions[i]);\n case 40:\n height = _context3.sent;\n a = Cesium.Cartesian3.fromDegrees(this.options.positions[i].lng, this.options.positions[i].lat, height);\n positionArray.push(a.x, a.y, a.z);\n case 43:\n i++;\n _context3.next = 37;\n break;\n case 46:\n _context3.next = 49;\n break;\n case 48:\n if (this.positionsH) {\n for (_i9 = 0; _i9 < this.positionsH.length; _i9++) {\n positionArray.push(this.positionsH[_i9].x, this.positionsH[_i9].y, this.positionsH[_i9].z);\n }\n }\n case 49:\n BoundingSphere = Cesium.BoundingSphere.fromVertices(positionArray);\n this.sdk.viewer.camera.flyToBoundingSphere(BoundingSphere, {\n offset: options.orientation || {\n heading: Cesium.Math.toRadians(0.0),\n pitch: Cesium.Math.toRadians(-90.0),\n roll: Cesium.Math.toRadians(0.0)\n }\n });\n case 51:\n case \"end\":\n return _context3.stop();\n }\n }, _callee3, this);\n }));\n function flyTo() {\n return _flyTo.apply(this, arguments);\n }\n return flyTo;\n }()\n /**\r\n * 打开富文本框\r\n */\n )\n }, {\n key: \"openRichTextEditor\",\n value: function openRichTextEditor(e) {\n var _this14 = this;\n _Element_richText__WEBPACK_IMPORTED_MODULE_11__[\"default\"].open(this.options.id, this.options.name, this.options.richTextContent);\n _Element_richText__WEBPACK_IMPORTED_MODULE_11__[\"default\"].primaryCallBack = function (content) {\n _this14.options.richTextContent = content;\n };\n }\n\n /**@desc 打开平移功能\r\n *\r\n * @memberOf Source\r\n * @param status {boolean}\r\n *\r\n * */\n }, {\n key: \"positionEditing\",\n get: function get() {\n return this.operate.positionEditing;\n },\n set: function set(status) {\n var _this15 = this;\n if (YJ.Measure.GetMeasureStatus() || !this.sdk || !this.sdk.viewer || !this.entity) {\n return;\n }\n this.removeAnimate();\n var _this = this;\n this.event && this.event.destroy();\n this.event = new _Event_index__WEBPACK_IMPORTED_MODULE_15__[\"default\"](this.sdk);\n this.operate.positionEditing = status;\n if (status === true) {\n var _Cesium$Cartesian;\n this.previous = {\n positions: _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(this.positions)\n };\n this.tip && this.tip.destroy();\n this.tip = new _MouseTip__WEBPACK_IMPORTED_MODULE_16__[\"default\"]('点击鼠标左键确认,右键取消', this.sdk);\n this.label && (this.label.entity.billboard.color = Cesium.Color.fromCssColorString(\"rgba(255,255,255,0.9)\"));\n this.picking = false;\n var array = [];\n var positions = _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(this.positions);\n var disparity = [];\n for (var i = 0; i < positions.length; i++) {\n var position = this.cartesian3Towgs84(positions[i], this.sdk.viewer);\n array.push([position.lng, position.lat]);\n }\n var firstposition = this.cartesian3Towgs84(positions[0], this.sdk.viewer);\n array.push([firstposition.lng, firstposition.lat]);\n var polygon = turf.polygon([array]);\n var centroid = turf.centroid(polygon);\n var center = (_Cesium$Cartesian = Cesium.Cartesian3).fromDegrees.apply(_Cesium$Cartesian, _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(centroid.geometry.coordinates));\n for (var _i10 = 0; _i10 < positions.length; _i10++) {\n center.x - positions[_i10].x;\n disparity.push({\n x: center.x - positions[_i10].x,\n y: center.y - positions[_i10].y,\n z: center.z - positions[_i10].z\n });\n }\n var newpositions = [];\n this.event.mouse_move(function (movement, cartesian) {\n newpositions = [];\n for (var _i11 = 0; _i11 < disparity.length; _i11++) {\n newpositions.push({\n x: cartesian.x - disparity[_i11].x,\n y: cartesian.y - disparity[_i11].y,\n z: cartesian.z - disparity[_i11].z\n });\n }\n _this15.tip.setPosition(cartesian, movement.endPosition.x, movement.endPosition.y);\n });\n this.event.mouse_left(function (movement, cartesian) {\n _this15.event.mouse_move(function () {});\n _this15.event.mouse_left(function () {});\n _this15.event.mouse_right(function () {});\n _this15.event.gesture_pinck_start(function () {});\n newpositions = [];\n for (var _i12 = 0; _i12 < disparity.length; _i12++) {\n var pos3 = {\n x: cartesian.x - disparity[_i12].x,\n y: cartesian.y - disparity[_i12].y,\n z: cartesian.z - disparity[_i12].z\n };\n newpositions.push(pos3);\n _this15.options.positions[_i12] = _this15.cartesian3Towgs84(pos3, _this15.sdk.viewer);\n if (_this15._elms.lng && _this15._elms.lng[_i12]) {\n _this15._elms.lng[_i12].innerHTML = _this15.options.positions[_i12].lng.toFixed(8);\n }\n if (_this15._elms.lat && _this15._elms.lat[_i12]) {\n _this15._elms.lat[_i12].innerHTML = _this15.options.positions[_i12].lat.toFixed(8);\n }\n }\n _this15.positions = newpositions;\n _this15.previous = {\n positions: _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(_this15.positions)\n };\n _this15.positionEditing = false;\n if (_this15._positionEditingCallback) {\n _this15._positionEditingCallback();\n _this15._positionEditingCallback = null;\n }\n });\n this.event.mouse_right(function (movement, cartesian) {\n _this15.positionEditing = false;\n });\n this.event.gesture_pinck_start(function (movement, cartesian) {\n var startTime = new Date();\n _this15.event.gesture_pinck_end(function () {\n var endTime = new Date();\n if (endTime - startTime >= 500) {\n // 长按取消\n _this15.positionEditing = false;\n } else {\n _this15.event.mouse_move(function () {});\n _this15.event.mouse_left(function () {});\n _this15.event.mouse_right(function () {});\n _this15.event.gesture_pinck_start(function () {});\n newpositions = [];\n for (var _i13 = 0; _i13 < disparity.length; _i13++) {\n var pos3 = {\n x: cartesian.x - disparity[_i13].x,\n y: cartesian.y - disparity[_i13].y,\n z: cartesian.z - disparity[_i13].z\n };\n newpositions.push(pos3);\n _this15.options.positions[_i13] = _this15.cartesian3Towgs84(pos3, _this15.sdk.viewer);\n if (_this15._elms.lng && _this15._elms.lng[_i13]) {\n _this15._elms.lng[_i13].innerHTML = _this15.options.positions[_i13].lng.toFixed(8);\n }\n if (_this15._elms.lat && _this15._elms.lat[_i13]) {\n _this15._elms.lat[_i13].innerHTML = _this15.options.positions[_i13].lat.toFixed(8);\n }\n }\n _this15.positions = newpositions;\n _this15.previous = {\n positions: _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(_this15.positions)\n };\n _this15.positionEditing = false;\n }\n });\n });\n this.entity.polygon.hierarchy = new Cesium.CallbackProperty(function () {\n var position84 = [];\n if (newpositions.length > 0) {\n for (var _i14 = 0; _i14 < newpositions.length; _i14++) {\n position84.push(_this.cartesian3Towgs84(newpositions[_i14], _this.sdk.viewer));\n }\n } else {\n for (var _i15 = 0; _i15 < positions.length; _i15++) {\n position84.push(_this.cartesian3Towgs84(positions[_i15], _this.sdk.viewer));\n }\n }\n _this.renewPositions(position84);\n return new Cesium.PolygonHierarchy(_this.positionsH);\n }, false);\n this.entity.polyline.positions = new Cesium.CallbackProperty(function () {\n return [].concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(_this.positionsH), [_this.positionsH[0], _this.positionsH[1]]);\n }, false);\n } else {\n if (this.label && this.label.entity && this.label.entity.billboard) {\n this.label.entity.billboard.color = Cesium.Color.fromCssColorString(\"rgba(255,255,255,1)\");\n }\n this.picking = true;\n if (this.event) {\n this.event.mouse_move(function () {});\n this.event.mouse_left(function () {});\n this.event.mouse_right(function () {});\n this.event.gesture_pinck_start(function () {});\n this.event.destroy();\n }\n this.tip && this.tip.destroy();\n if (!this.previous) {\n this.previous = {\n positions: _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(this.positions)\n };\n } else {\n this.positions = _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(this.previous.positions);\n }\n var position84 = [];\n for (var _i16 = 0; _i16 < this.positions.length; _i16++) {\n position84.push(this.cartesian3Towgs84(this.positions[_i16], this.sdk.viewer));\n }\n this.renewPositions(position84);\n this.entity.polygon.hierarchy = new Cesium.CallbackProperty(function () {\n return new Cesium.PolygonHierarchy(_this.positionsH);\n }, true);\n this.entity.polyline.positions = new Cesium.CallbackProperty(function () {\n return [].concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(_this.positionsH), [_this.positionsH[0], _this.positionsH[1]]);\n }, true);\n }\n }\n }, {\n key: \"openPositionEditing\",\n value: function openPositionEditing(cd) {\n this.positionEditing = true;\n this._positionEditingCallback = cd;\n }\n }, {\n key: \"areaChangeCallBack\",\n get: function get() {\n return this._areaChangeCallBack;\n },\n set: function set(cd) {\n this._areaChangeCallBack = cd;\n }\n }, {\n key: \"nodeEdit\",\n value: function nodeEdit() {\n var _this16 = this;\n var cb = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function () {};\n this.positionEditing = false;\n setTimeout(function () {\n if (YJ.Measure.GetMeasureStatus()) {\n cb('上一次测量未结束');\n } else {\n var createNodePoints = /*#__PURE__*/function () {\n var _ref = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee4() {\n var objectsToExclude, i, height, entity;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee4$(_context4) {\n while (1) switch (_context4.prev = _context4.next) {\n case 0:\n objectsToExclude = _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(_this17.sdk.viewer.entities.values);\n i = 0;\n case 2:\n if (!(i < optionsPositions.length)) {\n _context4.next = 11;\n break;\n }\n _context4.next = 5;\n return _this17.getClampToHeight(_this17.options.positions[i], objectsToExclude);\n case 5:\n height = _context4.sent;\n entity = _this17.sdk.viewer.entities.add({\n name: 'node-secondary-edit-point',\n index: i,\n position: Cesium.Cartesian3.fromDegrees(optionsPositions[i].lng, optionsPositions[i].lat, height),\n billboard: {\n image: _this17.getSourceRootPath() + '/img/point.png',\n width: 15,\n height: 15,\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\n color: Cesium.Color.WHITE.withAlpha(0.99)\n }\n });\n _this17.nodePoints.push(entity);\n case 8:\n i++;\n _context4.next = 2;\n break;\n case 11:\n case \"end\":\n return _context4.stop();\n }\n }, _callee4);\n }));\n return function createNodePoints() {\n return _ref.apply(this, arguments);\n };\n }();\n _this16.removeAnimate();\n var _this17 = _this16;\n YJ.Measure.SetMeasureStatus(true);\n _this16.tip = new _MouseTip__WEBPACK_IMPORTED_MODULE_16__[\"default\"]('请选择一个顶点,右键取消', _this16.sdk);\n _this16.event = new _Event_index__WEBPACK_IMPORTED_MODULE_15__[\"default\"](_this16.sdk);\n _this16.nodePoints = [];\n var selectPoint;\n var originalPosition;\n var optionsPositions = _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(_this16.options.positions);\n var leftEvent = function leftEvent(movement, cartesian) {\n if (selectPoint) {\n _this16.options.positions[selectPoint.index] = _this16.cartesian3Towgs84(cartesian, _this16.sdk.viewer);\n optionsPositions[selectPoint.index] = _this16.options.positions[selectPoint.index];\n var index = selectPoint.index;\n var entity = _this16.sdk.viewer.entities.add({\n name: 'node-secondary-edit-point',\n index: index,\n position: Cesium.Cartesian3.fromDegrees(optionsPositions[selectPoint.index].lng, optionsPositions[selectPoint.index].lat, optionsPositions[selectPoint.index].alt),\n billboard: {\n image: _this16.getSourceRootPath() + '/img/point.png',\n width: 15,\n height: 15,\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\n color: Cesium.Color.WHITE.withAlpha(0.99)\n }\n });\n _this16.nodePoints.splice(selectPoint.index, 0, entity);\n selectPoint = null;\n _this16.tip.set_text('请选择一个顶点,右键取消');\n } else {\n var pick = _this16.sdk.viewer.scene.pick(movement.position);\n if (pick && pick.id && pick.id.name && pick.id.name === 'node-secondary-edit-point') {\n selectPoint = pick.id;\n originalPosition = _this16.cartesian3Towgs84(pick.id.position.getValue(), _this16.sdk.viewer);\n _this16.nodePoints.splice(pick.id.index, 1);\n _this16.sdk.viewer.entities.remove(pick.id);\n _this16.tip.set_text('左键确定,右键取消');\n }\n }\n _this16.renewPositions();\n _this16.tip.setPosition(cartesian, movement.position.x, movement.position.y);\n };\n var rightEvent = function rightEvent() {\n _this16.event.mouse_move(function () {});\n _this16.event.mouse_left(function () {});\n _this16.event.mouse_right(function () {});\n _this16.event.gesture_pinck_start(function () {});\n if (selectPoint) {\n optionsPositions[selectPoint.index] = originalPosition;\n if (_this16._elms.lng && _this16._elms.lng[selectPoint.index]) {\n _this16._elms.lng[selectPoint.index].innerHTML = _this16.options.positions[selectPoint.index].lng.toFixed(8);\n }\n if (_this16._elms.lat && _this16._elms.lat[selectPoint.index]) {\n _this16._elms.lat[selectPoint.index].innerHTML = _this16.options.positions[selectPoint.index].lat.toFixed(8);\n }\n cb(null, optionsPositions);\n }\n _this16.options.positions = _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(optionsPositions);\n _this16.heightMode = _this16.heightMode;\n _this16.previous = null;\n };\n _this16.entity.polyline.clampToGround = true;\n _this16.entity.polyline.arcType = Cesium.ArcType.GEODESIC;\n _this16.entity.polygon.perPositionHeight = false;\n _this16.entity.polygon.hierarchy = new Cesium.CallbackProperty(function () {\n return new Cesium.PolygonHierarchy(_this17.positionsH);\n }, false);\n _this16.entity.polyline.positions = new Cesium.CallbackProperty(function () {\n return [].concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(_this17.positionsH), [_this17.positionsH[0], _this17.positionsH[1]]);\n }, false);\n setTimeout(function () {\n _this16.event.mouse_left(leftEvent);\n _this16.event.mouse_right(rightEvent);\n _this16.event.mouse_move(function (movement, cartesian) {\n if (selectPoint) {\n _this16.options.positions[selectPoint.index] = _this16.cartesian3Towgs84(cartesian, _this16.sdk.viewer);\n _this16.renewPositions();\n }\n _this16.tip.setPosition(cartesian, movement.endPosition.x, movement.endPosition.y);\n });\n _this16.event.gesture_pinck_start(function (movement, cartesian) {\n var startTime = new Date();\n var pos = {\n position: {\n x: (movement.position1.x + movement.position2.x) / 2,\n y: (movement.position1.y + movement.position2.y) / 2\n }\n };\n _this16.event.gesture_pinck_end(function () {\n var endTime = new Date();\n if (endTime - startTime >= 500) {\n // 长按取消\n rightEvent();\n } else {\n leftEvent(pos, cartesian);\n }\n });\n });\n var points = [[]];\n var pos84 = [];\n for (var i = 0; i < _this16.positionsH.length; i++) {\n var _position = _this16.cartesian3Towgs84(_this16.positionsH[i], _this16.sdk.viewer);\n pos84.push(_position);\n points[0].push([_position.lng, _position.lat]);\n }\n var position = _this16.cartesian3Towgs84(_this16.positionsH[0], _this16.sdk.viewer);\n points[0].push([position.lng, position.lat]);\n var polygon = turf.polygon(points);\n var centroid = turf.pointOnFeature(polygon);\n var objectsToExclude = _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(_this16.sdk.viewer.entities.values);\n _this16.getClampToHeight({\n lng: centroid.geometry.coordinates[0],\n lat: centroid.geometry.coordinates[1]\n }, objectsToExclude).then(function (height) {\n _this16.label.position = [centroid.geometry.coordinates[0], centroid.geometry.coordinates[1], height];\n });\n createNodePoints();\n }, 200);\n }\n }, 0);\n }\n }, {\n key: \"closeNodeEdit\",\n value: function closeNodeEdit() {\n YJ.Measure.SetMeasureStatus(false);\n this.event && this.event.destroy();\n this.tip && this.tip.destroy();\n this.tip = null;\n for (var i = 0; i < this.nodePoints.length; i++) {\n this.sdk.viewer.entities.remove(this.nodePoints[i]);\n }\n this.nodePoints = [];\n this.picking = true;\n }\n }, {\n key: \"setPosition\",\n value: function setPosition(v) {\n var _Cesium$Cartesian2;\n var cartesian = Cesium.Cartesian3.fromDegrees(v.position.lng, v.position.lat, v.position.alt);\n var positions = _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(this.positions);\n var array = [];\n var disparity = [];\n for (var i = 0; i < positions.length; i++) {\n var position = this.cartesian3Towgs84(positions[i], this.sdk.viewer);\n array.push([position.lng, position.lat]);\n }\n var firstposition = this.cartesian3Towgs84(positions[0], this.sdk.viewer);\n array.push([firstposition.lng, firstposition.lat]);\n var polygon = turf.polygon([array]);\n var centroid = turf.centroid(polygon);\n var center = (_Cesium$Cartesian2 = Cesium.Cartesian3).fromDegrees.apply(_Cesium$Cartesian2, _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(centroid.geometry.coordinates));\n for (var _i17 = 0; _i17 < positions.length; _i17++) {\n disparity.push({\n x: center.x - positions[_i17].x,\n y: center.y - positions[_i17].y,\n z: center.z - positions[_i17].z\n });\n }\n var newpositions = [];\n for (var _i18 = 0; _i18 < disparity.length; _i18++) {\n newpositions.push({\n x: cartesian.x - disparity[_i18].x,\n y: cartesian.y - disparity[_i18].y,\n z: cartesian.z - disparity[_i18].z\n });\n }\n this.label.position = [v.position.lng, v.position.lat, v.position.alt];\n var positions84 = [];\n if (newpositions.length > 0) {\n for (var _i19 = 0; _i19 < newpositions.length; _i19++) {\n positions84.push(this.cartesian3Towgs84(newpositions[_i19], this.sdk.viewer));\n }\n }\n var arr = this.computePincerArrow(positions84);\n if (arr.length == 0) {\n return;\n }\n this.entity.polygon.hierarchy = new Cesium.CallbackProperty(function () {\n return new Cesium.PolygonHierarchy(arr);\n }, false);\n this.entity.polyline.positions = new Cesium.CallbackProperty(function () {\n if (arr.length >= 3) {\n return [].concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(arr), [arr[0], arr[1]]);\n } else {\n return _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(arr);\n }\n }, false);\n }\n }, {\n key: \"setDIV\",\n value: function setDIV() {\n var _this18 = this;\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {\n domid: \"\",\n x: 10,\n y: 10\n };\n options.x = options.x || options.x === 0 ? options.x : 10;\n options.y = options.y || options.y === 0 ? options.y : 10;\n var positions = this.computePincerArrow(this.options.positions);\n if (positions.length == 0) {\n return;\n }\n var points = [[]];\n for (var i = 0; i < positions.length; i++) {\n var _position2 = this.cartesian3Towgs84(positions[i], this.sdk.viewer);\n points[0].push([_position2.lng, _position2.lat]);\n }\n var position = this.cartesian3Towgs84(positions[0], this.sdk.viewer);\n points[0].push([position.lng, position.lat]);\n var polygon = turf.polygon(points);\n // let centroid = turf.centroid(polygon);\n var centroid = turf.pointOnFeature(polygon);\n var siteInfoDom = document.getElementById(options.domid);\n var siteInfoPosition = Cesium.Cartesian3.fromDegrees(centroid.geometry.coordinates[0], centroid.geometry.coordinates[1]);\n this.sdk.viewer.scene.postRender.addEventListener(function (percentage) {\n //转换到屏幕坐标\n if (siteInfoDom.style.display === 'block' || siteInfoDom.style.display === '') {\n var winpos = _this18.sdk.viewer.scene.cartesianToCanvasCoordinates(siteInfoPosition);\n if (winpos) {\n siteInfoDom.style.left = (winpos.x + options.x).toFixed(0) + 'px';\n siteInfoDom.style.top = (winpos.y + options.y).toFixed(0) + 'px';\n }\n }\n });\n }\n }, {\n key: \"spreadTime\",\n get: function get() {\n return this.options.spreadTime;\n },\n set: function set(v) {\n var spreadTime = Number(v);\n if (isNaN(spreadTime)) {\n spreadTime = 3000;\n } else if (spreadTime < 500) {\n spreadTime = 500;\n } else if (spreadTime > 9999999) {\n spreadTime = 9999999;\n }\n this.options.spreadTime = spreadTime;\n if (this.spreadState) {\n this.setSpreadProgressByTime();\n }\n this._elms.spreadTime && this._elms.spreadTime.forEach(function (item) {\n item.value = spreadTime;\n });\n }\n }, {\n key: \"loop\",\n get: function get() {\n return this.options.loop;\n },\n set: function set(v) {\n this.options.loop = v;\n if (this.TweenAnimate) {\n if (v) {\n this.TweenAnimate.repeat(Infinity);\n } else {\n this.TweenAnimate.repeat();\n }\n }\n this._elms.loop && this._elms.loop.forEach(function (item) {\n item.checked = v;\n });\n }\n }, {\n key: \"spreadState\",\n get: function get() {\n return this.options.spreadState;\n },\n set: function set(v) {\n this.options.spreadState = v;\n if (this.TweenAnimate) {\n if (v) {\n this.lineEdit = false;\n this.setSpreadProgressByTime(this.TweenAnimate._object.distance1 / this.TweenAnimate._valuesEnd.distance1 * this.spreadTime);\n } else {\n this.TweenAnimate.pause();\n }\n } else {\n if (v) {\n this.setSpreadProgressByTime();\n }\n }\n this._elms.spreadState && this._elms.spreadState.forEach(function (item) {\n item.checked = v;\n });\n }\n }, {\n key: \"setSpreadProgressByTime\",\n value: function setSpreadProgressByTime() {\n var _this19 = this;\n var time = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n if (!this.entity) {\n return;\n }\n var that = this;\n for (var i = 0; i < this.nodePoints.length; i++) {\n this.sdk.viewer.entities.remove(this.nodePoints[i]);\n }\n this.nodePoints = [];\n YJ.Measure.SetMeasureStatus(false);\n this.event && this.event.destroy();\n this.tip && this.tip.destroy();\n var PincerArrowArr = this.computePincerArrow(this.options.positions);\n if (PincerArrowArr.length == 0) {\n return;\n }\n var arr;\n var lineArr;\n // if (arr.length >= 3) {\n // lineArr = [...arr, arr[0], arr[1]]\n // }\n // else {\n // lineArr = [...arr]\n // }\n if (this.TweenAnimate) {\n TWEEN.remove(this.TweenAnimate);\n this.TweenAnimate = null;\n }\n var _getSdk = Object(_Global_SplitScreen__WEBPACK_IMPORTED_MODULE_20__[\"getSdk\"])(),\n sdkP = _getSdk.sdkP,\n sdkD = _getSdk.sdkD;\n var thatP;\n if (sdkD && sdkP) {\n if (this.sdk === sdkD) {\n thatP = sdkP.entityMap.get(this.options.id);\n if (thatP && thatP.entity && thatP.entity.polygon && thatP.positionsH) {\n this.entity.polygon.hierarchy = new Cesium.CallbackProperty(function () {\n return new Cesium.PolygonHierarchy(thatP.positionsH);\n }, false);\n this.entity.polyline.positions = new Cesium.CallbackProperty(function () {\n return [].concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(thatP.positionsH), [thatP.positionsH[0], thatP.positionsH[1]]);\n }, false);\n }\n return;\n }\n }\n\n // this.entity.polygon.hierarchy = arr\n // this.entity.polyline.positions = lineArr\n\n var linePos841 = [];\n var linePos842 = [];\n var linePos843 = [];\n var turfLine = [];\n for (var _i20 = 0; _i20 <= 2; _i20++) {\n turfLine.push([this.options.positions[_i20].lng, this.options.positions[_i20].lat]);\n }\n turfLine.push([this.options.positions[0].lng, this.options.positions[0].lat]);\n var clockwiseRing = turf.lineString(turfLine);\n var isClockwise = turf.booleanClockwise(clockwiseRing);\n for (var _i21 = 0; _i21 <= 100; _i21++) {\n var pos84 = this.cartesian3Towgs84(PincerArrowArr[_i21], this.sdk.viewer);\n linePos841.push([pos84.lng, pos84.lat, pos84.alt]);\n }\n if (isClockwise) {\n linePos841.push([this.options.positions[3].lng, this.options.positions[3].lat, this.options.positions[3].alt]);\n } else {\n linePos841.push([this.options.positions[2].lng, this.options.positions[2].lat, this.options.positions[2].alt]);\n }\n for (var _i22 = 312; _i22 >= 212; _i22--) {\n var _pos = this.cartesian3Towgs84(PincerArrowArr[_i22], this.sdk.viewer);\n linePos842.push([_pos.lng, _pos.lat, _pos.alt]);\n }\n if (isClockwise) {\n linePos842.push([this.options.positions[2].lng, this.options.positions[2].lat, this.options.positions[2].alt]);\n } else {\n linePos842.push([this.options.positions[3].lng, this.options.positions[3].lat, this.options.positions[3].alt]);\n }\n linePos843.push([(this.options.positions[0].lng + this.options.positions[1].lng) / 2, (this.options.positions[0].lat + this.options.positions[1].lat) / 2], [this.options.positions[4].lng, this.options.positions[4].lat]);\n var positions = this.deepCopyObj(this.options.positions);\n var line1 = turf.lineString(linePos841);\n var distance1 = turf.length(line1, {\n units: 'kilometers'\n });\n var line2 = turf.lineString(linePos842);\n var distance2 = turf.length(line2, {\n units: 'kilometers'\n });\n var line3 = turf.lineString(linePos843);\n var distance3 = turf.length(line3, {\n units: 'kilometers'\n });\n var timeRatio = time / this.spreadTime;\n var m = 0;\n this.TweenAnimate = new TWEEN.Tween({\n distance1: distance1 * timeRatio,\n distance2: distance2 * timeRatio,\n distance3: distance3 * timeRatio\n }).to({\n distance1: distance1,\n distance2: distance2,\n distance3: distance3\n }, this.spreadTime - time).easing(TWEEN.Easing.Linear.None).repeat(this.options.loop ? Infinity : 0).onRepeat(function () {\n if (time) {\n _this19.setSpreadProgressByTime();\n }\n }).onUpdate(/*#__PURE__*/function () {\n var _ref2 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee5(r, a) {\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee5$(_context5) {\n while (1) switch (_context5.prev = _context5.next) {\n case 0:\n if (!(_this19.TweenAnimate._duration == Infinity)) {\n _context5.next = 2;\n break;\n }\n return _context5.abrupt(\"return\");\n case 2:\n m++;\n if (_this19.sdk.viewer) {\n _context5.next = 6;\n break;\n }\n _this19.removeAnimate();\n return _context5.abrupt(\"return\");\n case 6:\n setSpread(r);\n case 7:\n case \"end\":\n return _context5.stop();\n }\n }, _callee5);\n }));\n return function (_x2, _x3) {\n return _ref2.apply(this, arguments);\n };\n }()).onStart(function () {\n _this19.options.spreadState = true;\n _this19._elms.spreadState && _this19._elms.spreadState.forEach(function (item) {\n item.checked = true;\n });\n }).onComplete(function (d) {\n _this19.removeAnimate();\n });\n if (this.spreadState) {\n this.TweenAnimate.start();\n } else {\n setSpread({\n distance1: distance1 * timeRatio,\n distance2: distance2 * timeRatio,\n distance3: distance3 * timeRatio\n });\n }\n function setSpread(_x4) {\n return _setSpread.apply(this, arguments);\n }\n function _setSpread() {\n _setSpread = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee6(v) {\n var index2, index3, sliced1, coordinates1, sliced2, coordinates2, sliced3, coordinates3;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee6$(_context6) {\n while (1) switch (_context6.prev = _context6.next) {\n case 0:\n if (that.show) {\n _context6.next = 2;\n break;\n }\n return _context6.abrupt(\"return\");\n case 2:\n index2 = 2;\n index3 = 3;\n if (isClockwise) {\n index2 = 3;\n index3 = 2;\n }\n if (v.distance1) {\n _context6.next = 10;\n break;\n }\n positions[index2].lng = positions[1].lng;\n positions[index2].lat = positions[1].lat;\n _context6.next = 16;\n break;\n case 10:\n _context6.next = 12;\n return turf.lineSliceAlong(line1, 0, v.distance1, {\n units: 'kilometers'\n });\n case 12:\n sliced1 = _context6.sent;\n coordinates1 = _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(sliced1.geometry.coordinates[sliced1.geometry.coordinates.length - 1]);\n positions[index2].lng = coordinates1[0];\n positions[index2].lat = coordinates1[1];\n case 16:\n if (v.distance2) {\n _context6.next = 21;\n break;\n }\n positions[index3].lng = positions[0].lng;\n positions[3].lat = positions[0].lat;\n _context6.next = 27;\n break;\n case 21:\n _context6.next = 23;\n return turf.lineSliceAlong(line2, 0, v.distance2, {\n units: 'kilometers'\n });\n case 23:\n sliced2 = _context6.sent;\n coordinates2 = _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(sliced2.geometry.coordinates[sliced2.geometry.coordinates.length - 1]);\n positions[index3].lng = coordinates2[0];\n positions[index3].lat = coordinates2[1];\n case 27:\n if (v.distance3) {\n _context6.next = 32;\n break;\n }\n positions[4].lng = linePos843[0][0];\n positions[4].lat = linePos843[0][1];\n _context6.next = 38;\n break;\n case 32:\n _context6.next = 34;\n return turf.lineSliceAlong(line3, 0, v.distance3, {\n units: 'kilometers'\n });\n case 34:\n sliced3 = _context6.sent;\n coordinates3 = _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(sliced3.geometry.coordinates[sliced3.geometry.coordinates.length - 1]);\n positions[4].lng = coordinates3[0];\n positions[4].lat = coordinates3[1];\n case 38:\n that.renewPositions(positions);\n case 39:\n case \"end\":\n return _context6.stop();\n }\n }, _callee6);\n }));\n return _setSpread.apply(this, arguments);\n }\n this.entity.polygon.hierarchy = new Cesium.CallbackProperty(function () {\n return new Cesium.PolygonHierarchy(that.positionsH);\n }, false);\n this.entity.polyline.positions = new Cesium.CallbackProperty(function () {\n return [].concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(that.positionsH), [that.positionsH[0], that.positionsH[1]]);\n }, false);\n }\n\n // 移除动画\n }, {\n key: \"removeAnimate\",\n value: function removeAnimate() {\n this.spreadState = false;\n if (this.TweenAnimate) {\n TWEEN.remove(this.TweenAnimate);\n this.TweenAnimate = null;\n this.renewPositions();\n this.entity.polygon.hierarchy = new Cesium.PolygonHierarchy(this.positionsH);\n this.entity.polyline.positions = [].concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(this.positionsH), [this.positionsH[0], this.positionsH[1]]);\n }\n }\n\n // 更新坐标\n }, {\n key: \"renewPositions\",\n value: function renewPositions(position84) {\n var _this20 = this;\n if (this._error || !this.sdk.viewer) {\n return;\n }\n var ground = false;\n var array = [];\n var positions = this.options.positions;\n if (position84) {\n positions = position84;\n }\n var fromDegreesArray = [];\n for (var i = 0; i < positions.length; i++) {\n fromDegreesArray.push(positions[i].lng, positions[i].lat);\n }\n this.positions = Cesium.Cartesian3.fromDegreesArray(fromDegreesArray);\n var positionsA = this.computePincerArrow(positions);\n if (positionsA.length == 0) {\n return;\n }\n var points = [[]];\n var pos84 = [];\n for (var _i23 = 0; _i23 < positionsA.length; _i23++) {\n var _position3 = this.cartesian3Towgs84(positionsA[_i23], this.sdk.viewer);\n pos84.push(_position3);\n points[0].push([_position3.lng, _position3.lat]);\n }\n var position = this.cartesian3Towgs84(positionsA[0], this.sdk.viewer);\n points[0].push([position.lng, position.lat]);\n var height = 0;\n var polygon = turf.polygon(points);\n var centroid = turf.pointOnFeature(polygon);\n switch (this.options.heightMode) {\n case '0':\n case 0:\n ground = false;\n break;\n case '1':\n case 1:\n height = this.sdk.viewer.scene.globe.getHeight(Cesium.Cartographic.fromDegrees(centroid.geometry.coordinates[0], centroid.geometry.coordinates[1])) || 0;\n ground = false;\n break;\n case '2':\n case 2:\n ground = true;\n break;\n }\n var fromDegreesArray2 = [];\n if (!ground && this.nodePoints.length == 0) {\n for (var _i24 = 0; _i24 < points[0].length; _i24++) {\n fromDegreesArray2.push(points[0][_i24][0], points[0][_i24][1], this.height + height);\n }\n this.positionsH = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray2);\n this.label && (this.label.position = [centroid.geometry.coordinates[0], centroid.geometry.coordinates[1], this.height + height]);\n } else {\n this.positionsH = positionsA;\n setTimeout(function () {\n if (!_this20.sdk.viewer) {\n return;\n }\n var objectsToExclude = _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(_this20.sdk.viewer.entities.values);\n _this20.getClampToHeight({\n lng: centroid.geometry.coordinates[0],\n lat: centroid.geometry.coordinates[1]\n }, objectsToExclude).then(function (height) {\n _this20.label && (_this20.label.position = [centroid.geometry.coordinates[0], centroid.geometry.coordinates[1], height]);\n });\n }, 100);\n }\n\n // 计算投影面积\n if (!this.spreadState) {\n this.areaByMeter = this.computeArea(pos84);\n this.areaChangeCallBack && this.areaChangeCallBack();\n }\n return fromDegreesArray;\n }\n }], [{\n key: \"create\",\n value: function create(that) {\n var positions = that.options.positions;\n var fromDegreesArray = [];\n for (var i = 0; i < positions.length; i++) {\n fromDegreesArray.push(positions[i].lng, positions[i].lat);\n }\n that.positions = Cesium.Cartesian3.fromDegreesArray(fromDegreesArray);\n var positionsA = that.computePincerArrow(that.options.positions);\n if (positionsA.length == 0) {\n return;\n }\n var points = [[]];\n for (var _i25 = 0; _i25 < positionsA.length; _i25++) {\n var _position4 = that.cartesian3Towgs84(positionsA[_i25], that.sdk.viewer);\n points[0].push([_position4.lng, _position4.lat]);\n }\n var position = that.cartesian3Towgs84(positionsA[0], that.sdk.viewer);\n points[0].push([position.lng, position.lat]);\n var polygon = turf.polygon(points);\n // let centroid = turf.centroid(polygon);\n var centroid = turf.pointOnFeature(polygon);\n var ground;\n var height = 0;\n switch (that.options.heightMode) {\n case '0':\n case 0:\n ground = false;\n break;\n case '1':\n case 1:\n height = that.sdk.viewer.scene.globe.getHeight(Cesium.Cartographic.fromDegrees(centroid.geometry.coordinates[0], centroid.geometry.coordinates[1])) || 0;\n ground = false;\n break;\n case '2':\n case 2:\n ground = true;\n break;\n }\n\n // if (!that.options.label.position) {\n // that.options.label.position = { lng: centroid.geometry.coordinates[0], lat: centroid.geometry.coordinates[1], alt: that.height + height }\n // }\n that.options.label.position = {\n lng: centroid.geometry.coordinates[0],\n lat: centroid.geometry.coordinates[1],\n alt: that.height + height\n };\n var fromDegreesArray2 = [];\n for (var _i26 = 0; _i26 < points[0].length; _i26++) {\n fromDegreesArray2.push(points[0][_i26][0], points[0][_i26][1], that.height + height);\n }\n var material = Cesium.Color.fromCssColorString(that.options.color);\n if (that.sdk.viewer.scene.mode === 2) {\n ground = false;\n material = new Cesium.CustomColorMaterialSource({\n color: that.options.color\n });\n }\n // that.options.label.ground = ground\n\n that.positionsH = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray2);\n that.entity = that.sdk.viewer.entities.add({\n id: that.options.id,\n show: that.options.show,\n polygon: {\n hierarchy: !ground ? new Cesium.PolygonHierarchy(that.positionsH) : new Cesium.PolygonHierarchy(positionsA),\n perPositionHeight: !ground ? true : false,\n material: material,\n zIndex: that.sdk._entityZIndex\n },\n polyline: {\n positions: [].concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(that.positionsH), [that.positionsH[0], that.positionsH[1]]),\n width: that.options.line.width,\n material: Cesium.Color.fromCssColorString(that.options.line.color),\n clampToGround: !ground ? false : true,\n arcType: !ground ? Cesium.ArcType.NONE : Cesium.ArcType.GEODESIC,\n zIndex: that.sdk._entityZIndex\n }\n });\n that.sdk._entityZIndex++;\n PincerArrowObject.createLabel(that);\n var pos84 = [];\n for (var _i27 = 0; _i27 < positionsA.length; _i27++) {\n pos84.push(that.cartesian3Towgs84(positionsA[_i27], that.sdk.viewer));\n }\n that.areaByMeter = that.computeArea(pos84);\n that.areaChangeCallBack && that.areaChangeCallBack();\n Object(_Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_17__[\"syncData\"])(that.sdk, that.options.id);\n if (that.options.show) {\n Object(_Global_SplitScreen__WEBPACK_IMPORTED_MODULE_20__[\"setSplitDirection\"])(0, that.options.id);\n }\n that.spreadState = that.options.spreadState;\n }\n }, {\n key: \"createLabel\",\n value: function () {\n var _createLabel = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee7(that) {\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee7$(_context7) {\n while (1) switch (_context7.prev = _context7.next) {\n case 0:\n // 标签\n that.label = new _LabelObject__WEBPACK_IMPORTED_MODULE_14__[\"default\"](that.sdk, {\n id: that.options.id,\n show: that.options.show ? that.options.label.show : false,\n position: [that.options.label.position.lng, that.options.label.position.lat, that.options.label.position.alt],\n text: that.options.name,\n fontSize: that.options.label.fontSize,\n fontFamily: that.options.label.fontFamily,\n color: that.options.label.color,\n pixelOffset: that.options.label.pixelOffset,\n backgroundColor: that.options.label.backgroundColor,\n lineColor: that.options.label.lineColor,\n lineWidth: that.options.label.lineWidth,\n scaleByDistance: that.options.label.scaleByDistance,\n near: that.options.label.near,\n far: that.options.label.far\n // ground: that.options.label.ground,\n });\n case 1:\n case \"end\":\n return _context7.stop();\n }\n }, _callee7);\n }));\n function createLabel(_x5) {\n return _createLabel.apply(this, arguments);\n }\n return createLabel;\n }()\n }]);\n}(_index__WEBPACK_IMPORTED_MODULE_13__[\"default\"]);\n/* harmony default export */ __webpack_exports__[\"default\"] = (PincerArrowObject);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvT2JqL0Jhc2UvUGluY2VyQXJyb3dPYmplY3QvaW5kZXguanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvT2JqL0Jhc2UvUGluY2VyQXJyb3dPYmplY3QvaW5kZXguanM/MTYxMyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICog5Y+M566t5aS0XHJcbiAqL1xyXG5pbXBvcnQgRGlhbG9nIGZyb20gJy4uLy4uL0VsZW1lbnQvRGlhbG9nJztcclxuaW1wb3J0IGN5X3RhYnMgZnJvbSBcIi4uLy4uL0VsZW1lbnQvY3lfaHRtbF90YWJzXCI7XHJcbmltcG9ydCByaWNoVGV4dCBmcm9tIFwiLi4vLi4vRWxlbWVudC9yaWNoVGV4dFwiO1xyXG5pbXBvcnQgeyBodG1sIH0gZnJvbSBcIi4vX2VsZW1lbnRcIjtcclxuaW1wb3J0IEJhc2UgZnJvbSBcIi4uL2luZGV4XCI7XHJcbmltcG9ydCBMYWJlbE9iamVjdCBmcm9tICcuLi9MYWJlbE9iamVjdCdcclxuaW1wb3J0IE1vdXNlRXZlbnQgZnJvbSAnLi4vLi4vLi4vRXZlbnQvaW5kZXgnXHJcbmltcG9ydCBNb3VzZVRpcCBmcm9tICcuLi8uLi8uLi9Nb3VzZVRpcCdcclxuaW1wb3J0IHsgc3luY0RhdGEgfSBmcm9tICcuLi8uLi8uLi9HbG9iYWwvTXVsdGlWaWV3cG9ydE1vZGUnXHJcbmltcG9ydCB7IGxlZ3AgfSBmcm9tICcuLi8uLi9FbGVtZW50L2RhdGFsaXN0JztcclxuaW1wb3J0IHsgZ2V0Rm9udExpc3QsIGdldEZvbnRGYW1pbHlOYW1lIH0gZnJvbSAnLi4vLi4vRWxlbWVudC9mb250U2VsZWN0J1xyXG5pbXBvcnQgeyBzZXRTcGxpdERpcmVjdGlvbiwgc3luY1NwbGl0RGF0YSwgZ2V0U2RrLCBzZXRBY3RpdmVJZCB9IGZyb20gJy4uLy4uLy4uL0dsb2JhbC9TcGxpdFNjcmVlbidcclxuaW1wb3J0IHsgc2V0QWN0aXZlVmlld2VyLCBjbG9zZVJvdGF0ZUFyb3VuZCwgY2xvc2VWaWV3Rm9sbG93IH0gZnJvbSAnLi4vLi4vLi4vR2xvYmFsL2dsb2JhbCdcclxuLy8gaW1wb3J0IEVkaXRQYXJ0aWNsZSBmcm9tIFwiLi4vLi4vTW9kZWxDb250cm9sbGVyL0VkaXRQYXJ0aWNsZVwiO1xyXG5cclxuY2xhc3MgUGluY2VyQXJyb3dPYmplY3QgZXh0ZW5kcyBCYXNlIHtcclxuICAvKipcclxuICAgKiBAY29uc3RydWN0b3JcclxuICAgKiBAcGFyYW0gc2RrIFxyXG4gICAqIEBkZXNjcmlwdGlvbiDlj4znrq3lpLRcclxuICAgKiBAcGFyYW0gb3B0aW9ucyB7b2JqZWN0fSDlsZ7mgKdcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5pZCB7c3RyaW5nfSDllK/kuIDmoIfor4ZcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5zaG93PXRydWUge2Jvb2xlYW59IOaYvuekui/pmpDol49cclxuICAgKiBAcGFyYW0gb3B0aW9ucy5uYW1lIHtzdHJpbmd9IOWQjeensFxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmNvbG9yPSdyZ2JhKDI1NSwgMCwgMCwgMC41KScge3N0cmluZ30g6aKc6ImyXHJcbiAgICogQHBhcmFtIG9wdGlvbnMuaGVpZ2h0IHtudW1iZXJ9IOmrmOW6plxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmhlaWdodE1vZGU9MntudW1iZXJ9IOmrmOW6puaooeW8j++8iDDvvJrmtbfmi5Tpq5jluqbvvJsx77ya55u45a+55Zyw6KGo77ybMu+8muS+nemZhOaooeW8j++8iVxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxpbmUge29iamVjdH0g6L655qGGXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGluZS53aWR0aD0yIHtzdHJpbmd9IOi+ueahhuWuvVxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxpbmUuY29sb3I9XCJyZ2JhKDE1NSwgMTU1LCAxMjQsIDAuODkpXCIge3N0cmluZ30g6L655qGG6aKc6ImyXHJcbiAgICogQHBhcmFtIHtBcnJheS48b2JqZWN0Pn0gb3B0aW9ucy5wb3NpdGlvbnMg5b+F5aGr77yM57uP57qs5bqm5ZKM6auY5bqm55qE5YiX6KGo77yM5YC85Lqk5pu/IFt7bG9uLGxhdCxhbHR9LC4uLl1cclxuICAgKiBAcGFyYW0gb3B0aW9ucy5wb3NpdGlvbnNbXS5sbmcge251bWJlcn0g57uP5bqmXHJcbiAgICogQHBhcmFtIG9wdGlvbnMucG9zaXRpb25zW10ubGF0IHtudW1iZXJ9IOe6rOW6plxyXG4gICAqIEBwYXJhbSBvcHRpb25zLnBvc2l0aW9uc1tdLmFsdCB7bnVtYmVyfSDpq5jluqZcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5zcHJlYWRTdGF0ZT1mYWxzZSB7Ym9vbGVhbn0g5Yqo55S7XHJcbiAgICogQHBhcmFtIG9wdGlvbnMubG9vcD1mYWxzZSB7bG9vcH0g5Yqo55S76YeN5aSNXHJcbiAgICogQHBhcmFtIG9wdGlvbnMuc3ByZWFkVGltZT0zMDAwIHtudW1iZXJ9IOWKqOeUu+aMgee7reaXtumVvyjmr6vnp5IpXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwge29iamVjdH0g5qCH562+5a+56LGhXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwudGV4dCB7c3RyaW5nfSDmoIfnrb7mlofmnKxcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5sYWJlbC5zaG93IHtzdHJpbmd9IOagh+etvuaYvumakFxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLnBvc2l0aW9uIHtzdHJpbmd9IOagh+etvuS9jee9rlxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLnBvc2l0aW9uIHtvYmplY3R9IOagh+etvuS9jee9rlxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLnBvc2l0aW9uLmxuZyB7bnVtYmVyfSDnu4/luqZcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5sYWJlbC5wb3NpdGlvbi5sYXQge251bWJlcn0g57qs5bqmXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwucG9zaXRpb24uYWx0IHtudW1iZXJ9IOmrmOW6plxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLmZvbnRTaXplPTIwIHtudW1iZXJ9IOWtl+S9k+Wkp+Wwj1xyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLmZvbnRGYW1pbHk9MCB7bnVtYmVyfSDlrZfkvZPpobkgMO+8mum7keS9k++8mzHvvJrmgJ3mupDpu5HkvZPvvJsy77ya5bqe6Zeo5q2j6YGT5qCH6aKY5L2T77ybM++8muaVsOm7keS9k1xyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLmNvbG9yPSNmZmZmZmYge3N0cmluZ30g5a2X5L2T6aKc6ImyXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwubGluZVdpZHRoPTQge251bWJlcn0g5byV57q/5a69XHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwubGluZUNvbG9yPSMwMGZmZmY4MCB7c3RyaW5nfSDlvJXnur/popzoibJcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5sYWJlbC5waXhlbE9mZnNldD0yMCB7bnVtYmVyfSDlrZfkvZPlgY/np7so5byV57q/6ZW/5bqmKVxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLmJhY2tncm91bmRDb2xvcj1bJyMwMGZmZmY4MCcsICcjMDBmZmZmODAnXSB7YXJyYXl9IOiDjOaZr+minOiJslxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLnNjYWxlQnlEaXN0YW5jZSB7Ym9vbGVhbn0g6Led56a757yp5pS+XHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwubmVhcj0yMDAwIHtudW1iZXJ9IOinhumHjue8qeaUvuacgOi/kei3neemu1xyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLmZhcj0xMDAwMDAge251bWJlcn0g6KeG6YeO57yp5pS+5pyA6L+c6Led56a7XHJcbiAgICogQHBhcmFtIG9wdGlvbnMuYXR0cmlidXRlIHtvYmplY3R9IOWxnuaAp+WGheWuuVxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmF0dHJpYnV0ZS5saW5rPXt9IHtvYmplY3R9IOmTvuaOpVxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnQ9W11dIHthcnJheX0g6ZO+5o6l5YaF5a65XHJcbiAgICogQHBhcmFtIG9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudFtdLm5hbWUge3N0cmluZ30g6ZO+5o6l5ZCN56ewXHJcbiAgICogQHBhcmFtIG9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudFtdLnVybCB7c3RyaW5nfSDpk77mjqXlnLDlnYBcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5yaWNoVGV4dENvbnRlbnQge3N0cmluZ30g5a+M5paH5pys5YaF5a65XHJcbiAgICogQHBhcmFtIG9wdGlvbnMuY3VzdG9tVmlldyB7b2JqZWN0fSDpu5jorqTop4bop5JcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5jdXN0b21WaWV3Lm9yaWVudGF0aW9uIHtvYmplY3R9IOm7mOiupOinhuinkuaWueS9jVxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmN1c3RvbVZpZXcub3JpZW50YXRpb24uaGVhZGluZyB7bnVtYmVyfSDoiKrlkJHop5JcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5jdXN0b21WaWV3Lm9yaWVudGF0aW9uLnBpdGNoIHtudW1iZXJ9IOS/r+S7sOinklxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmN1c3RvbVZpZXcub3JpZW50YXRpb24ucm9sbCB7bnVtYmVyfSDnv7vmu5rop5JcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5jdXN0b21WaWV3LnJlbGF0aXZlUG9zaXRpb24ge29iamVjdH0g6KeG6KeS55u45a+55L2N572uXHJcbiAgICogQHBhcmFtIG9wdGlvbnMuY3VzdG9tVmlldy5yZWxhdGl2ZVBvc2l0aW9uLmxuZyB7bnVtYmVyfSDnu4/luqZcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5jdXN0b21WaWV3LnJlbGF0aXZlUG9zaXRpb24ubGF0IHtudW1iZXJ9IOe6rOW6plxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmN1c3RvbVZpZXcucmVsYXRpdmVQb3NpdGlvbi5hbHQge251bWJlcn0g6auY5bqmXHJcbiAgICogKi9cclxuICBjb25zdHJ1Y3RvcihzZGssIG9wdGlvbnMgPSB7fSwgX0RpYWxvZyA9IHt9KSB7XHJcbiAgICBzdXBlcihzZGssIG9wdGlvbnMpO1xyXG4gICAgdGhpcy5vcHRpb25zLm5hbWUgPSBvcHRpb25zLm5hbWUgfHwgJ+acquWRveWQjeWvueixoSdcclxuICAgIHRoaXMub3B0aW9ucy5jb2xvciA9IG9wdGlvbnMuY29sb3IgfHwgXCIjZmYwMDAwODBcIlxyXG4gICAgdGhpcy5vcHRpb25zLnNob3cgPSAob3B0aW9ucy5zaG93IHx8IG9wdGlvbnMuc2hvdyA9PT0gZmFsc2UpID8gb3B0aW9ucy5zaG93IDogdHJ1ZVxyXG4gICAgdGhpcy5vcHRpb25zLnBvc2l0aW9ucyA9IG9wdGlvbnMucG9zaXRpb25zIHx8IFtdXHJcbiAgICB0aGlzLm9wdGlvbnMuaGVpZ2h0TW9kZSA9IChvcHRpb25zLmhlaWdodE1vZGUgfHwgb3B0aW9ucy5oZWlnaHRNb2RlID09IDApID8gb3B0aW9ucy5oZWlnaHRNb2RlIDogMlxyXG4gICAgdGhpcy5vcHRpb25zLmxpbmUgPSBvcHRpb25zLmxpbmUgfHwge31cclxuICAgIHRoaXMub3B0aW9ucy5saW5lLndpZHRoID0gKCh0aGlzLm9wdGlvbnMubGluZS53aWR0aCB8fCB0aGlzLm9wdGlvbnMubGluZS53aWR0aCA9PT0gMCkgPyB0aGlzLm9wdGlvbnMubGluZS53aWR0aCA6IDMpXHJcbiAgICB0aGlzLm9wdGlvbnMubGluZS5jb2xvciA9IHRoaXMub3B0aW9ucy5saW5lLmNvbG9yIHx8ICdyZ2JhKDI1NSwgMCwgMCwgMSknXHJcbiAgICB0aGlzLm9wdGlvbnMuaGVpZ2h0ID0gb3B0aW9ucy5oZWlnaHRcclxuICAgIHRoaXMub3B0aW9ucy5sb29wID0gb3B0aW9ucy5sb29wIHx8IGZhbHNlXHJcbiAgICB0aGlzLm9wdGlvbnMuc3ByZWFkU3RhdGUgPSBvcHRpb25zLnNwcmVhZFN0YXRlIHx8IGZhbHNlXHJcbiAgICB0aGlzLl9lbG1zID0ge307XHJcbiAgICB0aGlzLm5vZGVQb2ludHMgPSBbXVxyXG4gICAgdGhpcy5zcHJlYWRUaW1lID0gb3B0aW9ucy5zcHJlYWRUaW1lXHJcbiAgICB0aGlzLmVudGl0eVxyXG4gICAgdGhpcy5ldmVudFxyXG4gICAgdGhpcy5vcGVyYXRlID0ge31cclxuICAgIHRoaXMuRGlhbG9nID0gX0RpYWxvZ1xyXG4gICAgb3B0aW9ucy5sYWJlbCA9IG9wdGlvbnMubGFiZWwgfHwge31cclxuICAgIHRoaXMub3B0aW9ucy5sYWJlbCA9IHtcclxuICAgICAgdGV4dDogdGhpcy5vcHRpb25zLm5hbWUsXHJcbiAgICAgIHNob3c6IG9wdGlvbnMubGFiZWwuc2hvdyB8fCBmYWxzZSxcclxuICAgICAgcG9zaXRpb246IG9wdGlvbnMubGFiZWwucG9zaXRpb24sXHJcbiAgICAgIGZvbnRTaXplOiAob3B0aW9ucy5sYWJlbC5mb250U2l6ZSB8fCBvcHRpb25zLmxhYmVsLmZvbnRTaXplID09PSAwKSA/IG9wdGlvbnMubGFiZWwuZm9udFNpemUgOiAyMCxcclxuICAgICAgZm9udEZhbWlseTogb3B0aW9ucy5sYWJlbC5mb250RmFtaWx5ID8gb3B0aW9ucy5sYWJlbC5mb250RmFtaWx5IDogMCxcclxuICAgICAgY29sb3I6IG9wdGlvbnMubGFiZWwuY29sb3IgfHwgJyNmZmZmZmYnLFxyXG4gICAgICBsaW5lV2lkdGg6IChvcHRpb25zLmxhYmVsLmxpbmVXaWR0aCB8fCBvcHRpb25zLmxhYmVsLmxpbmVXaWR0aCA9PT0gMCkgPyBvcHRpb25zLmxhYmVsLmxpbmVXaWR0aCA6IDQsXHJcbiAgICAgIHBpeGVsT2Zmc2V0OiAob3B0aW9ucy5sYWJlbC5waXhlbE9mZnNldCB8fCBvcHRpb25zLmxhYmVsLnBpeGVsT2Zmc2V0ID09PSAwKSA/IG9wdGlvbnMubGFiZWwucGl4ZWxPZmZzZXQgOiAyMCxcclxuICAgICAgYmFja2dyb3VuZENvbG9yOiBvcHRpb25zLmxhYmVsLmJhY2tncm91bmRDb2xvciB8fCBbJyMwMGZmZmY4MCcsICcjMDBmZmZmODAnXSxcclxuICAgICAgbGluZUNvbG9yOiBvcHRpb25zLmxhYmVsLmxpbmVDb2xvciB8fCAnIzAwZmZmZjgwJyxcclxuICAgICAgc2NhbGVCeURpc3RhbmNlOiBvcHRpb25zLmxhYmVsLnNjYWxlQnlEaXN0YW5jZSB8fCBmYWxzZSxcclxuICAgICAgbmVhcjogKG9wdGlvbnMubGFiZWwubmVhciB8fCBvcHRpb25zLmxhYmVsLm5lYXIgPT09IDApID8gb3B0aW9ucy5sYWJlbC5uZWFyIDogMjAwMCxcclxuICAgICAgZmFyOiAob3B0aW9ucy5sYWJlbC5mYXIgfHwgb3B0aW9ucy5sYWJlbC5mYXIgPT09IDApID8gb3B0aW9ucy5sYWJlbC5mYXIgOiAxMDAwMDAsXHJcbiAgICB9XHJcbiAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlID0gb3B0aW9ucy5hdHRyaWJ1dGUgfHwge31cclxuICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluayA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluayB8fCB7fVxyXG4gICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnQgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudCB8fCBbXVxyXG5cclxuICAgIGRlbGV0ZSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmNhbWVyYVxyXG4gICAgZGVsZXRlIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnJcclxuICAgIGRlbGV0ZSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmdvb2RzXHJcblxyXG4gICAgaWYgKCF0aGlzLm9wdGlvbnMucG9zaXRpb25zIHx8IHRoaXMub3B0aW9ucy5wb3NpdGlvbnMubGVuZ3RoIDwgNSkge1xyXG4gICAgICB0aGlzLl9lcnJvciA9ICflj4znrq3lpLTmnIDlsJHpnIDopoHkupTkuKrlnZDmoIfvvIEnXHJcbiAgICAgIGNvbnNvbGUud2Fybih0aGlzLl9lcnJvcilcclxuICAgICAgd2luZG93LkVMRU1FTlQgJiYgd2luZG93LkVMRU1FTlQuTWVzc2FnZSh7XHJcbiAgICAgICAgbWVzc2FnZTogdGhpcy5fZXJyb3IsXHJcbiAgICAgICAgdHlwZTogJ3dhcm5pbmcnLFxyXG4gICAgICAgIGR1cmF0aW9uOiAxNTAwXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmICghdGhpcy5vcHRpb25zLmhlaWdodCAmJiB0aGlzLm9wdGlvbnMuaGVpZ2h0ICE9PSAwKSB7XHJcbiAgICAgICAgbGV0IGhlaWdodCA9IHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0uYWx0XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCB0aGlzLm9wdGlvbnMucG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBpZiAoaGVpZ2h0IDwgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5hbHQpIHtcclxuICAgICAgICAgICAgaGVpZ2h0ID0gdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5hbHRcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5vcHRpb25zLmhlaWdodCA9IGhlaWdodFxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuc2RrLmFkZEluY2V0YW5jZSh0aGlzLm9wdGlvbnMuaWQsIHRoaXMpXHJcbiAgICAgIFBpbmNlckFycm93T2JqZWN0LmNyZWF0ZSh0aGlzKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IHR5cGUoKSB7XHJcbiAgICByZXR1cm4gJ1BpbmNlckFycm93T2JqZWN0J1xyXG4gIH1cclxuXHJcbiAgZ2V0IG5hbWUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLm5hbWVcclxuICB9XHJcbiAgc2V0IG5hbWUodikge1xyXG4gICAgdGhpcy5vcHRpb25zLm5hbWUgPSB2XHJcbiAgICB0aGlzLmxhYmVsLnRleHQgPSB2XHJcbiAgICB0aGlzLl9lbG1zLm5hbWUgJiYgdGhpcy5fZWxtcy5uYW1lLmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgaXRlbS52YWx1ZSA9IHZcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBnZXQgY29sb3IoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmNvbG9yXHJcbiAgfVxyXG4gIHNldCBjb2xvcih2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMuY29sb3IgPSB2IHx8ICdyZ2JhKDI1NSwgMCwgMCwgMC41KSdcclxuICAgIGlmICghdGhpcy5zZGsgfHwgIXRoaXMuc2RrLnZpZXdlciB8fCAhdGhpcy5lbnRpdHkgfHwgIXRoaXMuZW50aXR5LnBvbHlnb24pIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcbiAgICBsZXQgbWF0ZXJpYWwgPSBDZXNpdW0uQ29sb3IuZnJvbUNzc0NvbG9yU3RyaW5nKHRoaXMub3B0aW9ucy5jb2xvcilcclxuICAgIGlmICh0aGlzLnNkay52aWV3ZXIuc2NlbmUubW9kZSA9PT0gMikge1xyXG4gICAgICBtYXRlcmlhbCA9IG5ldyBDZXNpdW0uQ3VzdG9tQ29sb3JNYXRlcmlhbFNvdXJjZSh7XHJcbiAgICAgICAgY29sb3I6IHRoaXMub3B0aW9ucy5jb2xvclxyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gICAgdGhpcy5lbnRpdHkucG9seWdvbi5tYXRlcmlhbCA9IG1hdGVyaWFsXHJcbiAgICBpZiAodGhpcy5fZWxtcy5jb2xvcikge1xyXG4gICAgICB0aGlzLl9lbG1zLmNvbG9yLmZvckVhY2goKGl0ZW0sIGkpID0+IHtcclxuICAgICAgICBsZXQgY29sb3JQaWNrZXIgPSBuZXcgWUpDb2xvclBpY2tlcih7XHJcbiAgICAgICAgICBlbDogaXRlbS5lbCxcclxuICAgICAgICAgIHNpemU6ICdtaW5pJywvL+minOiJsmJveOexu+Wei1xyXG4gICAgICAgICAgYWxwaGE6IHRydWUsLy/mmK/lkKblvIDlkK/pgI/mmI7luqZcclxuICAgICAgICAgIGRlZmF1bHRDb2xvcjogdGhpcy5vcHRpb25zLmNvbG9yLFxyXG4gICAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLC8v5piv5ZCm56aB5q2i5omT5byA6aKc6Imy6YCJ5oup5ZmoXHJcbiAgICAgICAgICBvcGVuUGlja2VyQW5pOiAnb3BhY2l0eScsLy/miZPlvIDpopzoibLpgInmi6nlmajliqjnlLtcclxuICAgICAgICAgIHN1cmU6IChjKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuY29sb3IgPSBjXHJcbiAgICAgICAgICB9LC8v54K55Ye756Gu6K6k5oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgICAgICBjbGVhcjogKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmNvbG9yID0gJ3JnYmEoMjU1LDAsMCwwLjUpJ1xyXG4gICAgICAgICAgfSwvL+eCueWHu+a4heepuuaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgdGhpcy5fZWxtcy5jb2xvcltpXSA9IGNvbG9yUGlja2VyXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgaGVpZ2h0TW9kZSgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuaGVpZ2h0TW9kZSA/IHRoaXMub3B0aW9ucy5oZWlnaHRNb2RlIDogMFxyXG4gIH1cclxuICBzZXQgaGVpZ2h0TW9kZSh2KSB7XHJcbiAgICB0aGlzLmVudGl0eS5wb2x5Z29uLmhpZXJhcmNoeSA9IFtdXHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5vcHRpb25zLmhlaWdodE1vZGUgPSAodiB8fCB2ID09IDApID8gdiA6IDJcclxuICAgICAgdGhpcy5wb3NpdGlvbkVkaXRpbmcgPSBmYWxzZVxyXG4gICAgICBpZiAoIXRoaXMuZW50aXR5KSB7XHJcbiAgICAgICAgcmV0dXJuXHJcbiAgICAgIH1cclxuICAgICAgbGV0IGhlaWdodE1vZGVOYW1lID0gJydcclxuICAgICAgdGhpcy5jbG9zZU5vZGVFZGl0KClcclxuICAgICAgbGV0IGdyb3VuZCA9IGZhbHNlXHJcbiAgICAgIGxldCBkaXNhYmxlZCA9IGZhbHNlXHJcbiAgICAgIHRoaXMucmVuZXdQb3NpdGlvbnMoKVxyXG4gICAgICB0aGlzLmVudGl0eS5wb2x5bGluZS5wb3NpdGlvbnMgPSBbXHJcbiAgICAgICAgLi4udGhpcy5wb3NpdGlvbnNILFxyXG4gICAgICAgIHRoaXMucG9zaXRpb25zSFswXSxcclxuICAgICAgICB0aGlzLnBvc2l0aW9uc0hbMV1cclxuICAgICAgXVxyXG4gICAgICB0aGlzLmVudGl0eS5wb2x5Z29uLmhpZXJhcmNoeSA9IG5ldyBDZXNpdW0uUG9seWdvbkhpZXJhcmNoeShcclxuICAgICAgICB0aGlzLnBvc2l0aW9uc0hcclxuICAgICAgKVxyXG4gICAgICBzd2l0Y2ggKHRoaXMub3B0aW9ucy5oZWlnaHRNb2RlKSB7XHJcbiAgICAgICAgY2FzZSAnMCc6XHJcbiAgICAgICAgY2FzZSAwOlxyXG4gICAgICAgICAgaGVpZ2h0TW9kZU5hbWUgPSAn5rW35ouU6auY5bqmJ1xyXG4gICAgICAgICAgYnJlYWtcclxuICAgICAgICBjYXNlICcxJzpcclxuICAgICAgICBjYXNlIDE6XHJcbiAgICAgICAgICBoZWlnaHRNb2RlTmFtZSA9ICfnm7jlr7nlnLDooagnXHJcbiAgICAgICAgICBicmVha1xyXG4gICAgICAgIGNhc2UgJzInOlxyXG4gICAgICAgIGNhc2UgMjpcclxuICAgICAgICAgIGdyb3VuZCA9IHRydWVcclxuICAgICAgICAgIGRpc2FibGVkID0gdHJ1ZVxyXG4gICAgICAgICAgaGVpZ2h0TW9kZU5hbWUgPSAn5L6d6ZmE5qih5Z6LJ1xyXG4gICAgICAgICAgYnJlYWtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmxhYmVsLmdyb3VuZCA9IGdyb3VuZFxyXG4gICAgICB0aGlzLmVudGl0eS5wb2x5bGluZS5jbGFtcFRvR3JvdW5kID0gZ3JvdW5kXHJcbiAgICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLmFyY1R5cGUgPSAhZ3JvdW5kID8gQ2VzaXVtLkFyY1R5cGUuTk9ORSA6IENlc2l1bS5BcmNUeXBlLkdFT0RFU0lDLFxyXG4gICAgICAgIHRoaXMuZW50aXR5LnBvbHlnb24ucGVyUG9zaXRpb25IZWlnaHQgPSAhZ3JvdW5kID8gdHJ1ZSA6IGZhbHNlXHJcbiAgICAgIHRoaXMuX2VsbXMuaGVpZ2h0TW9kZSAmJiAodGhpcy5fZWxtcy5oZWlnaHRNb2RlLnZhbHVlID0gaGVpZ2h0TW9kZU5hbWUpXHJcbiAgICAgIHRoaXMuX2VsbXMuaGVpZ2h0TW9kZU9iamVjdCAmJiAodGhpcy5fZWxtcy5oZWlnaHRNb2RlT2JqZWN0LmxlZ3Bfc2VhcmNoQWN0aXZlKFxyXG4gICAgICAgIGhlaWdodE1vZGVOYW1lXHJcbiAgICAgICkpXHJcbiAgICAgIGlmIChkaXNhYmxlZCkge1xyXG4gICAgICAgIHRoaXMuX2VsbXMuaGVpZ2h0Qm94ICYmICh0aGlzLl9lbG1zLmhlaWdodEJveC5jbGFzc05hbWUgPSAnaW5wdXQtbnVtYmVyIGlucHV0LW51bWJlci11bml0LTEgaGVpZ2h0LWJveCBkaXNhYmxlZCcpO1xyXG4gICAgICAgIHRoaXMuX2VsbXMuaGVpZ2h0Q29uZmlybSAmJiB0aGlzLl9lbG1zLmhlaWdodENvbmZpcm0uc2V0QXR0cmlidXRlKCdkaXNhYmxlZCcsICdkaXNhYmxlZCcpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRoaXMuX2VsbXMuaGVpZ2h0Qm94ICYmICh0aGlzLl9lbG1zLmhlaWdodEJveC5jbGFzc05hbWUgPSAnaW5wdXQtbnVtYmVyIGlucHV0LW51bWJlci11bml0LTEgaGVpZ2h0LWJveCcpO1xyXG4gICAgICAgIHRoaXMuX2VsbXMuaGVpZ2h0Q29uZmlybSAmJiB0aGlzLl9lbG1zLmhlaWdodENvbmZpcm0ucmVtb3ZlQXR0cmlidXRlKCdkaXNhYmxlZCcpO1xyXG4gICAgICB9XHJcbiAgICB9LCA1MCk7XHJcbiAgfVxyXG5cclxuICBnZXQgaGVpZ2h0KCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5oZWlnaHRcclxuICB9XHJcblxyXG4gIHNldCBoZWlnaHQodikge1xyXG4gICAgaWYgKCF2IHx8IGlzTmFOKE51bWJlcih2KSkpIHtcclxuICAgICAgdGhpcy5vcHRpb25zLmhlaWdodCA9IDBcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLm9wdGlvbnMuaGVpZ2h0ID0gTnVtYmVyKE51bWJlcih2KS50b0ZpeGVkKDIpKVxyXG4gICAgfVxyXG4gICAgbGV0IGdyb3VuZFxyXG4gICAgaWYgKHRoaXMuaGVpZ2h0TW9kZSA9PSAyKSB7XHJcbiAgICAgIGdyb3VuZCA9IHRydWVcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGdyb3VuZCA9IGZhbHNlXHJcbiAgICB9XHJcbiAgICB0aGlzLnJlbmV3UG9zaXRpb25zKClcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLmVudGl0eS5wb2x5Z29uLmhpZXJhcmNoeSA9IG5ldyBDZXNpdW0uUG9seWdvbkhpZXJhcmNoeSh0aGlzLnBvc2l0aW9uc0gpXHJcbiAgICAgIHRoaXMuZW50aXR5LnBvbHlnb24ucGVyUG9zaXRpb25IZWlnaHQgPSAhZ3JvdW5kID8gdHJ1ZSA6IGZhbHNlXHJcbiAgICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLnBvc2l0aW9ucyA9IFtcclxuICAgICAgICAuLi50aGlzLnBvc2l0aW9uc0gsXHJcbiAgICAgICAgdGhpcy5wb3NpdGlvbnNIWzBdLFxyXG4gICAgICAgIHRoaXMucG9zaXRpb25zSFsxXVxyXG4gICAgICBdXHJcbiAgICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLmNsYW1wVG9Hcm91bmQgPSAhZ3JvdW5kID8gZmFsc2UgOiB0cnVlXHJcbiAgICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLmFyY1R5cGUgPSAhZ3JvdW5kID8gQ2VzaXVtLkFyY1R5cGUuTk9ORSA6IENlc2l1bS5BcmNUeXBlLkdFT0RFU0lDXHJcbiAgICB9LCAwKTtcclxuXHJcbiAgICB0aGlzLl9lbG1zLmFsdCAmJlxyXG4gICAgICB0aGlzLl9lbG1zLmFsdC5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgIGl0ZW0uaW5uZXJIVE1MID0gdGhpcy5vcHRpb25zLmhlaWdodFxyXG4gICAgICB9KVxyXG4gIH1cclxuXHJcbiAgZ2V0IGxpbmVDb2xvcigpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubGluZS5jb2xvclxyXG4gIH1cclxuICBzZXQgbGluZUNvbG9yKHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5saW5lLmNvbG9yID0gdiB8fCAncmdiYSgyNTUsIDAsIDAsIDAuNSknXHJcbiAgICBpZiAoIXRoaXMuc2RrIHx8ICF0aGlzLnNkay52aWV3ZXIgfHwgIXRoaXMuZW50aXR5IHx8ICF0aGlzLmVudGl0eS5wb2x5bGluZSkge1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLm1hdGVyaWFsID0gQ2VzaXVtLkNvbG9yLmZyb21Dc3NDb2xvclN0cmluZyh0aGlzLm9wdGlvbnMubGluZS5jb2xvcilcclxuICAgIGlmICh0aGlzLl9lbG1zLmxpbmVDb2xvcikge1xyXG4gICAgICB0aGlzLl9lbG1zLmxpbmVDb2xvci5mb3JFYWNoKChpdGVtLCBpKSA9PiB7XHJcbiAgICAgICAgbGV0IGxpbmVDb2xvclBpY2tlciA9IG5ldyBZSkNvbG9yUGlja2VyKHtcclxuICAgICAgICAgIGVsOiBpdGVtLmVsLFxyXG4gICAgICAgICAgc2l6ZTogJ21pbmknLC8v6aKc6ImyYm9457G75Z6LXHJcbiAgICAgICAgICBhbHBoYTogdHJ1ZSwvL+aYr+WQpuW8gOWQr+mAj+aYjuW6plxyXG4gICAgICAgICAgZGVmYXVsdENvbG9yOiB0aGlzLm9wdGlvbnMubGluZS5jb2xvcixcclxuICAgICAgICAgIGRpc2FibGVkOiBmYWxzZSwvL+aYr+WQpuemgeatouaJk+W8gOminOiJsumAieaLqeWZqFxyXG4gICAgICAgICAgb3BlblBpY2tlckFuaTogJ29wYWNpdHknLC8v5omT5byA6aKc6Imy6YCJ5oup5Zmo5Yqo55S7XHJcbiAgICAgICAgICBzdXJlOiAoYykgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxpbmVDb2xvciA9IGNcclxuICAgICAgICAgIH0sLy/ngrnlh7vnoa7orqTmjInpkq7kuovku7blm57osINcclxuICAgICAgICAgIGNsZWFyOiAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubGluZUNvbG9yID0gJ3JnYmEoMjU1LDAsMCwwLjUpJ1xyXG4gICAgICAgICAgfSwvL+eCueWHu+a4heepuuaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgdGhpcy5fZWxtcy5saW5lQ29sb3JbaV0gPSBsaW5lQ29sb3JQaWNrZXJcclxuICAgICAgfSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCBsaW5lV2lkdGgoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmxpbmUud2lkdGhcclxuICB9XHJcbiAgc2V0IGxpbmVXaWR0aCh2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMubGluZS53aWR0aCA9ICgodiB8fCB2ID09PSAwKSA/IHYgOiAzKVxyXG4gICAgdGhpcy5lbnRpdHkucG9seWxpbmUud2lkdGggPSB0aGlzLm9wdGlvbnMubGluZS53aWR0aFxyXG4gICAgdGhpcy5fZWxtcy5saW5lV2lkdGggJiYgdGhpcy5fZWxtcy5saW5lV2lkdGguZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICBpdGVtLnZhbHVlID0gdGhpcy5vcHRpb25zLmxpbmUud2lkdGhcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBnZXQgbGFiZWxTaG93KCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5sYWJlbC5zaG93XHJcbiAgfVxyXG4gIHNldCBsYWJlbFNob3codikge1xyXG4gICAgdGhpcy5vcHRpb25zLmxhYmVsLnNob3cgPSB2XHJcbiAgICBpZiAodGhpcy5zaG93ICYmICF0aGlzLnNob3dWaWV3IHx8IHRoaXMuc2hvd1ZpZXcgPT0gMykge1xyXG4gICAgICB0aGlzLmxhYmVsLnNob3cgPSB2XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5sYWJlbC5zaG93ID0gZmFsc2VcclxuICAgIH1cclxuICAgIHRoaXMuX2VsbXMubGFiZWxTaG93ICYmIHRoaXMuX2VsbXMubGFiZWxTaG93LmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgaXRlbS5jaGVja2VkID0gdlxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGdldCBsYWJlbEZvbnRGYW1pbHkoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmxhYmVsLmZvbnRGYW1pbHlcclxuICB9XHJcblxyXG4gIHNldCBsYWJlbEZvbnRGYW1pbHkodikge1xyXG4gICAgdGhpcy5vcHRpb25zLmxhYmVsLmZvbnRGYW1pbHkgPSB2IHx8IDBcclxuICAgIHRoaXMubGFiZWwgJiYgKHRoaXMubGFiZWwuZm9udEZhbWlseSA9IHRoaXMub3B0aW9ucy5sYWJlbC5mb250RmFtaWx5KVxyXG5cclxuICAgIGxldCBuYW1lID0gZ2V0Rm9udEZhbWlseU5hbWUodGhpcy5sYWJlbEZvbnRGYW1pbHkpIHx8ICcnXHJcbiAgICB0aGlzLl9lbG1zLmxhYmVsRm9udEZhbWlseSAmJlxyXG4gICAgICB0aGlzLl9lbG1zLmxhYmVsRm9udEZhbWlseS5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgIGl0ZW0udmFsdWUgPSBuYW1lXHJcbiAgICAgIH0pXHJcbiAgfVxyXG5cclxuICBnZXQgbGFiZWxDb2xvcigpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubGFiZWwuY29sb3JcclxuICB9XHJcbiAgc2V0IGxhYmVsQ29sb3Iodikge1xyXG4gICAgdGhpcy5vcHRpb25zLmxhYmVsLmNvbG9yID0gdlxyXG4gICAgdGhpcy5sYWJlbC5jb2xvciA9IHZcclxuICAgIGlmICh0aGlzLl9lbG1zLmxhYmVsQ29sb3IpIHtcclxuICAgICAgdGhpcy5fZWxtcy5sYWJlbENvbG9yLmZvckVhY2goKGl0ZW0sIGkpID0+IHtcclxuICAgICAgICBsZXQgbGFiZWxDb2xvclBpY2tlciA9IG5ldyBZSkNvbG9yUGlja2VyKHtcclxuICAgICAgICAgIGVsOiBpdGVtLmVsLFxyXG4gICAgICAgICAgc2l6ZTogJ21pbmknLC8v6aKc6ImyYm9457G75Z6LXHJcbiAgICAgICAgICBhbHBoYTogdHJ1ZSwvL+aYr+WQpuW8gOWQr+mAj+aYjuW6plxyXG4gICAgICAgICAgZGVmYXVsdENvbG9yOiB0aGlzLmxhYmVsQ29sb3IsXHJcbiAgICAgICAgICBkaXNhYmxlZDogZmFsc2UsLy/mmK/lkKbnpoHmraLmiZPlvIDpopzoibLpgInmi6nlmahcclxuICAgICAgICAgIG9wZW5QaWNrZXJBbmk6ICdvcGFjaXR5JywvL+aJk+W8gOminOiJsumAieaLqeWZqOWKqOeUu1xyXG4gICAgICAgICAgc3VyZTogKGNvbG9yKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubGFiZWxDb2xvciA9IGNvbG9yXHJcbiAgICAgICAgICB9LC8v54K55Ye756Gu6K6k5oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgICAgICBjbGVhcjogKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxhYmVsQ29sb3IgPSAncmdiYSgyNTUsMjU1LDI1NSwxKSdcclxuICAgICAgICAgIH0sLy/ngrnlh7vmuIXnqbrmjInpkq7kuovku7blm57osINcclxuICAgICAgICB9KVxyXG4gICAgICAgIHRoaXMuX2VsbXMubGFiZWxDb2xvcltpXSA9IGxhYmVsQ29sb3JQaWNrZXJcclxuICAgICAgfSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCBsYWJlbEZvbnRTaXplKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5sYWJlbC5mb250U2l6ZVxyXG4gIH1cclxuICBzZXQgbGFiZWxGb250U2l6ZSh2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMubGFiZWwuZm9udFNpemUgPSB2XHJcbiAgICB0aGlzLmxhYmVsLmZvbnRTaXplID0gdlxyXG4gICAgdGhpcy5fZWxtcy5sYWJlbEZvbnRTaXplICYmIHRoaXMuX2VsbXMubGFiZWxGb250U2l6ZS5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgIGl0ZW0udmFsdWUgPSB2XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgZ2V0IGxhYmVsU2NhbGVCeURpc3RhbmNlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5sYWJlbC5zY2FsZUJ5RGlzdGFuY2VcclxuICB9XHJcbiAgc2V0IGxhYmVsU2NhbGVCeURpc3RhbmNlKHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5sYWJlbC5zY2FsZUJ5RGlzdGFuY2UgPSB2XHJcbiAgICB0aGlzLmxhYmVsLnNjYWxlQnlEaXN0YW5jZSA9IHZcclxuICAgIHRoaXMuX2VsbXMubGFiZWxTY2FsZUJ5RGlzdGFuY2UgJiYgdGhpcy5fZWxtcy5sYWJlbFNjYWxlQnlEaXN0YW5jZS5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgIGl0ZW0uY2hlY2tlZCA9IHZcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBnZXQgbGFiZWxOZWFyKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5sYWJlbC5uZWFyXHJcbiAgfVxyXG4gIHNldCBsYWJlbE5lYXIodikge1xyXG4gICAgbGV0IG5lYXIgPSB2XHJcbiAgICBpZiAobmVhciA+IHRoaXMubGFiZWxGYXIpIHtcclxuICAgICAgbmVhciA9IHRoaXMubGFiZWxGYXJcclxuICAgIH1cclxuICAgIHRoaXMub3B0aW9ucy5sYWJlbC5uZWFyID0gbmVhclxyXG4gICAgdGhpcy5sYWJlbC5uZWFyID0gbmVhclxyXG4gICAgdGhpcy5fZWxtcy5sYWJlbE5lYXIgJiYgdGhpcy5fZWxtcy5sYWJlbE5lYXIuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICBpdGVtLnZhbHVlID0gbmVhclxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGdldCBsYWJlbEZhcigpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubGFiZWwuZmFyXHJcbiAgfVxyXG4gIHNldCBsYWJlbEZhcih2KSB7XHJcbiAgICBsZXQgZmFyID0gdlxyXG4gICAgaWYgKGZhciA8IHRoaXMubGFiZWxOZWFyKSB7XHJcbiAgICAgIGZhciA9IHRoaXMubGFiZWxOZWFyXHJcbiAgICB9XHJcbiAgICB0aGlzLm9wdGlvbnMubGFiZWwuZmFyID0gZmFyXHJcbiAgICB0aGlzLmxhYmVsLmZhciA9IGZhclxyXG4gICAgdGhpcy5fZWxtcy5sYWJlbEZhciAmJiB0aGlzLl9lbG1zLmxhYmVsRmFyLmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgaXRlbS52YWx1ZSA9IGZhclxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGdldCBsYWJlbExpbmVXaWR0aCgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubGFiZWwubGluZVdpZHRoXHJcbiAgfVxyXG4gIHNldCBsYWJlbExpbmVXaWR0aCh2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMubGFiZWwubGluZVdpZHRoID0gdlxyXG4gICAgdGhpcy5sYWJlbC5saW5lV2lkdGggPSB2XHJcbiAgICB0aGlzLl9lbG1zLmxhYmVsTGluZVdpZHRoICYmIHRoaXMuX2VsbXMubGFiZWxMaW5lV2lkdGguZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICBpdGVtLnZhbHVlID0gdlxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGdldCBsYWJlbFBpeGVsT2Zmc2V0KCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5sYWJlbC5waXhlbE9mZnNldFxyXG4gIH1cclxuICBzZXQgbGFiZWxQaXhlbE9mZnNldCh2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMubGFiZWwucGl4ZWxPZmZzZXQgPSB2XHJcbiAgICB0aGlzLmxhYmVsLnBpeGVsT2Zmc2V0ID0gdlxyXG4gICAgdGhpcy5fZWxtcy5sYWJlbFBpeGVsT2Zmc2V0ICYmIHRoaXMuX2VsbXMubGFiZWxQaXhlbE9mZnNldC5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgIGl0ZW0udmFsdWUgPSB2XHJcbiAgICB9KVxyXG4gIH1cclxuICBnZXQgbGFiZWxMaW5lQ29sb3IoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmxhYmVsLmxpbmVDb2xvclxyXG4gIH1cclxuICBzZXQgbGFiZWxMaW5lQ29sb3Iodikge1xyXG4gICAgdGhpcy5vcHRpb25zLmxhYmVsLmxpbmVDb2xvciA9IHZcclxuICAgIHRoaXMubGFiZWwubGluZUNvbG9yID0gdlxyXG4gICAgaWYgKHRoaXMuX2VsbXMubGFiZWxMaW5lQ29sb3IpIHtcclxuICAgICAgdGhpcy5fZWxtcy5sYWJlbExpbmVDb2xvci5mb3JFYWNoKChpdGVtLCBpKSA9PiB7XHJcbiAgICAgICAgbGV0IGxpbmVDb2xvclBpY2tlciA9IG5ldyBZSkNvbG9yUGlja2VyKHtcclxuICAgICAgICAgIGVsOiBpdGVtLmVsLFxyXG4gICAgICAgICAgc2l6ZTogJ21pbmknLC8v6aKc6ImyYm9457G75Z6LXHJcbiAgICAgICAgICBhbHBoYTogdHJ1ZSwvL+aYr+WQpuW8gOWQr+mAj+aYjuW6plxyXG4gICAgICAgICAgZGVmYXVsdENvbG9yOiB0aGlzLmxhYmVsTGluZUNvbG9yLFxyXG4gICAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLC8v5piv5ZCm56aB5q2i5omT5byA6aKc6Imy6YCJ5oup5ZmoXHJcbiAgICAgICAgICBvcGVuUGlja2VyQW5pOiAnb3BhY2l0eScsLy/miZPlvIDpopzoibLpgInmi6nlmajliqjnlLtcclxuICAgICAgICAgIHN1cmU6IChjb2xvcikgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxhYmVsTGluZUNvbG9yID0gY29sb3JcclxuICAgICAgICAgIH0sLy/ngrnlh7vnoa7orqTmjInpkq7kuovku7blm57osINcclxuICAgICAgICAgIGNsZWFyOiAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubGFiZWxMaW5lQ29sb3IgPSAncmdiYSgwLDI1NSwyNTUsMC41KSdcclxuICAgICAgICAgIH0sLy/ngrnlh7vmuIXnqbrmjInpkq7kuovku7blm57osINcclxuICAgICAgICB9KVxyXG4gICAgICAgIHRoaXMuX2VsbXMubGFiZWxMaW5lQ29sb3JbaV0gPSBsaW5lQ29sb3JQaWNrZXJcclxuICAgICAgfSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCBsYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0KCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5sYWJlbC5iYWNrZ3JvdW5kQ29sb3JbMF1cclxuICB9XHJcbiAgc2V0IGxhYmVsQmFja2dyb3VuZENvbG9yU3RhcnQodikge1xyXG4gICAgdGhpcy5vcHRpb25zLmxhYmVsLmJhY2tncm91bmRDb2xvclswXSA9IHZcclxuICAgIHRoaXMubGFiZWwuYmFja2dyb3VuZENvbG9yID0gW3YsIHRoaXMubGFiZWwuYmFja2dyb3VuZENvbG9yWzFdXVxyXG4gICAgaWYgKHRoaXMuX2VsbXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JTdGFydCkge1xyXG4gICAgICB0aGlzLl9lbG1zLmxhYmVsQmFja2dyb3VuZENvbG9yU3RhcnQuZm9yRWFjaCgoaXRlbSwgaSkgPT4ge1xyXG4gICAgICAgIGxldCBsYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0UGlja2VyID0gbmV3IFlKQ29sb3JQaWNrZXIoe1xyXG4gICAgICAgICAgZWw6IGl0ZW0uZWwsXHJcbiAgICAgICAgICBzaXplOiAnbWluaScsLy/popzoibJib3jnsbvlnotcclxuICAgICAgICAgIGFscGhhOiB0cnVlLC8v5piv5ZCm5byA5ZCv6YCP5piO5bqmXHJcbiAgICAgICAgICBkZWZhdWx0Q29sb3I6IHRoaXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JTdGFydCxcclxuICAgICAgICAgIGRpc2FibGVkOiBmYWxzZSwvL+aYr+WQpuemgeatouaJk+W8gOminOiJsumAieaLqeWZqFxyXG4gICAgICAgICAgb3BlblBpY2tlckFuaTogJ29wYWNpdHknLC8v5omT5byA6aKc6Imy6YCJ5oup5Zmo5Yqo55S7XHJcbiAgICAgICAgICBzdXJlOiAoY29sb3IpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5sYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0ID0gY29sb3JcclxuICAgICAgICAgIH0sLy/ngrnlh7vnoa7orqTmjInpkq7kuovku7blm57osINcclxuICAgICAgICAgIGNsZWFyOiAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JTdGFydCA9ICdyZ2JhKDI1NSwyNTUsMjU1LDEpJ1xyXG4gICAgICAgICAgfSwvL+eCueWHu+a4heepuuaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgdGhpcy5fZWxtcy5sYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0W2ldID0gbGFiZWxCYWNrZ3JvdW5kQ29sb3JTdGFydFBpY2tlclxyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gIH1cclxuICBnZXQgbGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmxhYmVsLmJhY2tncm91bmRDb2xvclsxXVxyXG4gIH1cclxuICBzZXQgbGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmQodikge1xyXG4gICAgdGhpcy5vcHRpb25zLmxhYmVsLmJhY2tncm91bmRDb2xvclsxXSA9IHZcclxuICAgIHRoaXMubGFiZWwuYmFja2dyb3VuZENvbG9yID0gW3RoaXMubGFiZWwuYmFja2dyb3VuZENvbG9yWzBdLCB2XVxyXG4gICAgaWYgKHRoaXMuX2VsbXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmQpIHtcclxuICAgICAgdGhpcy5fZWxtcy5sYWJlbEJhY2tncm91bmRDb2xvckVuZC5mb3JFYWNoKChpdGVtLCBpKSA9PiB7XHJcbiAgICAgICAgbGV0IGxhYmVsQmFja2dyb3VuZENvbG9yRW5kUGlja2VyID0gbmV3IFlKQ29sb3JQaWNrZXIoe1xyXG4gICAgICAgICAgZWw6IGl0ZW0uZWwsXHJcbiAgICAgICAgICBzaXplOiAnbWluaScsLy/popzoibJib3jnsbvlnotcclxuICAgICAgICAgIGFscGhhOiB0cnVlLC8v5piv5ZCm5byA5ZCv6YCP5piO5bqmXHJcbiAgICAgICAgICBkZWZhdWx0Q29sb3I6IHRoaXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmQsXHJcbiAgICAgICAgICBkaXNhYmxlZDogZmFsc2UsLy/mmK/lkKbnpoHmraLmiZPlvIDpopzoibLpgInmi6nlmahcclxuICAgICAgICAgIG9wZW5QaWNrZXJBbmk6ICdvcGFjaXR5JywvL+aJk+W8gOminOiJsumAieaLqeWZqOWKqOeUu1xyXG4gICAgICAgICAgc3VyZTogKGNvbG9yKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmQgPSBjb2xvclxyXG4gICAgICAgICAgfSwvL+eCueWHu+ehruiupOaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICAgICAgY2xlYXI6ICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5sYWJlbEJhY2tncm91bmRDb2xvckVuZCA9ICdyZ2JhKDI1NSwyNTUsMjU1LDEpJ1xyXG4gICAgICAgICAgfSwvL+eCueWHu+a4heepuuaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgdGhpcy5fZWxtcy5sYWJlbEJhY2tncm91bmRDb2xvckVuZFtpXSA9IGxhYmVsQmFja2dyb3VuZENvbG9yRW5kUGlja2VyXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgY3JlYXRlKHRoYXQpIHtcclxuICAgIGxldCBwb3NpdGlvbnMgPSB0aGF0Lm9wdGlvbnMucG9zaXRpb25zXHJcbiAgICBsZXQgZnJvbURlZ3JlZXNBcnJheSA9IFtdXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBmcm9tRGVncmVlc0FycmF5LnB1c2gocG9zaXRpb25zW2ldLmxuZywgcG9zaXRpb25zW2ldLmxhdClcclxuICAgIH1cclxuICAgIHRoYXQucG9zaXRpb25zID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXNBcnJheShmcm9tRGVncmVlc0FycmF5KVxyXG4gICAgbGV0IHBvc2l0aW9uc0EgPSB0aGF0LmNvbXB1dGVQaW5jZXJBcnJvdyh0aGF0Lm9wdGlvbnMucG9zaXRpb25zKVxyXG4gICAgaWYgKHBvc2l0aW9uc0EubGVuZ3RoID09IDApIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHBvaW50cyA9IFtbXV1cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9zaXRpb25zQS5sZW5ndGg7IGkrKykge1xyXG4gICAgICBsZXQgcG9zaXRpb24gPSB0aGF0LmNhcnRlc2lhbjNUb3dnczg0KHBvc2l0aW9uc0FbaV0sIHRoYXQuc2RrLnZpZXdlcilcclxuICAgICAgcG9pbnRzWzBdLnB1c2goW3Bvc2l0aW9uLmxuZywgcG9zaXRpb24ubGF0XSlcclxuICAgIH1cclxuICAgIGxldCBwb3NpdGlvbiA9IHRoYXQuY2FydGVzaWFuM1Rvd2dzODQocG9zaXRpb25zQVswXSwgdGhhdC5zZGsudmlld2VyKVxyXG4gICAgcG9pbnRzWzBdLnB1c2goW3Bvc2l0aW9uLmxuZywgcG9zaXRpb24ubGF0XSlcclxuICAgIGxldCBwb2x5Z29uID0gdHVyZi5wb2x5Z29uKHBvaW50cyk7XHJcbiAgICAvLyBsZXQgY2VudHJvaWQgPSB0dXJmLmNlbnRyb2lkKHBvbHlnb24pO1xyXG4gICAgbGV0IGNlbnRyb2lkID0gdHVyZi5wb2ludE9uRmVhdHVyZShwb2x5Z29uKTtcclxuXHJcblxyXG4gICAgbGV0IGdyb3VuZFxyXG4gICAgbGV0IGhlaWdodCA9IDBcclxuXHJcbiAgICBzd2l0Y2ggKHRoYXQub3B0aW9ucy5oZWlnaHRNb2RlKSB7XHJcbiAgICAgIGNhc2UgJzAnOlxyXG4gICAgICBjYXNlIDA6XHJcbiAgICAgICAgZ3JvdW5kID0gZmFsc2VcclxuICAgICAgICBicmVha1xyXG4gICAgICBjYXNlICcxJzpcclxuICAgICAgY2FzZSAxOlxyXG4gICAgICAgIGhlaWdodCA9IHRoYXQuc2RrLnZpZXdlci5zY2VuZS5nbG9iZS5nZXRIZWlnaHQoQ2VzaXVtLkNhcnRvZ3JhcGhpYy5mcm9tRGVncmVlcyhjZW50cm9pZC5nZW9tZXRyeS5jb29yZGluYXRlc1swXSwgY2VudHJvaWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMV0pKSB8fCAwXHJcbiAgICAgICAgZ3JvdW5kID0gZmFsc2VcclxuICAgICAgICBicmVha1xyXG4gICAgICBjYXNlICcyJzpcclxuICAgICAgY2FzZSAyOlxyXG4gICAgICAgIGdyb3VuZCA9IHRydWVcclxuICAgICAgICBicmVha1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGlmICghdGhhdC5vcHRpb25zLmxhYmVsLnBvc2l0aW9uKSB7XHJcbiAgICAvLyAgIHRoYXQub3B0aW9ucy5sYWJlbC5wb3NpdGlvbiA9IHsgbG5nOiBjZW50cm9pZC5nZW9tZXRyeS5jb29yZGluYXRlc1swXSwgbGF0OiBjZW50cm9pZC5nZW9tZXRyeS5jb29yZGluYXRlc1sxXSwgYWx0OiB0aGF0LmhlaWdodCArIGhlaWdodCB9XHJcbiAgICAvLyB9XHJcbiAgICB0aGF0Lm9wdGlvbnMubGFiZWwucG9zaXRpb24gPSB7IGxuZzogY2VudHJvaWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMF0sIGxhdDogY2VudHJvaWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMV0sIGFsdDogdGhhdC5oZWlnaHQgKyBoZWlnaHQgfVxyXG5cclxuICAgIGxldCBmcm9tRGVncmVlc0FycmF5MiA9IFtdXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvaW50c1swXS5sZW5ndGg7IGkrKykge1xyXG4gICAgICBmcm9tRGVncmVlc0FycmF5Mi5wdXNoKFxyXG4gICAgICAgIHBvaW50c1swXVtpXVswXSxcclxuICAgICAgICBwb2ludHNbMF1baV1bMV0sXHJcbiAgICAgICAgdGhhdC5oZWlnaHQgKyBoZWlnaHRcclxuICAgICAgKVxyXG4gICAgfVxyXG5cclxuICAgIGxldCBtYXRlcmlhbCA9IENlc2l1bS5Db2xvci5mcm9tQ3NzQ29sb3JTdHJpbmcodGhhdC5vcHRpb25zLmNvbG9yKVxyXG4gICAgaWYgKHRoYXQuc2RrLnZpZXdlci5zY2VuZS5tb2RlID09PSAyKSB7XHJcbiAgICAgIGdyb3VuZCA9IGZhbHNlXHJcbiAgICAgIG1hdGVyaWFsID0gbmV3IENlc2l1bS5DdXN0b21Db2xvck1hdGVyaWFsU291cmNlKHtcclxuICAgICAgICBjb2xvcjogdGhhdC5vcHRpb25zLmNvbG9yXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgICAvLyB0aGF0Lm9wdGlvbnMubGFiZWwuZ3JvdW5kID0gZ3JvdW5kXHJcblxyXG4gICAgdGhhdC5wb3NpdGlvbnNIID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXNBcnJheUhlaWdodHMoZnJvbURlZ3JlZXNBcnJheTIpXHJcblxyXG4gICAgdGhhdC5lbnRpdHkgPSB0aGF0LnNkay52aWV3ZXIuZW50aXRpZXMuYWRkKHtcclxuICAgICAgaWQ6IHRoYXQub3B0aW9ucy5pZCxcclxuICAgICAgc2hvdzogdGhhdC5vcHRpb25zLnNob3csXHJcbiAgICAgIHBvbHlnb246IHtcclxuICAgICAgICBoaWVyYXJjaHk6ICFncm91bmQgPyBuZXcgQ2VzaXVtLlBvbHlnb25IaWVyYXJjaHkodGhhdC5wb3NpdGlvbnNIKSA6IG5ldyBDZXNpdW0uUG9seWdvbkhpZXJhcmNoeShwb3NpdGlvbnNBKSxcclxuICAgICAgICBwZXJQb3NpdGlvbkhlaWdodDogIWdyb3VuZCA/IHRydWUgOiBmYWxzZSxcclxuICAgICAgICBtYXRlcmlhbDogbWF0ZXJpYWwsXHJcbiAgICAgICAgekluZGV4OiB0aGF0LnNkay5fZW50aXR5WkluZGV4XHJcbiAgICAgIH0sXHJcbiAgICAgIHBvbHlsaW5lOiB7XHJcbiAgICAgICAgcG9zaXRpb25zOiBbLi4udGhhdC5wb3NpdGlvbnNILCB0aGF0LnBvc2l0aW9uc0hbMF0sIHRoYXQucG9zaXRpb25zSFsxXV0sXHJcbiAgICAgICAgd2lkdGg6IHRoYXQub3B0aW9ucy5saW5lLndpZHRoLFxyXG4gICAgICAgIG1hdGVyaWFsOiBDZXNpdW0uQ29sb3IuZnJvbUNzc0NvbG9yU3RyaW5nKHRoYXQub3B0aW9ucy5saW5lLmNvbG9yKSxcclxuICAgICAgICBjbGFtcFRvR3JvdW5kOiAhZ3JvdW5kID8gZmFsc2UgOiB0cnVlLFxyXG4gICAgICAgIGFyY1R5cGU6ICFncm91bmQgPyBDZXNpdW0uQXJjVHlwZS5OT05FIDogQ2VzaXVtLkFyY1R5cGUuR0VPREVTSUMsXHJcbiAgICAgICAgekluZGV4OiB0aGF0LnNkay5fZW50aXR5WkluZGV4XHJcbiAgICAgIH0sXHJcbiAgICB9KVxyXG4gICAgdGhhdC5zZGsuX2VudGl0eVpJbmRleCsrXHJcbiAgICBQaW5jZXJBcnJvd09iamVjdC5jcmVhdGVMYWJlbCh0aGF0KVxyXG4gICAgbGV0IHBvczg0ID0gW11cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9zaXRpb25zQS5sZW5ndGg7IGkrKykge1xyXG4gICAgICBwb3M4NC5wdXNoKHRoYXQuY2FydGVzaWFuM1Rvd2dzODQocG9zaXRpb25zQVtpXSwgdGhhdC5zZGsudmlld2VyKSlcclxuICAgIH1cclxuICAgIHRoYXQuYXJlYUJ5TWV0ZXIgPSB0aGF0LmNvbXB1dGVBcmVhKHBvczg0KTtcclxuICAgIHRoYXQuYXJlYUNoYW5nZUNhbGxCYWNrICYmIHRoYXQuYXJlYUNoYW5nZUNhbGxCYWNrKClcclxuICAgIHN5bmNEYXRhKHRoYXQuc2RrLCB0aGF0Lm9wdGlvbnMuaWQpXHJcbiAgICBpZiAodGhhdC5vcHRpb25zLnNob3cpIHtcclxuXHJcbiAgICAgIHNldFNwbGl0RGlyZWN0aW9uKDAsIHRoYXQub3B0aW9ucy5pZClcclxuICAgIH1cclxuXHJcbiAgICB0aGF0LnNwcmVhZFN0YXRlID0gdGhhdC5vcHRpb25zLnNwcmVhZFN0YXRlXHJcbiAgfVxyXG5cclxuICBzdGF0aWMgYXN5bmMgY3JlYXRlTGFiZWwodGhhdCkge1xyXG4gICAgLy8g5qCH562+XHJcbiAgICB0aGF0LmxhYmVsID0gbmV3IExhYmVsT2JqZWN0KHRoYXQuc2RrLCB7XHJcbiAgICAgIGlkOiB0aGF0Lm9wdGlvbnMuaWQsXHJcbiAgICAgIHNob3c6IHRoYXQub3B0aW9ucy5zaG93ID8gdGhhdC5vcHRpb25zLmxhYmVsLnNob3cgOiBmYWxzZSxcclxuICAgICAgcG9zaXRpb246IFt0aGF0Lm9wdGlvbnMubGFiZWwucG9zaXRpb24ubG5nLCB0aGF0Lm9wdGlvbnMubGFiZWwucG9zaXRpb24ubGF0LCB0aGF0Lm9wdGlvbnMubGFiZWwucG9zaXRpb24uYWx0XSxcclxuICAgICAgdGV4dDogdGhhdC5vcHRpb25zLm5hbWUsXHJcbiAgICAgIGZvbnRTaXplOiB0aGF0Lm9wdGlvbnMubGFiZWwuZm9udFNpemUsXHJcbiAgICAgIGZvbnRGYW1pbHk6IHRoYXQub3B0aW9ucy5sYWJlbC5mb250RmFtaWx5LFxyXG4gICAgICBjb2xvcjogdGhhdC5vcHRpb25zLmxhYmVsLmNvbG9yLFxyXG4gICAgICBwaXhlbE9mZnNldDogdGhhdC5vcHRpb25zLmxhYmVsLnBpeGVsT2Zmc2V0LFxyXG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRoYXQub3B0aW9ucy5sYWJlbC5iYWNrZ3JvdW5kQ29sb3IsXHJcbiAgICAgIGxpbmVDb2xvcjogdGhhdC5vcHRpb25zLmxhYmVsLmxpbmVDb2xvcixcclxuICAgICAgbGluZVdpZHRoOiB0aGF0Lm9wdGlvbnMubGFiZWwubGluZVdpZHRoLFxyXG4gICAgICBzY2FsZUJ5RGlzdGFuY2U6IHRoYXQub3B0aW9ucy5sYWJlbC5zY2FsZUJ5RGlzdGFuY2UsXHJcbiAgICAgIG5lYXI6IHRoYXQub3B0aW9ucy5sYWJlbC5uZWFyLFxyXG4gICAgICBmYXI6IHRoYXQub3B0aW9ucy5sYWJlbC5mYXIsXHJcbiAgICAgIC8vIGdyb3VuZDogdGhhdC5vcHRpb25zLmxhYmVsLmdyb3VuZCxcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICAvLyDnvJbovpHmoYZcclxuICBhc3luYyBlZGl0KHN0YXRlKSB7XHJcbiAgICByZXR1cm5cclxuICAgIGlmICh0aGlzLl9lcnJvcikge1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuICAgIGxldCBfdGhpcyA9IHRoaXNcclxuICAgIHRoaXMub3JpZ2luYWxPcHRpb25zID0gdGhpcy5kZWVwQ29weU9iaih0aGlzLm9wdGlvbnMpXHJcblxyXG4gICAgaWYgKHRoaXMuX0RpYWxvZ09iamVjdCAmJiB0aGlzLl9EaWFsb2dPYmplY3QuY2xvc2UpIHtcclxuICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0LmNsb3NlKClcclxuICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0ID0gbnVsbFxyXG4gICAgfVxyXG4gICAgaWYgKHN0YXRlKSB7XHJcbiAgICAgIGZ1bmN0aW9uIGNyZWF0ZVNwYXRpYWxJbmZvVGFibGVDb250ZW50KCkge1xyXG4gICAgICAgIGxldCB0YWJsZUVsbSA9IGNvbnRlbnRFbG0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnc3BhdGlhbC1pbmZvLXRhYmxlJylbMF1cclxuICAgICAgICBsZXQgdEJvZHlFbG0gPSB0YWJsZUVsbS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0YWJsZS1ib2R5JylbMF1cclxuICAgICAgICB0Qm9keUVsbS5pbm5lckhUTUwgPSAnJ1xyXG4gICAgICAgIF90aGlzLl9lbG1zLmxuZyA9IFtdXHJcbiAgICAgICAgX3RoaXMuX2VsbXMubG5nSW5wdXQgPSBbXVxyXG4gICAgICAgIF90aGlzLl9lbG1zLmxhdCA9IFtdXHJcbiAgICAgICAgX3RoaXMuX2VsbXMubGF0SW5wdXQgPSBbXVxyXG4gICAgICAgIF90aGlzLl9lbG1zLmFsdCA9IFtdXHJcbiAgICAgICAgX3RoaXMuX2VsbXMuYWx0SW5wdXQgPSBbXVxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgX3RoaXMub3B0aW9ucy5wb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGxldCB0ciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpXHJcbiAgICAgICAgICB0ci5jbGFzc05hbWUgPSAndHInXHJcbiAgICAgICAgICB0ci5pbm5lckhUTUwgPSBgXHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidGRcIj4ke2kgKyAxfTwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRkIGxuZyBhbGlnbi1jZW50ZXJcIj48L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZCBsYXQgYWxpZ24tY2VudGVyXCI+PC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidGQgYWx0IGFsaWduLWNlbnRlclwiPjwvZGl2PlxyXG4gICAgICAgIGBcclxuICAgICAgICAgIGxldCBsbmdCb3ggPSB0ci5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdsbmcnKVswXVxyXG4gICAgICAgICAgbGV0IGxuZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKVxyXG4gICAgICAgICAgbG5nLmlubmVySFRNTCA9IChfdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sbmcpLnRvRml4ZWQoOClcclxuICAgICAgICAgIGxuZ0JveC5hcHBlbmRDaGlsZChsbmcpXHJcbiAgICAgICAgICBsZXQgbG5nSW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpXHJcbiAgICAgICAgICBsbmdJbnB1dC5jbGFzc05hbWUgPSAnaW5wdXQnXHJcbiAgICAgICAgICBsbmdJbnB1dC50eXBlID0gJ251bWJlcidcclxuICAgICAgICAgIGxuZ0lucHV0LnRpdGxlID0gJydcclxuICAgICAgICAgIGxuZ0lucHV0Lm1pbiA9IC0xODBcclxuICAgICAgICAgIGxuZ0lucHV0Lm1heCA9IDE4MFxyXG4gICAgICAgICAgbG5nSW5wdXQudmFsdWUgPSAoX3RoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubG5nKS50b0ZpeGVkKDgpXHJcblxyXG4gICAgICAgICAgbGV0IGxhdEJveCA9IHRyLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xhdCcpWzBdXHJcbiAgICAgICAgICBsZXQgbGF0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpXHJcbiAgICAgICAgICBsYXQuaW5uZXJIVE1MID0gKF90aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxhdCkudG9GaXhlZCg4KVxyXG4gICAgICAgICAgbGF0Qm94LmFwcGVuZENoaWxkKGxhdClcclxuICAgICAgICAgIGxldCBsYXRJbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0JylcclxuICAgICAgICAgIGxhdElucHV0LmNsYXNzTmFtZSA9ICdpbnB1dCdcclxuICAgICAgICAgIGxhdElucHV0LnR5cGUgPSAnbnVtYmVyJ1xyXG4gICAgICAgICAgbGF0SW5wdXQudGl0bGUgPSAnJ1xyXG4gICAgICAgICAgbGF0SW5wdXQubWluID0gLTkwXHJcbiAgICAgICAgICBsYXRJbnB1dC5tYXggPSA5MFxyXG4gICAgICAgICAgbGF0SW5wdXQudmFsdWUgPSAoX3RoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubGF0KS50b0ZpeGVkKDgpXHJcblxyXG4gICAgICAgICAgbGV0IGFsdEJveCA9IHRyLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2FsdCcpWzBdXHJcbiAgICAgICAgICBsZXQgYWx0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpXHJcbiAgICAgICAgICBhbHQuaW5uZXJIVE1MID0gKF90aGlzLmhlaWdodCkudG9GaXhlZCgyKVxyXG4gICAgICAgICAgYWx0Qm94LmFwcGVuZENoaWxkKGFsdClcclxuICAgICAgICAgIGxldCBhbHRJbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0JylcclxuICAgICAgICAgIGFsdElucHV0LmNsYXNzTmFtZSA9ICdpbnB1dCdcclxuICAgICAgICAgIGFsdElucHV0LnR5cGUgPSAnbnVtYmVyJ1xyXG4gICAgICAgICAgYWx0SW5wdXQudGl0bGUgPSAnJ1xyXG4gICAgICAgICAgYWx0SW5wdXQubWluID0gLTk5OTk5OTlcclxuICAgICAgICAgIGFsdElucHV0Lm1heCA9IDk5OTk5OTk5OVxyXG4gICAgICAgICAgYWx0SW5wdXQudmFsdWUgPSAoX3RoaXMuaGVpZ2h0KS50b0ZpeGVkKDIpXHJcblxyXG4gICAgICAgICAgbG5nQm94LmFkZEV2ZW50TGlzdGVuZXIoJ2RibGNsaWNrJywgKCkgPT4ge1xyXG4gICAgICAgICAgICBsbmdCb3guaW5uZXJIVE1MID0gJydcclxuICAgICAgICAgICAgbG5nSW5wdXQudmFsdWUgPSBOdW1iZXIoKF90aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxuZykudG9GaXhlZCg4KSlcclxuICAgICAgICAgICAgbG5nQm94LmFwcGVuZENoaWxkKGxuZ0lucHV0KVxyXG4gICAgICAgICAgICBsbmdJbnB1dC5mb2N1cygpXHJcbiAgICAgICAgICAgIGlmIChfdGhpcy5vcGVyYXRlLnBvc2l0aW9uRWRpdGluZykge1xyXG4gICAgICAgICAgICAgIF90aGlzLnBvc2l0aW9uRWRpdGluZyA9IGZhbHNlXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgUGluY2VyQXJyb3dPYmplY3QuY2xvc2VOb2RlRWRpdChfdGhpcylcclxuICAgICAgICAgICAgX3RoaXMuaGVpZ2h0TW9kZSA9IF90aGlzLmhlaWdodE1vZGVcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICBsbmdJbnB1dC5hZGRFdmVudExpc3RlbmVyKCdibHVyJywgKCkgPT4ge1xyXG4gICAgICAgICAgICBsbmdJbnB1dC52YWx1ZSA9IE51bWJlcigoX3RoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubG5nKS50b0ZpeGVkKDgpKVxyXG4gICAgICAgICAgICBsbmdCb3guaW5uZXJIVE1MID0gJydcclxuICAgICAgICAgICAgbG5nQm94LmFwcGVuZENoaWxkKGxuZylcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICBsbmdJbnB1dC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICgpID0+IHtcclxuICAgICAgICAgICAgX3RoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubG5nID0gTnVtYmVyKE51bWJlcihsbmdJbnB1dC52YWx1ZSkudG9GaXhlZCg4KSlcclxuICAgICAgICAgICAgbG5nLmlubmVySFRNTCA9IF90aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxuZy50b0ZpeGVkKDgpXHJcbiAgICAgICAgICAgIF90aGlzLmhlaWdodCA9IF90aGlzLmhlaWdodFxyXG4gICAgICAgICAgfSlcclxuXHJcbiAgICAgICAgICBsYXRCb3guYWRkRXZlbnRMaXN0ZW5lcignZGJsY2xpY2snLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGxhdEJveC5pbm5lckhUTUwgPSAnJ1xyXG4gICAgICAgICAgICBsYXRJbnB1dC52YWx1ZSA9IE51bWJlcigoX3RoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubGF0KS50b0ZpeGVkKDgpKVxyXG4gICAgICAgICAgICBsYXRCb3guYXBwZW5kQ2hpbGQobGF0SW5wdXQpXHJcbiAgICAgICAgICAgIGxhdElucHV0LmZvY3VzKClcclxuICAgICAgICAgICAgaWYgKF90aGlzLm9wZXJhdGUucG9zaXRpb25FZGl0aW5nKSB7XHJcbiAgICAgICAgICAgICAgX3RoaXMucG9zaXRpb25FZGl0aW5nID0gZmFsc2VcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBQaW5jZXJBcnJvd09iamVjdC5jbG9zZU5vZGVFZGl0KF90aGlzKVxyXG4gICAgICAgICAgICBfdGhpcy5oZWlnaHRNb2RlID0gX3RoaXMuaGVpZ2h0TW9kZVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIGxhdElucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2JsdXInLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGxhdElucHV0LnZhbHVlID0gTnVtYmVyKChfdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sYXQpLnRvRml4ZWQoOCkpXHJcbiAgICAgICAgICAgIGxhdEJveC5pbm5lckhUTUwgPSAnJ1xyXG4gICAgICAgICAgICBsYXRCb3guYXBwZW5kQ2hpbGQobGF0KVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIGxhdElucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKCkgPT4ge1xyXG4gICAgICAgICAgICBfdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sYXQgPSBOdW1iZXIoTnVtYmVyKGxhdElucHV0LnZhbHVlKS50b0ZpeGVkKDgpKVxyXG4gICAgICAgICAgICBsYXQuaW5uZXJIVE1MID0gX3RoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubGF0LnRvRml4ZWQoOClcclxuICAgICAgICAgICAgX3RoaXMuaGVpZ2h0ID0gX3RoaXMuaGVpZ2h0XHJcbiAgICAgICAgICB9KVxyXG5cclxuICAgICAgICAgIGFsdEJveC5hZGRFdmVudExpc3RlbmVyKCdkYmxjbGljaycsICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKF90aGlzLmhlaWdodE1vZGUgPT0gMikge1xyXG4gICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBhbHRCb3guaW5uZXJIVE1MID0gJydcclxuICAgICAgICAgICAgYWx0SW5wdXQudmFsdWUgPSBOdW1iZXIoKF90aGlzLmhlaWdodCkudG9GaXhlZCgyKSlcclxuICAgICAgICAgICAgYWx0Qm94LmFwcGVuZENoaWxkKGFsdElucHV0KVxyXG4gICAgICAgICAgICBhbHRJbnB1dC5mb2N1cygpXHJcbiAgICAgICAgICAgIGlmIChfdGhpcy5vcGVyYXRlLnBvc2l0aW9uRWRpdGluZykge1xyXG4gICAgICAgICAgICAgIF90aGlzLnBvc2l0aW9uRWRpdGluZyA9IGZhbHNlXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgUGluY2VyQXJyb3dPYmplY3QuY2xvc2VOb2RlRWRpdChfdGhpcylcclxuICAgICAgICAgICAgX3RoaXMuaGVpZ2h0TW9kZSA9IF90aGlzLmhlaWdodE1vZGVcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICBhbHRJbnB1dC5hZGRFdmVudExpc3RlbmVyKCdibHVyJywgKCkgPT4ge1xyXG4gICAgICAgICAgICBhbHRJbnB1dC52YWx1ZSA9IE51bWJlcigoX3RoaXMuaGVpZ2h0KS50b0ZpeGVkKDIpKVxyXG4gICAgICAgICAgICBhbHRCb3guaW5uZXJIVE1MID0gJydcclxuICAgICAgICAgICAgYWx0Qm94LmFwcGVuZENoaWxkKGFsdClcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICBhbHRJbnB1dC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICgpID0+IHtcclxuICAgICAgICAgICAgX3RoaXMuaGVpZ2h0ID0gTnVtYmVyKE51bWJlcihhbHRJbnB1dC52YWx1ZSkudG9GaXhlZCgyKSlcclxuICAgICAgICAgICAgYWx0LmlubmVySFRNTCA9IE51bWJlcihfdGhpcy5oZWlnaHQudG9GaXhlZCgyKSlcclxuICAgICAgICAgIH0pXHJcblxyXG5cclxuICAgICAgICAgIF90aGlzLl9lbG1zLmxuZy5wdXNoKGxuZylcclxuICAgICAgICAgIF90aGlzLl9lbG1zLmxuZ0lucHV0LnB1c2gobG5nSW5wdXQpXHJcbiAgICAgICAgICBfdGhpcy5fZWxtcy5sYXQucHVzaChsYXQpXHJcbiAgICAgICAgICBfdGhpcy5fZWxtcy5sYXRJbnB1dC5wdXNoKGxhdElucHV0KVxyXG4gICAgICAgICAgX3RoaXMuX2VsbXMuYWx0LnB1c2goYWx0KVxyXG4gICAgICAgICAgX3RoaXMuX2VsbXMuYWx0SW5wdXQucHVzaChhbHRJbnB1dClcclxuICAgICAgICAgIHRCb2R5RWxtLmFwcGVuZENoaWxkKHRyKVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICB0aGlzLl9EaWFsb2dPYmplY3QgPSBhd2FpdCBuZXcgRGlhbG9nKHRoaXMuc2RrLCB0aGlzLm9wdGlvbnMsIHtcclxuICAgICAgICB0aXRsZTogJ+WPjOeureWktOWxnuaApycsIGxlZnQ6ICcxODBweCcsIHRvcDogJzEwMHB4JyxcclxuICAgICAgICBjb25maXJtQ2FsbEJhY2s6IChvcHRpb25zKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLm5hbWUgPSB0aGlzLm5hbWUudHJpbSgpXHJcbiAgICAgICAgICBpZiAoIXRoaXMubmFtZSkge1xyXG4gICAgICAgICAgICB0aGlzLm5hbWUgPSAn5pyq5ZG95ZCN5a+56LGhJ1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5vcHRpb25zLmxhYmVsLnBvc2l0aW9uID0geyBsbmc6IHRoaXMubGFiZWwucG9zaXRpb25bMF0sIGxhdDogdGhpcy5sYWJlbC5wb3NpdGlvblsxXSwgYWx0OiB0aGlzLmxhYmVsLnBvc2l0aW9uWzJdIH1cclxuICAgICAgICAgIHRoaXMub3JpZ2luYWxPcHRpb25zID0gdGhpcy5kZWVwQ29weU9iaih0aGlzLm9wdGlvbnMpXHJcbiAgICAgICAgICB0aGlzLl9EaWFsb2dPYmplY3QuY2xvc2UoKVxyXG4gICAgICAgICAgdGhpcy5EaWFsb2cuY29uZmlybUNhbGxCYWNrICYmIHRoaXMuRGlhbG9nLmNvbmZpcm1DYWxsQmFjayh0aGlzLm9yaWdpbmFsT3B0aW9ucylcclxuICAgICAgICB9LFxyXG4gICAgICAgIHJlc2V0Q2FsbEJhY2s6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMucmVzZXQoKVxyXG4gICAgICAgICAgdGhpcy5EaWFsb2cucmVzZXRDYWxsQmFjayAmJiB0aGlzLkRpYWxvZy5yZXNldENhbGxCYWNrKClcclxuICAgICAgICB9LFxyXG4gICAgICAgIHJlbW92ZUNhbGxCYWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLkRpYWxvZy5yZW1vdmVDYWxsQmFjayAmJiB0aGlzLkRpYWxvZy5yZW1vdmVDYWxsQmFjaygpXHJcbiAgICAgICAgfSxcclxuICAgICAgICBjbG9zZUNhbGxCYWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICBsZXQgc3ByZWFkU3RhdGUgPSB0aGlzLm9wdGlvbnMuc3ByZWFkU3RhdGVcclxuICAgICAgICAgIHRoaXMucG9zaXRpb25FZGl0aW5nID0gZmFsc2VcclxuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMuc3ByZWFkU3RhdGUgPSBzcHJlYWRTdGF0ZVxyXG4gICAgICAgICAgICB0aGlzLnJlc2V0KClcclxuICAgICAgICAgIH0sIDEwKTtcclxuICAgICAgICAgIHRoaXMuRGlhbG9nLmNsb3NlQ2FsbEJhY2sgJiYgdGhpcy5EaWFsb2cuY2xvc2VDYWxsQmFjaygpXHJcbiAgICAgICAgfSxcclxuICAgICAgICBzaG93Q2FsbEJhY2s6IChzaG93KSA9PiB7XHJcbiAgICAgICAgICB0aGlzLm9wdGlvbnMuc2hvdyA9IHNob3dcclxuICAgICAgICAgIHRoaXMub3JpZ2luYWxPcHRpb25zLnNob3cgPSBzaG93XHJcbiAgICAgICAgICB0aGlzLnNob3cgPSBzaG93XHJcbiAgICAgICAgICB0aGlzLkRpYWxvZy5zaG93Q2FsbEJhY2sgJiYgdGhpcy5EaWFsb2cuc2hvd0NhbGxCYWNrKClcclxuICAgICAgICB9LFxyXG4gICAgICAgIHRyYW5zbGF0aW9uYWxDYWxsQmFjazogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5wb3NpdGlvbkVkaXRpbmcgPSAhdGhpcy5wb3NpdGlvbkVkaXRpbmdcclxuICAgICAgICB9LFxyXG4gICAgICAgIC8vIOS6jOasoee8lui+keWbnuiwg1xyXG4gICAgICAgIHNlY29uZGFyeUVkaXRDYWxsQmFjazogKCkgPT4ge1xyXG4gICAgICAgICAgUGluY2VyQXJyb3dPYmplY3Qubm9kZUVkaXQodGhpcywgKCkgPT4ge1xyXG4gICAgICAgICAgICBjcmVhdGVTcGF0aWFsSW5mb1RhYmxlQ29udGVudCgpXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmJvZHkuY2xhc3NOYW1lID0gdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmJvZHkuY2xhc3NOYW1lICsgJyBwaW5jZXJBcnJvdydcclxuICAgICAgbGV0IGNvbnRlbnRFbG0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgY29udGVudEVsbS5pbm5lckhUTUwgPSBodG1sKHRoaXMpXHJcbiAgICAgIHRoaXMuX0RpYWxvZ09iamVjdC5jb250ZW50QXBwQ2hpbGQoY29udGVudEVsbSlcclxuICAgICAgdGhpcy5hdHRyaWJ1dGVUeXBlID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZVR5cGVcclxuICAgICAgdGhpcy5hdHRyaWJ1dGVDYW1lcmEgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmNhbWVyYS5jb250ZW50XHJcblxyXG4gICAgICAvLyDliJvlu7rmoIfnrb7pobVcclxuICAgICAgbGV0IHRhYnNFbG0gPSBuZXcgY3lfdGFicygncGluY2VyLWFycm93LW9iamVjdC1lZGl0LXRhYnMnLCB1bmRlZmluZWQsIHRoaXMuc2RrKVxyXG4gICAgICAvLyDpopzoibLnu4Tku7ZcclxuICAgICAgbGV0IGNvbG9yUGlja2VyID0gbmV3IFlKQ29sb3JQaWNrZXIoe1xyXG4gICAgICAgIGVsOiBjb250ZW50RWxtLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXCJjb2xvclwiKVswXSxcclxuICAgICAgICBzaXplOiAnbWluaScsLy/popzoibJib3jnsbvlnotcclxuICAgICAgICBhbHBoYTogdHJ1ZSwvL+aYr+WQpuW8gOWQr+mAj+aYjuW6plxyXG4gICAgICAgIGRlZmF1bHRDb2xvcjogdGhpcy5jb2xvcixcclxuICAgICAgICBkaXNhYmxlZDogZmFsc2UsLy/mmK/lkKbnpoHmraLmiZPlvIDpopzoibLpgInmi6nlmahcclxuICAgICAgICBvcGVuUGlja2VyQW5pOiAnb3BhY2l0eScsLy/miZPlvIDpopzoibLpgInmi6nlmajliqjnlLtcclxuICAgICAgICBzdXJlOiAoY29sb3IpID0+IHtcclxuICAgICAgICAgIHRoaXMuY29sb3IgPSBjb2xvclxyXG4gICAgICAgIH0sLy/ngrnlh7vnoa7orqTmjInpkq7kuovku7blm57osINcclxuICAgICAgICBjbGVhcjogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5jb2xvciA9ICdyZ2JhKDI1NSwyNTUsMjU1LDEpJ1xyXG4gICAgICAgIH0sLy/ngrnlh7vmuIXnqbrmjInpkq7kuovku7blm57osINcclxuICAgICAgfSlcclxuICAgICAgbGV0IGxpbmVjb2xvclBpY2tlciA9IG5ldyBZSkNvbG9yUGlja2VyKHtcclxuICAgICAgICBlbDogY29udGVudEVsbS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFwibGluZUNvbG9yXCIpWzBdLFxyXG4gICAgICAgIHNpemU6ICdtaW5pJywvL+minOiJsmJveOexu+Wei1xyXG4gICAgICAgIGFscGhhOiB0cnVlLC8v5piv5ZCm5byA5ZCv6YCP5piO5bqmXHJcbiAgICAgICAgZGVmYXVsdENvbG9yOiB0aGlzLmxpbmVDb2xvcixcclxuICAgICAgICBkaXNhYmxlZDogZmFsc2UsLy/mmK/lkKbnpoHmraLmiZPlvIDpopzoibLpgInmi6nlmahcclxuICAgICAgICBvcGVuUGlja2VyQW5pOiAnb3BhY2l0eScsLy/miZPlvIDpopzoibLpgInmi6nlmajliqjnlLtcclxuICAgICAgICBzdXJlOiAoY29sb3IpID0+IHtcclxuICAgICAgICAgIHRoaXMubGluZUNvbG9yID0gY29sb3JcclxuICAgICAgICB9LC8v54K55Ye756Gu6K6k5oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgICAgY2xlYXI6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMubGluZUNvbG9yID0gJ3JnYmEoMjU1LDI1NSwyNTUsMSknXHJcbiAgICAgICAgfSwvL+eCueWHu+a4heepuuaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICB9KVxyXG4gICAgICBsZXQgbGFiZWxDb2xvclBpY2tlciA9IG5ldyBZSkNvbG9yUGlja2VyKHtcclxuICAgICAgICBlbDogY29udGVudEVsbS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFwibGFiZWxDb2xvclwiKVswXSxcclxuICAgICAgICBzaXplOiAnbWluaScsLy/popzoibJib3jnsbvlnotcclxuICAgICAgICBhbHBoYTogdHJ1ZSwvL+aYr+WQpuW8gOWQr+mAj+aYjuW6plxyXG4gICAgICAgIGRlZmF1bHRDb2xvcjogdGhpcy5sYWJlbENvbG9yLFxyXG4gICAgICAgIGRpc2FibGVkOiBmYWxzZSwvL+aYr+WQpuemgeatouaJk+W8gOminOiJsumAieaLqeWZqFxyXG4gICAgICAgIG9wZW5QaWNrZXJBbmk6ICdvcGFjaXR5JywvL+aJk+W8gOminOiJsumAieaLqeWZqOWKqOeUu1xyXG4gICAgICAgIHN1cmU6IChjb2xvcikgPT4ge1xyXG4gICAgICAgICAgdGhpcy5sYWJlbENvbG9yID0gY29sb3JcclxuICAgICAgICB9LC8v54K55Ye756Gu6K6k5oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgICAgY2xlYXI6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMubGFiZWxDb2xvciA9ICdyZ2JhKDI1NSwyNTUsMjU1LDEpJ1xyXG4gICAgICAgIH0sLy/ngrnlh7vmuIXnqbrmjInpkq7kuovku7blm57osINcclxuICAgICAgfSlcclxuICAgICAgbGV0IGxpbmVDb2xvclBpY2tlciA9IG5ldyBZSkNvbG9yUGlja2VyKHtcclxuICAgICAgICBlbDogY29udGVudEVsbS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFwibGFiZWxMaW5lQ29sb3JcIilbMF0sXHJcbiAgICAgICAgc2l6ZTogJ21pbmknLC8v6aKc6ImyYm9457G75Z6LXHJcbiAgICAgICAgYWxwaGE6IHRydWUsLy/mmK/lkKblvIDlkK/pgI/mmI7luqZcclxuICAgICAgICBkZWZhdWx0Q29sb3I6IHRoaXMubGFiZWxMaW5lQ29sb3IsXHJcbiAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLC8v5piv5ZCm56aB5q2i5omT5byA6aKc6Imy6YCJ5oup5ZmoXHJcbiAgICAgICAgb3BlblBpY2tlckFuaTogJ29wYWNpdHknLC8v5omT5byA6aKc6Imy6YCJ5oup5Zmo5Yqo55S7XHJcbiAgICAgICAgc3VyZTogKGNvbG9yKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmxhYmVsTGluZUNvbG9yID0gY29sb3JcclxuICAgICAgICB9LC8v54K55Ye756Gu6K6k5oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgICAgY2xlYXI6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMubGFiZWxMaW5lQ29sb3IgPSAncmdiYSgyNTUsMjU1LDI1NSwxKSdcclxuICAgICAgICB9LC8v54K55Ye75riF56m65oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgIH0pXHJcbiAgICAgIGxldCBsYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0UGlja2VyID0gbmV3IFlKQ29sb3JQaWNrZXIoe1xyXG4gICAgICAgIGVsOiBjb250ZW50RWxtLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXCJsYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0XCIpWzBdLFxyXG4gICAgICAgIHNpemU6ICdtaW5pJyxcclxuICAgICAgICBhbHBoYTogdHJ1ZSxcclxuICAgICAgICBkZWZhdWx0Q29sb3I6IHRoaXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JTdGFydCxcclxuICAgICAgICBkaXNhYmxlZDogZmFsc2UsXHJcbiAgICAgICAgb3BlblBpY2tlckFuaTogJ29wYWNpdHknLFxyXG4gICAgICAgIHN1cmU6IChjb2xvcikgPT4ge1xyXG4gICAgICAgICAgdGhpcy5sYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0ID0gY29sb3JcclxuICAgICAgICB9LFxyXG4gICAgICAgIGNsZWFyOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmxhYmVsQmFja2dyb3VuZENvbG9yU3RhcnQgPSAncmdiYSgyNTUsMjU1LDI1NSwxKSdcclxuICAgICAgICB9LFxyXG4gICAgICB9KVxyXG4gICAgICBsZXQgbGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmRQaWNrZXIgPSBuZXcgWUpDb2xvclBpY2tlcih7XHJcbiAgICAgICAgZWw6IGNvbnRlbnRFbG0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcImxhYmVsQmFja2dyb3VuZENvbG9yRW5kXCIpWzBdLFxyXG4gICAgICAgIHNpemU6ICdtaW5pJyxcclxuICAgICAgICBhbHBoYTogdHJ1ZSxcclxuICAgICAgICBkZWZhdWx0Q29sb3I6IHRoaXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmQsXHJcbiAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLFxyXG4gICAgICAgIG9wZW5QaWNrZXJBbmk6ICdvcGFjaXR5JyxcclxuICAgICAgICBzdXJlOiAoY29sb3IpID0+IHtcclxuICAgICAgICAgIHRoaXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmQgPSBjb2xvclxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgY2xlYXI6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmQgPSAncmdiYSgyNTUsMjU1LDI1NSwxKSdcclxuICAgICAgICB9LFxyXG4gICAgICB9KVxyXG4gICAgICBsZXQgYWxsX2VsbSA9IGNvbnRlbnRFbG0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCIqXCIpXHJcbiAgICAgIFBpbmNlckFycm93T2JqZWN0LkV2ZW50QmluZGluZyh0aGlzLCBhbGxfZWxtKVxyXG4gICAgICB0aGlzLl9lbG1zLmNvbG9yID0gW2NvbG9yUGlja2VyXVxyXG4gICAgICB0aGlzLl9lbG1zLmxpbmVDb2xvciA9IFtsaW5lY29sb3JQaWNrZXJdXHJcbiAgICAgIHRoaXMuX2VsbXMubGFiZWxDb2xvciA9IFtsYWJlbENvbG9yUGlja2VyXVxyXG4gICAgICB0aGlzLl9lbG1zLmxhYmVsTGluZUNvbG9yID0gW2xpbmVDb2xvclBpY2tlcl1cclxuICAgICAgdGhpcy5fZWxtcy5sYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0ID0gW2xhYmVsQmFja2dyb3VuZENvbG9yU3RhcnRQaWNrZXJdXHJcbiAgICAgIHRoaXMuX2VsbXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmQgPSBbbGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmRQaWNrZXJdXHJcblxyXG4gICAgICBsZXQgaGVpZ2h0Qm94RWxtID0gdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaGVpZ2h0LWJveCcpWzBdXHJcbiAgICAgIGxldCBoZWlnaHRFbG0gPSBoZWlnaHRCb3hFbG0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaGVpZ2h0JylbMF1cclxuICAgICAgbGV0IGhlaWdodENvbmZpcm1FbG0gPSB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdoZWlnaHQtY29uZmlybScpWzBdXHJcbiAgICAgIGhlaWdodEVsbS52YWx1ZSA9IDEwXHJcbiAgICAgIGlmICh0aGlzLmhlaWdodE1vZGUgPT0gMikge1xyXG4gICAgICAgIGhlaWdodEJveEVsbSAmJiAoaGVpZ2h0Qm94RWxtLmNsYXNzTmFtZSA9ICdpbnB1dC1udW1iZXIgaW5wdXQtbnVtYmVyLXVuaXQtMSBoZWlnaHQtYm94IGRpc2FibGVkJyk7XHJcbiAgICAgICAgaGVpZ2h0Q29uZmlybUVsbSAmJiBoZWlnaHRDb25maXJtRWxtLnNldEF0dHJpYnV0ZSgnZGlzYWJsZWQnLCAnZGlzYWJsZWQnKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBoZWlnaHRCb3hFbG0gJiYgKGhlaWdodEJveEVsbS5jbGFzc05hbWUgPSAnaW5wdXQtbnVtYmVyIGlucHV0LW51bWJlci11bml0LTEgaGVpZ2h0LWJveCcpO1xyXG4gICAgICAgIGhlaWdodENvbmZpcm1FbG0gJiYgaGVpZ2h0Q29uZmlybUVsbS5yZW1vdmVBdHRyaWJ1dGUoJ2Rpc2FibGVkJyk7XHJcbiAgICAgIH1cclxuICAgICAgbGV0IGhlaWdodE1vZGVEYXRhID0gW1xyXG4gICAgICAgIHtcclxuICAgICAgICAgIG5hbWU6ICfmtbfmi5Tpq5jluqYnLFxyXG4gICAgICAgICAgdmFsdWU6ICfmtbfmi5Tpq5jluqYnLFxyXG4gICAgICAgICAga2V5OiAnMCcsXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBuYW1lOiAn55u45a+55Zyw6KGoJyxcclxuICAgICAgICAgIHZhbHVlOiAn55u45a+55Zyw6KGoJyxcclxuICAgICAgICAgIGtleTogJzEnLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgbmFtZTogJ+S+nemZhOaooeWeiycsXHJcbiAgICAgICAgICB2YWx1ZTogJ+S+nemZhOaooeWeiycsXHJcbiAgICAgICAgICBrZXk6ICcyJyxcclxuICAgICAgICB9XHJcbiAgICAgIF1cclxuICAgICAgbGV0IGhlaWdodE1vZGVPYmplY3QgPSBsZWdwKFxyXG4gICAgICAgIHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXHJcbiAgICAgICAgICAnaGVpZ2h0LW1vZGUtYm94J1xyXG4gICAgICAgIClbMF0sXHJcbiAgICAgICAgJy5oZWlnaHQtbW9kZSdcclxuICAgICAgKVxyXG4gICAgICBpZiAoaGVpZ2h0TW9kZU9iamVjdCkge1xyXG4gICAgICAgIGhlaWdodE1vZGVPYmplY3QubGVncF9zZWFyY2goaGVpZ2h0TW9kZURhdGEpXHJcbiAgICAgICAgbGV0IGhlaWdodE1vZGVEYXRhTGVncEVsbSA9IHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50XHJcbiAgICAgICAgICAuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaGVpZ2h0LW1vZGUnKVswXVxyXG4gICAgICAgICAgLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdpbnB1dCcpWzBdXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoZWlnaHRNb2RlRGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgaWYgKGhlaWdodE1vZGVEYXRhW2ldLmtleSA9PSB0aGlzLmhlaWdodE1vZGUpIHtcclxuICAgICAgICAgICAgaGVpZ2h0TW9kZURhdGFMZWdwRWxtLnZhbHVlID0gaGVpZ2h0TW9kZURhdGFbaV0udmFsdWVcclxuICAgICAgICAgICAgaGVpZ2h0TW9kZU9iamVjdC5sZWdwX3NlYXJjaEFjdGl2ZShcclxuICAgICAgICAgICAgICBoZWlnaHRNb2RlRGF0YVtpXS52YWx1ZVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGhlaWdodE1vZGVEYXRhTGVncEVsbS5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICgpID0+IHtcclxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaGVpZ2h0TW9kZURhdGEubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKGhlaWdodE1vZGVEYXRhW2ldLnZhbHVlID09PSBoZWlnaHRNb2RlRGF0YUxlZ3BFbG0udmFsdWUpIHtcclxuICAgICAgICAgICAgICB0aGlzLmhlaWdodE1vZGUgPSBoZWlnaHRNb2RlRGF0YVtpXS5rZXlcclxuICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuXHJcbiAgICAgICAgaGVpZ2h0RWxtLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKCkgPT4ge1xyXG4gICAgICAgICAgc3dpdGNoICh0aGlzLmhlaWdodE1vZGUpIHtcclxuICAgICAgICAgICAgY2FzZSAwOlxyXG4gICAgICAgICAgICBjYXNlICcwJzpcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAxOlxyXG4gICAgICAgICAgICBjYXNlICcxJzpcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAyOlxyXG4gICAgICAgICAgICBjYXNlICcyJzpcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG5cclxuICAgICAgICB0aGlzLl9lbG1zLmhlaWdodCA9IGhlaWdodEVsbVxyXG4gICAgICAgIHRoaXMuX2VsbXMuaGVpZ2h0Qm94ID0gaGVpZ2h0Qm94RWxtXHJcbiAgICAgICAgdGhpcy5fZWxtcy5oZWlnaHRNb2RlID0gaGVpZ2h0TW9kZURhdGFMZWdwRWxtXHJcbiAgICAgICAgdGhpcy5fZWxtcy5oZWlnaHRDb25maXJtID0gaGVpZ2h0Q29uZmlybUVsbVxyXG4gICAgICAgIHRoaXMuX2VsbXMuaGVpZ2h0TW9kZU9iamVjdCA9IGhlaWdodE1vZGVPYmplY3RcclxuXHJcbiAgICAgICAgaGVpZ2h0Q29uZmlybUVsbS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcclxuICAgICAgICAgIGlmICh0aGlzLm9wZXJhdGUucG9zaXRpb25FZGl0aW5nKSB7XHJcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb25FZGl0aW5nID0gZmFsc2VcclxuICAgICAgICAgICAgdGhpcy5oZWlnaHQgPSB0aGlzLmhlaWdodCArIE51bWJlcihoZWlnaHRFbG0udmFsdWUpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgUGluY2VyQXJyb3dPYmplY3QuY2xvc2VOb2RlRWRpdCh0aGlzKVxyXG4gICAgICAgICAgICB0aGlzLmhlaWdodE1vZGUgPSB0aGlzLmhlaWdodE1vZGVcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgdGhpcy5oZWlnaHQgPSB0aGlzLmhlaWdodCArIE51bWJlcihoZWlnaHRFbG0udmFsdWUpXHJcbiAgICAgICAgICAgIH0sIDEwMCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgfVxyXG5cclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5hdHRyaWJ1dGVMaW5rID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnRcclxuICAgICAgICB0aGlzLmF0dHJpYnV0ZVZyID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52ci5jb250ZW50XHJcbiAgICAgICAgdGhpcy5jYW1lcmFTZWxlY3QgJiYgdGhpcy5jYW1lcmFTZWxlY3QoKVxyXG4gICAgICAgIHRoaXMuZ29vZHNTZWxlY3QgJiYgdGhpcy5nb29kc1NlbGVjdCgpXHJcbiAgICAgICAgbGV0IHRhZ0RhdGEgPSB0aGlzLmF0dHJpYnV0ZVNlbGVjdFxyXG4gICAgICAgIGxldCBhdHRyaWJ1dGVFbG0gPSB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdhdHRyaWJ1dGUtc2VsZWN0LWJveCcpWzBdXHJcbiAgICAgICAgaWYgKGF0dHJpYnV0ZUVsbSkge1xyXG4gICAgICAgICAgbGV0IGxlZ3BPYmplY3QgPSBsZWdwKGF0dHJpYnV0ZUVsbSwgXCIuYXR0cmlidXRlLXNlbGVjdFwiKVxyXG4gICAgICAgICAgbGVncE9iamVjdC5sZWdwX3NlYXJjaCh0YWdEYXRhKVxyXG4gICAgICAgICAgbGV0IGF0dHJpYnV0ZVNlbGVjdEVsbSA9IHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2F0dHJpYnV0ZS1zZWxlY3QnKVswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaW5wdXQnKVswXVxyXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YWdEYXRhLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmICh0YWdEYXRhW2ldLmtleSA9PT0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZVR5cGUpIHtcclxuICAgICAgICAgICAgICBhdHRyaWJ1dGVTZWxlY3RFbG0udmFsdWUgPSB0YWdEYXRhW2ldLnZhbHVlXHJcbiAgICAgICAgICAgICAgbGVncE9iamVjdC5sZWdwX3NlYXJjaEFjdGl2ZSh0YWdEYXRhW2ldLnZhbHVlKVxyXG4gICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGF0dHJpYnV0ZVNlbGVjdEVsbS5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICgpID0+IHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YWdEYXRhLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgaWYgKHRhZ0RhdGFbaV0udmFsdWUgPT09IGF0dHJpYnV0ZVNlbGVjdEVsbS52YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hdHRyaWJ1dGVUeXBlID0gdGFnRGF0YVtpXS5rZXlcclxuICAgICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgdW5pdERhdGEgPSBbe1xyXG4gICAgICAgICAgbmFtZTogJ+W5s+aWueexsycsXHJcbiAgICAgICAgICB2YWx1ZTogJ+W5s+aWueexsydcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIG5hbWU6ICflubPmlrnljYPnsbMnLFxyXG4gICAgICAgICAgdmFsdWU6ICflubPmlrnljYPnsbMnXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBuYW1lOiAn5LqpJyxcclxuICAgICAgICAgIHZhbHVlOiAn5LqpJ1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgbmFtZTogJ+WFrOmhtycsXHJcbiAgICAgICAgICB2YWx1ZTogJ+WFrOmhtydcclxuICAgICAgICB9LFxyXG4gICAgICAgIF1cclxuICAgICAgICBsZXQgdW5pdERhdGFMZWdwT2JqZWN0ID0gbGVncCh0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdpbnB1dC1zZWxlY3QtdW5pdC1ib3gnKVswXSwgXCIuaW5wdXQtc2VsZWN0LXVuaXRcIilcclxuICAgICAgICBpZiAodW5pdERhdGFMZWdwT2JqZWN0KSB7XHJcbiAgICAgICAgICB1bml0RGF0YUxlZ3BPYmplY3QubGVncF9zZWFyY2godW5pdERhdGEpXHJcbiAgICAgICAgICBsZXQgdW5pdERhdGFMZWdwRWxtID0gdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaW5wdXQtc2VsZWN0LXVuaXQnKVswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaW5wdXQnKVswXVxyXG4gICAgICAgICAgdW5pdERhdGFMZWdwRWxtLnZhbHVlID0gdGhpcy5vcHRpb25zWydhcmVhLXVuaXQnXVxyXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB1bml0RGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAodW5pdERhdGFbaV0udmFsdWUgPT09IHVuaXREYXRhTGVncEVsbS52YWx1ZSkge1xyXG4gICAgICAgICAgICAgIHVuaXREYXRhTGVncE9iamVjdC5sZWdwX3NlYXJjaEFjdGl2ZSh1bml0RGF0YVtpXS52YWx1ZSlcclxuICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB1bml0RGF0YUxlZ3BFbG0uYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdW5pdERhdGEubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICBpZiAodW5pdERhdGFbaV0udmFsdWUgPT09IHVuaXREYXRhTGVncEVsbS52YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hcmVhVW5pdCA9IHVuaXREYXRhW2ldLnZhbHVlXHJcbiAgICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBmb250RGF0YSA9IGdldEZvbnRMaXN0KClcclxuICAgICAgICBsZXQgZm9udE9iamVjdCA9IGxlZ3AoXHJcbiAgICAgICAgICB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFxyXG4gICAgICAgICAgICAnZm9udC1zZWxlY3QtYm94J1xyXG4gICAgICAgICAgKVswXSxcclxuICAgICAgICAgICcuZm9udC1zZWxlY3QnXHJcbiAgICAgICAgKVxyXG4gICAgICAgIGlmIChmb250T2JqZWN0KSB7XHJcbiAgICAgICAgICBmb250T2JqZWN0LmxlZ3Bfc2VhcmNoKGZvbnREYXRhKVxyXG4gICAgICAgICAgbGV0IGZvbnREYXRhTGVncEVsbSA9IHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50XHJcbiAgICAgICAgICAgIC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdmb250LXNlbGVjdCcpWzBdXHJcbiAgICAgICAgICAgIC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaW5wdXQnKVswXVxyXG4gICAgICAgICAgZm9udERhdGFMZWdwRWxtLnZhbHVlID0gZm9udERhdGFbdGhpcy5sYWJlbEZvbnRGYW1pbHldLnZhbHVlXHJcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZvbnREYXRhLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChmb250RGF0YVtpXS52YWx1ZSA9PSBmb250RGF0YUxlZ3BFbG0udmFsdWUpIHtcclxuICAgICAgICAgICAgICBmb250T2JqZWN0LmxlZ3Bfc2VhcmNoQWN0aXZlKGZvbnREYXRhW2ldLnZhbHVlKVxyXG4gICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGZvbnREYXRhTGVncEVsbS5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICgpID0+IHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmb250RGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgIGlmIChmb250RGF0YVtpXS52YWx1ZSA9PT0gZm9udERhdGFMZWdwRWxtLnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxhYmVsRm9udEZhbWlseSA9IGZvbnREYXRhW2ldLmtleVxyXG4gICAgICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICB0aGlzLl9lbG1zLmxhYmVsRm9udEZhbWlseSA9IFtmb250RGF0YUxlZ3BFbG1dXHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIGNyZWF0ZVNwYXRpYWxJbmZvVGFibGVDb250ZW50KClcclxuICAgICAgfSwgMCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAodGhpcy5fRGlhbG9nT2JqZWN0ICYmIHRoaXMuX0RpYWxvZ09iamVjdC5yZW1vdmUpIHtcclxuICAgICAgICB0aGlzLl9EaWFsb2dPYmplY3QucmVtb3ZlKClcclxuICAgICAgICB0aGlzLl9EaWFsb2dPYmplY3QgPSBudWxsXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlc2V0KCkge1xyXG4gICAgaWYgKCF0aGlzLmVudGl0eSkge1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuICAgIHRoaXMub3B0aW9ucyA9IHRoaXMuZGVlcENvcHlPYmoodGhpcy5vcmlnaW5hbE9wdGlvbnMpXHJcbiAgICB0aGlzLm5hbWUgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5uYW1lXHJcbiAgICB0aGlzLmNvbG9yID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMuY29sb3JcclxuICAgIHRoaXMubGluZUNvbG9yID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMubGluZS5jb2xvclxyXG4gICAgdGhpcy5saW5lV2lkdGggPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5saW5lLndpZHRoXHJcbiAgICB0aGlzLmxhYmVsU2hvdyA9IHRoaXMub3JpZ2luYWxPcHRpb25zLmxhYmVsLnNob3dcclxuICAgIHRoaXMubGFiZWxDb2xvciA9IHRoaXMub3JpZ2luYWxPcHRpb25zLmxhYmVsLmNvbG9yXHJcbiAgICB0aGlzLmxhYmVsRm9udFNpemUgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5sYWJlbC5mb250U2l6ZVxyXG4gICAgdGhpcy5sYWJlbEZvbnRGYW1pbHkgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5sYWJlbC5mb250RmFtaWx5XHJcbiAgICB0aGlzLmxhYmVsU2NhbGVCeURpc3RhbmNlID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMubGFiZWwuc2NhbGVCeURpc3RhbmNlXHJcbiAgICB0aGlzLmxhYmVsTmVhciA9IHRoaXMub3JpZ2luYWxPcHRpb25zLmxhYmVsLm5lYXJcclxuICAgIHRoaXMubGFiZWxGYXIgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5sYWJlbC5mYXJcclxuICAgIHRoaXMubGFiZWxMaW5lV2lkdGggPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5sYWJlbC5saW5lV2lkdGhcclxuICAgIHRoaXMubGFiZWxQaXhlbE9mZnNldCA9IHRoaXMub3JpZ2luYWxPcHRpb25zLmxhYmVsLnBpeGVsT2Zmc2V0XHJcbiAgICB0aGlzLmxhYmVsTGluZUNvbG9yID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMubGFiZWwubGluZUNvbG9yXHJcbiAgICB0aGlzLmxhYmVsQmFja2dyb3VuZENvbG9yU3RhcnQgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5sYWJlbC5iYWNrZ3JvdW5kQ29sb3JbMF1cclxuICAgIHRoaXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmQgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5sYWJlbC5iYWNrZ3JvdW5kQ29sb3JbMV1cclxuXHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm9wdGlvbnMucG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGlmICh0aGlzLl9lbG1zLmxuZyAmJiB0aGlzLl9lbG1zLmxuZ1tpXSkge1xyXG4gICAgICAgIHRoaXMuX2VsbXMubG5nW2ldLmlubmVySFRNTCA9IHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubG5nLnRvRml4ZWQoOClcclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy5fZWxtcy5sYXQgJiYgdGhpcy5fZWxtcy5sYXRbaV0pIHtcclxuICAgICAgICB0aGlzLl9lbG1zLmxhdFtpXS5pbm5lckhUTUwgPSB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxhdC50b0ZpeGVkKDgpXHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRoaXMuX2VsbXMuYWx0ICYmIHRoaXMuX2VsbXMuYWx0W2ldKSB7XHJcbiAgICAgICAgdGhpcy5fZWxtcy5hbHRbaV0uaW5uZXJIVE1MID0gTnVtYmVyKHRoaXMub3B0aW9ucy5oZWlnaHQudG9GaXhlZCgyKSlcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaGVpZ2h0TW9kZSA9IHRoaXMuaGVpZ2h0TW9kZVxyXG5cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5ub2RlUG9pbnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIHRoaXMuc2RrLnZpZXdlci5lbnRpdGllcy5yZW1vdmUodGhpcy5ub2RlUG9pbnRzW2ldKVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMubm9kZVBvaW50cyA9IFtdXHJcbiAgICBZSi5NZWFzdXJlLlNldE1lYXN1cmVTdGF0dXMoZmFsc2UpXHJcbiAgICB0aGlzLmV2ZW50ICYmIHRoaXMuZXZlbnQuZGVzdHJveSgpXHJcbiAgICB0aGlzLnRpcCAmJiB0aGlzLnRpcC5kZXN0cm95KClcclxuXHJcbiAgICBsZXQgc3ByZWFkU3RhdGUgPSB0aGlzLm9wdGlvbnMuc3ByZWFkU3RhdGVcclxuICAgIHRoaXMucmVtb3ZlQW5pbWF0ZSgpXHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5sb29wID0gdGhpcy5vcHRpb25zLmxvb3BcclxuICAgICAgdGhpcy5zcHJlYWRTdGF0ZSA9IHNwcmVhZFN0YXRlXHJcbiAgICAgIHN5bmNEYXRhKHRoaXMuc2RrLCB0aGlzLm9wdGlvbnMuaWQpXHJcbiAgICAgIHN5bmNTcGxpdERhdGEodGhpcy5zZGssIHRoaXMub3B0aW9ucy5pZClcclxuICAgIH0sIDIwMCk7XHJcblxyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMucHJldmlvdXMgPSBudWxsXHJcbiAgICB9LCA1MCk7XHJcbiAgfVxyXG5cclxuICBhc3luYyByZW1vdmUoKSB7XHJcbiAgICB0aGlzLnJlbW92ZUFuaW1hdGUoKVxyXG4gICAgdGhpcy5ldmVudCAmJiB0aGlzLmV2ZW50LmRlc3Ryb3koKVxyXG4gICAgdGhpcy50aXAgJiYgdGhpcy50aXAuZGVzdHJveSgpXHJcbiAgICB0aGlzLmxhYmVsICYmIHRoaXMubGFiZWwucmVtb3ZlKClcclxuICAgIHRoaXMuZW50aXR5ICYmIHRoaXMuc2RrLnZpZXdlci5lbnRpdGllcy5yZW1vdmUodGhpcy5lbnRpdHkpXHJcbiAgICB0aGlzLmVudGl0eSA9IG51bGxcclxuICAgIGlmICh0aGlzLl9EaWFsb2dPYmplY3QgJiYgIXRoaXMuX0RpYWxvZ09iamVjdC5pc0Rlc3Ryb3kpIHtcclxuICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0LmNsb3NlKClcclxuICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0ID0gbnVsbFxyXG4gICAgfVxyXG4gICAgYXdhaXQgdGhpcy5zZGsucmVtb3ZlSW5jZXRhbmNlKHRoaXMub3B0aW9ucy5pZClcclxuICAgIGF3YWl0IHN5bmNEYXRhKHRoaXMuc2RrLCB0aGlzLm9wdGlvbnMuaWQpXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiDpo57liLBcclxuICAqL1xyXG4gIGFzeW5jIGZseVRvKG9wdGlvbnMgPSB7fSkge1xyXG4gICAgaWYgKHRoaXMuX2Vycm9yKSB7XHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG4gICAgc2V0QWN0aXZlVmlld2VyKDApXHJcbiAgICBjbG9zZVJvdGF0ZUFyb3VuZCh0aGlzLnNkaylcclxuICAgIGNsb3NlVmlld0ZvbGxvdyh0aGlzLnNkaylcclxuXHJcbiAgICBpZiAodGhpcy5vcHRpb25zLmN1c3RvbVZpZXcgJiYgdGhpcy5vcHRpb25zLmN1c3RvbVZpZXcucmVsYXRpdmVQb3NpdGlvbiAmJiB0aGlzLm9wdGlvbnMuY3VzdG9tVmlldy5vcmllbnRhdGlvbikge1xyXG4gICAgICBsZXQgb3JpZW50YXRpb24gPSB7XHJcbiAgICAgICAgaGVhZGluZzogQ2VzaXVtLk1hdGgudG9SYWRpYW5zKHRoaXMub3B0aW9ucy5jdXN0b21WaWV3Lm9yaWVudGF0aW9uLmhlYWRpbmcgfHwgMC4wKSxcclxuICAgICAgICBwaXRjaDogQ2VzaXVtLk1hdGgudG9SYWRpYW5zKHRoaXMub3B0aW9ucy5jdXN0b21WaWV3Lm9yaWVudGF0aW9uLnBpdGNoIHx8IC02MC4wKSxcclxuICAgICAgICByb2xsOiBDZXNpdW0uTWF0aC50b1JhZGlhbnModGhpcy5vcHRpb25zLmN1c3RvbVZpZXcub3JpZW50YXRpb24ucm9sbCB8fCAwLjApXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBsbmcgPSB0aGlzLm9wdGlvbnMuY3VzdG9tVmlldy5yZWxhdGl2ZVBvc2l0aW9uLmxuZ1xyXG4gICAgICBsZXQgbGF0ID0gdGhpcy5vcHRpb25zLmN1c3RvbVZpZXcucmVsYXRpdmVQb3NpdGlvbi5sYXRcclxuICAgICAgbGV0IGFsdCA9IHRoaXMub3B0aW9ucy5jdXN0b21WaWV3LnJlbGF0aXZlUG9zaXRpb24uYWx0XHJcbiAgICAgIGxldCBkZXN0aW5hdGlvbiA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzKGxuZywgbGF0LCBhbHQpXHJcblxyXG4gICAgICBsZXQgcG9zaXRpb24gPSB7IGxuZzogMCwgbGF0OiAwIH1cclxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5wb3NpdGlvbikge1xyXG4gICAgICAgIHBvc2l0aW9uID0geyAuLi50aGlzLm9wdGlvbnMucG9zaXRpb24gfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKHRoaXMub3B0aW9ucy5wb3NpdGlvbnMpIHtcclxuICAgICAgICBwb3NpdGlvbiA9IHsgLi4udGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXSB9XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAodGhpcy5vcHRpb25zLmNlbnRlcikge1xyXG4gICAgICAgIHBvc2l0aW9uID0geyAuLi50aGlzLm9wdGlvbnMuY2VudGVyIH1cclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmICh0aGlzLm9wdGlvbnMuc3RhcnQpIHtcclxuICAgICAgICBwb3NpdGlvbiA9IHsgLi4udGhpcy5vcHRpb25zLnN0YXJ0IH1cclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmhhc093blByb3BlcnR5KCdsbmcnKSkge1xyXG4gICAgICAgICAgcG9zaXRpb24ubG5nID0gdGhpcy5vcHRpb25zLmxuZ1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmhhc093blByb3BlcnR5KCdsYXQnKSkge1xyXG4gICAgICAgICAgcG9zaXRpb24ubGF0ID0gdGhpcy5vcHRpb25zLmxhdFxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmhhc093blByb3BlcnR5KCdhbHQnKSkge1xyXG4gICAgICAgICAgcG9zaXRpb24uYWx0ID0gdGhpcy5vcHRpb25zLmFsdFxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICAvLyDlpoLmnpzmsqHmnInpq5jluqblgLzvvIzliJnojrflj5bntKfotLTpq5jluqborqHnrpdcclxuICAgICAgaWYgKCFwb3NpdGlvbi5oYXNPd25Qcm9wZXJ0eSgnYWx0JykpIHtcclxuICAgICAgICBwb3NpdGlvbi5hbHQgPSBhd2FpdCB0aGlzLmdldENsYW1wVG9IZWlnaHQocG9zaXRpb24pXHJcbiAgICAgIH1cclxuICAgICAgbG5nID0gdGhpcy5vcHRpb25zLmN1c3RvbVZpZXcucmVsYXRpdmVQb3NpdGlvbi5sbmcgKyBwb3NpdGlvbi5sbmdcclxuICAgICAgbGF0ID0gdGhpcy5vcHRpb25zLmN1c3RvbVZpZXcucmVsYXRpdmVQb3NpdGlvbi5sYXQgKyBwb3NpdGlvbi5sYXRcclxuICAgICAgYWx0ID0gdGhpcy5vcHRpb25zLmN1c3RvbVZpZXcucmVsYXRpdmVQb3NpdGlvbi5hbHQgKyBwb3NpdGlvbi5hbHRcclxuICAgICAgZGVzdGluYXRpb24gPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlcyhsbmcsIGxhdCwgYWx0KVxyXG4gICAgICB0aGlzLnNkay52aWV3ZXIuY2FtZXJhLmZseVRvKHtcclxuICAgICAgICBkZXN0aW5hdGlvbjogZGVzdGluYXRpb24sXHJcbiAgICAgICAgb3JpZW50YXRpb246IG9yaWVudGF0aW9uXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgbGV0IHBvc2l0aW9uQXJyYXkgPSBbXVxyXG4gICAgICBsZXQgZ3JvdW5kXHJcbiAgICAgIHN3aXRjaCAodGhpcy5oZWlnaHRNb2RlKSB7XHJcbiAgICAgICAgY2FzZSAwOlxyXG4gICAgICAgIGNhc2UgJzAnOlxyXG4gICAgICAgICAgZ3JvdW5kID0gZmFsc2VcclxuICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgY2FzZSAxOlxyXG4gICAgICAgIGNhc2UgJzEnOlxyXG4gICAgICAgICAgZ3JvdW5kID0gZmFsc2VcclxuICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgY2FzZSAyOlxyXG4gICAgICAgIGNhc2UgJzInOlxyXG4gICAgICAgICAgZ3JvdW5kID0gdHJ1ZVxyXG4gICAgICAgICAgYnJlYWtcclxuICAgICAgfVxyXG4gICAgICBpZiAoZ3JvdW5kKSB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm9wdGlvbnMucG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBsZXQgaGVpZ2h0ID0gYXdhaXQgdGhpcy5nZXRDbGFtcFRvSGVpZ2h0KHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0pXHJcbiAgICAgICAgICBsZXQgYSA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzKFxyXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxuZyxcclxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sYXQsXHJcbiAgICAgICAgICAgIGhlaWdodFxyXG4gICAgICAgICAgKVxyXG4gICAgICAgICAgcG9zaXRpb25BcnJheS5wdXNoKGEueCwgYS55LCBhLnopXHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlmICh0aGlzLnBvc2l0aW9uc0gpIHtcclxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5wb3NpdGlvbnNILmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHBvc2l0aW9uQXJyYXkucHVzaCh0aGlzLnBvc2l0aW9uc0hbaV0ueCwgdGhpcy5wb3NpdGlvbnNIW2ldLnksIHRoaXMucG9zaXRpb25zSFtpXS56KVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBsZXQgQm91bmRpbmdTcGhlcmUgPSBDZXNpdW0uQm91bmRpbmdTcGhlcmUuZnJvbVZlcnRpY2VzKHBvc2l0aW9uQXJyYXkpXHJcbiAgICAgIHRoaXMuc2RrLnZpZXdlci5jYW1lcmEuZmx5VG9Cb3VuZGluZ1NwaGVyZShCb3VuZGluZ1NwaGVyZSwge1xyXG4gICAgICAgIG9mZnNldDogb3B0aW9ucy5vcmllbnRhdGlvbiB8fCB7XHJcbiAgICAgICAgICBoZWFkaW5nOiBDZXNpdW0uTWF0aC50b1JhZGlhbnMoMC4wKSxcclxuICAgICAgICAgIHBpdGNoOiBDZXNpdW0uTWF0aC50b1JhZGlhbnMoLTkwLjApLFxyXG4gICAgICAgICAgcm9sbDogQ2VzaXVtLk1hdGgudG9SYWRpYW5zKDAuMClcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiDmiZPlvIDlr4zmlofmnKzmoYZcclxuICAgKi9cclxuICBvcGVuUmljaFRleHRFZGl0b3IoZSkge1xyXG4gICAgcmljaFRleHQub3Blbih0aGlzLm9wdGlvbnMuaWQsIHRoaXMub3B0aW9ucy5uYW1lLCB0aGlzLm9wdGlvbnMucmljaFRleHRDb250ZW50KVxyXG4gICAgcmljaFRleHQucHJpbWFyeUNhbGxCYWNrID0gKGNvbnRlbnQpID0+IHtcclxuICAgICAgdGhpcy5vcHRpb25zLnJpY2hUZXh0Q29udGVudCA9IGNvbnRlbnRcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKkBkZXNjIOaJk+W8gOW5s+enu+WKn+iDvVxyXG4gICAqXHJcbiAgICogQG1lbWJlck9mIFNvdXJjZVxyXG4gICAqIEBwYXJhbSBzdGF0dXMge2Jvb2xlYW59XHJcbiAgICpcclxuICAgKiAqL1xyXG4gIHNldCBwb3NpdGlvbkVkaXRpbmcoc3RhdHVzKSB7XHJcbiAgICBpZiAoWUouTWVhc3VyZS5HZXRNZWFzdXJlU3RhdHVzKCkgfHwgIXRoaXMuc2RrIHx8ICF0aGlzLnNkay52aWV3ZXIgfHwgIXRoaXMuZW50aXR5KSB7XHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG4gICAgdGhpcy5yZW1vdmVBbmltYXRlKClcclxuICAgIGxldCBfdGhpcyA9IHRoaXNcclxuICAgIHRoaXMuZXZlbnQgJiYgdGhpcy5ldmVudC5kZXN0cm95KClcclxuICAgIHRoaXMuZXZlbnQgPSBuZXcgTW91c2VFdmVudCh0aGlzLnNkaylcclxuICAgIHRoaXMub3BlcmF0ZS5wb3NpdGlvbkVkaXRpbmcgPSBzdGF0dXNcclxuICAgIGlmIChzdGF0dXMgPT09IHRydWUpIHtcclxuICAgICAgdGhpcy5wcmV2aW91cyA9IHtcclxuICAgICAgICBwb3NpdGlvbnM6IFsuLi50aGlzLnBvc2l0aW9uc11cclxuICAgICAgfVxyXG4gICAgICB0aGlzLnRpcCAmJiB0aGlzLnRpcC5kZXN0cm95KClcclxuICAgICAgdGhpcy50aXAgPSBuZXcgTW91c2VUaXAoJ+eCueWHu+m8oOagh+W3pumUruehruiupO+8jOWPs+mUruWPlua2iCcsIHRoaXMuc2RrKVxyXG4gICAgICB0aGlzLmxhYmVsICYmICh0aGlzLmxhYmVsLmVudGl0eS5iaWxsYm9hcmQuY29sb3IgPSBDZXNpdW0uQ29sb3IuZnJvbUNzc0NvbG9yU3RyaW5nKGByZ2JhKDI1NSwyNTUsMjU1LDAuOSlgKSlcclxuICAgICAgdGhpcy5waWNraW5nID0gZmFsc2VcclxuICAgICAgbGV0IGFycmF5ID0gW11cclxuICAgICAgbGV0IHBvc2l0aW9ucyA9IFsuLi50aGlzLnBvc2l0aW9uc11cclxuICAgICAgbGV0IGRpc3Bhcml0eSA9IFtdXHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgbGV0IHBvc2l0aW9uID0gdGhpcy5jYXJ0ZXNpYW4zVG93Z3M4NChwb3NpdGlvbnNbaV0sIHRoaXMuc2RrLnZpZXdlcilcclxuICAgICAgICBhcnJheS5wdXNoKFtwb3NpdGlvbi5sbmcsIHBvc2l0aW9uLmxhdF0pXHJcbiAgICAgIH1cclxuICAgICAgbGV0IGZpcnN0cG9zaXRpb24gPSB0aGlzLmNhcnRlc2lhbjNUb3dnczg0KHBvc2l0aW9uc1swXSwgdGhpcy5zZGsudmlld2VyKVxyXG4gICAgICBhcnJheS5wdXNoKFtmaXJzdHBvc2l0aW9uLmxuZywgZmlyc3Rwb3NpdGlvbi5sYXRdKVxyXG4gICAgICB2YXIgcG9seWdvbiA9IHR1cmYucG9seWdvbihbYXJyYXldKTtcclxuICAgICAgdmFyIGNlbnRyb2lkID0gdHVyZi5jZW50cm9pZChwb2x5Z29uKTtcclxuICAgICAgbGV0IGNlbnRlciA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzKC4uLmNlbnRyb2lkLmdlb21ldHJ5LmNvb3JkaW5hdGVzKVxyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGNlbnRlci54IC0gcG9zaXRpb25zW2ldLnhcclxuICAgICAgICBkaXNwYXJpdHkucHVzaCh7XHJcbiAgICAgICAgICB4OiBjZW50ZXIueCAtIHBvc2l0aW9uc1tpXS54LFxyXG4gICAgICAgICAgeTogY2VudGVyLnkgLSBwb3NpdGlvbnNbaV0ueSxcclxuICAgICAgICAgIHo6IGNlbnRlci56IC0gcG9zaXRpb25zW2ldLnosXHJcbiAgICAgICAgfSlcclxuICAgICAgfVxyXG4gICAgICBsZXQgbmV3cG9zaXRpb25zID0gW11cclxuICAgICAgdGhpcy5ldmVudC5tb3VzZV9tb3ZlKChtb3ZlbWVudCwgY2FydGVzaWFuKSA9PiB7XHJcbiAgICAgICAgbmV3cG9zaXRpb25zID0gW11cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRpc3Bhcml0eS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgbmV3cG9zaXRpb25zLnB1c2goe1xyXG4gICAgICAgICAgICB4OiBjYXJ0ZXNpYW4ueCAtIGRpc3Bhcml0eVtpXS54LFxyXG4gICAgICAgICAgICB5OiBjYXJ0ZXNpYW4ueSAtIGRpc3Bhcml0eVtpXS55LFxyXG4gICAgICAgICAgICB6OiBjYXJ0ZXNpYW4ueiAtIGRpc3Bhcml0eVtpXS56LFxyXG4gICAgICAgICAgfSlcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy50aXAuc2V0UG9zaXRpb24oXHJcbiAgICAgICAgICBjYXJ0ZXNpYW4sXHJcbiAgICAgICAgICBtb3ZlbWVudC5lbmRQb3NpdGlvbi54LFxyXG4gICAgICAgICAgbW92ZW1lbnQuZW5kUG9zaXRpb24ueVxyXG4gICAgICAgIClcclxuICAgICAgfSlcclxuICAgICAgdGhpcy5ldmVudC5tb3VzZV9sZWZ0KChtb3ZlbWVudCwgY2FydGVzaWFuKSA9PiB7XHJcbiAgICAgICAgdGhpcy5ldmVudC5tb3VzZV9tb3ZlKCgpID0+IHsgfSlcclxuICAgICAgICB0aGlzLmV2ZW50Lm1vdXNlX2xlZnQoKCkgPT4geyB9KVxyXG4gICAgICAgIHRoaXMuZXZlbnQubW91c2VfcmlnaHQoKCkgPT4geyB9KVxyXG4gICAgICAgIHRoaXMuZXZlbnQuZ2VzdHVyZV9waW5ja19zdGFydCgoKSA9PiB7IH0pXHJcbiAgICAgICAgbmV3cG9zaXRpb25zID0gW11cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRpc3Bhcml0eS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgbGV0IHBvczMgPSB7XHJcbiAgICAgICAgICAgIHg6IGNhcnRlc2lhbi54IC0gZGlzcGFyaXR5W2ldLngsXHJcbiAgICAgICAgICAgIHk6IGNhcnRlc2lhbi55IC0gZGlzcGFyaXR5W2ldLnksXHJcbiAgICAgICAgICAgIHo6IGNhcnRlc2lhbi56IC0gZGlzcGFyaXR5W2ldLnosXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBuZXdwb3NpdGlvbnMucHVzaChwb3MzKVxyXG4gICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXSA9IHRoaXMuY2FydGVzaWFuM1Rvd2dzODQocG9zMywgdGhpcy5zZGsudmlld2VyKVxyXG4gICAgICAgICAgaWYgKHRoaXMuX2VsbXMubG5nICYmIHRoaXMuX2VsbXMubG5nW2ldKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2VsbXMubG5nW2ldLmlubmVySFRNTCA9IHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubG5nLnRvRml4ZWQoOClcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmICh0aGlzLl9lbG1zLmxhdCAmJiB0aGlzLl9lbG1zLmxhdFtpXSkge1xyXG4gICAgICAgICAgICB0aGlzLl9lbG1zLmxhdFtpXS5pbm5lckhUTUwgPSB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxhdC50b0ZpeGVkKDgpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMucG9zaXRpb25zID0gbmV3cG9zaXRpb25zXHJcbiAgICAgICAgdGhpcy5wcmV2aW91cyA9IHtcclxuICAgICAgICAgIHBvc2l0aW9uczogWy4uLnRoaXMucG9zaXRpb25zXVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnBvc2l0aW9uRWRpdGluZyA9IGZhbHNlXHJcblxyXG4gICAgICAgIGlmKHRoaXMuX3Bvc2l0aW9uRWRpdGluZ0NhbGxiYWNrKSB7XHJcbiAgICAgICAgICB0aGlzLl9wb3NpdGlvbkVkaXRpbmdDYWxsYmFjaygpXHJcbiAgICAgICAgICB0aGlzLl9wb3NpdGlvbkVkaXRpbmdDYWxsYmFjayA9IG51bGxcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICAgIHRoaXMuZXZlbnQubW91c2VfcmlnaHQoKG1vdmVtZW50LCBjYXJ0ZXNpYW4pID0+IHtcclxuICAgICAgICB0aGlzLnBvc2l0aW9uRWRpdGluZyA9IGZhbHNlXHJcbiAgICAgIH0pXHJcblxyXG4gICAgICB0aGlzLmV2ZW50Lmdlc3R1cmVfcGluY2tfc3RhcnQoKG1vdmVtZW50LCBjYXJ0ZXNpYW4pID0+IHtcclxuICAgICAgICBsZXQgc3RhcnRUaW1lID0gbmV3IERhdGUoKVxyXG4gICAgICAgIHRoaXMuZXZlbnQuZ2VzdHVyZV9waW5ja19lbmQoKCkgPT4ge1xyXG4gICAgICAgICAgbGV0IGVuZFRpbWUgPSBuZXcgRGF0ZSgpXHJcbiAgICAgICAgICBpZiAoZW5kVGltZSAtIHN0YXJ0VGltZSA+PSA1MDApIHtcclxuICAgICAgICAgICAgLy8g6ZW/5oyJ5Y+W5raIXHJcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb25FZGl0aW5nID0gZmFsc2VcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmV2ZW50Lm1vdXNlX21vdmUoKCkgPT4geyB9KVxyXG4gICAgICAgICAgICB0aGlzLmV2ZW50Lm1vdXNlX2xlZnQoKCkgPT4geyB9KVxyXG4gICAgICAgICAgICB0aGlzLmV2ZW50Lm1vdXNlX3JpZ2h0KCgpID0+IHsgfSlcclxuICAgICAgICAgICAgdGhpcy5ldmVudC5nZXN0dXJlX3BpbmNrX3N0YXJ0KCgpID0+IHsgfSlcclxuICAgICAgICAgICAgbmV3cG9zaXRpb25zID0gW11cclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkaXNwYXJpdHkubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICBsZXQgcG9zMyA9IHtcclxuICAgICAgICAgICAgICAgIHg6IGNhcnRlc2lhbi54IC0gZGlzcGFyaXR5W2ldLngsXHJcbiAgICAgICAgICAgICAgICB5OiBjYXJ0ZXNpYW4ueSAtIGRpc3Bhcml0eVtpXS55LFxyXG4gICAgICAgICAgICAgICAgejogY2FydGVzaWFuLnogLSBkaXNwYXJpdHlbaV0ueixcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgbmV3cG9zaXRpb25zLnB1c2gocG9zMylcclxuICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldID0gdGhpcy5jYXJ0ZXNpYW4zVG93Z3M4NChwb3MzLCB0aGlzLnNkay52aWV3ZXIpXHJcbiAgICAgICAgICAgICAgaWYgKHRoaXMuX2VsbXMubG5nICYmIHRoaXMuX2VsbXMubG5nW2ldKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9lbG1zLmxuZ1tpXS5pbm5lckhUTUwgPSB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxuZy50b0ZpeGVkKDgpXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGlmICh0aGlzLl9lbG1zLmxhdCAmJiB0aGlzLl9lbG1zLmxhdFtpXSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZWxtcy5sYXRbaV0uaW5uZXJIVE1MID0gdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sYXQudG9GaXhlZCg4KVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9ucyA9IG5ld3Bvc2l0aW9uc1xyXG4gICAgICAgICAgICB0aGlzLnByZXZpb3VzID0ge1xyXG4gICAgICAgICAgICAgIHBvc2l0aW9uczogWy4uLnRoaXMucG9zaXRpb25zXVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb25FZGl0aW5nID0gZmFsc2VcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgICB9KVxyXG5cclxuICAgICAgdGhpcy5lbnRpdHkucG9seWdvbi5oaWVyYXJjaHkgPSBuZXcgQ2VzaXVtLkNhbGxiYWNrUHJvcGVydHkoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGxldCBwb3NpdGlvbjg0ID0gW11cclxuICAgICAgICBpZiAobmV3cG9zaXRpb25zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmV3cG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHBvc2l0aW9uODQucHVzaChfdGhpcy5jYXJ0ZXNpYW4zVG93Z3M4NChuZXdwb3NpdGlvbnNbaV0sIF90aGlzLnNkay52aWV3ZXIpKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHBvc2l0aW9uODQucHVzaChfdGhpcy5jYXJ0ZXNpYW4zVG93Z3M4NChwb3NpdGlvbnNbaV0sIF90aGlzLnNkay52aWV3ZXIpKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBfdGhpcy5yZW5ld1Bvc2l0aW9ucyhwb3NpdGlvbjg0KVxyXG4gICAgICAgIHJldHVybiBuZXcgQ2VzaXVtLlBvbHlnb25IaWVyYXJjaHkoX3RoaXMucG9zaXRpb25zSClcclxuICAgICAgfSwgZmFsc2UpXHJcbiAgICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLnBvc2l0aW9ucyA9IG5ldyBDZXNpdW0uQ2FsbGJhY2tQcm9wZXJ0eShmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgcmV0dXJuIFsuLi5fdGhpcy5wb3NpdGlvbnNILCBfdGhpcy5wb3NpdGlvbnNIWzBdLCBfdGhpcy5wb3NpdGlvbnNIWzFdXVxyXG4gICAgICB9LCBmYWxzZSlcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBpZiAodGhpcy5sYWJlbCAmJiB0aGlzLmxhYmVsLmVudGl0eSAmJiB0aGlzLmxhYmVsLmVudGl0eS5iaWxsYm9hcmQpIHtcclxuICAgICAgICB0aGlzLmxhYmVsLmVudGl0eS5iaWxsYm9hcmQuY29sb3IgPSBDZXNpdW0uQ29sb3IuZnJvbUNzc0NvbG9yU3RyaW5nKGByZ2JhKDI1NSwyNTUsMjU1LDEpYClcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnBpY2tpbmcgPSB0cnVlXHJcbiAgICAgIGlmICh0aGlzLmV2ZW50KSB7XHJcbiAgICAgICAgdGhpcy5ldmVudC5tb3VzZV9tb3ZlKCgpID0+IHsgfSlcclxuICAgICAgICB0aGlzLmV2ZW50Lm1vdXNlX2xlZnQoKCkgPT4geyB9KVxyXG4gICAgICAgIHRoaXMuZXZlbnQubW91c2VfcmlnaHQoKCkgPT4geyB9KVxyXG4gICAgICAgIHRoaXMuZXZlbnQuZ2VzdHVyZV9waW5ja19zdGFydCgoKSA9PiB7IH0pXHJcbiAgICAgICAgdGhpcy5ldmVudC5kZXN0cm95KClcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnRpcCAmJiB0aGlzLnRpcC5kZXN0cm95KClcclxuXHJcbiAgICAgIGlmICghdGhpcy5wcmV2aW91cykge1xyXG4gICAgICAgIHRoaXMucHJldmlvdXMgPSB7XHJcbiAgICAgICAgICBwb3NpdGlvbnM6IFsuLi50aGlzLnBvc2l0aW9uc11cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdGhpcy5wb3NpdGlvbnMgPSBbLi4udGhpcy5wcmV2aW91cy5wb3NpdGlvbnNdXHJcbiAgICAgIH1cclxuICAgICAgbGV0IHBvc2l0aW9uODQgPSBbXVxyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgcG9zaXRpb244NC5wdXNoKHRoaXMuY2FydGVzaWFuM1Rvd2dzODQodGhpcy5wb3NpdGlvbnNbaV0sIHRoaXMuc2RrLnZpZXdlcikpXHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5yZW5ld1Bvc2l0aW9ucyhwb3NpdGlvbjg0KVxyXG5cclxuICAgICAgdGhpcy5lbnRpdHkucG9seWdvbi5oaWVyYXJjaHkgPSBuZXcgQ2VzaXVtLkNhbGxiYWNrUHJvcGVydHkoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHJldHVybiBuZXcgQ2VzaXVtLlBvbHlnb25IaWVyYXJjaHkoX3RoaXMucG9zaXRpb25zSClcclxuICAgICAgfSwgdHJ1ZSlcclxuICAgICAgdGhpcy5lbnRpdHkucG9seWxpbmUucG9zaXRpb25zID0gbmV3IENlc2l1bS5DYWxsYmFja1Byb3BlcnR5KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICByZXR1cm4gWy4uLl90aGlzLnBvc2l0aW9uc0gsIF90aGlzLnBvc2l0aW9uc0hbMF0sIF90aGlzLnBvc2l0aW9uc0hbMV1dXHJcbiAgICAgIH0sIHRydWUpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgcG9zaXRpb25FZGl0aW5nKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3BlcmF0ZS5wb3NpdGlvbkVkaXRpbmdcclxuICB9XHJcbiAgb3BlblBvc2l0aW9uRWRpdGluZyhjZCkge1xyXG4gICAgdGhpcy5wb3NpdGlvbkVkaXRpbmcgPSB0cnVlXHJcbiAgICB0aGlzLl9wb3NpdGlvbkVkaXRpbmdDYWxsYmFjayA9IGNkXHJcbiAgfVxyXG4gIGdldCBhcmVhQ2hhbmdlQ2FsbEJhY2soKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fYXJlYUNoYW5nZUNhbGxCYWNrXHJcbiAgfVxyXG5cclxuICBzZXQgYXJlYUNoYW5nZUNhbGxCYWNrIChjZCkge1xyXG4gICAgdGhpcy5fYXJlYUNoYW5nZUNhbGxCYWNrID0gY2RcclxuICB9XHJcblxyXG5cclxuICBub2RlRWRpdChjYiA9ICgpID0+IHsgfSkge1xyXG4gICAgdGhpcy5wb3NpdGlvbkVkaXRpbmcgPSBmYWxzZVxyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIGlmIChZSi5NZWFzdXJlLkdldE1lYXN1cmVTdGF0dXMoKSkge1xyXG4gICAgICAgIGNiKCfkuIrkuIDmrKHmtYvph4/mnKrnu5PmnZ8nKVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMucmVtb3ZlQW5pbWF0ZSgpXHJcbiAgICAgICAgbGV0IF90aGlzID0gdGhpc1xyXG4gICAgICAgIFlKLk1lYXN1cmUuU2V0TWVhc3VyZVN0YXR1cyh0cnVlKVxyXG4gICAgICAgIHRoaXMudGlwID0gbmV3IE1vdXNlVGlwKCfor7fpgInmi6nkuIDkuKrpobbngrnvvIzlj7PplK7lj5bmtognLCB0aGlzLnNkaylcclxuICAgICAgICB0aGlzLmV2ZW50ID0gbmV3IE1vdXNlRXZlbnQodGhpcy5zZGspXHJcbiAgICAgICAgdGhpcy5ub2RlUG9pbnRzID0gW11cclxuICAgICAgICBsZXQgc2VsZWN0UG9pbnRcclxuICAgICAgICBsZXQgb3JpZ2luYWxQb3NpdGlvblxyXG4gICAgICAgIGxldCBvcHRpb25zUG9zaXRpb25zID0gWy4uLnRoaXMub3B0aW9ucy5wb3NpdGlvbnNdXHJcblxyXG4gICAgICAgIGxldCBsZWZ0RXZlbnQgPSAobW92ZW1lbnQsIGNhcnRlc2lhbikgPT4ge1xyXG4gICAgICAgICAgaWYgKHNlbGVjdFBvaW50KSB7XHJcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbc2VsZWN0UG9pbnQuaW5kZXhdID0gdGhpcy5jYXJ0ZXNpYW4zVG93Z3M4NChjYXJ0ZXNpYW4sIHRoaXMuc2RrLnZpZXdlcilcclxuICAgICAgICAgICAgb3B0aW9uc1Bvc2l0aW9uc1tzZWxlY3RQb2ludC5pbmRleF0gPSB0aGlzLm9wdGlvbnMucG9zaXRpb25zW3NlbGVjdFBvaW50LmluZGV4XVxyXG4gICAgICAgICAgICBsZXQgaW5kZXggPSBzZWxlY3RQb2ludC5pbmRleFxyXG4gICAgICAgICAgICBsZXQgZW50aXR5ID0gdGhpcy5zZGsudmlld2VyLmVudGl0aWVzLmFkZCh7XHJcbiAgICAgICAgICAgICAgbmFtZTogJ25vZGUtc2Vjb25kYXJ5LWVkaXQtcG9pbnQnLFxyXG4gICAgICAgICAgICAgIGluZGV4OiBpbmRleCxcclxuICAgICAgICAgICAgICBwb3NpdGlvbjogQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXMob3B0aW9uc1Bvc2l0aW9uc1tzZWxlY3RQb2ludC5pbmRleF0ubG5nLCBvcHRpb25zUG9zaXRpb25zW3NlbGVjdFBvaW50LmluZGV4XS5sYXQsIG9wdGlvbnNQb3NpdGlvbnNbc2VsZWN0UG9pbnQuaW5kZXhdLmFsdCksXHJcbiAgICAgICAgICAgICAgYmlsbGJvYXJkOiB7XHJcbiAgICAgICAgICAgICAgICBpbWFnZTogdGhpcy5nZXRTb3VyY2VSb290UGF0aCgpICsgJy9pbWcvcG9pbnQucG5nJyxcclxuICAgICAgICAgICAgICAgIHdpZHRoOiAxNSxcclxuICAgICAgICAgICAgICAgIGhlaWdodDogMTUsXHJcbiAgICAgICAgICAgICAgICBkaXNhYmxlRGVwdGhUZXN0RGlzdGFuY2U6IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSxcclxuICAgICAgICAgICAgICAgIGNvbG9yOiBDZXNpdW0uQ29sb3IuV0hJVEUud2l0aEFscGhhKDAuOTkpXHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgdGhpcy5ub2RlUG9pbnRzLnNwbGljZShzZWxlY3RQb2ludC5pbmRleCwgMCwgZW50aXR5KVxyXG4gICAgICAgICAgICBzZWxlY3RQb2ludCA9IG51bGxcclxuICAgICAgICAgICAgdGhpcy50aXAuc2V0X3RleHQoJ+ivt+mAieaLqeS4gOS4qumhtueCue+8jOWPs+mUruWPlua2iCcpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdmFyIHBpY2sgPSB0aGlzLnNkay52aWV3ZXIuc2NlbmUucGljayhtb3ZlbWVudC5wb3NpdGlvbik7XHJcbiAgICAgICAgICAgIGlmIChwaWNrICYmIHBpY2suaWQgJiYgcGljay5pZC5uYW1lICYmIHBpY2suaWQubmFtZSA9PT0gJ25vZGUtc2Vjb25kYXJ5LWVkaXQtcG9pbnQnKSB7XHJcbiAgICAgICAgICAgICAgc2VsZWN0UG9pbnQgPSBwaWNrLmlkXHJcbiAgICAgICAgICAgICAgb3JpZ2luYWxQb3NpdGlvbiA9IHRoaXMuY2FydGVzaWFuM1Rvd2dzODQocGljay5pZC5wb3NpdGlvbi5nZXRWYWx1ZSgpLCB0aGlzLnNkay52aWV3ZXIpXHJcbiAgICAgICAgICAgICAgdGhpcy5ub2RlUG9pbnRzLnNwbGljZShwaWNrLmlkLmluZGV4LCAxKVxyXG4gICAgICAgICAgICAgIHRoaXMuc2RrLnZpZXdlci5lbnRpdGllcy5yZW1vdmUocGljay5pZClcclxuICAgICAgICAgICAgICB0aGlzLnRpcC5zZXRfdGV4dCgn5bem6ZSu56Gu5a6a77yM5Y+z6ZSu5Y+W5raIJylcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5yZW5ld1Bvc2l0aW9ucygpXHJcbiAgICAgICAgICB0aGlzLnRpcC5zZXRQb3NpdGlvbihcclxuICAgICAgICAgICAgY2FydGVzaWFuLFxyXG4gICAgICAgICAgICBtb3ZlbWVudC5wb3NpdGlvbi54LFxyXG4gICAgICAgICAgICBtb3ZlbWVudC5wb3NpdGlvbi55XHJcbiAgICAgICAgICApXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCByaWdodEV2ZW50ID0gKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5ldmVudC5tb3VzZV9tb3ZlKCgpID0+IHsgfSlcclxuICAgICAgICAgIHRoaXMuZXZlbnQubW91c2VfbGVmdCgoKSA9PiB7IH0pXHJcbiAgICAgICAgICB0aGlzLmV2ZW50Lm1vdXNlX3JpZ2h0KCgpID0+IHsgfSlcclxuICAgICAgICAgIHRoaXMuZXZlbnQuZ2VzdHVyZV9waW5ja19zdGFydCgoKSA9PiB7IH0pXHJcbiAgICAgICAgICBpZiAoc2VsZWN0UG9pbnQpIHtcclxuICAgICAgICAgICAgb3B0aW9uc1Bvc2l0aW9uc1tzZWxlY3RQb2ludC5pbmRleF0gPSBvcmlnaW5hbFBvc2l0aW9uXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9lbG1zLmxuZyAmJiB0aGlzLl9lbG1zLmxuZ1tzZWxlY3RQb2ludC5pbmRleF0pIHtcclxuICAgICAgICAgICAgICB0aGlzLl9lbG1zLmxuZ1tzZWxlY3RQb2ludC5pbmRleF0uaW5uZXJIVE1MID0gdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tzZWxlY3RQb2ludC5pbmRleF0ubG5nLnRvRml4ZWQoOClcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodGhpcy5fZWxtcy5sYXQgJiYgdGhpcy5fZWxtcy5sYXRbc2VsZWN0UG9pbnQuaW5kZXhdKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5fZWxtcy5sYXRbc2VsZWN0UG9pbnQuaW5kZXhdLmlubmVySFRNTCA9IHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbc2VsZWN0UG9pbnQuaW5kZXhdLmxhdC50b0ZpeGVkKDgpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2IobnVsbCwgb3B0aW9uc1Bvc2l0aW9ucylcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnMgPSBbLi4ub3B0aW9uc1Bvc2l0aW9uc11cclxuICAgICAgICAgIHRoaXMuaGVpZ2h0TW9kZSA9IHRoaXMuaGVpZ2h0TW9kZVxyXG4gICAgICAgICAgdGhpcy5wcmV2aW91cyA9IG51bGxcclxuICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICB0aGlzLmVudGl0eS5wb2x5bGluZS5jbGFtcFRvR3JvdW5kID0gdHJ1ZVxyXG4gICAgICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLmFyY1R5cGUgPSBDZXNpdW0uQXJjVHlwZS5HRU9ERVNJQ1xyXG4gICAgICAgIHRoaXMuZW50aXR5LnBvbHlnb24ucGVyUG9zaXRpb25IZWlnaHQgPSBmYWxzZVxyXG4gICAgICAgIHRoaXMuZW50aXR5LnBvbHlnb24uaGllcmFyY2h5ID0gbmV3IENlc2l1bS5DYWxsYmFja1Byb3BlcnR5KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgIHJldHVybiBuZXcgQ2VzaXVtLlBvbHlnb25IaWVyYXJjaHkoX3RoaXMucG9zaXRpb25zSClcclxuICAgICAgICB9LCBmYWxzZSlcclxuICAgICAgICB0aGlzLmVudGl0eS5wb2x5bGluZS5wb3NpdGlvbnMgPSBuZXcgQ2VzaXVtLkNhbGxiYWNrUHJvcGVydHkoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgcmV0dXJuIFsuLi5fdGhpcy5wb3NpdGlvbnNILCBfdGhpcy5wb3NpdGlvbnNIWzBdLCBfdGhpcy5wb3NpdGlvbnNIWzFdXVxyXG4gICAgICAgIH0sIGZhbHNlKVxyXG5cclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgIHRoaXMuZXZlbnQubW91c2VfbGVmdChsZWZ0RXZlbnQpXHJcblxyXG4gICAgICAgICAgdGhpcy5ldmVudC5tb3VzZV9yaWdodChyaWdodEV2ZW50KVxyXG5cclxuICAgICAgICAgIHRoaXMuZXZlbnQubW91c2VfbW92ZSgobW92ZW1lbnQsIGNhcnRlc2lhbikgPT4ge1xyXG4gICAgICAgICAgICBpZiAoc2VsZWN0UG9pbnQpIHtcclxuICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zW3NlbGVjdFBvaW50LmluZGV4XSA9IHRoaXMuY2FydGVzaWFuM1Rvd2dzODQoY2FydGVzaWFuLCB0aGlzLnNkay52aWV3ZXIpXHJcbiAgICAgICAgICAgICAgdGhpcy5yZW5ld1Bvc2l0aW9ucygpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy50aXAuc2V0UG9zaXRpb24oXHJcbiAgICAgICAgICAgICAgY2FydGVzaWFuLFxyXG4gICAgICAgICAgICAgIG1vdmVtZW50LmVuZFBvc2l0aW9uLngsXHJcbiAgICAgICAgICAgICAgbW92ZW1lbnQuZW5kUG9zaXRpb24ueVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICB9KVxyXG5cclxuICAgICAgICAgIHRoaXMuZXZlbnQuZ2VzdHVyZV9waW5ja19zdGFydCgobW92ZW1lbnQsIGNhcnRlc2lhbikgPT4ge1xyXG4gICAgICAgICAgICBsZXQgc3RhcnRUaW1lID0gbmV3IERhdGUoKVxyXG4gICAgICAgICAgICBsZXQgcG9zID0ge1xyXG4gICAgICAgICAgICAgIHBvc2l0aW9uOiB7XHJcbiAgICAgICAgICAgICAgICB4OiAobW92ZW1lbnQucG9zaXRpb24xLnggKyBtb3ZlbWVudC5wb3NpdGlvbjIueCkgLyAyLFxyXG4gICAgICAgICAgICAgICAgeTogKG1vdmVtZW50LnBvc2l0aW9uMS55ICsgbW92ZW1lbnQucG9zaXRpb24yLnkpIC8gMlxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmV2ZW50Lmdlc3R1cmVfcGluY2tfZW5kKCgpID0+IHtcclxuICAgICAgICAgICAgICBsZXQgZW5kVGltZSA9IG5ldyBEYXRlKClcclxuICAgICAgICAgICAgICBpZiAoZW5kVGltZSAtIHN0YXJ0VGltZSA+PSA1MDApIHtcclxuICAgICAgICAgICAgICAgIC8vIOmVv+aMieWPlua2iFxyXG4gICAgICAgICAgICAgICAgcmlnaHRFdmVudCgpXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgbGVmdEV2ZW50KHBvcywgY2FydGVzaWFuKVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgIH0pXHJcblxyXG5cclxuICAgICAgICAgIGxldCBwb2ludHMgPSBbW11dXHJcbiAgICAgICAgICBsZXQgcG9zODQgPSBbXVxyXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnBvc2l0aW9uc0gubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgbGV0IHBvc2l0aW9uID0gdGhpcy5jYXJ0ZXNpYW4zVG93Z3M4NCh0aGlzLnBvc2l0aW9uc0hbaV0sIHRoaXMuc2RrLnZpZXdlcilcclxuICAgICAgICAgICAgcG9zODQucHVzaChwb3NpdGlvbilcclxuICAgICAgICAgICAgcG9pbnRzWzBdLnB1c2goW3Bvc2l0aW9uLmxuZywgcG9zaXRpb24ubGF0XSlcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGxldCBwb3NpdGlvbiA9IHRoaXMuY2FydGVzaWFuM1Rvd2dzODQodGhpcy5wb3NpdGlvbnNIWzBdLCB0aGlzLnNkay52aWV3ZXIpXHJcbiAgICAgICAgICBwb2ludHNbMF0ucHVzaChbcG9zaXRpb24ubG5nLCBwb3NpdGlvbi5sYXRdKVxyXG4gICAgICAgICAgbGV0IHBvbHlnb24gPSB0dXJmLnBvbHlnb24ocG9pbnRzKVxyXG4gICAgICAgICAgbGV0IGNlbnRyb2lkID0gdHVyZi5wb2ludE9uRmVhdHVyZShwb2x5Z29uKVxyXG4gICAgICAgICAgbGV0IG9iamVjdHNUb0V4Y2x1ZGUgPSBbLi4udGhpcy5zZGsudmlld2VyLmVudGl0aWVzLnZhbHVlc11cclxuICAgICAgICAgIHRoaXNcclxuICAgICAgICAgICAgLmdldENsYW1wVG9IZWlnaHQoe1xyXG4gICAgICAgICAgICAgIGxuZzogY2VudHJvaWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMF0sXHJcbiAgICAgICAgICAgICAgbGF0OiBjZW50cm9pZC5nZW9tZXRyeS5jb29yZGluYXRlc1sxXVxyXG4gICAgICAgICAgICB9LCBvYmplY3RzVG9FeGNsdWRlKVxyXG4gICAgICAgICAgICAudGhlbihoZWlnaHQgPT4ge1xyXG4gICAgICAgICAgICAgIHRoaXMubGFiZWwucG9zaXRpb24gPSBbXHJcbiAgICAgICAgICAgICAgICBjZW50cm9pZC5nZW9tZXRyeS5jb29yZGluYXRlc1swXSxcclxuICAgICAgICAgICAgICAgIGNlbnRyb2lkLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzFdLFxyXG4gICAgICAgICAgICAgICAgaGVpZ2h0XHJcbiAgICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgY3JlYXRlTm9kZVBvaW50cygpXHJcbiAgICAgICAgfSwgMjAwKTtcclxuICAgICAgICBhc3luYyBmdW5jdGlvbiBjcmVhdGVOb2RlUG9pbnRzKCkge1xyXG4gICAgICAgICAgbGV0IG9iamVjdHNUb0V4Y2x1ZGUgPSBbLi4uX3RoaXMuc2RrLnZpZXdlci5lbnRpdGllcy52YWx1ZXNdXHJcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9wdGlvbnNQb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgbGV0IGhlaWdodCA9IGF3YWl0IF90aGlzLmdldENsYW1wVG9IZWlnaHQoX3RoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0sIG9iamVjdHNUb0V4Y2x1ZGUpXHJcbiAgICAgICAgICAgIGxldCBlbnRpdHkgPSBfdGhpcy5zZGsudmlld2VyLmVudGl0aWVzLmFkZCh7XHJcbiAgICAgICAgICAgICAgbmFtZTogJ25vZGUtc2Vjb25kYXJ5LWVkaXQtcG9pbnQnLFxyXG4gICAgICAgICAgICAgIGluZGV4OiBpLFxyXG4gICAgICAgICAgICAgIHBvc2l0aW9uOiBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlcyhvcHRpb25zUG9zaXRpb25zW2ldLmxuZywgb3B0aW9uc1Bvc2l0aW9uc1tpXS5sYXQsIGhlaWdodCksXHJcbiAgICAgICAgICAgICAgYmlsbGJvYXJkOiB7XHJcbiAgICAgICAgICAgICAgICBpbWFnZTogX3RoaXMuZ2V0U291cmNlUm9vdFBhdGgoKSArICcvaW1nL3BvaW50LnBuZycsXHJcbiAgICAgICAgICAgICAgICB3aWR0aDogMTUsXHJcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IDE1LFxyXG4gICAgICAgICAgICAgICAgZGlzYWJsZURlcHRoVGVzdERpc3RhbmNlOiBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksXHJcbiAgICAgICAgICAgICAgICBjb2xvcjogQ2VzaXVtLkNvbG9yLldISVRFLndpdGhBbHBoYSgwLjk5KVxyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIF90aGlzLm5vZGVQb2ludHMucHVzaChlbnRpdHkpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9LCAwKTtcclxuICB9XHJcblxyXG4gIGNsb3NlTm9kZUVkaXQoKSB7XHJcbiAgICBZSi5NZWFzdXJlLlNldE1lYXN1cmVTdGF0dXMoZmFsc2UpXHJcbiAgICB0aGlzLmV2ZW50ICYmIHRoaXMuZXZlbnQuZGVzdHJveSgpXHJcbiAgICB0aGlzLnRpcCAmJiB0aGlzLnRpcC5kZXN0cm95KClcclxuICAgIHRoaXMudGlwID0gbnVsbFxyXG5cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5ub2RlUG9pbnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIHRoaXMuc2RrLnZpZXdlci5lbnRpdGllcy5yZW1vdmUodGhpcy5ub2RlUG9pbnRzW2ldKVxyXG4gICAgfVxyXG4gICAgdGhpcy5ub2RlUG9pbnRzID0gW11cclxuICAgIHRoaXMucGlja2luZyA9IHRydWVcclxuICB9XHJcblxyXG4gIHNldFBvc2l0aW9uKHYpIHtcclxuICAgIGxldCBjYXJ0ZXNpYW4gPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlcyh2LnBvc2l0aW9uLmxuZywgdi5wb3NpdGlvbi5sYXQsIHYucG9zaXRpb24uYWx0KVxyXG4gICAgbGV0IHBvc2l0aW9ucyA9IFsuLi50aGlzLnBvc2l0aW9uc11cclxuICAgIGxldCBhcnJheSA9IFtdXHJcbiAgICBsZXQgZGlzcGFyaXR5ID0gW11cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGxldCBwb3NpdGlvbiA9IHRoaXMuY2FydGVzaWFuM1Rvd2dzODQocG9zaXRpb25zW2ldLCB0aGlzLnNkay52aWV3ZXIpXHJcbiAgICAgIGFycmF5LnB1c2goW3Bvc2l0aW9uLmxuZywgcG9zaXRpb24ubGF0XSlcclxuICAgIH1cclxuICAgIGxldCBmaXJzdHBvc2l0aW9uID0gdGhpcy5jYXJ0ZXNpYW4zVG93Z3M4NChwb3NpdGlvbnNbMF0sIHRoaXMuc2RrLnZpZXdlcilcclxuICAgIGFycmF5LnB1c2goW2ZpcnN0cG9zaXRpb24ubG5nLCBmaXJzdHBvc2l0aW9uLmxhdF0pXHJcbiAgICB2YXIgcG9seWdvbiA9IHR1cmYucG9seWdvbihbYXJyYXldKTtcclxuICAgIHZhciBjZW50cm9pZCA9IHR1cmYuY2VudHJvaWQocG9seWdvbik7XHJcbiAgICBsZXQgY2VudGVyID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXMoLi4uY2VudHJvaWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXMpXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBkaXNwYXJpdHkucHVzaCh7XHJcbiAgICAgICAgeDogY2VudGVyLnggLSBwb3NpdGlvbnNbaV0ueCxcclxuICAgICAgICB5OiBjZW50ZXIueSAtIHBvc2l0aW9uc1tpXS55LFxyXG4gICAgICAgIHo6IGNlbnRlci56IC0gcG9zaXRpb25zW2ldLnosXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgICBsZXQgbmV3cG9zaXRpb25zID0gW11cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGlzcGFyaXR5Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIG5ld3Bvc2l0aW9ucy5wdXNoKHtcclxuICAgICAgICB4OiBjYXJ0ZXNpYW4ueCAtIGRpc3Bhcml0eVtpXS54LFxyXG4gICAgICAgIHk6IGNhcnRlc2lhbi55IC0gZGlzcGFyaXR5W2ldLnksXHJcbiAgICAgICAgejogY2FydGVzaWFuLnogLSBkaXNwYXJpdHlbaV0ueixcclxuICAgICAgfSlcclxuICAgIH1cclxuICAgIHRoaXMubGFiZWwucG9zaXRpb24gPSBbdi5wb3NpdGlvbi5sbmcsIHYucG9zaXRpb24ubGF0LCB2LnBvc2l0aW9uLmFsdF1cclxuXHJcbiAgICBsZXQgcG9zaXRpb25zODQgPSBbXVxyXG4gICAgaWYgKG5ld3Bvc2l0aW9ucy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmV3cG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgcG9zaXRpb25zODQucHVzaCh0aGlzLmNhcnRlc2lhbjNUb3dnczg0KG5ld3Bvc2l0aW9uc1tpXSwgdGhpcy5zZGsudmlld2VyKSlcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgbGV0IGFyciA9IHRoaXMuY29tcHV0ZVBpbmNlckFycm93KHBvc2l0aW9uczg0KVxyXG4gICAgaWYgKGFyci5sZW5ndGggPT0gMCkge1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuICAgIHRoaXMuZW50aXR5LnBvbHlnb24uaGllcmFyY2h5ID0gbmV3IENlc2l1bS5DYWxsYmFja1Byb3BlcnR5KGZ1bmN0aW9uICgpIHtcclxuICAgICAgcmV0dXJuIG5ldyBDZXNpdW0uUG9seWdvbkhpZXJhcmNoeShhcnIpXHJcbiAgICB9LCBmYWxzZSlcclxuICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLnBvc2l0aW9ucyA9IG5ldyBDZXNpdW0uQ2FsbGJhY2tQcm9wZXJ0eShmdW5jdGlvbiAoKSB7XHJcbiAgICAgIGlmIChhcnIubGVuZ3RoID49IDMpIHtcclxuICAgICAgICByZXR1cm4gWy4uLmFyciwgYXJyWzBdLCBhcnJbMV1dXHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIFsuLi5hcnJdXHJcbiAgICAgIH1cclxuICAgIH0sIGZhbHNlKVxyXG4gIH1cclxuXHJcbiAgc2V0RElWKG9wdGlvbnMgPSB7IGRvbWlkOiBcIlwiLCB4OiAxMCwgeTogMTAgfSkge1xyXG4gICAgb3B0aW9ucy54ID0gKG9wdGlvbnMueCB8fCBvcHRpb25zLnggPT09IDApID8gb3B0aW9ucy54IDogMTBcclxuICAgIG9wdGlvbnMueSA9IChvcHRpb25zLnkgfHwgb3B0aW9ucy55ID09PSAwKSA/IG9wdGlvbnMueSA6IDEwXHJcblxyXG4gICAgbGV0IHBvc2l0aW9ucyA9IHRoaXMuY29tcHV0ZVBpbmNlckFycm93KHRoaXMub3B0aW9ucy5wb3NpdGlvbnMpXHJcbiAgICBpZiAocG9zaXRpb25zLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG4gICAgbGV0IHBvaW50cyA9IFtbXV1cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGxldCBwb3NpdGlvbiA9IHRoaXMuY2FydGVzaWFuM1Rvd2dzODQocG9zaXRpb25zW2ldLCB0aGlzLnNkay52aWV3ZXIpXHJcbiAgICAgIHBvaW50c1swXS5wdXNoKFtwb3NpdGlvbi5sbmcsIHBvc2l0aW9uLmxhdF0pXHJcbiAgICB9XHJcbiAgICBsZXQgcG9zaXRpb24gPSB0aGlzLmNhcnRlc2lhbjNUb3dnczg0KHBvc2l0aW9uc1swXSwgdGhpcy5zZGsudmlld2VyKVxyXG4gICAgcG9pbnRzWzBdLnB1c2goW3Bvc2l0aW9uLmxuZywgcG9zaXRpb24ubGF0XSlcclxuICAgIGxldCBwb2x5Z29uID0gdHVyZi5wb2x5Z29uKHBvaW50cyk7XHJcbiAgICAvLyBsZXQgY2VudHJvaWQgPSB0dXJmLmNlbnRyb2lkKHBvbHlnb24pO1xyXG4gICAgbGV0IGNlbnRyb2lkID0gdHVyZi5wb2ludE9uRmVhdHVyZShwb2x5Z29uKTtcclxuICAgIGxldCBzaXRlSW5mb0RvbSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKG9wdGlvbnMuZG9taWQpXHJcbiAgICBsZXQgc2l0ZUluZm9Qb3NpdGlvbiA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzKGNlbnRyb2lkLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzBdLCBjZW50cm9pZC5nZW9tZXRyeS5jb29yZGluYXRlc1sxXSlcclxuXHJcbiAgICB0aGlzLnNkay52aWV3ZXIuc2NlbmUucG9zdFJlbmRlci5hZGRFdmVudExpc3RlbmVyKChwZXJjZW50YWdlKSA9PiB7XHJcbiAgICAgIC8v6L2s5o2i5Yiw5bGP5bmV5Z2Q5qCHXHJcbiAgICAgIGlmIChzaXRlSW5mb0RvbS5zdHlsZS5kaXNwbGF5ID09PSAnYmxvY2snIHx8IHNpdGVJbmZvRG9tLnN0eWxlLmRpc3BsYXkgPT09ICcnKSB7XHJcbiAgICAgICAgbGV0IHdpbnBvcyA9IHRoaXMuc2RrLnZpZXdlci5zY2VuZS5jYXJ0ZXNpYW5Ub0NhbnZhc0Nvb3JkaW5hdGVzKHNpdGVJbmZvUG9zaXRpb24pO1xyXG4gICAgICAgIGlmICh3aW5wb3MpIHtcclxuICAgICAgICAgIHNpdGVJbmZvRG9tLnN0eWxlLmxlZnQgPSAod2lucG9zLnggKyBvcHRpb25zLngpLnRvRml4ZWQoMCkgKyAncHgnO1xyXG4gICAgICAgICAgc2l0ZUluZm9Eb20uc3R5bGUudG9wID0gKHdpbnBvcy55ICsgb3B0aW9ucy55KS50b0ZpeGVkKDApICsgJ3B4JztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHNwcmVhZFRpbWUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLnNwcmVhZFRpbWVcclxuICB9XHJcblxyXG4gIHNldCBzcHJlYWRUaW1lKHYpIHtcclxuICAgIGxldCBzcHJlYWRUaW1lID0gTnVtYmVyKHYpXHJcbiAgICBpZiAoaXNOYU4oc3ByZWFkVGltZSkpIHtcclxuICAgICAgc3ByZWFkVGltZSA9IDMwMDBcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHNwcmVhZFRpbWUgPCA1MDApIHtcclxuICAgICAgc3ByZWFkVGltZSA9IDUwMFxyXG4gICAgfSBlbHNlIGlmIChzcHJlYWRUaW1lID4gOTk5OTk5OSkge1xyXG4gICAgICBzcHJlYWRUaW1lID0gOTk5OTk5OVxyXG4gICAgfVxyXG4gICAgdGhpcy5vcHRpb25zLnNwcmVhZFRpbWUgPSBzcHJlYWRUaW1lXHJcbiAgICBpZiAodGhpcy5zcHJlYWRTdGF0ZSkge1xyXG4gICAgICB0aGlzLnNldFNwcmVhZFByb2dyZXNzQnlUaW1lKClcclxuICAgIH1cclxuICAgIHRoaXMuX2VsbXMuc3ByZWFkVGltZSAmJiB0aGlzLl9lbG1zLnNwcmVhZFRpbWUuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICBpdGVtLnZhbHVlID0gc3ByZWFkVGltZVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGdldCBsb29wKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5sb29wXHJcbiAgfVxyXG4gIHNldCBsb29wKHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5sb29wID0gdlxyXG4gICAgaWYgKHRoaXMuVHdlZW5BbmltYXRlKSB7XHJcbiAgICAgIGlmICh2KSB7XHJcbiAgICAgICAgdGhpcy5Ud2VlbkFuaW1hdGUucmVwZWF0KEluZmluaXR5KVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRoaXMuVHdlZW5BbmltYXRlLnJlcGVhdCgpXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuX2VsbXMubG9vcCAmJiB0aGlzLl9lbG1zLmxvb3AuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICBpdGVtLmNoZWNrZWQgPSB2XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgZ2V0IHNwcmVhZFN0YXRlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5zcHJlYWRTdGF0ZVxyXG4gIH1cclxuICBzZXQgc3ByZWFkU3RhdGUodikge1xyXG4gICAgdGhpcy5vcHRpb25zLnNwcmVhZFN0YXRlID0gdlxyXG4gICAgaWYgKHRoaXMuVHdlZW5BbmltYXRlKSB7XHJcbiAgICAgIGlmICh2KSB7XHJcbiAgICAgICAgdGhpcy5saW5lRWRpdCA9IGZhbHNlXHJcbiAgICAgICAgdGhpcy5zZXRTcHJlYWRQcm9ncmVzc0J5VGltZSh0aGlzLlR3ZWVuQW5pbWF0ZS5fb2JqZWN0LmRpc3RhbmNlMSAvIHRoaXMuVHdlZW5BbmltYXRlLl92YWx1ZXNFbmQuZGlzdGFuY2UxICogdGhpcy5zcHJlYWRUaW1lKVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRoaXMuVHdlZW5BbmltYXRlLnBhdXNlKClcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmICh2KSB7XHJcbiAgICAgICAgdGhpcy5zZXRTcHJlYWRQcm9ncmVzc0J5VGltZSgpXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuX2VsbXMuc3ByZWFkU3RhdGUgJiYgdGhpcy5fZWxtcy5zcHJlYWRTdGF0ZS5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgIGl0ZW0uY2hlY2tlZCA9IHZcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBzZXRTcHJlYWRQcm9ncmVzc0J5VGltZSh0aW1lID0gMCkge1xyXG4gICAgaWYgKCF0aGlzLmVudGl0eSkge1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuICAgIGxldCB0aGF0ID0gdGhpc1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm5vZGVQb2ludHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgdGhpcy5zZGsudmlld2VyLmVudGl0aWVzLnJlbW92ZSh0aGlzLm5vZGVQb2ludHNbaV0pXHJcbiAgICB9XHJcbiAgICB0aGlzLm5vZGVQb2ludHMgPSBbXVxyXG4gICAgWUouTWVhc3VyZS5TZXRNZWFzdXJlU3RhdHVzKGZhbHNlKVxyXG4gICAgdGhpcy5ldmVudCAmJiB0aGlzLmV2ZW50LmRlc3Ryb3koKVxyXG4gICAgdGhpcy50aXAgJiYgdGhpcy50aXAuZGVzdHJveSgpXHJcblxyXG4gICAgbGV0IFBpbmNlckFycm93QXJyID0gdGhpcy5jb21wdXRlUGluY2VyQXJyb3codGhpcy5vcHRpb25zLnBvc2l0aW9ucylcclxuICAgIGlmIChQaW5jZXJBcnJvd0Fyci5sZW5ndGggPT0gMCkge1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuICAgIGxldCBhcnJcclxuICAgIGxldCBsaW5lQXJyXHJcbiAgICAvLyBpZiAoYXJyLmxlbmd0aCA+PSAzKSB7XHJcbiAgICAvLyAgIGxpbmVBcnIgPSBbLi4uYXJyLCBhcnJbMF0sIGFyclsxXV1cclxuICAgIC8vIH1cclxuICAgIC8vIGVsc2Uge1xyXG4gICAgLy8gICBsaW5lQXJyID0gWy4uLmFycl1cclxuICAgIC8vIH1cclxuICAgIGlmICh0aGlzLlR3ZWVuQW5pbWF0ZSkge1xyXG4gICAgICBUV0VFTi5yZW1vdmUodGhpcy5Ud2VlbkFuaW1hdGUpXHJcbiAgICAgIHRoaXMuVHdlZW5BbmltYXRlID0gbnVsbFxyXG4gICAgfVxyXG5cclxuICAgIGxldCB7IHNka1AsIHNka0QgfSA9IGdldFNkaygpXHJcbiAgICBsZXQgdGhhdFBcclxuICAgIGlmIChzZGtEICYmIHNka1ApIHtcclxuICAgICAgaWYgKHRoaXMuc2RrID09PSBzZGtEKSB7XHJcbiAgICAgICAgdGhhdFAgPSBzZGtQLmVudGl0eU1hcC5nZXQodGhpcy5vcHRpb25zLmlkKVxyXG4gICAgICAgIGlmICh0aGF0UCAmJiB0aGF0UC5lbnRpdHkgJiYgdGhhdFAuZW50aXR5LnBvbHlnb24gJiYgdGhhdFAucG9zaXRpb25zSCkge1xyXG4gICAgICAgICAgdGhpcy5lbnRpdHkucG9seWdvbi5oaWVyYXJjaHkgPSBuZXcgQ2VzaXVtLkNhbGxiYWNrUHJvcGVydHkoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IENlc2l1bS5Qb2x5Z29uSGllcmFyY2h5KHRoYXRQLnBvc2l0aW9uc0gpXHJcbiAgICAgICAgICB9LCBmYWxzZSlcclxuICAgICAgICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLnBvc2l0aW9ucyA9IG5ldyBDZXNpdW0uQ2FsbGJhY2tQcm9wZXJ0eShmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBbLi4udGhhdFAucG9zaXRpb25zSCwgdGhhdFAucG9zaXRpb25zSFswXSwgdGhhdFAucG9zaXRpb25zSFsxXV1cclxuICAgICAgICAgIH0sIGZhbHNlKVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm5cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIHRoaXMuZW50aXR5LnBvbHlnb24uaGllcmFyY2h5ID0gYXJyXHJcbiAgICAvLyB0aGlzLmVudGl0eS5wb2x5bGluZS5wb3NpdGlvbnMgPSBsaW5lQXJyXHJcblxyXG4gICAgbGV0IGxpbmVQb3M4NDEgPSBbXVxyXG4gICAgbGV0IGxpbmVQb3M4NDIgPSBbXVxyXG4gICAgbGV0IGxpbmVQb3M4NDMgPSBbXVxyXG5cclxuICAgIGxldCB0dXJmTGluZSA9IFtdXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8PSAyOyBpKyspIHtcclxuICAgICAgdHVyZkxpbmUucHVzaChbdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sbmcsIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubGF0XSlcclxuICAgIH1cclxuICAgIHR1cmZMaW5lLnB1c2goW3RoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0ubG5nLCB0aGlzLm9wdGlvbnMucG9zaXRpb25zWzBdLmxhdF0pXHJcbiAgICBsZXQgY2xvY2t3aXNlUmluZyA9IHR1cmYubGluZVN0cmluZyh0dXJmTGluZSk7XHJcbiAgICBsZXQgaXNDbG9ja3dpc2UgPSB0dXJmLmJvb2xlYW5DbG9ja3dpc2UoY2xvY2t3aXNlUmluZylcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8PSAxMDA7IGkrKykge1xyXG4gICAgICBsZXQgcG9zODQgPSB0aGlzLmNhcnRlc2lhbjNUb3dnczg0KFBpbmNlckFycm93QXJyW2ldLCB0aGlzLnNkay52aWV3ZXIpXHJcbiAgICAgIGxpbmVQb3M4NDEucHVzaChbcG9zODQubG5nLCBwb3M4NC5sYXQsIHBvczg0LmFsdF0pXHJcbiAgICB9XHJcbiAgICBpZiAoaXNDbG9ja3dpc2UpIHtcclxuICAgICAgbGluZVBvczg0MS5wdXNoKFt0aGlzLm9wdGlvbnMucG9zaXRpb25zWzNdLmxuZywgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1szXS5sYXQsIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbM10uYWx0XSlcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBsaW5lUG9zODQxLnB1c2goW3RoaXMub3B0aW9ucy5wb3NpdGlvbnNbMl0ubG5nLCB0aGlzLm9wdGlvbnMucG9zaXRpb25zWzJdLmxhdCwgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1syXS5hbHRdKVxyXG4gICAgfVxyXG5cclxuXHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDMxMjsgaSA+PSAyMTI7IGktLSkge1xyXG4gICAgICBsZXQgcG9zODQgPSB0aGlzLmNhcnRlc2lhbjNUb3dnczg0KFBpbmNlckFycm93QXJyW2ldLCB0aGlzLnNkay52aWV3ZXIpXHJcbiAgICAgIGxpbmVQb3M4NDIucHVzaChbcG9zODQubG5nLCBwb3M4NC5sYXQsIHBvczg0LmFsdF0pXHJcbiAgICB9XHJcbiAgICBpZiAoaXNDbG9ja3dpc2UpIHtcclxuICAgICAgbGluZVBvczg0Mi5wdXNoKFt0aGlzLm9wdGlvbnMucG9zaXRpb25zWzJdLmxuZywgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1syXS5sYXQsIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMl0uYWx0XSlcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBsaW5lUG9zODQyLnB1c2goW3RoaXMub3B0aW9ucy5wb3NpdGlvbnNbM10ubG5nLCB0aGlzLm9wdGlvbnMucG9zaXRpb25zWzNdLmxhdCwgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1szXS5hbHRdKVxyXG4gICAgfVxyXG5cclxuICAgIGxpbmVQb3M4NDMucHVzaChbKHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0ubG5nICsgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1sxXS5sbmcpIC8gMiwgKHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0ubGF0ICsgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1sxXS5sYXQpIC8gMl0sIFt0aGlzLm9wdGlvbnMucG9zaXRpb25zWzRdLmxuZywgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1s0XS5sYXRdKVxyXG5cclxuXHJcbiAgICBsZXQgcG9zaXRpb25zID0gdGhpcy5kZWVwQ29weU9iaih0aGlzLm9wdGlvbnMucG9zaXRpb25zKVxyXG5cclxuICAgIGxldCBsaW5lMSA9IHR1cmYubGluZVN0cmluZyhsaW5lUG9zODQxKTtcclxuICAgIGxldCBkaXN0YW5jZTEgPSB0dXJmLmxlbmd0aChsaW5lMSwgeyB1bml0czogJ2tpbG9tZXRlcnMnIH0pO1xyXG4gICAgbGV0IGxpbmUyID0gdHVyZi5saW5lU3RyaW5nKGxpbmVQb3M4NDIpO1xyXG4gICAgbGV0IGRpc3RhbmNlMiA9IHR1cmYubGVuZ3RoKGxpbmUyLCB7IHVuaXRzOiAna2lsb21ldGVycycgfSk7XHJcbiAgICBsZXQgbGluZTMgPSB0dXJmLmxpbmVTdHJpbmcobGluZVBvczg0Myk7XHJcbiAgICBsZXQgZGlzdGFuY2UzID0gdHVyZi5sZW5ndGgobGluZTMsIHsgdW5pdHM6ICdraWxvbWV0ZXJzJyB9KTtcclxuICAgIGxldCB0aW1lUmF0aW8gPSB0aW1lIC8gdGhpcy5zcHJlYWRUaW1lXHJcbiAgICBsZXQgbSA9IDBcclxuICAgIHRoaXMuVHdlZW5BbmltYXRlID0gbmV3IFRXRUVOLlR3ZWVuKHsgZGlzdGFuY2UxOiBkaXN0YW5jZTEgKiB0aW1lUmF0aW8sIGRpc3RhbmNlMjogZGlzdGFuY2UyICogdGltZVJhdGlvLCBkaXN0YW5jZTM6IGRpc3RhbmNlMyAqIHRpbWVSYXRpbyB9KS50byh7IGRpc3RhbmNlMTogZGlzdGFuY2UxLCBkaXN0YW5jZTI6IGRpc3RhbmNlMiwgZGlzdGFuY2UzOiBkaXN0YW5jZTMgfSwgdGhpcy5zcHJlYWRUaW1lIC0gdGltZSkuZWFzaW5nKFRXRUVOLkVhc2luZy5MaW5lYXIuTm9uZSkucmVwZWF0KHRoaXMub3B0aW9ucy5sb29wID8gSW5maW5pdHkgOiAwKS5vblJlcGVhdCgoKSA9PiB7XHJcbiAgICAgIGlmICh0aW1lKSB7XHJcbiAgICAgICAgdGhpcy5zZXRTcHJlYWRQcm9ncmVzc0J5VGltZSgpXHJcbiAgICAgIH1cclxuICAgIH0pLm9uVXBkYXRlKGFzeW5jIChyLCBhKSA9PiB7XHJcbiAgICAgIGlmICh0aGlzLlR3ZWVuQW5pbWF0ZS5fZHVyYXRpb24gPT0gSW5maW5pdHkpIHtcclxuICAgICAgICByZXR1cm5cclxuICAgICAgfVxyXG4gICAgICBtKytcclxuICAgICAgaWYgKCF0aGlzLnNkay52aWV3ZXIpIHtcclxuICAgICAgICB0aGlzLnJlbW92ZUFuaW1hdGUoKVxyXG4gICAgICAgIHJldHVyblxyXG4gICAgICB9XHJcbiAgICAgIHNldFNwcmVhZChyKVxyXG4gICAgfSkub25TdGFydCgoKSA9PiB7XHJcbiAgICAgIHRoaXMub3B0aW9ucy5zcHJlYWRTdGF0ZSA9IHRydWVcclxuICAgICAgdGhpcy5fZWxtcy5zcHJlYWRTdGF0ZSAmJiB0aGlzLl9lbG1zLnNwcmVhZFN0YXRlLmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgICBpdGVtLmNoZWNrZWQgPSB0cnVlXHJcbiAgICAgIH0pXHJcbiAgICB9KS5vbkNvbXBsZXRlKChkKSA9PiB7XHJcbiAgICAgIHRoaXMucmVtb3ZlQW5pbWF0ZSgpXHJcbiAgICB9KVxyXG4gICAgaWYgKHRoaXMuc3ByZWFkU3RhdGUpIHtcclxuICAgICAgdGhpcy5Ud2VlbkFuaW1hdGUuc3RhcnQoKVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHNldFNwcmVhZCh7IGRpc3RhbmNlMTogZGlzdGFuY2UxICogdGltZVJhdGlvLCBkaXN0YW5jZTI6IGRpc3RhbmNlMiAqIHRpbWVSYXRpbywgZGlzdGFuY2UzOiBkaXN0YW5jZTMgKiB0aW1lUmF0aW8gfSlcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBmdW5jdGlvbiBzZXRTcHJlYWQodikge1xyXG4gICAgICBpZiAoIXRoYXQuc2hvdykge1xyXG4gICAgICAgIHJldHVyblxyXG4gICAgICB9XHJcbiAgICAgIGxldCBpbmRleDIgPSAyXHJcbiAgICAgIGxldCBpbmRleDMgPSAzXHJcbiAgICAgIGlmIChpc0Nsb2Nrd2lzZSkge1xyXG4gICAgICAgIGluZGV4MiA9IDNcclxuICAgICAgICBpbmRleDMgPSAyXHJcbiAgICAgIH1cclxuICAgICAgaWYgKCF2LmRpc3RhbmNlMSkge1xyXG4gICAgICAgIHBvc2l0aW9uc1tpbmRleDJdLmxuZyA9IHBvc2l0aW9uc1sxXS5sbmdcclxuICAgICAgICBwb3NpdGlvbnNbaW5kZXgyXS5sYXQgPSBwb3NpdGlvbnNbMV0ubGF0XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgbGV0IHNsaWNlZDEgPSBhd2FpdCB0dXJmLmxpbmVTbGljZUFsb25nKGxpbmUxLCAwLCB2LmRpc3RhbmNlMSwgeyB1bml0czogJ2tpbG9tZXRlcnMnIH0pO1xyXG4gICAgICAgIGxldCBjb29yZGluYXRlczEgPSBbLi4uc2xpY2VkMS5nZW9tZXRyeS5jb29yZGluYXRlc1tzbGljZWQxLmdlb21ldHJ5LmNvb3JkaW5hdGVzLmxlbmd0aCAtIDFdXVxyXG4gICAgICAgIHBvc2l0aW9uc1tpbmRleDJdLmxuZyA9IGNvb3JkaW5hdGVzMVswXVxyXG4gICAgICAgIHBvc2l0aW9uc1tpbmRleDJdLmxhdCA9IGNvb3JkaW5hdGVzMVsxXVxyXG4gICAgICB9XHJcbiAgICAgIGlmICghdi5kaXN0YW5jZTIpIHtcclxuICAgICAgICBwb3NpdGlvbnNbaW5kZXgzXS5sbmcgPSBwb3NpdGlvbnNbMF0ubG5nXHJcbiAgICAgICAgcG9zaXRpb25zWzNdLmxhdCA9IHBvc2l0aW9uc1swXS5sYXRcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBsZXQgc2xpY2VkMiA9IGF3YWl0IHR1cmYubGluZVNsaWNlQWxvbmcobGluZTIsIDAsIHYuZGlzdGFuY2UyLCB7IHVuaXRzOiAna2lsb21ldGVycycgfSk7XHJcbiAgICAgICAgbGV0IGNvb3JkaW5hdGVzMiA9IFsuLi5zbGljZWQyLmdlb21ldHJ5LmNvb3JkaW5hdGVzW3NsaWNlZDIuZ2VvbWV0cnkuY29vcmRpbmF0ZXMubGVuZ3RoIC0gMV1dXHJcbiAgICAgICAgcG9zaXRpb25zW2luZGV4M10ubG5nID0gY29vcmRpbmF0ZXMyWzBdXHJcbiAgICAgICAgcG9zaXRpb25zW2luZGV4M10ubGF0ID0gY29vcmRpbmF0ZXMyWzFdXHJcbiAgICAgIH1cclxuICAgICAgaWYgKCF2LmRpc3RhbmNlMykge1xyXG4gICAgICAgIHBvc2l0aW9uc1s0XS5sbmcgPSBsaW5lUG9zODQzWzBdWzBdXHJcbiAgICAgICAgcG9zaXRpb25zWzRdLmxhdCA9IGxpbmVQb3M4NDNbMF1bMV1cclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBsZXQgc2xpY2VkMyA9IGF3YWl0IHR1cmYubGluZVNsaWNlQWxvbmcobGluZTMsIDAsIHYuZGlzdGFuY2UzLCB7IHVuaXRzOiAna2lsb21ldGVycycgfSk7XHJcbiAgICAgICAgbGV0IGNvb3JkaW5hdGVzMyA9IFsuLi5zbGljZWQzLmdlb21ldHJ5LmNvb3JkaW5hdGVzW3NsaWNlZDMuZ2VvbWV0cnkuY29vcmRpbmF0ZXMubGVuZ3RoIC0gMV1dXHJcbiAgICAgICAgcG9zaXRpb25zWzRdLmxuZyA9IGNvb3JkaW5hdGVzM1swXVxyXG4gICAgICAgIHBvc2l0aW9uc1s0XS5sYXQgPSBjb29yZGluYXRlczNbMV1cclxuICAgICAgfVxyXG5cclxuICAgICAgdGhhdC5yZW5ld1Bvc2l0aW9ucyhwb3NpdGlvbnMpXHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5lbnRpdHkucG9seWdvbi5oaWVyYXJjaHkgPSBuZXcgQ2VzaXVtLkNhbGxiYWNrUHJvcGVydHkoZnVuY3Rpb24gKCkge1xyXG4gICAgICByZXR1cm4gbmV3IENlc2l1bS5Qb2x5Z29uSGllcmFyY2h5KHRoYXQucG9zaXRpb25zSClcclxuICAgIH0sIGZhbHNlKVxyXG4gICAgdGhpcy5lbnRpdHkucG9seWxpbmUucG9zaXRpb25zID0gbmV3IENlc2l1bS5DYWxsYmFja1Byb3BlcnR5KGZ1bmN0aW9uICgpIHtcclxuICAgICAgcmV0dXJuIFsuLi50aGF0LnBvc2l0aW9uc0gsIHRoYXQucG9zaXRpb25zSFswXSwgdGhhdC5wb3NpdGlvbnNIWzFdXVxyXG4gICAgfSwgZmFsc2UpXHJcbiAgfVxyXG5cclxuICAvLyDnp7vpmaTliqjnlLtcclxuICByZW1vdmVBbmltYXRlKCkge1xyXG4gICAgdGhpcy5zcHJlYWRTdGF0ZSA9IGZhbHNlXHJcbiAgICBpZiAodGhpcy5Ud2VlbkFuaW1hdGUpIHtcclxuICAgICAgVFdFRU4ucmVtb3ZlKHRoaXMuVHdlZW5BbmltYXRlKVxyXG4gICAgICB0aGlzLlR3ZWVuQW5pbWF0ZSA9IG51bGxcclxuXHJcbiAgICAgIHRoaXMucmVuZXdQb3NpdGlvbnMoKVxyXG4gICAgICB0aGlzLmVudGl0eS5wb2x5Z29uLmhpZXJhcmNoeSA9IG5ldyBDZXNpdW0uUG9seWdvbkhpZXJhcmNoeSh0aGlzLnBvc2l0aW9uc0gpXHJcbiAgICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLnBvc2l0aW9ucyA9IFsuLi50aGlzLnBvc2l0aW9uc0gsIHRoaXMucG9zaXRpb25zSFswXSwgdGhpcy5wb3NpdGlvbnNIWzFdXVxyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG4gIC8vIOabtOaWsOWdkOagh1xyXG4gIHJlbmV3UG9zaXRpb25zKHBvc2l0aW9uODQpIHtcclxuICAgIGlmICh0aGlzLl9lcnJvciB8fCAhdGhpcy5zZGsudmlld2VyKSB7XHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG4gICAgbGV0IGdyb3VuZCA9IGZhbHNlXHJcblxyXG4gICAgbGV0IGFycmF5ID0gW11cclxuICAgIGxldCBwb3NpdGlvbnMgPSB0aGlzLm9wdGlvbnMucG9zaXRpb25zXHJcbiAgICBpZiAocG9zaXRpb244NCkge1xyXG4gICAgICBwb3NpdGlvbnMgPSBwb3NpdGlvbjg0XHJcbiAgICB9XHJcbiAgICBsZXQgZnJvbURlZ3JlZXNBcnJheSA9IFtdXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBmcm9tRGVncmVlc0FycmF5LnB1c2gocG9zaXRpb25zW2ldLmxuZywgcG9zaXRpb25zW2ldLmxhdClcclxuICAgIH1cclxuICAgIHRoaXMucG9zaXRpb25zID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXNBcnJheShmcm9tRGVncmVlc0FycmF5KVxyXG5cclxuICAgIGxldCBwb3NpdGlvbnNBID0gdGhpcy5jb21wdXRlUGluY2VyQXJyb3cocG9zaXRpb25zKVxyXG4gICAgaWYgKHBvc2l0aW9uc0EubGVuZ3RoID09IDApIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcbiAgICBsZXQgcG9pbnRzID0gW1tdXVxyXG4gICAgbGV0IHBvczg0ID0gW11cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9zaXRpb25zQS5sZW5ndGg7IGkrKykge1xyXG4gICAgICBsZXQgcG9zaXRpb24gPSB0aGlzLmNhcnRlc2lhbjNUb3dnczg0KHBvc2l0aW9uc0FbaV0sIHRoaXMuc2RrLnZpZXdlcilcclxuICAgICAgcG9zODQucHVzaChwb3NpdGlvbilcclxuICAgICAgcG9pbnRzWzBdLnB1c2goW3Bvc2l0aW9uLmxuZywgcG9zaXRpb24ubGF0XSlcclxuICAgIH1cclxuICAgIGxldCBwb3NpdGlvbiA9IHRoaXMuY2FydGVzaWFuM1Rvd2dzODQocG9zaXRpb25zQVswXSwgdGhpcy5zZGsudmlld2VyKVxyXG4gICAgcG9pbnRzWzBdLnB1c2goW3Bvc2l0aW9uLmxuZywgcG9zaXRpb24ubGF0XSlcclxuICAgIGxldCBoZWlnaHQgPSAwXHJcbiAgICBsZXQgcG9seWdvbiA9IHR1cmYucG9seWdvbihwb2ludHMpXHJcbiAgICBsZXQgY2VudHJvaWQgPSB0dXJmLnBvaW50T25GZWF0dXJlKHBvbHlnb24pXHJcbiAgICBzd2l0Y2ggKHRoaXMub3B0aW9ucy5oZWlnaHRNb2RlKSB7XHJcbiAgICAgIGNhc2UgJzAnOlxyXG4gICAgICBjYXNlIDA6XHJcbiAgICAgICAgZ3JvdW5kID0gZmFsc2VcclxuICAgICAgICBicmVha1xyXG4gICAgICBjYXNlICcxJzpcclxuICAgICAgY2FzZSAxOlxyXG4gICAgICAgIGhlaWdodCA9IHRoaXMuc2RrLnZpZXdlci5zY2VuZS5nbG9iZS5nZXRIZWlnaHQoQ2VzaXVtLkNhcnRvZ3JhcGhpYy5mcm9tRGVncmVlcyhjZW50cm9pZC5nZW9tZXRyeS5jb29yZGluYXRlc1swXSwgY2VudHJvaWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMV0pKSB8fCAwXHJcbiAgICAgICAgZ3JvdW5kID0gZmFsc2VcclxuICAgICAgICBicmVha1xyXG4gICAgICBjYXNlICcyJzpcclxuICAgICAgY2FzZSAyOlxyXG4gICAgICAgIGdyb3VuZCA9IHRydWVcclxuICAgICAgICBicmVha1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBmcm9tRGVncmVlc0FycmF5MiA9IFtdXHJcbiAgICBpZiAoIWdyb3VuZCAmJiB0aGlzLm5vZGVQb2ludHMubGVuZ3RoID09IDApIHtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb2ludHNbMF0ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBmcm9tRGVncmVlc0FycmF5Mi5wdXNoKFxyXG4gICAgICAgICAgcG9pbnRzWzBdW2ldWzBdLFxyXG4gICAgICAgICAgcG9pbnRzWzBdW2ldWzFdLFxyXG4gICAgICAgICAgdGhpcy5oZWlnaHQgKyBoZWlnaHRcclxuICAgICAgICApXHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5wb3NpdGlvbnNIID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXNBcnJheUhlaWdodHMoZnJvbURlZ3JlZXNBcnJheTIpXHJcblxyXG4gICAgICB0aGlzLmxhYmVsICYmICh0aGlzLmxhYmVsLnBvc2l0aW9uID0gW1xyXG4gICAgICAgIGNlbnRyb2lkLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzBdLFxyXG4gICAgICAgIGNlbnRyb2lkLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzFdLFxyXG4gICAgICAgIHRoaXMuaGVpZ2h0ICsgaGVpZ2h0XHJcbiAgICAgIF0pXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnBvc2l0aW9uc0ggPSBwb3NpdGlvbnNBXHJcblxyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICBpZiAoIXRoaXMuc2RrLnZpZXdlcikge1xyXG4gICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBvYmplY3RzVG9FeGNsdWRlID0gWy4uLnRoaXMuc2RrLnZpZXdlci5lbnRpdGllcy52YWx1ZXNdXHJcbiAgICAgICAgdGhpcy5nZXRDbGFtcFRvSGVpZ2h0KHtcclxuICAgICAgICAgIGxuZzogY2VudHJvaWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMF0sXHJcbiAgICAgICAgICBsYXQ6IGNlbnRyb2lkLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzFdXHJcbiAgICAgICAgfSwgb2JqZWN0c1RvRXhjbHVkZSkudGhlbihoZWlnaHQgPT4ge1xyXG4gICAgICAgICAgdGhpcy5sYWJlbCAmJiAodGhpcy5sYWJlbC5wb3NpdGlvbiA9IFtcclxuICAgICAgICAgICAgY2VudHJvaWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMF0sXHJcbiAgICAgICAgICAgIGNlbnRyb2lkLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzFdLFxyXG4gICAgICAgICAgICBoZWlnaHRcclxuICAgICAgICAgIF0pXHJcbiAgICAgICAgfSlcclxuICAgICAgfSwgMTAwKVxyXG4gICAgfVxyXG5cclxuICAgIC8vIOiuoeeul+aKleW9semdouenr1xyXG4gICAgaWYgKCF0aGlzLnNwcmVhZFN0YXRlKSB7XHJcbiAgICAgIHRoaXMuYXJlYUJ5TWV0ZXIgPSB0aGlzLmNvbXB1dGVBcmVhKHBvczg0KVxyXG4gICAgICB0aGlzLmFyZWFDaGFuZ2VDYWxsQmFjayAmJiB0aGlzLmFyZWFDaGFuZ2VDYWxsQmFjaygpXHJcbiAgICB9XHJcbiAgICByZXR1cm4gZnJvbURlZ3JlZXNBcnJheVxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgUGluY2VyQXJyb3dPYmplY3RcclxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUtBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUE4SEE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBS0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUF6SEE7QUFBQTtBQUFBO0FBMEhBO0FBQUE7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUEzQ0E7QUE0Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUtBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUdBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFMQTtBQUFBO0FBQUE7QUFBQTtBQVNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFNQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUF6ZUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUEyZUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBYkE7QUFBQTtBQUFBO0FBQUE7QUFlQTtBQUNBO0FBQ0E7QUFGQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFBQTtBQUVBO0FBVUE7QUFBQTtBQVBBO0FBQUE7QUFBQTtBQUlBO0FBQUE7QUFBQTtBQUlBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUtBO0FBQUE7QUFQQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQVVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQXBHQTtBQUFBO0FBQUE7QUFBQTtBQXNHQTtBQUNBO0FBQ0E7QUFGQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTEE7QUFBQTtBQUFBO0FBOExBO0FBQ0E7QUFBQTtBQXpMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBTUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFnSkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBZEE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBZ0JBO0FBbEJBO0FBQUE7QUFBQTtBQS9JQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUtBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUtBO0FBQ0E7QUFDQTtBQW9CQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBR0E7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFHQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBRUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFHQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUtBO0FBQ0E7QUFFQTtBQUtBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFsbURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBS0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBbkJBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQSsvQ0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/Obj/Base/PincerArrowObject/index.js\n"); /***/ }), @@ -2363,7 +2363,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) * /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ \"./node_modules/@babel/runtime/helpers/defineProperty.js\");\n/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ \"./node_modules/@babel/runtime/helpers/asyncToGenerator.js\");\n/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/toConsumableArray */ \"./node_modules/@babel/runtime/helpers/toConsumableArray.js\");\n/* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ \"./node_modules/@babel/runtime/helpers/classCallCheck.js\");\n/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ \"./node_modules/@babel/runtime/helpers/createClass.js\");\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ \"./node_modules/@babel/runtime/helpers/possibleConstructorReturn.js\");\n/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ \"./node_modules/@babel/runtime/helpers/getPrototypeOf.js\");\n/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ \"./node_modules/@babel/runtime/helpers/inherits.js\");\n/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @babel/runtime/regenerator */ \"./node_modules/@babel/runtime/regenerator/index.js\");\n/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8__);\n/* harmony import */ var _Element_Dialog__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../Element/Dialog */ \"./src/Obj/Element/Dialog/index.js\");\n/* harmony import */ var _Element_cy_html_tabs__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../Element/cy_html_tabs */ \"./src/Obj/Element/cy_html_tabs.js\");\n/* harmony import */ var _Element_richText__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../Element/richText */ \"./src/Obj/Element/richText.js\");\n/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./_element */ \"./src/Obj/Base/PolygonObject/_element.js\");\n/* harmony import */ var _index__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../index */ \"./src/Obj/Base/index.js\");\n/* harmony import */ var _LabelObject__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../LabelObject */ \"./src/Obj/Base/LabelObject/index.js\");\n/* harmony import */ var _Event_index__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../../../Event/index */ \"./src/Event/index.js\");\n/* harmony import */ var _MouseTip__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../../../MouseTip */ \"./src/MouseTip/index.js\");\n/* harmony import */ var _Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../../../Global/MultiViewportMode */ \"./src/Global/MultiViewportMode/index.js\");\n/* harmony import */ var _Element_datalist__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../../Element/datalist */ \"./src/Obj/Element/datalist.js\");\n/* harmony import */ var _Element_fontSelect__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../../Element/fontSelect */ \"./src/Obj/Element/fontSelect.js\");\n/* harmony import */ var _Global_SplitScreen__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../../../Global/SplitScreen */ \"./src/Global/SplitScreen/index.js\");\n/* harmony import */ var _Global_global__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../../../Global/global */ \"./src/Global/global.js\");\n\n\n\n\n\n\n\n\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default()(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\n\nfunction _createForOfIteratorHelper(r, e) { var t = \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && \"number\" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t.return || t.return(); } finally { if (u) throw o; } } }; }\nfunction _unsupportedIterableToArray(r, a) { if (r) { if (\"string\" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }\nfunction _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }\nfunction _callSuper(t, o, e) { return o = _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6___default()(o), _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_5___default()(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6___default()(t).constructor) : o.apply(t, e)); }\nfunction _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }\n/**\r\n * 多边形\r\n */\n\n\n\n\n\n\n\n\n\n\n\n\n\n// import EditParticle from \"../../ModelController/EditParticle\";\nvar PolygonObject = /*#__PURE__*/function (_Base) {\n /**\r\n * @constructor\r\n * @description 多边形\r\n * @param sdk\r\n * @param options {object} 属性\r\n * @param options.id {string} 唯一标识\r\n * @param options.show=true {boolean} 显示/隐藏\r\n * @param options.name {string} 名称\r\n * @param options.color='rgba(255, 0, 0, 0.5)' {string} 颜色\r\n * @param options.height {number} 高度\r\n * @param options.heightMode=2{number} 高度模式(0:海拔高度;1:相对地表;2:依附模式)\r\n * @param options.areaUnit='平方米' {string} 面积单位\r\n * @param options.line {object} 边框\r\n * @param options.line.width=2 {string} 边框宽\r\n * @param options.line.color=\"rgba(155, 155, 124, 0.89)\" {string} 边框颜色\r\n * @param {Array.} options.positions 必填,经纬度和高度的列表,值交替 [{lon,lat,alt},...]\r\n * @param options.positions[].lng {number} 经度\r\n * @param options.positions[].lat {number} 纬度\r\n * @param options.positions[].alt {number} 高度\r\n * @param options.label {object} 标签对象\r\n * @param options.label.text {string} 标签文本\r\n * @param options.label.show {string} 标签显隐\r\n * @param options.label.position {string} 标签位置\r\n * @param options.label.position {object} 标签位置\r\n * @param options.label.position.lng {number} 经度\r\n * @param options.label.position.lat {number} 纬度\r\n * @param options.label.position.alt {number} 高度\r\n * @param options.label.fontSize=20 {number} 字体大小\r\n * @param options.label.fontFamily=0 {number} 字体项 0:黑体;1:思源黑体;2:庞门正道标题体;3:数黑体\r\n * @param options.label.color=#ffffff {string} 字体颜色\r\n * @param options.label.lineWidth=4 {number} 引线宽\r\n * @param options.label.lineColor=#00ffff80 {string} 引线颜色\r\n * @param options.label.pixelOffset=20 {number} 字体偏移(引线长度)\r\n * @param options.label.backgroundColor=['#00ffff80', '#00ffff80'] {array} 背景颜色\r\n * @param options.label.scaleByDistance {boolean} 距离缩放\r\n * @param options.label.near=2000 {number} 视野缩放最近距离\r\n * @param options.label.far=100000 {number} 视野缩放最远距离\r\n * @param options.attribute {object} 属性内容\r\n * @param {object} options.attribute.link={} 链接\r\n * @param options.attribute.link.content=[]] {array} 链接内容\r\n * @param options.attribute.link.content[].name {string} 链接名称\r\n * @param options.attribute.link.content[].url {string} 链接地址\r\n * @param options.richTextContent {string} 富文本内容\r\n * @param options.customView {object} 默认视角\r\n * @param options.customView.orientation {object} 默认视角方位\r\n * @param options.customView.orientation.heading {number} 航向角\r\n * @param options.customView.orientation.pitch {number} 俯仰角\r\n * @param options.customView.orientation.roll {number} 翻滚角\r\n * @param options.customView.relativePosition {object} 视角相对位置\r\n * @param options.customView.relativePosition.lng {number} 经度\r\n * @param options.customView.relativePosition.lat {number} 纬度\r\n * @param options.customView.relativePosition.alt {number} 高度\r\n * \r\n \r\n * \r\n * @param _Dialog {object} 弹框事件\r\n * @param _Dialog.confirmCallBack {function} 弹框确认时的回调\r\n * */\n function PolygonObject(sdk) {\n var _this2;\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var _Dialog = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3___default()(this, PolygonObject);\n _this2 = _callSuper(this, PolygonObject, [sdk, options]);\n _this2.options.name = options.name || '未命名对象';\n _this2.options.color = options.color || 'rgba(255, 0, 0, 0.5)';\n _this2.options.show = options.show || options.show === false ? options.show : true;\n _this2.options.heightMode = options.heightMode || options.heightMode == 0 ? options.heightMode : 2;\n _this2.options.positions = options.positions || [];\n _this2.options.line = options.line || {};\n _this2.options.line.width = _this2.options.line.width || _this2.options.line.width === 0 ? _this2.options.line.width : 3;\n _this2.options.line.color = _this2.options.line.color || 'rgba(255, 0, 0, 1)';\n _this2.options['area-unit'] = options['area-unit'] || '平方米';\n _this2.entity;\n _this2.event = new _Event_index__WEBPACK_IMPORTED_MODULE_15__[\"default\"](_this2.sdk);\n _this2.operate = {};\n _this2._elms = {};\n _this2.Dialog = _Dialog;\n _this2.nodePoints = [];\n options.label = options.label || {};\n _this2.options.label = {\n text: _this2.options.name,\n show: options.label.show || false,\n position: options.label.position,\n fontSize: options.label.fontSize || options.label.fontSize === 0 ? options.label.fontSize : 20,\n fontFamily: options.label.fontFamily ? options.label.fontFamily : 0,\n color: options.label.color || '#ffffff',\n lineWidth: options.label.lineWidth || options.label.lineWidth === 0 ? options.label.lineWidth : 4,\n pixelOffset: options.label.pixelOffset || options.label.pixelOffset === 0 ? options.label.pixelOffset : 20,\n backgroundColor: options.label.backgroundColor || ['#00ffff80', '#00ffff80'],\n lineColor: options.label.lineColor || '#00ffff80',\n scaleByDistance: options.label.scaleByDistance || false,\n near: options.label.near || options.label.near === 0 ? options.label.near : 2000,\n far: options.label.far || options.label.far === 0 ? options.label.far : 100000\n };\n _this2.options.attribute = options.attribute || {};\n _this2.options.attribute.link = _this2.options.attribute.link || {};\n _this2.options.attribute.link.content = _this2.options.attribute.link.content || [];\n _this2.options.attribute.camera = _this2.options.attribute.camera || {};\n _this2.options.attribute.camera.content = _this2.options.attribute.camera.content || [];\n _this2.options.attribute.vr = _this2.options.attribute.vr || {};\n _this2.options.attribute.vr.content = _this2.options.attribute.vr.content || [];\n _this2.options.attribute.goods = _this2.options.attribute.goods || {};\n _this2.options.attribute.goods.content = _this2.options.attribute.goods.content || [];\n _this2.options.attributeType = options.attributeType || 'richText';\n if (!_this2.options.positions || _this2.options.positions.length < 3) {\n _this2._error = '多边形最少需要三个坐标!';\n console.warn(_this2._error);\n window.ELEMENT && window.ELEMENT.Message({\n message: _this2._error,\n type: 'warning',\n duration: 1500\n });\n } else {\n if (!_this2.options.height && _this2.options.height !== 0) {\n var height = _this2.options.positions[0].alt;\n for (var i = 1; i < _this2.options.positions.length; i++) {\n if (height < _this2.options.positions[i].alt) {\n height = _this2.options.positions[i].alt;\n }\n }\n _this2.options.height = height;\n }\n _this2.sdk.addIncetance(_this2.options.id, _this2);\n _this2._zIndex = _this2.sdk.entityMap.size;\n PolygonObject.create(_this2);\n }\n return _this2;\n }\n _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_7___default()(PolygonObject, _Base);\n return _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4___default()(PolygonObject, [{\n key: \"type\",\n get: function get() {\n return 'PolygonObject';\n }\n }, {\n key: \"color\",\n get: function get() {\n return this.options.color;\n },\n set: function set(v) {\n var _this3 = this;\n this.options.color = v || 'rgba(255, 0, 0, 0.5)';\n if (!this.sdk || !this.sdk.viewer || !this.entity || !this.entity.polygon) {\n return;\n }\n if (!this.sdk || !this.sdk.viewer || !this.entity || !this.entity.polygon) {\n return;\n }\n var material = Cesium.Color.fromCssColorString(this.options.color);\n if (this.sdk.viewer.scene.mode === 2) {\n this.heightMode = 0;\n material = new Cesium.CustomColorMaterialSource({\n color: this.options.color\n });\n }\n this.entity.polygon.material = material;\n if (this._elms.color) {\n this._elms.color.forEach(function (item, i) {\n var colorPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: _this3.options.color,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(c) {\n _this3.color = c;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this3.color = 'rgba(255,0,0,0.5)';\n } //点击清空按钮事件回调\n });\n _this3._elms.color[i] = colorPicker;\n });\n }\n }\n }, {\n key: \"heightMode\",\n get: function get() {\n return this.options.heightMode ? this.options.heightMode : 0;\n },\n set: function set(v) {\n var _this4 = this;\n this.entity.polygon.hierarchy = [];\n setTimeout(function () {\n _this4.options.heightMode = v || v == 0 ? v : 2;\n _this4.positionEditing = false;\n if (!_this4.entity) {\n return;\n }\n var positions = _this4.options.positions;\n var heightModeName = '';\n PolygonObject.closeNodeEdit(_this4);\n var ground = false;\n var disabled = false;\n _this4.renewPositions();\n _this4.entity.polyline.positions = [].concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(_this4.positions), [_this4.positions[0], _this4.positions[1]]);\n _this4.entity.polygon.hierarchy = new Cesium.PolygonHierarchy(_this4.positions);\n switch (_this4.options.heightMode) {\n case '0':\n case 0:\n heightModeName = '海拔高度';\n break;\n case '1':\n case 1:\n heightModeName = '相对地表';\n break;\n case '2':\n case 2:\n ground = true;\n disabled = true;\n heightModeName = '依附模型';\n break;\n }\n _this4.label.ground = ground;\n _this4.entity.polyline.clampToGround = ground;\n _this4.entity.polyline.arcType = !ground ? Cesium.ArcType.NONE : Cesium.ArcType.GEODESIC, _this4.entity.polygon.perPositionHeight = !ground ? true : false;\n _this4._elms.heightMode && (_this4._elms.heightMode.value = heightModeName);\n _this4._elms.heightModeObject && _this4._elms.heightModeObject.legp_searchActive(heightModeName);\n if (disabled) {\n _this4._elms.heightBox && (_this4._elms.heightBox.className = 'input-number input-number-unit-1 height-box disabled');\n _this4._elms.heightConfirm && _this4._elms.heightConfirm.setAttribute('disabled', 'disabled');\n } else {\n _this4._elms.heightBox && (_this4._elms.heightBox.className = 'input-number input-number-unit-1 height-box');\n _this4._elms.heightConfirm && _this4._elms.heightConfirm.removeAttribute('disabled');\n }\n }, 50);\n }\n }, {\n key: \"height\",\n get: function get() {\n return this.options.height;\n },\n set: function set(v) {\n var _this5 = this;\n if (!v || isNaN(Number(v))) {\n this.options.height = 0;\n } else {\n this.options.height = Number(Number(v).toFixed(2));\n }\n var ground;\n if (this.heightMode == 2) {\n ground = true;\n } else {\n ground = false;\n }\n this.renewPositions();\n setTimeout(function () {\n _this5.entity.polygon.hierarchy = new Cesium.PolygonHierarchy(_this5.positions);\n _this5.entity.polygon.perPositionHeight = !ground ? true : false;\n _this5.entity.polyline.positions = [].concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(_this5.positions), [_this5.positions[0], _this5.positions[1]]);\n _this5.entity.polyline.clampToGround = !ground ? false : true;\n _this5.entity.polyline.arcType = !ground ? Cesium.ArcType.NONE : Cesium.ArcType.GEODESIC;\n }, 0);\n this._elms.alt && this._elms.alt.forEach(function (item) {\n item.innerHTML = _this5.options.height;\n });\n }\n }, {\n key: \"lineColor\",\n get: function get() {\n return this.options.line.color;\n },\n set: function set(v) {\n var _this6 = this;\n this.options.line.color = v || 'rgba(255, 0, 0, 0.5)';\n if (!this.sdk || !this.sdk.viewer || !this.entity || !this.entity.polyline) {\n return;\n }\n this.entity.polyline.material = Cesium.Color.fromCssColorString(this.options.line.color);\n if (this._elms.lineColor) {\n this._elms.lineColor.forEach(function (item, i) {\n var lineColorPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: _this6.options.line.color,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(c) {\n _this6.lineColor = c;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this6.lineColor = 'rgba(255,0,0,0.5)';\n } //点击清空按钮事件回调\n });\n _this6._elms.lineColor[i] = lineColorPicker;\n });\n }\n }\n }, {\n key: \"lineWidth\",\n get: function get() {\n return this.options.line.width;\n },\n set: function set(v) {\n this.options.line.width = v || v === 0 ? v : 3;\n this.entity.polyline.width = this.options.line.width;\n this._elms.lineWidth && this._elms.lineWidth.forEach(function (item) {\n item.value = v;\n });\n }\n }, {\n key: \"area\",\n get: function get() {\n return this.options.area;\n },\n set: function set(v) {\n this.options.area = v;\n this._elms.area && this._elms.area.forEach(function (item) {\n item.value = v;\n });\n }\n }, {\n key: \"areaUnit\",\n get: function get() {\n return this.options['area-unit'];\n },\n set: function set(v) {\n this.options['area-unit'] = v;\n this._elms.areaUnit && this._elms.areaUnit.forEach(function (item) {\n item.value = v;\n });\n if (this.options.areaByMeter) {\n switch (v) {\n case '平方米':\n this.area = this.options.areaByMeter;\n break;\n case '平方千米':\n this.area = Number((this.options.areaByMeter / 1000000).toFixed(8));\n break;\n case '亩':\n this.area = Number((this.options.areaByMeter / 666.6666667).toFixed(4));\n break;\n case '公顷':\n this.area = Number((this.options.areaByMeter / 10000).toFixed(6));\n break;\n default:\n this.area = this.options.areaByMeter;\n }\n }\n }\n }, {\n key: \"labelShow\",\n get: function get() {\n return this.options.label.show;\n },\n set: function set(v) {\n this.options.label.show = v;\n if (this.show && !this.showView || this.showView == 3) {\n this.label.show = v;\n } else {\n this.label.show = false;\n }\n this._elms.labelShow && this._elms.labelShow.forEach(function (item) {\n item.checked = v;\n });\n }\n }, {\n key: \"labelFontFamily\",\n get: function get() {\n return this.options.label.fontFamily;\n },\n set: function set(v) {\n this.options.label.fontFamily = v || 0;\n this.label && (this.label.fontFamily = this.options.label.fontFamily);\n var name = Object(_Element_fontSelect__WEBPACK_IMPORTED_MODULE_19__[\"getFontFamilyName\"])(this.labelFontFamily) || '';\n this._elms.labelFontFamily && this._elms.labelFontFamily.forEach(function (item) {\n item.value = name;\n });\n }\n }, {\n key: \"labelColor\",\n get: function get() {\n return this.options.label.color;\n },\n set: function set(v) {\n var _this7 = this;\n this.options.label.color = v;\n this.label.color = v;\n if (this._elms.labelColor) {\n this._elms.labelColor.forEach(function (item, i) {\n var labelColorPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: _this7.labelColor,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this7.labelColor = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this7.labelColor = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n _this7._elms.labelColor[i] = labelColorPicker;\n });\n }\n }\n }, {\n key: \"labelFontSize\",\n get: function get() {\n return this.options.label.fontSize;\n },\n set: function set(v) {\n this.options.label.fontSize = v;\n this.label.fontSize = v;\n this._elms.labelFontSize && this._elms.labelFontSize.forEach(function (item) {\n item.value = v;\n });\n }\n }, {\n key: \"labelScaleByDistance\",\n get: function get() {\n return this.options.label.scaleByDistance;\n },\n set: function set(v) {\n this.options.label.scaleByDistance = v;\n this.label.scaleByDistance = v;\n this._elms.labelScaleByDistance && this._elms.labelScaleByDistance.forEach(function (item) {\n item.checked = v;\n });\n }\n }, {\n key: \"labelNear\",\n get: function get() {\n return this.options.label.near;\n },\n set: function set(v) {\n var near = v;\n if (near > this.labelFar) {\n near = this.labelFar;\n }\n this.options.label.near = near;\n this.label.near = near;\n this._elms.labelNear && this._elms.labelNear.forEach(function (item) {\n item.value = near;\n });\n }\n }, {\n key: \"labelFar\",\n get: function get() {\n return this.options.label.far;\n },\n set: function set(v) {\n var far = v;\n if (far < this.labelNear) {\n far = this.labelNear;\n }\n this.options.label.far = far;\n this.label.far = far;\n this._elms.labelFar && this._elms.labelFar.forEach(function (item) {\n item.value = far;\n });\n }\n }, {\n key: \"labelLineWidth\",\n get: function get() {\n return this.options.label.lineWidth;\n },\n set: function set(v) {\n this.options.label.lineWidth = v;\n this.label.lineWidth = v;\n this._elms.labelLineWidth && this._elms.labelLineWidth.forEach(function (item) {\n item.value = v;\n });\n }\n }, {\n key: \"labelPixelOffset\",\n get: function get() {\n return this.options.label.pixelOffset;\n },\n set: function set(v) {\n this.options.label.pixelOffset = v;\n this.label.pixelOffset = v;\n this._elms.labelPixelOffset && this._elms.labelPixelOffset.forEach(function (item) {\n item.value = v;\n });\n }\n }, {\n key: \"labelLineColor\",\n get: function get() {\n return this.options.label.lineColor;\n },\n set: function set(v) {\n var _this8 = this;\n this.options.label.lineColor = v;\n this.label.lineColor = v;\n if (this._elms.labelLineColor) {\n this._elms.labelLineColor.forEach(function (item, i) {\n var lineColorPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: _this8.labelLineColor,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this8.labelLineColor = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this8.labelLineColor = 'rgba(0,255,255,0.5)';\n } //点击清空按钮事件回调\n });\n _this8._elms.labelLineColor[i] = lineColorPicker;\n });\n }\n }\n }, {\n key: \"labelBackgroundColorStart\",\n get: function get() {\n return this.options.label.backgroundColor[0];\n },\n set: function set(v) {\n var _this9 = this;\n this.options.label.backgroundColor[0] = v;\n this.label.backgroundColor = [v, this.label.backgroundColor[1]];\n if (this._elms.labelBackgroundColorStart) {\n this._elms.labelBackgroundColorStart.forEach(function (item, i) {\n var labelBackgroundColorStartPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: _this9.labelBackgroundColorStart,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this9.labelBackgroundColorStart = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this9.labelBackgroundColorStart = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n _this9._elms.labelBackgroundColorStart[i] = labelBackgroundColorStartPicker;\n });\n }\n }\n }, {\n key: \"labelBackgroundColorEnd\",\n get: function get() {\n return this.options.label.backgroundColor[1];\n },\n set: function set(v) {\n var _this10 = this;\n this.options.label.backgroundColor[1] = v;\n this.label.backgroundColor = [this.label.backgroundColor[0], v];\n if (this._elms.labelBackgroundColorEnd) {\n this._elms.labelBackgroundColorEnd.forEach(function (item, i) {\n var labelBackgroundColorEndPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: _this10.labelBackgroundColorEnd,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this10.labelBackgroundColorEnd = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this10.labelBackgroundColorEnd = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n _this10._elms.labelBackgroundColorEnd[i] = labelBackgroundColorEndPicker;\n });\n }\n }\n }, {\n key: \"attributeType\",\n get: function get() {\n return this.options.attributeType;\n },\n set: function set(v) {\n this.options.attributeType = v;\n this._elms.attributeType && this._elms.attributeType.forEach(function (item) {\n item.value = v;\n });\n var attributeContent = this._DialogObject._element.content.getElementsByClassName('attribute-content');\n for (var i = 0; i < attributeContent.length; i++) {\n if (attributeContent[i].className.indexOf('attribute-content-' + v) > -1) {\n attributeContent[i].style.display = 'block';\n } else {\n attributeContent[i].style.display = 'none';\n }\n }\n }\n }, {\n key: \"attributeLink\",\n get: function get() {\n return this.options.attribute.link.content;\n },\n set: function set(v) {\n var _this11 = this;\n this.options.attribute.link.content = v;\n if (!this._DialogObject || !this._DialogObject._element || !this._DialogObject._element.content || this._DialogObject._element.content.getElementsByClassName('attribute-content-link').length == 0) {\n return;\n }\n var table = this._DialogObject._element.content.getElementsByClassName('attribute-content-link')[1].getElementsByClassName('table')[0];\n var tableContent = table.getElementsByClassName('table-body')[0];\n tableContent.innerHTML = '';\n if (this.options.attribute.link.content.length > 0) {\n table.getElementsByClassName('table-empty')[0].style.display = 'none';\n } else {\n table.getElementsByClassName('table-empty')[0].style.display = 'flex';\n }\n for (var i = 0; i < this.options.attribute.link.content.length; i++) {\n var tr = \"\\n
\\n
\" + this.options.attribute.link.content[i].name + \"
\\n
\" + this.options.attribute.link.content[i].url + \"
\\n
\\n \\n \\n
\\n
\";\n var trElm = document.createRange().createContextualFragment(tr);\n tableContent.appendChild(trElm);\n }\n var item = tableContent.getElementsByClassName('tr');\n var fun = {\n linkEdit: function () {\n var _linkEdit = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee(index) {\n var table, tableContent, item, _loop, _i;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee$(_context3) {\n while (1) switch (_context3.prev = _context3.next) {\n case 0:\n _context3.next = 2;\n return _this11.options.attribute.link.content;\n case 2:\n _this11.attributeLink = _context3.sent;\n table = _this11._DialogObject._element.content.getElementsByClassName('attribute-content-link')[1].getElementsByClassName('table')[0];\n tableContent = table.getElementsByClassName('table-body')[0];\n item = tableContent.getElementsByClassName('tr');\n _loop = /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _loop(_i) {\n var height, _html, textareaElm, td, btn, n, _iterator, _step, _loop2;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _loop$(_context2) {\n while (1) switch (_context2.prev = _context2.next) {\n case 0:\n if (!(index === _i)) {\n _context2.next = 36;\n break;\n }\n height = item[_i].offsetHeight;\n _html = \"\\n
\\n \\n
\\n
\\n \\n
\\n
\\n \\n \\n
\";\n item[_i].innerHTML = _html;\n textareaElm = item[_i].getElementsByClassName('link-edit')[0];\n textareaElm.style.height = height - 10 + 'px';\n td = item[_i].getElementsByClassName('td');\n td[0].getElementsByClassName('input')[0].value = _this11.options.attribute.link.content[index].name;\n td[1].getElementsByClassName('input')[0].value = _this11.options.attribute.link.content[index].url;\n btn = item[_i].getElementsByTagName('button');\n n = 0;\n case 11:\n if (!(n < btn.length)) {\n _context2.next = 35;\n break;\n }\n if (!(!btn[n] || !btn[n].attributes)) {\n _context2.next = 14;\n break;\n }\n return _context2.abrupt(\"continue\", 32);\n case 14:\n _iterator = _createForOfIteratorHelper(btn[n].attributes);\n _context2.prev = 15;\n _loop2 = /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _loop2() {\n var m;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _loop2$(_context) {\n while (1) switch (_context.prev = _context.next) {\n case 0:\n m = _step.value;\n if (!(m.name === '@click')) {\n _context.next = 5;\n break;\n }\n btn[n].addEventListener('click', function (e) {\n if (typeof fun[m.value] === 'function') {\n fun[m.value]({\n name: td[0].getElementsByClassName('input')[0].value,\n url: td[1].getElementsByClassName('input')[0].value\n }, _i);\n }\n });\n btn[n].attributes.removeNamedItem(m.name);\n return _context.abrupt(\"return\", 1);\n case 5:\n case \"end\":\n return _context.stop();\n }\n }, _loop2);\n });\n _iterator.s();\n case 18:\n if ((_step = _iterator.n()).done) {\n _context2.next = 24;\n break;\n }\n return _context2.delegateYield(_loop2(), \"t0\", 20);\n case 20:\n if (!_context2.t0) {\n _context2.next = 22;\n break;\n }\n return _context2.abrupt(\"break\", 24);\n case 22:\n _context2.next = 18;\n break;\n case 24:\n _context2.next = 29;\n break;\n case 26:\n _context2.prev = 26;\n _context2.t1 = _context2[\"catch\"](15);\n _iterator.e(_context2.t1);\n case 29:\n _context2.prev = 29;\n _iterator.f();\n return _context2.finish(29);\n case 32:\n n++;\n _context2.next = 11;\n break;\n case 35:\n return _context2.abrupt(\"return\", 1);\n case 36:\n case \"end\":\n return _context2.stop();\n }\n }, _loop, null, [[15, 26, 29, 32]]);\n });\n _i = 0;\n case 8:\n if (!(_i < item.length)) {\n _context3.next = 15;\n break;\n }\n return _context3.delegateYield(_loop(_i), \"t0\", 10);\n case 10:\n if (!_context3.t0) {\n _context3.next = 12;\n break;\n }\n return _context3.abrupt(\"break\", 15);\n case 12:\n _i++;\n _context3.next = 8;\n break;\n case 15:\n case \"end\":\n return _context3.stop();\n }\n }, _callee);\n }));\n function linkEdit(_x) {\n return _linkEdit.apply(this, arguments);\n }\n return linkEdit;\n }(),\n linkDelete: function linkDelete(i) {\n _this11.options.attribute.link.content.splice(i, 1);\n _this11.attributeLink = _this11.options.attribute.link.content;\n },\n confirmEdit: function confirmEdit(value, i) {\n var name = value.name && value.name.replace(/\\s/g, '');\n var url = value.url && value.url.replace(/\\s/g, '');\n if (name && url) {\n _this11.options.attribute.link.content[i] = value;\n } else {\n window.ELEMENT && window.ELEMENT.Message({\n message: '名称或链接不能为空!',\n type: 'warning',\n duration: 1500\n });\n }\n _this11.attributeLink = _this11.options.attribute.link.content;\n },\n cancelEdit: function cancelEdit() {\n _this11.attributeLink = _this11.options.attribute.link.content;\n },\n fileSelect: function fileSelect(value, i) {\n var fileElm = item[i].getElementsByClassName('file-select')[0];\n fileElm.click();\n fileElm.removeEventListener('change', _fileSelect);\n fileElm.addEventListener('change', _fileSelect);\n }\n };\n var _fileSelect = function _fileSelect(event) {\n if (event.target.value) {\n var td = item[event.target.getAttribute('index')].getElementsByClassName('td');\n td[1].getElementsByClassName('input')[0].value = event.target.value;\n event.target.value = null;\n }\n };\n var _loop3 = function _loop3(_i2) {\n var btn = item[_i2].getElementsByTagName('button');\n for (var n = 0; n < btn.length; n++) {\n if (!btn[n] || !btn[n].attributes) {\n continue;\n }\n var _iterator2 = _createForOfIteratorHelper(btn[n].attributes),\n _step2;\n try {\n var _loop4 = function _loop4() {\n var m = _step2.value;\n if (m.name === '@click') {\n btn[n].addEventListener('click', function (e) {\n if (typeof fun[m.value] === 'function') {\n fun[m.value](_i2);\n }\n });\n btn[n].attributes.removeNamedItem(m.name);\n return 1; // break\n }\n };\n for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {\n if (_loop4()) break;\n }\n } catch (err) {\n _iterator2.e(err);\n } finally {\n _iterator2.f();\n }\n }\n };\n for (var _i2 = 0; _i2 < item.length; _i2++) {\n _loop3(_i2);\n }\n }\n }, {\n key: \"attributeCamera\",\n get: function get() {\n return this.options.attribute.camera.content;\n },\n set: function set(v) {\n this.options.attribute.camera.content = v;\n }\n }, {\n key: \"attributeVr\",\n get: function get() {\n return this.options.attribute.vr.content;\n },\n set: function set(v) {\n var _this12 = this;\n this.options.attribute.vr.content = v;\n if (!this._DialogObject || !this._DialogObject._element || !this._DialogObject._element.content || this._DialogObject._element.content.getElementsByClassName('attribute-content-vr').length == 0) {\n return;\n }\n var table = this._DialogObject._element.content.getElementsByClassName('attribute-content-vr')[1].getElementsByClassName('table')[0];\n var tableContent = table.getElementsByClassName('table-body')[0];\n tableContent.innerHTML = '';\n if (this.options.attribute.vr.content.length > 0) {\n table.getElementsByClassName('table-empty')[0].style.display = 'none';\n } else {\n table.getElementsByClassName('table-empty')[0].style.display = 'flex';\n }\n for (var i = 0; i < this.options.attribute.vr.content.length; i++) {\n var tr = \"\\n
\\n
\" + this.options.attribute.vr.content[i].name + \"
\\n
\" + this.options.attribute.vr.content[i].url + \"
\\n
\\n \\n \\n
\\n
\";\n var trElm = document.createRange().createContextualFragment(tr);\n tableContent.appendChild(trElm);\n }\n var item = tableContent.getElementsByClassName('tr');\n var fun = {\n vrEdit: function () {\n var _vrEdit = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee2(index) {\n var table, tableContent, item, _loop5, _i3;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee2$(_context6) {\n while (1) switch (_context6.prev = _context6.next) {\n case 0:\n _context6.next = 2;\n return _this12.options.attribute.vr.content;\n case 2:\n _this12.attributeVr = _context6.sent;\n table = _this12._DialogObject._element.content.getElementsByClassName('attribute-content-vr')[1].getElementsByClassName('table')[0];\n tableContent = table.getElementsByClassName('table-body')[0];\n item = tableContent.getElementsByClassName('tr');\n _loop5 = /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _loop5(_i3) {\n var height, _html2, textareaElm, td, btn, n, _iterator3, _step3, _loop6;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _loop5$(_context5) {\n while (1) switch (_context5.prev = _context5.next) {\n case 0:\n if (!(index === _i3)) {\n _context5.next = 36;\n break;\n }\n height = item[_i3].offsetHeight;\n _html2 = \"\\n
\\n \\n
\\n
\\n \\n
\\n
\\n \\n \\n
\";\n item[_i3].innerHTML = _html2;\n textareaElm = item[_i3].getElementsByClassName('link-edit')[0];\n textareaElm.style.height = height - 10 + 'px';\n td = item[_i3].getElementsByClassName('td');\n td[0].getElementsByClassName('input')[0].value = _this12.options.attribute.vr.content[index].name;\n td[1].getElementsByClassName('input')[0].value = _this12.options.attribute.vr.content[index].url;\n btn = item[_i3].getElementsByTagName('button');\n n = 0;\n case 11:\n if (!(n < btn.length)) {\n _context5.next = 35;\n break;\n }\n if (!(!btn[n] || !btn[n].attributes)) {\n _context5.next = 14;\n break;\n }\n return _context5.abrupt(\"continue\", 32);\n case 14:\n _iterator3 = _createForOfIteratorHelper(btn[n].attributes);\n _context5.prev = 15;\n _loop6 = /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _loop6() {\n var m;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _loop6$(_context4) {\n while (1) switch (_context4.prev = _context4.next) {\n case 0:\n m = _step3.value;\n if (!(m.name === '@click')) {\n _context4.next = 5;\n break;\n }\n btn[n].addEventListener('click', function (e) {\n if (typeof fun[m.value] === 'function') {\n fun[m.value]({\n name: td[0].getElementsByClassName('input')[0].value,\n url: td[1].getElementsByClassName('input')[0].value\n }, _i3);\n }\n });\n btn[n].attributes.removeNamedItem(m.name);\n return _context4.abrupt(\"return\", 1);\n case 5:\n case \"end\":\n return _context4.stop();\n }\n }, _loop6);\n });\n _iterator3.s();\n case 18:\n if ((_step3 = _iterator3.n()).done) {\n _context5.next = 24;\n break;\n }\n return _context5.delegateYield(_loop6(), \"t0\", 20);\n case 20:\n if (!_context5.t0) {\n _context5.next = 22;\n break;\n }\n return _context5.abrupt(\"break\", 24);\n case 22:\n _context5.next = 18;\n break;\n case 24:\n _context5.next = 29;\n break;\n case 26:\n _context5.prev = 26;\n _context5.t1 = _context5[\"catch\"](15);\n _iterator3.e(_context5.t1);\n case 29:\n _context5.prev = 29;\n _iterator3.f();\n return _context5.finish(29);\n case 32:\n n++;\n _context5.next = 11;\n break;\n case 35:\n return _context5.abrupt(\"return\", 1);\n case 36:\n case \"end\":\n return _context5.stop();\n }\n }, _loop5, null, [[15, 26, 29, 32]]);\n });\n _i3 = 0;\n case 8:\n if (!(_i3 < item.length)) {\n _context6.next = 15;\n break;\n }\n return _context6.delegateYield(_loop5(_i3), \"t0\", 10);\n case 10:\n if (!_context6.t0) {\n _context6.next = 12;\n break;\n }\n return _context6.abrupt(\"break\", 15);\n case 12:\n _i3++;\n _context6.next = 8;\n break;\n case 15:\n case \"end\":\n return _context6.stop();\n }\n }, _callee2);\n }));\n function vrEdit(_x2) {\n return _vrEdit.apply(this, arguments);\n }\n return vrEdit;\n }(),\n vrDelete: function vrDelete(i) {\n _this12.options.attribute.vr.content.splice(i, 1);\n _this12.attributeVr = _this12.options.attribute.vr.content;\n },\n confirmEdit: function confirmEdit(value, i) {\n var name = value.name && value.name.replace(/\\s/g, '');\n var url = value.url && value.url.replace(/\\s/g, '');\n if (name && url) {\n _this12.options.attribute.vr.content[i] = value;\n } else {\n window.ELEMENT && window.ELEMENT.Message({\n message: '名称或链接不能为空!',\n type: 'warning',\n duration: 1500\n });\n }\n _this12.attributeVr = _this12.options.attribute.vr.content;\n },\n cancelEdit: function cancelEdit() {\n _this12.attributeVr = _this12.options.attribute.vr.content;\n },\n fileSelect: function fileSelect(value, i) {\n var fileElm = item[i].getElementsByClassName('file-select')[0];\n fileElm.click();\n fileElm.removeEventListener('change', _fileSelect2);\n fileElm.addEventListener('change', _fileSelect2);\n }\n };\n var _fileSelect2 = function _fileSelect2(event) {\n if (event.target.value) {\n var td = item[event.target.getAttribute('index')].getElementsByClassName('td');\n td[1].getElementsByClassName('input')[0].value = event.target.value;\n event.target.value = null;\n }\n };\n var _loop7 = function _loop7(_i4) {\n var btn = item[_i4].getElementsByTagName('button');\n for (var n = 0; n < btn.length; n++) {\n if (!btn[n] || !btn[n].attributes) {\n continue;\n }\n var _iterator4 = _createForOfIteratorHelper(btn[n].attributes),\n _step4;\n try {\n var _loop8 = function _loop8() {\n var m = _step4.value;\n if (m.name === '@click') {\n btn[n].addEventListener('click', function (e) {\n if (typeof fun[m.value] === 'function') {\n fun[m.value](_i4);\n }\n });\n btn[n].attributes.removeNamedItem(m.name);\n return 1; // break\n }\n };\n for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {\n if (_loop8()) break;\n }\n } catch (err) {\n _iterator4.e(err);\n } finally {\n _iterator4.f();\n }\n }\n };\n for (var _i4 = 0; _i4 < item.length; _i4++) {\n _loop7(_i4);\n }\n }\n }, {\n key: \"attributeGoods\",\n get: function get() {\n return this.options.attribute.goods.content;\n },\n set: function set(v) {\n this.options.attribute.goods.content = v;\n }\n }, {\n key: \"edit\",\n value: // 编辑框\n function () {\n var _edit = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee3(state) {\n var _this13 = this;\n var _this, createSpatialInfoTableContent, contentElm, tabsElm, colorPicker, linecolorPicker, labelColorPicker, lineColorPicker, labelBackgroundColorStartPicker, labelBackgroundColorEndPicker, all_elm;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee3$(_context7) {\n while (1) switch (_context7.prev = _context7.next) {\n case 0:\n _this = this;\n this.originalOptions = this.deepCopyObj(this.options);\n if (this._DialogObject && this._DialogObject.close) {\n this._DialogObject.close();\n this._DialogObject = null;\n }\n if (!state) {\n _context7.next = 32;\n break;\n }\n createSpatialInfoTableContent = function createSpatialInfoTableContent() {\n var tableElm = contentElm.getElementsByClassName('spatial-info-table')[0];\n var tBodyElm = tableElm.getElementsByClassName('table-body')[0];\n tBodyElm.innerHTML = '';\n _this._elms.lng = [];\n _this._elms.lngInput = [];\n _this._elms.lat = [];\n _this._elms.latInput = [];\n _this._elms.alt = [];\n _this._elms.altInput = [];\n var _loop9 = function _loop9(i) {\n var tr = document.createElement('div');\n tr.className = 'tr';\n tr.innerHTML = \"\\n
\".concat(i + 1, \"
\\n
\\n
\\n
\\n \");\n var lngBox = tr.getElementsByClassName('lng')[0];\n var lng = document.createElement('span');\n lng.innerHTML = _this.options.positions[i].lng.toFixed(8);\n lngBox.appendChild(lng);\n var lngInput = document.createElement('input');\n lngInput.className = 'input';\n lngInput.type = 'number';\n lngInput.title = '';\n lngInput.min = -180;\n lngInput.max = 180;\n lngInput.value = _this.options.positions[i].lng.toFixed(8);\n var latBox = tr.getElementsByClassName('lat')[0];\n var lat = document.createElement('span');\n lat.innerHTML = _this.options.positions[i].lat.toFixed(8);\n latBox.appendChild(lat);\n var latInput = document.createElement('input');\n latInput.className = 'input';\n latInput.type = 'number';\n latInput.title = '';\n latInput.min = -90;\n latInput.max = 90;\n latInput.value = _this.options.positions[i].lat.toFixed(8);\n var altBox = tr.getElementsByClassName('alt')[0];\n var alt = document.createElement('span');\n alt.innerHTML = _this.height.toFixed(2);\n altBox.appendChild(alt);\n var altInput = document.createElement('input');\n altInput.className = 'input';\n altInput.type = 'number';\n altInput.title = '';\n altInput.min = -9999999;\n altInput.max = 999999999;\n altInput.value = _this.height.toFixed(2);\n lngBox.addEventListener('dblclick', function () {\n lngBox.innerHTML = '';\n lngInput.value = Number(_this.options.positions[i].lng.toFixed(8));\n lngBox.appendChild(lngInput);\n lngInput.focus();\n if (_this.operate.positionEditing) {\n _this.positionEditing = false;\n }\n PolygonObject.closeNodeEdit(_this);\n _this.heightMode = _this.heightMode;\n });\n lngInput.addEventListener('blur', function () {\n lngInput.value = Number(_this.options.positions[i].lng.toFixed(8));\n lngBox.innerHTML = '';\n lngBox.appendChild(lng);\n });\n lngInput.addEventListener('input', function () {\n _this.options.positions[i].lng = Number(Number(lngInput.value).toFixed(8));\n lng.innerHTML = _this.options.positions[i].lng.toFixed(8);\n _this.height = _this.height;\n });\n latBox.addEventListener('dblclick', function () {\n latBox.innerHTML = '';\n latInput.value = Number(_this.options.positions[i].lat.toFixed(8));\n latBox.appendChild(latInput);\n latInput.focus();\n if (_this.operate.positionEditing) {\n _this.positionEditing = false;\n }\n PolygonObject.closeNodeEdit(_this);\n _this.heightMode = _this.heightMode;\n });\n latInput.addEventListener('blur', function () {\n latInput.value = Number(_this.options.positions[i].lat.toFixed(8));\n latBox.innerHTML = '';\n latBox.appendChild(lat);\n });\n latInput.addEventListener('input', function () {\n _this.options.positions[i].lat = Number(Number(latInput.value).toFixed(8));\n lat.innerHTML = _this.options.positions[i].lat.toFixed(8);\n _this.height = _this.height;\n });\n altBox.addEventListener('dblclick', function () {\n if (_this.heightMode == 2) {\n return;\n }\n altBox.innerHTML = '';\n altInput.value = Number(_this.height.toFixed(2));\n altBox.appendChild(altInput);\n altInput.focus();\n if (_this.operate.positionEditing) {\n _this.positionEditing = false;\n }\n PolygonObject.closeNodeEdit(_this);\n _this.heightMode = _this.heightMode;\n });\n altInput.addEventListener('blur', function () {\n altInput.value = Number(_this.height.toFixed(2));\n altBox.innerHTML = '';\n altBox.appendChild(alt);\n });\n altInput.addEventListener('input', function () {\n _this.height = Number(Number(altInput.value).toFixed(2));\n alt.innerHTML = Number(_this.height.toFixed(2));\n });\n _this._elms.lng.push(lng);\n _this._elms.lngInput.push(lngInput);\n _this._elms.lat.push(lat);\n _this._elms.latInput.push(latInput);\n _this._elms.alt.push(alt);\n _this._elms.altInput.push(altInput);\n tBodyElm.appendChild(tr);\n };\n for (var i = 0; i < _this.options.positions.length; i++) {\n _loop9(i);\n }\n };\n _context7.next = 7;\n return new _Element_Dialog__WEBPACK_IMPORTED_MODULE_9__[\"default\"](this.sdk, this.options, {\n title: '面属性',\n left: '180px',\n top: '100px',\n confirmCallBack: function confirmCallBack(options) {\n _this13.name = _this13.name.trim();\n if (!_this13.name) {\n _this13.name = '未命名对象';\n }\n _this13.options.label.position = {\n lng: _this13.label.position[0],\n lat: _this13.label.position[1],\n alt: _this13.label.position[2]\n };\n _this13.originalOptions = _this13.deepCopyObj(_this13.options);\n _this13._DialogObject.close();\n _this13.Dialog.confirmCallBack && _this13.Dialog.confirmCallBack(_this13.originalOptions);\n Object(_Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_17__[\"syncData\"])(_this13.sdk, _this13.options.id);\n Object(_Global_SplitScreen__WEBPACK_IMPORTED_MODULE_20__[\"syncSplitData\"])(_this13.sdk, _this13.options.id);\n },\n resetCallBack: function resetCallBack() {\n _this13.reset();\n _this13.Dialog.resetCallBack && _this13.Dialog.resetCallBack();\n },\n removeCallBack: function removeCallBack() {\n _this13.Dialog.removeCallBack && _this13.Dialog.removeCallBack();\n },\n closeCallBack: function closeCallBack() {\n _this13.previous = null;\n _this13.reset();\n _this13.positionEditing = false;\n _this13.Dialog.closeCallBack && _this13.Dialog.closeCallBack();\n for (var i = 0; i < _this13.nodePoints.length; i++) {\n _this13.sdk.viewer.entities.remove(_this13.nodePoints[i]);\n }\n _this13.nodePoints = [];\n YJ.Measure.SetMeasureStatus(false);\n _this13.event && _this13.event.destroy();\n _this13.tip && _this13.tip.destroy();\n },\n showCallBack: function showCallBack(show) {\n _this13.options.show = show;\n _this13.originalOptions.show = show;\n _this13.show = show;\n _this13.Dialog.showCallBack && _this13.Dialog.showCallBack();\n },\n translationalCallBack: function translationalCallBack() {\n _this13.positionEditing = !_this13.positionEditing;\n },\n // 二次编辑回调\n secondaryEditCallBack: function secondaryEditCallBack() {\n PolygonObject.nodeEdit(_this13, function () {\n createSpatialInfoTableContent();\n });\n }\n });\n case 7:\n this._DialogObject = _context7.sent;\n this._DialogObject._element.body.className = this._DialogObject._element.body.className + ' polygon';\n contentElm = document.createElement('div');\n contentElm.innerHTML = Object(_element__WEBPACK_IMPORTED_MODULE_12__[\"html\"])(this);\n this._DialogObject.contentAppChild(contentElm);\n this.attributeType = this.options.attributeType;\n this.attributeCamera = this.options.attribute.camera.content;\n\n // 创建标签页\n tabsElm = new _Element_cy_html_tabs__WEBPACK_IMPORTED_MODULE_10__[\"default\"]('polygon-object-edit-tabs', undefined, this.sdk); // 颜色组件\n colorPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName('color')[0],\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: this.color,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this13.color = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this13.color = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n linecolorPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName('lineColor')[0],\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: this.lineColor,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this13.lineColor = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this13.lineColor = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n labelColorPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName('labelColor')[0],\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: this.labelColor,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this13.labelColor = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this13.labelColor = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n lineColorPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName('labelLineColor')[0],\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: this.labelLineColor,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this13.labelLineColor = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this13.labelLineColor = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n labelBackgroundColorStartPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName('labelBackgroundColorStart')[0],\n size: 'mini',\n alpha: true,\n defaultColor: this.labelBackgroundColorStart,\n disabled: false,\n openPickerAni: 'opacity',\n sure: function sure(color) {\n _this13.labelBackgroundColorStart = color;\n },\n clear: function clear() {\n _this13.labelBackgroundColorStart = 'rgba(255,255,255,1)';\n }\n });\n labelBackgroundColorEndPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName('labelBackgroundColorEnd')[0],\n size: 'mini',\n alpha: true,\n defaultColor: this.labelBackgroundColorEnd,\n disabled: false,\n openPickerAni: 'opacity',\n sure: function sure(color) {\n _this13.labelBackgroundColorEnd = color;\n },\n clear: function clear() {\n _this13.labelBackgroundColorEnd = 'rgba(255,255,255,1)';\n }\n }); // let heightElm = this._DialogObject._element.body.getElementsByClassName(\n // 'height'\n // )[0]\n // heightElm.value = this.height\n // heightElm.addEventListener('input', e => {\n // let value = e.target.value\n // if (\n // (e.data === '.' && value.indexOf('.') === -1) ||\n // (e.data === '-' && value.indexOf('-') === -1)\n // ) {\n // } else {\n // if (value) {\n // value = Number(value)\n // if (e.target.max && value > Number(e.target.max)) {\n // value = Number(e.target.max)\n // }\n // if (e.target.min && value < Number(e.target.min)) {\n // value = Number(e.target.min)\n // }\n // }\n // this.height = value\n // }\n // })\n all_elm = contentElm.getElementsByTagName('*');\n PolygonObject.EventBinding(this, all_elm);\n // this._elms.height = [heightElm]\n this._elms.color = [colorPicker];\n this._elms.lineColor = [linecolorPicker];\n this._elms.labelColor = [labelColorPicker];\n this._elms.labelLineColor = [lineColorPicker];\n this._elms.labelBackgroundColorStart = [labelBackgroundColorStartPicker];\n this._elms.labelBackgroundColorEnd = [labelBackgroundColorEndPicker];\n setTimeout(function () {\n _this13.attributeLink = _this13.options.attribute.link.content;\n _this13.attributeVr = _this13.options.attribute.vr.content;\n _this13.cameraSelect && _this13.cameraSelect();\n _this13.goodsSelect && _this13.goodsSelect();\n var tagData = _this13.attributeSelect;\n var attributeElm = _this13._DialogObject._element.content.getElementsByClassName('attribute-select-box')[0];\n if (attributeElm) {\n var legpObject = Object(_Element_datalist__WEBPACK_IMPORTED_MODULE_18__[\"legp\"])(attributeElm, '.attribute-select');\n legpObject.legp_search(tagData);\n var attributeSelectElm = _this13._DialogObject._element.content.getElementsByClassName('attribute-select')[0].getElementsByTagName('input')[0];\n for (var i = 0; i < tagData.length; i++) {\n if (tagData[i].key === _this13.options.attributeType) {\n attributeSelectElm.value = tagData[i].value;\n legpObject.legp_searchActive(tagData[i].value);\n break;\n }\n }\n attributeSelectElm.addEventListener('input', function () {\n for (var _i5 = 0; _i5 < tagData.length; _i5++) {\n if (tagData[_i5].value === attributeSelectElm.value) {\n _this13.attributeType = tagData[_i5].key;\n break;\n }\n }\n });\n }\n var unitData = [{\n name: '平方米',\n value: '平方米'\n }, {\n name: '平方千米',\n value: '平方千米'\n }, {\n name: '亩',\n value: '亩'\n }, {\n name: '公顷',\n value: '公顷'\n }];\n var unitDataLegpObject = Object(_Element_datalist__WEBPACK_IMPORTED_MODULE_18__[\"legp\"])(_this13._DialogObject._element.content.getElementsByClassName('input-select-unit-box')[0], '.input-select-unit');\n if (unitDataLegpObject) {\n unitDataLegpObject.legp_search(unitData);\n var unitDataLegpElm = _this13._DialogObject._element.content.getElementsByClassName('input-select-unit')[0].getElementsByTagName('input')[0];\n unitDataLegpElm.value = _this13.options['area-unit'];\n for (var _i6 = 0; _i6 < unitData.length; _i6++) {\n if (unitData[_i6].value === unitDataLegpElm.value) {\n unitDataLegpObject.legp_searchActive(unitData[_i6].value);\n break;\n }\n }\n unitDataLegpElm.addEventListener('input', function () {\n for (var _i7 = 0; _i7 < unitData.length; _i7++) {\n if (unitData[_i7].value === unitDataLegpElm.value) {\n _this13.areaUnit = unitData[_i7].value;\n break;\n }\n }\n });\n }\n var heightBoxElm = _this13._DialogObject._element.content.getElementsByClassName('height-box')[0];\n var heightElm = heightBoxElm.getElementsByClassName('height')[0];\n var heightConfirmElm = _this13._DialogObject._element.content.getElementsByClassName('height-confirm')[0];\n heightElm.value = 10;\n if (_this13.heightMode == 2) {\n heightBoxElm && (heightBoxElm.className = 'input-number input-number-unit-1 height-box disabled');\n heightConfirmElm && heightConfirmElm.setAttribute('disabled', 'disabled');\n } else {\n heightBoxElm && (heightBoxElm.className = 'input-number input-number-unit-1 height-box');\n heightConfirmElm && heightConfirmElm.removeAttribute('disabled');\n }\n var heightModeData = [{\n name: '海拔高度',\n value: '海拔高度',\n key: '0'\n }, {\n name: '相对地表',\n value: '相对地表',\n key: '1'\n }, {\n name: '依附模型',\n value: '依附模型',\n key: '2'\n }];\n var heightModeObject = Object(_Element_datalist__WEBPACK_IMPORTED_MODULE_18__[\"legp\"])(_this13._DialogObject._element.content.getElementsByClassName('height-mode-box')[0], '.height-mode');\n if (heightModeObject) {\n heightModeObject.legp_search(heightModeData);\n var heightModeDataLegpElm = _this13._DialogObject._element.content.getElementsByClassName('height-mode')[0].getElementsByTagName('input')[0];\n for (var _i8 = 0; _i8 < heightModeData.length; _i8++) {\n if (heightModeData[_i8].key == _this13.heightMode) {\n heightModeDataLegpElm.value = heightModeData[_i8].value;\n heightModeObject.legp_searchActive(heightModeData[_i8].value);\n break;\n }\n }\n heightModeDataLegpElm.addEventListener('input', function () {\n for (var _i9 = 0; _i9 < heightModeData.length; _i9++) {\n if (heightModeData[_i9].value === heightModeDataLegpElm.value) {\n _this13.heightMode = heightModeData[_i9].key;\n break;\n }\n }\n });\n heightElm.addEventListener('input', function () {\n switch (_this13.heightMode) {\n case 0:\n case '0':\n break;\n case 1:\n case '1':\n break;\n case 2:\n case '2':\n break;\n }\n });\n _this13._elms.height = heightElm;\n _this13._elms.heightBox = heightBoxElm;\n _this13._elms.heightMode = heightModeDataLegpElm;\n _this13._elms.heightConfirm = heightConfirmElm;\n _this13._elms.heightModeObject = heightModeObject;\n heightConfirmElm.addEventListener('click', function () {\n if (_this13.operate.positionEditing) {\n _this13.positionEditing = false;\n _this13.height = _this13.height + Number(heightElm.value);\n } else {\n PolygonObject.closeNodeEdit(_this13);\n _this13.heightMode = _this13.heightMode;\n setTimeout(function () {\n _this13.height = _this13.height + Number(heightElm.value);\n }, 100);\n }\n // this.positionEditing = false\n // for (let i = 0; i < this.options.positions.length; i++) {\n // this.options.positions[i].alt = Number((this.options.positions[i].alt + Number(heightElm.value)).toFixed(2))\n // this._elms.alt[i].innerHTML = this.options.positions[i].alt\n // }\n // this.renewPositions(this.options.positions)\n // this.entity.polyline.positions = [\n // ...this.positions,\n // this.positions[0],\n // this.positions[1]\n // ]\n\n // this.positionEditing = false\n // PolygonObject.closeNodeEdit(this)\n });\n }\n var fontData = Object(_Element_fontSelect__WEBPACK_IMPORTED_MODULE_19__[\"getFontList\"])();\n var fontObject = Object(_Element_datalist__WEBPACK_IMPORTED_MODULE_18__[\"legp\"])(_this13._DialogObject._element.content.getElementsByClassName('font-select-box')[0], '.font-select');\n if (fontObject) {\n fontObject.legp_search(fontData);\n var fontDataLegpElm = _this13._DialogObject._element.content.getElementsByClassName('font-select')[0].getElementsByTagName('input')[0];\n fontDataLegpElm.value = fontData[_this13.labelFontFamily].value;\n for (var _i10 = 0; _i10 < fontData.length; _i10++) {\n if (fontData[_i10].value == fontDataLegpElm.value) {\n fontObject.legp_searchActive(fontData[_i10].value);\n break;\n }\n }\n fontDataLegpElm.addEventListener('input', function () {\n for (var _i11 = 0; _i11 < fontData.length; _i11++) {\n if (fontData[_i11].value === fontDataLegpElm.value) {\n _this13.labelFontFamily = fontData[_i11].key;\n break;\n }\n }\n });\n _this13._elms.labelFontFamily = [fontDataLegpElm];\n }\n createSpatialInfoTableContent();\n }, 0);\n _context7.next = 33;\n break;\n case 32:\n if (this._DialogObject && this._DialogObject.remove) {\n this._DialogObject.remove();\n this._DialogObject = null;\n }\n case 33:\n case \"end\":\n return _context7.stop();\n }\n }, _callee3, this);\n }));\n function edit(_x3) {\n return _edit.apply(this, arguments);\n }\n return edit;\n }()\n }, {\n key: \"reset\",\n value: function reset() {\n if (!this.entity && !this._DialogObject) {\n return;\n }\n this.options = this.deepCopyObj(this.originalOptions);\n this.name = this.originalOptions.name;\n this.color = this.originalOptions.color;\n this.lineColor = this.originalOptions.line.color;\n this.lineWidth = this.originalOptions.line.width;\n this.area = this.originalOptions.area;\n this.height = this.originalOptions.height;\n this.areaUnit = this.originalOptions['area-unit'];\n this.labelShow = this.originalOptions.label.show;\n this.labelColor = this.originalOptions.label.color;\n this.labelFontSize = this.originalOptions.label.fontSize;\n this.labelFontFamily = this.originalOptions.label.fontFamily;\n this.labelScaleByDistance = this.originalOptions.label.scaleByDistance;\n this.labelNear = this.originalOptions.label.near;\n this.labelFar = this.originalOptions.label.far;\n this.labelLineWidth = this.originalOptions.label.lineWidth;\n this.labelPixelOffset = this.originalOptions.label.pixelOffset;\n this.labelLineColor = this.originalOptions.label.lineColor;\n this.labelBackgroundColorStart = this.originalOptions.label.backgroundColor[0];\n this.labelBackgroundColorEnd = this.originalOptions.label.backgroundColor[1];\n this.attributeLink = this.options.attribute.link.content;\n this.attributeCamera = this.options.attribute.camera.content;\n this.attributeVr = this.options.attribute.vr.content;\n this.attributeGoods = this.options.attribute.goods.content;\n this.cameraSelect && this.cameraSelect();\n this.goodsSelect && this.goodsSelect();\n this.heightMode = this.options.heightMode;\n var positions = this.options.positions;\n var positions2 = [[]];\n var fromDegreesArray = [];\n if (this.options.height || this.options.height === 0) {\n for (var i = 0; i < positions.length; i++) {\n fromDegreesArray.push(positions[i].lng, positions[i].lat, this.options.height);\n positions2[0].push([positions[i].lng, positions[i].lat]);\n }\n positions2[0].push([positions[0].lng, positions[0].lat]);\n this.positions = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray);\n } else {\n for (var _i12 = 0; _i12 < positions.length; _i12++) {\n fromDegreesArray.push(positions[_i12].lng, positions[_i12].lat);\n positions2[0].push([positions[_i12].lng, positions[_i12].lat]);\n }\n positions2[0].push([positions[0].lng, positions[0].lat]);\n this.positions = Cesium.Cartesian3.fromDegreesArray(fromDegreesArray);\n }\n this.entity.polygon.hierarchy = new Cesium.PolygonHierarchy(this.positions);\n this.entity.polyline.positions = [].concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(this.positions), [this.positions[0], this.positions[1]]);\n }\n\n /**\r\n * 飞到\r\n */\n }, {\n key: \"flyTo\",\n value: (function () {\n var _flyTo = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee4() {\n var options,\n orientation,\n lng,\n lat,\n alt,\n destination,\n position,\n positionArray,\n _ground,\n i,\n height,\n a,\n _i13,\n BoundingSphere,\n _args8 = arguments;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee4$(_context8) {\n while (1) switch (_context8.prev = _context8.next) {\n case 0:\n options = _args8.length > 0 && _args8[0] !== undefined ? _args8[0] : {};\n if (!this._error) {\n _context8.next = 3;\n break;\n }\n return _context8.abrupt(\"return\");\n case 3:\n Object(_Global_global__WEBPACK_IMPORTED_MODULE_21__[\"setActiveViewer\"])(0);\n Object(_Global_global__WEBPACK_IMPORTED_MODULE_21__[\"closeRotateAround\"])(this.sdk);\n Object(_Global_global__WEBPACK_IMPORTED_MODULE_21__[\"closeViewFollow\"])(this.sdk);\n if (!(this.options.customView && this.options.customView.relativePosition && this.options.customView.orientation)) {\n _context8.next = 25;\n break;\n }\n orientation = {\n heading: Cesium.Math.toRadians(this.options.customView.orientation.heading || 0.0),\n pitch: Cesium.Math.toRadians(this.options.customView.orientation.pitch || -60.0),\n roll: Cesium.Math.toRadians(this.options.customView.orientation.roll || 0.0)\n };\n lng = this.options.customView.relativePosition.lng;\n lat = this.options.customView.relativePosition.lat;\n alt = this.options.customView.relativePosition.alt;\n destination = Cesium.Cartesian3.fromDegrees(lng, lat, alt);\n position = {\n lng: 0,\n lat: 0\n };\n if (this.options.position) {\n position = _objectSpread({}, this.options.position);\n } else if (this.options.positions) {\n position = _objectSpread({}, this.options.positions[0]);\n } else if (this.options.center) {\n position = _objectSpread({}, this.options.center);\n } else if (this.options.start) {\n position = _objectSpread({}, this.options.start);\n } else {\n if (this.options.hasOwnProperty('lng')) {\n position.lng = this.options.lng;\n }\n if (this.options.hasOwnProperty('lat')) {\n position.lat = this.options.lat;\n }\n if (this.options.hasOwnProperty('alt')) {\n position.alt = this.options.alt;\n }\n }\n // 如果没有高度值,则获取紧贴高度计算\n if (position.hasOwnProperty('alt')) {\n _context8.next = 18;\n break;\n }\n _context8.next = 17;\n return this.getClampToHeight(position);\n case 17:\n position.alt = _context8.sent;\n case 18:\n lng = this.options.customView.relativePosition.lng + position.lng;\n lat = this.options.customView.relativePosition.lat + position.lat;\n alt = this.options.customView.relativePosition.alt + position.alt;\n destination = Cesium.Cartesian3.fromDegrees(lng, lat, alt);\n this.sdk.viewer.camera.flyTo({\n destination: destination,\n orientation: orientation\n });\n _context8.next = 51;\n break;\n case 25:\n positionArray = [];\n _context8.t0 = this.heightMode;\n _context8.next = _context8.t0 === 0 ? 29 : _context8.t0 === '0' ? 29 : _context8.t0 === 1 ? 31 : _context8.t0 === '1' ? 31 : _context8.t0 === 2 ? 33 : _context8.t0 === '2' ? 33 : 35;\n break;\n case 29:\n _ground = false;\n return _context8.abrupt(\"break\", 35);\n case 31:\n _ground = false;\n return _context8.abrupt(\"break\", 35);\n case 33:\n _ground = true;\n return _context8.abrupt(\"break\", 35);\n case 35:\n if (!_ground) {\n _context8.next = 48;\n break;\n }\n i = 0;\n case 37:\n if (!(i < this.options.positions.length)) {\n _context8.next = 46;\n break;\n }\n _context8.next = 40;\n return this.getClampToHeight(this.options.positions[i]);\n case 40:\n height = _context8.sent;\n a = Cesium.Cartesian3.fromDegrees(this.options.positions[i].lng, this.options.positions[i].lat, height);\n positionArray.push(a.x, a.y, a.z);\n case 43:\n i++;\n _context8.next = 37;\n break;\n case 46:\n _context8.next = 49;\n break;\n case 48:\n if (this.positions) {\n for (_i13 = 0; _i13 < this.positions.length; _i13++) {\n positionArray.push(this.positions[_i13].x, this.positions[_i13].y, this.positions[_i13].z);\n }\n }\n case 49:\n BoundingSphere = Cesium.BoundingSphere.fromVertices(positionArray);\n this.sdk.viewer.camera.flyToBoundingSphere(BoundingSphere, {\n offset: options.orientation || {\n heading: Cesium.Math.toRadians(0.0),\n pitch: Cesium.Math.toRadians(-90.0),\n roll: Cesium.Math.toRadians(0.0)\n }\n });\n case 51:\n case \"end\":\n return _context8.stop();\n }\n }, _callee4, this);\n }));\n function flyTo() {\n return _flyTo.apply(this, arguments);\n }\n return flyTo;\n }()\n /**\r\n * 删除\r\n */\n )\n }, {\n key: \"remove\",\n value: (function () {\n var _remove = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee5() {\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee5$(_context9) {\n while (1) switch (_context9.prev = _context9.next) {\n case 0:\n this.event && this.event.destroy();\n this.tip && this.tip.destroy();\n this.sdk.viewer.entities.remove(this.entity);\n this.label && this.label.remove();\n this.entity = null;\n if (this._DialogObject && !this._DialogObject.isDestroy) {\n this._DialogObject.close();\n this._DialogObject = null;\n }\n _context9.next = 8;\n return this.sdk.removeIncetance(this.options.id);\n case 8:\n _context9.next = 10;\n return Object(_Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_17__[\"syncData\"])(this.sdk, this.options.id);\n case 10:\n case \"end\":\n return _context9.stop();\n }\n }, _callee5, this);\n }));\n function remove() {\n return _remove.apply(this, arguments);\n }\n return remove;\n }())\n }, {\n key: \"_addLink\",\n value: function _addLink() {\n // document.getElementsByClassName\n if (this._DialogObject._element.content.getElementsByClassName('link_add')[0].value) {\n this.options.attribute.link.content.push({\n name: '链接',\n url: this._DialogObject._element.content.getElementsByClassName('link_add')[0].value\n });\n this._DialogObject._element.content.getElementsByClassName('link_add')[0].value = '';\n this.attributeLink = this.options.attribute.link.content;\n } else {\n this.Dialog.clickAddLink && this.Dialog.clickAddLink();\n }\n }\n }, {\n key: \"addAttributeLink\",\n value: function addAttributeLink(link) {\n this.options.attribute.link.content.push({\n name: '链接',\n url: link\n });\n this.attributeLink = this.options.attribute.link.content;\n }\n }, {\n key: \"_addRr\",\n value: function _addRr() {\n if (this._DialogObject._element.content.getElementsByClassName('vr_add')[0].value) {\n this.options.attribute.vr.content.push({\n name: '全景图',\n url: this._DialogObject._element.content.getElementsByClassName('vr_add')[0].value\n });\n this._DialogObject._element.content.getElementsByClassName('vr_add')[0].value = '';\n this.attributeVr = this.options.attribute.vr.content;\n } else {\n this.Dialog.clickAddVr && this.Dialog.clickAddVr();\n }\n }\n }, {\n key: \"addAttributeRr\",\n value: function addAttributeRr(vr) {\n this.options.attribute.vr.content.push({\n name: '全景图',\n url: vr\n });\n this.attributeVr = this.options.attribute.vr.content;\n }\n\n /**\r\n * 打开富文本框\r\n */\n }, {\n key: \"openRichTextEditor\",\n value: function openRichTextEditor(e) {\n var _this14 = this;\n _Element_richText__WEBPACK_IMPORTED_MODULE_11__[\"default\"].open(this.options.id, this.options.name, this.options.richTextContent);\n _Element_richText__WEBPACK_IMPORTED_MODULE_11__[\"default\"].primaryCallBack = function (content) {\n _this14.options.richTextContent = content;\n };\n }\n\n /**@desc 打开平移功能\r\n *\r\n * @memberOf Source\r\n * @param status {boolean}\r\n *\r\n * */\n }, {\n key: \"positionEditing\",\n get: function get() {\n return this.operate.positionEditing;\n },\n set: function set(status) {\n var _this15 = this;\n PolygonObject.closeNodeEdit(this);\n if (YJ.Measure.GetMeasureStatus() || !this.sdk || !this.sdk.viewer || !this.entity) {\n return;\n }\n var _this = this;\n this.event && this.event.destroy();\n this.event = new _Event_index__WEBPACK_IMPORTED_MODULE_15__[\"default\"](this.sdk);\n this.operate.positionEditing = status;\n if (status === true) {\n var _Cesium$Cartesian;\n this.previous = {\n positions: _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(this.positions)\n };\n this.tip && this.tip.destroy();\n this.tip = new _MouseTip__WEBPACK_IMPORTED_MODULE_16__[\"default\"]('点击鼠标左键确认,右键取消', this.sdk);\n this.label && (this.label.entity.billboard.color = Cesium.Color.fromCssColorString(\"rgba(255,255,255,0.9)\"));\n this.picking = false;\n var array = [];\n var positions = _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(this.positions);\n var positions84 = this.deepCopyObj(this.options.positions);\n var fromDegreesArray = [];\n var disparity = [];\n for (var i = 0; i < positions.length; i++) {\n var position = this.cartesian3Towgs84(positions[i], this.sdk.viewer);\n array.push([position.lng, position.lat]);\n }\n var firstposition = this.cartesian3Towgs84(positions[0], this.sdk.viewer);\n array.push([firstposition.lng, firstposition.lat]);\n var polygon = turf.polygon([array]);\n var centroid = turf.centroid(polygon);\n var center = (_Cesium$Cartesian = Cesium.Cartesian3).fromDegrees.apply(_Cesium$Cartesian, _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(centroid.geometry.coordinates));\n for (var _i14 = 0; _i14 < positions.length; _i14++) {\n disparity.push({\n x: center.x - positions[_i14].x,\n y: center.y - positions[_i14].y,\n z: center.z - positions[_i14].z\n });\n }\n var newpositions = [];\n var leftEvent = function leftEvent(movement, cartesian) {\n var position84 = _this15.cartesian3Towgs84(cartesian, _this15.sdk.viewer);\n _this15.event.mouse_move(function () {});\n _this15.event.mouse_left(function () {});\n _this15.event.mouse_right(function () {});\n newpositions = [];\n for (var _i15 = 0; _i15 < disparity.length; _i15++) {\n var pos3 = {\n x: cartesian.x - disparity[_i15].x,\n y: cartesian.y - disparity[_i15].y,\n z: cartesian.z - disparity[_i15].z\n };\n newpositions.push(pos3);\n _this15.options.positions[_i15] = _this15.cartesian3Towgs84(pos3, _this15.sdk.viewer);\n if (_this._elms.lng && _this._elms.lng[_i15]) {\n _this._elms.lng[_i15].innerHTML = _this15.options.positions[_i15].lng.toFixed(8);\n }\n if (_this._elms.lat && _this._elms.lat[_i15]) {\n _this._elms.lat[_i15].innerHTML = _this15.options.positions[_i15].lat.toFixed(8);\n }\n }\n _this15.previous = null;\n fromDegreesArray = [];\n _this15.heightMode = _this15.heightMode;\n };\n this.event.mouse_move(function (movement, cartesian) {\n var position84 = _this15.cartesian3Towgs84(cartesian, _this15.sdk.viewer);\n newpositions = [];\n for (var _i16 = 0; _i16 < disparity.length; _i16++) {\n var pos3 = {\n x: cartesian.x - disparity[_i16].x,\n y: cartesian.y - disparity[_i16].y,\n z: cartesian.z - disparity[_i16].z\n };\n newpositions.push(pos3);\n positions84[_i16] = _this15.cartesian3Towgs84(pos3, _this15.sdk.viewer);\n }\n var ground = false;\n var array = [];\n for (var _i17 = 0; _i17 < positions84.length; _i17++) {\n array.push([positions84[_i17].lng, positions84[_i17].lat]);\n }\n array.push([positions84[0].lng, positions84[0].lat]);\n var height = 0;\n var polygon = turf.polygon([array]);\n var centroid = turf.centroid(polygon);\n switch (_this15.options.heightMode) {\n case '0':\n case 0:\n ground = false;\n break;\n case '1':\n case 1:\n height = _this15.sdk.viewer.scene.globe.getHeight(Cesium.Cartographic.fromDegrees(centroid.geometry.coordinates[0], centroid.geometry.coordinates[1]));\n ground = false;\n break;\n case '2':\n case 2:\n ground = true;\n break;\n }\n fromDegreesArray = [];\n if (!ground) {\n for (var _i18 = 0; _i18 < positions84.length; _i18++) {\n fromDegreesArray.push(positions84[_i18].lng, positions84[_i18].lat, _this15.height + height);\n }\n _this15.positions = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray);\n _this15.label.position = [position84.lng, position84.lat, _this15.height + height];\n } else {\n for (var _i19 = 0; _i19 < positions84.length; _i19++) {\n fromDegreesArray.push(positions84[_i19].lng, positions84[_i19].lat);\n }\n _this15.positions = Cesium.Cartesian3.fromDegreesArray(fromDegreesArray);\n var objectsToExclude = _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(_this15.sdk.viewer.entities.values);\n _this15.getClampToHeight({\n lng: position84.lng,\n lat: position84.lat\n }, objectsToExclude).then(function (height) {\n _this15.label.position = [position84.lng, position84.lat, height];\n });\n }\n _this15.tip.setPosition(cartesian, movement.endPosition.x, movement.endPosition.y);\n });\n this.event.mouse_left(leftEvent);\n this.event.mouse_right(function (movement, cartesian) {\n _this15.heightMode = _this15.heightMode;\n });\n this.event.gesture_pinck_start(function (movement, cartesian) {\n var startTime = new Date();\n var pos = {\n position: {\n x: (movement.position1.x + movement.position2.x) / 2,\n y: (movement.position1.y + movement.position2.y) / 2\n }\n };\n _this15.event.gesture_pinck_end(function () {\n var endTime = new Date();\n if (endTime - startTime >= 500) {\n // 长按取消\n _this15.positionEditing = false;\n } else {\n leftEvent(pos, cartesian);\n }\n });\n });\n this.entity.polygon.hierarchy = new Cesium.CallbackProperty(function () {\n return new Cesium.PolygonHierarchy(_this.positions);\n }, false);\n this.entity.polyline.positions = new Cesium.CallbackProperty(function () {\n return [].concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(_this.positions), [_this.positions[0], _this.positions[1]]);\n }, false);\n } else {\n if (!this.previous) {\n this.previous = {\n positions: _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(this.positions)\n };\n } else {\n this.positions = _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(this.previous.positions);\n }\n if (!this.sdk || !this.sdk.viewer || !this.label || !this.label.entity) {\n this.label.entity.billboard.color = Cesium.Color.fromCssColorString(\"rgba(255,255,255,1)\");\n }\n this.picking = true;\n if (this.event) {\n this.event.mouse_move(function () {});\n this.event.mouse_left(function () {});\n this.event.mouse_right(function () {});\n this.event.destroy();\n }\n this.tip && this.tip.destroy();\n var _positions = [[]];\n for (var _i20 = 0; _i20 < this.previous.positions.length; _i20++) {\n var _positions2 = this.cartesian3Towgs84(this.previous.positions[_i20], this.sdk.viewer);\n _positions[0].push([_positions2.lng, _positions2.lat]);\n }\n var _positions3 = this.cartesian3Towgs84(this.previous.positions[0], this.sdk.viewer);\n _positions[0].push([_positions3.lng, _positions3.lat]);\n var _polygon = turf.polygon(_positions);\n var _centroid = turf.centroid(_polygon);\n var _ground2 = false;\n var height = 0;\n switch (this.options.heightMode) {\n case '0':\n case 0:\n _ground2 = false;\n break;\n case '1':\n case 1:\n height = this.sdk.viewer.scene.globe.getHeight(Cesium.Cartographic.fromDegrees(_centroid.geometry.coordinates[0], _centroid.geometry.coordinates[1]));\n _ground2 = false;\n break;\n case '2':\n case 2:\n _ground2 = true;\n break;\n }\n if (!_ground2) {\n this.label.position = [_centroid.geometry.coordinates[0], _centroid.geometry.coordinates[1], this.height + height];\n } else {\n this.label.position = [_centroid.geometry.coordinates[0], _centroid.geometry.coordinates[1]];\n }\n this.entity.polygon.hierarchy = new Cesium.PolygonHierarchy(_this.previous.positions);\n this.entity.polyline.positions = [].concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(_this.previous.positions), [_this.previous.positions[0], _this.previous.positions[1]]);\n }\n }\n }, {\n key: \"setPosition\",\n value: function setPosition(v) {\n var _Cesium$Cartesian2,\n _this16 = this;\n var cartesian = Cesium.Cartesian3.fromDegrees(v.position.lng, v.position.lat, v.position.alt);\n var positions = _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(this.positions);\n var array = [];\n var disparity = [];\n for (var i = 0; i < positions.length; i++) {\n var position = this.cartesian3Towgs84(positions[i], this.sdk.viewer);\n array.push([position.lng, position.lat]);\n }\n var firstposition = this.cartesian3Towgs84(positions[0], this.sdk.viewer);\n array.push([firstposition.lng, firstposition.lat]);\n var polygon = turf.polygon([array]);\n var centroid = turf.centroid(polygon);\n var center = (_Cesium$Cartesian2 = Cesium.Cartesian3).fromDegrees.apply(_Cesium$Cartesian2, _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(centroid.geometry.coordinates));\n for (var _i21 = 0; _i21 < positions.length; _i21++) {\n disparity.push({\n x: center.x - positions[_i21].x,\n y: center.y - positions[_i21].y,\n z: center.z - positions[_i21].z\n });\n }\n var newpositions = [];\n for (var _i22 = 0; _i22 < disparity.length; _i22++) {\n newpositions.push({\n x: cartesian.x - disparity[_i22].x,\n y: cartesian.y - disparity[_i22].y,\n z: cartesian.z - disparity[_i22].z\n });\n }\n var ground = false;\n var height = 0;\n switch (this.options.heightMode) {\n case '0':\n case 0:\n ground = false;\n break;\n case '1':\n case 1:\n height = this.sdk.viewer.scene.globe.getHeight(Cesium.Cartographic.fromDegrees(centroid.geometry.coordinates[0], centroid.geometry.coordinates[1]));\n ground = false;\n break;\n case '2':\n case 2:\n ground = true;\n break;\n }\n if (!ground) {\n this.label.position = [v.position.lng, v.position.lat, v.position.alt + height];\n } else {\n var objectsToExclude = _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(this.sdk.viewer.entities.values);\n this.getClampToHeight({\n lng: v.position.lng,\n lat: v.position.lat\n }, objectsToExclude).then(function (height) {\n _this16.label.position = [v.position.lng, v.position.lat, height];\n });\n }\n this.entity.polygon.hierarchy = new Cesium.CallbackProperty(function () {\n if (newpositions.length > 0) {\n return new Cesium.PolygonHierarchy(newpositions);\n } else {\n return new Cesium.PolygonHierarchy(positions);\n }\n }, false);\n this.entity.polyline.positions = new Cesium.CallbackProperty(function () {\n if (newpositions.length > 0) {\n return [].concat(newpositions, [newpositions[0], newpositions[1]]);\n } else {\n return [].concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(positions), [positions[0], positions[1]]);\n }\n }, false);\n }\n\n // 更新坐标\n }, {\n key: \"renewPositions\",\n value: function renewPositions() {\n var _this17 = this;\n if (this._error) {\n return;\n }\n var ground = false;\n var array = [];\n var positions = this.options.positions;\n for (var i = 0; i < positions.length; i++) {\n array.push([positions[i].lng, positions[i].lat]);\n }\n array.push([positions[0].lng, positions[0].lat]);\n var height = 0;\n var polygon = turf.polygon([array]);\n var centroid = turf.centroid(polygon);\n switch (this.options.heightMode) {\n case '0':\n case 0:\n ground = false;\n break;\n case '1':\n case 1:\n height = this.sdk.viewer.scene.globe.getHeight(Cesium.Cartographic.fromDegrees(centroid.geometry.coordinates[0], centroid.geometry.coordinates[1])) || 0;\n ground = false;\n break;\n case '2':\n case 2:\n ground = true;\n break;\n }\n var fromDegreesArray = [];\n if (!ground && this.nodePoints.length == 0) {\n for (var _i23 = 0; _i23 < positions.length; _i23++) {\n fromDegreesArray.push(positions[_i23].lng, positions[_i23].lat, this.height + height);\n }\n this.positions = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray);\n this.label && (this.label.position = [centroid.geometry.coordinates[0], centroid.geometry.coordinates[1], this.height + height]);\n } else {\n for (var _i24 = 0; _i24 < positions.length; _i24++) {\n fromDegreesArray.push(positions[_i24].lng, positions[_i24].lat);\n }\n this.positions = Cesium.Cartesian3.fromDegreesArray(fromDegreesArray);\n setTimeout(function () {\n if (!_this17.sdk.viewer) {\n return;\n }\n var objectsToExclude = _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(_this17.sdk.viewer.entities.values);\n _this17.getClampToHeight({\n lng: centroid.geometry.coordinates[0],\n lat: centroid.geometry.coordinates[1]\n }, objectsToExclude).then(function (height) {\n _this17.label && (_this17.label.position = [centroid.geometry.coordinates[0], centroid.geometry.coordinates[1], height]);\n });\n }, 100);\n }\n\n // 计算投影面积\n this.options.areaByMeter = this.computeArea(positions);\n this.areaUnit = this.areaUnit;\n return fromDegreesArray;\n }\n }, {\n key: \"setDIV\",\n value: function () {\n var _setDIV = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee6() {\n var _this18 = this;\n var options,\n positions,\n i,\n polygon,\n centroid,\n height,\n objectsToExclude,\n siteInfoDom,\n siteInfoPosition,\n _args10 = arguments;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee6$(_context10) {\n while (1) switch (_context10.prev = _context10.next) {\n case 0:\n options = _args10.length > 0 && _args10[0] !== undefined ? _args10[0] : {\n domid: '',\n x: 10,\n y: 10\n };\n options.x = options.x || options.x === 0 ? options.x : 10;\n options.y = options.y || options.y === 0 ? options.y : 10;\n positions = [[]];\n for (i = 0; i < this.options.positions.length; i++) {\n positions[0].push([this.options.positions[i].lng, this.options.positions[i].lat]);\n }\n positions[0].push([this.options.positions[0].lng, this.options.positions[0].lat]);\n polygon = turf.polygon(positions);\n centroid = turf.pointOnFeature(polygon);\n if (ground) {\n _context10.next = 12;\n break;\n }\n height = this.options.height;\n _context10.next = 16;\n break;\n case 12:\n objectsToExclude = _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(this.sdk.viewer.entities.values);\n _context10.next = 15;\n return this.getClampToHeight({\n lng: centroid.geometry.coordinates[0],\n lat: centroid.geometry.coordinates[1]\n }, objectsToExclude);\n case 15:\n height = _context10.sent;\n case 16:\n siteInfoDom = document.getElementById(options.domid);\n siteInfoPosition = Cesium.Cartesian3.fromDegrees(centroid.geometry.coordinates[0], centroid.geometry.coordinates[1], height);\n this.sdk.viewer.scene.postRender.addEventListener(function (percentage) {\n //转换到屏幕坐标\n if (siteInfoDom.style.display === 'block' || siteInfoDom.style.display === '') {\n var winpos = _this18.sdk.viewer.scene.cartesianToCanvasCoordinates(siteInfoPosition);\n if (winpos) {\n siteInfoDom.style.left = (winpos.x + options.x).toFixed(0) + 'px';\n siteInfoDom.style.top = (winpos.y + options.y).toFixed(0) + 'px';\n }\n }\n });\n case 19:\n case \"end\":\n return _context10.stop();\n }\n }, _callee6, this);\n }));\n function setDIV() {\n return _setDIV.apply(this, arguments);\n }\n return setDIV;\n }()\n }], [{\n key: \"create\",\n value: function create(that) {\n var ground;\n if (that.heightMode == 2) {\n ground = true;\n } else {\n ground = false;\n }\n that.renewPositions();\n var material = Cesium.Color.fromCssColorString(that.options.color);\n if (that.sdk.viewer.scene.mode === 2) {\n that.options.heightMode = 0;\n ground = false;\n material = new Cesium.CustomColorMaterialSource({\n color: that.options.color\n });\n }\n that.entity = that.sdk.viewer.entities.add({\n show: that.options.show,\n id: that.options.id,\n polygon: {\n hierarchy: new Cesium.PolygonHierarchy(that.positions),\n perPositionHeight: !ground ? true : false,\n material: material,\n zIndex: that.sdk._entityZIndex\n },\n polyline: _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default()(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default()({\n positions: [].concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(that.positions), [that.positions[0], that.positions[1]]),\n width: that.options.line.width,\n arcType: Cesium.ArcType.NONE,\n material: Cesium.Color.fromCssColorString(that.options.line.color),\n clampToGround: !ground ? false : true\n }, \"arcType\", !ground ? Cesium.ArcType.NONE : Cesium.ArcType.GEODESIC), \"zIndex\", that.sdk._entityZIndex)\n });\n that.sdk._entityZIndex++;\n PolygonObject.createLabel(that);\n Object(_Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_17__[\"syncData\"])(that.sdk, that.options.id);\n if (that.options.show) {\n Object(_Global_SplitScreen__WEBPACK_IMPORTED_MODULE_20__[\"setSplitDirection\"])(0, that.options.id);\n }\n }\n }, {\n key: \"createLabel\",\n value: function () {\n var _createLabel = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee7(that) {\n var positions, i, polygon, centroid, height, ground, _i25, objectsToExclude;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee7$(_context11) {\n while (1) switch (_context11.prev = _context11.next) {\n case 0:\n positions = [[]];\n for (i = 0; i < that.options.positions.length; i++) {\n positions[0].push([that.options.positions[i].lng, that.options.positions[i].lat]);\n }\n positions[0].push([that.options.positions[0].lng, that.options.positions[0].lat]);\n polygon = turf.polygon(positions); // let centroid = turf.centroid(polygon);\n centroid = turf.pointOnFeature(polygon);\n height = 0;\n _context11.t0 = that.heightMode;\n _context11.next = _context11.t0 === 0 ? 9 : _context11.t0 === '0' ? 9 : _context11.t0 === 1 ? 11 : _context11.t0 === '1' ? 11 : _context11.t0 === 2 ? 14 : _context11.t0 === '2' ? 14 : 16;\n break;\n case 9:\n ground = false;\n return _context11.abrupt(\"break\", 16);\n case 11:\n for (_i25 = 0; _i25 < positions.length; _i25++) {\n height = that.sdk.viewer.scene.globe.getHeight(Cesium.Cartographic.fromDegrees(positions[_i25].lng, positions[_i25].lat));\n }\n ground = false;\n return _context11.abrupt(\"break\", 16);\n case 14:\n ground = true;\n return _context11.abrupt(\"break\", 16);\n case 16:\n if (ground) {\n _context11.next = 20;\n break;\n }\n height = that.options.height + height;\n _context11.next = 24;\n break;\n case 20:\n objectsToExclude = _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(that.sdk.viewer.entities.values);\n _context11.next = 23;\n return that.getClampToHeight({\n lng: centroid.geometry.coordinates[0],\n lat: centroid.geometry.coordinates[1]\n }, objectsToExclude);\n case 23:\n height = _context11.sent;\n case 24:\n if (!that.options.label.position) {\n that.options.label.position = {\n lng: centroid.geometry.coordinates[0],\n lat: centroid.geometry.coordinates[1],\n alt: height\n };\n }\n // 标签\n that.label = new _LabelObject__WEBPACK_IMPORTED_MODULE_14__[\"default\"](that.sdk, {\n id: that.options.id,\n show: that.options.show ? that.options.label.show : false,\n position: [that.options.label.position.lng, that.options.label.position.lat, that.options.label.position.alt],\n text: that.options.name,\n fontSize: that.options.label.fontSize,\n fontFamily: that.options.label.fontFamily,\n color: that.options.label.color,\n pixelOffset: that.options.label.pixelOffset,\n backgroundColor: that.options.label.backgroundColor,\n lineColor: that.options.label.lineColor,\n lineWidth: that.options.label.lineWidth,\n scaleByDistance: that.options.label.scaleByDistance,\n near: that.options.label.near,\n far: that.options.label.far,\n ground: ground\n });\n case 26:\n case \"end\":\n return _context11.stop();\n }\n }, _callee7);\n }));\n function createLabel(_x4) {\n return _createLabel.apply(this, arguments);\n }\n return createLabel;\n }()\n }, {\n key: \"EventBinding\",\n value: function EventBinding(that, elements) {\n var _loop10 = function _loop10() {\n var Event = [];\n var isEvent = false;\n var removeName = [];\n if (!elements[i] || !elements[i].attributes) {\n return 1; // continue\n }\n var _iterator5 = _createForOfIteratorHelper(elements[i].attributes),\n _step5;\n try {\n var _loop11 = function _loop11() {\n var m = _step5.value;\n switch (m.name) {\n case '@model':\n {\n isEvent = true;\n if (elements[i].type == 'checkbox') {\n Event.push(function (e) {\n that[m.value] = e.target.checked;\n });\n elements[i].checked = that[m.value];\n } else {\n Event.push(function (e) {\n var value = e.target.value;\n if (e.target.type == 'number') {\n if (e.data != '.' && (e.data != '-' || e.target.value)) {\n value = Number(value);\n if (e.target.max && value > Number(e.target.max)) {\n value = Number(e.target.max);\n }\n if (e.target.min && value < Number(e.target.min)) {\n value = Number(e.target.min);\n }\n that[m.value] = value;\n }\n } else {\n that[m.value] = value;\n }\n });\n if (elements[i].nodeName == 'IMG') {\n elements[i].src = that[m.value];\n } else {\n elements[i].value = that[m.value];\n }\n }\n if (that._elms[m.value]) {\n that._elms[m.value].push(elements[i]);\n } else {\n that._elms[m.value] = [elements[i]];\n }\n removeName.push(m.name);\n break;\n }\n case '@click':\n {\n elements[i].addEventListener('click', function (e) {\n if (typeof that[m.value] === 'function') {\n that[m.value](e);\n }\n });\n removeName.push(m.name);\n // elements[i].attributes.removeNamedItem(m.name)\n break;\n }\n case '@change':\n {\n isEvent = true;\n Event.push(function (e) {\n var value = e.target.value;\n if (e.target.type == 'number' && value != '') {\n value = Number(value);\n e.target.value = value;\n }\n if (typeof that[m.value] === 'function') {\n that[m.value](e, value);\n }\n });\n break;\n }\n }\n // elements[i].attributes[m] = undefined\n };\n for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {\n _loop11();\n }\n } catch (err) {\n _iterator5.e(err);\n } finally {\n _iterator5.f();\n }\n for (var n = 0; n < removeName.length; n++) {\n elements[i].attributes.removeNamedItem(removeName[n]);\n }\n if (isEvent) {\n var ventType = 'input';\n if (elements[i].tagName != 'INPUT' || elements[i].type == 'checkbox') {\n ventType = 'change';\n }\n elements[i].addEventListener(ventType, function (e) {\n for (var t = 0; t < Event.length; t++) {\n Event[t](e);\n }\n });\n }\n };\n for (var i = 0; i < elements.length; i++) {\n if (_loop10()) continue;\n }\n }\n }, {\n key: \"nodeEdit\",\n value: function nodeEdit(that) {\n var cb = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};\n that.positionEditing = false;\n setTimeout(function () {\n if (YJ.Measure.GetMeasureStatus()) {\n cb('上一次测量未结束');\n } else {\n var createNodePoints = /*#__PURE__*/function () {\n var _ref2 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee9() {\n var objectsToExclude, _i31, height, entity;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee9$(_context13) {\n while (1) switch (_context13.prev = _context13.next) {\n case 0:\n // sdk.viewer.scene.primitives\n objectsToExclude = _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(that.sdk.viewer.entities.values);\n _i31 = 0;\n case 2:\n if (!(_i31 < that.options.positions.length)) {\n _context13.next = 11;\n break;\n }\n _context13.next = 5;\n return that.getClampToHeight(that.options.positions[_i31], objectsToExclude);\n case 5:\n height = _context13.sent;\n entity = that.sdk.viewer.entities.add({\n name: 'node-secondary-edit-point',\n index: _i31,\n position: Cesium.Cartesian3.fromDegrees(that.options.positions[_i31].lng, that.options.positions[_i31].lat, height),\n billboard: {\n image: that.getSourceRootPath() + '/img/point.png',\n width: 15,\n height: 15,\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\n color: Cesium.Color.WHITE.withAlpha(0.99)\n }\n });\n that.nodePoints.push(entity);\n case 8:\n _i31++;\n _context13.next = 2;\n break;\n case 11:\n case \"end\":\n return _context13.stop();\n }\n }, _callee9);\n }));\n return function createNodePoints() {\n return _ref2.apply(this, arguments);\n };\n }();\n YJ.Measure.SetMeasureStatus(true);\n that.picking = false;\n that.tip = new _MouseTip__WEBPACK_IMPORTED_MODULE_16__[\"default\"]('请选择一个顶点,右键取消', that.sdk);\n that.event = new _Event_index__WEBPACK_IMPORTED_MODULE_15__[\"default\"](that.sdk);\n that.nodePoints = [];\n var selectPoint;\n var originalPosition;\n var newpositions = [];\n var fromDegreesArray = [];\n for (var i = 0; i < that.options.positions.length; i++) {\n fromDegreesArray.push(that.options.positions[i].lng, that.options.positions[i].lat);\n }\n newpositions = Cesium.Cartesian3.fromDegreesArray(fromDegreesArray);\n var added = false;\n var leftEvent = /*#__PURE__*/function () {\n var _ref = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee8(movement, cartesian) {\n var potHeight, entity, positions, _fromDegreesArray, _i26, _objectsToExclude, _positions4, _i27, polygon, centroid, pick;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee8$(_context12) {\n while (1) switch (_context12.prev = _context12.next) {\n case 0:\n if (!selectPoint) {\n _context12.next = 32;\n break;\n }\n that.options.positions[selectPoint.index] = that.cartesian3Towgs84(cartesian, that.sdk.viewer);\n originalPosition = that.options.positions[selectPoint.index];\n added = true;\n _context12.next = 6;\n return that.getClampToHeight(that.options.positions[selectPoint.index]);\n case 6:\n potHeight = _context12.sent;\n entity = that.sdk.viewer.entities.add({\n name: 'node-secondary-edit-point',\n position: Cesium.Cartesian3.fromDegrees(that.options.positions[selectPoint.index].lng, that.options.positions[selectPoint.index].lat, potHeight),\n billboard: {\n image: that.getSourceRootPath() + '/img/point.png',\n width: 15,\n height: 15,\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\n color: Cesium.Color.WHITE.withAlpha(0.99)\n }\n });\n that.nodePoints.splice(selectPoint.index, 0, entity);\n that.options.positions.splice(selectPoint.index, 0, that.options.positions[selectPoint.index]);\n positions = that.options.positions;\n _fromDegreesArray = [];\n for (_i26 = 0; _i26 < positions.length; _i26++) {\n _fromDegreesArray.push(positions[_i26].lng, positions[_i26].lat);\n }\n that.positions = Cesium.Cartesian3.fromDegreesArray(_fromDegreesArray);\n newpositions = Cesium.Cartesian3.fromDegreesArray(_fromDegreesArray);\n _objectsToExclude = _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(that.sdk.viewer.entities.values);\n if (that.options.positions.length < 3) {\n that.getClampToHeight({\n lng: that.options.positions[0].lng,\n lat: that.options.positions[0].lat\n }, _objectsToExclude).then(function (height) {\n that.label.position = [that.options.positions[0].lng, that.options.positions[0].lat, height];\n });\n } else {\n _positions4 = [[]];\n for (_i27 = 0; _i27 < that.options.positions.length; _i27++) {\n _positions4[0].push([that.options.positions[_i27].lng, that.options.positions[_i27].lat]);\n }\n _positions4[0].push([that.options.positions[0].lng, that.options.positions[0].lat]);\n polygon = turf.polygon(_positions4);\n centroid = turf.centroid(polygon);\n that.getClampToHeight({\n lng: centroid.geometry.coordinates[0],\n lat: centroid.geometry.coordinates[1]\n }, _objectsToExclude).then(function (height) {\n that.label.position = [centroid.geometry.coordinates[0], centroid.geometry.coordinates[1], height];\n });\n }\n that.options.areaByMeter = that.computeArea(that.options.positions);\n _context12.t0 = that.options['area-unit'];\n _context12.next = _context12.t0 === '平方米' ? 21 : _context12.t0 === '平方千米' ? 23 : _context12.t0 === '亩' ? 25 : _context12.t0 === '公顷' ? 27 : 29;\n break;\n case 21:\n that.area = that.options.areaByMeter;\n return _context12.abrupt(\"break\", 30);\n case 23:\n that.area = Number((that.options.areaByMeter / 1000000).toFixed(8));\n return _context12.abrupt(\"break\", 30);\n case 25:\n that.area = Number((that.options.areaByMeter / 666.6666667).toFixed(4));\n return _context12.abrupt(\"break\", 30);\n case 27:\n that.area = Number((that.options.areaByMeter / 10000).toFixed(6));\n return _context12.abrupt(\"break\", 30);\n case 29:\n that.area = that.options.areaByMeter;\n case 30:\n _context12.next = 34;\n break;\n case 32:\n pick = that.sdk.viewer.scene.pick(movement.position);\n if (pick && pick.id && pick.id.name && pick.id.name === 'node-secondary-edit-point') {\n selectPoint = pick.id;\n that.nodePoints.splice(pick.id.index, 1);\n that.sdk.viewer.entities.remove(pick.id);\n that.tip.set_text('左键开始,右键结束,CTRL+右键撤销');\n originalPosition = that.cartesian3Towgs84(selectPoint.position.getValue(), that.sdk.viewer);\n }\n case 34:\n case \"end\":\n return _context12.stop();\n }\n }, _callee8);\n }));\n return function leftEvent(_x5, _x6) {\n return _ref.apply(this, arguments);\n };\n }();\n var rightEvent = function rightEvent(movement, cartesian) {\n if (selectPoint) {\n that.options.positions[selectPoint.index] = originalPosition;\n // that.options.positions.splice(selectPoint.index, 1)\n if (added) {\n that.options.positions.splice(selectPoint.index, 1);\n }\n cb(null, that.options.positions);\n }\n YJ.Measure.SetMeasureStatus(false);\n that.event.destroy();\n that.tip.destroy();\n that.heightMode = that.heightMode;\n };\n that.entity.polyline.clampToGround = true;\n that.entity.polyline.arcType = Cesium.ArcType.GEODESIC;\n that.entity.polygon.perPositionHeight = false;\n that.entity.polygon.hierarchy = new Cesium.CallbackProperty(function () {\n return new Cesium.PolygonHierarchy(newpositions);\n }, false);\n that.entity.polyline.positions = new Cesium.CallbackProperty(function () {\n if (newpositions.length >= 3) {\n return [].concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(newpositions), [newpositions[0], newpositions[1], newpositions[2]]);\n } else {\n return newpositions;\n }\n }, false);\n var objectsToExclude = _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(that.sdk.viewer.entities.values);\n if (that.options.positions.length < 3) {\n that.getClampToHeight({\n lng: that.options.positions[0].lng,\n lat: that.options.positions[0].lat\n }, objectsToExclude).then(function (height) {\n that.label.position = [that.options.positions[0].lng, that.options.positions[0].lat, height];\n });\n } else {\n var positions = [[]];\n for (var _i28 = 0; _i28 < that.options.positions.length; _i28++) {\n positions[0].push([that.options.positions[_i28].lng, that.options.positions[_i28].lat]);\n }\n positions[0].push([that.options.positions[0].lng, that.options.positions[0].lat]);\n var polygon = turf.polygon(positions);\n var centroid = turf.centroid(polygon);\n that.getClampToHeight({\n lng: centroid.geometry.coordinates[0],\n lat: centroid.geometry.coordinates[1]\n }, objectsToExclude).then(function (height) {\n that.label.position = [centroid.geometry.coordinates[0], centroid.geometry.coordinates[1], height];\n });\n }\n setTimeout(function () {\n that.event.mouse_left(leftEvent);\n that.event.mouse_right(rightEvent);\n that.event.mouse_move(function (movement, cartesian) {\n if (selectPoint) {\n that.options.positions[selectPoint.index] = that.cartesian3Towgs84(cartesian, that.sdk.viewer);\n var _positions5 = that.options.positions;\n var _fromDegreesArray2 = [];\n for (var _i29 = 0; _i29 < _positions5.length; _i29++) {\n _fromDegreesArray2.push(_positions5[_i29].lng, _positions5[_i29].lat);\n }\n that.positions = Cesium.Cartesian3.fromDegreesArray(_fromDegreesArray2);\n newpositions = Cesium.Cartesian3.fromDegreesArray(_fromDegreesArray2);\n var _objectsToExclude2 = _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(that.sdk.viewer.entities.values);\n if (that.options.positions.length < 3) {\n that.getClampToHeight({\n lng: that.options.positions[0].lng,\n lat: that.options.positions[0].lat\n }, _objectsToExclude2).then(function (height) {\n that.label.position = [that.options.positions[0].lng, that.options.positions[0].lat, height];\n });\n } else {\n var _positions6 = [[]];\n for (var _i30 = 0; _i30 < that.options.positions.length; _i30++) {\n _positions6[0].push([that.options.positions[_i30].lng, that.options.positions[_i30].lat]);\n }\n _positions6[0].push([that.options.positions[0].lng, that.options.positions[0].lat]);\n var _polygon2 = turf.polygon(_positions6);\n var _centroid2 = turf.centroid(_polygon2);\n that.getClampToHeight({\n lng: _centroid2.geometry.coordinates[0],\n lat: _centroid2.geometry.coordinates[1]\n }, _objectsToExclude2).then(function (height) {\n that.label.position = [_centroid2.geometry.coordinates[0], _centroid2.geometry.coordinates[1], height];\n });\n }\n }\n that.tip.setPosition(cartesian, movement.endPosition.x, movement.endPosition.y);\n });\n that.event.mouse_right_keyboard_ctrl(function (movement, cartesian) {\n if (selectPoint) {\n that.options.positions.pop();\n that.sdk.viewer.entities.remove(that.nodePoints[that.nodePoints.length - 1]);\n if (selectPoint.index === that.options.positions.length) {\n if (that.nodePoints[selectPoint.index - 1]) {\n selectPoint = that.nodePoints[selectPoint.index - 1];\n } else {\n selectPoint.index = 0;\n }\n }\n that.nodePoints.pop();\n }\n });\n that.event.gesture_pinck_start(function (movement, cartesian) {\n var startTime = new Date();\n var pos = {\n position: {\n x: (movement.position1.x + movement.position2.x) / 2,\n y: (movement.position1.y + movement.position2.y) / 2\n }\n };\n that.event.gesture_pinck_end(function () {\n var endTime = new Date();\n if (endTime - startTime >= 500) {\n // 长按取消\n rightEvent(pos, cartesian);\n } else {\n leftEvent(pos, cartesian);\n }\n });\n });\n createNodePoints();\n }, 200);\n }\n }, 50);\n }\n }, {\n key: \"closeNodeEdit\",\n value: function closeNodeEdit(that) {\n if (!that.sdk || !that.sdk.viewer) {\n return;\n }\n YJ.Measure.SetMeasureStatus(false);\n that.event && that.event.destroy();\n that.tip && that.tip.destroy();\n that.tip = null;\n for (var i = 0; i < that.nodePoints.length; i++) {\n that.sdk.viewer.entities.remove(that.nodePoints[i]);\n }\n that.nodePoints = [];\n that.picking = true;\n }\n }]);\n}(_index__WEBPACK_IMPORTED_MODULE_13__[\"default\"]);\n/* harmony default export */ __webpack_exports__[\"default\"] = (PolygonObject);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvT2JqL0Jhc2UvUG9seWdvbk9iamVjdC9pbmRleC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3NyYy9PYmovQmFzZS9Qb2x5Z29uT2JqZWN0L2luZGV4LmpzP2M0ZDMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiAqIOWkmui+ueW9olxyXG4gKi9cclxuaW1wb3J0IERpYWxvZyBmcm9tICcuLi8uLi9FbGVtZW50L0RpYWxvZydcclxuaW1wb3J0IGN5X3RhYnMgZnJvbSAnLi4vLi4vRWxlbWVudC9jeV9odG1sX3RhYnMnXHJcbmltcG9ydCByaWNoVGV4dCBmcm9tICcuLi8uLi9FbGVtZW50L3JpY2hUZXh0J1xyXG5pbXBvcnQgeyBodG1sIH0gZnJvbSAnLi9fZWxlbWVudCdcclxuaW1wb3J0IEJhc2UgZnJvbSAnLi4vaW5kZXgnXHJcbmltcG9ydCBMYWJlbE9iamVjdCBmcm9tICcuLi9MYWJlbE9iamVjdCdcclxuaW1wb3J0IE1vdXNlRXZlbnQgZnJvbSAnLi4vLi4vLi4vRXZlbnQvaW5kZXgnXHJcbmltcG9ydCBNb3VzZVRpcCBmcm9tICcuLi8uLi8uLi9Nb3VzZVRpcCdcclxuaW1wb3J0IHsgc3luY0RhdGEgfSBmcm9tICcuLi8uLi8uLi9HbG9iYWwvTXVsdGlWaWV3cG9ydE1vZGUnXHJcbmltcG9ydCB7IGxlZ3AgfSBmcm9tICcuLi8uLi9FbGVtZW50L2RhdGFsaXN0J1xyXG5pbXBvcnQgeyBnZXRGb250TGlzdCwgZ2V0Rm9udEZhbWlseU5hbWUgfSBmcm9tICcuLi8uLi9FbGVtZW50L2ZvbnRTZWxlY3QnXHJcbmltcG9ydCB7IHNldFNwbGl0RGlyZWN0aW9uLCBzeW5jU3BsaXREYXRhLCBzZXRBY3RpdmVJZCB9IGZyb20gJy4uLy4uLy4uL0dsb2JhbC9TcGxpdFNjcmVlbidcclxuaW1wb3J0IHsgc2V0QWN0aXZlVmlld2VyLCBjbG9zZVJvdGF0ZUFyb3VuZCwgY2xvc2VWaWV3Rm9sbG93IH0gZnJvbSAnLi4vLi4vLi4vR2xvYmFsL2dsb2JhbCdcclxuLy8gaW1wb3J0IEVkaXRQYXJ0aWNsZSBmcm9tIFwiLi4vLi4vTW9kZWxDb250cm9sbGVyL0VkaXRQYXJ0aWNsZVwiO1xyXG5cclxuY2xhc3MgUG9seWdvbk9iamVjdCBleHRlbmRzIEJhc2Uge1xyXG4gIC8qKlxyXG4gICAqIEBjb25zdHJ1Y3RvclxyXG4gICAqIEBkZXNjcmlwdGlvbiDlpJrovrnlvaJcclxuICAgKiBAcGFyYW0gc2RrXHJcbiAgICogQHBhcmFtIG9wdGlvbnMge29iamVjdH0g5bGe5oCnXHJcbiAgICogQHBhcmFtIG9wdGlvbnMuaWQge3N0cmluZ30g5ZSv5LiA5qCH6K+GXHJcbiAgICogQHBhcmFtIG9wdGlvbnMuc2hvdz10cnVlIHtib29sZWFufSDmmL7npLov6ZqQ6JePXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubmFtZSB7c3RyaW5nfSDlkI3np7BcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5jb2xvcj0ncmdiYSgyNTUsIDAsIDAsIDAuNSknIHtzdHJpbmd9IOminOiJslxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmhlaWdodCB7bnVtYmVyfSDpq5jluqZcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5oZWlnaHRNb2RlPTJ7bnVtYmVyfSDpq5jluqbmqKHlvI/vvIgw77ya5rW35ouU6auY5bqm77ybMe+8muebuOWvueWcsOihqO+8mzLvvJrkvp3pmYTmqKHlvI/vvIlcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5hcmVhVW5pdD0n5bmz5pa557GzJyB7c3RyaW5nfSDpnaLnp6/ljZXkvY1cclxuICAgKiBAcGFyYW0gb3B0aW9ucy5saW5lIHtvYmplY3R9IOi+ueahhlxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxpbmUud2lkdGg9MiB7c3RyaW5nfSDovrnmoYblrr1cclxuICAgKiBAcGFyYW0gb3B0aW9ucy5saW5lLmNvbG9yPVwicmdiYSgxNTUsIDE1NSwgMTI0LCAwLjg5KVwiIHtzdHJpbmd9IOi+ueahhuminOiJslxyXG4gICAqIEBwYXJhbSB7QXJyYXkuPG9iamVjdD59IG9wdGlvbnMucG9zaXRpb25zIOW/heWhq++8jOe7j+e6rOW6puWSjOmrmOW6pueahOWIl+ihqO+8jOWAvOS6pOabvyBbe2xvbixsYXQsYWx0fSwuLi5dXHJcbiAgICogQHBhcmFtIG9wdGlvbnMucG9zaXRpb25zW10ubG5nIHtudW1iZXJ9IOe7j+W6plxyXG4gICAqIEBwYXJhbSBvcHRpb25zLnBvc2l0aW9uc1tdLmxhdCB7bnVtYmVyfSDnuqzluqZcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5wb3NpdGlvbnNbXS5hbHQge251bWJlcn0g6auY5bqmXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwge29iamVjdH0g5qCH562+5a+56LGhXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwudGV4dCB7c3RyaW5nfSDmoIfnrb7mlofmnKxcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5sYWJlbC5zaG93IHtzdHJpbmd9IOagh+etvuaYvumakFxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLnBvc2l0aW9uIHtzdHJpbmd9IOagh+etvuS9jee9rlxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLnBvc2l0aW9uIHtvYmplY3R9IOagh+etvuS9jee9rlxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLnBvc2l0aW9uLmxuZyB7bnVtYmVyfSDnu4/luqZcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5sYWJlbC5wb3NpdGlvbi5sYXQge251bWJlcn0g57qs5bqmXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwucG9zaXRpb24uYWx0IHtudW1iZXJ9IOmrmOW6plxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLmZvbnRTaXplPTIwIHtudW1iZXJ9IOWtl+S9k+Wkp+Wwj1xyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLmZvbnRGYW1pbHk9MCB7bnVtYmVyfSDlrZfkvZPpobkgMO+8mum7keS9k++8mzHvvJrmgJ3mupDpu5HkvZPvvJsy77ya5bqe6Zeo5q2j6YGT5qCH6aKY5L2T77ybM++8muaVsOm7keS9k1xyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLmNvbG9yPSNmZmZmZmYge3N0cmluZ30g5a2X5L2T6aKc6ImyXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwubGluZVdpZHRoPTQge251bWJlcn0g5byV57q/5a69XHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwubGluZUNvbG9yPSMwMGZmZmY4MCB7c3RyaW5nfSDlvJXnur/popzoibJcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5sYWJlbC5waXhlbE9mZnNldD0yMCB7bnVtYmVyfSDlrZfkvZPlgY/np7so5byV57q/6ZW/5bqmKVxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLmJhY2tncm91bmRDb2xvcj1bJyMwMGZmZmY4MCcsICcjMDBmZmZmODAnXSB7YXJyYXl9IOiDjOaZr+minOiJslxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLnNjYWxlQnlEaXN0YW5jZSB7Ym9vbGVhbn0g6Led56a757yp5pS+XHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwubmVhcj0yMDAwIHtudW1iZXJ9IOinhumHjue8qeaUvuacgOi/kei3neemu1xyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLmZhcj0xMDAwMDAge251bWJlcn0g6KeG6YeO57yp5pS+5pyA6L+c6Led56a7XHJcbiAgICogQHBhcmFtIG9wdGlvbnMuYXR0cmlidXRlIHtvYmplY3R9IOWxnuaAp+WGheWuuVxyXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zLmF0dHJpYnV0ZS5saW5rPXt9IOmTvuaOpVxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnQ9W11dIHthcnJheX0g6ZO+5o6l5YaF5a65XHJcbiAgICogQHBhcmFtIG9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudFtdLm5hbWUge3N0cmluZ30g6ZO+5o6l5ZCN56ewXHJcbiAgICogQHBhcmFtIG9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudFtdLnVybCB7c3RyaW5nfSDpk77mjqXlnLDlnYBcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5yaWNoVGV4dENvbnRlbnQge3N0cmluZ30g5a+M5paH5pys5YaF5a65XHJcbiAgICogQHBhcmFtIG9wdGlvbnMuY3VzdG9tVmlldyB7b2JqZWN0fSDpu5jorqTop4bop5JcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5jdXN0b21WaWV3Lm9yaWVudGF0aW9uIHtvYmplY3R9IOm7mOiupOinhuinkuaWueS9jVxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmN1c3RvbVZpZXcub3JpZW50YXRpb24uaGVhZGluZyB7bnVtYmVyfSDoiKrlkJHop5JcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5jdXN0b21WaWV3Lm9yaWVudGF0aW9uLnBpdGNoIHtudW1iZXJ9IOS/r+S7sOinklxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmN1c3RvbVZpZXcub3JpZW50YXRpb24ucm9sbCB7bnVtYmVyfSDnv7vmu5rop5JcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5jdXN0b21WaWV3LnJlbGF0aXZlUG9zaXRpb24ge29iamVjdH0g6KeG6KeS55u45a+55L2N572uXHJcbiAgICogQHBhcmFtIG9wdGlvbnMuY3VzdG9tVmlldy5yZWxhdGl2ZVBvc2l0aW9uLmxuZyB7bnVtYmVyfSDnu4/luqZcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5jdXN0b21WaWV3LnJlbGF0aXZlUG9zaXRpb24ubGF0IHtudW1iZXJ9IOe6rOW6plxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmN1c3RvbVZpZXcucmVsYXRpdmVQb3NpdGlvbi5hbHQge251bWJlcn0g6auY5bqmXHJcbiAgICogXHJcblxyXG5cclxuICAgKiBcclxuICAgKiBAcGFyYW0gX0RpYWxvZyB7b2JqZWN0fSDlvLnmoYbkuovku7ZcclxuICAgKiBAcGFyYW0gX0RpYWxvZy5jb25maXJtQ2FsbEJhY2sge2Z1bmN0aW9ufSDlvLnmoYbnoa7orqTml7bnmoTlm57osINcclxuICAgKiAqL1xyXG4gIGNvbnN0cnVjdG9yKHNkaywgb3B0aW9ucyA9IHt9LCBfRGlhbG9nID0ge30pIHtcclxuICAgIHN1cGVyKHNkaywgb3B0aW9ucylcclxuICAgIHRoaXMub3B0aW9ucy5uYW1lID0gb3B0aW9ucy5uYW1lIHx8ICfmnKrlkb3lkI3lr7nosaEnXHJcbiAgICB0aGlzLm9wdGlvbnMuY29sb3IgPSBvcHRpb25zLmNvbG9yIHx8ICdyZ2JhKDI1NSwgMCwgMCwgMC41KSdcclxuICAgIHRoaXMub3B0aW9ucy5zaG93ID1cclxuICAgICAgb3B0aW9ucy5zaG93IHx8IG9wdGlvbnMuc2hvdyA9PT0gZmFsc2UgPyBvcHRpb25zLnNob3cgOiB0cnVlXHJcbiAgICB0aGlzLm9wdGlvbnMuaGVpZ2h0TW9kZSA9IChvcHRpb25zLmhlaWdodE1vZGUgfHwgb3B0aW9ucy5oZWlnaHRNb2RlID09IDApID8gb3B0aW9ucy5oZWlnaHRNb2RlIDogMlxyXG4gICAgdGhpcy5vcHRpb25zLnBvc2l0aW9ucyA9IG9wdGlvbnMucG9zaXRpb25zIHx8IFtdXHJcbiAgICB0aGlzLm9wdGlvbnMubGluZSA9IG9wdGlvbnMubGluZSB8fCB7fVxyXG4gICAgdGhpcy5vcHRpb25zLmxpbmUud2lkdGggPSAoKHRoaXMub3B0aW9ucy5saW5lLndpZHRoIHx8IHRoaXMub3B0aW9ucy5saW5lLndpZHRoID09PSAwKSA/IHRoaXMub3B0aW9ucy5saW5lLndpZHRoIDogMylcclxuICAgIHRoaXMub3B0aW9ucy5saW5lLmNvbG9yID1cclxuICAgICAgdGhpcy5vcHRpb25zLmxpbmUuY29sb3IgfHwgJ3JnYmEoMjU1LCAwLCAwLCAxKSdcclxuICAgIHRoaXMub3B0aW9uc1snYXJlYS11bml0J10gPSBvcHRpb25zWydhcmVhLXVuaXQnXSB8fCAn5bmz5pa557GzJ1xyXG4gICAgdGhpcy5lbnRpdHlcclxuICAgIHRoaXMuZXZlbnQgPSBuZXcgTW91c2VFdmVudCh0aGlzLnNkaylcclxuICAgIHRoaXMub3BlcmF0ZSA9IHt9XHJcbiAgICB0aGlzLl9lbG1zID0ge31cclxuICAgIHRoaXMuRGlhbG9nID0gX0RpYWxvZ1xyXG4gICAgdGhpcy5ub2RlUG9pbnRzID0gW11cclxuICAgIG9wdGlvbnMubGFiZWwgPSBvcHRpb25zLmxhYmVsIHx8IHt9XHJcbiAgICB0aGlzLm9wdGlvbnMubGFiZWwgPSB7XHJcbiAgICAgIHRleHQ6IHRoaXMub3B0aW9ucy5uYW1lLFxyXG4gICAgICBzaG93OiBvcHRpb25zLmxhYmVsLnNob3cgfHwgZmFsc2UsXHJcbiAgICAgIHBvc2l0aW9uOiBvcHRpb25zLmxhYmVsLnBvc2l0aW9uLFxyXG4gICAgICBmb250U2l6ZTpcclxuICAgICAgICBvcHRpb25zLmxhYmVsLmZvbnRTaXplIHx8IG9wdGlvbnMubGFiZWwuZm9udFNpemUgPT09IDBcclxuICAgICAgICAgID8gb3B0aW9ucy5sYWJlbC5mb250U2l6ZVxyXG4gICAgICAgICAgOiAyMCxcclxuICAgICAgZm9udEZhbWlseTogb3B0aW9ucy5sYWJlbC5mb250RmFtaWx5ID8gb3B0aW9ucy5sYWJlbC5mb250RmFtaWx5IDogMCxcclxuICAgICAgY29sb3I6IG9wdGlvbnMubGFiZWwuY29sb3IgfHwgJyNmZmZmZmYnLFxyXG4gICAgICBsaW5lV2lkdGg6XHJcbiAgICAgICAgb3B0aW9ucy5sYWJlbC5saW5lV2lkdGggfHwgb3B0aW9ucy5sYWJlbC5saW5lV2lkdGggPT09IDBcclxuICAgICAgICAgID8gb3B0aW9ucy5sYWJlbC5saW5lV2lkdGhcclxuICAgICAgICAgIDogNCxcclxuICAgICAgcGl4ZWxPZmZzZXQ6XHJcbiAgICAgICAgb3B0aW9ucy5sYWJlbC5waXhlbE9mZnNldCB8fCBvcHRpb25zLmxhYmVsLnBpeGVsT2Zmc2V0ID09PSAwXHJcbiAgICAgICAgICA/IG9wdGlvbnMubGFiZWwucGl4ZWxPZmZzZXRcclxuICAgICAgICAgIDogMjAsXHJcbiAgICAgIGJhY2tncm91bmRDb2xvcjogb3B0aW9ucy5sYWJlbC5iYWNrZ3JvdW5kQ29sb3IgfHwgWycjMDBmZmZmODAnLCAnIzAwZmZmZjgwJ10sXHJcbiAgICAgIGxpbmVDb2xvcjogb3B0aW9ucy5sYWJlbC5saW5lQ29sb3IgfHwgJyMwMGZmZmY4MCcsXHJcbiAgICAgIHNjYWxlQnlEaXN0YW5jZTogb3B0aW9ucy5sYWJlbC5zY2FsZUJ5RGlzdGFuY2UgfHwgZmFsc2UsXHJcbiAgICAgIG5lYXI6XHJcbiAgICAgICAgb3B0aW9ucy5sYWJlbC5uZWFyIHx8IG9wdGlvbnMubGFiZWwubmVhciA9PT0gMFxyXG4gICAgICAgICAgPyBvcHRpb25zLmxhYmVsLm5lYXJcclxuICAgICAgICAgIDogMjAwMCxcclxuICAgICAgZmFyOlxyXG4gICAgICAgIG9wdGlvbnMubGFiZWwuZmFyIHx8IG9wdGlvbnMubGFiZWwuZmFyID09PSAwXHJcbiAgICAgICAgICA/IG9wdGlvbnMubGFiZWwuZmFyXHJcbiAgICAgICAgICA6IDEwMDAwMFxyXG4gICAgfVxyXG4gICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZSA9IG9wdGlvbnMuYXR0cmlidXRlIHx8IHt9XHJcbiAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsgfHwge31cclxuICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50ID1cclxuICAgICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnQgfHwgW11cclxuICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUuY2FtZXJhID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5jYW1lcmEgfHwge31cclxuICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUuY2FtZXJhLmNvbnRlbnQgPVxyXG4gICAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmNhbWVyYS5jb250ZW50IHx8IFtdXHJcbiAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52ciB8fCB7fVxyXG4gICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52ci5jb250ZW50ID1cclxuICAgICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52ci5jb250ZW50IHx8IFtdXHJcbiAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmdvb2RzID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5nb29kcyB8fCB7fVxyXG4gICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5nb29kcy5jb250ZW50ID1cclxuICAgICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5nb29kcy5jb250ZW50IHx8IFtdXHJcbiAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlVHlwZSA9IG9wdGlvbnMuYXR0cmlidXRlVHlwZSB8fCAncmljaFRleHQnXHJcbiAgICBpZiAoIXRoaXMub3B0aW9ucy5wb3NpdGlvbnMgfHwgdGhpcy5vcHRpb25zLnBvc2l0aW9ucy5sZW5ndGggPCAzKSB7XHJcbiAgICAgIHRoaXMuX2Vycm9yID0gJ+Wkmui+ueW9ouacgOWwkemcgOimgeS4ieS4quWdkOagh++8gSdcclxuICAgICAgY29uc29sZS53YXJuKHRoaXMuX2Vycm9yKVxyXG4gICAgICB3aW5kb3cuRUxFTUVOVCAmJlxyXG4gICAgICAgIHdpbmRvdy5FTEVNRU5ULk1lc3NhZ2Uoe1xyXG4gICAgICAgICAgbWVzc2FnZTogdGhpcy5fZXJyb3IsXHJcbiAgICAgICAgICB0eXBlOiAnd2FybmluZycsXHJcbiAgICAgICAgICBkdXJhdGlvbjogMTUwMFxyXG4gICAgICAgIH0pXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAoIXRoaXMub3B0aW9ucy5oZWlnaHQgJiYgdGhpcy5vcHRpb25zLmhlaWdodCAhPT0gMCkge1xyXG4gICAgICAgIGxldCBoZWlnaHQgPSB0aGlzLm9wdGlvbnMucG9zaXRpb25zWzBdLmFsdFxyXG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgdGhpcy5vcHRpb25zLnBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgaWYgKGhlaWdodCA8IHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0uYWx0KSB7XHJcbiAgICAgICAgICAgIGhlaWdodCA9IHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0uYWx0XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMub3B0aW9ucy5oZWlnaHQgPSBoZWlnaHRcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnNkay5hZGRJbmNldGFuY2UodGhpcy5vcHRpb25zLmlkLCB0aGlzKVxyXG4gICAgICB0aGlzLl96SW5kZXggPSB0aGlzLnNkay5lbnRpdHlNYXAuc2l6ZVxyXG4gICAgICBQb2x5Z29uT2JqZWN0LmNyZWF0ZSh0aGlzKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IHR5cGUoKSB7XHJcbiAgICByZXR1cm4gJ1BvbHlnb25PYmplY3QnXHJcbiAgfVxyXG5cclxuICBnZXQgY29sb3IoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmNvbG9yXHJcbiAgfVxyXG4gIHNldCBjb2xvcih2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMuY29sb3IgPSB2IHx8ICdyZ2JhKDI1NSwgMCwgMCwgMC41KSdcclxuICAgIGlmICghdGhpcy5zZGsgfHwgIXRoaXMuc2RrLnZpZXdlciB8fCAhdGhpcy5lbnRpdHkgfHwgIXRoaXMuZW50aXR5LnBvbHlnb24pIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcbiAgICBpZiAoIXRoaXMuc2RrIHx8ICF0aGlzLnNkay52aWV3ZXIgfHwgIXRoaXMuZW50aXR5IHx8ICF0aGlzLmVudGl0eS5wb2x5Z29uKSB7XHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG4gICAgbGV0IG1hdGVyaWFsID0gQ2VzaXVtLkNvbG9yLmZyb21Dc3NDb2xvclN0cmluZyh0aGlzLm9wdGlvbnMuY29sb3IpXHJcbiAgICBpZiAodGhpcy5zZGsudmlld2VyLnNjZW5lLm1vZGUgPT09IDIpIHtcclxuICAgICAgdGhpcy5oZWlnaHRNb2RlID0gMFxyXG4gICAgICBtYXRlcmlhbCA9IG5ldyBDZXNpdW0uQ3VzdG9tQ29sb3JNYXRlcmlhbFNvdXJjZSh7XHJcbiAgICAgICAgY29sb3I6IHRoaXMub3B0aW9ucy5jb2xvclxyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gICAgdGhpcy5lbnRpdHkucG9seWdvbi5tYXRlcmlhbCA9IG1hdGVyaWFsXHJcbiAgICBpZiAodGhpcy5fZWxtcy5jb2xvcikge1xyXG4gICAgICB0aGlzLl9lbG1zLmNvbG9yLmZvckVhY2goKGl0ZW0sIGkpID0+IHtcclxuICAgICAgICBsZXQgY29sb3JQaWNrZXIgPSBuZXcgWUpDb2xvclBpY2tlcih7XHJcbiAgICAgICAgICBlbDogaXRlbS5lbCxcclxuICAgICAgICAgIHNpemU6ICdtaW5pJywgLy/popzoibJib3jnsbvlnotcclxuICAgICAgICAgIGFscGhhOiB0cnVlLCAvL+aYr+WQpuW8gOWQr+mAj+aYjuW6plxyXG4gICAgICAgICAgZGVmYXVsdENvbG9yOiB0aGlzLm9wdGlvbnMuY29sb3IsXHJcbiAgICAgICAgICBkaXNhYmxlZDogZmFsc2UsIC8v5piv5ZCm56aB5q2i5omT5byA6aKc6Imy6YCJ5oup5ZmoXHJcbiAgICAgICAgICBvcGVuUGlja2VyQW5pOiAnb3BhY2l0eScsIC8v5omT5byA6aKc6Imy6YCJ5oup5Zmo5Yqo55S7XHJcbiAgICAgICAgICBzdXJlOiBjID0+IHtcclxuICAgICAgICAgICAgdGhpcy5jb2xvciA9IGNcclxuICAgICAgICAgIH0sIC8v54K55Ye756Gu6K6k5oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgICAgICBjbGVhcjogKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmNvbG9yID0gJ3JnYmEoMjU1LDAsMCwwLjUpJ1xyXG4gICAgICAgICAgfSAvL+eCueWHu+a4heepuuaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgdGhpcy5fZWxtcy5jb2xvcltpXSA9IGNvbG9yUGlja2VyXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgaGVpZ2h0TW9kZSgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuaGVpZ2h0TW9kZSA/IHRoaXMub3B0aW9ucy5oZWlnaHRNb2RlIDogMFxyXG4gIH1cclxuICBzZXQgaGVpZ2h0TW9kZSh2KSB7XHJcbiAgICB0aGlzLmVudGl0eS5wb2x5Z29uLmhpZXJhcmNoeSA9IFtdXHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5vcHRpb25zLmhlaWdodE1vZGUgPSAodiB8fCB2ID09IDApID8gdiA6IDJcclxuICAgICAgdGhpcy5wb3NpdGlvbkVkaXRpbmcgPSBmYWxzZVxyXG4gICAgICBpZiAoIXRoaXMuZW50aXR5KSB7XHJcbiAgICAgICAgcmV0dXJuXHJcbiAgICAgIH1cclxuICAgICAgbGV0IHBvc2l0aW9ucyA9IHRoaXMub3B0aW9ucy5wb3NpdGlvbnNcclxuICAgICAgbGV0IGhlaWdodE1vZGVOYW1lID0gJydcclxuICAgICAgUG9seWdvbk9iamVjdC5jbG9zZU5vZGVFZGl0KHRoaXMpXHJcbiAgICAgIGxldCBncm91bmQgPSBmYWxzZVxyXG4gICAgICBsZXQgZGlzYWJsZWQgPSBmYWxzZVxyXG4gICAgICB0aGlzLnJlbmV3UG9zaXRpb25zKClcclxuICAgICAgdGhpcy5lbnRpdHkucG9seWxpbmUucG9zaXRpb25zID0gW1xyXG4gICAgICAgIC4uLnRoaXMucG9zaXRpb25zLFxyXG4gICAgICAgIHRoaXMucG9zaXRpb25zWzBdLFxyXG4gICAgICAgIHRoaXMucG9zaXRpb25zWzFdXHJcbiAgICAgIF1cclxuICAgICAgdGhpcy5lbnRpdHkucG9seWdvbi5oaWVyYXJjaHkgPSBuZXcgQ2VzaXVtLlBvbHlnb25IaWVyYXJjaHkoXHJcbiAgICAgICAgdGhpcy5wb3NpdGlvbnNcclxuICAgICAgKVxyXG4gICAgICBzd2l0Y2ggKHRoaXMub3B0aW9ucy5oZWlnaHRNb2RlKSB7XHJcbiAgICAgICAgY2FzZSAnMCc6XHJcbiAgICAgICAgY2FzZSAwOlxyXG4gICAgICAgICAgaGVpZ2h0TW9kZU5hbWUgPSAn5rW35ouU6auY5bqmJ1xyXG4gICAgICAgICAgYnJlYWtcclxuICAgICAgICBjYXNlICcxJzpcclxuICAgICAgICBjYXNlIDE6XHJcbiAgICAgICAgICBoZWlnaHRNb2RlTmFtZSA9ICfnm7jlr7nlnLDooagnXHJcbiAgICAgICAgICBicmVha1xyXG4gICAgICAgIGNhc2UgJzInOlxyXG4gICAgICAgIGNhc2UgMjpcclxuICAgICAgICAgIGdyb3VuZCA9IHRydWVcclxuICAgICAgICAgIGRpc2FibGVkID0gdHJ1ZVxyXG4gICAgICAgICAgaGVpZ2h0TW9kZU5hbWUgPSAn5L6d6ZmE5qih5Z6LJ1xyXG4gICAgICAgICAgYnJlYWtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmxhYmVsLmdyb3VuZCA9IGdyb3VuZFxyXG4gICAgICB0aGlzLmVudGl0eS5wb2x5bGluZS5jbGFtcFRvR3JvdW5kID0gZ3JvdW5kXHJcbiAgICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLmFyY1R5cGUgPSAhZ3JvdW5kID8gQ2VzaXVtLkFyY1R5cGUuTk9ORSA6IENlc2l1bS5BcmNUeXBlLkdFT0RFU0lDLFxyXG4gICAgICAgIHRoaXMuZW50aXR5LnBvbHlnb24ucGVyUG9zaXRpb25IZWlnaHQgPSAhZ3JvdW5kID8gdHJ1ZSA6IGZhbHNlXHJcbiAgICAgIHRoaXMuX2VsbXMuaGVpZ2h0TW9kZSAmJiAodGhpcy5fZWxtcy5oZWlnaHRNb2RlLnZhbHVlID0gaGVpZ2h0TW9kZU5hbWUpXHJcbiAgICAgIHRoaXMuX2VsbXMuaGVpZ2h0TW9kZU9iamVjdCAmJiAodGhpcy5fZWxtcy5oZWlnaHRNb2RlT2JqZWN0LmxlZ3Bfc2VhcmNoQWN0aXZlKFxyXG4gICAgICAgIGhlaWdodE1vZGVOYW1lXHJcbiAgICAgICkpXHJcbiAgICAgIGlmIChkaXNhYmxlZCkge1xyXG4gICAgICAgIHRoaXMuX2VsbXMuaGVpZ2h0Qm94ICYmICh0aGlzLl9lbG1zLmhlaWdodEJveC5jbGFzc05hbWUgPSAnaW5wdXQtbnVtYmVyIGlucHV0LW51bWJlci11bml0LTEgaGVpZ2h0LWJveCBkaXNhYmxlZCcpO1xyXG4gICAgICAgIHRoaXMuX2VsbXMuaGVpZ2h0Q29uZmlybSAmJiB0aGlzLl9lbG1zLmhlaWdodENvbmZpcm0uc2V0QXR0cmlidXRlKCdkaXNhYmxlZCcsICdkaXNhYmxlZCcpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRoaXMuX2VsbXMuaGVpZ2h0Qm94ICYmICh0aGlzLl9lbG1zLmhlaWdodEJveC5jbGFzc05hbWUgPSAnaW5wdXQtbnVtYmVyIGlucHV0LW51bWJlci11bml0LTEgaGVpZ2h0LWJveCcpO1xyXG4gICAgICAgIHRoaXMuX2VsbXMuaGVpZ2h0Q29uZmlybSAmJiB0aGlzLl9lbG1zLmhlaWdodENvbmZpcm0ucmVtb3ZlQXR0cmlidXRlKCdkaXNhYmxlZCcpO1xyXG4gICAgICB9XHJcbiAgICB9LCA1MCk7XHJcbiAgfVxyXG5cclxuICBnZXQgaGVpZ2h0KCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5oZWlnaHRcclxuICB9XHJcblxyXG4gIHNldCBoZWlnaHQodikge1xyXG4gICAgaWYgKCF2IHx8IGlzTmFOKE51bWJlcih2KSkpIHtcclxuICAgICAgdGhpcy5vcHRpb25zLmhlaWdodCA9IDBcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLm9wdGlvbnMuaGVpZ2h0ID0gTnVtYmVyKE51bWJlcih2KS50b0ZpeGVkKDIpKVxyXG4gICAgfVxyXG4gICAgbGV0IGdyb3VuZFxyXG4gICAgaWYgKHRoaXMuaGVpZ2h0TW9kZSA9PSAyKSB7XHJcbiAgICAgIGdyb3VuZCA9IHRydWVcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGdyb3VuZCA9IGZhbHNlXHJcbiAgICB9XHJcbiAgICB0aGlzLnJlbmV3UG9zaXRpb25zKClcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLmVudGl0eS5wb2x5Z29uLmhpZXJhcmNoeSA9IG5ldyBDZXNpdW0uUG9seWdvbkhpZXJhcmNoeSh0aGlzLnBvc2l0aW9ucylcclxuICAgICAgdGhpcy5lbnRpdHkucG9seWdvbi5wZXJQb3NpdGlvbkhlaWdodCA9ICFncm91bmQgPyB0cnVlIDogZmFsc2VcclxuICAgICAgdGhpcy5lbnRpdHkucG9seWxpbmUucG9zaXRpb25zID0gW1xyXG4gICAgICAgIC4uLnRoaXMucG9zaXRpb25zLFxyXG4gICAgICAgIHRoaXMucG9zaXRpb25zWzBdLFxyXG4gICAgICAgIHRoaXMucG9zaXRpb25zWzFdXHJcbiAgICAgIF1cclxuICAgICAgdGhpcy5lbnRpdHkucG9seWxpbmUuY2xhbXBUb0dyb3VuZCA9ICFncm91bmQgPyBmYWxzZSA6IHRydWVcclxuICAgICAgdGhpcy5lbnRpdHkucG9seWxpbmUuYXJjVHlwZSA9ICFncm91bmQgPyBDZXNpdW0uQXJjVHlwZS5OT05FIDogQ2VzaXVtLkFyY1R5cGUuR0VPREVTSUNcclxuICAgIH0sIDApO1xyXG5cclxuICAgIHRoaXMuX2VsbXMuYWx0ICYmXHJcbiAgICAgIHRoaXMuX2VsbXMuYWx0LmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgaXRlbS5pbm5lckhUTUwgPSB0aGlzLm9wdGlvbnMuaGVpZ2h0XHJcbiAgICAgIH0pXHJcbiAgfVxyXG5cclxuICBnZXQgbGluZUNvbG9yKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5saW5lLmNvbG9yXHJcbiAgfVxyXG4gIHNldCBsaW5lQ29sb3Iodikge1xyXG4gICAgdGhpcy5vcHRpb25zLmxpbmUuY29sb3IgPSB2IHx8ICdyZ2JhKDI1NSwgMCwgMCwgMC41KSdcclxuICAgIGlmICghdGhpcy5zZGsgfHwgIXRoaXMuc2RrLnZpZXdlciB8fCAhdGhpcy5lbnRpdHkgfHwgIXRoaXMuZW50aXR5LnBvbHlsaW5lKSB7XHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG4gICAgdGhpcy5lbnRpdHkucG9seWxpbmUubWF0ZXJpYWwgPSBDZXNpdW0uQ29sb3IuZnJvbUNzc0NvbG9yU3RyaW5nKHRoaXMub3B0aW9ucy5saW5lLmNvbG9yKVxyXG4gICAgaWYgKHRoaXMuX2VsbXMubGluZUNvbG9yKSB7XHJcbiAgICAgIHRoaXMuX2VsbXMubGluZUNvbG9yLmZvckVhY2goKGl0ZW0sIGkpID0+IHtcclxuICAgICAgICBsZXQgbGluZUNvbG9yUGlja2VyID0gbmV3IFlKQ29sb3JQaWNrZXIoe1xyXG4gICAgICAgICAgZWw6IGl0ZW0uZWwsXHJcbiAgICAgICAgICBzaXplOiAnbWluaScsIC8v6aKc6ImyYm9457G75Z6LXHJcbiAgICAgICAgICBhbHBoYTogdHJ1ZSwgLy/mmK/lkKblvIDlkK/pgI/mmI7luqZcclxuICAgICAgICAgIGRlZmF1bHRDb2xvcjogdGhpcy5vcHRpb25zLmxpbmUuY29sb3IsXHJcbiAgICAgICAgICBkaXNhYmxlZDogZmFsc2UsIC8v5piv5ZCm56aB5q2i5omT5byA6aKc6Imy6YCJ5oup5ZmoXHJcbiAgICAgICAgICBvcGVuUGlja2VyQW5pOiAnb3BhY2l0eScsIC8v5omT5byA6aKc6Imy6YCJ5oup5Zmo5Yqo55S7XHJcbiAgICAgICAgICBzdXJlOiBjID0+IHtcclxuICAgICAgICAgICAgdGhpcy5saW5lQ29sb3IgPSBjXHJcbiAgICAgICAgICB9LCAvL+eCueWHu+ehruiupOaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICAgICAgY2xlYXI6ICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5saW5lQ29sb3IgPSAncmdiYSgyNTUsMCwwLDAuNSknXHJcbiAgICAgICAgICB9IC8v54K55Ye75riF56m65oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgICAgfSlcclxuICAgICAgICB0aGlzLl9lbG1zLmxpbmVDb2xvcltpXSA9IGxpbmVDb2xvclBpY2tlclxyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IGxpbmVXaWR0aCgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubGluZS53aWR0aFxyXG4gIH1cclxuICBzZXQgbGluZVdpZHRoKHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5saW5lLndpZHRoID0gKCh2IHx8IHYgPT09IDApID8gdiA6IDMpXHJcbiAgICB0aGlzLmVudGl0eS5wb2x5bGluZS53aWR0aCA9IHRoaXMub3B0aW9ucy5saW5lLndpZHRoXHJcbiAgICB0aGlzLl9lbG1zLmxpbmVXaWR0aCAmJlxyXG4gICAgICB0aGlzLl9lbG1zLmxpbmVXaWR0aC5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgIGl0ZW0udmFsdWUgPSB2XHJcbiAgICAgIH0pXHJcbiAgfVxyXG5cclxuICBnZXQgYXJlYSgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuYXJlYVxyXG4gIH1cclxuXHJcbiAgc2V0IGFyZWEodikge1xyXG4gICAgdGhpcy5vcHRpb25zLmFyZWEgPSB2XHJcbiAgICB0aGlzLl9lbG1zLmFyZWEgJiZcclxuICAgICAgdGhpcy5fZWxtcy5hcmVhLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgaXRlbS52YWx1ZSA9IHZcclxuICAgICAgfSlcclxuICB9XHJcblxyXG4gIGdldCBhcmVhVW5pdCgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnNbJ2FyZWEtdW5pdCddXHJcbiAgfVxyXG4gIHNldCBhcmVhVW5pdCh2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnNbJ2FyZWEtdW5pdCddID0gdlxyXG4gICAgdGhpcy5fZWxtcy5hcmVhVW5pdCAmJlxyXG4gICAgICB0aGlzLl9lbG1zLmFyZWFVbml0LmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgaXRlbS52YWx1ZSA9IHZcclxuICAgICAgfSlcclxuICAgIGlmICh0aGlzLm9wdGlvbnMuYXJlYUJ5TWV0ZXIpIHtcclxuICAgICAgc3dpdGNoICh2KSB7XHJcbiAgICAgICAgY2FzZSAn5bmz5pa557GzJzpcclxuICAgICAgICAgIHRoaXMuYXJlYSA9IHRoaXMub3B0aW9ucy5hcmVhQnlNZXRlclxyXG4gICAgICAgICAgYnJlYWtcclxuICAgICAgICBjYXNlICflubPmlrnljYPnsbMnOlxyXG4gICAgICAgICAgdGhpcy5hcmVhID0gTnVtYmVyKCh0aGlzLm9wdGlvbnMuYXJlYUJ5TWV0ZXIgLyAxMDAwMDAwKS50b0ZpeGVkKDgpKVxyXG4gICAgICAgICAgYnJlYWtcclxuICAgICAgICBjYXNlICfkuqknOlxyXG4gICAgICAgICAgdGhpcy5hcmVhID0gTnVtYmVyKFxyXG4gICAgICAgICAgICAodGhpcy5vcHRpb25zLmFyZWFCeU1ldGVyIC8gNjY2LjY2NjY2NjcpLnRvRml4ZWQoNClcclxuICAgICAgICAgIClcclxuICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgY2FzZSAn5YWs6aG3JzpcclxuICAgICAgICAgIHRoaXMuYXJlYSA9IE51bWJlcigodGhpcy5vcHRpb25zLmFyZWFCeU1ldGVyIC8gMTAwMDApLnRvRml4ZWQoNikpXHJcbiAgICAgICAgICBicmVha1xyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICB0aGlzLmFyZWEgPSB0aGlzLm9wdGlvbnMuYXJlYUJ5TWV0ZXJcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IGxhYmVsU2hvdygpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubGFiZWwuc2hvd1xyXG4gIH1cclxuICBzZXQgbGFiZWxTaG93KHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5sYWJlbC5zaG93ID0gdlxyXG4gICAgaWYgKHRoaXMuc2hvdyAmJiAhdGhpcy5zaG93VmlldyB8fCB0aGlzLnNob3dWaWV3ID09IDMpIHtcclxuICAgICAgdGhpcy5sYWJlbC5zaG93ID0gdlxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5sYWJlbC5zaG93ID0gZmFsc2VcclxuICAgIH1cclxuICAgIHRoaXMuX2VsbXMubGFiZWxTaG93ICYmXHJcbiAgICAgIHRoaXMuX2VsbXMubGFiZWxTaG93LmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgaXRlbS5jaGVja2VkID0gdlxyXG4gICAgICB9KVxyXG4gIH1cclxuXHJcbiAgZ2V0IGxhYmVsRm9udEZhbWlseSgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubGFiZWwuZm9udEZhbWlseVxyXG4gIH1cclxuXHJcbiAgc2V0IGxhYmVsRm9udEZhbWlseSh2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMubGFiZWwuZm9udEZhbWlseSA9IHYgfHwgMFxyXG4gICAgdGhpcy5sYWJlbCAmJiAodGhpcy5sYWJlbC5mb250RmFtaWx5ID0gdGhpcy5vcHRpb25zLmxhYmVsLmZvbnRGYW1pbHkpXHJcblxyXG4gICAgbGV0IG5hbWUgPSBnZXRGb250RmFtaWx5TmFtZSh0aGlzLmxhYmVsRm9udEZhbWlseSkgfHwgJydcclxuICAgIHRoaXMuX2VsbXMubGFiZWxGb250RmFtaWx5ICYmXHJcbiAgICAgIHRoaXMuX2VsbXMubGFiZWxGb250RmFtaWx5LmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgaXRlbS52YWx1ZSA9IG5hbWVcclxuICAgICAgfSlcclxuICB9XHJcblxyXG4gIGdldCBsYWJlbENvbG9yKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5sYWJlbC5jb2xvclxyXG4gIH1cclxuICBzZXQgbGFiZWxDb2xvcih2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMubGFiZWwuY29sb3IgPSB2XHJcbiAgICB0aGlzLmxhYmVsLmNvbG9yID0gdlxyXG4gICAgaWYgKHRoaXMuX2VsbXMubGFiZWxDb2xvcikge1xyXG4gICAgICB0aGlzLl9lbG1zLmxhYmVsQ29sb3IuZm9yRWFjaCgoaXRlbSwgaSkgPT4ge1xyXG4gICAgICAgIGxldCBsYWJlbENvbG9yUGlja2VyID0gbmV3IFlKQ29sb3JQaWNrZXIoe1xyXG4gICAgICAgICAgZWw6IGl0ZW0uZWwsXHJcbiAgICAgICAgICBzaXplOiAnbWluaScsIC8v6aKc6ImyYm9457G75Z6LXHJcbiAgICAgICAgICBhbHBoYTogdHJ1ZSwgLy/mmK/lkKblvIDlkK/pgI/mmI7luqZcclxuICAgICAgICAgIGRlZmF1bHRDb2xvcjogdGhpcy5sYWJlbENvbG9yLFxyXG4gICAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLCAvL+aYr+WQpuemgeatouaJk+W8gOminOiJsumAieaLqeWZqFxyXG4gICAgICAgICAgb3BlblBpY2tlckFuaTogJ29wYWNpdHknLCAvL+aJk+W8gOminOiJsumAieaLqeWZqOWKqOeUu1xyXG4gICAgICAgICAgc3VyZTogY29sb3IgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxhYmVsQ29sb3IgPSBjb2xvclxyXG4gICAgICAgICAgfSwgLy/ngrnlh7vnoa7orqTmjInpkq7kuovku7blm57osINcclxuICAgICAgICAgIGNsZWFyOiAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubGFiZWxDb2xvciA9ICdyZ2JhKDI1NSwyNTUsMjU1LDEpJ1xyXG4gICAgICAgICAgfSAvL+eCueWHu+a4heepuuaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgdGhpcy5fZWxtcy5sYWJlbENvbG9yW2ldID0gbGFiZWxDb2xvclBpY2tlclxyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IGxhYmVsRm9udFNpemUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmxhYmVsLmZvbnRTaXplXHJcbiAgfVxyXG4gIHNldCBsYWJlbEZvbnRTaXplKHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5sYWJlbC5mb250U2l6ZSA9IHZcclxuICAgIHRoaXMubGFiZWwuZm9udFNpemUgPSB2XHJcbiAgICB0aGlzLl9lbG1zLmxhYmVsRm9udFNpemUgJiZcclxuICAgICAgdGhpcy5fZWxtcy5sYWJlbEZvbnRTaXplLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgaXRlbS52YWx1ZSA9IHZcclxuICAgICAgfSlcclxuICB9XHJcblxyXG4gIGdldCBsYWJlbFNjYWxlQnlEaXN0YW5jZSgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubGFiZWwuc2NhbGVCeURpc3RhbmNlXHJcbiAgfVxyXG4gIHNldCBsYWJlbFNjYWxlQnlEaXN0YW5jZSh2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMubGFiZWwuc2NhbGVCeURpc3RhbmNlID0gdlxyXG4gICAgdGhpcy5sYWJlbC5zY2FsZUJ5RGlzdGFuY2UgPSB2XHJcbiAgICB0aGlzLl9lbG1zLmxhYmVsU2NhbGVCeURpc3RhbmNlICYmXHJcbiAgICAgIHRoaXMuX2VsbXMubGFiZWxTY2FsZUJ5RGlzdGFuY2UuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICBpdGVtLmNoZWNrZWQgPSB2XHJcbiAgICAgIH0pXHJcbiAgfVxyXG5cclxuICBnZXQgbGFiZWxOZWFyKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5sYWJlbC5uZWFyXHJcbiAgfVxyXG4gIHNldCBsYWJlbE5lYXIodikge1xyXG4gICAgbGV0IG5lYXIgPSB2XHJcbiAgICBpZiAobmVhciA+IHRoaXMubGFiZWxGYXIpIHtcclxuICAgICAgbmVhciA9IHRoaXMubGFiZWxGYXJcclxuICAgIH1cclxuICAgIHRoaXMub3B0aW9ucy5sYWJlbC5uZWFyID0gbmVhclxyXG4gICAgdGhpcy5sYWJlbC5uZWFyID0gbmVhclxyXG4gICAgdGhpcy5fZWxtcy5sYWJlbE5lYXIgJiYgdGhpcy5fZWxtcy5sYWJlbE5lYXIuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICBpdGVtLnZhbHVlID0gbmVhclxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGdldCBsYWJlbEZhcigpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubGFiZWwuZmFyXHJcbiAgfVxyXG4gIHNldCBsYWJlbEZhcih2KSB7XHJcbiAgICBsZXQgZmFyID0gdlxyXG4gICAgaWYgKGZhciA8IHRoaXMubGFiZWxOZWFyKSB7XHJcbiAgICAgIGZhciA9IHRoaXMubGFiZWxOZWFyXHJcbiAgICB9XHJcbiAgICB0aGlzLm9wdGlvbnMubGFiZWwuZmFyID0gZmFyXHJcbiAgICB0aGlzLmxhYmVsLmZhciA9IGZhclxyXG4gICAgdGhpcy5fZWxtcy5sYWJlbEZhciAmJiB0aGlzLl9lbG1zLmxhYmVsRmFyLmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgaXRlbS52YWx1ZSA9IGZhclxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGdldCBsYWJlbExpbmVXaWR0aCgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubGFiZWwubGluZVdpZHRoXHJcbiAgfVxyXG4gIHNldCBsYWJlbExpbmVXaWR0aCh2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMubGFiZWwubGluZVdpZHRoID0gdlxyXG4gICAgdGhpcy5sYWJlbC5saW5lV2lkdGggPSB2XHJcbiAgICB0aGlzLl9lbG1zLmxhYmVsTGluZVdpZHRoICYmXHJcbiAgICAgIHRoaXMuX2VsbXMubGFiZWxMaW5lV2lkdGguZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICBpdGVtLnZhbHVlID0gdlxyXG4gICAgICB9KVxyXG4gIH1cclxuXHJcbiAgZ2V0IGxhYmVsUGl4ZWxPZmZzZXQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmxhYmVsLnBpeGVsT2Zmc2V0XHJcbiAgfVxyXG4gIHNldCBsYWJlbFBpeGVsT2Zmc2V0KHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5sYWJlbC5waXhlbE9mZnNldCA9IHZcclxuICAgIHRoaXMubGFiZWwucGl4ZWxPZmZzZXQgPSB2XHJcbiAgICB0aGlzLl9lbG1zLmxhYmVsUGl4ZWxPZmZzZXQgJiZcclxuICAgICAgdGhpcy5fZWxtcy5sYWJlbFBpeGVsT2Zmc2V0LmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgaXRlbS52YWx1ZSA9IHZcclxuICAgICAgfSlcclxuICB9XHJcbiAgZ2V0IGxhYmVsTGluZUNvbG9yKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5sYWJlbC5saW5lQ29sb3JcclxuICB9XHJcbiAgc2V0IGxhYmVsTGluZUNvbG9yKHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5sYWJlbC5saW5lQ29sb3IgPSB2XHJcbiAgICB0aGlzLmxhYmVsLmxpbmVDb2xvciA9IHZcclxuICAgIGlmICh0aGlzLl9lbG1zLmxhYmVsTGluZUNvbG9yKSB7XHJcbiAgICAgIHRoaXMuX2VsbXMubGFiZWxMaW5lQ29sb3IuZm9yRWFjaCgoaXRlbSwgaSkgPT4ge1xyXG4gICAgICAgIGxldCBsaW5lQ29sb3JQaWNrZXIgPSBuZXcgWUpDb2xvclBpY2tlcih7XHJcbiAgICAgICAgICBlbDogaXRlbS5lbCxcclxuICAgICAgICAgIHNpemU6ICdtaW5pJywgLy/popzoibJib3jnsbvlnotcclxuICAgICAgICAgIGFscGhhOiB0cnVlLCAvL+aYr+WQpuW8gOWQr+mAj+aYjuW6plxyXG4gICAgICAgICAgZGVmYXVsdENvbG9yOiB0aGlzLmxhYmVsTGluZUNvbG9yLFxyXG4gICAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLCAvL+aYr+WQpuemgeatouaJk+W8gOminOiJsumAieaLqeWZqFxyXG4gICAgICAgICAgb3BlblBpY2tlckFuaTogJ29wYWNpdHknLCAvL+aJk+W8gOminOiJsumAieaLqeWZqOWKqOeUu1xyXG4gICAgICAgICAgc3VyZTogY29sb3IgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxhYmVsTGluZUNvbG9yID0gY29sb3JcclxuICAgICAgICAgIH0sIC8v54K55Ye756Gu6K6k5oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgICAgICBjbGVhcjogKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxhYmVsTGluZUNvbG9yID0gJ3JnYmEoMCwyNTUsMjU1LDAuNSknXHJcbiAgICAgICAgICB9IC8v54K55Ye75riF56m65oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgICAgfSlcclxuICAgICAgICB0aGlzLl9lbG1zLmxhYmVsTGluZUNvbG9yW2ldID0gbGluZUNvbG9yUGlja2VyXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgbGFiZWxCYWNrZ3JvdW5kQ29sb3JTdGFydCgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubGFiZWwuYmFja2dyb3VuZENvbG9yWzBdXHJcbiAgfVxyXG4gIHNldCBsYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0KHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5sYWJlbC5iYWNrZ3JvdW5kQ29sb3JbMF0gPSB2XHJcbiAgICB0aGlzLmxhYmVsLmJhY2tncm91bmRDb2xvciA9IFt2LCB0aGlzLmxhYmVsLmJhY2tncm91bmRDb2xvclsxXV1cclxuICAgIGlmICh0aGlzLl9lbG1zLmxhYmVsQmFja2dyb3VuZENvbG9yU3RhcnQpIHtcclxuICAgICAgdGhpcy5fZWxtcy5sYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0LmZvckVhY2goKGl0ZW0sIGkpID0+IHtcclxuICAgICAgICBsZXQgbGFiZWxCYWNrZ3JvdW5kQ29sb3JTdGFydFBpY2tlciA9IG5ldyBZSkNvbG9yUGlja2VyKHtcclxuICAgICAgICAgIGVsOiBpdGVtLmVsLFxyXG4gICAgICAgICAgc2l6ZTogJ21pbmknLCAvL+minOiJsmJveOexu+Wei1xyXG4gICAgICAgICAgYWxwaGE6IHRydWUsIC8v5piv5ZCm5byA5ZCv6YCP5piO5bqmXHJcbiAgICAgICAgICBkZWZhdWx0Q29sb3I6IHRoaXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JTdGFydCxcclxuICAgICAgICAgIGRpc2FibGVkOiBmYWxzZSwgLy/mmK/lkKbnpoHmraLmiZPlvIDpopzoibLpgInmi6nlmahcclxuICAgICAgICAgIG9wZW5QaWNrZXJBbmk6ICdvcGFjaXR5JywgLy/miZPlvIDpopzoibLpgInmi6nlmajliqjnlLtcclxuICAgICAgICAgIHN1cmU6IGNvbG9yID0+IHtcclxuICAgICAgICAgICAgdGhpcy5sYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0ID0gY29sb3JcclxuICAgICAgICAgIH0sIC8v54K55Ye756Gu6K6k5oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgICAgICBjbGVhcjogKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxhYmVsQmFja2dyb3VuZENvbG9yU3RhcnQgPSAncmdiYSgyNTUsMjU1LDI1NSwxKSdcclxuICAgICAgICAgIH0gLy/ngrnlh7vmuIXnqbrmjInpkq7kuovku7blm57osINcclxuICAgICAgICB9KVxyXG4gICAgICAgIHRoaXMuX2VsbXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JTdGFydFtcclxuICAgICAgICAgIGlcclxuICAgICAgICBdID0gbGFiZWxCYWNrZ3JvdW5kQ29sb3JTdGFydFBpY2tlclxyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gIH1cclxuICBnZXQgbGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmxhYmVsLmJhY2tncm91bmRDb2xvclsxXVxyXG4gIH1cclxuICBzZXQgbGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmQodikge1xyXG4gICAgdGhpcy5vcHRpb25zLmxhYmVsLmJhY2tncm91bmRDb2xvclsxXSA9IHZcclxuICAgIHRoaXMubGFiZWwuYmFja2dyb3VuZENvbG9yID0gW3RoaXMubGFiZWwuYmFja2dyb3VuZENvbG9yWzBdLCB2XVxyXG4gICAgaWYgKHRoaXMuX2VsbXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmQpIHtcclxuICAgICAgdGhpcy5fZWxtcy5sYWJlbEJhY2tncm91bmRDb2xvckVuZC5mb3JFYWNoKChpdGVtLCBpKSA9PiB7XHJcbiAgICAgICAgbGV0IGxhYmVsQmFja2dyb3VuZENvbG9yRW5kUGlja2VyID0gbmV3IFlKQ29sb3JQaWNrZXIoe1xyXG4gICAgICAgICAgZWw6IGl0ZW0uZWwsXHJcbiAgICAgICAgICBzaXplOiAnbWluaScsIC8v6aKc6ImyYm9457G75Z6LXHJcbiAgICAgICAgICBhbHBoYTogdHJ1ZSwgLy/mmK/lkKblvIDlkK/pgI/mmI7luqZcclxuICAgICAgICAgIGRlZmF1bHRDb2xvcjogdGhpcy5sYWJlbEJhY2tncm91bmRDb2xvckVuZCxcclxuICAgICAgICAgIGRpc2FibGVkOiBmYWxzZSwgLy/mmK/lkKbnpoHmraLmiZPlvIDpopzoibLpgInmi6nlmahcclxuICAgICAgICAgIG9wZW5QaWNrZXJBbmk6ICdvcGFjaXR5JywgLy/miZPlvIDpopzoibLpgInmi6nlmajliqjnlLtcclxuICAgICAgICAgIHN1cmU6IGNvbG9yID0+IHtcclxuICAgICAgICAgICAgdGhpcy5sYWJlbEJhY2tncm91bmRDb2xvckVuZCA9IGNvbG9yXHJcbiAgICAgICAgICB9LCAvL+eCueWHu+ehruiupOaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICAgICAgY2xlYXI6ICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5sYWJlbEJhY2tncm91bmRDb2xvckVuZCA9ICdyZ2JhKDI1NSwyNTUsMjU1LDEpJ1xyXG4gICAgICAgICAgfSAvL+eCueWHu+a4heepuuaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgdGhpcy5fZWxtcy5sYWJlbEJhY2tncm91bmRDb2xvckVuZFtpXSA9IGxhYmVsQmFja2dyb3VuZENvbG9yRW5kUGlja2VyXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgYXR0cmlidXRlVHlwZSgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuYXR0cmlidXRlVHlwZVxyXG4gIH1cclxuXHJcbiAgc2V0IGF0dHJpYnV0ZVR5cGUodikge1xyXG4gICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZVR5cGUgPSB2XHJcbiAgICB0aGlzLl9lbG1zLmF0dHJpYnV0ZVR5cGUgJiZcclxuICAgICAgdGhpcy5fZWxtcy5hdHRyaWJ1dGVUeXBlLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgaXRlbS52YWx1ZSA9IHZcclxuICAgICAgfSlcclxuICAgIGxldCBhdHRyaWJ1dGVDb250ZW50ID0gdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcclxuICAgICAgJ2F0dHJpYnV0ZS1jb250ZW50J1xyXG4gICAgKVxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVDb250ZW50Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGlmIChcclxuICAgICAgICBhdHRyaWJ1dGVDb250ZW50W2ldLmNsYXNzTmFtZS5pbmRleE9mKCdhdHRyaWJ1dGUtY29udGVudC0nICsgdikgPiAtMVxyXG4gICAgICApIHtcclxuICAgICAgICBhdHRyaWJ1dGVDb250ZW50W2ldLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgYXR0cmlidXRlQ29udGVudFtpXS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCBhdHRyaWJ1dGVMaW5rKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50XHJcbiAgfVxyXG5cclxuICBzZXQgYXR0cmlidXRlTGluayh2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudCA9IHZcclxuICAgIGlmIChcclxuICAgICAgIXRoaXMuX0RpYWxvZ09iamVjdCB8fFxyXG4gICAgICAhdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50IHx8XHJcbiAgICAgICF0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudCB8fFxyXG4gICAgICB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFxyXG4gICAgICAgICdhdHRyaWJ1dGUtY29udGVudC1saW5rJ1xyXG4gICAgICApLmxlbmd0aCA9PSAwXHJcbiAgICApIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcbiAgICBsZXQgdGFibGUgPSB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudFxyXG4gICAgICAuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnYXR0cmlidXRlLWNvbnRlbnQtbGluaycpWzFdXHJcbiAgICAgIC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0YWJsZScpWzBdXHJcbiAgICBsZXQgdGFibGVDb250ZW50ID0gdGFibGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndGFibGUtYm9keScpWzBdXHJcbiAgICB0YWJsZUNvbnRlbnQuaW5uZXJIVE1MID0gJydcclxuICAgIGlmICh0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudC5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRhYmxlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RhYmxlLWVtcHR5JylbMF0uc3R5bGUuZGlzcGxheSA9ICdub25lJ1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGFibGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndGFibGUtZW1wdHknKVswXS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnXHJcbiAgICB9XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGxldCB0ciA9XHJcbiAgICAgICAgYFxyXG4gICAgICA8ZGl2IGNsYXNzPVwidHJcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZCBjZW50ZXJcIj5gICtcclxuICAgICAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudFtpXS5uYW1lICtcclxuICAgICAgICBgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidGQgY2VudGVyXCI+YCArXHJcbiAgICAgICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnRbaV0udXJsICtcclxuICAgICAgICBgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidGQgY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvbiBzdHlsZT1cIm1hcmdpbi1yaWdodDogNXB4O1wiIEBjbGljaz1cImxpbmtFZGl0XCI+57yW6L6RPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvbiBAY2xpY2s9XCJsaW5rRGVsZXRlXCI+5Yig6ZmkPC9idXR0b24+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+YFxyXG4gICAgICBsZXQgdHJFbG0gPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpLmNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudCh0cilcclxuICAgICAgdGFibGVDb250ZW50LmFwcGVuZENoaWxkKHRyRWxtKVxyXG4gICAgfVxyXG4gICAgbGV0IGl0ZW0gPSB0YWJsZUNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndHInKVxyXG4gICAgbGV0IGZ1biA9IHtcclxuICAgICAgbGlua0VkaXQ6IGFzeW5jIGluZGV4ID0+IHtcclxuICAgICAgICB0aGlzLmF0dHJpYnV0ZUxpbmsgPSBhd2FpdCB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudFxyXG4gICAgICAgIGxldCB0YWJsZSA9IHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50XHJcbiAgICAgICAgICAuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnYXR0cmlidXRlLWNvbnRlbnQtbGluaycpWzFdXHJcbiAgICAgICAgICAuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndGFibGUnKVswXVxyXG4gICAgICAgIGxldCB0YWJsZUNvbnRlbnQgPSB0YWJsZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0YWJsZS1ib2R5JylbMF1cclxuICAgICAgICBsZXQgaXRlbSA9IHRhYmxlQ29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0cicpXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpdGVtLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBpZiAoaW5kZXggPT09IGkpIHtcclxuICAgICAgICAgICAgbGV0IGhlaWdodCA9IGl0ZW1baV0ub2Zmc2V0SGVpZ2h0XHJcbiAgICAgICAgICAgIGxldCBodG1sID0gYFxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZFwiPlxyXG4gICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiaW5wdXRcIiB0eXBlPVwidGV4dFwiPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZFwiPlxyXG4gICAgICAgICAgICAgICAgPHRleHRhcmVhIGNsYXNzPVwiaW5wdXQgbGluay1lZGl0XCIgdHlwZT1cInRleHRcIj48L3RleHRhcmVhPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZCBjZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBzdHlsZT1cIm1hcmdpbi1yaWdodDogNXB4O1wiIEBjbGljaz1cImNvbmZpcm1FZGl0XCI+56Gu6K6kPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgIDxidXR0b24gQGNsaWNrPVwiY2FuY2VsRWRpdFwiPuWPlua2iDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDwvZGl2PmBcclxuICAgICAgICAgICAgaXRlbVtpXS5pbm5lckhUTUwgPSBodG1sXHJcbiAgICAgICAgICAgIGxldCB0ZXh0YXJlYUVsbSA9IGl0ZW1baV0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbGluay1lZGl0JylbMF1cclxuICAgICAgICAgICAgdGV4dGFyZWFFbG0uc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0IC0gMTAgKyAncHgnXHJcbiAgICAgICAgICAgIGxldCB0ZCA9IGl0ZW1baV0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndGQnKVxyXG4gICAgICAgICAgICB0ZFswXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFxyXG4gICAgICAgICAgICAgICdpbnB1dCdcclxuICAgICAgICAgICAgKVswXS52YWx1ZSA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50W2luZGV4XS5uYW1lXHJcbiAgICAgICAgICAgIHRkWzFdLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXHJcbiAgICAgICAgICAgICAgJ2lucHV0J1xyXG4gICAgICAgICAgICApWzBdLnZhbHVlID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnRbaW5kZXhdLnVybFxyXG4gICAgICAgICAgICBsZXQgYnRuID0gaXRlbVtpXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnYnV0dG9uJylcclxuICAgICAgICAgICAgZm9yIChsZXQgbiA9IDA7IG4gPCBidG4ubGVuZ3RoOyBuKyspIHtcclxuICAgICAgICAgICAgICBpZiAoIWJ0bltuXSB8fCAhYnRuW25dLmF0dHJpYnV0ZXMpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGZvciAobGV0IG0gb2YgYnRuW25dLmF0dHJpYnV0ZXMpIHtcclxuICAgICAgICAgICAgICAgIGlmIChtLm5hbWUgPT09ICdAY2xpY2snKSB7XHJcbiAgICAgICAgICAgICAgICAgIGJ0bltuXS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGUgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZnVuW20udmFsdWVdID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBmdW5bbS52YWx1ZV0oXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiB0ZFswXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdpbnB1dCcpWzBdLnZhbHVlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogdGRbMV0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaW5wdXQnKVswXS52YWx1ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpXHJcbiAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICBidG5bbl0uYXR0cmlidXRlcy5yZW1vdmVOYW1lZEl0ZW0obS5uYW1lKVxyXG4gICAgICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgbGlua0RlbGV0ZTogaSA9PiB7XHJcbiAgICAgICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnQuc3BsaWNlKGksIDEpXHJcbiAgICAgICAgdGhpcy5hdHRyaWJ1dGVMaW5rID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnRcclxuICAgICAgfSxcclxuXHJcbiAgICAgIGNvbmZpcm1FZGl0OiAodmFsdWUsIGkpID0+IHtcclxuICAgICAgICBsZXQgbmFtZSA9IHZhbHVlLm5hbWUgJiYgdmFsdWUubmFtZS5yZXBsYWNlKC9cXHMvZywgJycpXHJcbiAgICAgICAgbGV0IHVybCA9IHZhbHVlLnVybCAmJiB2YWx1ZS51cmwucmVwbGFjZSgvXFxzL2csICcnKVxyXG4gICAgICAgIGlmIChuYW1lICYmIHVybCkge1xyXG4gICAgICAgICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnRbaV0gPSB2YWx1ZVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB3aW5kb3cuRUxFTUVOVCAmJlxyXG4gICAgICAgICAgICB3aW5kb3cuRUxFTUVOVC5NZXNzYWdlKHtcclxuICAgICAgICAgICAgICBtZXNzYWdlOiAn5ZCN56ew5oiW6ZO+5o6l5LiN6IO95Li656m677yBJyxcclxuICAgICAgICAgICAgICB0eXBlOiAnd2FybmluZycsXHJcbiAgICAgICAgICAgICAgZHVyYXRpb246IDE1MDBcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5hdHRyaWJ1dGVMaW5rID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnRcclxuICAgICAgfSxcclxuICAgICAgY2FuY2VsRWRpdDogKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuYXR0cmlidXRlTGluayA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50XHJcbiAgICAgIH0sXHJcbiAgICAgIGZpbGVTZWxlY3Q6ICh2YWx1ZSwgaSkgPT4ge1xyXG4gICAgICAgIGxldCBmaWxlRWxtID0gaXRlbVtpXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdmaWxlLXNlbGVjdCcpWzBdXHJcbiAgICAgICAgZmlsZUVsbS5jbGljaygpXHJcbiAgICAgICAgZmlsZUVsbS5yZW1vdmVFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBmaWxlU2VsZWN0KVxyXG4gICAgICAgIGZpbGVFbG0uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgZmlsZVNlbGVjdClcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgbGV0IGZpbGVTZWxlY3QgPSBldmVudCA9PiB7XHJcbiAgICAgIGlmIChldmVudC50YXJnZXQudmFsdWUpIHtcclxuICAgICAgICBsZXQgdGQgPSBpdGVtW1xyXG4gICAgICAgICAgZXZlbnQudGFyZ2V0LmdldEF0dHJpYnV0ZSgnaW5kZXgnKVxyXG4gICAgICAgIF0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndGQnKVxyXG4gICAgICAgIHRkWzFdLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2lucHV0JylbMF0udmFsdWUgPSBldmVudC50YXJnZXQudmFsdWVcclxuICAgICAgICBldmVudC50YXJnZXQudmFsdWUgPSBudWxsXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbS5sZW5ndGg7IGkrKykge1xyXG4gICAgICBsZXQgYnRuID0gaXRlbVtpXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnYnV0dG9uJylcclxuICAgICAgZm9yIChsZXQgbiA9IDA7IG4gPCBidG4ubGVuZ3RoOyBuKyspIHtcclxuICAgICAgICBpZiAoIWJ0bltuXSB8fCAhYnRuW25dLmF0dHJpYnV0ZXMpIHtcclxuICAgICAgICAgIGNvbnRpbnVlXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvciAobGV0IG0gb2YgYnRuW25dLmF0dHJpYnV0ZXMpIHtcclxuICAgICAgICAgIGlmIChtLm5hbWUgPT09ICdAY2xpY2snKSB7XHJcbiAgICAgICAgICAgIGJ0bltuXS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGUgPT4ge1xyXG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgZnVuW20udmFsdWVdID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgICAgICBmdW5bbS52YWx1ZV0oaSlcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIGJ0bltuXS5hdHRyaWJ1dGVzLnJlbW92ZU5hbWVkSXRlbShtLm5hbWUpXHJcbiAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgYXR0cmlidXRlQ2FtZXJhKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUuY2FtZXJhLmNvbnRlbnRcclxuICB9XHJcblxyXG4gIHNldCBhdHRyaWJ1dGVDYW1lcmEodikge1xyXG4gICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5jYW1lcmEuY29udGVudCA9IHZcclxuICB9XHJcblxyXG4gIGdldCBhdHRyaWJ1dGVWcigpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnRcclxuICB9XHJcblxyXG4gIHNldCBhdHRyaWJ1dGVWcih2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnQgPSB2XHJcbiAgICBpZiAoXHJcbiAgICAgICF0aGlzLl9EaWFsb2dPYmplY3QgfHxcclxuICAgICAgIXRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudCB8fFxyXG4gICAgICAhdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQgfHxcclxuICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcclxuICAgICAgICAnYXR0cmlidXRlLWNvbnRlbnQtdnInXHJcbiAgICAgICkubGVuZ3RoID09IDBcclxuICAgICkge1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuICAgIGxldCB0YWJsZSA9IHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50XHJcbiAgICAgIC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdhdHRyaWJ1dGUtY29udGVudC12cicpWzFdXHJcbiAgICAgIC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0YWJsZScpWzBdXHJcbiAgICBsZXQgdGFibGVDb250ZW50ID0gdGFibGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndGFibGUtYm9keScpWzBdXHJcbiAgICB0YWJsZUNvbnRlbnQuaW5uZXJIVE1MID0gJydcclxuICAgIGlmICh0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnQubGVuZ3RoID4gMCkge1xyXG4gICAgICB0YWJsZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0YWJsZS1lbXB0eScpWzBdLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSdcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRhYmxlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RhYmxlLWVtcHR5JylbMF0uc3R5bGUuZGlzcGxheSA9ICdmbGV4J1xyXG4gICAgfVxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnQubGVuZ3RoOyBpKyspIHtcclxuICAgICAgbGV0IHRyID1cclxuICAgICAgICBgXHJcbiAgICAgIDxkaXYgY2xhc3M9XCJ0clwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRkXCI+YCArXHJcbiAgICAgICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52ci5jb250ZW50W2ldLm5hbWUgK1xyXG4gICAgICAgIGA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZFwiPmAgK1xyXG4gICAgICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudFtpXS51cmwgK1xyXG4gICAgICAgIGA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZFwiPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gQGNsaWNrPVwidnJFZGl0XCI+57yW6L6RPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvbiBAY2xpY2s9XCJ2ckRlbGV0ZVwiPuWIoOmZpDwvYnV0dG9uPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PmBcclxuICAgICAgbGV0IHRyRWxtID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKS5jcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQodHIpXHJcbiAgICAgIHRhYmxlQ29udGVudC5hcHBlbmRDaGlsZCh0ckVsbSlcclxuICAgIH1cclxuICAgIGxldCBpdGVtID0gdGFibGVDb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RyJylcclxuICAgIGxldCBmdW4gPSB7XHJcbiAgICAgIHZyRWRpdDogYXN5bmMgaW5kZXggPT4ge1xyXG4gICAgICAgIHRoaXMuYXR0cmlidXRlVnIgPSBhd2FpdCB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnRcclxuICAgICAgICBsZXQgdGFibGUgPSB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudFxyXG4gICAgICAgICAgLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2F0dHJpYnV0ZS1jb250ZW50LXZyJylbMV1cclxuICAgICAgICAgIC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0YWJsZScpWzBdXHJcbiAgICAgICAgbGV0IHRhYmxlQ29udGVudCA9IHRhYmxlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RhYmxlLWJvZHknKVswXVxyXG4gICAgICAgIGxldCBpdGVtID0gdGFibGVDb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RyJylcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW0ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGlmIChpbmRleCA9PT0gaSkge1xyXG4gICAgICAgICAgICBsZXQgaGVpZ2h0ID0gaXRlbVtpXS5vZmZzZXRIZWlnaHRcclxuICAgICAgICAgICAgbGV0IGh0bWwgPSBgXHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRkXCI+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJpbnB1dFwiIHR5cGU9XCJ0ZXh0XCI+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRkXCI+XHJcbiAgICAgICAgICAgICAgICA8dGV4dGFyZWEgY2xhc3M9XCJpbnB1dCBsaW5rLWVkaXRcIiB0eXBlPVwidGV4dFwiPjwvdGV4dGFyZWE+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRkXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxidXR0b24gQGNsaWNrPVwiY29uZmlybUVkaXRcIj7noa7orqQ8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBAY2xpY2s9XCJjYW5jZWxFZGl0XCI+5Y+W5raIPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgPC9kaXY+YFxyXG4gICAgICAgICAgICBpdGVtW2ldLmlubmVySFRNTCA9IGh0bWxcclxuICAgICAgICAgICAgbGV0IHRleHRhcmVhRWxtID0gaXRlbVtpXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdsaW5rLWVkaXQnKVswXVxyXG4gICAgICAgICAgICB0ZXh0YXJlYUVsbS5zdHlsZS5oZWlnaHQgPSBoZWlnaHQgLSAxMCArICdweCdcclxuICAgICAgICAgICAgbGV0IHRkID0gaXRlbVtpXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0ZCcpXHJcbiAgICAgICAgICAgIHRkWzBdLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXHJcbiAgICAgICAgICAgICAgJ2lucHV0J1xyXG4gICAgICAgICAgICApWzBdLnZhbHVlID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52ci5jb250ZW50W2luZGV4XS5uYW1lXHJcbiAgICAgICAgICAgIHRkWzFdLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXHJcbiAgICAgICAgICAgICAgJ2lucHV0J1xyXG4gICAgICAgICAgICApWzBdLnZhbHVlID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52ci5jb250ZW50W2luZGV4XS51cmxcclxuICAgICAgICAgICAgbGV0IGJ0biA9IGl0ZW1baV0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2J1dHRvbicpXHJcbiAgICAgICAgICAgIGZvciAobGV0IG4gPSAwOyBuIDwgYnRuLmxlbmd0aDsgbisrKSB7XHJcbiAgICAgICAgICAgICAgaWYgKCFidG5bbl0gfHwgIWJ0bltuXS5hdHRyaWJ1dGVzKSB7XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBmb3IgKGxldCBtIG9mIGJ0bltuXS5hdHRyaWJ1dGVzKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAobS5uYW1lID09PSAnQGNsaWNrJykge1xyXG4gICAgICAgICAgICAgICAgICBidG5bbl0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBlID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGZ1blttLnZhbHVlXSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgZnVuW20udmFsdWVdKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogdGRbMF0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaW5wdXQnKVswXS52YWx1ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6IHRkWzFdLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2lucHV0JylbMF0udmFsdWVcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgaVxyXG4gICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgYnRuW25dLmF0dHJpYnV0ZXMucmVtb3ZlTmFtZWRJdGVtKG0ubmFtZSlcclxuICAgICAgICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIHZyRGVsZXRlOiBpID0+IHtcclxuICAgICAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnQuc3BsaWNlKGksIDEpXHJcbiAgICAgICAgdGhpcy5hdHRyaWJ1dGVWciA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudFxyXG4gICAgICB9LFxyXG5cclxuICAgICAgY29uZmlybUVkaXQ6ICh2YWx1ZSwgaSkgPT4ge1xyXG4gICAgICAgIGxldCBuYW1lID0gdmFsdWUubmFtZSAmJiB2YWx1ZS5uYW1lLnJlcGxhY2UoL1xccy9nLCAnJylcclxuICAgICAgICBsZXQgdXJsID0gdmFsdWUudXJsICYmIHZhbHVlLnVybC5yZXBsYWNlKC9cXHMvZywgJycpXHJcbiAgICAgICAgaWYgKG5hbWUgJiYgdXJsKSB7XHJcbiAgICAgICAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnRbaV0gPSB2YWx1ZVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB3aW5kb3cuRUxFTUVOVCAmJlxyXG4gICAgICAgICAgICB3aW5kb3cuRUxFTUVOVC5NZXNzYWdlKHtcclxuICAgICAgICAgICAgICBtZXNzYWdlOiAn5ZCN56ew5oiW6ZO+5o6l5LiN6IO95Li656m677yBJyxcclxuICAgICAgICAgICAgICB0eXBlOiAnd2FybmluZycsXHJcbiAgICAgICAgICAgICAgZHVyYXRpb246IDE1MDBcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5hdHRyaWJ1dGVWciA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudFxyXG4gICAgICB9LFxyXG4gICAgICBjYW5jZWxFZGl0OiAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5hdHRyaWJ1dGVWciA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudFxyXG4gICAgICB9LFxyXG4gICAgICBmaWxlU2VsZWN0OiAodmFsdWUsIGkpID0+IHtcclxuICAgICAgICBsZXQgZmlsZUVsbSA9IGl0ZW1baV0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnZmlsZS1zZWxlY3QnKVswXVxyXG4gICAgICAgIGZpbGVFbG0uY2xpY2soKVxyXG4gICAgICAgIGZpbGVFbG0ucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgZmlsZVNlbGVjdClcclxuICAgICAgICBmaWxlRWxtLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGZpbGVTZWxlY3QpXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGxldCBmaWxlU2VsZWN0ID0gZXZlbnQgPT4ge1xyXG4gICAgICBpZiAoZXZlbnQudGFyZ2V0LnZhbHVlKSB7XHJcbiAgICAgICAgbGV0IHRkID0gaXRlbVtcclxuICAgICAgICAgIGV2ZW50LnRhcmdldC5nZXRBdHRyaWJ1dGUoJ2luZGV4JylcclxuICAgICAgICBdLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RkJylcclxuICAgICAgICB0ZFsxXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdpbnB1dCcpWzBdLnZhbHVlID0gZXZlbnQudGFyZ2V0LnZhbHVlXHJcbiAgICAgICAgZXZlbnQudGFyZ2V0LnZhbHVlID0gbnVsbFxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW0ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgbGV0IGJ0biA9IGl0ZW1baV0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2J1dHRvbicpXHJcbiAgICAgIGZvciAobGV0IG4gPSAwOyBuIDwgYnRuLmxlbmd0aDsgbisrKSB7XHJcbiAgICAgICAgaWYgKCFidG5bbl0gfHwgIWJ0bltuXS5hdHRyaWJ1dGVzKSB7XHJcbiAgICAgICAgICBjb250aW51ZVxyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKGxldCBtIG9mIGJ0bltuXS5hdHRyaWJ1dGVzKSB7XHJcbiAgICAgICAgICBpZiAobS5uYW1lID09PSAnQGNsaWNrJykge1xyXG4gICAgICAgICAgICBidG5bbl0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBlID0+IHtcclxuICAgICAgICAgICAgICBpZiAodHlwZW9mIGZ1blttLnZhbHVlXSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgZnVuW20udmFsdWVdKGkpXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICBidG5bbl0uYXR0cmlidXRlcy5yZW1vdmVOYW1lZEl0ZW0obS5uYW1lKVxyXG4gICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IGF0dHJpYnV0ZUdvb2RzKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUuZ29vZHMuY29udGVudFxyXG4gIH1cclxuXHJcbiAgc2V0IGF0dHJpYnV0ZUdvb2RzKHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUuZ29vZHMuY29udGVudCA9IHZcclxuICB9XHJcblxyXG4gIHN0YXRpYyBjcmVhdGUodGhhdCkge1xyXG4gICAgbGV0IGdyb3VuZFxyXG4gICAgaWYgKHRoYXQuaGVpZ2h0TW9kZSA9PSAyKSB7XHJcbiAgICAgIGdyb3VuZCA9IHRydWVcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGdyb3VuZCA9IGZhbHNlXHJcbiAgICB9XHJcbiAgICB0aGF0LnJlbmV3UG9zaXRpb25zKClcclxuXHJcbiAgICBsZXQgbWF0ZXJpYWwgPSBDZXNpdW0uQ29sb3IuZnJvbUNzc0NvbG9yU3RyaW5nKHRoYXQub3B0aW9ucy5jb2xvcilcclxuICAgIGlmICh0aGF0LnNkay52aWV3ZXIuc2NlbmUubW9kZSA9PT0gMikge1xyXG4gICAgICB0aGF0Lm9wdGlvbnMuaGVpZ2h0TW9kZSA9IDBcclxuICAgICAgZ3JvdW5kID0gZmFsc2VcclxuICAgICAgbWF0ZXJpYWwgPSBuZXcgQ2VzaXVtLkN1c3RvbUNvbG9yTWF0ZXJpYWxTb3VyY2Uoe1xyXG4gICAgICAgIGNvbG9yOiB0aGF0Lm9wdGlvbnMuY29sb3JcclxuICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgICB0aGF0LmVudGl0eSA9IHRoYXQuc2RrLnZpZXdlci5lbnRpdGllcy5hZGQoe1xyXG4gICAgICBzaG93OiB0aGF0Lm9wdGlvbnMuc2hvdyxcclxuICAgICAgaWQ6IHRoYXQub3B0aW9ucy5pZCxcclxuICAgICAgcG9seWdvbjoge1xyXG4gICAgICAgIGhpZXJhcmNoeTogbmV3IENlc2l1bS5Qb2x5Z29uSGllcmFyY2h5KHRoYXQucG9zaXRpb25zKSxcclxuICAgICAgICBwZXJQb3NpdGlvbkhlaWdodDogIWdyb3VuZCA/IHRydWUgOiBmYWxzZSxcclxuICAgICAgICBtYXRlcmlhbDogbWF0ZXJpYWwsXHJcbiAgICAgICAgekluZGV4OiB0aGF0LnNkay5fZW50aXR5WkluZGV4XHJcbiAgICAgIH0sXHJcbiAgICAgIHBvbHlsaW5lOiB7XHJcbiAgICAgICAgcG9zaXRpb25zOiBbLi4udGhhdC5wb3NpdGlvbnMsIHRoYXQucG9zaXRpb25zWzBdLCB0aGF0LnBvc2l0aW9uc1sxXV0sXHJcbiAgICAgICAgd2lkdGg6IHRoYXQub3B0aW9ucy5saW5lLndpZHRoLFxyXG4gICAgICAgIGFyY1R5cGU6IENlc2l1bS5BcmNUeXBlLk5PTkUsXHJcbiAgICAgICAgbWF0ZXJpYWw6IENlc2l1bS5Db2xvci5mcm9tQ3NzQ29sb3JTdHJpbmcodGhhdC5vcHRpb25zLmxpbmUuY29sb3IpLFxyXG4gICAgICAgIGNsYW1wVG9Hcm91bmQ6ICFncm91bmQgPyBmYWxzZSA6IHRydWUsXHJcbiAgICAgICAgYXJjVHlwZTogIWdyb3VuZCA/IENlc2l1bS5BcmNUeXBlLk5PTkUgOiBDZXNpdW0uQXJjVHlwZS5HRU9ERVNJQyxcclxuICAgICAgICB6SW5kZXg6IHRoYXQuc2RrLl9lbnRpdHlaSW5kZXhcclxuICAgICAgfVxyXG4gICAgfSlcclxuICAgIHRoYXQuc2RrLl9lbnRpdHlaSW5kZXgrK1xyXG4gICAgUG9seWdvbk9iamVjdC5jcmVhdGVMYWJlbCh0aGF0KVxyXG5cclxuICAgIHN5bmNEYXRhKHRoYXQuc2RrLCB0aGF0Lm9wdGlvbnMuaWQpXHJcbiAgICBpZiAodGhhdC5vcHRpb25zLnNob3cpIHtcclxuICAgICAgc2V0U3BsaXREaXJlY3Rpb24oMCwgdGhhdC5vcHRpb25zLmlkKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc3RhdGljIGFzeW5jIGNyZWF0ZUxhYmVsKHRoYXQpIHtcclxuICAgIGxldCBwb3NpdGlvbnMgPSBbW11dXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoYXQub3B0aW9ucy5wb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgcG9zaXRpb25zWzBdLnB1c2goW1xyXG4gICAgICAgIHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbaV0ubG5nLFxyXG4gICAgICAgIHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbaV0ubGF0XHJcbiAgICAgIF0pXHJcbiAgICB9XHJcbiAgICBwb3NpdGlvbnNbMF0ucHVzaChbXHJcbiAgICAgIHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbMF0ubG5nLFxyXG4gICAgICB0aGF0Lm9wdGlvbnMucG9zaXRpb25zWzBdLmxhdFxyXG4gICAgXSlcclxuICAgIGxldCBwb2x5Z29uID0gdHVyZi5wb2x5Z29uKHBvc2l0aW9ucylcclxuICAgIC8vIGxldCBjZW50cm9pZCA9IHR1cmYuY2VudHJvaWQocG9seWdvbik7XHJcbiAgICBsZXQgY2VudHJvaWQgPSB0dXJmLnBvaW50T25GZWF0dXJlKHBvbHlnb24pXHJcblxyXG4gICAgbGV0IGhlaWdodCA9IDBcclxuICAgIGxldCBncm91bmRcclxuICAgIHN3aXRjaCAodGhhdC5oZWlnaHRNb2RlKSB7XHJcbiAgICAgIGNhc2UgMDpcclxuICAgICAgY2FzZSAnMCc6XHJcbiAgICAgICAgZ3JvdW5kID0gZmFsc2VcclxuICAgICAgICBicmVha1xyXG4gICAgICBjYXNlIDE6XHJcbiAgICAgIGNhc2UgJzEnOlxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBoZWlnaHQgPSB0aGF0LnNkay52aWV3ZXIuc2NlbmUuZ2xvYmUuZ2V0SGVpZ2h0KENlc2l1bS5DYXJ0b2dyYXBoaWMuZnJvbURlZ3JlZXMocG9zaXRpb25zW2ldLmxuZywgcG9zaXRpb25zW2ldLmxhdCkpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGdyb3VuZCA9IGZhbHNlXHJcbiAgICAgICAgYnJlYWtcclxuICAgICAgY2FzZSAyOlxyXG4gICAgICBjYXNlICcyJzpcclxuICAgICAgICBncm91bmQgPSB0cnVlXHJcbiAgICAgICAgYnJlYWtcclxuICAgIH1cclxuICAgIGlmICghZ3JvdW5kKSB7XHJcbiAgICAgIGhlaWdodCA9IHRoYXQub3B0aW9ucy5oZWlnaHQgKyBoZWlnaHRcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGxldCBvYmplY3RzVG9FeGNsdWRlID0gWy4uLnRoYXQuc2RrLnZpZXdlci5lbnRpdGllcy52YWx1ZXNdXHJcbiAgICAgIGhlaWdodCA9IGF3YWl0IHRoYXQuZ2V0Q2xhbXBUb0hlaWdodCh7XHJcbiAgICAgICAgbG5nOiBjZW50cm9pZC5nZW9tZXRyeS5jb29yZGluYXRlc1swXSxcclxuICAgICAgICBsYXQ6IGNlbnRyb2lkLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzFdXHJcbiAgICAgIH0sIG9iamVjdHNUb0V4Y2x1ZGUpXHJcbiAgICB9XHJcbiAgICBpZiAoIXRoYXQub3B0aW9ucy5sYWJlbC5wb3NpdGlvbikge1xyXG4gICAgICB0aGF0Lm9wdGlvbnMubGFiZWwucG9zaXRpb24gPSB7XHJcbiAgICAgICAgbG5nOiBjZW50cm9pZC5nZW9tZXRyeS5jb29yZGluYXRlc1swXSxcclxuICAgICAgICBsYXQ6IGNlbnRyb2lkLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzFdLFxyXG4gICAgICAgIGFsdDogaGVpZ2h0XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIOagh+etvlxyXG4gICAgdGhhdC5sYWJlbCA9IG5ldyBMYWJlbE9iamVjdCh0aGF0LnNkaywge1xyXG4gICAgICBpZDogdGhhdC5vcHRpb25zLmlkLFxyXG4gICAgICBzaG93OiB0aGF0Lm9wdGlvbnMuc2hvdyA/IHRoYXQub3B0aW9ucy5sYWJlbC5zaG93IDogZmFsc2UsXHJcbiAgICAgIHBvc2l0aW9uOiBbXHJcbiAgICAgICAgdGhhdC5vcHRpb25zLmxhYmVsLnBvc2l0aW9uLmxuZyxcclxuICAgICAgICB0aGF0Lm9wdGlvbnMubGFiZWwucG9zaXRpb24ubGF0LFxyXG4gICAgICAgIHRoYXQub3B0aW9ucy5sYWJlbC5wb3NpdGlvbi5hbHRcclxuICAgICAgXSxcclxuICAgICAgdGV4dDogdGhhdC5vcHRpb25zLm5hbWUsXHJcbiAgICAgIGZvbnRTaXplOiB0aGF0Lm9wdGlvbnMubGFiZWwuZm9udFNpemUsXHJcbiAgICAgIGZvbnRGYW1pbHk6IHRoYXQub3B0aW9ucy5sYWJlbC5mb250RmFtaWx5LFxyXG4gICAgICBjb2xvcjogdGhhdC5vcHRpb25zLmxhYmVsLmNvbG9yLFxyXG4gICAgICBwaXhlbE9mZnNldDogdGhhdC5vcHRpb25zLmxhYmVsLnBpeGVsT2Zmc2V0LFxyXG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRoYXQub3B0aW9ucy5sYWJlbC5iYWNrZ3JvdW5kQ29sb3IsXHJcbiAgICAgIGxpbmVDb2xvcjogdGhhdC5vcHRpb25zLmxhYmVsLmxpbmVDb2xvcixcclxuICAgICAgbGluZVdpZHRoOiB0aGF0Lm9wdGlvbnMubGFiZWwubGluZVdpZHRoLFxyXG4gICAgICBzY2FsZUJ5RGlzdGFuY2U6IHRoYXQub3B0aW9ucy5sYWJlbC5zY2FsZUJ5RGlzdGFuY2UsXHJcbiAgICAgIG5lYXI6IHRoYXQub3B0aW9ucy5sYWJlbC5uZWFyLFxyXG4gICAgICBmYXI6IHRoYXQub3B0aW9ucy5sYWJlbC5mYXIsXHJcbiAgICAgIGdyb3VuZDogZ3JvdW5kXHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgLy8g57yW6L6R5qGGXHJcbiAgYXN5bmMgZWRpdChzdGF0ZSkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpc1xyXG4gICAgdGhpcy5vcmlnaW5hbE9wdGlvbnMgPSB0aGlzLmRlZXBDb3B5T2JqKHRoaXMub3B0aW9ucylcclxuXHJcbiAgICBpZiAodGhpcy5fRGlhbG9nT2JqZWN0ICYmIHRoaXMuX0RpYWxvZ09iamVjdC5jbG9zZSkge1xyXG4gICAgICB0aGlzLl9EaWFsb2dPYmplY3QuY2xvc2UoKVxyXG4gICAgICB0aGlzLl9EaWFsb2dPYmplY3QgPSBudWxsXHJcbiAgICB9XHJcbiAgICBpZiAoc3RhdGUpIHtcclxuXHJcbiAgICAgIGZ1bmN0aW9uIGNyZWF0ZVNwYXRpYWxJbmZvVGFibGVDb250ZW50KCkge1xyXG4gICAgICAgIGxldCB0YWJsZUVsbSA9IGNvbnRlbnRFbG0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnc3BhdGlhbC1pbmZvLXRhYmxlJylbMF1cclxuICAgICAgICBsZXQgdEJvZHlFbG0gPSB0YWJsZUVsbS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0YWJsZS1ib2R5JylbMF1cclxuICAgICAgICB0Qm9keUVsbS5pbm5lckhUTUwgPSAnJ1xyXG4gICAgICAgIF90aGlzLl9lbG1zLmxuZyA9IFtdXHJcbiAgICAgICAgX3RoaXMuX2VsbXMubG5nSW5wdXQgPSBbXVxyXG4gICAgICAgIF90aGlzLl9lbG1zLmxhdCA9IFtdXHJcbiAgICAgICAgX3RoaXMuX2VsbXMubGF0SW5wdXQgPSBbXVxyXG4gICAgICAgIF90aGlzLl9lbG1zLmFsdCA9IFtdXHJcbiAgICAgICAgX3RoaXMuX2VsbXMuYWx0SW5wdXQgPSBbXVxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgX3RoaXMub3B0aW9ucy5wb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGxldCB0ciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpXHJcbiAgICAgICAgICB0ci5jbGFzc05hbWUgPSAndHInXHJcbiAgICAgICAgICB0ci5pbm5lckhUTUwgPSBgXHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidGRcIj4ke2kgKyAxfTwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRkIGxuZyBhbGlnbi1jZW50ZXJcIj48L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZCBsYXQgYWxpZ24tY2VudGVyXCI+PC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidGQgYWx0IGFsaWduLWNlbnRlclwiPjwvZGl2PlxyXG4gICAgICAgIGBcclxuICAgICAgICAgIGxldCBsbmdCb3ggPSB0ci5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdsbmcnKVswXVxyXG4gICAgICAgICAgbGV0IGxuZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKVxyXG4gICAgICAgICAgbG5nLmlubmVySFRNTCA9IChfdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sbmcpLnRvRml4ZWQoOClcclxuICAgICAgICAgIGxuZ0JveC5hcHBlbmRDaGlsZChsbmcpXHJcbiAgICAgICAgICBsZXQgbG5nSW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpXHJcbiAgICAgICAgICBsbmdJbnB1dC5jbGFzc05hbWUgPSAnaW5wdXQnXHJcbiAgICAgICAgICBsbmdJbnB1dC50eXBlID0gJ251bWJlcidcclxuICAgICAgICAgIGxuZ0lucHV0LnRpdGxlID0gJydcclxuICAgICAgICAgIGxuZ0lucHV0Lm1pbiA9IC0xODBcclxuICAgICAgICAgIGxuZ0lucHV0Lm1heCA9IDE4MFxyXG4gICAgICAgICAgbG5nSW5wdXQudmFsdWUgPSAoX3RoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubG5nKS50b0ZpeGVkKDgpXHJcblxyXG4gICAgICAgICAgbGV0IGxhdEJveCA9IHRyLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xhdCcpWzBdXHJcbiAgICAgICAgICBsZXQgbGF0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpXHJcbiAgICAgICAgICBsYXQuaW5uZXJIVE1MID0gKF90aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxhdCkudG9GaXhlZCg4KVxyXG4gICAgICAgICAgbGF0Qm94LmFwcGVuZENoaWxkKGxhdClcclxuICAgICAgICAgIGxldCBsYXRJbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0JylcclxuICAgICAgICAgIGxhdElucHV0LmNsYXNzTmFtZSA9ICdpbnB1dCdcclxuICAgICAgICAgIGxhdElucHV0LnR5cGUgPSAnbnVtYmVyJ1xyXG4gICAgICAgICAgbGF0SW5wdXQudGl0bGUgPSAnJ1xyXG4gICAgICAgICAgbGF0SW5wdXQubWluID0gLTkwXHJcbiAgICAgICAgICBsYXRJbnB1dC5tYXggPSA5MFxyXG4gICAgICAgICAgbGF0SW5wdXQudmFsdWUgPSAoX3RoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubGF0KS50b0ZpeGVkKDgpXHJcblxyXG4gICAgICAgICAgbGV0IGFsdEJveCA9IHRyLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2FsdCcpWzBdXHJcbiAgICAgICAgICBsZXQgYWx0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpXHJcbiAgICAgICAgICBhbHQuaW5uZXJIVE1MID0gKF90aGlzLmhlaWdodCkudG9GaXhlZCgyKVxyXG4gICAgICAgICAgYWx0Qm94LmFwcGVuZENoaWxkKGFsdClcclxuICAgICAgICAgIGxldCBhbHRJbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0JylcclxuICAgICAgICAgIGFsdElucHV0LmNsYXNzTmFtZSA9ICdpbnB1dCdcclxuICAgICAgICAgIGFsdElucHV0LnR5cGUgPSAnbnVtYmVyJ1xyXG4gICAgICAgICAgYWx0SW5wdXQudGl0bGUgPSAnJ1xyXG4gICAgICAgICAgYWx0SW5wdXQubWluID0gLTk5OTk5OTlcclxuICAgICAgICAgIGFsdElucHV0Lm1heCA9IDk5OTk5OTk5OVxyXG4gICAgICAgICAgYWx0SW5wdXQudmFsdWUgPSAoX3RoaXMuaGVpZ2h0KS50b0ZpeGVkKDIpXHJcblxyXG4gICAgICAgICAgbG5nQm94LmFkZEV2ZW50TGlzdGVuZXIoJ2RibGNsaWNrJywgKCkgPT4ge1xyXG4gICAgICAgICAgICBsbmdCb3guaW5uZXJIVE1MID0gJydcclxuICAgICAgICAgICAgbG5nSW5wdXQudmFsdWUgPSBOdW1iZXIoKF90aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxuZykudG9GaXhlZCg4KSlcclxuICAgICAgICAgICAgbG5nQm94LmFwcGVuZENoaWxkKGxuZ0lucHV0KVxyXG4gICAgICAgICAgICBsbmdJbnB1dC5mb2N1cygpXHJcbiAgICAgICAgICAgIGlmIChfdGhpcy5vcGVyYXRlLnBvc2l0aW9uRWRpdGluZykge1xyXG4gICAgICAgICAgICAgIF90aGlzLnBvc2l0aW9uRWRpdGluZyA9IGZhbHNlXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgUG9seWdvbk9iamVjdC5jbG9zZU5vZGVFZGl0KF90aGlzKVxyXG4gICAgICAgICAgICBfdGhpcy5oZWlnaHRNb2RlID0gX3RoaXMuaGVpZ2h0TW9kZVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIGxuZ0lucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2JsdXInLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGxuZ0lucHV0LnZhbHVlID0gTnVtYmVyKChfdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sbmcpLnRvRml4ZWQoOCkpXHJcbiAgICAgICAgICAgIGxuZ0JveC5pbm5lckhUTUwgPSAnJ1xyXG4gICAgICAgICAgICBsbmdCb3guYXBwZW5kQ2hpbGQobG5nKVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIGxuZ0lucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKCkgPT4ge1xyXG4gICAgICAgICAgICBfdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sbmcgPSBOdW1iZXIoTnVtYmVyKGxuZ0lucHV0LnZhbHVlKS50b0ZpeGVkKDgpKVxyXG4gICAgICAgICAgICBsbmcuaW5uZXJIVE1MID0gX3RoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubG5nLnRvRml4ZWQoOClcclxuICAgICAgICAgICAgX3RoaXMuaGVpZ2h0ID0gX3RoaXMuaGVpZ2h0XHJcbiAgICAgICAgICB9KVxyXG5cclxuICAgICAgICAgIGxhdEJveC5hZGRFdmVudExpc3RlbmVyKCdkYmxjbGljaycsICgpID0+IHtcclxuICAgICAgICAgICAgbGF0Qm94LmlubmVySFRNTCA9ICcnXHJcbiAgICAgICAgICAgIGxhdElucHV0LnZhbHVlID0gTnVtYmVyKChfdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sYXQpLnRvRml4ZWQoOCkpXHJcbiAgICAgICAgICAgIGxhdEJveC5hcHBlbmRDaGlsZChsYXRJbnB1dClcclxuICAgICAgICAgICAgbGF0SW5wdXQuZm9jdXMoKVxyXG4gICAgICAgICAgICBpZiAoX3RoaXMub3BlcmF0ZS5wb3NpdGlvbkVkaXRpbmcpIHtcclxuICAgICAgICAgICAgICBfdGhpcy5wb3NpdGlvbkVkaXRpbmcgPSBmYWxzZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIFBvbHlnb25PYmplY3QuY2xvc2VOb2RlRWRpdChfdGhpcylcclxuICAgICAgICAgICAgX3RoaXMuaGVpZ2h0TW9kZSA9IF90aGlzLmhlaWdodE1vZGVcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICBsYXRJbnB1dC5hZGRFdmVudExpc3RlbmVyKCdibHVyJywgKCkgPT4ge1xyXG4gICAgICAgICAgICBsYXRJbnB1dC52YWx1ZSA9IE51bWJlcigoX3RoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubGF0KS50b0ZpeGVkKDgpKVxyXG4gICAgICAgICAgICBsYXRCb3guaW5uZXJIVE1MID0gJydcclxuICAgICAgICAgICAgbGF0Qm94LmFwcGVuZENoaWxkKGxhdClcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICBsYXRJbnB1dC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICgpID0+IHtcclxuICAgICAgICAgICAgX3RoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubGF0ID0gTnVtYmVyKE51bWJlcihsYXRJbnB1dC52YWx1ZSkudG9GaXhlZCg4KSlcclxuICAgICAgICAgICAgbGF0LmlubmVySFRNTCA9IF90aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxhdC50b0ZpeGVkKDgpXHJcbiAgICAgICAgICAgIF90aGlzLmhlaWdodCA9IF90aGlzLmhlaWdodFxyXG4gICAgICAgICAgfSlcclxuXHJcbiAgICAgICAgICBhbHRCb3guYWRkRXZlbnRMaXN0ZW5lcignZGJsY2xpY2snLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChfdGhpcy5oZWlnaHRNb2RlID09IDIpIHtcclxuICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYWx0Qm94LmlubmVySFRNTCA9ICcnXHJcbiAgICAgICAgICAgIGFsdElucHV0LnZhbHVlID0gTnVtYmVyKChfdGhpcy5oZWlnaHQpLnRvRml4ZWQoMikpXHJcbiAgICAgICAgICAgIGFsdEJveC5hcHBlbmRDaGlsZChhbHRJbnB1dClcclxuICAgICAgICAgICAgYWx0SW5wdXQuZm9jdXMoKVxyXG4gICAgICAgICAgICBpZiAoX3RoaXMub3BlcmF0ZS5wb3NpdGlvbkVkaXRpbmcpIHtcclxuICAgICAgICAgICAgICBfdGhpcy5wb3NpdGlvbkVkaXRpbmcgPSBmYWxzZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIFBvbHlnb25PYmplY3QuY2xvc2VOb2RlRWRpdChfdGhpcylcclxuICAgICAgICAgICAgX3RoaXMuaGVpZ2h0TW9kZSA9IF90aGlzLmhlaWdodE1vZGVcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICBhbHRJbnB1dC5hZGRFdmVudExpc3RlbmVyKCdibHVyJywgKCkgPT4ge1xyXG4gICAgICAgICAgICBhbHRJbnB1dC52YWx1ZSA9IE51bWJlcigoX3RoaXMuaGVpZ2h0KS50b0ZpeGVkKDIpKVxyXG4gICAgICAgICAgICBhbHRCb3guaW5uZXJIVE1MID0gJydcclxuICAgICAgICAgICAgYWx0Qm94LmFwcGVuZENoaWxkKGFsdClcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICBhbHRJbnB1dC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICgpID0+IHtcclxuICAgICAgICAgICAgX3RoaXMuaGVpZ2h0ID0gTnVtYmVyKE51bWJlcihhbHRJbnB1dC52YWx1ZSkudG9GaXhlZCgyKSlcclxuICAgICAgICAgICAgYWx0LmlubmVySFRNTCA9IE51bWJlcihfdGhpcy5oZWlnaHQudG9GaXhlZCgyKSlcclxuICAgICAgICAgIH0pXHJcblxyXG5cclxuICAgICAgICAgIF90aGlzLl9lbG1zLmxuZy5wdXNoKGxuZylcclxuICAgICAgICAgIF90aGlzLl9lbG1zLmxuZ0lucHV0LnB1c2gobG5nSW5wdXQpXHJcbiAgICAgICAgICBfdGhpcy5fZWxtcy5sYXQucHVzaChsYXQpXHJcbiAgICAgICAgICBfdGhpcy5fZWxtcy5sYXRJbnB1dC5wdXNoKGxhdElucHV0KVxyXG4gICAgICAgICAgX3RoaXMuX2VsbXMuYWx0LnB1c2goYWx0KVxyXG4gICAgICAgICAgX3RoaXMuX2VsbXMuYWx0SW5wdXQucHVzaChhbHRJbnB1dClcclxuICAgICAgICAgIHRCb2R5RWxtLmFwcGVuZENoaWxkKHRyKVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0ID0gYXdhaXQgbmV3IERpYWxvZyh0aGlzLnNkaywgdGhpcy5vcHRpb25zLCB7XHJcbiAgICAgICAgdGl0bGU6ICfpnaLlsZ7mgKcnLFxyXG4gICAgICAgIGxlZnQ6ICcxODBweCcsXHJcbiAgICAgICAgdG9wOiAnMTAwcHgnLFxyXG4gICAgICAgIGNvbmZpcm1DYWxsQmFjazogb3B0aW9ucyA9PiB7XHJcbiAgICAgICAgICB0aGlzLm5hbWUgPSB0aGlzLm5hbWUudHJpbSgpXHJcbiAgICAgICAgICBpZiAoIXRoaXMubmFtZSkge1xyXG4gICAgICAgICAgICB0aGlzLm5hbWUgPSAn5pyq5ZG95ZCN5a+56LGhJ1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5vcHRpb25zLmxhYmVsLnBvc2l0aW9uID0ge1xyXG4gICAgICAgICAgICBsbmc6IHRoaXMubGFiZWwucG9zaXRpb25bMF0sXHJcbiAgICAgICAgICAgIGxhdDogdGhpcy5sYWJlbC5wb3NpdGlvblsxXSxcclxuICAgICAgICAgICAgYWx0OiB0aGlzLmxhYmVsLnBvc2l0aW9uWzJdXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLm9yaWdpbmFsT3B0aW9ucyA9IHRoaXMuZGVlcENvcHlPYmoodGhpcy5vcHRpb25zKVxyXG4gICAgICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0LmNsb3NlKClcclxuICAgICAgICAgIHRoaXMuRGlhbG9nLmNvbmZpcm1DYWxsQmFjayAmJlxyXG4gICAgICAgICAgICB0aGlzLkRpYWxvZy5jb25maXJtQ2FsbEJhY2sodGhpcy5vcmlnaW5hbE9wdGlvbnMpXHJcbiAgICAgICAgICBzeW5jRGF0YSh0aGlzLnNkaywgdGhpcy5vcHRpb25zLmlkKVxyXG4gICAgICAgICAgc3luY1NwbGl0RGF0YSh0aGlzLnNkaywgdGhpcy5vcHRpb25zLmlkKVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgcmVzZXRDYWxsQmFjazogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5yZXNldCgpXHJcbiAgICAgICAgICB0aGlzLkRpYWxvZy5yZXNldENhbGxCYWNrICYmIHRoaXMuRGlhbG9nLnJlc2V0Q2FsbEJhY2soKVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgcmVtb3ZlQ2FsbEJhY2s6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMuRGlhbG9nLnJlbW92ZUNhbGxCYWNrICYmIHRoaXMuRGlhbG9nLnJlbW92ZUNhbGxCYWNrKClcclxuICAgICAgICB9LFxyXG4gICAgICAgIGNsb3NlQ2FsbEJhY2s6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMucHJldmlvdXMgPSBudWxsXHJcbiAgICAgICAgICB0aGlzLnJlc2V0KClcclxuICAgICAgICAgIHRoaXMucG9zaXRpb25FZGl0aW5nID0gZmFsc2VcclxuICAgICAgICAgIHRoaXMuRGlhbG9nLmNsb3NlQ2FsbEJhY2sgJiYgdGhpcy5EaWFsb2cuY2xvc2VDYWxsQmFjaygpXHJcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubm9kZVBvaW50cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB0aGlzLnNkay52aWV3ZXIuZW50aXRpZXMucmVtb3ZlKHRoaXMubm9kZVBvaW50c1tpXSlcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMubm9kZVBvaW50cyA9IFtdXHJcbiAgICAgICAgICBZSi5NZWFzdXJlLlNldE1lYXN1cmVTdGF0dXMoZmFsc2UpXHJcbiAgICAgICAgICB0aGlzLmV2ZW50ICYmIHRoaXMuZXZlbnQuZGVzdHJveSgpXHJcbiAgICAgICAgICB0aGlzLnRpcCAmJiB0aGlzLnRpcC5kZXN0cm95KClcclxuICAgICAgICB9LFxyXG4gICAgICAgIHNob3dDYWxsQmFjazogc2hvdyA9PiB7XHJcbiAgICAgICAgICB0aGlzLm9wdGlvbnMuc2hvdyA9IHNob3dcclxuICAgICAgICAgIHRoaXMub3JpZ2luYWxPcHRpb25zLnNob3cgPSBzaG93XHJcbiAgICAgICAgICB0aGlzLnNob3cgPSBzaG93XHJcbiAgICAgICAgICB0aGlzLkRpYWxvZy5zaG93Q2FsbEJhY2sgJiYgdGhpcy5EaWFsb2cuc2hvd0NhbGxCYWNrKClcclxuICAgICAgICB9LFxyXG4gICAgICAgIHRyYW5zbGF0aW9uYWxDYWxsQmFjazogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5wb3NpdGlvbkVkaXRpbmcgPSAhdGhpcy5wb3NpdGlvbkVkaXRpbmdcclxuICAgICAgICB9LFxyXG4gICAgICAgIC8vIOS6jOasoee8lui+keWbnuiwg1xyXG4gICAgICAgIHNlY29uZGFyeUVkaXRDYWxsQmFjazogKCkgPT4ge1xyXG4gICAgICAgICAgUG9seWdvbk9iamVjdC5ub2RlRWRpdCh0aGlzLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGNyZWF0ZVNwYXRpYWxJbmZvVGFibGVDb250ZW50KClcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgICB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuYm9keS5jbGFzc05hbWUgPVxyXG4gICAgICAgIHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5ib2R5LmNsYXNzTmFtZSArICcgcG9seWdvbidcclxuICAgICAgbGV0IGNvbnRlbnRFbG0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKVxyXG4gICAgICBjb250ZW50RWxtLmlubmVySFRNTCA9IGh0bWwodGhpcylcclxuICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0LmNvbnRlbnRBcHBDaGlsZChjb250ZW50RWxtKVxyXG4gICAgICB0aGlzLmF0dHJpYnV0ZVR5cGUgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlVHlwZVxyXG4gICAgICB0aGlzLmF0dHJpYnV0ZUNhbWVyYSA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUuY2FtZXJhLmNvbnRlbnRcclxuXHJcbiAgICAgIC8vIOWIm+W7uuagh+etvumhtVxyXG4gICAgICBsZXQgdGFic0VsbSA9IG5ldyBjeV90YWJzKCdwb2x5Z29uLW9iamVjdC1lZGl0LXRhYnMnLCB1bmRlZmluZWQsIHRoaXMuc2RrKVxyXG4gICAgICAvLyDpopzoibLnu4Tku7ZcclxuICAgICAgbGV0IGNvbG9yUGlja2VyID0gbmV3IFlKQ29sb3JQaWNrZXIoe1xyXG4gICAgICAgIGVsOiBjb250ZW50RWxtLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2NvbG9yJylbMF0sXHJcbiAgICAgICAgc2l6ZTogJ21pbmknLCAvL+minOiJsmJveOexu+Wei1xyXG4gICAgICAgIGFscGhhOiB0cnVlLCAvL+aYr+WQpuW8gOWQr+mAj+aYjuW6plxyXG4gICAgICAgIGRlZmF1bHRDb2xvcjogdGhpcy5jb2xvcixcclxuICAgICAgICBkaXNhYmxlZDogZmFsc2UsIC8v5piv5ZCm56aB5q2i5omT5byA6aKc6Imy6YCJ5oup5ZmoXHJcbiAgICAgICAgb3BlblBpY2tlckFuaTogJ29wYWNpdHknLCAvL+aJk+W8gOminOiJsumAieaLqeWZqOWKqOeUu1xyXG4gICAgICAgIHN1cmU6IGNvbG9yID0+IHtcclxuICAgICAgICAgIHRoaXMuY29sb3IgPSBjb2xvclxyXG4gICAgICAgIH0sIC8v54K55Ye756Gu6K6k5oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgICAgY2xlYXI6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMuY29sb3IgPSAncmdiYSgyNTUsMjU1LDI1NSwxKSdcclxuICAgICAgICB9IC8v54K55Ye75riF56m65oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgIH0pXHJcbiAgICAgIGxldCBsaW5lY29sb3JQaWNrZXIgPSBuZXcgWUpDb2xvclBpY2tlcih7XHJcbiAgICAgICAgZWw6IGNvbnRlbnRFbG0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbGluZUNvbG9yJylbMF0sXHJcbiAgICAgICAgc2l6ZTogJ21pbmknLCAvL+minOiJsmJveOexu+Wei1xyXG4gICAgICAgIGFscGhhOiB0cnVlLCAvL+aYr+WQpuW8gOWQr+mAj+aYjuW6plxyXG4gICAgICAgIGRlZmF1bHRDb2xvcjogdGhpcy5saW5lQ29sb3IsXHJcbiAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLCAvL+aYr+WQpuemgeatouaJk+W8gOminOiJsumAieaLqeWZqFxyXG4gICAgICAgIG9wZW5QaWNrZXJBbmk6ICdvcGFjaXR5JywgLy/miZPlvIDpopzoibLpgInmi6nlmajliqjnlLtcclxuICAgICAgICBzdXJlOiBjb2xvciA9PiB7XHJcbiAgICAgICAgICB0aGlzLmxpbmVDb2xvciA9IGNvbG9yXHJcbiAgICAgICAgfSwgLy/ngrnlh7vnoa7orqTmjInpkq7kuovku7blm57osINcclxuICAgICAgICBjbGVhcjogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5saW5lQ29sb3IgPSAncmdiYSgyNTUsMjU1LDI1NSwxKSdcclxuICAgICAgICB9IC8v54K55Ye75riF56m65oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgIH0pXHJcbiAgICAgIGxldCBsYWJlbENvbG9yUGlja2VyID0gbmV3IFlKQ29sb3JQaWNrZXIoe1xyXG4gICAgICAgIGVsOiBjb250ZW50RWxtLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xhYmVsQ29sb3InKVswXSxcclxuICAgICAgICBzaXplOiAnbWluaScsIC8v6aKc6ImyYm9457G75Z6LXHJcbiAgICAgICAgYWxwaGE6IHRydWUsIC8v5piv5ZCm5byA5ZCv6YCP5piO5bqmXHJcbiAgICAgICAgZGVmYXVsdENvbG9yOiB0aGlzLmxhYmVsQ29sb3IsXHJcbiAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLCAvL+aYr+WQpuemgeatouaJk+W8gOminOiJsumAieaLqeWZqFxyXG4gICAgICAgIG9wZW5QaWNrZXJBbmk6ICdvcGFjaXR5JywgLy/miZPlvIDpopzoibLpgInmi6nlmajliqjnlLtcclxuICAgICAgICBzdXJlOiBjb2xvciA9PiB7XHJcbiAgICAgICAgICB0aGlzLmxhYmVsQ29sb3IgPSBjb2xvclxyXG4gICAgICAgIH0sIC8v54K55Ye756Gu6K6k5oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgICAgY2xlYXI6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMubGFiZWxDb2xvciA9ICdyZ2JhKDI1NSwyNTUsMjU1LDEpJ1xyXG4gICAgICAgIH0gLy/ngrnlh7vmuIXnqbrmjInpkq7kuovku7blm57osINcclxuICAgICAgfSlcclxuICAgICAgbGV0IGxpbmVDb2xvclBpY2tlciA9IG5ldyBZSkNvbG9yUGlja2VyKHtcclxuICAgICAgICBlbDogY29udGVudEVsbS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdsYWJlbExpbmVDb2xvcicpWzBdLFxyXG4gICAgICAgIHNpemU6ICdtaW5pJywgLy/popzoibJib3jnsbvlnotcclxuICAgICAgICBhbHBoYTogdHJ1ZSwgLy/mmK/lkKblvIDlkK/pgI/mmI7luqZcclxuICAgICAgICBkZWZhdWx0Q29sb3I6IHRoaXMubGFiZWxMaW5lQ29sb3IsXHJcbiAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLCAvL+aYr+WQpuemgeatouaJk+W8gOminOiJsumAieaLqeWZqFxyXG4gICAgICAgIG9wZW5QaWNrZXJBbmk6ICdvcGFjaXR5JywgLy/miZPlvIDpopzoibLpgInmi6nlmajliqjnlLtcclxuICAgICAgICBzdXJlOiBjb2xvciA9PiB7XHJcbiAgICAgICAgICB0aGlzLmxhYmVsTGluZUNvbG9yID0gY29sb3JcclxuICAgICAgICB9LCAvL+eCueWHu+ehruiupOaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICAgIGNsZWFyOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmxhYmVsTGluZUNvbG9yID0gJ3JnYmEoMjU1LDI1NSwyNTUsMSknXHJcbiAgICAgICAgfSAvL+eCueWHu+a4heepuuaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICB9KVxyXG4gICAgICBsZXQgbGFiZWxCYWNrZ3JvdW5kQ29sb3JTdGFydFBpY2tlciA9IG5ldyBZSkNvbG9yUGlja2VyKHtcclxuICAgICAgICBlbDogY29udGVudEVsbS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdsYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0JylbMF0sXHJcbiAgICAgICAgc2l6ZTogJ21pbmknLFxyXG4gICAgICAgIGFscGhhOiB0cnVlLFxyXG4gICAgICAgIGRlZmF1bHRDb2xvcjogdGhpcy5sYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0LFxyXG4gICAgICAgIGRpc2FibGVkOiBmYWxzZSxcclxuICAgICAgICBvcGVuUGlja2VyQW5pOiAnb3BhY2l0eScsXHJcbiAgICAgICAgc3VyZTogY29sb3IgPT4ge1xyXG4gICAgICAgICAgdGhpcy5sYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0ID0gY29sb3JcclxuICAgICAgICB9LFxyXG4gICAgICAgIGNsZWFyOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmxhYmVsQmFja2dyb3VuZENvbG9yU3RhcnQgPSAncmdiYSgyNTUsMjU1LDI1NSwxKSdcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICAgIGxldCBsYWJlbEJhY2tncm91bmRDb2xvckVuZFBpY2tlciA9IG5ldyBZSkNvbG9yUGlja2VyKHtcclxuICAgICAgICBlbDogY29udGVudEVsbS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdsYWJlbEJhY2tncm91bmRDb2xvckVuZCcpWzBdLFxyXG4gICAgICAgIHNpemU6ICdtaW5pJyxcclxuICAgICAgICBhbHBoYTogdHJ1ZSxcclxuICAgICAgICBkZWZhdWx0Q29sb3I6IHRoaXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmQsXHJcbiAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLFxyXG4gICAgICAgIG9wZW5QaWNrZXJBbmk6ICdvcGFjaXR5JyxcclxuICAgICAgICBzdXJlOiBjb2xvciA9PiB7XHJcbiAgICAgICAgICB0aGlzLmxhYmVsQmFja2dyb3VuZENvbG9yRW5kID0gY29sb3JcclxuICAgICAgICB9LFxyXG4gICAgICAgIGNsZWFyOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmxhYmVsQmFja2dyb3VuZENvbG9yRW5kID0gJ3JnYmEoMjU1LDI1NSwyNTUsMSknXHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgICAvLyBsZXQgaGVpZ2h0RWxtID0gdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmJvZHkuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcclxuICAgICAgLy8gICAnaGVpZ2h0J1xyXG4gICAgICAvLyApWzBdXHJcbiAgICAgIC8vIGhlaWdodEVsbS52YWx1ZSA9IHRoaXMuaGVpZ2h0XHJcbiAgICAgIC8vIGhlaWdodEVsbS5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIGUgPT4ge1xyXG4gICAgICAvLyAgIGxldCB2YWx1ZSA9IGUudGFyZ2V0LnZhbHVlXHJcbiAgICAgIC8vICAgaWYgKFxyXG4gICAgICAvLyAgICAgKGUuZGF0YSA9PT0gJy4nICYmIHZhbHVlLmluZGV4T2YoJy4nKSA9PT0gLTEpIHx8XHJcbiAgICAgIC8vICAgICAoZS5kYXRhID09PSAnLScgJiYgdmFsdWUuaW5kZXhPZignLScpID09PSAtMSlcclxuICAgICAgLy8gICApIHtcclxuICAgICAgLy8gICB9IGVsc2Uge1xyXG4gICAgICAvLyAgICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgIC8vICAgICAgIHZhbHVlID0gTnVtYmVyKHZhbHVlKVxyXG4gICAgICAvLyAgICAgICBpZiAoZS50YXJnZXQubWF4ICYmIHZhbHVlID4gTnVtYmVyKGUudGFyZ2V0Lm1heCkpIHtcclxuICAgICAgLy8gICAgICAgICB2YWx1ZSA9IE51bWJlcihlLnRhcmdldC5tYXgpXHJcbiAgICAgIC8vICAgICAgIH1cclxuICAgICAgLy8gICAgICAgaWYgKGUudGFyZ2V0Lm1pbiAmJiB2YWx1ZSA8IE51bWJlcihlLnRhcmdldC5taW4pKSB7XHJcbiAgICAgIC8vICAgICAgICAgdmFsdWUgPSBOdW1iZXIoZS50YXJnZXQubWluKVxyXG4gICAgICAvLyAgICAgICB9XHJcbiAgICAgIC8vICAgICB9XHJcbiAgICAgIC8vICAgICB0aGlzLmhlaWdodCA9IHZhbHVlXHJcbiAgICAgIC8vICAgfVxyXG4gICAgICAvLyB9KVxyXG4gICAgICBsZXQgYWxsX2VsbSA9IGNvbnRlbnRFbG0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoJyonKVxyXG4gICAgICBQb2x5Z29uT2JqZWN0LkV2ZW50QmluZGluZyh0aGlzLCBhbGxfZWxtKVxyXG4gICAgICAvLyB0aGlzLl9lbG1zLmhlaWdodCA9IFtoZWlnaHRFbG1dXHJcbiAgICAgIHRoaXMuX2VsbXMuY29sb3IgPSBbY29sb3JQaWNrZXJdXHJcbiAgICAgIHRoaXMuX2VsbXMubGluZUNvbG9yID0gW2xpbmVjb2xvclBpY2tlcl1cclxuICAgICAgdGhpcy5fZWxtcy5sYWJlbENvbG9yID0gW2xhYmVsQ29sb3JQaWNrZXJdXHJcbiAgICAgIHRoaXMuX2VsbXMubGFiZWxMaW5lQ29sb3IgPSBbbGluZUNvbG9yUGlja2VyXVxyXG4gICAgICB0aGlzLl9lbG1zLmxhYmVsQmFja2dyb3VuZENvbG9yU3RhcnQgPSBbbGFiZWxCYWNrZ3JvdW5kQ29sb3JTdGFydFBpY2tlcl1cclxuICAgICAgdGhpcy5fZWxtcy5sYWJlbEJhY2tncm91bmRDb2xvckVuZCA9IFtsYWJlbEJhY2tncm91bmRDb2xvckVuZFBpY2tlcl1cclxuXHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuYXR0cmlidXRlTGluayA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50XHJcbiAgICAgICAgdGhpcy5hdHRyaWJ1dGVWciA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudFxyXG4gICAgICAgIHRoaXMuY2FtZXJhU2VsZWN0ICYmIHRoaXMuY2FtZXJhU2VsZWN0KClcclxuICAgICAgICB0aGlzLmdvb2RzU2VsZWN0ICYmIHRoaXMuZ29vZHNTZWxlY3QoKVxyXG4gICAgICAgIGxldCB0YWdEYXRhID0gdGhpcy5hdHRyaWJ1dGVTZWxlY3RcclxuICAgICAgICBsZXQgYXR0cmlidXRlRWxtID0gdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcclxuICAgICAgICAgICdhdHRyaWJ1dGUtc2VsZWN0LWJveCdcclxuICAgICAgICApWzBdXHJcbiAgICAgICAgaWYgKGF0dHJpYnV0ZUVsbSkge1xyXG4gICAgICAgICAgbGV0IGxlZ3BPYmplY3QgPSBsZWdwKGF0dHJpYnV0ZUVsbSwgJy5hdHRyaWJ1dGUtc2VsZWN0JylcclxuICAgICAgICAgIGxlZ3BPYmplY3QubGVncF9zZWFyY2godGFnRGF0YSlcclxuICAgICAgICAgIGxldCBhdHRyaWJ1dGVTZWxlY3RFbG0gPSB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudFxyXG4gICAgICAgICAgICAuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnYXR0cmlidXRlLXNlbGVjdCcpWzBdXHJcbiAgICAgICAgICAgIC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaW5wdXQnKVswXVxyXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YWdEYXRhLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmICh0YWdEYXRhW2ldLmtleSA9PT0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZVR5cGUpIHtcclxuICAgICAgICAgICAgICBhdHRyaWJ1dGVTZWxlY3RFbG0udmFsdWUgPSB0YWdEYXRhW2ldLnZhbHVlXHJcbiAgICAgICAgICAgICAgbGVncE9iamVjdC5sZWdwX3NlYXJjaEFjdGl2ZSh0YWdEYXRhW2ldLnZhbHVlKVxyXG4gICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGF0dHJpYnV0ZVNlbGVjdEVsbS5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICgpID0+IHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YWdEYXRhLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgaWYgKHRhZ0RhdGFbaV0udmFsdWUgPT09IGF0dHJpYnV0ZVNlbGVjdEVsbS52YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hdHRyaWJ1dGVUeXBlID0gdGFnRGF0YVtpXS5rZXlcclxuICAgICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHVuaXREYXRhID0gW1xyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lOiAn5bmz5pa557GzJyxcclxuICAgICAgICAgICAgdmFsdWU6ICflubPmlrnnsbMnXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lOiAn5bmz5pa55Y2D57GzJyxcclxuICAgICAgICAgICAgdmFsdWU6ICflubPmlrnljYPnsbMnXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lOiAn5LqpJyxcclxuICAgICAgICAgICAgdmFsdWU6ICfkuqknXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lOiAn5YWs6aG3JyxcclxuICAgICAgICAgICAgdmFsdWU6ICflhazpobcnXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgXVxyXG5cclxuICAgICAgICBsZXQgdW5pdERhdGFMZWdwT2JqZWN0ID0gbGVncChcclxuICAgICAgICAgIHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXHJcbiAgICAgICAgICAgICdpbnB1dC1zZWxlY3QtdW5pdC1ib3gnXHJcbiAgICAgICAgICApWzBdLFxyXG4gICAgICAgICAgJy5pbnB1dC1zZWxlY3QtdW5pdCdcclxuICAgICAgICApXHJcbiAgICAgICAgaWYgKHVuaXREYXRhTGVncE9iamVjdCkge1xyXG4gICAgICAgICAgdW5pdERhdGFMZWdwT2JqZWN0LmxlZ3Bfc2VhcmNoKHVuaXREYXRhKVxyXG4gICAgICAgICAgbGV0IHVuaXREYXRhTGVncEVsbSA9IHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50XHJcbiAgICAgICAgICAgIC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdpbnB1dC1zZWxlY3QtdW5pdCcpWzBdXHJcbiAgICAgICAgICAgIC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaW5wdXQnKVswXVxyXG4gICAgICAgICAgdW5pdERhdGFMZWdwRWxtLnZhbHVlID0gdGhpcy5vcHRpb25zWydhcmVhLXVuaXQnXVxyXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB1bml0RGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAodW5pdERhdGFbaV0udmFsdWUgPT09IHVuaXREYXRhTGVncEVsbS52YWx1ZSkge1xyXG4gICAgICAgICAgICAgIHVuaXREYXRhTGVncE9iamVjdC5sZWdwX3NlYXJjaEFjdGl2ZSh1bml0RGF0YVtpXS52YWx1ZSlcclxuICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB1bml0RGF0YUxlZ3BFbG0uYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdW5pdERhdGEubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICBpZiAodW5pdERhdGFbaV0udmFsdWUgPT09IHVuaXREYXRhTGVncEVsbS52YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hcmVhVW5pdCA9IHVuaXREYXRhW2ldLnZhbHVlXHJcbiAgICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBoZWlnaHRCb3hFbG0gPSB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdoZWlnaHQtYm94JylbMF1cclxuICAgICAgICBsZXQgaGVpZ2h0RWxtID0gaGVpZ2h0Qm94RWxtLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2hlaWdodCcpWzBdXHJcbiAgICAgICAgbGV0IGhlaWdodENvbmZpcm1FbG0gPSB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdoZWlnaHQtY29uZmlybScpWzBdXHJcbiAgICAgICAgaGVpZ2h0RWxtLnZhbHVlID0gMTBcclxuICAgICAgICBpZiAodGhpcy5oZWlnaHRNb2RlID09IDIpIHtcclxuICAgICAgICAgIGhlaWdodEJveEVsbSAmJiAoaGVpZ2h0Qm94RWxtLmNsYXNzTmFtZSA9ICdpbnB1dC1udW1iZXIgaW5wdXQtbnVtYmVyLXVuaXQtMSBoZWlnaHQtYm94IGRpc2FibGVkJyk7XHJcbiAgICAgICAgICBoZWlnaHRDb25maXJtRWxtICYmIGhlaWdodENvbmZpcm1FbG0uc2V0QXR0cmlidXRlKCdkaXNhYmxlZCcsICdkaXNhYmxlZCcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIGhlaWdodEJveEVsbSAmJiAoaGVpZ2h0Qm94RWxtLmNsYXNzTmFtZSA9ICdpbnB1dC1udW1iZXIgaW5wdXQtbnVtYmVyLXVuaXQtMSBoZWlnaHQtYm94Jyk7XHJcbiAgICAgICAgICBoZWlnaHRDb25maXJtRWxtICYmIGhlaWdodENvbmZpcm1FbG0ucmVtb3ZlQXR0cmlidXRlKCdkaXNhYmxlZCcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgaGVpZ2h0TW9kZURhdGEgPSBbXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIG5hbWU6ICfmtbfmi5Tpq5jluqYnLFxyXG4gICAgICAgICAgICB2YWx1ZTogJ+a1t+aLlOmrmOW6picsXHJcbiAgICAgICAgICAgIGtleTogJzAnLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJ+ebuOWvueWcsOihqCcsXHJcbiAgICAgICAgICAgIHZhbHVlOiAn55u45a+55Zyw6KGoJyxcclxuICAgICAgICAgICAga2V5OiAnMScsXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lOiAn5L6d6ZmE5qih5Z6LJyxcclxuICAgICAgICAgICAgdmFsdWU6ICfkvp3pmYTmqKHlnosnLFxyXG4gICAgICAgICAgICBrZXk6ICcyJyxcclxuICAgICAgICAgIH1cclxuICAgICAgICBdXHJcbiAgICAgICAgbGV0IGhlaWdodE1vZGVPYmplY3QgPSBsZWdwKFxyXG4gICAgICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcclxuICAgICAgICAgICAgJ2hlaWdodC1tb2RlLWJveCdcclxuICAgICAgICAgIClbMF0sXHJcbiAgICAgICAgICAnLmhlaWdodC1tb2RlJ1xyXG4gICAgICAgIClcclxuICAgICAgICBpZiAoaGVpZ2h0TW9kZU9iamVjdCkge1xyXG4gICAgICAgICAgaGVpZ2h0TW9kZU9iamVjdC5sZWdwX3NlYXJjaChoZWlnaHRNb2RlRGF0YSlcclxuICAgICAgICAgIGxldCBoZWlnaHRNb2RlRGF0YUxlZ3BFbG0gPSB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudFxyXG4gICAgICAgICAgICAuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaGVpZ2h0LW1vZGUnKVswXVxyXG4gICAgICAgICAgICAuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2lucHV0JylbMF1cclxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaGVpZ2h0TW9kZURhdGEubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKGhlaWdodE1vZGVEYXRhW2ldLmtleSA9PSB0aGlzLmhlaWdodE1vZGUpIHtcclxuICAgICAgICAgICAgICBoZWlnaHRNb2RlRGF0YUxlZ3BFbG0udmFsdWUgPSBoZWlnaHRNb2RlRGF0YVtpXS52YWx1ZVxyXG4gICAgICAgICAgICAgIGhlaWdodE1vZGVPYmplY3QubGVncF9zZWFyY2hBY3RpdmUoXHJcbiAgICAgICAgICAgICAgICBoZWlnaHRNb2RlRGF0YVtpXS52YWx1ZVxyXG4gICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBoZWlnaHRNb2RlRGF0YUxlZ3BFbG0uYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaGVpZ2h0TW9kZURhdGEubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICBpZiAoaGVpZ2h0TW9kZURhdGFbaV0udmFsdWUgPT09IGhlaWdodE1vZGVEYXRhTGVncEVsbS52YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5oZWlnaHRNb2RlID0gaGVpZ2h0TW9kZURhdGFbaV0ua2V5XHJcbiAgICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSlcclxuXHJcbiAgICAgICAgICBoZWlnaHRFbG0uYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIHN3aXRjaCAodGhpcy5oZWlnaHRNb2RlKSB7XHJcbiAgICAgICAgICAgICAgY2FzZSAwOlxyXG4gICAgICAgICAgICAgIGNhc2UgJzAnOlxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgY2FzZSAxOlxyXG4gICAgICAgICAgICAgIGNhc2UgJzEnOlxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgY2FzZSAyOlxyXG4gICAgICAgICAgICAgIGNhc2UgJzInOlxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pXHJcblxyXG4gICAgICAgICAgdGhpcy5fZWxtcy5oZWlnaHQgPSBoZWlnaHRFbG1cclxuICAgICAgICAgIHRoaXMuX2VsbXMuaGVpZ2h0Qm94ID0gaGVpZ2h0Qm94RWxtXHJcbiAgICAgICAgICB0aGlzLl9lbG1zLmhlaWdodE1vZGUgPSBoZWlnaHRNb2RlRGF0YUxlZ3BFbG1cclxuICAgICAgICAgIHRoaXMuX2VsbXMuaGVpZ2h0Q29uZmlybSA9IGhlaWdodENvbmZpcm1FbG1cclxuICAgICAgICAgIHRoaXMuX2VsbXMuaGVpZ2h0TW9kZU9iamVjdCA9IGhlaWdodE1vZGVPYmplY3RcclxuXHJcbiAgICAgICAgICBoZWlnaHRDb25maXJtRWxtLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5vcGVyYXRlLnBvc2l0aW9uRWRpdGluZykge1xyXG4gICAgICAgICAgICAgIHRoaXMucG9zaXRpb25FZGl0aW5nID0gZmFsc2VcclxuICAgICAgICAgICAgICB0aGlzLmhlaWdodCA9IHRoaXMuaGVpZ2h0ICsgTnVtYmVyKGhlaWdodEVsbS52YWx1ZSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICBQb2x5Z29uT2JqZWN0LmNsb3NlTm9kZUVkaXQodGhpcylcclxuICAgICAgICAgICAgICB0aGlzLmhlaWdodE1vZGUgPSB0aGlzLmhlaWdodE1vZGVcclxuICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaGVpZ2h0ID0gdGhpcy5oZWlnaHQgKyBOdW1iZXIoaGVpZ2h0RWxtLnZhbHVlKVxyXG4gICAgICAgICAgICAgIH0sIDEwMCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gdGhpcy5wb3NpdGlvbkVkaXRpbmcgPSBmYWxzZVxyXG4gICAgICAgICAgICAvLyBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMub3B0aW9ucy5wb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgLy8gICB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmFsdCA9IE51bWJlcigodGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5hbHQgKyBOdW1iZXIoaGVpZ2h0RWxtLnZhbHVlKSkudG9GaXhlZCgyKSlcclxuICAgICAgICAgICAgLy8gICB0aGlzLl9lbG1zLmFsdFtpXS5pbm5lckhUTUwgPSB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmFsdFxyXG4gICAgICAgICAgICAvLyB9XHJcbiAgICAgICAgICAgIC8vIHRoaXMucmVuZXdQb3NpdGlvbnModGhpcy5vcHRpb25zLnBvc2l0aW9ucylcclxuICAgICAgICAgICAgLy8gdGhpcy5lbnRpdHkucG9seWxpbmUucG9zaXRpb25zID0gW1xyXG4gICAgICAgICAgICAvLyAgIC4uLnRoaXMucG9zaXRpb25zLFxyXG4gICAgICAgICAgICAvLyAgIHRoaXMucG9zaXRpb25zWzBdLFxyXG4gICAgICAgICAgICAvLyAgIHRoaXMucG9zaXRpb25zWzFdXHJcbiAgICAgICAgICAgIC8vIF1cclxuXHJcbiAgICAgICAgICAgIC8vIHRoaXMucG9zaXRpb25FZGl0aW5nID0gZmFsc2VcclxuICAgICAgICAgICAgLy8gUG9seWdvbk9iamVjdC5jbG9zZU5vZGVFZGl0KHRoaXMpXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IGZvbnREYXRhID0gZ2V0Rm9udExpc3QoKVxyXG4gICAgICAgIGxldCBmb250T2JqZWN0ID0gbGVncChcclxuICAgICAgICAgIHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXHJcbiAgICAgICAgICAgICdmb250LXNlbGVjdC1ib3gnXHJcbiAgICAgICAgICApWzBdLFxyXG4gICAgICAgICAgJy5mb250LXNlbGVjdCdcclxuICAgICAgICApXHJcbiAgICAgICAgaWYgKGZvbnRPYmplY3QpIHtcclxuICAgICAgICAgIGZvbnRPYmplY3QubGVncF9zZWFyY2goZm9udERhdGEpXHJcbiAgICAgICAgICBsZXQgZm9udERhdGFMZWdwRWxtID0gdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnRcclxuICAgICAgICAgICAgLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2ZvbnQtc2VsZWN0JylbMF1cclxuICAgICAgICAgICAgLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdpbnB1dCcpWzBdXHJcbiAgICAgICAgICBmb250RGF0YUxlZ3BFbG0udmFsdWUgPSBmb250RGF0YVt0aGlzLmxhYmVsRm9udEZhbWlseV0udmFsdWVcclxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZm9udERhdGEubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKGZvbnREYXRhW2ldLnZhbHVlID09IGZvbnREYXRhTGVncEVsbS52YWx1ZSkge1xyXG4gICAgICAgICAgICAgIGZvbnRPYmplY3QubGVncF9zZWFyY2hBY3RpdmUoZm9udERhdGFbaV0udmFsdWUpXHJcbiAgICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZm9udERhdGFMZWdwRWxtLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKCkgPT4ge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZvbnREYXRhLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgaWYgKGZvbnREYXRhW2ldLnZhbHVlID09PSBmb250RGF0YUxlZ3BFbG0udmFsdWUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubGFiZWxGb250RmFtaWx5ID0gZm9udERhdGFbaV0ua2V5XHJcbiAgICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIHRoaXMuX2VsbXMubGFiZWxGb250RmFtaWx5ID0gW2ZvbnREYXRhTGVncEVsbV1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNyZWF0ZVNwYXRpYWxJbmZvVGFibGVDb250ZW50KClcclxuXHJcblxyXG5cclxuICAgICAgfSwgMClcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmICh0aGlzLl9EaWFsb2dPYmplY3QgJiYgdGhpcy5fRGlhbG9nT2JqZWN0LnJlbW92ZSkge1xyXG4gICAgICAgIHRoaXMuX0RpYWxvZ09iamVjdC5yZW1vdmUoKVxyXG4gICAgICAgIHRoaXMuX0RpYWxvZ09iamVjdCA9IG51bGxcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVzZXQoKSB7XHJcbiAgICBpZiAoIXRoaXMuZW50aXR5ICYmICF0aGlzLl9EaWFsb2dPYmplY3QpIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcbiAgICB0aGlzLm9wdGlvbnMgPSB0aGlzLmRlZXBDb3B5T2JqKHRoaXMub3JpZ2luYWxPcHRpb25zKVxyXG4gICAgdGhpcy5uYW1lID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMubmFtZVxyXG4gICAgdGhpcy5jb2xvciA9IHRoaXMub3JpZ2luYWxPcHRpb25zLmNvbG9yXHJcbiAgICB0aGlzLmxpbmVDb2xvciA9IHRoaXMub3JpZ2luYWxPcHRpb25zLmxpbmUuY29sb3JcclxuICAgIHRoaXMubGluZVdpZHRoID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMubGluZS53aWR0aFxyXG4gICAgdGhpcy5hcmVhID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMuYXJlYVxyXG4gICAgdGhpcy5oZWlnaHQgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5oZWlnaHRcclxuICAgIHRoaXMuYXJlYVVuaXQgPSB0aGlzLm9yaWdpbmFsT3B0aW9uc1snYXJlYS11bml0J11cclxuICAgIHRoaXMubGFiZWxTaG93ID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMubGFiZWwuc2hvd1xyXG4gICAgdGhpcy5sYWJlbENvbG9yID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMubGFiZWwuY29sb3JcclxuICAgIHRoaXMubGFiZWxGb250U2l6ZSA9IHRoaXMub3JpZ2luYWxPcHRpb25zLmxhYmVsLmZvbnRTaXplXHJcbiAgICB0aGlzLmxhYmVsRm9udEZhbWlseSA9IHRoaXMub3JpZ2luYWxPcHRpb25zLmxhYmVsLmZvbnRGYW1pbHlcclxuICAgIHRoaXMubGFiZWxTY2FsZUJ5RGlzdGFuY2UgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5sYWJlbC5zY2FsZUJ5RGlzdGFuY2VcclxuICAgIHRoaXMubGFiZWxOZWFyID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMubGFiZWwubmVhclxyXG4gICAgdGhpcy5sYWJlbEZhciA9IHRoaXMub3JpZ2luYWxPcHRpb25zLmxhYmVsLmZhclxyXG4gICAgdGhpcy5sYWJlbExpbmVXaWR0aCA9IHRoaXMub3JpZ2luYWxPcHRpb25zLmxhYmVsLmxpbmVXaWR0aFxyXG4gICAgdGhpcy5sYWJlbFBpeGVsT2Zmc2V0ID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMubGFiZWwucGl4ZWxPZmZzZXRcclxuICAgIHRoaXMubGFiZWxMaW5lQ29sb3IgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5sYWJlbC5saW5lQ29sb3JcclxuICAgIHRoaXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JTdGFydCA9IHRoaXMub3JpZ2luYWxPcHRpb25zLmxhYmVsLmJhY2tncm91bmRDb2xvclswXVxyXG4gICAgdGhpcy5sYWJlbEJhY2tncm91bmRDb2xvckVuZCA9IHRoaXMub3JpZ2luYWxPcHRpb25zLmxhYmVsLmJhY2tncm91bmRDb2xvclsxXVxyXG4gICAgdGhpcy5hdHRyaWJ1dGVMaW5rID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnRcclxuICAgIHRoaXMuYXR0cmlidXRlQ2FtZXJhID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5jYW1lcmEuY29udGVudFxyXG4gICAgdGhpcy5hdHRyaWJ1dGVWciA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudFxyXG4gICAgdGhpcy5hdHRyaWJ1dGVHb29kcyA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUuZ29vZHMuY29udGVudFxyXG4gICAgdGhpcy5jYW1lcmFTZWxlY3QgJiYgdGhpcy5jYW1lcmFTZWxlY3QoKVxyXG4gICAgdGhpcy5nb29kc1NlbGVjdCAmJiB0aGlzLmdvb2RzU2VsZWN0KClcclxuICAgIHRoaXMuaGVpZ2h0TW9kZSA9IHRoaXMub3B0aW9ucy5oZWlnaHRNb2RlXHJcblxyXG4gICAgbGV0IHBvc2l0aW9ucyA9IHRoaXMub3B0aW9ucy5wb3NpdGlvbnNcclxuICAgIGxldCBwb3NpdGlvbnMyID0gW1tdXVxyXG4gICAgbGV0IGZyb21EZWdyZWVzQXJyYXkgPSBbXVxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5oZWlnaHQgfHwgdGhpcy5vcHRpb25zLmhlaWdodCA9PT0gMCkge1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGZyb21EZWdyZWVzQXJyYXkucHVzaChcclxuICAgICAgICAgIHBvc2l0aW9uc1tpXS5sbmcsXHJcbiAgICAgICAgICBwb3NpdGlvbnNbaV0ubGF0LFxyXG4gICAgICAgICAgdGhpcy5vcHRpb25zLmhlaWdodFxyXG4gICAgICAgIClcclxuICAgICAgICBwb3NpdGlvbnMyWzBdLnB1c2goW3Bvc2l0aW9uc1tpXS5sbmcsIHBvc2l0aW9uc1tpXS5sYXRdKVxyXG4gICAgICB9XHJcbiAgICAgIHBvc2l0aW9uczJbMF0ucHVzaChbcG9zaXRpb25zWzBdLmxuZywgcG9zaXRpb25zWzBdLmxhdF0pXHJcbiAgICAgIHRoaXMucG9zaXRpb25zID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXNBcnJheUhlaWdodHMoXHJcbiAgICAgICAgZnJvbURlZ3JlZXNBcnJheVxyXG4gICAgICApXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGZyb21EZWdyZWVzQXJyYXkucHVzaChwb3NpdGlvbnNbaV0ubG5nLCBwb3NpdGlvbnNbaV0ubGF0KVxyXG4gICAgICAgIHBvc2l0aW9uczJbMF0ucHVzaChbcG9zaXRpb25zW2ldLmxuZywgcG9zaXRpb25zW2ldLmxhdF0pXHJcbiAgICAgIH1cclxuICAgICAgcG9zaXRpb25zMlswXS5wdXNoKFtwb3NpdGlvbnNbMF0ubG5nLCBwb3NpdGlvbnNbMF0ubGF0XSlcclxuICAgICAgdGhpcy5wb3NpdGlvbnMgPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlc0FycmF5KGZyb21EZWdyZWVzQXJyYXkpXHJcbiAgICB9XHJcbiAgICB0aGlzLmVudGl0eS5wb2x5Z29uLmhpZXJhcmNoeSA9IG5ldyBDZXNpdW0uUG9seWdvbkhpZXJhcmNoeSh0aGlzLnBvc2l0aW9ucylcclxuICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLnBvc2l0aW9ucyA9IFtcclxuICAgICAgLi4udGhpcy5wb3NpdGlvbnMsXHJcbiAgICAgIHRoaXMucG9zaXRpb25zWzBdLFxyXG4gICAgICB0aGlzLnBvc2l0aW9uc1sxXVxyXG4gICAgXVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICog6aOe5YiwXHJcbiAgICovXHJcbiAgYXN5bmMgZmx5VG8ob3B0aW9ucyA9IHt9KSB7XHJcbiAgICBpZiAodGhpcy5fZXJyb3IpIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcbiAgICBzZXRBY3RpdmVWaWV3ZXIoMClcclxuICAgIGNsb3NlUm90YXRlQXJvdW5kKHRoaXMuc2RrKVxyXG4gICAgY2xvc2VWaWV3Rm9sbG93KHRoaXMuc2RrKVxyXG5cclxuICAgIGlmICh0aGlzLm9wdGlvbnMuY3VzdG9tVmlldyAmJiB0aGlzLm9wdGlvbnMuY3VzdG9tVmlldy5yZWxhdGl2ZVBvc2l0aW9uICYmIHRoaXMub3B0aW9ucy5jdXN0b21WaWV3Lm9yaWVudGF0aW9uKSB7XHJcbiAgICAgIGxldCBvcmllbnRhdGlvbiA9IHtcclxuICAgICAgICBoZWFkaW5nOiBDZXNpdW0uTWF0aC50b1JhZGlhbnModGhpcy5vcHRpb25zLmN1c3RvbVZpZXcub3JpZW50YXRpb24uaGVhZGluZyB8fCAwLjApLFxyXG4gICAgICAgIHBpdGNoOiBDZXNpdW0uTWF0aC50b1JhZGlhbnModGhpcy5vcHRpb25zLmN1c3RvbVZpZXcub3JpZW50YXRpb24ucGl0Y2ggfHwgLTYwLjApLFxyXG4gICAgICAgIHJvbGw6IENlc2l1bS5NYXRoLnRvUmFkaWFucyh0aGlzLm9wdGlvbnMuY3VzdG9tVmlldy5vcmllbnRhdGlvbi5yb2xsIHx8IDAuMClcclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IGxuZyA9IHRoaXMub3B0aW9ucy5jdXN0b21WaWV3LnJlbGF0aXZlUG9zaXRpb24ubG5nXHJcbiAgICAgIGxldCBsYXQgPSB0aGlzLm9wdGlvbnMuY3VzdG9tVmlldy5yZWxhdGl2ZVBvc2l0aW9uLmxhdFxyXG4gICAgICBsZXQgYWx0ID0gdGhpcy5vcHRpb25zLmN1c3RvbVZpZXcucmVsYXRpdmVQb3NpdGlvbi5hbHRcclxuICAgICAgbGV0IGRlc3RpbmF0aW9uID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXMobG5nLCBsYXQsIGFsdClcclxuXHJcbiAgICAgIGxldCBwb3NpdGlvbiA9IHsgbG5nOiAwLCBsYXQ6IDAgfVxyXG4gICAgICBpZiAodGhpcy5vcHRpb25zLnBvc2l0aW9uKSB7XHJcbiAgICAgICAgcG9zaXRpb24gPSB7IC4uLnRoaXMub3B0aW9ucy5wb3NpdGlvbiB9XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAodGhpcy5vcHRpb25zLnBvc2l0aW9ucykge1xyXG4gICAgICAgIHBvc2l0aW9uID0geyAuLi50aGlzLm9wdGlvbnMucG9zaXRpb25zWzBdIH1cclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmICh0aGlzLm9wdGlvbnMuY2VudGVyKSB7XHJcbiAgICAgICAgcG9zaXRpb24gPSB7IC4uLnRoaXMub3B0aW9ucy5jZW50ZXIgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKHRoaXMub3B0aW9ucy5zdGFydCkge1xyXG4gICAgICAgIHBvc2l0aW9uID0geyAuLi50aGlzLm9wdGlvbnMuc3RhcnQgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ2xuZycpKSB7XHJcbiAgICAgICAgICBwb3NpdGlvbi5sbmcgPSB0aGlzLm9wdGlvbnMubG5nXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ2xhdCcpKSB7XHJcbiAgICAgICAgICBwb3NpdGlvbi5sYXQgPSB0aGlzLm9wdGlvbnMubGF0XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ2FsdCcpKSB7XHJcbiAgICAgICAgICBwb3NpdGlvbi5hbHQgPSB0aGlzLm9wdGlvbnMuYWx0XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIC8vIOWmguaenOayoeaciemrmOW6puWAvO+8jOWImeiOt+WPlue0p+i0tOmrmOW6puiuoeeul1xyXG4gICAgICBpZiAoIXBvc2l0aW9uLmhhc093blByb3BlcnR5KCdhbHQnKSkge1xyXG4gICAgICAgIHBvc2l0aW9uLmFsdCA9IGF3YWl0IHRoaXMuZ2V0Q2xhbXBUb0hlaWdodChwb3NpdGlvbilcclxuICAgICAgfVxyXG4gICAgICBsbmcgPSB0aGlzLm9wdGlvbnMuY3VzdG9tVmlldy5yZWxhdGl2ZVBvc2l0aW9uLmxuZyArIHBvc2l0aW9uLmxuZ1xyXG4gICAgICBsYXQgPSB0aGlzLm9wdGlvbnMuY3VzdG9tVmlldy5yZWxhdGl2ZVBvc2l0aW9uLmxhdCArIHBvc2l0aW9uLmxhdFxyXG4gICAgICBhbHQgPSB0aGlzLm9wdGlvbnMuY3VzdG9tVmlldy5yZWxhdGl2ZVBvc2l0aW9uLmFsdCArIHBvc2l0aW9uLmFsdFxyXG4gICAgICBkZXN0aW5hdGlvbiA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzKGxuZywgbGF0LCBhbHQpXHJcbiAgICAgIHRoaXMuc2RrLnZpZXdlci5jYW1lcmEuZmx5VG8oe1xyXG4gICAgICAgIGRlc3RpbmF0aW9uOiBkZXN0aW5hdGlvbixcclxuICAgICAgICBvcmllbnRhdGlvbjogb3JpZW50YXRpb25cclxuICAgICAgfSlcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBsZXQgcG9zaXRpb25BcnJheSA9IFtdXHJcbiAgICAgIGxldCBncm91bmRcclxuICAgICAgc3dpdGNoICh0aGlzLmhlaWdodE1vZGUpIHtcclxuICAgICAgICBjYXNlIDA6XHJcbiAgICAgICAgY2FzZSAnMCc6XHJcbiAgICAgICAgICBncm91bmQgPSBmYWxzZVxyXG4gICAgICAgICAgYnJlYWtcclxuICAgICAgICBjYXNlIDE6XHJcbiAgICAgICAgY2FzZSAnMSc6XHJcbiAgICAgICAgICBncm91bmQgPSBmYWxzZVxyXG4gICAgICAgICAgYnJlYWtcclxuICAgICAgICBjYXNlIDI6XHJcbiAgICAgICAgY2FzZSAnMic6XHJcbiAgICAgICAgICBncm91bmQgPSB0cnVlXHJcbiAgICAgICAgICBicmVha1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChncm91bmQpIHtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMub3B0aW9ucy5wb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGxldCBoZWlnaHQgPSBhd2FpdCB0aGlzLmdldENsYW1wVG9IZWlnaHQodGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXSlcclxuICAgICAgICAgIGxldCBhID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXMoXHJcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubG5nLFxyXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxhdCxcclxuICAgICAgICAgICAgaGVpZ2h0XHJcbiAgICAgICAgICApXHJcbiAgICAgICAgICBwb3NpdGlvbkFycmF5LnB1c2goYS54LCBhLnksIGEueilcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaWYgKHRoaXMucG9zaXRpb25zKSB7XHJcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHBvc2l0aW9uQXJyYXkucHVzaCh0aGlzLnBvc2l0aW9uc1tpXS54LCB0aGlzLnBvc2l0aW9uc1tpXS55LCB0aGlzLnBvc2l0aW9uc1tpXS56KVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBsZXQgQm91bmRpbmdTcGhlcmUgPSBDZXNpdW0uQm91bmRpbmdTcGhlcmUuZnJvbVZlcnRpY2VzKHBvc2l0aW9uQXJyYXkpXHJcbiAgICAgIHRoaXMuc2RrLnZpZXdlci5jYW1lcmEuZmx5VG9Cb3VuZGluZ1NwaGVyZShCb3VuZGluZ1NwaGVyZSwge1xyXG4gICAgICAgIG9mZnNldDogb3B0aW9ucy5vcmllbnRhdGlvbiB8fCB7XHJcbiAgICAgICAgICBoZWFkaW5nOiBDZXNpdW0uTWF0aC50b1JhZGlhbnMoMC4wKSxcclxuICAgICAgICAgIHBpdGNoOiBDZXNpdW0uTWF0aC50b1JhZGlhbnMoLTkwLjApLFxyXG4gICAgICAgICAgcm9sbDogQ2VzaXVtLk1hdGgudG9SYWRpYW5zKDAuMClcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiDliKDpmaRcclxuICAgKi9cclxuICBhc3luYyByZW1vdmUoKSB7XHJcbiAgICB0aGlzLmV2ZW50ICYmIHRoaXMuZXZlbnQuZGVzdHJveSgpXHJcbiAgICB0aGlzLnRpcCAmJiB0aGlzLnRpcC5kZXN0cm95KClcclxuICAgIHRoaXMuc2RrLnZpZXdlci5lbnRpdGllcy5yZW1vdmUodGhpcy5lbnRpdHkpXHJcbiAgICB0aGlzLmxhYmVsICYmIHRoaXMubGFiZWwucmVtb3ZlKClcclxuICAgIHRoaXMuZW50aXR5ID0gbnVsbFxyXG4gICAgaWYgKHRoaXMuX0RpYWxvZ09iamVjdCAmJiAhdGhpcy5fRGlhbG9nT2JqZWN0LmlzRGVzdHJveSkge1xyXG4gICAgICB0aGlzLl9EaWFsb2dPYmplY3QuY2xvc2UoKVxyXG4gICAgICB0aGlzLl9EaWFsb2dPYmplY3QgPSBudWxsXHJcbiAgICB9XHJcbiAgICBhd2FpdCB0aGlzLnNkay5yZW1vdmVJbmNldGFuY2UodGhpcy5vcHRpb25zLmlkKVxyXG4gICAgYXdhaXQgc3luY0RhdGEodGhpcy5zZGssIHRoaXMub3B0aW9ucy5pZClcclxuICB9XHJcblxyXG4gIF9hZGRMaW5rKCkge1xyXG4gICAgLy8gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZVxyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdsaW5rX2FkZCcpWzBdXHJcbiAgICAgICAgLnZhbHVlXHJcbiAgICApIHtcclxuICAgICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnQucHVzaCh7XHJcbiAgICAgICAgbmFtZTogJ+mTvuaOpScsXHJcbiAgICAgICAgdXJsOiB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFxyXG4gICAgICAgICAgJ2xpbmtfYWRkJ1xyXG4gICAgICAgIClbMF0udmFsdWVcclxuICAgICAgfSlcclxuICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcclxuICAgICAgICAnbGlua19hZGQnXHJcbiAgICAgIClbMF0udmFsdWUgPSAnJ1xyXG4gICAgICB0aGlzLmF0dHJpYnV0ZUxpbmsgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudFxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5EaWFsb2cuY2xpY2tBZGRMaW5rICYmIHRoaXMuRGlhbG9nLmNsaWNrQWRkTGluaygpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhZGRBdHRyaWJ1dGVMaW5rKGxpbmspIHtcclxuICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50LnB1c2goe1xyXG4gICAgICBuYW1lOiAn6ZO+5o6lJyxcclxuICAgICAgdXJsOiBsaW5rXHJcbiAgICB9KVxyXG4gICAgdGhpcy5hdHRyaWJ1dGVMaW5rID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnRcclxuICB9XHJcblxyXG4gIF9hZGRScigpIHtcclxuICAgIGlmIChcclxuICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcclxuICAgICAgICAndnJfYWRkJ1xyXG4gICAgICApWzBdLnZhbHVlXHJcbiAgICApIHtcclxuICAgICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52ci5jb250ZW50LnB1c2goe1xyXG4gICAgICAgIG5hbWU6ICflhajmma/lm74nICxcclxuICAgICAgICB1cmw6IHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXHJcbiAgICAgICAgICAndnJfYWRkJ1xyXG4gICAgICAgIClbMF0udmFsdWVcclxuICAgICAgfSlcclxuICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcclxuICAgICAgICAndnJfYWRkJ1xyXG4gICAgICApWzBdLnZhbHVlID0gJydcclxuICAgICAgdGhpcy5hdHRyaWJ1dGVWciA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudFxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5EaWFsb2cuY2xpY2tBZGRWciAmJiB0aGlzLkRpYWxvZy5jbGlja0FkZFZyKClcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFkZEF0dHJpYnV0ZVJyKHZyKSB7XHJcbiAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnQucHVzaCh7XHJcbiAgICAgIG5hbWU6ICflhajmma/lm74nICxcclxuICAgICAgdXJsOiB2clxyXG4gICAgfSlcclxuICAgIHRoaXMuYXR0cmlidXRlVnIgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnRcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIOaJk+W8gOWvjOaWh+acrOahhlxyXG4gICAqL1xyXG4gIG9wZW5SaWNoVGV4dEVkaXRvcihlKSB7XHJcbiAgICByaWNoVGV4dC5vcGVuKFxyXG4gICAgICB0aGlzLm9wdGlvbnMuaWQsXHJcbiAgICAgIHRoaXMub3B0aW9ucy5uYW1lLFxyXG4gICAgICB0aGlzLm9wdGlvbnMucmljaFRleHRDb250ZW50XHJcbiAgICApXHJcbiAgICByaWNoVGV4dC5wcmltYXJ5Q2FsbEJhY2sgPSBjb250ZW50ID0+IHtcclxuICAgICAgdGhpcy5vcHRpb25zLnJpY2hUZXh0Q29udGVudCA9IGNvbnRlbnRcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKkBkZXNjIOaJk+W8gOW5s+enu+WKn+iDvVxyXG4gICAqXHJcbiAgICogQG1lbWJlck9mIFNvdXJjZVxyXG4gICAqIEBwYXJhbSBzdGF0dXMge2Jvb2xlYW59XHJcbiAgICpcclxuICAgKiAqL1xyXG4gIHNldCBwb3NpdGlvbkVkaXRpbmcoc3RhdHVzKSB7XHJcbiAgICBQb2x5Z29uT2JqZWN0LmNsb3NlTm9kZUVkaXQodGhpcylcclxuICAgIGlmIChZSi5NZWFzdXJlLkdldE1lYXN1cmVTdGF0dXMoKSB8fCAhdGhpcy5zZGsgfHwgIXRoaXMuc2RrLnZpZXdlciB8fCAhdGhpcy5lbnRpdHkpIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzXHJcbiAgICB0aGlzLmV2ZW50ICYmIHRoaXMuZXZlbnQuZGVzdHJveSgpXHJcbiAgICB0aGlzLmV2ZW50ID0gbmV3IE1vdXNlRXZlbnQodGhpcy5zZGspXHJcbiAgICB0aGlzLm9wZXJhdGUucG9zaXRpb25FZGl0aW5nID0gc3RhdHVzXHJcblxyXG4gICAgaWYgKHN0YXR1cyA9PT0gdHJ1ZSkge1xyXG4gICAgICB0aGlzLnByZXZpb3VzID0ge1xyXG4gICAgICAgIHBvc2l0aW9uczogWy4uLnRoaXMucG9zaXRpb25zXVxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMudGlwICYmIHRoaXMudGlwLmRlc3Ryb3koKVxyXG4gICAgICB0aGlzLnRpcCA9IG5ldyBNb3VzZVRpcCgn54K55Ye76byg5qCH5bem6ZSu56Gu6K6k77yM5Y+z6ZSu5Y+W5raIJywgdGhpcy5zZGspXHJcbiAgICAgIHRoaXMubGFiZWwgJiZcclxuICAgICAgICAodGhpcy5sYWJlbC5lbnRpdHkuYmlsbGJvYXJkLmNvbG9yID0gQ2VzaXVtLkNvbG9yLmZyb21Dc3NDb2xvclN0cmluZyhcclxuICAgICAgICAgIGByZ2JhKDI1NSwyNTUsMjU1LDAuOSlgXHJcbiAgICAgICAgKSlcclxuICAgICAgdGhpcy5waWNraW5nID0gZmFsc2VcclxuICAgICAgbGV0IGFycmF5ID0gW11cclxuICAgICAgbGV0IHBvc2l0aW9ucyA9IFsuLi50aGlzLnBvc2l0aW9uc11cclxuICAgICAgbGV0IHBvc2l0aW9uczg0ID0gdGhpcy5kZWVwQ29weU9iaih0aGlzLm9wdGlvbnMucG9zaXRpb25zKVxyXG4gICAgICBsZXQgZnJvbURlZ3JlZXNBcnJheSA9IFtdXHJcblxyXG4gICAgICBsZXQgZGlzcGFyaXR5ID0gW11cclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBsZXQgcG9zaXRpb24gPSB0aGlzLmNhcnRlc2lhbjNUb3dnczg0KHBvc2l0aW9uc1tpXSwgdGhpcy5zZGsudmlld2VyKVxyXG4gICAgICAgIGFycmF5LnB1c2goW3Bvc2l0aW9uLmxuZywgcG9zaXRpb24ubGF0XSlcclxuICAgICAgfVxyXG4gICAgICBsZXQgZmlyc3Rwb3NpdGlvbiA9IHRoaXMuY2FydGVzaWFuM1Rvd2dzODQocG9zaXRpb25zWzBdLCB0aGlzLnNkay52aWV3ZXIpXHJcbiAgICAgIGFycmF5LnB1c2goW2ZpcnN0cG9zaXRpb24ubG5nLCBmaXJzdHBvc2l0aW9uLmxhdF0pXHJcbiAgICAgIHZhciBwb2x5Z29uID0gdHVyZi5wb2x5Z29uKFthcnJheV0pXHJcbiAgICAgIHZhciBjZW50cm9pZCA9IHR1cmYuY2VudHJvaWQocG9seWdvbilcclxuICAgICAgbGV0IGNlbnRlciA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzKFxyXG4gICAgICAgIC4uLmNlbnRyb2lkLmdlb21ldHJ5LmNvb3JkaW5hdGVzXHJcbiAgICAgIClcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBkaXNwYXJpdHkucHVzaCh7XHJcbiAgICAgICAgICB4OiBjZW50ZXIueCAtIHBvc2l0aW9uc1tpXS54LFxyXG4gICAgICAgICAgeTogY2VudGVyLnkgLSBwb3NpdGlvbnNbaV0ueSxcclxuICAgICAgICAgIHo6IGNlbnRlci56IC0gcG9zaXRpb25zW2ldLnpcclxuICAgICAgICB9KVxyXG4gICAgICB9XHJcbiAgICAgIGxldCBuZXdwb3NpdGlvbnMgPSBbXVxyXG4gICAgICBsZXQgbGVmdEV2ZW50ID0gKG1vdmVtZW50LCBjYXJ0ZXNpYW4pID0+IHtcclxuICAgICAgICBsZXQgcG9zaXRpb244NCA9IHRoaXMuY2FydGVzaWFuM1Rvd2dzODQoY2FydGVzaWFuLCB0aGlzLnNkay52aWV3ZXIpXHJcbiAgICAgICAgdGhpcy5ldmVudC5tb3VzZV9tb3ZlKCgpID0+IHsgfSlcclxuICAgICAgICB0aGlzLmV2ZW50Lm1vdXNlX2xlZnQoKCkgPT4geyB9KVxyXG4gICAgICAgIHRoaXMuZXZlbnQubW91c2VfcmlnaHQoKCkgPT4geyB9KVxyXG4gICAgICAgIG5ld3Bvc2l0aW9ucyA9IFtdXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkaXNwYXJpdHkubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGxldCBwb3MzID0ge1xyXG4gICAgICAgICAgICB4OiBjYXJ0ZXNpYW4ueCAtIGRpc3Bhcml0eVtpXS54LFxyXG4gICAgICAgICAgICB5OiBjYXJ0ZXNpYW4ueSAtIGRpc3Bhcml0eVtpXS55LFxyXG4gICAgICAgICAgICB6OiBjYXJ0ZXNpYW4ueiAtIGRpc3Bhcml0eVtpXS56XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBuZXdwb3NpdGlvbnMucHVzaChwb3MzKVxyXG4gICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXSA9IHRoaXMuY2FydGVzaWFuM1Rvd2dzODQoXHJcbiAgICAgICAgICAgIHBvczMsXHJcbiAgICAgICAgICAgIHRoaXMuc2RrLnZpZXdlclxyXG4gICAgICAgICAgKVxyXG4gICAgICAgICAgaWYgKF90aGlzLl9lbG1zLmxuZyAmJiBfdGhpcy5fZWxtcy5sbmdbaV0pIHtcclxuICAgICAgICAgICAgX3RoaXMuX2VsbXMubG5nW2ldLmlubmVySFRNTCA9IHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubG5nLnRvRml4ZWQoOClcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChfdGhpcy5fZWxtcy5sYXQgJiYgX3RoaXMuX2VsbXMubGF0W2ldKSB7XHJcbiAgICAgICAgICAgIF90aGlzLl9lbG1zLmxhdFtpXS5pbm5lckhUTUwgPSB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxhdC50b0ZpeGVkKDgpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnByZXZpb3VzID0gbnVsbFxyXG4gICAgICAgIGZyb21EZWdyZWVzQXJyYXkgPSBbXVxyXG4gICAgICAgIHRoaXMuaGVpZ2h0TW9kZSA9IHRoaXMuaGVpZ2h0TW9kZVxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuZXZlbnQubW91c2VfbW92ZSgobW92ZW1lbnQsIGNhcnRlc2lhbikgPT4ge1xyXG4gICAgICAgIGxldCBwb3NpdGlvbjg0ID0gdGhpcy5jYXJ0ZXNpYW4zVG93Z3M4NChjYXJ0ZXNpYW4sIHRoaXMuc2RrLnZpZXdlcilcclxuICAgICAgICBuZXdwb3NpdGlvbnMgPSBbXVxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGlzcGFyaXR5Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBsZXQgcG9zMyA9IHtcclxuICAgICAgICAgICAgeDogY2FydGVzaWFuLnggLSBkaXNwYXJpdHlbaV0ueCxcclxuICAgICAgICAgICAgeTogY2FydGVzaWFuLnkgLSBkaXNwYXJpdHlbaV0ueSxcclxuICAgICAgICAgICAgejogY2FydGVzaWFuLnogLSBkaXNwYXJpdHlbaV0uelxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgbmV3cG9zaXRpb25zLnB1c2gocG9zMylcclxuICAgICAgICAgIHBvc2l0aW9uczg0W2ldID0gdGhpcy5jYXJ0ZXNpYW4zVG93Z3M4NChcclxuICAgICAgICAgICAgcG9zMyxcclxuICAgICAgICAgICAgdGhpcy5zZGsudmlld2VyXHJcbiAgICAgICAgICApXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgZ3JvdW5kID0gZmFsc2VcclxuICAgICAgICBsZXQgYXJyYXkgPSBbXVxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9zaXRpb25zODQubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGFycmF5LnB1c2goW3Bvc2l0aW9uczg0W2ldLmxuZywgcG9zaXRpb25zODRbaV0ubGF0XSlcclxuICAgICAgICB9XHJcbiAgICAgICAgYXJyYXkucHVzaChbcG9zaXRpb25zODRbMF0ubG5nLCBwb3NpdGlvbnM4NFswXS5sYXRdKVxyXG4gICAgICAgIGxldCBoZWlnaHQgPSAwXHJcbiAgICAgICAgbGV0IHBvbHlnb24gPSB0dXJmLnBvbHlnb24oW2FycmF5XSlcclxuICAgICAgICBsZXQgY2VudHJvaWQgPSB0dXJmLmNlbnRyb2lkKHBvbHlnb24pXHJcbiAgICAgICAgc3dpdGNoICh0aGlzLm9wdGlvbnMuaGVpZ2h0TW9kZSkge1xyXG4gICAgICAgICAgY2FzZSAnMCc6XHJcbiAgICAgICAgICBjYXNlIDA6XHJcbiAgICAgICAgICAgIGdyb3VuZCA9IGZhbHNlXHJcbiAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICBjYXNlICcxJzpcclxuICAgICAgICAgIGNhc2UgMTpcclxuICAgICAgICAgICAgaGVpZ2h0ID0gdGhpcy5zZGsudmlld2VyLnNjZW5lLmdsb2JlLmdldEhlaWdodChDZXNpdW0uQ2FydG9ncmFwaGljLmZyb21EZWdyZWVzKGNlbnRyb2lkLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzBdLCBjZW50cm9pZC5nZW9tZXRyeS5jb29yZGluYXRlc1sxXSkpXHJcbiAgICAgICAgICAgIGdyb3VuZCA9IGZhbHNlXHJcbiAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICBjYXNlICcyJzpcclxuICAgICAgICAgIGNhc2UgMjpcclxuICAgICAgICAgICAgZ3JvdW5kID0gdHJ1ZVxyXG4gICAgICAgICAgICBicmVha1xyXG4gICAgICAgIH1cclxuICAgICAgICBmcm9tRGVncmVlc0FycmF5ID0gW11cclxuICAgICAgICBpZiAoIWdyb3VuZCkge1xyXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb3NpdGlvbnM4NC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBmcm9tRGVncmVlc0FycmF5LnB1c2goXHJcbiAgICAgICAgICAgICAgcG9zaXRpb25zODRbaV0ubG5nLFxyXG4gICAgICAgICAgICAgIHBvc2l0aW9uczg0W2ldLmxhdCxcclxuICAgICAgICAgICAgICB0aGlzLmhlaWdodCArIGhlaWdodFxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLnBvc2l0aW9ucyA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzQXJyYXlIZWlnaHRzKFxyXG4gICAgICAgICAgICBmcm9tRGVncmVlc0FycmF5XHJcbiAgICAgICAgICApXHJcbiAgICAgICAgICB0aGlzLmxhYmVsLnBvc2l0aW9uID0gW3Bvc2l0aW9uODQubG5nLCBwb3NpdGlvbjg0LmxhdCwgdGhpcy5oZWlnaHQgKyBoZWlnaHRdXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9zaXRpb25zODQubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgZnJvbURlZ3JlZXNBcnJheS5wdXNoKHBvc2l0aW9uczg0W2ldLmxuZywgcG9zaXRpb25zODRbaV0ubGF0KVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5wb3NpdGlvbnMgPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlc0FycmF5KGZyb21EZWdyZWVzQXJyYXkpXHJcblxyXG4gICAgICAgICAgbGV0IG9iamVjdHNUb0V4Y2x1ZGUgPSBbLi4udGhpcy5zZGsudmlld2VyLmVudGl0aWVzLnZhbHVlc11cclxuICAgICAgICAgIHRoaXMuZ2V0Q2xhbXBUb0hlaWdodCh7XHJcbiAgICAgICAgICAgIGxuZzogcG9zaXRpb244NC5sbmcsXHJcbiAgICAgICAgICAgIGxhdDogcG9zaXRpb244NC5sYXRcclxuICAgICAgICAgIH0sIG9iamVjdHNUb0V4Y2x1ZGUpLnRoZW4oaGVpZ2h0ID0+IHtcclxuICAgICAgICAgICAgdGhpcy5sYWJlbC5wb3NpdGlvbiA9IFtwb3NpdGlvbjg0LmxuZywgcG9zaXRpb244NC5sYXQsIGhlaWdodF1cclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnRpcC5zZXRQb3NpdGlvbihcclxuICAgICAgICAgIGNhcnRlc2lhbixcclxuICAgICAgICAgIG1vdmVtZW50LmVuZFBvc2l0aW9uLngsXHJcbiAgICAgICAgICBtb3ZlbWVudC5lbmRQb3NpdGlvbi55XHJcbiAgICAgICAgKVxyXG4gICAgICB9KVxyXG4gICAgICB0aGlzLmV2ZW50Lm1vdXNlX2xlZnQobGVmdEV2ZW50KVxyXG4gICAgICB0aGlzLmV2ZW50Lm1vdXNlX3JpZ2h0KChtb3ZlbWVudCwgY2FydGVzaWFuKSA9PiB7XHJcbiAgICAgICAgdGhpcy5oZWlnaHRNb2RlID0gdGhpcy5oZWlnaHRNb2RlXHJcbiAgICAgIH0pXHJcblxyXG4gICAgICB0aGlzLmV2ZW50Lmdlc3R1cmVfcGluY2tfc3RhcnQoKG1vdmVtZW50LCBjYXJ0ZXNpYW4pID0+IHtcclxuICAgICAgICBsZXQgc3RhcnRUaW1lID0gbmV3IERhdGUoKVxyXG4gICAgICAgIGxldCBwb3MgPSB7XHJcbiAgICAgICAgICBwb3NpdGlvbjoge1xyXG4gICAgICAgICAgICB4OiAobW92ZW1lbnQucG9zaXRpb24xLnggKyBtb3ZlbWVudC5wb3NpdGlvbjIueCkgLyAyLFxyXG4gICAgICAgICAgICB5OiAobW92ZW1lbnQucG9zaXRpb24xLnkgKyBtb3ZlbWVudC5wb3NpdGlvbjIueSkgLyAyXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuZXZlbnQuZ2VzdHVyZV9waW5ja19lbmQoKCkgPT4ge1xyXG4gICAgICAgICAgbGV0IGVuZFRpbWUgPSBuZXcgRGF0ZSgpXHJcbiAgICAgICAgICBpZiAoZW5kVGltZSAtIHN0YXJ0VGltZSA+PSA1MDApIHtcclxuICAgICAgICAgICAgLy8g6ZW/5oyJ5Y+W5raIXHJcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb25FZGl0aW5nID0gZmFsc2VcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGxlZnRFdmVudChwb3MsIGNhcnRlc2lhbilcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgICB9KVxyXG5cclxuICAgICAgdGhpcy5lbnRpdHkucG9seWdvbi5oaWVyYXJjaHkgPSBuZXcgQ2VzaXVtLkNhbGxiYWNrUHJvcGVydHkoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHJldHVybiBuZXcgQ2VzaXVtLlBvbHlnb25IaWVyYXJjaHkoX3RoaXMucG9zaXRpb25zKVxyXG4gICAgICB9LCBmYWxzZSlcclxuICAgICAgdGhpcy5lbnRpdHkucG9seWxpbmUucG9zaXRpb25zID0gbmV3IENlc2l1bS5DYWxsYmFja1Byb3BlcnR5KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICByZXR1cm4gWy4uLl90aGlzLnBvc2l0aW9ucywgX3RoaXMucG9zaXRpb25zWzBdLCBfdGhpcy5wb3NpdGlvbnNbMV1dXHJcbiAgICAgIH0sIGZhbHNlKVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKCF0aGlzLnByZXZpb3VzKSB7XHJcbiAgICAgICAgdGhpcy5wcmV2aW91cyA9IHtcclxuICAgICAgICAgIHBvc2l0aW9uczogWy4uLnRoaXMucG9zaXRpb25zXVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICB0aGlzLnBvc2l0aW9ucyA9IFsuLi50aGlzLnByZXZpb3VzLnBvc2l0aW9uc11cclxuICAgICAgfVxyXG4gICAgICBpZiAoIXRoaXMuc2RrIHx8ICF0aGlzLnNkay52aWV3ZXIgfHwgIXRoaXMubGFiZWwgfHwgIXRoaXMubGFiZWwuZW50aXR5KSB7XHJcbiAgICAgICAgdGhpcy5sYWJlbC5lbnRpdHkuYmlsbGJvYXJkLmNvbG9yID0gQ2VzaXVtLkNvbG9yLmZyb21Dc3NDb2xvclN0cmluZyhcclxuICAgICAgICAgIGByZ2JhKDI1NSwyNTUsMjU1LDEpYFxyXG4gICAgICAgIClcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnBpY2tpbmcgPSB0cnVlXHJcbiAgICAgIGlmICh0aGlzLmV2ZW50KSB7XHJcbiAgICAgICAgdGhpcy5ldmVudC5tb3VzZV9tb3ZlKCgpID0+IHsgfSlcclxuICAgICAgICB0aGlzLmV2ZW50Lm1vdXNlX2xlZnQoKCkgPT4geyB9KVxyXG4gICAgICAgIHRoaXMuZXZlbnQubW91c2VfcmlnaHQoKCkgPT4geyB9KVxyXG4gICAgICAgIHRoaXMuZXZlbnQuZGVzdHJveSgpXHJcbiAgICAgIH1cclxuICAgICAgdGhpcy50aXAgJiYgdGhpcy50aXAuZGVzdHJveSgpXHJcbiAgICAgIGxldCBwb3NpdGlvbnMgPSBbW11dXHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5wcmV2aW91cy5wb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBsZXQgcG9zaXRpb25zODQgPSB0aGlzLmNhcnRlc2lhbjNUb3dnczg0KFxyXG4gICAgICAgICAgdGhpcy5wcmV2aW91cy5wb3NpdGlvbnNbaV0sXHJcbiAgICAgICAgICB0aGlzLnNkay52aWV3ZXJcclxuICAgICAgICApXHJcbiAgICAgICAgcG9zaXRpb25zWzBdLnB1c2goW3Bvc2l0aW9uczg0LmxuZywgcG9zaXRpb25zODQubGF0XSlcclxuICAgICAgfVxyXG4gICAgICBsZXQgcG9zaXRpb25zODQgPSB0aGlzLmNhcnRlc2lhbjNUb3dnczg0KFxyXG4gICAgICAgIHRoaXMucHJldmlvdXMucG9zaXRpb25zWzBdLFxyXG4gICAgICAgIHRoaXMuc2RrLnZpZXdlclxyXG4gICAgICApXHJcbiAgICAgIHBvc2l0aW9uc1swXS5wdXNoKFtwb3NpdGlvbnM4NC5sbmcsIHBvc2l0aW9uczg0LmxhdF0pXHJcbiAgICAgIGxldCBwb2x5Z29uID0gdHVyZi5wb2x5Z29uKHBvc2l0aW9ucylcclxuICAgICAgbGV0IGNlbnRyb2lkID0gdHVyZi5jZW50cm9pZChwb2x5Z29uKVxyXG5cclxuICAgICAgbGV0IGdyb3VuZCA9IGZhbHNlXHJcbiAgICAgIGxldCBoZWlnaHQgPSAwXHJcbiAgICAgIHN3aXRjaCAodGhpcy5vcHRpb25zLmhlaWdodE1vZGUpIHtcclxuICAgICAgICBjYXNlICcwJzpcclxuICAgICAgICBjYXNlIDA6XHJcbiAgICAgICAgICBncm91bmQgPSBmYWxzZVxyXG4gICAgICAgICAgYnJlYWtcclxuICAgICAgICBjYXNlICcxJzpcclxuICAgICAgICBjYXNlIDE6XHJcbiAgICAgICAgICBoZWlnaHQgPSB0aGlzLnNkay52aWV3ZXIuc2NlbmUuZ2xvYmUuZ2V0SGVpZ2h0KENlc2l1bS5DYXJ0b2dyYXBoaWMuZnJvbURlZ3JlZXMoY2VudHJvaWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMF0sIGNlbnRyb2lkLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzFdKSlcclxuICAgICAgICAgIGdyb3VuZCA9IGZhbHNlXHJcbiAgICAgICAgICBicmVha1xyXG4gICAgICAgIGNhc2UgJzInOlxyXG4gICAgICAgIGNhc2UgMjpcclxuICAgICAgICAgIGdyb3VuZCA9IHRydWVcclxuICAgICAgICAgIGJyZWFrXHJcbiAgICAgIH1cclxuICAgICAgaWYgKCFncm91bmQpIHtcclxuICAgICAgICB0aGlzLmxhYmVsLnBvc2l0aW9uID0gW1xyXG4gICAgICAgICAgY2VudHJvaWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMF0sXHJcbiAgICAgICAgICBjZW50cm9pZC5nZW9tZXRyeS5jb29yZGluYXRlc1sxXSxcclxuICAgICAgICAgIHRoaXMuaGVpZ2h0ICsgaGVpZ2h0XHJcbiAgICAgICAgXVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMubGFiZWwucG9zaXRpb24gPSBbXHJcbiAgICAgICAgICBjZW50cm9pZC5nZW9tZXRyeS5jb29yZGluYXRlc1swXSxcclxuICAgICAgICAgIGNlbnRyb2lkLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzFdXHJcbiAgICAgICAgXVxyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLmVudGl0eS5wb2x5Z29uLmhpZXJhcmNoeSA9IG5ldyBDZXNpdW0uUG9seWdvbkhpZXJhcmNoeShfdGhpcy5wcmV2aW91cy5wb3NpdGlvbnMpXHJcbiAgICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLnBvc2l0aW9ucyA9IFtcclxuICAgICAgICAuLi5fdGhpcy5wcmV2aW91cy5wb3NpdGlvbnMsXHJcbiAgICAgICAgX3RoaXMucHJldmlvdXMucG9zaXRpb25zWzBdLFxyXG4gICAgICAgIF90aGlzLnByZXZpb3VzLnBvc2l0aW9uc1sxXVxyXG4gICAgICBdXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgcG9zaXRpb25FZGl0aW5nKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3BlcmF0ZS5wb3NpdGlvbkVkaXRpbmdcclxuICB9XHJcblxyXG4gIHN0YXRpYyBFdmVudEJpbmRpbmcodGhhdCwgZWxlbWVudHMpIHtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgbGV0IEV2ZW50ID0gW11cclxuICAgICAgbGV0IGlzRXZlbnQgPSBmYWxzZVxyXG4gICAgICBsZXQgcmVtb3ZlTmFtZSA9IFtdXHJcbiAgICAgIGlmICghZWxlbWVudHNbaV0gfHwgIWVsZW1lbnRzW2ldLmF0dHJpYnV0ZXMpIHtcclxuICAgICAgICBjb250aW51ZVxyXG4gICAgICB9XHJcbiAgICAgIGZvciAobGV0IG0gb2YgZWxlbWVudHNbaV0uYXR0cmlidXRlcykge1xyXG4gICAgICAgIHN3aXRjaCAobS5uYW1lKSB7XHJcbiAgICAgICAgICBjYXNlICdAbW9kZWwnOiB7XHJcbiAgICAgICAgICAgIGlzRXZlbnQgPSB0cnVlXHJcbiAgICAgICAgICAgIGlmIChlbGVtZW50c1tpXS50eXBlID09ICdjaGVja2JveCcpIHtcclxuICAgICAgICAgICAgICBFdmVudC5wdXNoKGUgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhhdFttLnZhbHVlXSA9IGUudGFyZ2V0LmNoZWNrZWRcclxuICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgIGVsZW1lbnRzW2ldLmNoZWNrZWQgPSB0aGF0W20udmFsdWVdXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgRXZlbnQucHVzaChlID0+IHtcclxuICAgICAgICAgICAgICAgIGxldCB2YWx1ZSA9IGUudGFyZ2V0LnZhbHVlXHJcbiAgICAgICAgICAgICAgICBpZiAoZS50YXJnZXQudHlwZSA9PSAnbnVtYmVyJykge1xyXG4gICAgICAgICAgICAgICAgICBpZiAoZS5kYXRhICE9ICcuJyAmJiAoZS5kYXRhICE9ICctJyB8fCBlLnRhcmdldC52YWx1ZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IE51bWJlcih2YWx1ZSlcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZS50YXJnZXQubWF4ICYmIHZhbHVlID4gTnVtYmVyKGUudGFyZ2V0Lm1heCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gTnVtYmVyKGUudGFyZ2V0Lm1heClcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGUudGFyZ2V0Lm1pbiAmJiB2YWx1ZSA8IE51bWJlcihlLnRhcmdldC5taW4pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IE51bWJlcihlLnRhcmdldC5taW4pXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoYXRbbS52YWx1ZV0gPSB2YWx1ZVxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICB0aGF0W20udmFsdWVdID0gdmFsdWVcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgIGlmIChlbGVtZW50c1tpXS5ub2RlTmFtZSA9PSAnSU1HJykge1xyXG4gICAgICAgICAgICAgICAgZWxlbWVudHNbaV0uc3JjID0gdGhhdFttLnZhbHVlXVxyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBlbGVtZW50c1tpXS52YWx1ZSA9IHRoYXRbbS52YWx1ZV1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHRoYXQuX2VsbXNbbS52YWx1ZV0pIHtcclxuICAgICAgICAgICAgICB0aGF0Ll9lbG1zW20udmFsdWVdLnB1c2goZWxlbWVudHNbaV0pXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgdGhhdC5fZWxtc1ttLnZhbHVlXSA9IFtlbGVtZW50c1tpXV1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZW1vdmVOYW1lLnB1c2gobS5uYW1lKVxyXG4gICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgY2FzZSAnQGNsaWNrJzoge1xyXG4gICAgICAgICAgICBlbGVtZW50c1tpXS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGUgPT4ge1xyXG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgdGhhdFttLnZhbHVlXSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgdGhhdFttLnZhbHVlXShlKVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgcmVtb3ZlTmFtZS5wdXNoKG0ubmFtZSlcclxuICAgICAgICAgICAgLy8gZWxlbWVudHNbaV0uYXR0cmlidXRlcy5yZW1vdmVOYW1lZEl0ZW0obS5uYW1lKVxyXG4gICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgY2FzZSAnQGNoYW5nZSc6IHtcclxuICAgICAgICAgICAgaXNFdmVudCA9IHRydWVcclxuICAgICAgICAgICAgRXZlbnQucHVzaChlID0+IHtcclxuICAgICAgICAgICAgICBsZXQgdmFsdWUgPSBlLnRhcmdldC52YWx1ZVxyXG4gICAgICAgICAgICAgIGlmIChlLnRhcmdldC50eXBlID09ICdudW1iZXInICYmIHZhbHVlICE9ICcnKSB7XHJcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IE51bWJlcih2YWx1ZSlcclxuICAgICAgICAgICAgICAgIGUudGFyZ2V0LnZhbHVlID0gdmFsdWVcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGF0W20udmFsdWVdID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgICAgICB0aGF0W20udmFsdWVdKGUsIHZhbHVlKVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gZWxlbWVudHNbaV0uYXR0cmlidXRlc1ttXSA9IHVuZGVmaW5lZFxyXG4gICAgICB9XHJcbiAgICAgIGZvciAobGV0IG4gPSAwOyBuIDwgcmVtb3ZlTmFtZS5sZW5ndGg7IG4rKykge1xyXG4gICAgICAgIGVsZW1lbnRzW2ldLmF0dHJpYnV0ZXMucmVtb3ZlTmFtZWRJdGVtKHJlbW92ZU5hbWVbbl0pXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChpc0V2ZW50KSB7XHJcbiAgICAgICAgbGV0IHZlbnRUeXBlID0gJ2lucHV0J1xyXG4gICAgICAgIGlmIChlbGVtZW50c1tpXS50YWdOYW1lICE9ICdJTlBVVCcgfHwgZWxlbWVudHNbaV0udHlwZSA9PSAnY2hlY2tib3gnKSB7XHJcbiAgICAgICAgICB2ZW50VHlwZSA9ICdjaGFuZ2UnXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsZW1lbnRzW2ldLmFkZEV2ZW50TGlzdGVuZXIodmVudFR5cGUsIGUgPT4ge1xyXG4gICAgICAgICAgZm9yIChsZXQgdCA9IDA7IHQgPCBFdmVudC5sZW5ndGg7IHQrKykge1xyXG4gICAgICAgICAgICBFdmVudFt0XShlKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHN0YXRpYyBub2RlRWRpdCh0aGF0LCBjYiA9ICgpID0+IHsgfSkge1xyXG4gICAgdGhhdC5wb3NpdGlvbkVkaXRpbmcgPSBmYWxzZVxyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIGlmIChZSi5NZWFzdXJlLkdldE1lYXN1cmVTdGF0dXMoKSkge1xyXG4gICAgICAgIGNiKCfkuIrkuIDmrKHmtYvph4/mnKrnu5PmnZ8nKVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIFlKLk1lYXN1cmUuU2V0TWVhc3VyZVN0YXR1cyh0cnVlKVxyXG4gICAgICAgIHRoYXQucGlja2luZyA9IGZhbHNlXHJcbiAgICAgICAgdGhhdC50aXAgPSBuZXcgTW91c2VUaXAoJ+ivt+mAieaLqeS4gOS4qumhtueCue+8jOWPs+mUruWPlua2iCcsIHRoYXQuc2RrKVxyXG4gICAgICAgIHRoYXQuZXZlbnQgPSBuZXcgTW91c2VFdmVudCh0aGF0LnNkaylcclxuICAgICAgICB0aGF0Lm5vZGVQb2ludHMgPSBbXVxyXG4gICAgICAgIGxldCBzZWxlY3RQb2ludFxyXG4gICAgICAgIGxldCBvcmlnaW5hbFBvc2l0aW9uXHJcbiAgICAgICAgbGV0IG5ld3Bvc2l0aW9ucyA9IFtdXHJcbiAgICAgICAgbGV0IGZyb21EZWdyZWVzQXJyYXkgPSBbXVxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhhdC5vcHRpb25zLnBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgZnJvbURlZ3JlZXNBcnJheS5wdXNoKFxyXG4gICAgICAgICAgICB0aGF0Lm9wdGlvbnMucG9zaXRpb25zW2ldLmxuZyxcclxuICAgICAgICAgICAgdGhhdC5vcHRpb25zLnBvc2l0aW9uc1tpXS5sYXRcclxuICAgICAgICAgIClcclxuICAgICAgICB9XHJcbiAgICAgICAgbmV3cG9zaXRpb25zID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXNBcnJheShmcm9tRGVncmVlc0FycmF5KVxyXG5cclxuICAgICAgICBsZXQgYWRkZWQgPSBmYWxzZVxyXG4gICAgICAgIGxldCBsZWZ0RXZlbnQgPSBhc3luYyAobW92ZW1lbnQsIGNhcnRlc2lhbikgPT4ge1xyXG4gICAgICAgICAgaWYgKHNlbGVjdFBvaW50KSB7XHJcbiAgICAgICAgICAgIHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbc2VsZWN0UG9pbnQuaW5kZXhdID0gdGhhdC5jYXJ0ZXNpYW4zVG93Z3M4NChcclxuICAgICAgICAgICAgICBjYXJ0ZXNpYW4sXHJcbiAgICAgICAgICAgICAgdGhhdC5zZGsudmlld2VyXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICAgICAgb3JpZ2luYWxQb3NpdGlvbiA9IHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbc2VsZWN0UG9pbnQuaW5kZXhdXHJcbiAgICAgICAgICAgIGFkZGVkID0gdHJ1ZVxyXG4gICAgICAgICAgICBsZXQgcG90SGVpZ2h0ID0gYXdhaXQgdGhhdC5nZXRDbGFtcFRvSGVpZ2h0KFxyXG4gICAgICAgICAgICAgIHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbc2VsZWN0UG9pbnQuaW5kZXhdXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICAgICAgbGV0IGVudGl0eSA9IHRoYXQuc2RrLnZpZXdlci5lbnRpdGllcy5hZGQoe1xyXG4gICAgICAgICAgICAgIG5hbWU6ICdub2RlLXNlY29uZGFyeS1lZGl0LXBvaW50JyxcclxuICAgICAgICAgICAgICBwb3NpdGlvbjogQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXMoXHJcbiAgICAgICAgICAgICAgICB0aGF0Lm9wdGlvbnMucG9zaXRpb25zW3NlbGVjdFBvaW50LmluZGV4XS5sbmcsXHJcbiAgICAgICAgICAgICAgICB0aGF0Lm9wdGlvbnMucG9zaXRpb25zW3NlbGVjdFBvaW50LmluZGV4XS5sYXQsXHJcbiAgICAgICAgICAgICAgICBwb3RIZWlnaHRcclxuICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgIGJpbGxib2FyZDoge1xyXG4gICAgICAgICAgICAgICAgaW1hZ2U6IHRoYXQuZ2V0U291cmNlUm9vdFBhdGgoKSArICcvaW1nL3BvaW50LnBuZycsXHJcbiAgICAgICAgICAgICAgICB3aWR0aDogMTUsXHJcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IDE1LFxyXG4gICAgICAgICAgICAgICAgZGlzYWJsZURlcHRoVGVzdERpc3RhbmNlOiBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksXHJcbiAgICAgICAgICAgICAgICBjb2xvcjogQ2VzaXVtLkNvbG9yLldISVRFLndpdGhBbHBoYSgwLjk5KVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgdGhhdC5ub2RlUG9pbnRzLnNwbGljZShzZWxlY3RQb2ludC5pbmRleCwgMCwgZW50aXR5KVxyXG4gICAgICAgICAgICB0aGF0Lm9wdGlvbnMucG9zaXRpb25zLnNwbGljZShcclxuICAgICAgICAgICAgICBzZWxlY3RQb2ludC5pbmRleCxcclxuICAgICAgICAgICAgICAwLFxyXG4gICAgICAgICAgICAgIHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbc2VsZWN0UG9pbnQuaW5kZXhdXHJcbiAgICAgICAgICAgIClcclxuXHJcbiAgICAgICAgICAgIGxldCBwb3NpdGlvbnMgPSB0aGF0Lm9wdGlvbnMucG9zaXRpb25zXHJcbiAgICAgICAgICAgIGxldCBmcm9tRGVncmVlc0FycmF5ID0gW11cclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICBmcm9tRGVncmVlc0FycmF5LnB1c2gocG9zaXRpb25zW2ldLmxuZywgcG9zaXRpb25zW2ldLmxhdClcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGF0LnBvc2l0aW9ucyA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzQXJyYXkoXHJcbiAgICAgICAgICAgICAgZnJvbURlZ3JlZXNBcnJheVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICAgIG5ld3Bvc2l0aW9ucyA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzQXJyYXkoZnJvbURlZ3JlZXNBcnJheSlcclxuXHJcbiAgICAgICAgICAgIGxldCBvYmplY3RzVG9FeGNsdWRlID0gWy4uLnRoYXQuc2RrLnZpZXdlci5lbnRpdGllcy52YWx1ZXNdXHJcbiAgICAgICAgICAgIGlmICh0aGF0Lm9wdGlvbnMucG9zaXRpb25zLmxlbmd0aCA8IDMpIHtcclxuICAgICAgICAgICAgICB0aGF0XHJcbiAgICAgICAgICAgICAgICAuZ2V0Q2xhbXBUb0hlaWdodCh7XHJcbiAgICAgICAgICAgICAgICAgIGxuZzogdGhhdC5vcHRpb25zLnBvc2l0aW9uc1swXS5sbmcsXHJcbiAgICAgICAgICAgICAgICAgIGxhdDogdGhhdC5vcHRpb25zLnBvc2l0aW9uc1swXS5sYXRcclxuICAgICAgICAgICAgICAgIH0sIG9iamVjdHNUb0V4Y2x1ZGUpXHJcbiAgICAgICAgICAgICAgICAudGhlbihoZWlnaHQgPT4ge1xyXG4gICAgICAgICAgICAgICAgICB0aGF0LmxhYmVsLnBvc2l0aW9uID0gW1xyXG4gICAgICAgICAgICAgICAgICAgIHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbMF0ubG5nLFxyXG4gICAgICAgICAgICAgICAgICAgIHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbMF0ubGF0LFxyXG4gICAgICAgICAgICAgICAgICAgIGhlaWdodFxyXG4gICAgICAgICAgICAgICAgICBdXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIGxldCBwb3NpdGlvbnMgPSBbW11dXHJcbiAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGF0Lm9wdGlvbnMucG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBwb3NpdGlvbnNbMF0ucHVzaChbXHJcbiAgICAgICAgICAgICAgICAgIHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbaV0ubG5nLFxyXG4gICAgICAgICAgICAgICAgICB0aGF0Lm9wdGlvbnMucG9zaXRpb25zW2ldLmxhdFxyXG4gICAgICAgICAgICAgICAgXSlcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgcG9zaXRpb25zWzBdLnB1c2goW1xyXG4gICAgICAgICAgICAgICAgdGhhdC5vcHRpb25zLnBvc2l0aW9uc1swXS5sbmcsXHJcbiAgICAgICAgICAgICAgICB0aGF0Lm9wdGlvbnMucG9zaXRpb25zWzBdLmxhdFxyXG4gICAgICAgICAgICAgIF0pXHJcbiAgICAgICAgICAgICAgbGV0IHBvbHlnb24gPSB0dXJmLnBvbHlnb24ocG9zaXRpb25zKVxyXG4gICAgICAgICAgICAgIGxldCBjZW50cm9pZCA9IHR1cmYuY2VudHJvaWQocG9seWdvbilcclxuICAgICAgICAgICAgICB0aGF0XHJcbiAgICAgICAgICAgICAgICAuZ2V0Q2xhbXBUb0hlaWdodCh7XHJcbiAgICAgICAgICAgICAgICAgIGxuZzogY2VudHJvaWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMF0sXHJcbiAgICAgICAgICAgICAgICAgIGxhdDogY2VudHJvaWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMV1cclxuICAgICAgICAgICAgICAgIH0sIG9iamVjdHNUb0V4Y2x1ZGUpXHJcbiAgICAgICAgICAgICAgICAudGhlbihoZWlnaHQgPT4ge1xyXG4gICAgICAgICAgICAgICAgICB0aGF0LmxhYmVsLnBvc2l0aW9uID0gW1xyXG4gICAgICAgICAgICAgICAgICAgIGNlbnRyb2lkLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzBdLFxyXG4gICAgICAgICAgICAgICAgICAgIGNlbnRyb2lkLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzFdLFxyXG4gICAgICAgICAgICAgICAgICAgIGhlaWdodFxyXG4gICAgICAgICAgICAgICAgICBdXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGF0Lm9wdGlvbnMuYXJlYUJ5TWV0ZXIgPSB0aGF0LmNvbXB1dGVBcmVhKHRoYXQub3B0aW9ucy5wb3NpdGlvbnMpXHJcbiAgICAgICAgICAgIHN3aXRjaCAodGhhdC5vcHRpb25zWydhcmVhLXVuaXQnXSkge1xyXG4gICAgICAgICAgICAgIGNhc2UgJ+W5s+aWueexsyc6XHJcbiAgICAgICAgICAgICAgICB0aGF0LmFyZWEgPSB0aGF0Lm9wdGlvbnMuYXJlYUJ5TWV0ZXJcclxuICAgICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgICAgY2FzZSAn5bmz5pa55Y2D57GzJzpcclxuICAgICAgICAgICAgICAgIHRoYXQuYXJlYSA9IE51bWJlcihcclxuICAgICAgICAgICAgICAgICAgKHRoYXQub3B0aW9ucy5hcmVhQnlNZXRlciAvIDEwMDAwMDApLnRvRml4ZWQoOClcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgICAgY2FzZSAn5LqpJzpcclxuICAgICAgICAgICAgICAgIHRoYXQuYXJlYSA9IE51bWJlcihcclxuICAgICAgICAgICAgICAgICAgKHRoYXQub3B0aW9ucy5hcmVhQnlNZXRlciAvIDY2Ni42NjY2NjY3KS50b0ZpeGVkKDQpXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICAgIGNhc2UgJ+WFrOmhtyc6XHJcbiAgICAgICAgICAgICAgICB0aGF0LmFyZWEgPSBOdW1iZXIoKHRoYXQub3B0aW9ucy5hcmVhQnlNZXRlciAvIDEwMDAwKS50b0ZpeGVkKDYpKVxyXG4gICAgICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgdGhhdC5hcmVhID0gdGhhdC5vcHRpb25zLmFyZWFCeU1ldGVyXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHZhciBwaWNrID0gdGhhdC5zZGsudmlld2VyLnNjZW5lLnBpY2sobW92ZW1lbnQucG9zaXRpb24pXHJcbiAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICBwaWNrICYmXHJcbiAgICAgICAgICAgICAgcGljay5pZCAmJlxyXG4gICAgICAgICAgICAgIHBpY2suaWQubmFtZSAmJlxyXG4gICAgICAgICAgICAgIHBpY2suaWQubmFtZSA9PT0gJ25vZGUtc2Vjb25kYXJ5LWVkaXQtcG9pbnQnXHJcbiAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgIHNlbGVjdFBvaW50ID0gcGljay5pZFxyXG4gICAgICAgICAgICAgIHRoYXQubm9kZVBvaW50cy5zcGxpY2UocGljay5pZC5pbmRleCwgMSlcclxuICAgICAgICAgICAgICB0aGF0LnNkay52aWV3ZXIuZW50aXRpZXMucmVtb3ZlKHBpY2suaWQpXHJcbiAgICAgICAgICAgICAgdGhhdC50aXAuc2V0X3RleHQoJ+W3pumUruW8gOWni++8jOWPs+mUrue7k+adn++8jENUUkwr5Y+z6ZSu5pKk6ZSAJylcclxuICAgICAgICAgICAgICBvcmlnaW5hbFBvc2l0aW9uID0gdGhhdC5jYXJ0ZXNpYW4zVG93Z3M4NChcclxuICAgICAgICAgICAgICAgIHNlbGVjdFBvaW50LnBvc2l0aW9uLmdldFZhbHVlKCksXHJcbiAgICAgICAgICAgICAgICB0aGF0LnNkay52aWV3ZXJcclxuICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IHJpZ2h0RXZlbnQgPSAobW92ZW1lbnQsIGNhcnRlc2lhbikgPT4ge1xyXG4gICAgICAgICAgaWYgKHNlbGVjdFBvaW50KSB7XHJcbiAgICAgICAgICAgIHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbc2VsZWN0UG9pbnQuaW5kZXhdID0gb3JpZ2luYWxQb3NpdGlvblxyXG4gICAgICAgICAgICAvLyB0aGF0Lm9wdGlvbnMucG9zaXRpb25zLnNwbGljZShzZWxlY3RQb2ludC5pbmRleCwgMSlcclxuICAgICAgICAgICAgaWYgKGFkZGVkKSB7XHJcbiAgICAgICAgICAgICAgdGhhdC5vcHRpb25zLnBvc2l0aW9ucy5zcGxpY2Uoc2VsZWN0UG9pbnQuaW5kZXgsIDEpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2IobnVsbCwgdGhhdC5vcHRpb25zLnBvc2l0aW9ucylcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBZSi5NZWFzdXJlLlNldE1lYXN1cmVTdGF0dXMoZmFsc2UpXHJcbiAgICAgICAgICB0aGF0LmV2ZW50LmRlc3Ryb3koKVxyXG4gICAgICAgICAgdGhhdC50aXAuZGVzdHJveSgpXHJcbiAgICAgICAgICB0aGF0LmhlaWdodE1vZGUgPSB0aGF0LmhlaWdodE1vZGVcclxuICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICB0aGF0LmVudGl0eS5wb2x5bGluZS5jbGFtcFRvR3JvdW5kID0gdHJ1ZVxyXG4gICAgICAgIHRoYXQuZW50aXR5LnBvbHlsaW5lLmFyY1R5cGUgPSBDZXNpdW0uQXJjVHlwZS5HRU9ERVNJQ1xyXG4gICAgICAgIHRoYXQuZW50aXR5LnBvbHlnb24ucGVyUG9zaXRpb25IZWlnaHQgPSBmYWxzZVxyXG4gICAgICAgIHRoYXQuZW50aXR5LnBvbHlnb24uaGllcmFyY2h5ID0gbmV3IENlc2l1bS5DYWxsYmFja1Byb3BlcnR5KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgIHJldHVybiBuZXcgQ2VzaXVtLlBvbHlnb25IaWVyYXJjaHkobmV3cG9zaXRpb25zKVxyXG4gICAgICAgIH0sIGZhbHNlKVxyXG4gICAgICAgIHRoYXQuZW50aXR5LnBvbHlsaW5lLnBvc2l0aW9ucyA9IG5ldyBDZXNpdW0uQ2FsbGJhY2tQcm9wZXJ0eShmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICBpZiAobmV3cG9zaXRpb25zLmxlbmd0aCA+PSAzKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBbXHJcbiAgICAgICAgICAgICAgLi4ubmV3cG9zaXRpb25zLFxyXG4gICAgICAgICAgICAgIG5ld3Bvc2l0aW9uc1swXSxcclxuICAgICAgICAgICAgICBuZXdwb3NpdGlvbnNbMV0sXHJcbiAgICAgICAgICAgICAgbmV3cG9zaXRpb25zWzJdXHJcbiAgICAgICAgICAgIF1cclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXdwb3NpdGlvbnNcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LCBmYWxzZSlcclxuXHJcbiAgICAgICAgbGV0IG9iamVjdHNUb0V4Y2x1ZGUgPSBbLi4udGhhdC5zZGsudmlld2VyLmVudGl0aWVzLnZhbHVlc11cclxuICAgICAgICBpZiAodGhhdC5vcHRpb25zLnBvc2l0aW9ucy5sZW5ndGggPCAzKSB7XHJcbiAgICAgICAgICB0aGF0XHJcbiAgICAgICAgICAgIC5nZXRDbGFtcFRvSGVpZ2h0KHtcclxuICAgICAgICAgICAgICBsbmc6IHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbMF0ubG5nLFxyXG4gICAgICAgICAgICAgIGxhdDogdGhhdC5vcHRpb25zLnBvc2l0aW9uc1swXS5sYXRcclxuICAgICAgICAgICAgfSwgb2JqZWN0c1RvRXhjbHVkZSlcclxuICAgICAgICAgICAgLnRoZW4oaGVpZ2h0ID0+IHtcclxuICAgICAgICAgICAgICB0aGF0LmxhYmVsLnBvc2l0aW9uID0gW1xyXG4gICAgICAgICAgICAgICAgdGhhdC5vcHRpb25zLnBvc2l0aW9uc1swXS5sbmcsXHJcbiAgICAgICAgICAgICAgICB0aGF0Lm9wdGlvbnMucG9zaXRpb25zWzBdLmxhdCxcclxuICAgICAgICAgICAgICAgIGhlaWdodFxyXG4gICAgICAgICAgICAgIF1cclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgbGV0IHBvc2l0aW9ucyA9IFtbXV1cclxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhhdC5vcHRpb25zLnBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBwb3NpdGlvbnNbMF0ucHVzaChbXHJcbiAgICAgICAgICAgICAgdGhhdC5vcHRpb25zLnBvc2l0aW9uc1tpXS5sbmcsXHJcbiAgICAgICAgICAgICAgdGhhdC5vcHRpb25zLnBvc2l0aW9uc1tpXS5sYXRcclxuICAgICAgICAgICAgXSlcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHBvc2l0aW9uc1swXS5wdXNoKFtcclxuICAgICAgICAgICAgdGhhdC5vcHRpb25zLnBvc2l0aW9uc1swXS5sbmcsXHJcbiAgICAgICAgICAgIHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbMF0ubGF0XHJcbiAgICAgICAgICBdKVxyXG4gICAgICAgICAgbGV0IHBvbHlnb24gPSB0dXJmLnBvbHlnb24ocG9zaXRpb25zKVxyXG4gICAgICAgICAgbGV0IGNlbnRyb2lkID0gdHVyZi5jZW50cm9pZChwb2x5Z29uKVxyXG4gICAgICAgICAgdGhhdFxyXG4gICAgICAgICAgICAuZ2V0Q2xhbXBUb0hlaWdodCh7XHJcbiAgICAgICAgICAgICAgbG5nOiBjZW50cm9pZC5nZW9tZXRyeS5jb29yZGluYXRlc1swXSxcclxuICAgICAgICAgICAgICBsYXQ6IGNlbnRyb2lkLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzFdXHJcbiAgICAgICAgICAgIH0sIG9iamVjdHNUb0V4Y2x1ZGUpXHJcbiAgICAgICAgICAgIC50aGVuKGhlaWdodCA9PiB7XHJcbiAgICAgICAgICAgICAgdGhhdC5sYWJlbC5wb3NpdGlvbiA9IFtcclxuICAgICAgICAgICAgICAgIGNlbnRyb2lkLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzBdLFxyXG4gICAgICAgICAgICAgICAgY2VudHJvaWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMV0sXHJcbiAgICAgICAgICAgICAgICBoZWlnaHRcclxuICAgICAgICAgICAgICBdXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgIHRoYXQuZXZlbnQubW91c2VfbGVmdChsZWZ0RXZlbnQpXHJcblxyXG4gICAgICAgICAgdGhhdC5ldmVudC5tb3VzZV9yaWdodChyaWdodEV2ZW50KVxyXG5cclxuICAgICAgICAgIHRoYXQuZXZlbnQubW91c2VfbW92ZSgobW92ZW1lbnQsIGNhcnRlc2lhbikgPT4ge1xyXG4gICAgICAgICAgICBpZiAoc2VsZWN0UG9pbnQpIHtcclxuICAgICAgICAgICAgICB0aGF0Lm9wdGlvbnMucG9zaXRpb25zW3NlbGVjdFBvaW50LmluZGV4XSA9IHRoYXQuY2FydGVzaWFuM1Rvd2dzODQoXHJcbiAgICAgICAgICAgICAgICBjYXJ0ZXNpYW4sXHJcbiAgICAgICAgICAgICAgICB0aGF0LnNkay52aWV3ZXJcclxuICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgbGV0IHBvc2l0aW9ucyA9IHRoYXQub3B0aW9ucy5wb3NpdGlvbnNcclxuICAgICAgICAgICAgICBsZXQgZnJvbURlZ3JlZXNBcnJheSA9IFtdXHJcblxyXG4gICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBmcm9tRGVncmVlc0FycmF5LnB1c2gocG9zaXRpb25zW2ldLmxuZywgcG9zaXRpb25zW2ldLmxhdClcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgdGhhdC5wb3NpdGlvbnMgPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlc0FycmF5KFxyXG4gICAgICAgICAgICAgICAgZnJvbURlZ3JlZXNBcnJheVxyXG4gICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICBuZXdwb3NpdGlvbnMgPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlc0FycmF5KGZyb21EZWdyZWVzQXJyYXkpXHJcbiAgICAgICAgICAgICAgbGV0IG9iamVjdHNUb0V4Y2x1ZGUgPSBbLi4udGhhdC5zZGsudmlld2VyLmVudGl0aWVzLnZhbHVlc11cclxuICAgICAgICAgICAgICBpZiAodGhhdC5vcHRpb25zLnBvc2l0aW9ucy5sZW5ndGggPCAzKSB7XHJcbiAgICAgICAgICAgICAgICB0aGF0XHJcbiAgICAgICAgICAgICAgICAgIC5nZXRDbGFtcFRvSGVpZ2h0KHtcclxuICAgICAgICAgICAgICAgICAgICBsbmc6IHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbMF0ubG5nLFxyXG4gICAgICAgICAgICAgICAgICAgIGxhdDogdGhhdC5vcHRpb25zLnBvc2l0aW9uc1swXS5sYXRcclxuICAgICAgICAgICAgICAgICAgfSwgb2JqZWN0c1RvRXhjbHVkZSlcclxuICAgICAgICAgICAgICAgICAgLnRoZW4oaGVpZ2h0ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGF0LmxhYmVsLnBvc2l0aW9uID0gW1xyXG4gICAgICAgICAgICAgICAgICAgICAgdGhhdC5vcHRpb25zLnBvc2l0aW9uc1swXS5sbmcsXHJcbiAgICAgICAgICAgICAgICAgICAgICB0aGF0Lm9wdGlvbnMucG9zaXRpb25zWzBdLmxhdCxcclxuICAgICAgICAgICAgICAgICAgICAgIGhlaWdodFxyXG4gICAgICAgICAgICAgICAgICAgIF1cclxuICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgbGV0IHBvc2l0aW9ucyA9IFtbXV1cclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhhdC5vcHRpb25zLnBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICBwb3NpdGlvbnNbMF0ucHVzaChbXHJcbiAgICAgICAgICAgICAgICAgICAgdGhhdC5vcHRpb25zLnBvc2l0aW9uc1tpXS5sbmcsXHJcbiAgICAgICAgICAgICAgICAgICAgdGhhdC5vcHRpb25zLnBvc2l0aW9uc1tpXS5sYXRcclxuICAgICAgICAgICAgICAgICAgXSlcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHBvc2l0aW9uc1swXS5wdXNoKFtcclxuICAgICAgICAgICAgICAgICAgdGhhdC5vcHRpb25zLnBvc2l0aW9uc1swXS5sbmcsXHJcbiAgICAgICAgICAgICAgICAgIHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbMF0ubGF0XHJcbiAgICAgICAgICAgICAgICBdKVxyXG4gICAgICAgICAgICAgICAgbGV0IHBvbHlnb24gPSB0dXJmLnBvbHlnb24ocG9zaXRpb25zKVxyXG4gICAgICAgICAgICAgICAgbGV0IGNlbnRyb2lkID0gdHVyZi5jZW50cm9pZChwb2x5Z29uKVxyXG4gICAgICAgICAgICAgICAgdGhhdFxyXG4gICAgICAgICAgICAgICAgICAuZ2V0Q2xhbXBUb0hlaWdodCh7XHJcbiAgICAgICAgICAgICAgICAgICAgbG5nOiBjZW50cm9pZC5nZW9tZXRyeS5jb29yZGluYXRlc1swXSxcclxuICAgICAgICAgICAgICAgICAgICBsYXQ6IGNlbnRyb2lkLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzFdXHJcbiAgICAgICAgICAgICAgICAgIH0sIG9iamVjdHNUb0V4Y2x1ZGUpXHJcbiAgICAgICAgICAgICAgICAgIC50aGVuKGhlaWdodCA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhhdC5sYWJlbC5wb3NpdGlvbiA9IFtcclxuICAgICAgICAgICAgICAgICAgICAgIGNlbnRyb2lkLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzBdLFxyXG4gICAgICAgICAgICAgICAgICAgICAgY2VudHJvaWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMV0sXHJcbiAgICAgICAgICAgICAgICAgICAgICBoZWlnaHRcclxuICAgICAgICAgICAgICAgICAgICBdXHJcbiAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoYXQudGlwLnNldFBvc2l0aW9uKFxyXG4gICAgICAgICAgICAgIGNhcnRlc2lhbixcclxuICAgICAgICAgICAgICBtb3ZlbWVudC5lbmRQb3NpdGlvbi54LFxyXG4gICAgICAgICAgICAgIG1vdmVtZW50LmVuZFBvc2l0aW9uLnlcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICAgfSlcclxuXHJcbiAgICAgICAgICB0aGF0LmV2ZW50Lm1vdXNlX3JpZ2h0X2tleWJvYXJkX2N0cmwoKG1vdmVtZW50LCBjYXJ0ZXNpYW4pID0+IHtcclxuICAgICAgICAgICAgaWYgKHNlbGVjdFBvaW50KSB7XHJcbiAgICAgICAgICAgICAgdGhhdC5vcHRpb25zLnBvc2l0aW9ucy5wb3AoKVxyXG4gICAgICAgICAgICAgIHRoYXQuc2RrLnZpZXdlci5lbnRpdGllcy5yZW1vdmUoXHJcbiAgICAgICAgICAgICAgICB0aGF0Lm5vZGVQb2ludHNbdGhhdC5ub2RlUG9pbnRzLmxlbmd0aCAtIDFdXHJcbiAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgIGlmIChzZWxlY3RQb2ludC5pbmRleCA9PT0gdGhhdC5vcHRpb25zLnBvc2l0aW9ucy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGF0Lm5vZGVQb2ludHNbc2VsZWN0UG9pbnQuaW5kZXggLSAxXSkge1xyXG4gICAgICAgICAgICAgICAgICBzZWxlY3RQb2ludCA9IHRoYXQubm9kZVBvaW50c1tzZWxlY3RQb2ludC5pbmRleCAtIDFdXHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICBzZWxlY3RQb2ludC5pbmRleCA9IDBcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgdGhhdC5ub2RlUG9pbnRzLnBvcCgpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pXHJcblxyXG4gICAgICAgICAgdGhhdC5ldmVudC5nZXN0dXJlX3BpbmNrX3N0YXJ0KChtb3ZlbWVudCwgY2FydGVzaWFuKSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBzdGFydFRpbWUgPSBuZXcgRGF0ZSgpXHJcbiAgICAgICAgICAgIGxldCBwb3MgPSB7XHJcbiAgICAgICAgICAgICAgcG9zaXRpb246IHtcclxuICAgICAgICAgICAgICAgIHg6IChtb3ZlbWVudC5wb3NpdGlvbjEueCArIG1vdmVtZW50LnBvc2l0aW9uMi54KSAvIDIsXHJcbiAgICAgICAgICAgICAgICB5OiAobW92ZW1lbnQucG9zaXRpb24xLnkgKyBtb3ZlbWVudC5wb3NpdGlvbjIueSkgLyAyXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoYXQuZXZlbnQuZ2VzdHVyZV9waW5ja19lbmQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgIGxldCBlbmRUaW1lID0gbmV3IERhdGUoKVxyXG4gICAgICAgICAgICAgIGlmIChlbmRUaW1lIC0gc3RhcnRUaW1lID49IDUwMCkge1xyXG4gICAgICAgICAgICAgICAgLy8g6ZW/5oyJ5Y+W5raIXHJcbiAgICAgICAgICAgICAgICByaWdodEV2ZW50KHBvcywgY2FydGVzaWFuKVxyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBsZWZ0RXZlbnQocG9zLCBjYXJ0ZXNpYW4pXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgfSlcclxuXHJcbiAgICAgICAgICBjcmVhdGVOb2RlUG9pbnRzKClcclxuICAgICAgICB9LCAyMDApO1xyXG5cclxuICAgICAgICBhc3luYyBmdW5jdGlvbiBjcmVhdGVOb2RlUG9pbnRzKCkge1xyXG4gICAgICAgICAgLy8gc2RrLnZpZXdlci5zY2VuZS5wcmltaXRpdmVzXHJcbiAgICAgICAgICBsZXQgb2JqZWN0c1RvRXhjbHVkZSA9IFsuLi50aGF0LnNkay52aWV3ZXIuZW50aXRpZXMudmFsdWVzXVxyXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGF0Lm9wdGlvbnMucG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGxldCBoZWlnaHQgPSBhd2FpdCB0aGF0LmdldENsYW1wVG9IZWlnaHQodGhhdC5vcHRpb25zLnBvc2l0aW9uc1tpXSwgb2JqZWN0c1RvRXhjbHVkZSlcclxuICAgICAgICAgICAgbGV0IGVudGl0eSA9IHRoYXQuc2RrLnZpZXdlci5lbnRpdGllcy5hZGQoe1xyXG4gICAgICAgICAgICAgIG5hbWU6ICdub2RlLXNlY29uZGFyeS1lZGl0LXBvaW50JyxcclxuICAgICAgICAgICAgICBpbmRleDogaSxcclxuICAgICAgICAgICAgICBwb3NpdGlvbjogQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXMoXHJcbiAgICAgICAgICAgICAgICB0aGF0Lm9wdGlvbnMucG9zaXRpb25zW2ldLmxuZyxcclxuICAgICAgICAgICAgICAgIHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbaV0ubGF0LFxyXG4gICAgICAgICAgICAgICAgaGVpZ2h0XHJcbiAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICBiaWxsYm9hcmQ6IHtcclxuICAgICAgICAgICAgICAgIGltYWdlOiB0aGF0LmdldFNvdXJjZVJvb3RQYXRoKCkgKyAnL2ltZy9wb2ludC5wbmcnLFxyXG4gICAgICAgICAgICAgICAgd2lkdGg6IDE1LFxyXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiAxNSxcclxuICAgICAgICAgICAgICAgIGRpc2FibGVEZXB0aFRlc3REaXN0YW5jZTogTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLFxyXG4gICAgICAgICAgICAgICAgY29sb3I6IENlc2l1bS5Db2xvci5XSElURS53aXRoQWxwaGEoMC45OSlcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIHRoYXQubm9kZVBvaW50cy5wdXNoKGVudGl0eSlcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0sIDUwKTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBjbG9zZU5vZGVFZGl0KHRoYXQpIHtcclxuICAgIGlmICghdGhhdC5zZGsgfHwgIXRoYXQuc2RrLnZpZXdlcikge1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuICAgIFlKLk1lYXN1cmUuU2V0TWVhc3VyZVN0YXR1cyhmYWxzZSlcclxuICAgIHRoYXQuZXZlbnQgJiYgdGhhdC5ldmVudC5kZXN0cm95KClcclxuICAgIHRoYXQudGlwICYmIHRoYXQudGlwLmRlc3Ryb3koKVxyXG4gICAgdGhhdC50aXAgPSBudWxsXHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGF0Lm5vZGVQb2ludHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgdGhhdC5zZGsudmlld2VyLmVudGl0aWVzLnJlbW92ZSh0aGF0Lm5vZGVQb2ludHNbaV0pXHJcbiAgICB9XHJcbiAgICB0aGF0Lm5vZGVQb2ludHMgPSBbXVxyXG4gICAgdGhhdC5waWNraW5nID0gdHJ1ZVxyXG4gIH1cclxuXHJcbiAgc2V0UG9zaXRpb24odikge1xyXG4gICAgbGV0IGNhcnRlc2lhbiA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzKFxyXG4gICAgICB2LnBvc2l0aW9uLmxuZyxcclxuICAgICAgdi5wb3NpdGlvbi5sYXQsXHJcbiAgICAgIHYucG9zaXRpb24uYWx0XHJcbiAgICApXHJcbiAgICBsZXQgcG9zaXRpb25zID0gWy4uLnRoaXMucG9zaXRpb25zXVxyXG4gICAgbGV0IGFycmF5ID0gW11cclxuICAgIGxldCBkaXNwYXJpdHkgPSBbXVxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgbGV0IHBvc2l0aW9uID0gdGhpcy5jYXJ0ZXNpYW4zVG93Z3M4NChwb3NpdGlvbnNbaV0sIHRoaXMuc2RrLnZpZXdlcilcclxuICAgICAgYXJyYXkucHVzaChbcG9zaXRpb24ubG5nLCBwb3NpdGlvbi5sYXRdKVxyXG4gICAgfVxyXG4gICAgbGV0IGZpcnN0cG9zaXRpb24gPSB0aGlzLmNhcnRlc2lhbjNUb3dnczg0KHBvc2l0aW9uc1swXSwgdGhpcy5zZGsudmlld2VyKVxyXG4gICAgYXJyYXkucHVzaChbZmlyc3Rwb3NpdGlvbi5sbmcsIGZpcnN0cG9zaXRpb24ubGF0XSlcclxuICAgIHZhciBwb2x5Z29uID0gdHVyZi5wb2x5Z29uKFthcnJheV0pXHJcbiAgICB2YXIgY2VudHJvaWQgPSB0dXJmLmNlbnRyb2lkKHBvbHlnb24pXHJcbiAgICBsZXQgY2VudGVyID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXMoLi4uY2VudHJvaWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXMpXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBkaXNwYXJpdHkucHVzaCh7XHJcbiAgICAgICAgeDogY2VudGVyLnggLSBwb3NpdGlvbnNbaV0ueCxcclxuICAgICAgICB5OiBjZW50ZXIueSAtIHBvc2l0aW9uc1tpXS55LFxyXG4gICAgICAgIHo6IGNlbnRlci56IC0gcG9zaXRpb25zW2ldLnpcclxuICAgICAgfSlcclxuICAgIH1cclxuICAgIGxldCBuZXdwb3NpdGlvbnMgPSBbXVxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkaXNwYXJpdHkubGVuZ3RoOyBpKyspIHtcclxuICAgICAgbmV3cG9zaXRpb25zLnB1c2goe1xyXG4gICAgICAgIHg6IGNhcnRlc2lhbi54IC0gZGlzcGFyaXR5W2ldLngsXHJcbiAgICAgICAgeTogY2FydGVzaWFuLnkgLSBkaXNwYXJpdHlbaV0ueSxcclxuICAgICAgICB6OiBjYXJ0ZXNpYW4ueiAtIGRpc3Bhcml0eVtpXS56XHJcbiAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGdyb3VuZCA9IGZhbHNlXHJcbiAgICBsZXQgaGVpZ2h0ID0gMFxyXG4gICAgc3dpdGNoICh0aGlzLm9wdGlvbnMuaGVpZ2h0TW9kZSkge1xyXG4gICAgICBjYXNlICcwJzpcclxuICAgICAgY2FzZSAwOlxyXG4gICAgICAgIGdyb3VuZCA9IGZhbHNlXHJcbiAgICAgICAgYnJlYWtcclxuICAgICAgY2FzZSAnMSc6XHJcbiAgICAgIGNhc2UgMTpcclxuICAgICAgICBoZWlnaHQgPSB0aGlzLnNkay52aWV3ZXIuc2NlbmUuZ2xvYmUuZ2V0SGVpZ2h0KENlc2l1bS5DYXJ0b2dyYXBoaWMuZnJvbURlZ3JlZXMoY2VudHJvaWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMF0sIGNlbnRyb2lkLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzFdKSlcclxuICAgICAgICBncm91bmQgPSBmYWxzZVxyXG4gICAgICAgIGJyZWFrXHJcbiAgICAgIGNhc2UgJzInOlxyXG4gICAgICBjYXNlIDI6XHJcbiAgICAgICAgZ3JvdW5kID0gdHJ1ZVxyXG4gICAgICAgIGJyZWFrXHJcbiAgICB9XHJcbiAgICBpZiAoIWdyb3VuZCkge1xyXG4gICAgICB0aGlzLmxhYmVsLnBvc2l0aW9uID0gW3YucG9zaXRpb24ubG5nLCB2LnBvc2l0aW9uLmxhdCwgdi5wb3NpdGlvbi5hbHQgKyBoZWlnaHRdXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBsZXQgb2JqZWN0c1RvRXhjbHVkZSA9IFsuLi50aGlzLnNkay52aWV3ZXIuZW50aXRpZXMudmFsdWVzXVxyXG4gICAgICB0aGlzLmdldENsYW1wVG9IZWlnaHQoeyBsbmc6IHYucG9zaXRpb24ubG5nLCBsYXQ6IHYucG9zaXRpb24ubGF0IH0sIG9iamVjdHNUb0V4Y2x1ZGUpLnRoZW4oXHJcbiAgICAgICAgaGVpZ2h0ID0+IHtcclxuICAgICAgICAgIHRoaXMubGFiZWwucG9zaXRpb24gPSBbdi5wb3NpdGlvbi5sbmcsIHYucG9zaXRpb24ubGF0LCBoZWlnaHRdXHJcbiAgICAgICAgfVxyXG4gICAgICApXHJcbiAgICB9XHJcbiAgICB0aGlzLmVudGl0eS5wb2x5Z29uLmhpZXJhcmNoeSA9IG5ldyBDZXNpdW0uQ2FsbGJhY2tQcm9wZXJ0eShmdW5jdGlvbiAoKSB7XHJcbiAgICAgIGlmIChuZXdwb3NpdGlvbnMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIHJldHVybiBuZXcgQ2VzaXVtLlBvbHlnb25IaWVyYXJjaHkobmV3cG9zaXRpb25zKVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiBuZXcgQ2VzaXVtLlBvbHlnb25IaWVyYXJjaHkocG9zaXRpb25zKVxyXG4gICAgICB9XHJcbiAgICB9LCBmYWxzZSlcclxuICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLnBvc2l0aW9ucyA9IG5ldyBDZXNpdW0uQ2FsbGJhY2tQcm9wZXJ0eShmdW5jdGlvbiAoKSB7XHJcbiAgICAgIGlmIChuZXdwb3NpdGlvbnMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIHJldHVybiBbLi4ubmV3cG9zaXRpb25zLCBuZXdwb3NpdGlvbnNbMF0sIG5ld3Bvc2l0aW9uc1sxXV1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4gWy4uLnBvc2l0aW9ucywgcG9zaXRpb25zWzBdLCBwb3NpdGlvbnNbMV1dXHJcbiAgICAgIH1cclxuICAgIH0sIGZhbHNlKVxyXG4gIH1cclxuXHJcbiAgLy8g5pu05paw5Z2Q5qCHXHJcbiAgcmVuZXdQb3NpdGlvbnMoKSB7XHJcbiAgICBpZiAodGhpcy5fZXJyb3IpIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcbiAgICBsZXQgZ3JvdW5kID0gZmFsc2VcclxuXHJcbiAgICBsZXQgYXJyYXkgPSBbXVxyXG4gICAgbGV0IHBvc2l0aW9ucyA9IHRoaXMub3B0aW9ucy5wb3NpdGlvbnNcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGFycmF5LnB1c2goW3Bvc2l0aW9uc1tpXS5sbmcsIHBvc2l0aW9uc1tpXS5sYXRdKVxyXG4gICAgfVxyXG4gICAgYXJyYXkucHVzaChbcG9zaXRpb25zWzBdLmxuZywgcG9zaXRpb25zWzBdLmxhdF0pXHJcbiAgICBsZXQgaGVpZ2h0ID0gMFxyXG4gICAgbGV0IHBvbHlnb24gPSB0dXJmLnBvbHlnb24oW2FycmF5XSlcclxuICAgIGxldCBjZW50cm9pZCA9IHR1cmYuY2VudHJvaWQocG9seWdvbilcclxuICAgIHN3aXRjaCAodGhpcy5vcHRpb25zLmhlaWdodE1vZGUpIHtcclxuICAgICAgY2FzZSAnMCc6XHJcbiAgICAgIGNhc2UgMDpcclxuICAgICAgICBncm91bmQgPSBmYWxzZVxyXG4gICAgICAgIGJyZWFrXHJcbiAgICAgIGNhc2UgJzEnOlxyXG4gICAgICBjYXNlIDE6XHJcbiAgICAgICAgaGVpZ2h0ID0gdGhpcy5zZGsudmlld2VyLnNjZW5lLmdsb2JlLmdldEhlaWdodChDZXNpdW0uQ2FydG9ncmFwaGljLmZyb21EZWdyZWVzKGNlbnRyb2lkLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzBdLCBjZW50cm9pZC5nZW9tZXRyeS5jb29yZGluYXRlc1sxXSkpIHx8IDBcclxuICAgICAgICBncm91bmQgPSBmYWxzZVxyXG4gICAgICAgIGJyZWFrXHJcbiAgICAgIGNhc2UgJzInOlxyXG4gICAgICBjYXNlIDI6XHJcbiAgICAgICAgZ3JvdW5kID0gdHJ1ZVxyXG4gICAgICAgIGJyZWFrXHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGZyb21EZWdyZWVzQXJyYXkgPSBbXVxyXG4gICAgaWYgKCFncm91bmQgJiYgdGhpcy5ub2RlUG9pbnRzLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgZnJvbURlZ3JlZXNBcnJheS5wdXNoKFxyXG4gICAgICAgICAgcG9zaXRpb25zW2ldLmxuZyxcclxuICAgICAgICAgIHBvc2l0aW9uc1tpXS5sYXQsXHJcbiAgICAgICAgICB0aGlzLmhlaWdodCArIGhlaWdodFxyXG4gICAgICAgIClcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnBvc2l0aW9ucyA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzQXJyYXlIZWlnaHRzKFxyXG4gICAgICAgIGZyb21EZWdyZWVzQXJyYXlcclxuICAgICAgKVxyXG5cclxuICAgICAgdGhpcy5sYWJlbCAmJiAodGhpcy5sYWJlbC5wb3NpdGlvbiA9IFtcclxuICAgICAgICBjZW50cm9pZC5nZW9tZXRyeS5jb29yZGluYXRlc1swXSxcclxuICAgICAgICBjZW50cm9pZC5nZW9tZXRyeS5jb29yZGluYXRlc1sxXSxcclxuICAgICAgICB0aGlzLmhlaWdodCArIGhlaWdodFxyXG4gICAgICBdKVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBmcm9tRGVncmVlc0FycmF5LnB1c2gocG9zaXRpb25zW2ldLmxuZywgcG9zaXRpb25zW2ldLmxhdClcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnBvc2l0aW9ucyA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzQXJyYXkoZnJvbURlZ3JlZXNBcnJheSlcclxuXHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIGlmICghdGhpcy5zZGsudmlld2VyKSB7XHJcbiAgICAgICAgICByZXR1cm5cclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IG9iamVjdHNUb0V4Y2x1ZGUgPSBbLi4udGhpcy5zZGsudmlld2VyLmVudGl0aWVzLnZhbHVlc11cclxuICAgICAgICB0aGlzLmdldENsYW1wVG9IZWlnaHQoe1xyXG4gICAgICAgICAgbG5nOiBjZW50cm9pZC5nZW9tZXRyeS5jb29yZGluYXRlc1swXSxcclxuICAgICAgICAgIGxhdDogY2VudHJvaWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMV1cclxuICAgICAgICB9LCBvYmplY3RzVG9FeGNsdWRlKS50aGVuKGhlaWdodCA9PiB7XHJcbiAgICAgICAgICB0aGlzLmxhYmVsICYmICh0aGlzLmxhYmVsLnBvc2l0aW9uID0gW1xyXG4gICAgICAgICAgICBjZW50cm9pZC5nZW9tZXRyeS5jb29yZGluYXRlc1swXSxcclxuICAgICAgICAgICAgY2VudHJvaWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMV0sXHJcbiAgICAgICAgICAgIGhlaWdodFxyXG4gICAgICAgICAgXSlcclxuICAgICAgICB9KVxyXG4gICAgICB9LCAxMDApXHJcbiAgICB9XHJcblxyXG4gICAgLy8g6K6h566X5oqV5b2x6Z2i56evXHJcbiAgICB0aGlzLm9wdGlvbnMuYXJlYUJ5TWV0ZXIgPSB0aGlzLmNvbXB1dGVBcmVhKHBvc2l0aW9ucylcclxuICAgIHRoaXMuYXJlYVVuaXQgPSB0aGlzLmFyZWFVbml0XHJcbiAgICByZXR1cm4gZnJvbURlZ3JlZXNBcnJheVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgc2V0RElWKG9wdGlvbnMgPSB7IGRvbWlkOiAnJywgeDogMTAsIHk6IDEwIH0pIHtcclxuICAgIG9wdGlvbnMueCA9IG9wdGlvbnMueCB8fCBvcHRpb25zLnggPT09IDAgPyBvcHRpb25zLnggOiAxMFxyXG4gICAgb3B0aW9ucy55ID0gb3B0aW9ucy55IHx8IG9wdGlvbnMueSA9PT0gMCA/IG9wdGlvbnMueSA6IDEwXHJcblxyXG4gICAgbGV0IHBvc2l0aW9ucyA9IFtbXV1cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5vcHRpb25zLnBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBwb3NpdGlvbnNbMF0ucHVzaChbXHJcbiAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sbmcsXHJcbiAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sYXRcclxuICAgICAgXSlcclxuICAgIH1cclxuICAgIHBvc2l0aW9uc1swXS5wdXNoKFtcclxuICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXS5sbmcsXHJcbiAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0ubGF0XHJcbiAgICBdKVxyXG4gICAgbGV0IHBvbHlnb24gPSB0dXJmLnBvbHlnb24ocG9zaXRpb25zKVxyXG4gICAgbGV0IGNlbnRyb2lkID0gdHVyZi5wb2ludE9uRmVhdHVyZShwb2x5Z29uKVxyXG4gICAgbGV0IGhlaWdodFxyXG4gICAgaWYgKCFncm91bmQpIHtcclxuICAgICAgaGVpZ2h0ID0gdGhpcy5vcHRpb25zLmhlaWdodFxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbGV0IG9iamVjdHNUb0V4Y2x1ZGUgPSBbLi4udGhpcy5zZGsudmlld2VyLmVudGl0aWVzLnZhbHVlc11cclxuICAgICAgaGVpZ2h0ID0gYXdhaXQgdGhpcy5nZXRDbGFtcFRvSGVpZ2h0KHtcclxuICAgICAgICBsbmc6IGNlbnRyb2lkLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzBdLFxyXG4gICAgICAgIGxhdDogY2VudHJvaWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMV1cclxuICAgICAgfSwgb2JqZWN0c1RvRXhjbHVkZSlcclxuICAgIH1cclxuXHJcbiAgICBsZXQgc2l0ZUluZm9Eb20gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChvcHRpb25zLmRvbWlkKVxyXG4gICAgbGV0IHNpdGVJbmZvUG9zaXRpb24gPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlcyhcclxuICAgICAgY2VudHJvaWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMF0sXHJcbiAgICAgIGNlbnRyb2lkLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzFdLFxyXG4gICAgICBoZWlnaHRcclxuICAgIClcclxuXHJcbiAgICB0aGlzLnNkay52aWV3ZXIuc2NlbmUucG9zdFJlbmRlci5hZGRFdmVudExpc3RlbmVyKHBlcmNlbnRhZ2UgPT4ge1xyXG4gICAgICAvL+i9rOaNouWIsOWxj+W5leWdkOagh1xyXG4gICAgICBpZiAoXHJcbiAgICAgICAgc2l0ZUluZm9Eb20uc3R5bGUuZGlzcGxheSA9PT0gJ2Jsb2NrJyB8fFxyXG4gICAgICAgIHNpdGVJbmZvRG9tLnN0eWxlLmRpc3BsYXkgPT09ICcnXHJcbiAgICAgICkge1xyXG4gICAgICAgIGxldCB3aW5wb3MgPSB0aGlzLnNkay52aWV3ZXIuc2NlbmUuY2FydGVzaWFuVG9DYW52YXNDb29yZGluYXRlcyhcclxuICAgICAgICAgIHNpdGVJbmZvUG9zaXRpb25cclxuICAgICAgICApXHJcbiAgICAgICAgaWYgKHdpbnBvcykge1xyXG4gICAgICAgICAgc2l0ZUluZm9Eb20uc3R5bGUubGVmdCA9ICh3aW5wb3MueCArIG9wdGlvbnMueCkudG9GaXhlZCgwKSArICdweCdcclxuICAgICAgICAgIHNpdGVJbmZvRG9tLnN0eWxlLnRvcCA9ICh3aW5wb3MueSArIG9wdGlvbnMueSkudG9GaXhlZCgwKSArICdweCdcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBQb2x5Z29uT2JqZWN0XHJcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFJQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUtBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQVFBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQWNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBR0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFXQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFHQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFqQkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQXpCQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBa0RBO0FBekRBO0FBQUE7QUFBQTtBQUFBO0FBMERBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFWQTtBQUFBO0FBUUE7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQWxCQTtBQUFBO0FBQUE7QUFtQkE7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBUUE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBY0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFHQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQVdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUdBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQWpCQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBekJBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFrREE7QUF6REE7QUFBQTtBQUFBO0FBQUE7QUEwREE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQVZBO0FBQUE7QUFRQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBbEJBO0FBQUE7QUFBQTtBQW1CQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUEySEE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQXpIQTtBQUFBO0FBQUE7QUEwSEE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQXhEQTtBQXlEQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUdBO0FBTUE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQU1BO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFNQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFJQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUE1aUJBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBK2lCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUFBO0FBRUE7QUFVQTtBQUFBO0FBUEE7QUFBQTtBQUFBO0FBSUE7QUFBQTtBQUFBO0FBSUE7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBS0E7QUFBQTtBQVBBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBVUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBcEdBO0FBQUE7QUFBQTtBQUFBO0FBc0dBO0FBQ0E7QUFDQTtBQUZBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFaQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQWVBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBS0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTEE7QUFBQTtBQUFBO0FBdVFBO0FBQ0E7QUFBQTtBQWxRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBSUE7QUFFQTtBQUNBO0FBS0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQWdlQTtBQUFBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBSUE7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFJQTtBQUNBO0FBQUE7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBSEE7QUFBQTtBQU1BO0FBQ0E7QUFNQTtBQUNBO0FBQ0E7QUFJQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBbERBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBMXlEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUlBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUlBO0FBRUE7QUFFQTtBQUFBO0FBRUE7QUFhQTtBQUFBO0FBVkE7QUFBQTtBQUFBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBSUE7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBSEE7QUFBQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUF6RUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFzb0NBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBbkVBO0FBQUE7QUFBQTtBQW1FQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBMUZBO0FBQUE7QUFLQTtBQXNGQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBMlVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBbEJBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQW9CQTtBQXZCQTtBQUFBO0FBQUE7QUExVUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFJQTtBQUNBO0FBQUE7QUFBQTtBQUdBO0FBRkE7QUFHQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBS0E7QUFDQTtBQUVBO0FBQUE7QUFDQTtBQWNBO0FBQUE7QUFaQTtBQUFBO0FBQUE7QUFHQTtBQUVBO0FBQUE7QUFHQTtBQUVBO0FBQUE7QUFHQTtBQUFBO0FBQUE7QUFHQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBNUhBO0FBQUE7QUFBQTtBQTZIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFLQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUtBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUEwQkE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBb05BIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/Obj/Base/PolygonObject/index.js\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ \"./node_modules/@babel/runtime/helpers/defineProperty.js\");\n/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ \"./node_modules/@babel/runtime/helpers/asyncToGenerator.js\");\n/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/toConsumableArray */ \"./node_modules/@babel/runtime/helpers/toConsumableArray.js\");\n/* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ \"./node_modules/@babel/runtime/helpers/classCallCheck.js\");\n/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ \"./node_modules/@babel/runtime/helpers/createClass.js\");\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ \"./node_modules/@babel/runtime/helpers/possibleConstructorReturn.js\");\n/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ \"./node_modules/@babel/runtime/helpers/getPrototypeOf.js\");\n/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ \"./node_modules/@babel/runtime/helpers/inherits.js\");\n/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @babel/runtime/regenerator */ \"./node_modules/@babel/runtime/regenerator/index.js\");\n/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8__);\n/* harmony import */ var _Element_Dialog__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../Element/Dialog */ \"./src/Obj/Element/Dialog/index.js\");\n/* harmony import */ var _Element_cy_html_tabs__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../Element/cy_html_tabs */ \"./src/Obj/Element/cy_html_tabs.js\");\n/* harmony import */ var _Element_richText__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../Element/richText */ \"./src/Obj/Element/richText.js\");\n/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./_element */ \"./src/Obj/Base/PolygonObject/_element.js\");\n/* harmony import */ var _index__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../index */ \"./src/Obj/Base/index.js\");\n/* harmony import */ var _LabelObject__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../LabelObject */ \"./src/Obj/Base/LabelObject/index.js\");\n/* harmony import */ var _Event_index__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../../../Event/index */ \"./src/Event/index.js\");\n/* harmony import */ var _MouseTip__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../../../MouseTip */ \"./src/MouseTip/index.js\");\n/* harmony import */ var _Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../../../Global/MultiViewportMode */ \"./src/Global/MultiViewportMode/index.js\");\n/* harmony import */ var _Element_datalist__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../../Element/datalist */ \"./src/Obj/Element/datalist.js\");\n/* harmony import */ var _Element_fontSelect__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../../Element/fontSelect */ \"./src/Obj/Element/fontSelect.js\");\n/* harmony import */ var _Global_SplitScreen__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../../../Global/SplitScreen */ \"./src/Global/SplitScreen/index.js\");\n/* harmony import */ var _Global_global__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../../../Global/global */ \"./src/Global/global.js\");\n\n\n\n\n\n\n\n\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default()(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\n\nfunction _callSuper(t, o, e) { return o = _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6___default()(o), _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_5___default()(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6___default()(t).constructor) : o.apply(t, e)); }\nfunction _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }\n/**\r\n * 多边形\r\n */\n\n\n\n\n\n\n\n\n\n\n\n\n\n// import EditParticle from \"../../ModelController/EditParticle\";\nvar PolygonObject = /*#__PURE__*/function (_Base) {\n /**\r\n * @constructor\r\n * @description 多边形\r\n * @param sdk\r\n * @param options {object} 属性\r\n * @param options.id {string} 唯一标识\r\n * @param options.show=true {boolean} 显示/隐藏\r\n * @param options.name {string} 名称\r\n * @param options.color='rgba(255, 0, 0, 0.5)' {string} 颜色\r\n * @param options.height {number} 高度\r\n * @param options.heightMode=2{number} 高度模式(0:海拔高度;1:相对地表;2:依附模式)\r\n * @param options.line {object} 边框\r\n * @param options.line.width=2 {string} 边框宽\r\n * @param options.line.color=\"rgba(155, 155, 124, 0.89)\" {string} 边框颜色\r\n * @param {Array.} options.positions 必填,经纬度和高度的列表,值交替 [{lon,lat,alt},...]\r\n * @param options.positions[].lng {number} 经度\r\n * @param options.positions[].lat {number} 纬度\r\n * @param options.positions[].alt {number} 高度\r\n * @param options.label {object} 标签对象\r\n * @param options.label.text {string} 标签文本\r\n * @param options.label.show {string} 标签显隐\r\n * @param options.label.position {string} 标签位置\r\n * @param options.label.position {object} 标签位置\r\n * @param options.label.position.lng {number} 经度\r\n * @param options.label.position.lat {number} 纬度\r\n * @param options.label.position.alt {number} 高度\r\n * @param options.label.fontSize=20 {number} 字体大小\r\n * @param options.label.fontFamily=0 {number} 字体项 0:黑体;1:思源黑体;2:庞门正道标题体;3:数黑体\r\n * @param options.label.color=#ffffff {string} 字体颜色\r\n * @param options.label.lineWidth=4 {number} 引线宽\r\n * @param options.label.lineColor=#00ffff80 {string} 引线颜色\r\n * @param options.label.pixelOffset=20 {number} 字体偏移(引线长度)\r\n * @param options.label.backgroundColor=['#00ffff80', '#00ffff80'] {array} 背景颜色\r\n * @param options.label.scaleByDistance {boolean} 距离缩放\r\n * @param options.label.near=2000 {number} 视野缩放最近距离\r\n * @param options.label.far=100000 {number} 视野缩放最远距离\r\n * @param options.attribute {object} 属性内容\r\n * @param {object} options.attribute.link={} 链接\r\n * @param options.attribute.link.content=[]] {array} 链接内容\r\n * @param options.attribute.link.content[].name {string} 链接名称\r\n * @param options.attribute.link.content[].url {string} 链接地址\r\n * @param options.richTextContent {string} 富文本内容\r\n * @param options.customView {object} 默认视角\r\n * @param options.customView.orientation {object} 默认视角方位\r\n * @param options.customView.orientation.heading {number} 航向角\r\n * @param options.customView.orientation.pitch {number} 俯仰角\r\n * @param options.customView.orientation.roll {number} 翻滚角\r\n * @param options.customView.relativePosition {object} 视角相对位置\r\n * @param options.customView.relativePosition.lng {number} 经度\r\n * @param options.customView.relativePosition.lat {number} 纬度\r\n * @param options.customView.relativePosition.alt {number} 高度\r\n * \r\n \r\n * \r\n * @param _Dialog {object} 弹框事件\r\n * @param _Dialog.confirmCallBack {function} 弹框确认时的回调\r\n * */\n function PolygonObject(sdk) {\n var _this2;\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var _Dialog = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3___default()(this, PolygonObject);\n _this2 = _callSuper(this, PolygonObject, [sdk, options]);\n _this2.options.name = options.name || '未命名对象';\n _this2.options.color = options.color || 'rgba(255, 0, 0, 0.5)';\n _this2.options.show = options.show || options.show === false ? options.show : true;\n _this2.options.heightMode = options.heightMode || options.heightMode == 0 ? options.heightMode : 2;\n _this2.options.positions = options.positions || [];\n _this2.options.line = options.line || {};\n _this2.options.line.width = _this2.options.line.width || _this2.options.line.width === 0 ? _this2.options.line.width : 3;\n _this2.options.line.color = _this2.options.line.color || 'rgba(255, 0, 0, 1)';\n _this2.entity;\n _this2.event = new _Event_index__WEBPACK_IMPORTED_MODULE_15__[\"default\"](_this2.sdk);\n _this2.operate = {};\n _this2._elms = {};\n _this2.Dialog = _Dialog;\n _this2.nodePoints = [];\n options.label = options.label || {};\n _this2.options.label = {\n text: _this2.options.name,\n show: options.label.show || false,\n position: options.label.position,\n fontSize: options.label.fontSize || options.label.fontSize === 0 ? options.label.fontSize : 20,\n fontFamily: options.label.fontFamily ? options.label.fontFamily : 0,\n color: options.label.color || '#ffffff',\n lineWidth: options.label.lineWidth || options.label.lineWidth === 0 ? options.label.lineWidth : 4,\n pixelOffset: options.label.pixelOffset || options.label.pixelOffset === 0 ? options.label.pixelOffset : 20,\n backgroundColor: options.label.backgroundColor || ['#00ffff80', '#00ffff80'],\n lineColor: options.label.lineColor || '#00ffff80',\n scaleByDistance: options.label.scaleByDistance || false,\n near: options.label.near || options.label.near === 0 ? options.label.near : 2000,\n far: options.label.far || options.label.far === 0 ? options.label.far : 100000\n };\n _this2.options.attribute = options.attribute || {};\n _this2.options.attribute.link = _this2.options.attribute.link || {};\n _this2.options.attribute.link.content = _this2.options.attribute.link.content || [];\n // this.options.attribute.camera = this.options.attribute.camera || {}\n // this.options.attribute.camera.content =\n // this.options.attribute.camera.content || []\n // this.options.attribute.vr = this.options.attribute.vr || {}\n // this.options.attribute.vr.content =\n // this.options.attribute.vr.content || []\n // this.options.attribute.goods = this.options.attribute.goods || {}\n // this.options.attribute.goods.content =\n // this.options.attribute.goods.content || []\n\n delete _this2.options.attribute.camera;\n delete _this2.options.attribute.vr;\n delete _this2.options.attribute.goods;\n if (!_this2.options.positions || _this2.options.positions.length < 3) {\n _this2._error = '多边形最少需要三个坐标!';\n console.warn(_this2._error);\n } else {\n if (!_this2.options.height && _this2.options.height !== 0) {\n var height = _this2.options.positions[0].alt;\n for (var i = 1; i < _this2.options.positions.length; i++) {\n if (height < _this2.options.positions[i].alt) {\n height = _this2.options.positions[i].alt;\n }\n }\n _this2.options.height = height;\n }\n _this2.sdk.addIncetance(_this2.options.id, _this2);\n _this2._zIndex = _this2.sdk.entityMap.size;\n PolygonObject.create(_this2);\n }\n return _this2;\n }\n _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_7___default()(PolygonObject, _Base);\n return _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4___default()(PolygonObject, [{\n key: \"type\",\n get: function get() {\n return 'PolygonObject';\n }\n }, {\n key: \"color\",\n get: function get() {\n return this.options.color;\n },\n set: function set(v) {\n var _this3 = this;\n this.options.color = v || 'rgba(255, 0, 0, 0.5)';\n if (!this.sdk || !this.sdk.viewer || !this.entity || !this.entity.polygon) {\n return;\n }\n if (!this.sdk || !this.sdk.viewer || !this.entity || !this.entity.polygon) {\n return;\n }\n var material = Cesium.Color.fromCssColorString(this.options.color);\n if (this.sdk.viewer.scene.mode === 2) {\n this.heightMode = 0;\n material = new Cesium.CustomColorMaterialSource({\n color: this.options.color\n });\n }\n this.entity.polygon.material = material;\n if (this._elms.color) {\n this._elms.color.forEach(function (item, i) {\n var colorPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: _this3.options.color,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(c) {\n _this3.color = c;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this3.color = 'rgba(255,0,0,0.5)';\n } //点击清空按钮事件回调\n });\n _this3._elms.color[i] = colorPicker;\n });\n }\n }\n }, {\n key: \"heightMode\",\n get: function get() {\n return this.options.heightMode ? this.options.heightMode : 0;\n },\n set: function set(v) {\n var _this4 = this;\n this.entity.polygon.hierarchy = [];\n setTimeout(function () {\n _this4.options.heightMode = v || v == 0 ? v : 2;\n _this4.positionEditing = false;\n if (!_this4.entity) {\n return;\n }\n var positions = _this4.options.positions;\n var heightModeName = '';\n _this4.closeNodeEdit();\n var ground = false;\n var disabled = false;\n _this4.renewPositions();\n _this4.entity.polyline.positions = [].concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(_this4.positions), [_this4.positions[0], _this4.positions[1]]);\n _this4.entity.polygon.hierarchy = new Cesium.PolygonHierarchy(_this4.positions);\n switch (_this4.options.heightMode) {\n case '0':\n case 0:\n heightModeName = '海拔高度';\n break;\n case '1':\n case 1:\n heightModeName = '相对地表';\n break;\n case '2':\n case 2:\n ground = true;\n disabled = true;\n heightModeName = '依附模型';\n break;\n }\n _this4.label.ground = ground;\n _this4.entity.polyline.clampToGround = ground;\n _this4.entity.polyline.arcType = !ground ? Cesium.ArcType.NONE : Cesium.ArcType.GEODESIC, _this4.entity.polygon.perPositionHeight = !ground ? true : false;\n _this4._elms.heightMode && (_this4._elms.heightMode.value = heightModeName);\n _this4._elms.heightModeObject && _this4._elms.heightModeObject.legp_searchActive(heightModeName);\n }, 50);\n }\n }, {\n key: \"height\",\n get: function get() {\n return this.options.height;\n },\n set: function set(v) {\n var _this5 = this;\n if (!v || isNaN(Number(v))) {\n this.options.height = 0;\n } else {\n this.options.height = Number(Number(v).toFixed(2));\n }\n var ground;\n if (this.heightMode == 2) {\n ground = true;\n } else {\n ground = false;\n }\n this.renewPositions();\n setTimeout(function () {\n _this5.entity.polygon.hierarchy = new Cesium.PolygonHierarchy(_this5.positions);\n _this5.entity.polygon.perPositionHeight = !ground ? true : false;\n _this5.entity.polyline.positions = [].concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(_this5.positions), [_this5.positions[0], _this5.positions[1]]);\n _this5.entity.polyline.clampToGround = !ground ? false : true;\n _this5.entity.polyline.arcType = !ground ? Cesium.ArcType.NONE : Cesium.ArcType.GEODESIC;\n }, 0);\n this._elms.alt && this._elms.alt.forEach(function (item) {\n item.innerHTML = _this5.options.height;\n });\n }\n }, {\n key: \"lineColor\",\n get: function get() {\n return this.options.line.color;\n },\n set: function set(v) {\n var _this6 = this;\n this.options.line.color = v || 'rgba(255, 0, 0, 0.5)';\n if (!this.sdk || !this.sdk.viewer || !this.entity || !this.entity.polyline) {\n return;\n }\n this.entity.polyline.material = Cesium.Color.fromCssColorString(this.options.line.color);\n if (this._elms.lineColor) {\n this._elms.lineColor.forEach(function (item, i) {\n var lineColorPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: _this6.options.line.color,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(c) {\n _this6.lineColor = c;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this6.lineColor = 'rgba(255,0,0,0.5)';\n } //点击清空按钮事件回调\n });\n _this6._elms.lineColor[i] = lineColorPicker;\n });\n }\n }\n }, {\n key: \"lineWidth\",\n get: function get() {\n return this.options.line.width;\n },\n set: function set(v) {\n this.options.line.width = v || v === 0 ? v : 3;\n this.entity.polyline.width = this.options.line.width;\n this._elms.lineWidth && this._elms.lineWidth.forEach(function (item) {\n item.value = v;\n });\n }\n }, {\n key: \"labelShow\",\n get: function get() {\n return this.options.label.show;\n },\n set: function set(v) {\n this.options.label.show = v;\n if (this.show && !this.showView || this.showView == 3) {\n this.label.show = v;\n } else {\n this.label.show = false;\n }\n this._elms.labelShow && this._elms.labelShow.forEach(function (item) {\n item.checked = v;\n });\n }\n }, {\n key: \"labelFontFamily\",\n get: function get() {\n return this.options.label.fontFamily;\n },\n set: function set(v) {\n this.options.label.fontFamily = v || 0;\n this.label && (this.label.fontFamily = this.options.label.fontFamily);\n var name = Object(_Element_fontSelect__WEBPACK_IMPORTED_MODULE_19__[\"getFontFamilyName\"])(this.labelFontFamily) || '';\n this._elms.labelFontFamily && this._elms.labelFontFamily.forEach(function (item) {\n item.value = name;\n });\n }\n }, {\n key: \"labelColor\",\n get: function get() {\n return this.options.label.color;\n },\n set: function set(v) {\n var _this7 = this;\n this.options.label.color = v;\n this.label.color = v;\n if (this._elms.labelColor) {\n this._elms.labelColor.forEach(function (item, i) {\n var labelColorPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: _this7.labelColor,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this7.labelColor = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this7.labelColor = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n _this7._elms.labelColor[i] = labelColorPicker;\n });\n }\n }\n }, {\n key: \"labelFontSize\",\n get: function get() {\n return this.options.label.fontSize;\n },\n set: function set(v) {\n this.options.label.fontSize = v;\n this.label.fontSize = v;\n this._elms.labelFontSize && this._elms.labelFontSize.forEach(function (item) {\n item.value = v;\n });\n }\n }, {\n key: \"labelScaleByDistance\",\n get: function get() {\n return this.options.label.scaleByDistance;\n },\n set: function set(v) {\n this.options.label.scaleByDistance = v;\n this.label.scaleByDistance = v;\n this._elms.labelScaleByDistance && this._elms.labelScaleByDistance.forEach(function (item) {\n item.checked = v;\n });\n }\n }, {\n key: \"labelNear\",\n get: function get() {\n return this.options.label.near;\n },\n set: function set(v) {\n var near = v;\n if (near > this.labelFar) {\n near = this.labelFar;\n }\n this.options.label.near = near;\n this.label.near = near;\n this._elms.labelNear && this._elms.labelNear.forEach(function (item) {\n item.value = near;\n });\n }\n }, {\n key: \"labelFar\",\n get: function get() {\n return this.options.label.far;\n },\n set: function set(v) {\n var far = v;\n if (far < this.labelNear) {\n far = this.labelNear;\n }\n this.options.label.far = far;\n this.label.far = far;\n this._elms.labelFar && this._elms.labelFar.forEach(function (item) {\n item.value = far;\n });\n }\n }, {\n key: \"labelLineWidth\",\n get: function get() {\n return this.options.label.lineWidth;\n },\n set: function set(v) {\n this.options.label.lineWidth = v;\n this.label.lineWidth = v;\n this._elms.labelLineWidth && this._elms.labelLineWidth.forEach(function (item) {\n item.value = v;\n });\n }\n }, {\n key: \"labelPixelOffset\",\n get: function get() {\n return this.options.label.pixelOffset;\n },\n set: function set(v) {\n this.options.label.pixelOffset = v;\n this.label.pixelOffset = v;\n this._elms.labelPixelOffset && this._elms.labelPixelOffset.forEach(function (item) {\n item.value = v;\n });\n }\n }, {\n key: \"labelLineColor\",\n get: function get() {\n return this.options.label.lineColor;\n },\n set: function set(v) {\n var _this8 = this;\n this.options.label.lineColor = v;\n this.label.lineColor = v;\n if (this._elms.labelLineColor) {\n this._elms.labelLineColor.forEach(function (item, i) {\n var lineColorPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: _this8.labelLineColor,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this8.labelLineColor = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this8.labelLineColor = 'rgba(0,255,255,0.5)';\n } //点击清空按钮事件回调\n });\n _this8._elms.labelLineColor[i] = lineColorPicker;\n });\n }\n }\n }, {\n key: \"labelBackgroundColorStart\",\n get: function get() {\n return this.options.label.backgroundColor[0];\n },\n set: function set(v) {\n var _this9 = this;\n this.options.label.backgroundColor[0] = v;\n this.label.backgroundColor = [v, this.label.backgroundColor[1]];\n if (this._elms.labelBackgroundColorStart) {\n this._elms.labelBackgroundColorStart.forEach(function (item, i) {\n var labelBackgroundColorStartPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: _this9.labelBackgroundColorStart,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this9.labelBackgroundColorStart = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this9.labelBackgroundColorStart = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n _this9._elms.labelBackgroundColorStart[i] = labelBackgroundColorStartPicker;\n });\n }\n }\n }, {\n key: \"labelBackgroundColorEnd\",\n get: function get() {\n return this.options.label.backgroundColor[1];\n },\n set: function set(v) {\n var _this10 = this;\n this.options.label.backgroundColor[1] = v;\n this.label.backgroundColor = [this.label.backgroundColor[0], v];\n if (this._elms.labelBackgroundColorEnd) {\n this._elms.labelBackgroundColorEnd.forEach(function (item, i) {\n var labelBackgroundColorEndPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: _this10.labelBackgroundColorEnd,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this10.labelBackgroundColorEnd = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this10.labelBackgroundColorEnd = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n _this10._elms.labelBackgroundColorEnd[i] = labelBackgroundColorEndPicker;\n });\n }\n }\n }, {\n key: \"edit\",\n value: // 编辑框\n function () {\n var _edit = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee(state) {\n var _this11 = this;\n var _this, createSpatialInfoTableContent, contentElm, tabsElm, colorPicker, linecolorPicker, labelColorPicker, lineColorPicker, labelBackgroundColorStartPicker, labelBackgroundColorEndPicker, all_elm;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee$(_context) {\n while (1) switch (_context.prev = _context.next) {\n case 0:\n return _context.abrupt(\"return\");\n case 8:\n this._DialogObject = _context.sent;\n this._DialogObject._element.body.className = this._DialogObject._element.body.className + ' polygon';\n contentElm = document.createElement('div');\n contentElm.innerHTML = Object(_element__WEBPACK_IMPORTED_MODULE_12__[\"html\"])(this);\n this._DialogObject.contentAppChild(contentElm);\n this.attributeType = this.options.attributeType;\n this.attributeCamera = this.options.attribute.camera.content;\n\n // 创建标签页\n tabsElm = new _Element_cy_html_tabs__WEBPACK_IMPORTED_MODULE_10__[\"default\"]('polygon-object-edit-tabs', undefined, this.sdk); // 颜色组件\n colorPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName('color')[0],\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: this.color,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this11.color = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this11.color = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n linecolorPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName('lineColor')[0],\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: this.lineColor,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this11.lineColor = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this11.lineColor = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n labelColorPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName('labelColor')[0],\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: this.labelColor,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this11.labelColor = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this11.labelColor = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n lineColorPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName('labelLineColor')[0],\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: this.labelLineColor,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this11.labelLineColor = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this11.labelLineColor = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n labelBackgroundColorStartPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName('labelBackgroundColorStart')[0],\n size: 'mini',\n alpha: true,\n defaultColor: this.labelBackgroundColorStart,\n disabled: false,\n openPickerAni: 'opacity',\n sure: function sure(color) {\n _this11.labelBackgroundColorStart = color;\n },\n clear: function clear() {\n _this11.labelBackgroundColorStart = 'rgba(255,255,255,1)';\n }\n });\n labelBackgroundColorEndPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName('labelBackgroundColorEnd')[0],\n size: 'mini',\n alpha: true,\n defaultColor: this.labelBackgroundColorEnd,\n disabled: false,\n openPickerAni: 'opacity',\n sure: function sure(color) {\n _this11.labelBackgroundColorEnd = color;\n },\n clear: function clear() {\n _this11.labelBackgroundColorEnd = 'rgba(255,255,255,1)';\n }\n }); // let heightElm = this._DialogObject._element.body.getElementsByClassName(\n // 'height'\n // )[0]\n // heightElm.value = this.height\n // heightElm.addEventListener('input', e => {\n // let value = e.target.value\n // if (\n // (e.data === '.' && value.indexOf('.') === -1) ||\n // (e.data === '-' && value.indexOf('-') === -1)\n // ) {\n // } else {\n // if (value) {\n // value = Number(value)\n // if (e.target.max && value > Number(e.target.max)) {\n // value = Number(e.target.max)\n // }\n // if (e.target.min && value < Number(e.target.min)) {\n // value = Number(e.target.min)\n // }\n // }\n // this.height = value\n // }\n // })\n all_elm = contentElm.getElementsByTagName('*');\n PolygonObject.EventBinding(this, all_elm);\n // this._elms.height = [heightElm]\n this._elms.color = [colorPicker];\n this._elms.lineColor = [linecolorPicker];\n this._elms.labelColor = [labelColorPicker];\n this._elms.labelLineColor = [lineColorPicker];\n this._elms.labelBackgroundColorStart = [labelBackgroundColorStartPicker];\n this._elms.labelBackgroundColorEnd = [labelBackgroundColorEndPicker];\n setTimeout(function () {\n _this11.attributeLink = _this11.options.attribute.link.content;\n _this11.attributeVr = _this11.options.attribute.vr.content;\n _this11.cameraSelect && _this11.cameraSelect();\n _this11.goodsSelect && _this11.goodsSelect();\n var tagData = _this11.attributeSelect;\n var attributeElm = _this11._DialogObject._element.content.getElementsByClassName('attribute-select-box')[0];\n if (attributeElm) {\n var legpObject = Object(_Element_datalist__WEBPACK_IMPORTED_MODULE_18__[\"legp\"])(attributeElm, '.attribute-select');\n legpObject.legp_search(tagData);\n var attributeSelectElm = _this11._DialogObject._element.content.getElementsByClassName('attribute-select')[0].getElementsByTagName('input')[0];\n for (var i = 0; i < tagData.length; i++) {\n if (tagData[i].key === _this11.options.attributeType) {\n attributeSelectElm.value = tagData[i].value;\n legpObject.legp_searchActive(tagData[i].value);\n break;\n }\n }\n attributeSelectElm.addEventListener('input', function () {\n for (var _i = 0; _i < tagData.length; _i++) {\n if (tagData[_i].value === attributeSelectElm.value) {\n _this11.attributeType = tagData[_i].key;\n break;\n }\n }\n });\n }\n var unitData = [{\n name: '平方米',\n value: '平方米'\n }, {\n name: '平方千米',\n value: '平方千米'\n }, {\n name: '亩',\n value: '亩'\n }, {\n name: '公顷',\n value: '公顷'\n }];\n var unitDataLegpObject = Object(_Element_datalist__WEBPACK_IMPORTED_MODULE_18__[\"legp\"])(_this11._DialogObject._element.content.getElementsByClassName('input-select-unit-box')[0], '.input-select-unit');\n if (unitDataLegpObject) {\n unitDataLegpObject.legp_search(unitData);\n var unitDataLegpElm = _this11._DialogObject._element.content.getElementsByClassName('input-select-unit')[0].getElementsByTagName('input')[0];\n unitDataLegpElm.value = _this11.options['area-unit'];\n for (var _i2 = 0; _i2 < unitData.length; _i2++) {\n if (unitData[_i2].value === unitDataLegpElm.value) {\n unitDataLegpObject.legp_searchActive(unitData[_i2].value);\n break;\n }\n }\n unitDataLegpElm.addEventListener('input', function () {\n for (var _i3 = 0; _i3 < unitData.length; _i3++) {\n if (unitData[_i3].value === unitDataLegpElm.value) {\n _this11.areaUnit = unitData[_i3].value;\n break;\n }\n }\n });\n }\n var heightBoxElm = _this11._DialogObject._element.content.getElementsByClassName('height-box')[0];\n var heightElm = heightBoxElm.getElementsByClassName('height')[0];\n var heightConfirmElm = _this11._DialogObject._element.content.getElementsByClassName('height-confirm')[0];\n heightElm.value = 10;\n if (_this11.heightMode == 2) {\n heightBoxElm && (heightBoxElm.className = 'input-number input-number-unit-1 height-box disabled');\n heightConfirmElm && heightConfirmElm.setAttribute('disabled', 'disabled');\n } else {\n heightBoxElm && (heightBoxElm.className = 'input-number input-number-unit-1 height-box');\n heightConfirmElm && heightConfirmElm.removeAttribute('disabled');\n }\n var heightModeData = [{\n name: '海拔高度',\n value: '海拔高度',\n key: '0'\n }, {\n name: '相对地表',\n value: '相对地表',\n key: '1'\n }, {\n name: '依附模型',\n value: '依附模型',\n key: '2'\n }];\n var heightModeObject = Object(_Element_datalist__WEBPACK_IMPORTED_MODULE_18__[\"legp\"])(_this11._DialogObject._element.content.getElementsByClassName('height-mode-box')[0], '.height-mode');\n if (heightModeObject) {\n heightModeObject.legp_search(heightModeData);\n var heightModeDataLegpElm = _this11._DialogObject._element.content.getElementsByClassName('height-mode')[0].getElementsByTagName('input')[0];\n for (var _i4 = 0; _i4 < heightModeData.length; _i4++) {\n if (heightModeData[_i4].key == _this11.heightMode) {\n heightModeDataLegpElm.value = heightModeData[_i4].value;\n heightModeObject.legp_searchActive(heightModeData[_i4].value);\n break;\n }\n }\n heightModeDataLegpElm.addEventListener('input', function () {\n for (var _i5 = 0; _i5 < heightModeData.length; _i5++) {\n if (heightModeData[_i5].value === heightModeDataLegpElm.value) {\n _this11.heightMode = heightModeData[_i5].key;\n break;\n }\n }\n });\n heightElm.addEventListener('input', function () {\n switch (_this11.heightMode) {\n case 0:\n case '0':\n break;\n case 1:\n case '1':\n break;\n case 2:\n case '2':\n break;\n }\n });\n _this11._elms.height = heightElm;\n _this11._elms.heightBox = heightBoxElm;\n _this11._elms.heightMode = heightModeDataLegpElm;\n _this11._elms.heightConfirm = heightConfirmElm;\n _this11._elms.heightModeObject = heightModeObject;\n heightConfirmElm.addEventListener('click', function () {\n if (_this11.operate.positionEditing) {\n _this11.positionEditing = false;\n _this11.height = _this11.height + Number(heightElm.value);\n } else {\n PolygonObject.closeNodeEdit(_this11);\n _this11.heightMode = _this11.heightMode;\n setTimeout(function () {\n _this11.height = _this11.height + Number(heightElm.value);\n }, 100);\n }\n // this.positionEditing = false\n // for (let i = 0; i < this.options.positions.length; i++) {\n // this.options.positions[i].alt = Number((this.options.positions[i].alt + Number(heightElm.value)).toFixed(2))\n // this._elms.alt[i].innerHTML = this.options.positions[i].alt\n // }\n // this.renewPositions(this.options.positions)\n // this.entity.polyline.positions = [\n // ...this.positions,\n // this.positions[0],\n // this.positions[1]\n // ]\n\n // this.positionEditing = false\n // PolygonObject.closeNodeEdit(this)\n });\n }\n var fontData = Object(_Element_fontSelect__WEBPACK_IMPORTED_MODULE_19__[\"getFontList\"])();\n var fontObject = Object(_Element_datalist__WEBPACK_IMPORTED_MODULE_18__[\"legp\"])(_this11._DialogObject._element.content.getElementsByClassName('font-select-box')[0], '.font-select');\n if (fontObject) {\n fontObject.legp_search(fontData);\n var fontDataLegpElm = _this11._DialogObject._element.content.getElementsByClassName('font-select')[0].getElementsByTagName('input')[0];\n fontDataLegpElm.value = fontData[_this11.labelFontFamily].value;\n for (var _i6 = 0; _i6 < fontData.length; _i6++) {\n if (fontData[_i6].value == fontDataLegpElm.value) {\n fontObject.legp_searchActive(fontData[_i6].value);\n break;\n }\n }\n fontDataLegpElm.addEventListener('input', function () {\n for (var _i7 = 0; _i7 < fontData.length; _i7++) {\n if (fontData[_i7].value === fontDataLegpElm.value) {\n _this11.labelFontFamily = fontData[_i7].key;\n break;\n }\n }\n });\n _this11._elms.labelFontFamily = [fontDataLegpElm];\n }\n createSpatialInfoTableContent();\n }, 0);\n _context.next = 34;\n break;\n case 33:\n if (this._DialogObject && this._DialogObject.remove) {\n this._DialogObject.remove();\n this._DialogObject = null;\n }\n case 34:\n case \"end\":\n return _context.stop();\n }\n }, _callee, this);\n }));\n function edit(_x) {\n return _edit.apply(this, arguments);\n }\n return edit;\n }()\n }, {\n key: \"reset\",\n value: function reset() {\n if (!this.entity && !this._DialogObject) {\n return;\n }\n this.options = this.deepCopyObj(this.originalOptions);\n this.name = this.originalOptions.name;\n this.color = this.originalOptions.color;\n this.lineColor = this.originalOptions.line.color;\n this.lineWidth = this.originalOptions.line.width;\n this.height = this.originalOptions.height;\n this.labelShow = this.originalOptions.label.show;\n this.labelColor = this.originalOptions.label.color;\n this.labelFontSize = this.originalOptions.label.fontSize;\n this.labelFontFamily = this.originalOptions.label.fontFamily;\n this.labelScaleByDistance = this.originalOptions.label.scaleByDistance;\n this.labelNear = this.originalOptions.label.near;\n this.labelFar = this.originalOptions.label.far;\n this.labelLineWidth = this.originalOptions.label.lineWidth;\n this.labelPixelOffset = this.originalOptions.label.pixelOffset;\n this.labelLineColor = this.originalOptions.label.lineColor;\n this.labelBackgroundColorStart = this.originalOptions.label.backgroundColor[0];\n this.labelBackgroundColorEnd = this.originalOptions.label.backgroundColor[1];\n this.heightMode = this.options.heightMode;\n var positions = this.options.positions;\n var positions2 = [[]];\n var fromDegreesArray = [];\n if (this.options.height || this.options.height === 0) {\n for (var i = 0; i < positions.length; i++) {\n fromDegreesArray.push(positions[i].lng, positions[i].lat, this.options.height);\n positions2[0].push([positions[i].lng, positions[i].lat]);\n }\n positions2[0].push([positions[0].lng, positions[0].lat]);\n this.positions = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray);\n } else {\n for (var _i8 = 0; _i8 < positions.length; _i8++) {\n fromDegreesArray.push(positions[_i8].lng, positions[_i8].lat);\n positions2[0].push([positions[_i8].lng, positions[_i8].lat]);\n }\n positions2[0].push([positions[0].lng, positions[0].lat]);\n this.positions = Cesium.Cartesian3.fromDegreesArray(fromDegreesArray);\n }\n this.entity.polygon.hierarchy = new Cesium.PolygonHierarchy(this.positions);\n this.entity.polyline.positions = [].concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(this.positions), [this.positions[0], this.positions[1]]);\n }\n\n /**\r\n * 飞到\r\n */\n }, {\n key: \"flyTo\",\n value: (function () {\n var _flyTo = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee2() {\n var options,\n orientation,\n lng,\n lat,\n alt,\n destination,\n position,\n positionArray,\n _ground,\n i,\n height,\n a,\n _i9,\n BoundingSphere,\n _args2 = arguments;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee2$(_context2) {\n while (1) switch (_context2.prev = _context2.next) {\n case 0:\n options = _args2.length > 0 && _args2[0] !== undefined ? _args2[0] : {};\n if (!this._error) {\n _context2.next = 3;\n break;\n }\n return _context2.abrupt(\"return\");\n case 3:\n Object(_Global_global__WEBPACK_IMPORTED_MODULE_21__[\"setActiveViewer\"])(0);\n Object(_Global_global__WEBPACK_IMPORTED_MODULE_21__[\"closeRotateAround\"])(this.sdk);\n Object(_Global_global__WEBPACK_IMPORTED_MODULE_21__[\"closeViewFollow\"])(this.sdk);\n if (!(this.options.customView && this.options.customView.relativePosition && this.options.customView.orientation)) {\n _context2.next = 25;\n break;\n }\n orientation = {\n heading: Cesium.Math.toRadians(this.options.customView.orientation.heading || 0.0),\n pitch: Cesium.Math.toRadians(this.options.customView.orientation.pitch || -60.0),\n roll: Cesium.Math.toRadians(this.options.customView.orientation.roll || 0.0)\n };\n lng = this.options.customView.relativePosition.lng;\n lat = this.options.customView.relativePosition.lat;\n alt = this.options.customView.relativePosition.alt;\n destination = Cesium.Cartesian3.fromDegrees(lng, lat, alt);\n position = {\n lng: 0,\n lat: 0\n };\n if (this.options.position) {\n position = _objectSpread({}, this.options.position);\n } else if (this.options.positions) {\n position = _objectSpread({}, this.options.positions[0]);\n } else if (this.options.center) {\n position = _objectSpread({}, this.options.center);\n } else if (this.options.start) {\n position = _objectSpread({}, this.options.start);\n } else {\n if (this.options.hasOwnProperty('lng')) {\n position.lng = this.options.lng;\n }\n if (this.options.hasOwnProperty('lat')) {\n position.lat = this.options.lat;\n }\n if (this.options.hasOwnProperty('alt')) {\n position.alt = this.options.alt;\n }\n }\n // 如果没有高度值,则获取紧贴高度计算\n if (position.hasOwnProperty('alt')) {\n _context2.next = 18;\n break;\n }\n _context2.next = 17;\n return this.getClampToHeight(position);\n case 17:\n position.alt = _context2.sent;\n case 18:\n lng = this.options.customView.relativePosition.lng + position.lng;\n lat = this.options.customView.relativePosition.lat + position.lat;\n alt = this.options.customView.relativePosition.alt + position.alt;\n destination = Cesium.Cartesian3.fromDegrees(lng, lat, alt);\n this.sdk.viewer.camera.flyTo({\n destination: destination,\n orientation: orientation\n });\n _context2.next = 51;\n break;\n case 25:\n positionArray = [];\n _context2.t0 = this.heightMode;\n _context2.next = _context2.t0 === 0 ? 29 : _context2.t0 === '0' ? 29 : _context2.t0 === 1 ? 31 : _context2.t0 === '1' ? 31 : _context2.t0 === 2 ? 33 : _context2.t0 === '2' ? 33 : 35;\n break;\n case 29:\n _ground = false;\n return _context2.abrupt(\"break\", 35);\n case 31:\n _ground = false;\n return _context2.abrupt(\"break\", 35);\n case 33:\n _ground = true;\n return _context2.abrupt(\"break\", 35);\n case 35:\n if (!_ground) {\n _context2.next = 48;\n break;\n }\n i = 0;\n case 37:\n if (!(i < this.options.positions.length)) {\n _context2.next = 46;\n break;\n }\n _context2.next = 40;\n return this.getClampToHeight(this.options.positions[i]);\n case 40:\n height = _context2.sent;\n a = Cesium.Cartesian3.fromDegrees(this.options.positions[i].lng, this.options.positions[i].lat, height);\n positionArray.push(a.x, a.y, a.z);\n case 43:\n i++;\n _context2.next = 37;\n break;\n case 46:\n _context2.next = 49;\n break;\n case 48:\n if (this.positions) {\n for (_i9 = 0; _i9 < this.positions.length; _i9++) {\n positionArray.push(this.positions[_i9].x, this.positions[_i9].y, this.positions[_i9].z);\n }\n }\n case 49:\n BoundingSphere = Cesium.BoundingSphere.fromVertices(positionArray);\n this.sdk.viewer.camera.flyToBoundingSphere(BoundingSphere, {\n offset: options.orientation || {\n heading: Cesium.Math.toRadians(0.0),\n pitch: Cesium.Math.toRadians(-90.0),\n roll: Cesium.Math.toRadians(0.0)\n }\n });\n case 51:\n case \"end\":\n return _context2.stop();\n }\n }, _callee2, this);\n }));\n function flyTo() {\n return _flyTo.apply(this, arguments);\n }\n return flyTo;\n }()\n /**\r\n * 删除\r\n */\n )\n }, {\n key: \"remove\",\n value: (function () {\n var _remove = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee3() {\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee3$(_context3) {\n while (1) switch (_context3.prev = _context3.next) {\n case 0:\n this.event && this.event.destroy();\n this.tip && this.tip.destroy();\n this.sdk.viewer.entities.remove(this.entity);\n this.label && this.label.remove();\n this.entity = null;\n if (this._DialogObject && !this._DialogObject.isDestroy) {\n this._DialogObject.close();\n this._DialogObject = null;\n }\n _context3.next = 8;\n return this.sdk.removeIncetance(this.options.id);\n case 8:\n _context3.next = 10;\n return Object(_Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_17__[\"syncData\"])(this.sdk, this.options.id);\n case 10:\n case \"end\":\n return _context3.stop();\n }\n }, _callee3, this);\n }));\n function remove() {\n return _remove.apply(this, arguments);\n }\n return remove;\n }()\n /**@desc 打开平移功能\r\n *\r\n * @memberOf Source\r\n * @param status {boolean}\r\n *\r\n * */\n )\n }, {\n key: \"positionEditing\",\n get: function get() {\n return this.operate.positionEditing;\n },\n set: function set(status) {\n var _this12 = this;\n this.closeNodeEdit();\n if (YJ.Measure.GetMeasureStatus() || !this.sdk || !this.sdk.viewer || !this.entity) {\n return;\n }\n var _this = this;\n this.event && this.event.destroy();\n this.event = new _Event_index__WEBPACK_IMPORTED_MODULE_15__[\"default\"](this.sdk);\n this.operate.positionEditing = status;\n if (status === true) {\n var _Cesium$Cartesian;\n this.previous = {\n positions: _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(this.positions)\n };\n this.tip && this.tip.destroy();\n this.tip = new _MouseTip__WEBPACK_IMPORTED_MODULE_16__[\"default\"]('点击鼠标左键确认,右键取消', this.sdk);\n this.label && (this.label.entity.billboard.color = Cesium.Color.fromCssColorString(\"rgba(255,255,255,0.9)\"));\n this.picking = false;\n var array = [];\n var positions = _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(this.positions);\n var positions84 = this.deepCopyObj(this.options.positions);\n var fromDegreesArray = [];\n var disparity = [];\n for (var i = 0; i < positions.length; i++) {\n var position = this.cartesian3Towgs84(positions[i], this.sdk.viewer);\n array.push([position.lng, position.lat]);\n }\n var firstposition = this.cartesian3Towgs84(positions[0], this.sdk.viewer);\n array.push([firstposition.lng, firstposition.lat]);\n var polygon = turf.polygon([array]);\n var centroid = turf.centroid(polygon);\n var center = (_Cesium$Cartesian = Cesium.Cartesian3).fromDegrees.apply(_Cesium$Cartesian, _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(centroid.geometry.coordinates));\n for (var _i10 = 0; _i10 < positions.length; _i10++) {\n disparity.push({\n x: center.x - positions[_i10].x,\n y: center.y - positions[_i10].y,\n z: center.z - positions[_i10].z\n });\n }\n var newpositions = [];\n var leftEvent = function leftEvent(movement, cartesian) {\n var position84 = _this12.cartesian3Towgs84(cartesian, _this12.sdk.viewer);\n _this12.event.mouse_move(function () {});\n _this12.event.mouse_left(function () {});\n _this12.event.mouse_right(function () {});\n newpositions = [];\n for (var _i11 = 0; _i11 < disparity.length; _i11++) {\n var pos3 = {\n x: cartesian.x - disparity[_i11].x,\n y: cartesian.y - disparity[_i11].y,\n z: cartesian.z - disparity[_i11].z\n };\n newpositions.push(pos3);\n _this12.options.positions[_i11] = _this12.cartesian3Towgs84(pos3, _this12.sdk.viewer);\n if (_this._elms.lng && _this._elms.lng[_i11]) {\n _this._elms.lng[_i11].innerHTML = _this12.options.positions[_i11].lng.toFixed(8);\n }\n if (_this._elms.lat && _this._elms.lat[_i11]) {\n _this._elms.lat[_i11].innerHTML = _this12.options.positions[_i11].lat.toFixed(8);\n }\n }\n _this12.previous = null;\n fromDegreesArray = [];\n _this12.heightMode = _this12.heightMode;\n if (_this12._positionEditingCallback) {\n _this12._positionEditingCallback();\n _this12._positionEditingCallback = null;\n }\n };\n this.event.mouse_move(function (movement, cartesian) {\n var position84 = _this12.cartesian3Towgs84(cartesian, _this12.sdk.viewer);\n newpositions = [];\n for (var _i12 = 0; _i12 < disparity.length; _i12++) {\n var pos3 = {\n x: cartesian.x - disparity[_i12].x,\n y: cartesian.y - disparity[_i12].y,\n z: cartesian.z - disparity[_i12].z\n };\n newpositions.push(pos3);\n positions84[_i12] = _this12.cartesian3Towgs84(pos3, _this12.sdk.viewer);\n }\n var ground = false;\n var array = [];\n for (var _i13 = 0; _i13 < positions84.length; _i13++) {\n array.push([positions84[_i13].lng, positions84[_i13].lat]);\n }\n array.push([positions84[0].lng, positions84[0].lat]);\n var height = 0;\n var polygon = turf.polygon([array]);\n var centroid = turf.centroid(polygon);\n switch (_this12.options.heightMode) {\n case '0':\n case 0:\n ground = false;\n break;\n case '1':\n case 1:\n height = _this12.sdk.viewer.scene.globe.getHeight(Cesium.Cartographic.fromDegrees(centroid.geometry.coordinates[0], centroid.geometry.coordinates[1]));\n ground = false;\n break;\n case '2':\n case 2:\n ground = true;\n break;\n }\n fromDegreesArray = [];\n if (!ground) {\n for (var _i14 = 0; _i14 < positions84.length; _i14++) {\n fromDegreesArray.push(positions84[_i14].lng, positions84[_i14].lat, _this12.height + height);\n }\n _this12.positions = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray);\n _this12.label.position = [position84.lng, position84.lat, _this12.height + height];\n } else {\n for (var _i15 = 0; _i15 < positions84.length; _i15++) {\n fromDegreesArray.push(positions84[_i15].lng, positions84[_i15].lat);\n }\n _this12.positions = Cesium.Cartesian3.fromDegreesArray(fromDegreesArray);\n var objectsToExclude = _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(_this12.sdk.viewer.entities.values);\n _this12.getClampToHeight({\n lng: position84.lng,\n lat: position84.lat\n }, objectsToExclude).then(function (height) {\n _this12.label.position = [position84.lng, position84.lat, height];\n });\n }\n _this12.tip.setPosition(cartesian, movement.endPosition.x, movement.endPosition.y);\n });\n this.event.mouse_left(leftEvent);\n this.event.mouse_right(function (movement, cartesian) {\n _this12.heightMode = _this12.heightMode;\n });\n this.event.gesture_pinck_start(function (movement, cartesian) {\n var startTime = new Date();\n var pos = {\n position: {\n x: (movement.position1.x + movement.position2.x) / 2,\n y: (movement.position1.y + movement.position2.y) / 2\n }\n };\n _this12.event.gesture_pinck_end(function () {\n var endTime = new Date();\n if (endTime - startTime >= 500) {\n // 长按取消\n _this12.positionEditing = false;\n } else {\n leftEvent(pos, cartesian);\n }\n });\n });\n this.entity.polygon.hierarchy = new Cesium.CallbackProperty(function () {\n return new Cesium.PolygonHierarchy(_this.positions);\n }, false);\n this.entity.polyline.positions = new Cesium.CallbackProperty(function () {\n return [].concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(_this.positions), [_this.positions[0], _this.positions[1]]);\n }, false);\n } else {\n if (!this.previous) {\n this.previous = {\n positions: _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(this.positions)\n };\n } else {\n this.positions = _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(this.previous.positions);\n }\n if (!this.sdk || !this.sdk.viewer || !this.label || !this.label.entity) {\n this.label.entity.billboard.color = Cesium.Color.fromCssColorString(\"rgba(255,255,255,1)\");\n }\n this.picking = true;\n if (this.event) {\n this.event.mouse_move(function () {});\n this.event.mouse_left(function () {});\n this.event.mouse_right(function () {});\n this.event.destroy();\n }\n this.tip && this.tip.destroy();\n var _positions = [[]];\n for (var _i16 = 0; _i16 < this.previous.positions.length; _i16++) {\n var _positions2 = this.cartesian3Towgs84(this.previous.positions[_i16], this.sdk.viewer);\n _positions[0].push([_positions2.lng, _positions2.lat]);\n }\n var _positions3 = this.cartesian3Towgs84(this.previous.positions[0], this.sdk.viewer);\n _positions[0].push([_positions3.lng, _positions3.lat]);\n var _polygon = turf.polygon(_positions);\n var _centroid = turf.centroid(_polygon);\n var _ground2 = false;\n var height = 0;\n switch (this.options.heightMode) {\n case '0':\n case 0:\n _ground2 = false;\n break;\n case '1':\n case 1:\n height = this.sdk.viewer.scene.globe.getHeight(Cesium.Cartographic.fromDegrees(_centroid.geometry.coordinates[0], _centroid.geometry.coordinates[1]));\n _ground2 = false;\n break;\n case '2':\n case 2:\n _ground2 = true;\n break;\n }\n if (!_ground2) {\n this.label.position = [_centroid.geometry.coordinates[0], _centroid.geometry.coordinates[1], this.height + height];\n } else {\n this.label.position = [_centroid.geometry.coordinates[0], _centroid.geometry.coordinates[1]];\n }\n this.entity.polygon.hierarchy = new Cesium.PolygonHierarchy(_this.previous.positions);\n this.entity.polyline.positions = [].concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(_this.previous.positions), [_this.previous.positions[0], _this.previous.positions[1]]);\n }\n }\n }, {\n key: \"openPositionEditing\",\n value: function openPositionEditing(cd) {\n this.positionEditing = true;\n this._positionEditingCallback = cd;\n }\n }, {\n key: \"areaChangeCallBack\",\n get: function get() {\n return this._areaChangeCallBack;\n },\n set: function set(cd) {\n this._areaChangeCallBack = cd;\n }\n }, {\n key: \"nodeEdit\",\n value: function nodeEdit() {\n var _this13 = this;\n var cb = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function () {};\n this.positionEditing = false;\n setTimeout(function () {\n if (YJ.Measure.GetMeasureStatus()) {\n cb('上一次测量未结束');\n } else {\n var createNodePoints = /*#__PURE__*/function () {\n var _ref2 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee5() {\n var objectsToExclude, _i22, height, entity;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee5$(_context5) {\n while (1) switch (_context5.prev = _context5.next) {\n case 0:\n // sdk.viewer.scene.primitives\n objectsToExclude = _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(_this14.sdk.viewer.entities.values);\n _i22 = 0;\n case 2:\n if (!(_i22 < _this14.options.positions.length)) {\n _context5.next = 11;\n break;\n }\n _context5.next = 5;\n return _this14.getClampToHeight(_this14.options.positions[_i22], objectsToExclude);\n case 5:\n height = _context5.sent;\n entity = _this14.sdk.viewer.entities.add({\n name: 'node-secondary-edit-point',\n index: _i22,\n position: Cesium.Cartesian3.fromDegrees(_this14.options.positions[_i22].lng, _this14.options.positions[_i22].lat, height),\n billboard: {\n image: _this14.getSourceRootPath() + '/img/point.png',\n width: 15,\n height: 15,\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\n color: Cesium.Color.WHITE.withAlpha(0.99)\n }\n });\n _this14.nodePoints.push(entity);\n case 8:\n _i22++;\n _context5.next = 2;\n break;\n case 11:\n case \"end\":\n return _context5.stop();\n }\n }, _callee5);\n }));\n return function createNodePoints() {\n return _ref2.apply(this, arguments);\n };\n }();\n YJ.Measure.SetMeasureStatus(true);\n _this13.picking = false;\n _this13.tip = new _MouseTip__WEBPACK_IMPORTED_MODULE_16__[\"default\"]('请选择一个顶点,右键取消', _this13.sdk);\n _this13.event = new _Event_index__WEBPACK_IMPORTED_MODULE_15__[\"default\"](_this13.sdk);\n _this13.nodePoints = [];\n var _this14 = _this13;\n var selectPoint;\n var originalPosition;\n var newpositions = [];\n var fromDegreesArray = [];\n for (var i = 0; i < _this13.options.positions.length; i++) {\n fromDegreesArray.push(_this13.options.positions[i].lng, _this13.options.positions[i].lat);\n }\n newpositions = Cesium.Cartesian3.fromDegreesArray(fromDegreesArray);\n var added = false;\n var leftEvent = /*#__PURE__*/function () {\n var _ref = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee4(movement, cartesian) {\n var potHeight, entity, positions, _fromDegreesArray, _i17, _objectsToExclude, _positions4, _i18, polygon, centroid, pick;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee4$(_context4) {\n while (1) switch (_context4.prev = _context4.next) {\n case 0:\n if (!selectPoint) {\n _context4.next = 22;\n break;\n }\n _this13.options.positions[selectPoint.index] = _this13.cartesian3Towgs84(cartesian, _this13.sdk.viewer);\n originalPosition = _this13.options.positions[selectPoint.index];\n added = true;\n _context4.next = 6;\n return _this13.getClampToHeight(_this13.options.positions[selectPoint.index]);\n case 6:\n potHeight = _context4.sent;\n entity = _this13.sdk.viewer.entities.add({\n name: 'node-secondary-edit-point',\n position: Cesium.Cartesian3.fromDegrees(_this13.options.positions[selectPoint.index].lng, _this13.options.positions[selectPoint.index].lat, potHeight),\n billboard: {\n image: _this13.getSourceRootPath() + '/img/point.png',\n width: 15,\n height: 15,\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\n color: Cesium.Color.WHITE.withAlpha(0.99)\n }\n });\n _this13.nodePoints.splice(selectPoint.index, 0, entity);\n _this13.options.positions.splice(selectPoint.index, 0, _this13.options.positions[selectPoint.index]);\n positions = _this13.options.positions;\n _fromDegreesArray = [];\n for (_i17 = 0; _i17 < positions.length; _i17++) {\n _fromDegreesArray.push(positions[_i17].lng, positions[_i17].lat);\n }\n _this13.positions = Cesium.Cartesian3.fromDegreesArray(_fromDegreesArray);\n newpositions = Cesium.Cartesian3.fromDegreesArray(_fromDegreesArray);\n _objectsToExclude = _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(_this13.sdk.viewer.entities.values);\n if (_this13.options.positions.length < 3) {\n _this13.getClampToHeight({\n lng: _this13.options.positions[0].lng,\n lat: _this13.options.positions[0].lat\n }, _objectsToExclude).then(function (height) {\n _this13.label.position = [_this13.options.positions[0].lng, _this13.options.positions[0].lat, height];\n });\n } else {\n _positions4 = [[]];\n for (_i18 = 0; _i18 < _this13.options.positions.length; _i18++) {\n _positions4[0].push([_this13.options.positions[_i18].lng, _this13.options.positions[_i18].lat]);\n }\n _positions4[0].push([_this13.options.positions[0].lng, _this13.options.positions[0].lat]);\n polygon = turf.polygon(_positions4);\n centroid = turf.centroid(polygon);\n _this13.getClampToHeight({\n lng: centroid.geometry.coordinates[0],\n lat: centroid.geometry.coordinates[1]\n }, _objectsToExclude).then(function (height) {\n _this13.label.position = [centroid.geometry.coordinates[0], centroid.geometry.coordinates[1], height];\n });\n }\n _this13.areaByMeter = _this13.computeArea(_this13.options.positions);\n _this13.areaChangeCallBack && _this13.areaChangeCallBack();\n cb(null, _this13.options.positions, _this13.areaByMeter);\n // switch (this.options['area-unit']) {\n // case '平方米':\n // this.area = this.options.areaByMeter\n // break\n // case '平方千米':\n // this.area = Number(\n // (this.options.areaByMeter / 1000000).toFixed(8)\n // )\n // break\n // case '亩':\n // this.area = Number(\n // (this.options.areaByMeter / 666.6666667).toFixed(4)\n // )\n // break\n // case '公顷':\n // this.area = Number((this.options.areaByMeter / 10000).toFixed(6))\n // break\n // default:\n // this.area = this.options.areaByMeter\n // }\n _context4.next = 24;\n break;\n case 22:\n pick = _this13.sdk.viewer.scene.pick(movement.position);\n if (pick && pick.id && pick.id.name && pick.id.name === 'node-secondary-edit-point') {\n selectPoint = pick.id;\n _this13.nodePoints.splice(pick.id.index, 1);\n _this13.sdk.viewer.entities.remove(pick.id);\n _this13.tip.set_text('左键开始,右键结束,CTRL+右键撤销');\n originalPosition = _this13.cartesian3Towgs84(selectPoint.position.getValue(), _this13.sdk.viewer);\n }\n case 24:\n case \"end\":\n return _context4.stop();\n }\n }, _callee4);\n }));\n return function leftEvent(_x2, _x3) {\n return _ref.apply(this, arguments);\n };\n }();\n var rightEvent = function rightEvent(movement, cartesian) {\n if (selectPoint) {\n _this13.options.positions[selectPoint.index] = originalPosition;\n // this.options.positions.splice(selectPoint.index, 1)\n if (added) {\n _this13.options.positions.splice(selectPoint.index, 1);\n }\n cb(null, _this13.options.positions);\n }\n YJ.Measure.SetMeasureStatus(false);\n _this13.event.destroy();\n _this13.tip.destroy();\n _this13.heightMode = _this13.heightMode;\n };\n _this13.entity.polyline.clampToGround = true;\n _this13.entity.polyline.arcType = Cesium.ArcType.GEODESIC;\n _this13.entity.polygon.perPositionHeight = false;\n _this13.entity.polygon.hierarchy = new Cesium.CallbackProperty(function () {\n return new Cesium.PolygonHierarchy(newpositions);\n }, false);\n _this13.entity.polyline.positions = new Cesium.CallbackProperty(function () {\n if (newpositions.length >= 3) {\n return [].concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(newpositions), [newpositions[0], newpositions[1], newpositions[2]]);\n } else {\n return newpositions;\n }\n }, false);\n var objectsToExclude = _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(_this13.sdk.viewer.entities.values);\n if (_this13.options.positions.length < 3) {\n _this13.getClampToHeight({\n lng: _this13.options.positions[0].lng,\n lat: _this13.options.positions[0].lat\n }, objectsToExclude).then(function (height) {\n _this13.label.position = [_this13.options.positions[0].lng, _this13.options.positions[0].lat, height];\n });\n } else {\n var positions = [[]];\n for (var _i19 = 0; _i19 < _this13.options.positions.length; _i19++) {\n positions[0].push([_this13.options.positions[_i19].lng, _this13.options.positions[_i19].lat]);\n }\n positions[0].push([_this13.options.positions[0].lng, _this13.options.positions[0].lat]);\n var polygon = turf.polygon(positions);\n var centroid = turf.centroid(polygon);\n _this13.getClampToHeight({\n lng: centroid.geometry.coordinates[0],\n lat: centroid.geometry.coordinates[1]\n }, objectsToExclude).then(function (height) {\n _this13.label.position = [centroid.geometry.coordinates[0], centroid.geometry.coordinates[1], height];\n });\n }\n setTimeout(function () {\n _this13.event.mouse_left(leftEvent);\n _this13.event.mouse_right(rightEvent);\n _this13.event.mouse_move(function (movement, cartesian) {\n if (selectPoint) {\n _this13.options.positions[selectPoint.index] = _this13.cartesian3Towgs84(cartesian, _this13.sdk.viewer);\n var _positions5 = _this13.options.positions;\n var _fromDegreesArray2 = [];\n for (var _i20 = 0; _i20 < _positions5.length; _i20++) {\n _fromDegreesArray2.push(_positions5[_i20].lng, _positions5[_i20].lat);\n }\n _this13.positions = Cesium.Cartesian3.fromDegreesArray(_fromDegreesArray2);\n newpositions = Cesium.Cartesian3.fromDegreesArray(_fromDegreesArray2);\n var _objectsToExclude2 = _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(_this13.sdk.viewer.entities.values);\n if (_this13.options.positions.length < 3) {\n _this13.getClampToHeight({\n lng: _this13.options.positions[0].lng,\n lat: _this13.options.positions[0].lat\n }, _objectsToExclude2).then(function (height) {\n _this13.label.position = [_this13.options.positions[0].lng, _this13.options.positions[0].lat, height];\n });\n } else {\n var _positions6 = [[]];\n for (var _i21 = 0; _i21 < _this13.options.positions.length; _i21++) {\n _positions6[0].push([_this13.options.positions[_i21].lng, _this13.options.positions[_i21].lat]);\n }\n _positions6[0].push([_this13.options.positions[0].lng, _this13.options.positions[0].lat]);\n var _polygon2 = turf.polygon(_positions6);\n var _centroid2 = turf.centroid(_polygon2);\n _this13.getClampToHeight({\n lng: _centroid2.geometry.coordinates[0],\n lat: _centroid2.geometry.coordinates[1]\n }, _objectsToExclude2).then(function (height) {\n _this13.label.position = [_centroid2.geometry.coordinates[0], _centroid2.geometry.coordinates[1], height];\n });\n }\n }\n _this13.tip.setPosition(cartesian, movement.endPosition.x, movement.endPosition.y);\n });\n _this13.event.mouse_right_keyboard_ctrl(function (movement, cartesian) {\n if (selectPoint) {\n _this13.options.positions.pop();\n _this13.sdk.viewer.entities.remove(_this13.nodePoints[_this13.nodePoints.length - 1]);\n if (selectPoint.index === _this13.options.positions.length) {\n if (_this13.nodePoints[selectPoint.index - 1]) {\n selectPoint = _this13.nodePoints[selectPoint.index - 1];\n } else {\n selectPoint.index = 0;\n }\n }\n _this13.nodePoints.pop();\n }\n });\n _this13.event.gesture_pinck_start(function (movement, cartesian) {\n var startTime = new Date();\n var pos = {\n position: {\n x: (movement.position1.x + movement.position2.x) / 2,\n y: (movement.position1.y + movement.position2.y) / 2\n }\n };\n _this13.event.gesture_pinck_end(function () {\n var endTime = new Date();\n if (endTime - startTime >= 500) {\n // 长按取消\n rightEvent(pos, cartesian);\n } else {\n leftEvent(pos, cartesian);\n }\n });\n });\n createNodePoints();\n }, 200);\n }\n }, 50);\n }\n }, {\n key: \"closeNodeEdit\",\n value: function closeNodeEdit() {\n if (!this.sdk || !this.sdk.viewer) {\n return;\n }\n YJ.Measure.SetMeasureStatus(false);\n this.event && this.event.destroy();\n this.tip && this.tip.destroy();\n this.tip = null;\n for (var i = 0; i < this.nodePoints.length; i++) {\n this.sdk.viewer.entities.remove(this.nodePoints[i]);\n }\n this.nodePoints = [];\n this.picking = true;\n }\n }, {\n key: \"setPosition\",\n value: function setPosition(v) {\n var _Cesium$Cartesian2,\n _this15 = this;\n var cartesian = Cesium.Cartesian3.fromDegrees(v.position.lng, v.position.lat, v.position.alt);\n var positions = _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(this.positions);\n var array = [];\n var disparity = [];\n for (var i = 0; i < positions.length; i++) {\n var position = this.cartesian3Towgs84(positions[i], this.sdk.viewer);\n array.push([position.lng, position.lat]);\n }\n var firstposition = this.cartesian3Towgs84(positions[0], this.sdk.viewer);\n array.push([firstposition.lng, firstposition.lat]);\n var polygon = turf.polygon([array]);\n var centroid = turf.centroid(polygon);\n var center = (_Cesium$Cartesian2 = Cesium.Cartesian3).fromDegrees.apply(_Cesium$Cartesian2, _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(centroid.geometry.coordinates));\n for (var _i23 = 0; _i23 < positions.length; _i23++) {\n disparity.push({\n x: center.x - positions[_i23].x,\n y: center.y - positions[_i23].y,\n z: center.z - positions[_i23].z\n });\n }\n var newpositions = [];\n for (var _i24 = 0; _i24 < disparity.length; _i24++) {\n newpositions.push({\n x: cartesian.x - disparity[_i24].x,\n y: cartesian.y - disparity[_i24].y,\n z: cartesian.z - disparity[_i24].z\n });\n }\n var ground = false;\n var height = 0;\n switch (this.options.heightMode) {\n case '0':\n case 0:\n ground = false;\n break;\n case '1':\n case 1:\n height = this.sdk.viewer.scene.globe.getHeight(Cesium.Cartographic.fromDegrees(centroid.geometry.coordinates[0], centroid.geometry.coordinates[1]));\n ground = false;\n break;\n case '2':\n case 2:\n ground = true;\n break;\n }\n if (!ground) {\n this.label.position = [v.position.lng, v.position.lat, v.position.alt + height];\n } else {\n var objectsToExclude = _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(this.sdk.viewer.entities.values);\n this.getClampToHeight({\n lng: v.position.lng,\n lat: v.position.lat\n }, objectsToExclude).then(function (height) {\n _this15.label.position = [v.position.lng, v.position.lat, height];\n });\n }\n this.entity.polygon.hierarchy = new Cesium.CallbackProperty(function () {\n if (newpositions.length > 0) {\n return new Cesium.PolygonHierarchy(newpositions);\n } else {\n return new Cesium.PolygonHierarchy(positions);\n }\n }, false);\n this.entity.polyline.positions = new Cesium.CallbackProperty(function () {\n if (newpositions.length > 0) {\n return [].concat(newpositions, [newpositions[0], newpositions[1]]);\n } else {\n return [].concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(positions), [positions[0], positions[1]]);\n }\n }, false);\n }\n\n // 更新坐标\n }, {\n key: \"renewPositions\",\n value: function renewPositions() {\n var _this16 = this;\n if (this._error) {\n return;\n }\n var ground = false;\n var array = [];\n var positions = this.options.positions;\n for (var i = 0; i < positions.length; i++) {\n array.push([positions[i].lng, positions[i].lat]);\n }\n array.push([positions[0].lng, positions[0].lat]);\n var height = 0;\n var polygon = turf.polygon([array]);\n var centroid = turf.centroid(polygon);\n switch (this.options.heightMode) {\n case '0':\n case 0:\n ground = false;\n break;\n case '1':\n case 1:\n height = this.sdk.viewer.scene.globe.getHeight(Cesium.Cartographic.fromDegrees(centroid.geometry.coordinates[0], centroid.geometry.coordinates[1])) || 0;\n ground = false;\n break;\n case '2':\n case 2:\n ground = true;\n break;\n }\n var fromDegreesArray = [];\n if (!ground && this.nodePoints.length == 0) {\n for (var _i25 = 0; _i25 < positions.length; _i25++) {\n fromDegreesArray.push(positions[_i25].lng, positions[_i25].lat, this.height + height);\n }\n this.positions = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray);\n this.label && (this.label.position = [centroid.geometry.coordinates[0], centroid.geometry.coordinates[1], this.height + height]);\n } else {\n for (var _i26 = 0; _i26 < positions.length; _i26++) {\n fromDegreesArray.push(positions[_i26].lng, positions[_i26].lat);\n }\n this.positions = Cesium.Cartesian3.fromDegreesArray(fromDegreesArray);\n setTimeout(function () {\n if (!_this16.sdk.viewer) {\n return;\n }\n var objectsToExclude = _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(_this16.sdk.viewer.entities.values);\n _this16.getClampToHeight({\n lng: centroid.geometry.coordinates[0],\n lat: centroid.geometry.coordinates[1]\n }, objectsToExclude).then(function (height) {\n _this16.label && (_this16.label.position = [centroid.geometry.coordinates[0], centroid.geometry.coordinates[1], height]);\n });\n }, 100);\n }\n\n // 计算投影面积\n this.areaByMeter = this.computeArea(positions);\n this.areaChangeCallBack && this.areaChangeCallBack();\n return fromDegreesArray;\n }\n }, {\n key: \"setDIV\",\n value: function () {\n var _setDIV = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee6() {\n var _this17 = this;\n var options,\n positions,\n i,\n polygon,\n centroid,\n height,\n objectsToExclude,\n siteInfoDom,\n siteInfoPosition,\n _args6 = arguments;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee6$(_context6) {\n while (1) switch (_context6.prev = _context6.next) {\n case 0:\n options = _args6.length > 0 && _args6[0] !== undefined ? _args6[0] : {\n domid: '',\n x: 10,\n y: 10\n };\n options.x = options.x || options.x === 0 ? options.x : 10;\n options.y = options.y || options.y === 0 ? options.y : 10;\n positions = [[]];\n for (i = 0; i < this.options.positions.length; i++) {\n positions[0].push([this.options.positions[i].lng, this.options.positions[i].lat]);\n }\n positions[0].push([this.options.positions[0].lng, this.options.positions[0].lat]);\n polygon = turf.polygon(positions);\n centroid = turf.pointOnFeature(polygon);\n if (ground) {\n _context6.next = 12;\n break;\n }\n height = this.options.height;\n _context6.next = 16;\n break;\n case 12:\n objectsToExclude = _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(this.sdk.viewer.entities.values);\n _context6.next = 15;\n return this.getClampToHeight({\n lng: centroid.geometry.coordinates[0],\n lat: centroid.geometry.coordinates[1]\n }, objectsToExclude);\n case 15:\n height = _context6.sent;\n case 16:\n siteInfoDom = document.getElementById(options.domid);\n siteInfoPosition = Cesium.Cartesian3.fromDegrees(centroid.geometry.coordinates[0], centroid.geometry.coordinates[1], height);\n this.sdk.viewer.scene.postRender.addEventListener(function (percentage) {\n //转换到屏幕坐标\n if (siteInfoDom.style.display === 'block' || siteInfoDom.style.display === '') {\n var winpos = _this17.sdk.viewer.scene.cartesianToCanvasCoordinates(siteInfoPosition);\n if (winpos) {\n siteInfoDom.style.left = (winpos.x + options.x).toFixed(0) + 'px';\n siteInfoDom.style.top = (winpos.y + options.y).toFixed(0) + 'px';\n }\n }\n });\n case 19:\n case \"end\":\n return _context6.stop();\n }\n }, _callee6, this);\n }));\n function setDIV() {\n return _setDIV.apply(this, arguments);\n }\n return setDIV;\n }()\n }], [{\n key: \"create\",\n value: function create(that) {\n var ground;\n if (that.heightMode == 2) {\n ground = true;\n } else {\n ground = false;\n }\n that.renewPositions();\n var material = Cesium.Color.fromCssColorString(that.options.color);\n if (that.sdk.viewer.scene.mode === 2) {\n that.options.heightMode = 0;\n ground = false;\n material = new Cesium.CustomColorMaterialSource({\n color: that.options.color\n });\n }\n that.entity = that.sdk.viewer.entities.add({\n show: that.options.show,\n id: that.options.id,\n polygon: {\n hierarchy: new Cesium.PolygonHierarchy(that.positions),\n perPositionHeight: !ground ? true : false,\n material: material,\n zIndex: that.sdk._entityZIndex\n },\n polyline: _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default()(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default()({\n positions: [].concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(that.positions), [that.positions[0], that.positions[1]]),\n width: that.options.line.width,\n arcType: Cesium.ArcType.NONE,\n material: Cesium.Color.fromCssColorString(that.options.line.color),\n clampToGround: !ground ? false : true\n }, \"arcType\", !ground ? Cesium.ArcType.NONE : Cesium.ArcType.GEODESIC), \"zIndex\", that.sdk._entityZIndex)\n });\n that.sdk._entityZIndex++;\n PolygonObject.createLabel(that);\n Object(_Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_17__[\"syncData\"])(that.sdk, that.options.id);\n if (that.options.show) {\n Object(_Global_SplitScreen__WEBPACK_IMPORTED_MODULE_20__[\"setSplitDirection\"])(0, that.options.id);\n }\n }\n }, {\n key: \"createLabel\",\n value: function () {\n var _createLabel = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee7(that) {\n var positions, i, polygon, centroid, height, ground, _i27, objectsToExclude;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee7$(_context7) {\n while (1) switch (_context7.prev = _context7.next) {\n case 0:\n positions = [[]];\n for (i = 0; i < that.options.positions.length; i++) {\n positions[0].push([that.options.positions[i].lng, that.options.positions[i].lat]);\n }\n positions[0].push([that.options.positions[0].lng, that.options.positions[0].lat]);\n polygon = turf.polygon(positions); // let centroid = turf.centroid(polygon);\n centroid = turf.pointOnFeature(polygon);\n height = 0;\n _context7.t0 = that.heightMode;\n _context7.next = _context7.t0 === 0 ? 9 : _context7.t0 === '0' ? 9 : _context7.t0 === 1 ? 11 : _context7.t0 === '1' ? 11 : _context7.t0 === 2 ? 14 : _context7.t0 === '2' ? 14 : 16;\n break;\n case 9:\n ground = false;\n return _context7.abrupt(\"break\", 16);\n case 11:\n for (_i27 = 0; _i27 < positions.length; _i27++) {\n height = that.sdk.viewer.scene.globe.getHeight(Cesium.Cartographic.fromDegrees(positions[_i27].lng, positions[_i27].lat));\n }\n ground = false;\n return _context7.abrupt(\"break\", 16);\n case 14:\n ground = true;\n return _context7.abrupt(\"break\", 16);\n case 16:\n if (ground) {\n _context7.next = 20;\n break;\n }\n height = that.options.height + height;\n _context7.next = 24;\n break;\n case 20:\n objectsToExclude = _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2___default()(that.sdk.viewer.entities.values);\n _context7.next = 23;\n return that.getClampToHeight({\n lng: centroid.geometry.coordinates[0],\n lat: centroid.geometry.coordinates[1]\n }, objectsToExclude);\n case 23:\n height = _context7.sent;\n case 24:\n // if (!that.options.label.position) {\n // that.options.label.position = {\n // lng: centroid.geometry.coordinates[0],\n // lat: centroid.geometry.coordinates[1],\n // alt: height\n // }\n // }\n that.options.label.position = {\n lng: centroid.geometry.coordinates[0],\n lat: centroid.geometry.coordinates[1],\n alt: height\n };\n // 标签\n that.label = new _LabelObject__WEBPACK_IMPORTED_MODULE_14__[\"default\"](that.sdk, {\n id: that.options.id,\n show: that.options.show ? that.options.label.show : false,\n position: [that.options.label.position.lng, that.options.label.position.lat, that.options.label.position.alt],\n text: that.options.name,\n fontSize: that.options.label.fontSize,\n fontFamily: that.options.label.fontFamily,\n color: that.options.label.color,\n pixelOffset: that.options.label.pixelOffset,\n backgroundColor: that.options.label.backgroundColor,\n lineColor: that.options.label.lineColor,\n lineWidth: that.options.label.lineWidth,\n scaleByDistance: that.options.label.scaleByDistance,\n near: that.options.label.near,\n far: that.options.label.far,\n ground: ground\n });\n case 26:\n case \"end\":\n return _context7.stop();\n }\n }, _callee7);\n }));\n function createLabel(_x4) {\n return _createLabel.apply(this, arguments);\n }\n return createLabel;\n }()\n }]);\n}(_index__WEBPACK_IMPORTED_MODULE_13__[\"default\"]);\n/* harmony default export */ __webpack_exports__[\"default\"] = (PolygonObject);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvT2JqL0Jhc2UvUG9seWdvbk9iamVjdC9pbmRleC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3NyYy9PYmovQmFzZS9Qb2x5Z29uT2JqZWN0L2luZGV4LmpzP2M0ZDMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiAqIOWkmui+ueW9olxyXG4gKi9cclxuaW1wb3J0IERpYWxvZyBmcm9tICcuLi8uLi9FbGVtZW50L0RpYWxvZydcclxuaW1wb3J0IGN5X3RhYnMgZnJvbSAnLi4vLi4vRWxlbWVudC9jeV9odG1sX3RhYnMnXHJcbmltcG9ydCByaWNoVGV4dCBmcm9tICcuLi8uLi9FbGVtZW50L3JpY2hUZXh0J1xyXG5pbXBvcnQgeyBodG1sIH0gZnJvbSAnLi9fZWxlbWVudCdcclxuaW1wb3J0IEJhc2UgZnJvbSAnLi4vaW5kZXgnXHJcbmltcG9ydCBMYWJlbE9iamVjdCBmcm9tICcuLi9MYWJlbE9iamVjdCdcclxuaW1wb3J0IE1vdXNlRXZlbnQgZnJvbSAnLi4vLi4vLi4vRXZlbnQvaW5kZXgnXHJcbmltcG9ydCBNb3VzZVRpcCBmcm9tICcuLi8uLi8uLi9Nb3VzZVRpcCdcclxuaW1wb3J0IHsgc3luY0RhdGEgfSBmcm9tICcuLi8uLi8uLi9HbG9iYWwvTXVsdGlWaWV3cG9ydE1vZGUnXHJcbmltcG9ydCB7IGxlZ3AgfSBmcm9tICcuLi8uLi9FbGVtZW50L2RhdGFsaXN0J1xyXG5pbXBvcnQgeyBnZXRGb250TGlzdCwgZ2V0Rm9udEZhbWlseU5hbWUgfSBmcm9tICcuLi8uLi9FbGVtZW50L2ZvbnRTZWxlY3QnXHJcbmltcG9ydCB7IHNldFNwbGl0RGlyZWN0aW9uLCBzeW5jU3BsaXREYXRhLCBzZXRBY3RpdmVJZCB9IGZyb20gJy4uLy4uLy4uL0dsb2JhbC9TcGxpdFNjcmVlbidcclxuaW1wb3J0IHsgc2V0QWN0aXZlVmlld2VyLCBjbG9zZVJvdGF0ZUFyb3VuZCwgY2xvc2VWaWV3Rm9sbG93IH0gZnJvbSAnLi4vLi4vLi4vR2xvYmFsL2dsb2JhbCdcclxuLy8gaW1wb3J0IEVkaXRQYXJ0aWNsZSBmcm9tIFwiLi4vLi4vTW9kZWxDb250cm9sbGVyL0VkaXRQYXJ0aWNsZVwiO1xyXG5cclxuY2xhc3MgUG9seWdvbk9iamVjdCBleHRlbmRzIEJhc2Uge1xyXG4gIC8qKlxyXG4gICAqIEBjb25zdHJ1Y3RvclxyXG4gICAqIEBkZXNjcmlwdGlvbiDlpJrovrnlvaJcclxuICAgKiBAcGFyYW0gc2RrXHJcbiAgICogQHBhcmFtIG9wdGlvbnMge29iamVjdH0g5bGe5oCnXHJcbiAgICogQHBhcmFtIG9wdGlvbnMuaWQge3N0cmluZ30g5ZSv5LiA5qCH6K+GXHJcbiAgICogQHBhcmFtIG9wdGlvbnMuc2hvdz10cnVlIHtib29sZWFufSDmmL7npLov6ZqQ6JePXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubmFtZSB7c3RyaW5nfSDlkI3np7BcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5jb2xvcj0ncmdiYSgyNTUsIDAsIDAsIDAuNSknIHtzdHJpbmd9IOminOiJslxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmhlaWdodCB7bnVtYmVyfSDpq5jluqZcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5oZWlnaHRNb2RlPTJ7bnVtYmVyfSDpq5jluqbmqKHlvI/vvIgw77ya5rW35ouU6auY5bqm77ybMe+8muebuOWvueWcsOihqO+8mzLvvJrkvp3pmYTmqKHlvI/vvIlcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5saW5lIHtvYmplY3R9IOi+ueahhlxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxpbmUud2lkdGg9MiB7c3RyaW5nfSDovrnmoYblrr1cclxuICAgKiBAcGFyYW0gb3B0aW9ucy5saW5lLmNvbG9yPVwicmdiYSgxNTUsIDE1NSwgMTI0LCAwLjg5KVwiIHtzdHJpbmd9IOi+ueahhuminOiJslxyXG4gICAqIEBwYXJhbSB7QXJyYXkuPG9iamVjdD59IG9wdGlvbnMucG9zaXRpb25zIOW/heWhq++8jOe7j+e6rOW6puWSjOmrmOW6pueahOWIl+ihqO+8jOWAvOS6pOabvyBbe2xvbixsYXQsYWx0fSwuLi5dXHJcbiAgICogQHBhcmFtIG9wdGlvbnMucG9zaXRpb25zW10ubG5nIHtudW1iZXJ9IOe7j+W6plxyXG4gICAqIEBwYXJhbSBvcHRpb25zLnBvc2l0aW9uc1tdLmxhdCB7bnVtYmVyfSDnuqzluqZcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5wb3NpdGlvbnNbXS5hbHQge251bWJlcn0g6auY5bqmXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwge29iamVjdH0g5qCH562+5a+56LGhXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwudGV4dCB7c3RyaW5nfSDmoIfnrb7mlofmnKxcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5sYWJlbC5zaG93IHtzdHJpbmd9IOagh+etvuaYvumakFxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLnBvc2l0aW9uIHtzdHJpbmd9IOagh+etvuS9jee9rlxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLnBvc2l0aW9uIHtvYmplY3R9IOagh+etvuS9jee9rlxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLnBvc2l0aW9uLmxuZyB7bnVtYmVyfSDnu4/luqZcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5sYWJlbC5wb3NpdGlvbi5sYXQge251bWJlcn0g57qs5bqmXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwucG9zaXRpb24uYWx0IHtudW1iZXJ9IOmrmOW6plxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLmZvbnRTaXplPTIwIHtudW1iZXJ9IOWtl+S9k+Wkp+Wwj1xyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLmZvbnRGYW1pbHk9MCB7bnVtYmVyfSDlrZfkvZPpobkgMO+8mum7keS9k++8mzHvvJrmgJ3mupDpu5HkvZPvvJsy77ya5bqe6Zeo5q2j6YGT5qCH6aKY5L2T77ybM++8muaVsOm7keS9k1xyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLmNvbG9yPSNmZmZmZmYge3N0cmluZ30g5a2X5L2T6aKc6ImyXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwubGluZVdpZHRoPTQge251bWJlcn0g5byV57q/5a69XHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwubGluZUNvbG9yPSMwMGZmZmY4MCB7c3RyaW5nfSDlvJXnur/popzoibJcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5sYWJlbC5waXhlbE9mZnNldD0yMCB7bnVtYmVyfSDlrZfkvZPlgY/np7so5byV57q/6ZW/5bqmKVxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLmJhY2tncm91bmRDb2xvcj1bJyMwMGZmZmY4MCcsICcjMDBmZmZmODAnXSB7YXJyYXl9IOiDjOaZr+minOiJslxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLnNjYWxlQnlEaXN0YW5jZSB7Ym9vbGVhbn0g6Led56a757yp5pS+XHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwubmVhcj0yMDAwIHtudW1iZXJ9IOinhumHjue8qeaUvuacgOi/kei3neemu1xyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLmZhcj0xMDAwMDAge251bWJlcn0g6KeG6YeO57yp5pS+5pyA6L+c6Led56a7XHJcbiAgICogQHBhcmFtIG9wdGlvbnMuYXR0cmlidXRlIHtvYmplY3R9IOWxnuaAp+WGheWuuVxyXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zLmF0dHJpYnV0ZS5saW5rPXt9IOmTvuaOpVxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnQ9W11dIHthcnJheX0g6ZO+5o6l5YaF5a65XHJcbiAgICogQHBhcmFtIG9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudFtdLm5hbWUge3N0cmluZ30g6ZO+5o6l5ZCN56ewXHJcbiAgICogQHBhcmFtIG9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudFtdLnVybCB7c3RyaW5nfSDpk77mjqXlnLDlnYBcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5yaWNoVGV4dENvbnRlbnQge3N0cmluZ30g5a+M5paH5pys5YaF5a65XHJcbiAgICogQHBhcmFtIG9wdGlvbnMuY3VzdG9tVmlldyB7b2JqZWN0fSDpu5jorqTop4bop5JcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5jdXN0b21WaWV3Lm9yaWVudGF0aW9uIHtvYmplY3R9IOm7mOiupOinhuinkuaWueS9jVxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmN1c3RvbVZpZXcub3JpZW50YXRpb24uaGVhZGluZyB7bnVtYmVyfSDoiKrlkJHop5JcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5jdXN0b21WaWV3Lm9yaWVudGF0aW9uLnBpdGNoIHtudW1iZXJ9IOS/r+S7sOinklxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmN1c3RvbVZpZXcub3JpZW50YXRpb24ucm9sbCB7bnVtYmVyfSDnv7vmu5rop5JcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5jdXN0b21WaWV3LnJlbGF0aXZlUG9zaXRpb24ge29iamVjdH0g6KeG6KeS55u45a+55L2N572uXHJcbiAgICogQHBhcmFtIG9wdGlvbnMuY3VzdG9tVmlldy5yZWxhdGl2ZVBvc2l0aW9uLmxuZyB7bnVtYmVyfSDnu4/luqZcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5jdXN0b21WaWV3LnJlbGF0aXZlUG9zaXRpb24ubGF0IHtudW1iZXJ9IOe6rOW6plxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmN1c3RvbVZpZXcucmVsYXRpdmVQb3NpdGlvbi5hbHQge251bWJlcn0g6auY5bqmXHJcbiAgICogXHJcblxyXG5cclxuICAgKiBcclxuICAgKiBAcGFyYW0gX0RpYWxvZyB7b2JqZWN0fSDlvLnmoYbkuovku7ZcclxuICAgKiBAcGFyYW0gX0RpYWxvZy5jb25maXJtQ2FsbEJhY2sge2Z1bmN0aW9ufSDlvLnmoYbnoa7orqTml7bnmoTlm57osINcclxuICAgKiAqL1xyXG4gIGNvbnN0cnVjdG9yKHNkaywgb3B0aW9ucyA9IHt9LCBfRGlhbG9nID0ge30pIHtcclxuICAgIHN1cGVyKHNkaywgb3B0aW9ucylcclxuICAgIHRoaXMub3B0aW9ucy5uYW1lID0gb3B0aW9ucy5uYW1lIHx8ICfmnKrlkb3lkI3lr7nosaEnXHJcbiAgICB0aGlzLm9wdGlvbnMuY29sb3IgPSBvcHRpb25zLmNvbG9yIHx8ICdyZ2JhKDI1NSwgMCwgMCwgMC41KSdcclxuICAgIHRoaXMub3B0aW9ucy5zaG93ID1cclxuICAgICAgb3B0aW9ucy5zaG93IHx8IG9wdGlvbnMuc2hvdyA9PT0gZmFsc2UgPyBvcHRpb25zLnNob3cgOiB0cnVlXHJcbiAgICB0aGlzLm9wdGlvbnMuaGVpZ2h0TW9kZSA9IChvcHRpb25zLmhlaWdodE1vZGUgfHwgb3B0aW9ucy5oZWlnaHRNb2RlID09IDApID8gb3B0aW9ucy5oZWlnaHRNb2RlIDogMlxyXG4gICAgdGhpcy5vcHRpb25zLnBvc2l0aW9ucyA9IG9wdGlvbnMucG9zaXRpb25zIHx8IFtdXHJcbiAgICB0aGlzLm9wdGlvbnMubGluZSA9IG9wdGlvbnMubGluZSB8fCB7fVxyXG4gICAgdGhpcy5vcHRpb25zLmxpbmUud2lkdGggPSAoKHRoaXMub3B0aW9ucy5saW5lLndpZHRoIHx8IHRoaXMub3B0aW9ucy5saW5lLndpZHRoID09PSAwKSA/IHRoaXMub3B0aW9ucy5saW5lLndpZHRoIDogMylcclxuICAgIHRoaXMub3B0aW9ucy5saW5lLmNvbG9yID1cclxuICAgICAgdGhpcy5vcHRpb25zLmxpbmUuY29sb3IgfHwgJ3JnYmEoMjU1LCAwLCAwLCAxKSdcclxuICAgIHRoaXMuZW50aXR5XHJcbiAgICB0aGlzLmV2ZW50ID0gbmV3IE1vdXNlRXZlbnQodGhpcy5zZGspXHJcbiAgICB0aGlzLm9wZXJhdGUgPSB7fVxyXG4gICAgdGhpcy5fZWxtcyA9IHt9XHJcbiAgICB0aGlzLkRpYWxvZyA9IF9EaWFsb2dcclxuICAgIHRoaXMubm9kZVBvaW50cyA9IFtdXHJcbiAgICBvcHRpb25zLmxhYmVsID0gb3B0aW9ucy5sYWJlbCB8fCB7fVxyXG4gICAgdGhpcy5vcHRpb25zLmxhYmVsID0ge1xyXG4gICAgICB0ZXh0OiB0aGlzLm9wdGlvbnMubmFtZSxcclxuICAgICAgc2hvdzogb3B0aW9ucy5sYWJlbC5zaG93IHx8IGZhbHNlLFxyXG4gICAgICBwb3NpdGlvbjogb3B0aW9ucy5sYWJlbC5wb3NpdGlvbixcclxuICAgICAgZm9udFNpemU6XHJcbiAgICAgICAgb3B0aW9ucy5sYWJlbC5mb250U2l6ZSB8fCBvcHRpb25zLmxhYmVsLmZvbnRTaXplID09PSAwXHJcbiAgICAgICAgICA/IG9wdGlvbnMubGFiZWwuZm9udFNpemVcclxuICAgICAgICAgIDogMjAsXHJcbiAgICAgIGZvbnRGYW1pbHk6IG9wdGlvbnMubGFiZWwuZm9udEZhbWlseSA/IG9wdGlvbnMubGFiZWwuZm9udEZhbWlseSA6IDAsXHJcbiAgICAgIGNvbG9yOiBvcHRpb25zLmxhYmVsLmNvbG9yIHx8ICcjZmZmZmZmJyxcclxuICAgICAgbGluZVdpZHRoOlxyXG4gICAgICAgIG9wdGlvbnMubGFiZWwubGluZVdpZHRoIHx8IG9wdGlvbnMubGFiZWwubGluZVdpZHRoID09PSAwXHJcbiAgICAgICAgICA/IG9wdGlvbnMubGFiZWwubGluZVdpZHRoXHJcbiAgICAgICAgICA6IDQsXHJcbiAgICAgIHBpeGVsT2Zmc2V0OlxyXG4gICAgICAgIG9wdGlvbnMubGFiZWwucGl4ZWxPZmZzZXQgfHwgb3B0aW9ucy5sYWJlbC5waXhlbE9mZnNldCA9PT0gMFxyXG4gICAgICAgICAgPyBvcHRpb25zLmxhYmVsLnBpeGVsT2Zmc2V0XHJcbiAgICAgICAgICA6IDIwLFxyXG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6IG9wdGlvbnMubGFiZWwuYmFja2dyb3VuZENvbG9yIHx8IFsnIzAwZmZmZjgwJywgJyMwMGZmZmY4MCddLFxyXG4gICAgICBsaW5lQ29sb3I6IG9wdGlvbnMubGFiZWwubGluZUNvbG9yIHx8ICcjMDBmZmZmODAnLFxyXG4gICAgICBzY2FsZUJ5RGlzdGFuY2U6IG9wdGlvbnMubGFiZWwuc2NhbGVCeURpc3RhbmNlIHx8IGZhbHNlLFxyXG4gICAgICBuZWFyOlxyXG4gICAgICAgIG9wdGlvbnMubGFiZWwubmVhciB8fCBvcHRpb25zLmxhYmVsLm5lYXIgPT09IDBcclxuICAgICAgICAgID8gb3B0aW9ucy5sYWJlbC5uZWFyXHJcbiAgICAgICAgICA6IDIwMDAsXHJcbiAgICAgIGZhcjpcclxuICAgICAgICBvcHRpb25zLmxhYmVsLmZhciB8fCBvcHRpb25zLmxhYmVsLmZhciA9PT0gMFxyXG4gICAgICAgICAgPyBvcHRpb25zLmxhYmVsLmZhclxyXG4gICAgICAgICAgOiAxMDAwMDBcclxuICAgIH1cclxuICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUgPSBvcHRpb25zLmF0dHJpYnV0ZSB8fCB7fVxyXG4gICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rIHx8IHt9XHJcbiAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudCA9XHJcbiAgICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50IHx8IFtdXHJcbiAgICAvLyB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmNhbWVyYSA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUuY2FtZXJhIHx8IHt9XHJcbiAgICAvLyB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmNhbWVyYS5jb250ZW50ID1cclxuICAgIC8vICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5jYW1lcmEuY29udGVudCB8fCBbXVxyXG4gICAgLy8gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52ciA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIgfHwge31cclxuICAgIC8vIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudCA9XHJcbiAgICAvLyAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudCB8fCBbXVxyXG4gICAgLy8gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5nb29kcyA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUuZ29vZHMgfHwge31cclxuICAgIC8vIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUuZ29vZHMuY29udGVudCA9XHJcbiAgICAvLyAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUuZ29vZHMuY29udGVudCB8fCBbXVxyXG5cclxuICAgIGRlbGV0ZSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmNhbWVyYVxyXG4gICAgZGVsZXRlIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnJcclxuICAgIGRlbGV0ZSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmdvb2RzXHJcblxyXG5cclxuICAgIGlmICghdGhpcy5vcHRpb25zLnBvc2l0aW9ucyB8fCB0aGlzLm9wdGlvbnMucG9zaXRpb25zLmxlbmd0aCA8IDMpIHtcclxuICAgICAgdGhpcy5fZXJyb3IgPSAn5aSa6L655b2i5pyA5bCR6ZyA6KaB5LiJ5Liq5Z2Q5qCH77yBJ1xyXG4gICAgICBjb25zb2xlLndhcm4odGhpcy5fZXJyb3IpXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAoIXRoaXMub3B0aW9ucy5oZWlnaHQgJiYgdGhpcy5vcHRpb25zLmhlaWdodCAhPT0gMCkge1xyXG4gICAgICAgIGxldCBoZWlnaHQgPSB0aGlzLm9wdGlvbnMucG9zaXRpb25zWzBdLmFsdFxyXG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgdGhpcy5vcHRpb25zLnBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgaWYgKGhlaWdodCA8IHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0uYWx0KSB7XHJcbiAgICAgICAgICAgIGhlaWdodCA9IHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0uYWx0XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMub3B0aW9ucy5oZWlnaHQgPSBoZWlnaHRcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnNkay5hZGRJbmNldGFuY2UodGhpcy5vcHRpb25zLmlkLCB0aGlzKVxyXG4gICAgICB0aGlzLl96SW5kZXggPSB0aGlzLnNkay5lbnRpdHlNYXAuc2l6ZVxyXG4gICAgICBQb2x5Z29uT2JqZWN0LmNyZWF0ZSh0aGlzKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IHR5cGUoKSB7XHJcbiAgICByZXR1cm4gJ1BvbHlnb25PYmplY3QnXHJcbiAgfVxyXG5cclxuICBnZXQgY29sb3IoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmNvbG9yXHJcbiAgfVxyXG4gIHNldCBjb2xvcih2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMuY29sb3IgPSB2IHx8ICdyZ2JhKDI1NSwgMCwgMCwgMC41KSdcclxuICAgIGlmICghdGhpcy5zZGsgfHwgIXRoaXMuc2RrLnZpZXdlciB8fCAhdGhpcy5lbnRpdHkgfHwgIXRoaXMuZW50aXR5LnBvbHlnb24pIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcbiAgICBpZiAoIXRoaXMuc2RrIHx8ICF0aGlzLnNkay52aWV3ZXIgfHwgIXRoaXMuZW50aXR5IHx8ICF0aGlzLmVudGl0eS5wb2x5Z29uKSB7XHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG4gICAgbGV0IG1hdGVyaWFsID0gQ2VzaXVtLkNvbG9yLmZyb21Dc3NDb2xvclN0cmluZyh0aGlzLm9wdGlvbnMuY29sb3IpXHJcbiAgICBpZiAodGhpcy5zZGsudmlld2VyLnNjZW5lLm1vZGUgPT09IDIpIHtcclxuICAgICAgdGhpcy5oZWlnaHRNb2RlID0gMFxyXG4gICAgICBtYXRlcmlhbCA9IG5ldyBDZXNpdW0uQ3VzdG9tQ29sb3JNYXRlcmlhbFNvdXJjZSh7XHJcbiAgICAgICAgY29sb3I6IHRoaXMub3B0aW9ucy5jb2xvclxyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gICAgdGhpcy5lbnRpdHkucG9seWdvbi5tYXRlcmlhbCA9IG1hdGVyaWFsXHJcbiAgICBpZiAodGhpcy5fZWxtcy5jb2xvcikge1xyXG4gICAgICB0aGlzLl9lbG1zLmNvbG9yLmZvckVhY2goKGl0ZW0sIGkpID0+IHtcclxuICAgICAgICBsZXQgY29sb3JQaWNrZXIgPSBuZXcgWUpDb2xvclBpY2tlcih7XHJcbiAgICAgICAgICBlbDogaXRlbS5lbCxcclxuICAgICAgICAgIHNpemU6ICdtaW5pJywgLy/popzoibJib3jnsbvlnotcclxuICAgICAgICAgIGFscGhhOiB0cnVlLCAvL+aYr+WQpuW8gOWQr+mAj+aYjuW6plxyXG4gICAgICAgICAgZGVmYXVsdENvbG9yOiB0aGlzLm9wdGlvbnMuY29sb3IsXHJcbiAgICAgICAgICBkaXNhYmxlZDogZmFsc2UsIC8v5piv5ZCm56aB5q2i5omT5byA6aKc6Imy6YCJ5oup5ZmoXHJcbiAgICAgICAgICBvcGVuUGlja2VyQW5pOiAnb3BhY2l0eScsIC8v5omT5byA6aKc6Imy6YCJ5oup5Zmo5Yqo55S7XHJcbiAgICAgICAgICBzdXJlOiBjID0+IHtcclxuICAgICAgICAgICAgdGhpcy5jb2xvciA9IGNcclxuICAgICAgICAgIH0sIC8v54K55Ye756Gu6K6k5oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgICAgICBjbGVhcjogKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmNvbG9yID0gJ3JnYmEoMjU1LDAsMCwwLjUpJ1xyXG4gICAgICAgICAgfSAvL+eCueWHu+a4heepuuaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgdGhpcy5fZWxtcy5jb2xvcltpXSA9IGNvbG9yUGlja2VyXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgaGVpZ2h0TW9kZSgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuaGVpZ2h0TW9kZSA/IHRoaXMub3B0aW9ucy5oZWlnaHRNb2RlIDogMFxyXG4gIH1cclxuICBzZXQgaGVpZ2h0TW9kZSh2KSB7XHJcbiAgICB0aGlzLmVudGl0eS5wb2x5Z29uLmhpZXJhcmNoeSA9IFtdXHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5vcHRpb25zLmhlaWdodE1vZGUgPSAodiB8fCB2ID09IDApID8gdiA6IDJcclxuICAgICAgdGhpcy5wb3NpdGlvbkVkaXRpbmcgPSBmYWxzZVxyXG4gICAgICBpZiAoIXRoaXMuZW50aXR5KSB7XHJcbiAgICAgICAgcmV0dXJuXHJcbiAgICAgIH1cclxuICAgICAgbGV0IHBvc2l0aW9ucyA9IHRoaXMub3B0aW9ucy5wb3NpdGlvbnNcclxuICAgICAgbGV0IGhlaWdodE1vZGVOYW1lID0gJydcclxuICAgICAgdGhpcy5jbG9zZU5vZGVFZGl0KClcclxuICAgICAgbGV0IGdyb3VuZCA9IGZhbHNlXHJcbiAgICAgIGxldCBkaXNhYmxlZCA9IGZhbHNlXHJcbiAgICAgIHRoaXMucmVuZXdQb3NpdGlvbnMoKVxyXG4gICAgICB0aGlzLmVudGl0eS5wb2x5bGluZS5wb3NpdGlvbnMgPSBbXHJcbiAgICAgICAgLi4udGhpcy5wb3NpdGlvbnMsXHJcbiAgICAgICAgdGhpcy5wb3NpdGlvbnNbMF0sXHJcbiAgICAgICAgdGhpcy5wb3NpdGlvbnNbMV1cclxuICAgICAgXVxyXG4gICAgICB0aGlzLmVudGl0eS5wb2x5Z29uLmhpZXJhcmNoeSA9IG5ldyBDZXNpdW0uUG9seWdvbkhpZXJhcmNoeShcclxuICAgICAgICB0aGlzLnBvc2l0aW9uc1xyXG4gICAgICApXHJcbiAgICAgIHN3aXRjaCAodGhpcy5vcHRpb25zLmhlaWdodE1vZGUpIHtcclxuICAgICAgICBjYXNlICcwJzpcclxuICAgICAgICBjYXNlIDA6XHJcbiAgICAgICAgICBoZWlnaHRNb2RlTmFtZSA9ICfmtbfmi5Tpq5jluqYnXHJcbiAgICAgICAgICBicmVha1xyXG4gICAgICAgIGNhc2UgJzEnOlxyXG4gICAgICAgIGNhc2UgMTpcclxuICAgICAgICAgIGhlaWdodE1vZGVOYW1lID0gJ+ebuOWvueWcsOihqCdcclxuICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgY2FzZSAnMic6XHJcbiAgICAgICAgY2FzZSAyOlxyXG4gICAgICAgICAgZ3JvdW5kID0gdHJ1ZVxyXG4gICAgICAgICAgZGlzYWJsZWQgPSB0cnVlXHJcbiAgICAgICAgICBoZWlnaHRNb2RlTmFtZSA9ICfkvp3pmYTmqKHlnosnXHJcbiAgICAgICAgICBicmVha1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMubGFiZWwuZ3JvdW5kID0gZ3JvdW5kXHJcbiAgICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLmNsYW1wVG9Hcm91bmQgPSBncm91bmRcclxuICAgICAgdGhpcy5lbnRpdHkucG9seWxpbmUuYXJjVHlwZSA9ICFncm91bmQgPyBDZXNpdW0uQXJjVHlwZS5OT05FIDogQ2VzaXVtLkFyY1R5cGUuR0VPREVTSUMsXHJcbiAgICAgICAgdGhpcy5lbnRpdHkucG9seWdvbi5wZXJQb3NpdGlvbkhlaWdodCA9ICFncm91bmQgPyB0cnVlIDogZmFsc2VcclxuICAgICAgdGhpcy5fZWxtcy5oZWlnaHRNb2RlICYmICh0aGlzLl9lbG1zLmhlaWdodE1vZGUudmFsdWUgPSBoZWlnaHRNb2RlTmFtZSlcclxuICAgICAgdGhpcy5fZWxtcy5oZWlnaHRNb2RlT2JqZWN0ICYmICh0aGlzLl9lbG1zLmhlaWdodE1vZGVPYmplY3QubGVncF9zZWFyY2hBY3RpdmUoXHJcbiAgICAgICAgaGVpZ2h0TW9kZU5hbWVcclxuICAgICAgKSlcclxuICAgIH0sIDUwKTtcclxuICB9XHJcblxyXG4gIGdldCBoZWlnaHQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmhlaWdodFxyXG4gIH1cclxuXHJcbiAgc2V0IGhlaWdodCh2KSB7XHJcbiAgICBpZiAoIXYgfHwgaXNOYU4oTnVtYmVyKHYpKSkge1xyXG4gICAgICB0aGlzLm9wdGlvbnMuaGVpZ2h0ID0gMFxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMub3B0aW9ucy5oZWlnaHQgPSBOdW1iZXIoTnVtYmVyKHYpLnRvRml4ZWQoMikpXHJcbiAgICB9XHJcbiAgICBsZXQgZ3JvdW5kXHJcbiAgICBpZiAodGhpcy5oZWlnaHRNb2RlID09IDIpIHtcclxuICAgICAgZ3JvdW5kID0gdHJ1ZVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZ3JvdW5kID0gZmFsc2VcclxuICAgIH1cclxuICAgIHRoaXMucmVuZXdQb3NpdGlvbnMoKVxyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMuZW50aXR5LnBvbHlnb24uaGllcmFyY2h5ID0gbmV3IENlc2l1bS5Qb2x5Z29uSGllcmFyY2h5KHRoaXMucG9zaXRpb25zKVxyXG4gICAgICB0aGlzLmVudGl0eS5wb2x5Z29uLnBlclBvc2l0aW9uSGVpZ2h0ID0gIWdyb3VuZCA/IHRydWUgOiBmYWxzZVxyXG4gICAgICB0aGlzLmVudGl0eS5wb2x5bGluZS5wb3NpdGlvbnMgPSBbXHJcbiAgICAgICAgLi4udGhpcy5wb3NpdGlvbnMsXHJcbiAgICAgICAgdGhpcy5wb3NpdGlvbnNbMF0sXHJcbiAgICAgICAgdGhpcy5wb3NpdGlvbnNbMV1cclxuICAgICAgXVxyXG4gICAgICB0aGlzLmVudGl0eS5wb2x5bGluZS5jbGFtcFRvR3JvdW5kID0gIWdyb3VuZCA/IGZhbHNlIDogdHJ1ZVxyXG4gICAgICB0aGlzLmVudGl0eS5wb2x5bGluZS5hcmNUeXBlID0gIWdyb3VuZCA/IENlc2l1bS5BcmNUeXBlLk5PTkUgOiBDZXNpdW0uQXJjVHlwZS5HRU9ERVNJQ1xyXG4gICAgfSwgMCk7XHJcblxyXG4gICAgdGhpcy5fZWxtcy5hbHQgJiZcclxuICAgICAgdGhpcy5fZWxtcy5hbHQuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICBpdGVtLmlubmVySFRNTCA9IHRoaXMub3B0aW9ucy5oZWlnaHRcclxuICAgICAgfSlcclxuICB9XHJcblxyXG4gIGdldCBsaW5lQ29sb3IoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmxpbmUuY29sb3JcclxuICB9XHJcbiAgc2V0IGxpbmVDb2xvcih2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMubGluZS5jb2xvciA9IHYgfHwgJ3JnYmEoMjU1LCAwLCAwLCAwLjUpJ1xyXG4gICAgaWYgKCF0aGlzLnNkayB8fCAhdGhpcy5zZGsudmlld2VyIHx8ICF0aGlzLmVudGl0eSB8fCAhdGhpcy5lbnRpdHkucG9seWxpbmUpIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcbiAgICB0aGlzLmVudGl0eS5wb2x5bGluZS5tYXRlcmlhbCA9IENlc2l1bS5Db2xvci5mcm9tQ3NzQ29sb3JTdHJpbmcodGhpcy5vcHRpb25zLmxpbmUuY29sb3IpXHJcbiAgICBpZiAodGhpcy5fZWxtcy5saW5lQ29sb3IpIHtcclxuICAgICAgdGhpcy5fZWxtcy5saW5lQ29sb3IuZm9yRWFjaCgoaXRlbSwgaSkgPT4ge1xyXG4gICAgICAgIGxldCBsaW5lQ29sb3JQaWNrZXIgPSBuZXcgWUpDb2xvclBpY2tlcih7XHJcbiAgICAgICAgICBlbDogaXRlbS5lbCxcclxuICAgICAgICAgIHNpemU6ICdtaW5pJywgLy/popzoibJib3jnsbvlnotcclxuICAgICAgICAgIGFscGhhOiB0cnVlLCAvL+aYr+WQpuW8gOWQr+mAj+aYjuW6plxyXG4gICAgICAgICAgZGVmYXVsdENvbG9yOiB0aGlzLm9wdGlvbnMubGluZS5jb2xvcixcclxuICAgICAgICAgIGRpc2FibGVkOiBmYWxzZSwgLy/mmK/lkKbnpoHmraLmiZPlvIDpopzoibLpgInmi6nlmahcclxuICAgICAgICAgIG9wZW5QaWNrZXJBbmk6ICdvcGFjaXR5JywgLy/miZPlvIDpopzoibLpgInmi6nlmajliqjnlLtcclxuICAgICAgICAgIHN1cmU6IGMgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxpbmVDb2xvciA9IGNcclxuICAgICAgICAgIH0sIC8v54K55Ye756Gu6K6k5oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgICAgICBjbGVhcjogKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxpbmVDb2xvciA9ICdyZ2JhKDI1NSwwLDAsMC41KSdcclxuICAgICAgICAgIH0gLy/ngrnlh7vmuIXnqbrmjInpkq7kuovku7blm57osINcclxuICAgICAgICB9KVxyXG4gICAgICAgIHRoaXMuX2VsbXMubGluZUNvbG9yW2ldID0gbGluZUNvbG9yUGlja2VyXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgbGluZVdpZHRoKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5saW5lLndpZHRoXHJcbiAgfVxyXG4gIHNldCBsaW5lV2lkdGgodikge1xyXG4gICAgdGhpcy5vcHRpb25zLmxpbmUud2lkdGggPSAoKHYgfHwgdiA9PT0gMCkgPyB2IDogMylcclxuICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLndpZHRoID0gdGhpcy5vcHRpb25zLmxpbmUud2lkdGhcclxuICAgIHRoaXMuX2VsbXMubGluZVdpZHRoICYmXHJcbiAgICAgIHRoaXMuX2VsbXMubGluZVdpZHRoLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgaXRlbS52YWx1ZSA9IHZcclxuICAgICAgfSlcclxuICB9XHJcblxyXG4gIGdldCBsYWJlbFNob3coKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmxhYmVsLnNob3dcclxuICB9XHJcbiAgc2V0IGxhYmVsU2hvdyh2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMubGFiZWwuc2hvdyA9IHZcclxuICAgIGlmICh0aGlzLnNob3cgJiYgIXRoaXMuc2hvd1ZpZXcgfHwgdGhpcy5zaG93VmlldyA9PSAzKSB7XHJcbiAgICAgIHRoaXMubGFiZWwuc2hvdyA9IHZcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMubGFiZWwuc2hvdyA9IGZhbHNlXHJcbiAgICB9XHJcbiAgICB0aGlzLl9lbG1zLmxhYmVsU2hvdyAmJlxyXG4gICAgICB0aGlzLl9lbG1zLmxhYmVsU2hvdy5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgIGl0ZW0uY2hlY2tlZCA9IHZcclxuICAgICAgfSlcclxuICB9XHJcblxyXG4gIGdldCBsYWJlbEZvbnRGYW1pbHkoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmxhYmVsLmZvbnRGYW1pbHlcclxuICB9XHJcblxyXG4gIHNldCBsYWJlbEZvbnRGYW1pbHkodikge1xyXG4gICAgdGhpcy5vcHRpb25zLmxhYmVsLmZvbnRGYW1pbHkgPSB2IHx8IDBcclxuICAgIHRoaXMubGFiZWwgJiYgKHRoaXMubGFiZWwuZm9udEZhbWlseSA9IHRoaXMub3B0aW9ucy5sYWJlbC5mb250RmFtaWx5KVxyXG5cclxuICAgIGxldCBuYW1lID0gZ2V0Rm9udEZhbWlseU5hbWUodGhpcy5sYWJlbEZvbnRGYW1pbHkpIHx8ICcnXHJcbiAgICB0aGlzLl9lbG1zLmxhYmVsRm9udEZhbWlseSAmJlxyXG4gICAgICB0aGlzLl9lbG1zLmxhYmVsRm9udEZhbWlseS5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgIGl0ZW0udmFsdWUgPSBuYW1lXHJcbiAgICAgIH0pXHJcbiAgfVxyXG5cclxuICBnZXQgbGFiZWxDb2xvcigpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubGFiZWwuY29sb3JcclxuICB9XHJcbiAgc2V0IGxhYmVsQ29sb3Iodikge1xyXG4gICAgdGhpcy5vcHRpb25zLmxhYmVsLmNvbG9yID0gdlxyXG4gICAgdGhpcy5sYWJlbC5jb2xvciA9IHZcclxuICAgIGlmICh0aGlzLl9lbG1zLmxhYmVsQ29sb3IpIHtcclxuICAgICAgdGhpcy5fZWxtcy5sYWJlbENvbG9yLmZvckVhY2goKGl0ZW0sIGkpID0+IHtcclxuICAgICAgICBsZXQgbGFiZWxDb2xvclBpY2tlciA9IG5ldyBZSkNvbG9yUGlja2VyKHtcclxuICAgICAgICAgIGVsOiBpdGVtLmVsLFxyXG4gICAgICAgICAgc2l6ZTogJ21pbmknLCAvL+minOiJsmJveOexu+Wei1xyXG4gICAgICAgICAgYWxwaGE6IHRydWUsIC8v5piv5ZCm5byA5ZCv6YCP5piO5bqmXHJcbiAgICAgICAgICBkZWZhdWx0Q29sb3I6IHRoaXMubGFiZWxDb2xvcixcclxuICAgICAgICAgIGRpc2FibGVkOiBmYWxzZSwgLy/mmK/lkKbnpoHmraLmiZPlvIDpopzoibLpgInmi6nlmahcclxuICAgICAgICAgIG9wZW5QaWNrZXJBbmk6ICdvcGFjaXR5JywgLy/miZPlvIDpopzoibLpgInmi6nlmajliqjnlLtcclxuICAgICAgICAgIHN1cmU6IGNvbG9yID0+IHtcclxuICAgICAgICAgICAgdGhpcy5sYWJlbENvbG9yID0gY29sb3JcclxuICAgICAgICAgIH0sIC8v54K55Ye756Gu6K6k5oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgICAgICBjbGVhcjogKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxhYmVsQ29sb3IgPSAncmdiYSgyNTUsMjU1LDI1NSwxKSdcclxuICAgICAgICAgIH0gLy/ngrnlh7vmuIXnqbrmjInpkq7kuovku7blm57osINcclxuICAgICAgICB9KVxyXG4gICAgICAgIHRoaXMuX2VsbXMubGFiZWxDb2xvcltpXSA9IGxhYmVsQ29sb3JQaWNrZXJcclxuICAgICAgfSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCBsYWJlbEZvbnRTaXplKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5sYWJlbC5mb250U2l6ZVxyXG4gIH1cclxuICBzZXQgbGFiZWxGb250U2l6ZSh2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMubGFiZWwuZm9udFNpemUgPSB2XHJcbiAgICB0aGlzLmxhYmVsLmZvbnRTaXplID0gdlxyXG4gICAgdGhpcy5fZWxtcy5sYWJlbEZvbnRTaXplICYmXHJcbiAgICAgIHRoaXMuX2VsbXMubGFiZWxGb250U2l6ZS5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgIGl0ZW0udmFsdWUgPSB2XHJcbiAgICAgIH0pXHJcbiAgfVxyXG5cclxuICBnZXQgbGFiZWxTY2FsZUJ5RGlzdGFuY2UoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmxhYmVsLnNjYWxlQnlEaXN0YW5jZVxyXG4gIH1cclxuICBzZXQgbGFiZWxTY2FsZUJ5RGlzdGFuY2Uodikge1xyXG4gICAgdGhpcy5vcHRpb25zLmxhYmVsLnNjYWxlQnlEaXN0YW5jZSA9IHZcclxuICAgIHRoaXMubGFiZWwuc2NhbGVCeURpc3RhbmNlID0gdlxyXG4gICAgdGhpcy5fZWxtcy5sYWJlbFNjYWxlQnlEaXN0YW5jZSAmJlxyXG4gICAgICB0aGlzLl9lbG1zLmxhYmVsU2NhbGVCeURpc3RhbmNlLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgaXRlbS5jaGVja2VkID0gdlxyXG4gICAgICB9KVxyXG4gIH1cclxuXHJcbiAgZ2V0IGxhYmVsTmVhcigpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubGFiZWwubmVhclxyXG4gIH1cclxuICBzZXQgbGFiZWxOZWFyKHYpIHtcclxuICAgIGxldCBuZWFyID0gdlxyXG4gICAgaWYgKG5lYXIgPiB0aGlzLmxhYmVsRmFyKSB7XHJcbiAgICAgIG5lYXIgPSB0aGlzLmxhYmVsRmFyXHJcbiAgICB9XHJcbiAgICB0aGlzLm9wdGlvbnMubGFiZWwubmVhciA9IG5lYXJcclxuICAgIHRoaXMubGFiZWwubmVhciA9IG5lYXJcclxuICAgIHRoaXMuX2VsbXMubGFiZWxOZWFyICYmIHRoaXMuX2VsbXMubGFiZWxOZWFyLmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgaXRlbS52YWx1ZSA9IG5lYXJcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBnZXQgbGFiZWxGYXIoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmxhYmVsLmZhclxyXG4gIH1cclxuICBzZXQgbGFiZWxGYXIodikge1xyXG4gICAgbGV0IGZhciA9IHZcclxuICAgIGlmIChmYXIgPCB0aGlzLmxhYmVsTmVhcikge1xyXG4gICAgICBmYXIgPSB0aGlzLmxhYmVsTmVhclxyXG4gICAgfVxyXG4gICAgdGhpcy5vcHRpb25zLmxhYmVsLmZhciA9IGZhclxyXG4gICAgdGhpcy5sYWJlbC5mYXIgPSBmYXJcclxuICAgIHRoaXMuX2VsbXMubGFiZWxGYXIgJiYgdGhpcy5fZWxtcy5sYWJlbEZhci5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgIGl0ZW0udmFsdWUgPSBmYXJcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBnZXQgbGFiZWxMaW5lV2lkdGgoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmxhYmVsLmxpbmVXaWR0aFxyXG4gIH1cclxuICBzZXQgbGFiZWxMaW5lV2lkdGgodikge1xyXG4gICAgdGhpcy5vcHRpb25zLmxhYmVsLmxpbmVXaWR0aCA9IHZcclxuICAgIHRoaXMubGFiZWwubGluZVdpZHRoID0gdlxyXG4gICAgdGhpcy5fZWxtcy5sYWJlbExpbmVXaWR0aCAmJlxyXG4gICAgICB0aGlzLl9lbG1zLmxhYmVsTGluZVdpZHRoLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgaXRlbS52YWx1ZSA9IHZcclxuICAgICAgfSlcclxuICB9XHJcblxyXG4gIGdldCBsYWJlbFBpeGVsT2Zmc2V0KCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5sYWJlbC5waXhlbE9mZnNldFxyXG4gIH1cclxuICBzZXQgbGFiZWxQaXhlbE9mZnNldCh2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMubGFiZWwucGl4ZWxPZmZzZXQgPSB2XHJcbiAgICB0aGlzLmxhYmVsLnBpeGVsT2Zmc2V0ID0gdlxyXG4gICAgdGhpcy5fZWxtcy5sYWJlbFBpeGVsT2Zmc2V0ICYmXHJcbiAgICAgIHRoaXMuX2VsbXMubGFiZWxQaXhlbE9mZnNldC5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgIGl0ZW0udmFsdWUgPSB2XHJcbiAgICAgIH0pXHJcbiAgfVxyXG4gIGdldCBsYWJlbExpbmVDb2xvcigpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubGFiZWwubGluZUNvbG9yXHJcbiAgfVxyXG4gIHNldCBsYWJlbExpbmVDb2xvcih2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMubGFiZWwubGluZUNvbG9yID0gdlxyXG4gICAgdGhpcy5sYWJlbC5saW5lQ29sb3IgPSB2XHJcbiAgICBpZiAodGhpcy5fZWxtcy5sYWJlbExpbmVDb2xvcikge1xyXG4gICAgICB0aGlzLl9lbG1zLmxhYmVsTGluZUNvbG9yLmZvckVhY2goKGl0ZW0sIGkpID0+IHtcclxuICAgICAgICBsZXQgbGluZUNvbG9yUGlja2VyID0gbmV3IFlKQ29sb3JQaWNrZXIoe1xyXG4gICAgICAgICAgZWw6IGl0ZW0uZWwsXHJcbiAgICAgICAgICBzaXplOiAnbWluaScsIC8v6aKc6ImyYm9457G75Z6LXHJcbiAgICAgICAgICBhbHBoYTogdHJ1ZSwgLy/mmK/lkKblvIDlkK/pgI/mmI7luqZcclxuICAgICAgICAgIGRlZmF1bHRDb2xvcjogdGhpcy5sYWJlbExpbmVDb2xvcixcclxuICAgICAgICAgIGRpc2FibGVkOiBmYWxzZSwgLy/mmK/lkKbnpoHmraLmiZPlvIDpopzoibLpgInmi6nlmahcclxuICAgICAgICAgIG9wZW5QaWNrZXJBbmk6ICdvcGFjaXR5JywgLy/miZPlvIDpopzoibLpgInmi6nlmajliqjnlLtcclxuICAgICAgICAgIHN1cmU6IGNvbG9yID0+IHtcclxuICAgICAgICAgICAgdGhpcy5sYWJlbExpbmVDb2xvciA9IGNvbG9yXHJcbiAgICAgICAgICB9LCAvL+eCueWHu+ehruiupOaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICAgICAgY2xlYXI6ICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5sYWJlbExpbmVDb2xvciA9ICdyZ2JhKDAsMjU1LDI1NSwwLjUpJ1xyXG4gICAgICAgICAgfSAvL+eCueWHu+a4heepuuaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgdGhpcy5fZWxtcy5sYWJlbExpbmVDb2xvcltpXSA9IGxpbmVDb2xvclBpY2tlclxyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IGxhYmVsQmFja2dyb3VuZENvbG9yU3RhcnQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmxhYmVsLmJhY2tncm91bmRDb2xvclswXVxyXG4gIH1cclxuICBzZXQgbGFiZWxCYWNrZ3JvdW5kQ29sb3JTdGFydCh2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMubGFiZWwuYmFja2dyb3VuZENvbG9yWzBdID0gdlxyXG4gICAgdGhpcy5sYWJlbC5iYWNrZ3JvdW5kQ29sb3IgPSBbdiwgdGhpcy5sYWJlbC5iYWNrZ3JvdW5kQ29sb3JbMV1dXHJcbiAgICBpZiAodGhpcy5fZWxtcy5sYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0KSB7XHJcbiAgICAgIHRoaXMuX2VsbXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JTdGFydC5mb3JFYWNoKChpdGVtLCBpKSA9PiB7XHJcbiAgICAgICAgbGV0IGxhYmVsQmFja2dyb3VuZENvbG9yU3RhcnRQaWNrZXIgPSBuZXcgWUpDb2xvclBpY2tlcih7XHJcbiAgICAgICAgICBlbDogaXRlbS5lbCxcclxuICAgICAgICAgIHNpemU6ICdtaW5pJywgLy/popzoibJib3jnsbvlnotcclxuICAgICAgICAgIGFscGhhOiB0cnVlLCAvL+aYr+WQpuW8gOWQr+mAj+aYjuW6plxyXG4gICAgICAgICAgZGVmYXVsdENvbG9yOiB0aGlzLmxhYmVsQmFja2dyb3VuZENvbG9yU3RhcnQsXHJcbiAgICAgICAgICBkaXNhYmxlZDogZmFsc2UsIC8v5piv5ZCm56aB5q2i5omT5byA6aKc6Imy6YCJ5oup5ZmoXHJcbiAgICAgICAgICBvcGVuUGlja2VyQW5pOiAnb3BhY2l0eScsIC8v5omT5byA6aKc6Imy6YCJ5oup5Zmo5Yqo55S7XHJcbiAgICAgICAgICBzdXJlOiBjb2xvciA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JTdGFydCA9IGNvbG9yXHJcbiAgICAgICAgICB9LCAvL+eCueWHu+ehruiupOaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICAgICAgY2xlYXI6ICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5sYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0ID0gJ3JnYmEoMjU1LDI1NSwyNTUsMSknXHJcbiAgICAgICAgICB9IC8v54K55Ye75riF56m65oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgICAgfSlcclxuICAgICAgICB0aGlzLl9lbG1zLmxhYmVsQmFja2dyb3VuZENvbG9yU3RhcnRbXHJcbiAgICAgICAgICBpXHJcbiAgICAgICAgXSA9IGxhYmVsQmFja2dyb3VuZENvbG9yU3RhcnRQaWNrZXJcclxuICAgICAgfSlcclxuICAgIH1cclxuICB9XHJcbiAgZ2V0IGxhYmVsQmFja2dyb3VuZENvbG9yRW5kKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5sYWJlbC5iYWNrZ3JvdW5kQ29sb3JbMV1cclxuICB9XHJcbiAgc2V0IGxhYmVsQmFja2dyb3VuZENvbG9yRW5kKHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5sYWJlbC5iYWNrZ3JvdW5kQ29sb3JbMV0gPSB2XHJcbiAgICB0aGlzLmxhYmVsLmJhY2tncm91bmRDb2xvciA9IFt0aGlzLmxhYmVsLmJhY2tncm91bmRDb2xvclswXSwgdl1cclxuICAgIGlmICh0aGlzLl9lbG1zLmxhYmVsQmFja2dyb3VuZENvbG9yRW5kKSB7XHJcbiAgICAgIHRoaXMuX2VsbXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmQuZm9yRWFjaCgoaXRlbSwgaSkgPT4ge1xyXG4gICAgICAgIGxldCBsYWJlbEJhY2tncm91bmRDb2xvckVuZFBpY2tlciA9IG5ldyBZSkNvbG9yUGlja2VyKHtcclxuICAgICAgICAgIGVsOiBpdGVtLmVsLFxyXG4gICAgICAgICAgc2l6ZTogJ21pbmknLCAvL+minOiJsmJveOexu+Wei1xyXG4gICAgICAgICAgYWxwaGE6IHRydWUsIC8v5piv5ZCm5byA5ZCv6YCP5piO5bqmXHJcbiAgICAgICAgICBkZWZhdWx0Q29sb3I6IHRoaXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmQsXHJcbiAgICAgICAgICBkaXNhYmxlZDogZmFsc2UsIC8v5piv5ZCm56aB5q2i5omT5byA6aKc6Imy6YCJ5oup5ZmoXHJcbiAgICAgICAgICBvcGVuUGlja2VyQW5pOiAnb3BhY2l0eScsIC8v5omT5byA6aKc6Imy6YCJ5oup5Zmo5Yqo55S7XHJcbiAgICAgICAgICBzdXJlOiBjb2xvciA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmQgPSBjb2xvclxyXG4gICAgICAgICAgfSwgLy/ngrnlh7vnoa7orqTmjInpkq7kuovku7blm57osINcclxuICAgICAgICAgIGNsZWFyOiAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmQgPSAncmdiYSgyNTUsMjU1LDI1NSwxKSdcclxuICAgICAgICAgIH0gLy/ngrnlh7vmuIXnqbrmjInpkq7kuovku7blm57osINcclxuICAgICAgICB9KVxyXG4gICAgICAgIHRoaXMuX2VsbXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmRbaV0gPSBsYWJlbEJhY2tncm91bmRDb2xvckVuZFBpY2tlclxyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc3RhdGljIGNyZWF0ZSh0aGF0KSB7XHJcbiAgICBsZXQgZ3JvdW5kXHJcbiAgICBpZiAodGhhdC5oZWlnaHRNb2RlID09IDIpIHtcclxuICAgICAgZ3JvdW5kID0gdHJ1ZVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZ3JvdW5kID0gZmFsc2VcclxuICAgIH1cclxuICAgIHRoYXQucmVuZXdQb3NpdGlvbnMoKVxyXG5cclxuICAgIGxldCBtYXRlcmlhbCA9IENlc2l1bS5Db2xvci5mcm9tQ3NzQ29sb3JTdHJpbmcodGhhdC5vcHRpb25zLmNvbG9yKVxyXG4gICAgaWYgKHRoYXQuc2RrLnZpZXdlci5zY2VuZS5tb2RlID09PSAyKSB7XHJcbiAgICAgIHRoYXQub3B0aW9ucy5oZWlnaHRNb2RlID0gMFxyXG4gICAgICBncm91bmQgPSBmYWxzZVxyXG4gICAgICBtYXRlcmlhbCA9IG5ldyBDZXNpdW0uQ3VzdG9tQ29sb3JNYXRlcmlhbFNvdXJjZSh7XHJcbiAgICAgICAgY29sb3I6IHRoYXQub3B0aW9ucy5jb2xvclxyXG4gICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIHRoYXQuZW50aXR5ID0gdGhhdC5zZGsudmlld2VyLmVudGl0aWVzLmFkZCh7XHJcbiAgICAgIHNob3c6IHRoYXQub3B0aW9ucy5zaG93LFxyXG4gICAgICBpZDogdGhhdC5vcHRpb25zLmlkLFxyXG4gICAgICBwb2x5Z29uOiB7XHJcbiAgICAgICAgaGllcmFyY2h5OiBuZXcgQ2VzaXVtLlBvbHlnb25IaWVyYXJjaHkodGhhdC5wb3NpdGlvbnMpLFxyXG4gICAgICAgIHBlclBvc2l0aW9uSGVpZ2h0OiAhZ3JvdW5kID8gdHJ1ZSA6IGZhbHNlLFxyXG4gICAgICAgIG1hdGVyaWFsOiBtYXRlcmlhbCxcclxuICAgICAgICB6SW5kZXg6IHRoYXQuc2RrLl9lbnRpdHlaSW5kZXhcclxuICAgICAgfSxcclxuICAgICAgcG9seWxpbmU6IHtcclxuICAgICAgICBwb3NpdGlvbnM6IFsuLi50aGF0LnBvc2l0aW9ucywgdGhhdC5wb3NpdGlvbnNbMF0sIHRoYXQucG9zaXRpb25zWzFdXSxcclxuICAgICAgICB3aWR0aDogdGhhdC5vcHRpb25zLmxpbmUud2lkdGgsXHJcbiAgICAgICAgYXJjVHlwZTogQ2VzaXVtLkFyY1R5cGUuTk9ORSxcclxuICAgICAgICBtYXRlcmlhbDogQ2VzaXVtLkNvbG9yLmZyb21Dc3NDb2xvclN0cmluZyh0aGF0Lm9wdGlvbnMubGluZS5jb2xvciksXHJcbiAgICAgICAgY2xhbXBUb0dyb3VuZDogIWdyb3VuZCA/IGZhbHNlIDogdHJ1ZSxcclxuICAgICAgICBhcmNUeXBlOiAhZ3JvdW5kID8gQ2VzaXVtLkFyY1R5cGUuTk9ORSA6IENlc2l1bS5BcmNUeXBlLkdFT0RFU0lDLFxyXG4gICAgICAgIHpJbmRleDogdGhhdC5zZGsuX2VudGl0eVpJbmRleFxyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gICAgdGhhdC5zZGsuX2VudGl0eVpJbmRleCsrXHJcbiAgICBQb2x5Z29uT2JqZWN0LmNyZWF0ZUxhYmVsKHRoYXQpXHJcblxyXG4gICAgc3luY0RhdGEodGhhdC5zZGssIHRoYXQub3B0aW9ucy5pZClcclxuICAgIGlmICh0aGF0Lm9wdGlvbnMuc2hvdykge1xyXG4gICAgICBzZXRTcGxpdERpcmVjdGlvbigwLCB0aGF0Lm9wdGlvbnMuaWQpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgYXN5bmMgY3JlYXRlTGFiZWwodGhhdCkge1xyXG4gICAgbGV0IHBvc2l0aW9ucyA9IFtbXV1cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhhdC5vcHRpb25zLnBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBwb3NpdGlvbnNbMF0ucHVzaChbXHJcbiAgICAgICAgdGhhdC5vcHRpb25zLnBvc2l0aW9uc1tpXS5sbmcsXHJcbiAgICAgICAgdGhhdC5vcHRpb25zLnBvc2l0aW9uc1tpXS5sYXRcclxuICAgICAgXSlcclxuICAgIH1cclxuICAgIHBvc2l0aW9uc1swXS5wdXNoKFtcclxuICAgICAgdGhhdC5vcHRpb25zLnBvc2l0aW9uc1swXS5sbmcsXHJcbiAgICAgIHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbMF0ubGF0XHJcbiAgICBdKVxyXG4gICAgbGV0IHBvbHlnb24gPSB0dXJmLnBvbHlnb24ocG9zaXRpb25zKVxyXG4gICAgLy8gbGV0IGNlbnRyb2lkID0gdHVyZi5jZW50cm9pZChwb2x5Z29uKTtcclxuICAgIGxldCBjZW50cm9pZCA9IHR1cmYucG9pbnRPbkZlYXR1cmUocG9seWdvbilcclxuXHJcbiAgICBsZXQgaGVpZ2h0ID0gMFxyXG4gICAgbGV0IGdyb3VuZFxyXG4gICAgc3dpdGNoICh0aGF0LmhlaWdodE1vZGUpIHtcclxuICAgICAgY2FzZSAwOlxyXG4gICAgICBjYXNlICcwJzpcclxuICAgICAgICBncm91bmQgPSBmYWxzZVxyXG4gICAgICAgIGJyZWFrXHJcbiAgICAgIGNhc2UgMTpcclxuICAgICAgY2FzZSAnMSc6XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGhlaWdodCA9IHRoYXQuc2RrLnZpZXdlci5zY2VuZS5nbG9iZS5nZXRIZWlnaHQoQ2VzaXVtLkNhcnRvZ3JhcGhpYy5mcm9tRGVncmVlcyhwb3NpdGlvbnNbaV0ubG5nLCBwb3NpdGlvbnNbaV0ubGF0KSlcclxuICAgICAgICB9XHJcbiAgICAgICAgZ3JvdW5kID0gZmFsc2VcclxuICAgICAgICBicmVha1xyXG4gICAgICBjYXNlIDI6XHJcbiAgICAgIGNhc2UgJzInOlxyXG4gICAgICAgIGdyb3VuZCA9IHRydWVcclxuICAgICAgICBicmVha1xyXG4gICAgfVxyXG4gICAgaWYgKCFncm91bmQpIHtcclxuICAgICAgaGVpZ2h0ID0gdGhhdC5vcHRpb25zLmhlaWdodCArIGhlaWdodFxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbGV0IG9iamVjdHNUb0V4Y2x1ZGUgPSBbLi4udGhhdC5zZGsudmlld2VyLmVudGl0aWVzLnZhbHVlc11cclxuICAgICAgaGVpZ2h0ID0gYXdhaXQgdGhhdC5nZXRDbGFtcFRvSGVpZ2h0KHtcclxuICAgICAgICBsbmc6IGNlbnRyb2lkLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzBdLFxyXG4gICAgICAgIGxhdDogY2VudHJvaWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMV1cclxuICAgICAgfSwgb2JqZWN0c1RvRXhjbHVkZSlcclxuICAgIH1cclxuICAgIC8vIGlmICghdGhhdC5vcHRpb25zLmxhYmVsLnBvc2l0aW9uKSB7XHJcbiAgICAvLyAgIHRoYXQub3B0aW9ucy5sYWJlbC5wb3NpdGlvbiA9IHtcclxuICAgIC8vICAgICBsbmc6IGNlbnRyb2lkLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzBdLFxyXG4gICAgLy8gICAgIGxhdDogY2VudHJvaWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMV0sXHJcbiAgICAvLyAgICAgYWx0OiBoZWlnaHRcclxuICAgIC8vICAgfVxyXG4gICAgLy8gfVxyXG4gICAgdGhhdC5vcHRpb25zLmxhYmVsLnBvc2l0aW9uID0ge1xyXG4gICAgICBsbmc6IGNlbnRyb2lkLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzBdLFxyXG4gICAgICBsYXQ6IGNlbnRyb2lkLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzFdLFxyXG4gICAgICBhbHQ6IGhlaWdodFxyXG4gICAgfVxyXG4gICAgLy8g5qCH562+XHJcbiAgICB0aGF0LmxhYmVsID0gbmV3IExhYmVsT2JqZWN0KHRoYXQuc2RrLCB7XHJcbiAgICAgIGlkOiB0aGF0Lm9wdGlvbnMuaWQsXHJcbiAgICAgIHNob3c6IHRoYXQub3B0aW9ucy5zaG93ID8gdGhhdC5vcHRpb25zLmxhYmVsLnNob3cgOiBmYWxzZSxcclxuICAgICAgcG9zaXRpb246IFtcclxuICAgICAgICB0aGF0Lm9wdGlvbnMubGFiZWwucG9zaXRpb24ubG5nLFxyXG4gICAgICAgIHRoYXQub3B0aW9ucy5sYWJlbC5wb3NpdGlvbi5sYXQsXHJcbiAgICAgICAgdGhhdC5vcHRpb25zLmxhYmVsLnBvc2l0aW9uLmFsdFxyXG4gICAgICBdLFxyXG4gICAgICB0ZXh0OiB0aGF0Lm9wdGlvbnMubmFtZSxcclxuICAgICAgZm9udFNpemU6IHRoYXQub3B0aW9ucy5sYWJlbC5mb250U2l6ZSxcclxuICAgICAgZm9udEZhbWlseTogdGhhdC5vcHRpb25zLmxhYmVsLmZvbnRGYW1pbHksXHJcbiAgICAgIGNvbG9yOiB0aGF0Lm9wdGlvbnMubGFiZWwuY29sb3IsXHJcbiAgICAgIHBpeGVsT2Zmc2V0OiB0aGF0Lm9wdGlvbnMubGFiZWwucGl4ZWxPZmZzZXQsXHJcbiAgICAgIGJhY2tncm91bmRDb2xvcjogdGhhdC5vcHRpb25zLmxhYmVsLmJhY2tncm91bmRDb2xvcixcclxuICAgICAgbGluZUNvbG9yOiB0aGF0Lm9wdGlvbnMubGFiZWwubGluZUNvbG9yLFxyXG4gICAgICBsaW5lV2lkdGg6IHRoYXQub3B0aW9ucy5sYWJlbC5saW5lV2lkdGgsXHJcbiAgICAgIHNjYWxlQnlEaXN0YW5jZTogdGhhdC5vcHRpb25zLmxhYmVsLnNjYWxlQnlEaXN0YW5jZSxcclxuICAgICAgbmVhcjogdGhhdC5vcHRpb25zLmxhYmVsLm5lYXIsXHJcbiAgICAgIGZhcjogdGhhdC5vcHRpb25zLmxhYmVsLmZhcixcclxuICAgICAgZ3JvdW5kOiBncm91bmRcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICAvLyDnvJbovpHmoYZcclxuICBhc3luYyBlZGl0KHN0YXRlKSB7XHJcbiAgICByZXR1cm5cclxuICAgIGxldCBfdGhpcyA9IHRoaXNcclxuICAgIHRoaXMub3JpZ2luYWxPcHRpb25zID0gdGhpcy5kZWVwQ29weU9iaih0aGlzLm9wdGlvbnMpXHJcblxyXG4gICAgaWYgKHRoaXMuX0RpYWxvZ09iamVjdCAmJiB0aGlzLl9EaWFsb2dPYmplY3QuY2xvc2UpIHtcclxuICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0LmNsb3NlKClcclxuICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0ID0gbnVsbFxyXG4gICAgfVxyXG4gICAgaWYgKHN0YXRlKSB7XHJcblxyXG4gICAgICBmdW5jdGlvbiBjcmVhdGVTcGF0aWFsSW5mb1RhYmxlQ29udGVudCgpIHtcclxuICAgICAgICBsZXQgdGFibGVFbG0gPSBjb250ZW50RWxtLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3NwYXRpYWwtaW5mby10YWJsZScpWzBdXHJcbiAgICAgICAgbGV0IHRCb2R5RWxtID0gdGFibGVFbG0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndGFibGUtYm9keScpWzBdXHJcbiAgICAgICAgdEJvZHlFbG0uaW5uZXJIVE1MID0gJydcclxuICAgICAgICBfdGhpcy5fZWxtcy5sbmcgPSBbXVxyXG4gICAgICAgIF90aGlzLl9lbG1zLmxuZ0lucHV0ID0gW11cclxuICAgICAgICBfdGhpcy5fZWxtcy5sYXQgPSBbXVxyXG4gICAgICAgIF90aGlzLl9lbG1zLmxhdElucHV0ID0gW11cclxuICAgICAgICBfdGhpcy5fZWxtcy5hbHQgPSBbXVxyXG4gICAgICAgIF90aGlzLl9lbG1zLmFsdElucHV0ID0gW11cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IF90aGlzLm9wdGlvbnMucG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBsZXQgdHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKVxyXG4gICAgICAgICAgdHIuY2xhc3NOYW1lID0gJ3RyJ1xyXG4gICAgICAgICAgdHIuaW5uZXJIVE1MID0gYFxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRkXCI+JHtpICsgMX08L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZCBsbmcgYWxpZ24tY2VudGVyXCI+PC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidGQgbGF0IGFsaWduLWNlbnRlclwiPjwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRkIGFsdCBhbGlnbi1jZW50ZXJcIj48L2Rpdj5cclxuICAgICAgICBgXHJcbiAgICAgICAgICBsZXQgbG5nQm94ID0gdHIuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbG5nJylbMF1cclxuICAgICAgICAgIGxldCBsbmcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJylcclxuICAgICAgICAgIGxuZy5pbm5lckhUTUwgPSAoX3RoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubG5nKS50b0ZpeGVkKDgpXHJcbiAgICAgICAgICBsbmdCb3guYXBwZW5kQ2hpbGQobG5nKVxyXG4gICAgICAgICAgbGV0IGxuZ0lucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKVxyXG4gICAgICAgICAgbG5nSW5wdXQuY2xhc3NOYW1lID0gJ2lucHV0J1xyXG4gICAgICAgICAgbG5nSW5wdXQudHlwZSA9ICdudW1iZXInXHJcbiAgICAgICAgICBsbmdJbnB1dC50aXRsZSA9ICcnXHJcbiAgICAgICAgICBsbmdJbnB1dC5taW4gPSAtMTgwXHJcbiAgICAgICAgICBsbmdJbnB1dC5tYXggPSAxODBcclxuICAgICAgICAgIGxuZ0lucHV0LnZhbHVlID0gKF90aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxuZykudG9GaXhlZCg4KVxyXG5cclxuICAgICAgICAgIGxldCBsYXRCb3ggPSB0ci5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdsYXQnKVswXVxyXG4gICAgICAgICAgbGV0IGxhdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKVxyXG4gICAgICAgICAgbGF0LmlubmVySFRNTCA9IChfdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sYXQpLnRvRml4ZWQoOClcclxuICAgICAgICAgIGxhdEJveC5hcHBlbmRDaGlsZChsYXQpXHJcbiAgICAgICAgICBsZXQgbGF0SW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpXHJcbiAgICAgICAgICBsYXRJbnB1dC5jbGFzc05hbWUgPSAnaW5wdXQnXHJcbiAgICAgICAgICBsYXRJbnB1dC50eXBlID0gJ251bWJlcidcclxuICAgICAgICAgIGxhdElucHV0LnRpdGxlID0gJydcclxuICAgICAgICAgIGxhdElucHV0Lm1pbiA9IC05MFxyXG4gICAgICAgICAgbGF0SW5wdXQubWF4ID0gOTBcclxuICAgICAgICAgIGxhdElucHV0LnZhbHVlID0gKF90aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxhdCkudG9GaXhlZCg4KVxyXG5cclxuICAgICAgICAgIGxldCBhbHRCb3ggPSB0ci5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdhbHQnKVswXVxyXG4gICAgICAgICAgbGV0IGFsdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKVxyXG4gICAgICAgICAgYWx0LmlubmVySFRNTCA9IChfdGhpcy5oZWlnaHQpLnRvRml4ZWQoMilcclxuICAgICAgICAgIGFsdEJveC5hcHBlbmRDaGlsZChhbHQpXHJcbiAgICAgICAgICBsZXQgYWx0SW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpXHJcbiAgICAgICAgICBhbHRJbnB1dC5jbGFzc05hbWUgPSAnaW5wdXQnXHJcbiAgICAgICAgICBhbHRJbnB1dC50eXBlID0gJ251bWJlcidcclxuICAgICAgICAgIGFsdElucHV0LnRpdGxlID0gJydcclxuICAgICAgICAgIGFsdElucHV0Lm1pbiA9IC05OTk5OTk5XHJcbiAgICAgICAgICBhbHRJbnB1dC5tYXggPSA5OTk5OTk5OTlcclxuICAgICAgICAgIGFsdElucHV0LnZhbHVlID0gKF90aGlzLmhlaWdodCkudG9GaXhlZCgyKVxyXG5cclxuICAgICAgICAgIGxuZ0JveC5hZGRFdmVudExpc3RlbmVyKCdkYmxjbGljaycsICgpID0+IHtcclxuICAgICAgICAgICAgbG5nQm94LmlubmVySFRNTCA9ICcnXHJcbiAgICAgICAgICAgIGxuZ0lucHV0LnZhbHVlID0gTnVtYmVyKChfdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sbmcpLnRvRml4ZWQoOCkpXHJcbiAgICAgICAgICAgIGxuZ0JveC5hcHBlbmRDaGlsZChsbmdJbnB1dClcclxuICAgICAgICAgICAgbG5nSW5wdXQuZm9jdXMoKVxyXG4gICAgICAgICAgICBpZiAoX3RoaXMub3BlcmF0ZS5wb3NpdGlvbkVkaXRpbmcpIHtcclxuICAgICAgICAgICAgICBfdGhpcy5wb3NpdGlvbkVkaXRpbmcgPSBmYWxzZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIFBvbHlnb25PYmplY3QuY2xvc2VOb2RlRWRpdChfdGhpcylcclxuICAgICAgICAgICAgX3RoaXMuaGVpZ2h0TW9kZSA9IF90aGlzLmhlaWdodE1vZGVcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICBsbmdJbnB1dC5hZGRFdmVudExpc3RlbmVyKCdibHVyJywgKCkgPT4ge1xyXG4gICAgICAgICAgICBsbmdJbnB1dC52YWx1ZSA9IE51bWJlcigoX3RoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubG5nKS50b0ZpeGVkKDgpKVxyXG4gICAgICAgICAgICBsbmdCb3guaW5uZXJIVE1MID0gJydcclxuICAgICAgICAgICAgbG5nQm94LmFwcGVuZENoaWxkKGxuZylcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICBsbmdJbnB1dC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICgpID0+IHtcclxuICAgICAgICAgICAgX3RoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubG5nID0gTnVtYmVyKE51bWJlcihsbmdJbnB1dC52YWx1ZSkudG9GaXhlZCg4KSlcclxuICAgICAgICAgICAgbG5nLmlubmVySFRNTCA9IF90aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxuZy50b0ZpeGVkKDgpXHJcbiAgICAgICAgICAgIF90aGlzLmhlaWdodCA9IF90aGlzLmhlaWdodFxyXG4gICAgICAgICAgfSlcclxuXHJcbiAgICAgICAgICBsYXRCb3guYWRkRXZlbnRMaXN0ZW5lcignZGJsY2xpY2snLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGxhdEJveC5pbm5lckhUTUwgPSAnJ1xyXG4gICAgICAgICAgICBsYXRJbnB1dC52YWx1ZSA9IE51bWJlcigoX3RoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubGF0KS50b0ZpeGVkKDgpKVxyXG4gICAgICAgICAgICBsYXRCb3guYXBwZW5kQ2hpbGQobGF0SW5wdXQpXHJcbiAgICAgICAgICAgIGxhdElucHV0LmZvY3VzKClcclxuICAgICAgICAgICAgaWYgKF90aGlzLm9wZXJhdGUucG9zaXRpb25FZGl0aW5nKSB7XHJcbiAgICAgICAgICAgICAgX3RoaXMucG9zaXRpb25FZGl0aW5nID0gZmFsc2VcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBQb2x5Z29uT2JqZWN0LmNsb3NlTm9kZUVkaXQoX3RoaXMpXHJcbiAgICAgICAgICAgIF90aGlzLmhlaWdodE1vZGUgPSBfdGhpcy5oZWlnaHRNb2RlXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgbGF0SW5wdXQuYWRkRXZlbnRMaXN0ZW5lcignYmx1cicsICgpID0+IHtcclxuICAgICAgICAgICAgbGF0SW5wdXQudmFsdWUgPSBOdW1iZXIoKF90aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxhdCkudG9GaXhlZCg4KSlcclxuICAgICAgICAgICAgbGF0Qm94LmlubmVySFRNTCA9ICcnXHJcbiAgICAgICAgICAgIGxhdEJveC5hcHBlbmRDaGlsZChsYXQpXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgbGF0SW5wdXQuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIF90aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxhdCA9IE51bWJlcihOdW1iZXIobGF0SW5wdXQudmFsdWUpLnRvRml4ZWQoOCkpXHJcbiAgICAgICAgICAgIGxhdC5pbm5lckhUTUwgPSBfdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sYXQudG9GaXhlZCg4KVxyXG4gICAgICAgICAgICBfdGhpcy5oZWlnaHQgPSBfdGhpcy5oZWlnaHRcclxuICAgICAgICAgIH0pXHJcblxyXG4gICAgICAgICAgYWx0Qm94LmFkZEV2ZW50TGlzdGVuZXIoJ2RibGNsaWNrJywgKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoX3RoaXMuaGVpZ2h0TW9kZSA9PSAyKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGFsdEJveC5pbm5lckhUTUwgPSAnJ1xyXG4gICAgICAgICAgICBhbHRJbnB1dC52YWx1ZSA9IE51bWJlcigoX3RoaXMuaGVpZ2h0KS50b0ZpeGVkKDIpKVxyXG4gICAgICAgICAgICBhbHRCb3guYXBwZW5kQ2hpbGQoYWx0SW5wdXQpXHJcbiAgICAgICAgICAgIGFsdElucHV0LmZvY3VzKClcclxuICAgICAgICAgICAgaWYgKF90aGlzLm9wZXJhdGUucG9zaXRpb25FZGl0aW5nKSB7XHJcbiAgICAgICAgICAgICAgX3RoaXMucG9zaXRpb25FZGl0aW5nID0gZmFsc2VcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBQb2x5Z29uT2JqZWN0LmNsb3NlTm9kZUVkaXQoX3RoaXMpXHJcbiAgICAgICAgICAgIF90aGlzLmhlaWdodE1vZGUgPSBfdGhpcy5oZWlnaHRNb2RlXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgYWx0SW5wdXQuYWRkRXZlbnRMaXN0ZW5lcignYmx1cicsICgpID0+IHtcclxuICAgICAgICAgICAgYWx0SW5wdXQudmFsdWUgPSBOdW1iZXIoKF90aGlzLmhlaWdodCkudG9GaXhlZCgyKSlcclxuICAgICAgICAgICAgYWx0Qm94LmlubmVySFRNTCA9ICcnXHJcbiAgICAgICAgICAgIGFsdEJveC5hcHBlbmRDaGlsZChhbHQpXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgYWx0SW5wdXQuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIF90aGlzLmhlaWdodCA9IE51bWJlcihOdW1iZXIoYWx0SW5wdXQudmFsdWUpLnRvRml4ZWQoMikpXHJcbiAgICAgICAgICAgIGFsdC5pbm5lckhUTUwgPSBOdW1iZXIoX3RoaXMuaGVpZ2h0LnRvRml4ZWQoMikpXHJcbiAgICAgICAgICB9KVxyXG5cclxuXHJcbiAgICAgICAgICBfdGhpcy5fZWxtcy5sbmcucHVzaChsbmcpXHJcbiAgICAgICAgICBfdGhpcy5fZWxtcy5sbmdJbnB1dC5wdXNoKGxuZ0lucHV0KVxyXG4gICAgICAgICAgX3RoaXMuX2VsbXMubGF0LnB1c2gobGF0KVxyXG4gICAgICAgICAgX3RoaXMuX2VsbXMubGF0SW5wdXQucHVzaChsYXRJbnB1dClcclxuICAgICAgICAgIF90aGlzLl9lbG1zLmFsdC5wdXNoKGFsdClcclxuICAgICAgICAgIF90aGlzLl9lbG1zLmFsdElucHV0LnB1c2goYWx0SW5wdXQpXHJcbiAgICAgICAgICB0Qm9keUVsbS5hcHBlbmRDaGlsZCh0cilcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuX0RpYWxvZ09iamVjdCA9IGF3YWl0IG5ldyBEaWFsb2codGhpcy5zZGssIHRoaXMub3B0aW9ucywge1xyXG4gICAgICAgIHRpdGxlOiAn6Z2i5bGe5oCnJyxcclxuICAgICAgICBsZWZ0OiAnMTgwcHgnLFxyXG4gICAgICAgIHRvcDogJzEwMHB4JyxcclxuICAgICAgICBjb25maXJtQ2FsbEJhY2s6IG9wdGlvbnMgPT4ge1xyXG4gICAgICAgICAgdGhpcy5uYW1lID0gdGhpcy5uYW1lLnRyaW0oKVxyXG4gICAgICAgICAgaWYgKCF0aGlzLm5hbWUpIHtcclxuICAgICAgICAgICAgdGhpcy5uYW1lID0gJ+acquWRveWQjeWvueixoSdcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMub3B0aW9ucy5sYWJlbC5wb3NpdGlvbiA9IHtcclxuICAgICAgICAgICAgbG5nOiB0aGlzLmxhYmVsLnBvc2l0aW9uWzBdLFxyXG4gICAgICAgICAgICBsYXQ6IHRoaXMubGFiZWwucG9zaXRpb25bMV0sXHJcbiAgICAgICAgICAgIGFsdDogdGhpcy5sYWJlbC5wb3NpdGlvblsyXVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5vcmlnaW5hbE9wdGlvbnMgPSB0aGlzLmRlZXBDb3B5T2JqKHRoaXMub3B0aW9ucylcclxuICAgICAgICAgIHRoaXMuX0RpYWxvZ09iamVjdC5jbG9zZSgpXHJcbiAgICAgICAgICB0aGlzLkRpYWxvZy5jb25maXJtQ2FsbEJhY2sgJiZcclxuICAgICAgICAgICAgdGhpcy5EaWFsb2cuY29uZmlybUNhbGxCYWNrKHRoaXMub3JpZ2luYWxPcHRpb25zKVxyXG4gICAgICAgICAgc3luY0RhdGEodGhpcy5zZGssIHRoaXMub3B0aW9ucy5pZClcclxuICAgICAgICAgIHN5bmNTcGxpdERhdGEodGhpcy5zZGssIHRoaXMub3B0aW9ucy5pZClcclxuICAgICAgICB9LFxyXG4gICAgICAgIHJlc2V0Q2FsbEJhY2s6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMucmVzZXQoKVxyXG4gICAgICAgICAgdGhpcy5EaWFsb2cucmVzZXRDYWxsQmFjayAmJiB0aGlzLkRpYWxvZy5yZXNldENhbGxCYWNrKClcclxuICAgICAgICB9LFxyXG4gICAgICAgIHJlbW92ZUNhbGxCYWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLkRpYWxvZy5yZW1vdmVDYWxsQmFjayAmJiB0aGlzLkRpYWxvZy5yZW1vdmVDYWxsQmFjaygpXHJcbiAgICAgICAgfSxcclxuICAgICAgICBjbG9zZUNhbGxCYWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnByZXZpb3VzID0gbnVsbFxyXG4gICAgICAgICAgdGhpcy5yZXNldCgpXHJcbiAgICAgICAgICB0aGlzLnBvc2l0aW9uRWRpdGluZyA9IGZhbHNlXHJcbiAgICAgICAgICB0aGlzLkRpYWxvZy5jbG9zZUNhbGxCYWNrICYmIHRoaXMuRGlhbG9nLmNsb3NlQ2FsbEJhY2soKVxyXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm5vZGVQb2ludHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdGhpcy5zZGsudmlld2VyLmVudGl0aWVzLnJlbW92ZSh0aGlzLm5vZGVQb2ludHNbaV0pXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLm5vZGVQb2ludHMgPSBbXVxyXG4gICAgICAgICAgWUouTWVhc3VyZS5TZXRNZWFzdXJlU3RhdHVzKGZhbHNlKVxyXG4gICAgICAgICAgdGhpcy5ldmVudCAmJiB0aGlzLmV2ZW50LmRlc3Ryb3koKVxyXG4gICAgICAgICAgdGhpcy50aXAgJiYgdGhpcy50aXAuZGVzdHJveSgpXHJcbiAgICAgICAgfSxcclxuICAgICAgICBzaG93Q2FsbEJhY2s6IHNob3cgPT4ge1xyXG4gICAgICAgICAgdGhpcy5vcHRpb25zLnNob3cgPSBzaG93XHJcbiAgICAgICAgICB0aGlzLm9yaWdpbmFsT3B0aW9ucy5zaG93ID0gc2hvd1xyXG4gICAgICAgICAgdGhpcy5zaG93ID0gc2hvd1xyXG4gICAgICAgICAgdGhpcy5EaWFsb2cuc2hvd0NhbGxCYWNrICYmIHRoaXMuRGlhbG9nLnNob3dDYWxsQmFjaygpXHJcbiAgICAgICAgfSxcclxuICAgICAgICB0cmFuc2xhdGlvbmFsQ2FsbEJhY2s6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMucG9zaXRpb25FZGl0aW5nID0gIXRoaXMucG9zaXRpb25FZGl0aW5nXHJcbiAgICAgICAgfSxcclxuICAgICAgICAvLyDkuozmrKHnvJbovpHlm57osINcclxuICAgICAgICBzZWNvbmRhcnlFZGl0Q2FsbEJhY2s6ICgpID0+IHtcclxuICAgICAgICAgIFBvbHlnb25PYmplY3Qubm9kZUVkaXQodGhpcywgKCkgPT4ge1xyXG4gICAgICAgICAgICBjcmVhdGVTcGF0aWFsSW5mb1RhYmxlQ29udGVudCgpXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmJvZHkuY2xhc3NOYW1lID1cclxuICAgICAgICB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuYm9keS5jbGFzc05hbWUgKyAnIHBvbHlnb24nXHJcbiAgICAgIGxldCBjb250ZW50RWxtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcclxuICAgICAgY29udGVudEVsbS5pbm5lckhUTUwgPSBodG1sKHRoaXMpXHJcbiAgICAgIHRoaXMuX0RpYWxvZ09iamVjdC5jb250ZW50QXBwQ2hpbGQoY29udGVudEVsbSlcclxuICAgICAgdGhpcy5hdHRyaWJ1dGVUeXBlID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZVR5cGVcclxuICAgICAgdGhpcy5hdHRyaWJ1dGVDYW1lcmEgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmNhbWVyYS5jb250ZW50XHJcblxyXG4gICAgICAvLyDliJvlu7rmoIfnrb7pobVcclxuICAgICAgbGV0IHRhYnNFbG0gPSBuZXcgY3lfdGFicygncG9seWdvbi1vYmplY3QtZWRpdC10YWJzJywgdW5kZWZpbmVkLCB0aGlzLnNkaylcclxuICAgICAgLy8g6aKc6Imy57uE5Lu2XHJcbiAgICAgIGxldCBjb2xvclBpY2tlciA9IG5ldyBZSkNvbG9yUGlja2VyKHtcclxuICAgICAgICBlbDogY29udGVudEVsbS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdjb2xvcicpWzBdLFxyXG4gICAgICAgIHNpemU6ICdtaW5pJywgLy/popzoibJib3jnsbvlnotcclxuICAgICAgICBhbHBoYTogdHJ1ZSwgLy/mmK/lkKblvIDlkK/pgI/mmI7luqZcclxuICAgICAgICBkZWZhdWx0Q29sb3I6IHRoaXMuY29sb3IsXHJcbiAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLCAvL+aYr+WQpuemgeatouaJk+W8gOminOiJsumAieaLqeWZqFxyXG4gICAgICAgIG9wZW5QaWNrZXJBbmk6ICdvcGFjaXR5JywgLy/miZPlvIDpopzoibLpgInmi6nlmajliqjnlLtcclxuICAgICAgICBzdXJlOiBjb2xvciA9PiB7XHJcbiAgICAgICAgICB0aGlzLmNvbG9yID0gY29sb3JcclxuICAgICAgICB9LCAvL+eCueWHu+ehruiupOaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICAgIGNsZWFyOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmNvbG9yID0gJ3JnYmEoMjU1LDI1NSwyNTUsMSknXHJcbiAgICAgICAgfSAvL+eCueWHu+a4heepuuaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICB9KVxyXG4gICAgICBsZXQgbGluZWNvbG9yUGlja2VyID0gbmV3IFlKQ29sb3JQaWNrZXIoe1xyXG4gICAgICAgIGVsOiBjb250ZW50RWxtLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xpbmVDb2xvcicpWzBdLFxyXG4gICAgICAgIHNpemU6ICdtaW5pJywgLy/popzoibJib3jnsbvlnotcclxuICAgICAgICBhbHBoYTogdHJ1ZSwgLy/mmK/lkKblvIDlkK/pgI/mmI7luqZcclxuICAgICAgICBkZWZhdWx0Q29sb3I6IHRoaXMubGluZUNvbG9yLFxyXG4gICAgICAgIGRpc2FibGVkOiBmYWxzZSwgLy/mmK/lkKbnpoHmraLmiZPlvIDpopzoibLpgInmi6nlmahcclxuICAgICAgICBvcGVuUGlja2VyQW5pOiAnb3BhY2l0eScsIC8v5omT5byA6aKc6Imy6YCJ5oup5Zmo5Yqo55S7XHJcbiAgICAgICAgc3VyZTogY29sb3IgPT4ge1xyXG4gICAgICAgICAgdGhpcy5saW5lQ29sb3IgPSBjb2xvclxyXG4gICAgICAgIH0sIC8v54K55Ye756Gu6K6k5oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgICAgY2xlYXI6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMubGluZUNvbG9yID0gJ3JnYmEoMjU1LDI1NSwyNTUsMSknXHJcbiAgICAgICAgfSAvL+eCueWHu+a4heepuuaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICB9KVxyXG4gICAgICBsZXQgbGFiZWxDb2xvclBpY2tlciA9IG5ldyBZSkNvbG9yUGlja2VyKHtcclxuICAgICAgICBlbDogY29udGVudEVsbS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdsYWJlbENvbG9yJylbMF0sXHJcbiAgICAgICAgc2l6ZTogJ21pbmknLCAvL+minOiJsmJveOexu+Wei1xyXG4gICAgICAgIGFscGhhOiB0cnVlLCAvL+aYr+WQpuW8gOWQr+mAj+aYjuW6plxyXG4gICAgICAgIGRlZmF1bHRDb2xvcjogdGhpcy5sYWJlbENvbG9yLFxyXG4gICAgICAgIGRpc2FibGVkOiBmYWxzZSwgLy/mmK/lkKbnpoHmraLmiZPlvIDpopzoibLpgInmi6nlmahcclxuICAgICAgICBvcGVuUGlja2VyQW5pOiAnb3BhY2l0eScsIC8v5omT5byA6aKc6Imy6YCJ5oup5Zmo5Yqo55S7XHJcbiAgICAgICAgc3VyZTogY29sb3IgPT4ge1xyXG4gICAgICAgICAgdGhpcy5sYWJlbENvbG9yID0gY29sb3JcclxuICAgICAgICB9LCAvL+eCueWHu+ehruiupOaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICAgIGNsZWFyOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmxhYmVsQ29sb3IgPSAncmdiYSgyNTUsMjU1LDI1NSwxKSdcclxuICAgICAgICB9IC8v54K55Ye75riF56m65oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgIH0pXHJcbiAgICAgIGxldCBsaW5lQ29sb3JQaWNrZXIgPSBuZXcgWUpDb2xvclBpY2tlcih7XHJcbiAgICAgICAgZWw6IGNvbnRlbnRFbG0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbGFiZWxMaW5lQ29sb3InKVswXSxcclxuICAgICAgICBzaXplOiAnbWluaScsIC8v6aKc6ImyYm9457G75Z6LXHJcbiAgICAgICAgYWxwaGE6IHRydWUsIC8v5piv5ZCm5byA5ZCv6YCP5piO5bqmXHJcbiAgICAgICAgZGVmYXVsdENvbG9yOiB0aGlzLmxhYmVsTGluZUNvbG9yLFxyXG4gICAgICAgIGRpc2FibGVkOiBmYWxzZSwgLy/mmK/lkKbnpoHmraLmiZPlvIDpopzoibLpgInmi6nlmahcclxuICAgICAgICBvcGVuUGlja2VyQW5pOiAnb3BhY2l0eScsIC8v5omT5byA6aKc6Imy6YCJ5oup5Zmo5Yqo55S7XHJcbiAgICAgICAgc3VyZTogY29sb3IgPT4ge1xyXG4gICAgICAgICAgdGhpcy5sYWJlbExpbmVDb2xvciA9IGNvbG9yXHJcbiAgICAgICAgfSwgLy/ngrnlh7vnoa7orqTmjInpkq7kuovku7blm57osINcclxuICAgICAgICBjbGVhcjogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5sYWJlbExpbmVDb2xvciA9ICdyZ2JhKDI1NSwyNTUsMjU1LDEpJ1xyXG4gICAgICAgIH0gLy/ngrnlh7vmuIXnqbrmjInpkq7kuovku7blm57osINcclxuICAgICAgfSlcclxuICAgICAgbGV0IGxhYmVsQmFja2dyb3VuZENvbG9yU3RhcnRQaWNrZXIgPSBuZXcgWUpDb2xvclBpY2tlcih7XHJcbiAgICAgICAgZWw6IGNvbnRlbnRFbG0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbGFiZWxCYWNrZ3JvdW5kQ29sb3JTdGFydCcpWzBdLFxyXG4gICAgICAgIHNpemU6ICdtaW5pJyxcclxuICAgICAgICBhbHBoYTogdHJ1ZSxcclxuICAgICAgICBkZWZhdWx0Q29sb3I6IHRoaXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JTdGFydCxcclxuICAgICAgICBkaXNhYmxlZDogZmFsc2UsXHJcbiAgICAgICAgb3BlblBpY2tlckFuaTogJ29wYWNpdHknLFxyXG4gICAgICAgIHN1cmU6IGNvbG9yID0+IHtcclxuICAgICAgICAgIHRoaXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JTdGFydCA9IGNvbG9yXHJcbiAgICAgICAgfSxcclxuICAgICAgICBjbGVhcjogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5sYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0ID0gJ3JnYmEoMjU1LDI1NSwyNTUsMSknXHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgICBsZXQgbGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmRQaWNrZXIgPSBuZXcgWUpDb2xvclBpY2tlcih7XHJcbiAgICAgICAgZWw6IGNvbnRlbnRFbG0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmQnKVswXSxcclxuICAgICAgICBzaXplOiAnbWluaScsXHJcbiAgICAgICAgYWxwaGE6IHRydWUsXHJcbiAgICAgICAgZGVmYXVsdENvbG9yOiB0aGlzLmxhYmVsQmFja2dyb3VuZENvbG9yRW5kLFxyXG4gICAgICAgIGRpc2FibGVkOiBmYWxzZSxcclxuICAgICAgICBvcGVuUGlja2VyQW5pOiAnb3BhY2l0eScsXHJcbiAgICAgICAgc3VyZTogY29sb3IgPT4ge1xyXG4gICAgICAgICAgdGhpcy5sYWJlbEJhY2tncm91bmRDb2xvckVuZCA9IGNvbG9yXHJcbiAgICAgICAgfSxcclxuICAgICAgICBjbGVhcjogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5sYWJlbEJhY2tncm91bmRDb2xvckVuZCA9ICdyZ2JhKDI1NSwyNTUsMjU1LDEpJ1xyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgICAgLy8gbGV0IGhlaWdodEVsbSA9IHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5ib2R5LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXHJcbiAgICAgIC8vICAgJ2hlaWdodCdcclxuICAgICAgLy8gKVswXVxyXG4gICAgICAvLyBoZWlnaHRFbG0udmFsdWUgPSB0aGlzLmhlaWdodFxyXG4gICAgICAvLyBoZWlnaHRFbG0uYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCBlID0+IHtcclxuICAgICAgLy8gICBsZXQgdmFsdWUgPSBlLnRhcmdldC52YWx1ZVxyXG4gICAgICAvLyAgIGlmIChcclxuICAgICAgLy8gICAgIChlLmRhdGEgPT09ICcuJyAmJiB2YWx1ZS5pbmRleE9mKCcuJykgPT09IC0xKSB8fFxyXG4gICAgICAvLyAgICAgKGUuZGF0YSA9PT0gJy0nICYmIHZhbHVlLmluZGV4T2YoJy0nKSA9PT0gLTEpXHJcbiAgICAgIC8vICAgKSB7XHJcbiAgICAgIC8vICAgfSBlbHNlIHtcclxuICAgICAgLy8gICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICAvLyAgICAgICB2YWx1ZSA9IE51bWJlcih2YWx1ZSlcclxuICAgICAgLy8gICAgICAgaWYgKGUudGFyZ2V0Lm1heCAmJiB2YWx1ZSA+IE51bWJlcihlLnRhcmdldC5tYXgpKSB7XHJcbiAgICAgIC8vICAgICAgICAgdmFsdWUgPSBOdW1iZXIoZS50YXJnZXQubWF4KVxyXG4gICAgICAvLyAgICAgICB9XHJcbiAgICAgIC8vICAgICAgIGlmIChlLnRhcmdldC5taW4gJiYgdmFsdWUgPCBOdW1iZXIoZS50YXJnZXQubWluKSkge1xyXG4gICAgICAvLyAgICAgICAgIHZhbHVlID0gTnVtYmVyKGUudGFyZ2V0Lm1pbilcclxuICAgICAgLy8gICAgICAgfVxyXG4gICAgICAvLyAgICAgfVxyXG4gICAgICAvLyAgICAgdGhpcy5oZWlnaHQgPSB2YWx1ZVxyXG4gICAgICAvLyAgIH1cclxuICAgICAgLy8gfSlcclxuICAgICAgbGV0IGFsbF9lbG0gPSBjb250ZW50RWxtLmdldEVsZW1lbnRzQnlUYWdOYW1lKCcqJylcclxuICAgICAgUG9seWdvbk9iamVjdC5FdmVudEJpbmRpbmcodGhpcywgYWxsX2VsbSlcclxuICAgICAgLy8gdGhpcy5fZWxtcy5oZWlnaHQgPSBbaGVpZ2h0RWxtXVxyXG4gICAgICB0aGlzLl9lbG1zLmNvbG9yID0gW2NvbG9yUGlja2VyXVxyXG4gICAgICB0aGlzLl9lbG1zLmxpbmVDb2xvciA9IFtsaW5lY29sb3JQaWNrZXJdXHJcbiAgICAgIHRoaXMuX2VsbXMubGFiZWxDb2xvciA9IFtsYWJlbENvbG9yUGlja2VyXVxyXG4gICAgICB0aGlzLl9lbG1zLmxhYmVsTGluZUNvbG9yID0gW2xpbmVDb2xvclBpY2tlcl1cclxuICAgICAgdGhpcy5fZWxtcy5sYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0ID0gW2xhYmVsQmFja2dyb3VuZENvbG9yU3RhcnRQaWNrZXJdXHJcbiAgICAgIHRoaXMuX2VsbXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmQgPSBbbGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmRQaWNrZXJdXHJcblxyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICB0aGlzLmF0dHJpYnV0ZUxpbmsgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudFxyXG4gICAgICAgIHRoaXMuYXR0cmlidXRlVnIgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnRcclxuICAgICAgICB0aGlzLmNhbWVyYVNlbGVjdCAmJiB0aGlzLmNhbWVyYVNlbGVjdCgpXHJcbiAgICAgICAgdGhpcy5nb29kc1NlbGVjdCAmJiB0aGlzLmdvb2RzU2VsZWN0KClcclxuICAgICAgICBsZXQgdGFnRGF0YSA9IHRoaXMuYXR0cmlidXRlU2VsZWN0XHJcbiAgICAgICAgbGV0IGF0dHJpYnV0ZUVsbSA9IHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXHJcbiAgICAgICAgICAnYXR0cmlidXRlLXNlbGVjdC1ib3gnXHJcbiAgICAgICAgKVswXVxyXG4gICAgICAgIGlmIChhdHRyaWJ1dGVFbG0pIHtcclxuICAgICAgICAgIGxldCBsZWdwT2JqZWN0ID0gbGVncChhdHRyaWJ1dGVFbG0sICcuYXR0cmlidXRlLXNlbGVjdCcpXHJcbiAgICAgICAgICBsZWdwT2JqZWN0LmxlZ3Bfc2VhcmNoKHRhZ0RhdGEpXHJcbiAgICAgICAgICBsZXQgYXR0cmlidXRlU2VsZWN0RWxtID0gdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnRcclxuICAgICAgICAgICAgLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2F0dHJpYnV0ZS1zZWxlY3QnKVswXVxyXG4gICAgICAgICAgICAuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2lucHV0JylbMF1cclxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGFnRGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAodGFnRGF0YVtpXS5rZXkgPT09IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGVUeXBlKSB7XHJcbiAgICAgICAgICAgICAgYXR0cmlidXRlU2VsZWN0RWxtLnZhbHVlID0gdGFnRGF0YVtpXS52YWx1ZVxyXG4gICAgICAgICAgICAgIGxlZ3BPYmplY3QubGVncF9zZWFyY2hBY3RpdmUodGFnRGF0YVtpXS52YWx1ZSlcclxuICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBhdHRyaWJ1dGVTZWxlY3RFbG0uYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGFnRGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgIGlmICh0YWdEYXRhW2ldLnZhbHVlID09PSBhdHRyaWJ1dGVTZWxlY3RFbG0udmFsdWUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYXR0cmlidXRlVHlwZSA9IHRhZ0RhdGFbaV0ua2V5XHJcbiAgICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCB1bml0RGF0YSA9IFtcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJ+W5s+aWueexsycsXHJcbiAgICAgICAgICAgIHZhbHVlOiAn5bmz5pa557GzJ1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJ+W5s+aWueWNg+exsycsXHJcbiAgICAgICAgICAgIHZhbHVlOiAn5bmz5pa55Y2D57GzJ1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJ+S6qScsXHJcbiAgICAgICAgICAgIHZhbHVlOiAn5LqpJ1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJ+WFrOmhtycsXHJcbiAgICAgICAgICAgIHZhbHVlOiAn5YWs6aG3J1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIF1cclxuXHJcbiAgICAgICAgbGV0IHVuaXREYXRhTGVncE9iamVjdCA9IGxlZ3AoXHJcbiAgICAgICAgICB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFxyXG4gICAgICAgICAgICAnaW5wdXQtc2VsZWN0LXVuaXQtYm94J1xyXG4gICAgICAgICAgKVswXSxcclxuICAgICAgICAgICcuaW5wdXQtc2VsZWN0LXVuaXQnXHJcbiAgICAgICAgKVxyXG4gICAgICAgIGlmICh1bml0RGF0YUxlZ3BPYmplY3QpIHtcclxuICAgICAgICAgIHVuaXREYXRhTGVncE9iamVjdC5sZWdwX3NlYXJjaCh1bml0RGF0YSlcclxuICAgICAgICAgIGxldCB1bml0RGF0YUxlZ3BFbG0gPSB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudFxyXG4gICAgICAgICAgICAuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaW5wdXQtc2VsZWN0LXVuaXQnKVswXVxyXG4gICAgICAgICAgICAuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2lucHV0JylbMF1cclxuICAgICAgICAgIHVuaXREYXRhTGVncEVsbS52YWx1ZSA9IHRoaXMub3B0aW9uc1snYXJlYS11bml0J11cclxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdW5pdERhdGEubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKHVuaXREYXRhW2ldLnZhbHVlID09PSB1bml0RGF0YUxlZ3BFbG0udmFsdWUpIHtcclxuICAgICAgICAgICAgICB1bml0RGF0YUxlZ3BPYmplY3QubGVncF9zZWFyY2hBY3RpdmUodW5pdERhdGFbaV0udmFsdWUpXHJcbiAgICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdW5pdERhdGFMZWdwRWxtLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKCkgPT4ge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHVuaXREYXRhLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgaWYgKHVuaXREYXRhW2ldLnZhbHVlID09PSB1bml0RGF0YUxlZ3BFbG0udmFsdWUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYXJlYVVuaXQgPSB1bml0RGF0YVtpXS52YWx1ZVxyXG4gICAgICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgaGVpZ2h0Qm94RWxtID0gdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaGVpZ2h0LWJveCcpWzBdXHJcbiAgICAgICAgbGV0IGhlaWdodEVsbSA9IGhlaWdodEJveEVsbS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdoZWlnaHQnKVswXVxyXG4gICAgICAgIGxldCBoZWlnaHRDb25maXJtRWxtID0gdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaGVpZ2h0LWNvbmZpcm0nKVswXVxyXG4gICAgICAgIGhlaWdodEVsbS52YWx1ZSA9IDEwXHJcbiAgICAgICAgaWYgKHRoaXMuaGVpZ2h0TW9kZSA9PSAyKSB7XHJcbiAgICAgICAgICBoZWlnaHRCb3hFbG0gJiYgKGhlaWdodEJveEVsbS5jbGFzc05hbWUgPSAnaW5wdXQtbnVtYmVyIGlucHV0LW51bWJlci11bml0LTEgaGVpZ2h0LWJveCBkaXNhYmxlZCcpO1xyXG4gICAgICAgICAgaGVpZ2h0Q29uZmlybUVsbSAmJiBoZWlnaHRDb25maXJtRWxtLnNldEF0dHJpYnV0ZSgnZGlzYWJsZWQnLCAnZGlzYWJsZWQnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBoZWlnaHRCb3hFbG0gJiYgKGhlaWdodEJveEVsbS5jbGFzc05hbWUgPSAnaW5wdXQtbnVtYmVyIGlucHV0LW51bWJlci11bml0LTEgaGVpZ2h0LWJveCcpO1xyXG4gICAgICAgICAgaGVpZ2h0Q29uZmlybUVsbSAmJiBoZWlnaHRDb25maXJtRWxtLnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZWQnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IGhlaWdodE1vZGVEYXRhID0gW1xyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lOiAn5rW35ouU6auY5bqmJyxcclxuICAgICAgICAgICAgdmFsdWU6ICfmtbfmi5Tpq5jluqYnLFxyXG4gICAgICAgICAgICBrZXk6ICcwJyxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIG5hbWU6ICfnm7jlr7nlnLDooagnLFxyXG4gICAgICAgICAgICB2YWx1ZTogJ+ebuOWvueWcsOihqCcsXHJcbiAgICAgICAgICAgIGtleTogJzEnLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJ+S+nemZhOaooeWeiycsXHJcbiAgICAgICAgICAgIHZhbHVlOiAn5L6d6ZmE5qih5Z6LJyxcclxuICAgICAgICAgICAga2V5OiAnMicsXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgXVxyXG4gICAgICAgIGxldCBoZWlnaHRNb2RlT2JqZWN0ID0gbGVncChcclxuICAgICAgICAgIHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXHJcbiAgICAgICAgICAgICdoZWlnaHQtbW9kZS1ib3gnXHJcbiAgICAgICAgICApWzBdLFxyXG4gICAgICAgICAgJy5oZWlnaHQtbW9kZSdcclxuICAgICAgICApXHJcbiAgICAgICAgaWYgKGhlaWdodE1vZGVPYmplY3QpIHtcclxuICAgICAgICAgIGhlaWdodE1vZGVPYmplY3QubGVncF9zZWFyY2goaGVpZ2h0TW9kZURhdGEpXHJcbiAgICAgICAgICBsZXQgaGVpZ2h0TW9kZURhdGFMZWdwRWxtID0gdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnRcclxuICAgICAgICAgICAgLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2hlaWdodC1tb2RlJylbMF1cclxuICAgICAgICAgICAgLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdpbnB1dCcpWzBdXHJcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhlaWdodE1vZGVEYXRhLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChoZWlnaHRNb2RlRGF0YVtpXS5rZXkgPT0gdGhpcy5oZWlnaHRNb2RlKSB7XHJcbiAgICAgICAgICAgICAgaGVpZ2h0TW9kZURhdGFMZWdwRWxtLnZhbHVlID0gaGVpZ2h0TW9kZURhdGFbaV0udmFsdWVcclxuICAgICAgICAgICAgICBoZWlnaHRNb2RlT2JqZWN0LmxlZ3Bfc2VhcmNoQWN0aXZlKFxyXG4gICAgICAgICAgICAgICAgaGVpZ2h0TW9kZURhdGFbaV0udmFsdWVcclxuICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaGVpZ2h0TW9kZURhdGFMZWdwRWxtLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKCkgPT4ge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhlaWdodE1vZGVEYXRhLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgaWYgKGhlaWdodE1vZGVEYXRhW2ldLnZhbHVlID09PSBoZWlnaHRNb2RlRGF0YUxlZ3BFbG0udmFsdWUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaGVpZ2h0TW9kZSA9IGhlaWdodE1vZGVEYXRhW2ldLmtleVxyXG4gICAgICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pXHJcblxyXG4gICAgICAgICAgaGVpZ2h0RWxtLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKCkgPT4ge1xyXG4gICAgICAgICAgICBzd2l0Y2ggKHRoaXMuaGVpZ2h0TW9kZSkge1xyXG4gICAgICAgICAgICAgIGNhc2UgMDpcclxuICAgICAgICAgICAgICBjYXNlICcwJzpcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgIGNhc2UgMTpcclxuICAgICAgICAgICAgICBjYXNlICcxJzpcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgIGNhc2UgMjpcclxuICAgICAgICAgICAgICBjYXNlICcyJzpcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KVxyXG5cclxuICAgICAgICAgIHRoaXMuX2VsbXMuaGVpZ2h0ID0gaGVpZ2h0RWxtXHJcbiAgICAgICAgICB0aGlzLl9lbG1zLmhlaWdodEJveCA9IGhlaWdodEJveEVsbVxyXG4gICAgICAgICAgdGhpcy5fZWxtcy5oZWlnaHRNb2RlID0gaGVpZ2h0TW9kZURhdGFMZWdwRWxtXHJcbiAgICAgICAgICB0aGlzLl9lbG1zLmhlaWdodENvbmZpcm0gPSBoZWlnaHRDb25maXJtRWxtXHJcbiAgICAgICAgICB0aGlzLl9lbG1zLmhlaWdodE1vZGVPYmplY3QgPSBoZWlnaHRNb2RlT2JqZWN0XHJcblxyXG4gICAgICAgICAgaGVpZ2h0Q29uZmlybUVsbS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMub3BlcmF0ZS5wb3NpdGlvbkVkaXRpbmcpIHtcclxuICAgICAgICAgICAgICB0aGlzLnBvc2l0aW9uRWRpdGluZyA9IGZhbHNlXHJcbiAgICAgICAgICAgICAgdGhpcy5oZWlnaHQgPSB0aGlzLmhlaWdodCArIE51bWJlcihoZWlnaHRFbG0udmFsdWUpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgUG9seWdvbk9iamVjdC5jbG9zZU5vZGVFZGl0KHRoaXMpXHJcbiAgICAgICAgICAgICAgdGhpcy5oZWlnaHRNb2RlID0gdGhpcy5oZWlnaHRNb2RlXHJcbiAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhlaWdodCA9IHRoaXMuaGVpZ2h0ICsgTnVtYmVyKGhlaWdodEVsbS52YWx1ZSlcclxuICAgICAgICAgICAgICB9LCAxMDApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIHRoaXMucG9zaXRpb25FZGl0aW5nID0gZmFsc2VcclxuICAgICAgICAgICAgLy8gZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm9wdGlvbnMucG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIC8vICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5hbHQgPSBOdW1iZXIoKHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0uYWx0ICsgTnVtYmVyKGhlaWdodEVsbS52YWx1ZSkpLnRvRml4ZWQoMikpXHJcbiAgICAgICAgICAgIC8vICAgdGhpcy5fZWxtcy5hbHRbaV0uaW5uZXJIVE1MID0gdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5hbHRcclxuICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgICAvLyB0aGlzLnJlbmV3UG9zaXRpb25zKHRoaXMub3B0aW9ucy5wb3NpdGlvbnMpXHJcbiAgICAgICAgICAgIC8vIHRoaXMuZW50aXR5LnBvbHlsaW5lLnBvc2l0aW9ucyA9IFtcclxuICAgICAgICAgICAgLy8gICAuLi50aGlzLnBvc2l0aW9ucyxcclxuICAgICAgICAgICAgLy8gICB0aGlzLnBvc2l0aW9uc1swXSxcclxuICAgICAgICAgICAgLy8gICB0aGlzLnBvc2l0aW9uc1sxXVxyXG4gICAgICAgICAgICAvLyBdXHJcblxyXG4gICAgICAgICAgICAvLyB0aGlzLnBvc2l0aW9uRWRpdGluZyA9IGZhbHNlXHJcbiAgICAgICAgICAgIC8vIFBvbHlnb25PYmplY3QuY2xvc2VOb2RlRWRpdCh0aGlzKVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBmb250RGF0YSA9IGdldEZvbnRMaXN0KClcclxuICAgICAgICBsZXQgZm9udE9iamVjdCA9IGxlZ3AoXHJcbiAgICAgICAgICB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFxyXG4gICAgICAgICAgICAnZm9udC1zZWxlY3QtYm94J1xyXG4gICAgICAgICAgKVswXSxcclxuICAgICAgICAgICcuZm9udC1zZWxlY3QnXHJcbiAgICAgICAgKVxyXG4gICAgICAgIGlmIChmb250T2JqZWN0KSB7XHJcbiAgICAgICAgICBmb250T2JqZWN0LmxlZ3Bfc2VhcmNoKGZvbnREYXRhKVxyXG4gICAgICAgICAgbGV0IGZvbnREYXRhTGVncEVsbSA9IHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50XHJcbiAgICAgICAgICAgIC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdmb250LXNlbGVjdCcpWzBdXHJcbiAgICAgICAgICAgIC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaW5wdXQnKVswXVxyXG4gICAgICAgICAgZm9udERhdGFMZWdwRWxtLnZhbHVlID0gZm9udERhdGFbdGhpcy5sYWJlbEZvbnRGYW1pbHldLnZhbHVlXHJcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZvbnREYXRhLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChmb250RGF0YVtpXS52YWx1ZSA9PSBmb250RGF0YUxlZ3BFbG0udmFsdWUpIHtcclxuICAgICAgICAgICAgICBmb250T2JqZWN0LmxlZ3Bfc2VhcmNoQWN0aXZlKGZvbnREYXRhW2ldLnZhbHVlKVxyXG4gICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGZvbnREYXRhTGVncEVsbS5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICgpID0+IHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmb250RGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgIGlmIChmb250RGF0YVtpXS52YWx1ZSA9PT0gZm9udERhdGFMZWdwRWxtLnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxhYmVsRm9udEZhbWlseSA9IGZvbnREYXRhW2ldLmtleVxyXG4gICAgICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICB0aGlzLl9lbG1zLmxhYmVsRm9udEZhbWlseSA9IFtmb250RGF0YUxlZ3BFbG1dXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjcmVhdGVTcGF0aWFsSW5mb1RhYmxlQ29udGVudCgpXHJcblxyXG5cclxuXHJcbiAgICAgIH0sIDApXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAodGhpcy5fRGlhbG9nT2JqZWN0ICYmIHRoaXMuX0RpYWxvZ09iamVjdC5yZW1vdmUpIHtcclxuICAgICAgICB0aGlzLl9EaWFsb2dPYmplY3QucmVtb3ZlKClcclxuICAgICAgICB0aGlzLl9EaWFsb2dPYmplY3QgPSBudWxsXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlc2V0KCkge1xyXG4gICAgaWYgKCF0aGlzLmVudGl0eSAmJiAhdGhpcy5fRGlhbG9nT2JqZWN0KSB7XHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG4gICAgdGhpcy5vcHRpb25zID0gdGhpcy5kZWVwQ29weU9iaih0aGlzLm9yaWdpbmFsT3B0aW9ucylcclxuICAgIHRoaXMubmFtZSA9IHRoaXMub3JpZ2luYWxPcHRpb25zLm5hbWVcclxuICAgIHRoaXMuY29sb3IgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5jb2xvclxyXG4gICAgdGhpcy5saW5lQ29sb3IgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5saW5lLmNvbG9yXHJcbiAgICB0aGlzLmxpbmVXaWR0aCA9IHRoaXMub3JpZ2luYWxPcHRpb25zLmxpbmUud2lkdGhcclxuICAgIHRoaXMuaGVpZ2h0ID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMuaGVpZ2h0XHJcbiAgICB0aGlzLmxhYmVsU2hvdyA9IHRoaXMub3JpZ2luYWxPcHRpb25zLmxhYmVsLnNob3dcclxuICAgIHRoaXMubGFiZWxDb2xvciA9IHRoaXMub3JpZ2luYWxPcHRpb25zLmxhYmVsLmNvbG9yXHJcbiAgICB0aGlzLmxhYmVsRm9udFNpemUgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5sYWJlbC5mb250U2l6ZVxyXG4gICAgdGhpcy5sYWJlbEZvbnRGYW1pbHkgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5sYWJlbC5mb250RmFtaWx5XHJcbiAgICB0aGlzLmxhYmVsU2NhbGVCeURpc3RhbmNlID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMubGFiZWwuc2NhbGVCeURpc3RhbmNlXHJcbiAgICB0aGlzLmxhYmVsTmVhciA9IHRoaXMub3JpZ2luYWxPcHRpb25zLmxhYmVsLm5lYXJcclxuICAgIHRoaXMubGFiZWxGYXIgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5sYWJlbC5mYXJcclxuICAgIHRoaXMubGFiZWxMaW5lV2lkdGggPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5sYWJlbC5saW5lV2lkdGhcclxuICAgIHRoaXMubGFiZWxQaXhlbE9mZnNldCA9IHRoaXMub3JpZ2luYWxPcHRpb25zLmxhYmVsLnBpeGVsT2Zmc2V0XHJcbiAgICB0aGlzLmxhYmVsTGluZUNvbG9yID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMubGFiZWwubGluZUNvbG9yXHJcbiAgICB0aGlzLmxhYmVsQmFja2dyb3VuZENvbG9yU3RhcnQgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5sYWJlbC5iYWNrZ3JvdW5kQ29sb3JbMF1cclxuICAgIHRoaXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmQgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5sYWJlbC5iYWNrZ3JvdW5kQ29sb3JbMV1cclxuICAgIHRoaXMuaGVpZ2h0TW9kZSA9IHRoaXMub3B0aW9ucy5oZWlnaHRNb2RlXHJcblxyXG4gICAgbGV0IHBvc2l0aW9ucyA9IHRoaXMub3B0aW9ucy5wb3NpdGlvbnNcclxuICAgIGxldCBwb3NpdGlvbnMyID0gW1tdXVxyXG4gICAgbGV0IGZyb21EZWdyZWVzQXJyYXkgPSBbXVxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5oZWlnaHQgfHwgdGhpcy5vcHRpb25zLmhlaWdodCA9PT0gMCkge1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGZyb21EZWdyZWVzQXJyYXkucHVzaChcclxuICAgICAgICAgIHBvc2l0aW9uc1tpXS5sbmcsXHJcbiAgICAgICAgICBwb3NpdGlvbnNbaV0ubGF0LFxyXG4gICAgICAgICAgdGhpcy5vcHRpb25zLmhlaWdodFxyXG4gICAgICAgIClcclxuICAgICAgICBwb3NpdGlvbnMyWzBdLnB1c2goW3Bvc2l0aW9uc1tpXS5sbmcsIHBvc2l0aW9uc1tpXS5sYXRdKVxyXG4gICAgICB9XHJcbiAgICAgIHBvc2l0aW9uczJbMF0ucHVzaChbcG9zaXRpb25zWzBdLmxuZywgcG9zaXRpb25zWzBdLmxhdF0pXHJcbiAgICAgIHRoaXMucG9zaXRpb25zID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXNBcnJheUhlaWdodHMoXHJcbiAgICAgICAgZnJvbURlZ3JlZXNBcnJheVxyXG4gICAgICApXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGZyb21EZWdyZWVzQXJyYXkucHVzaChwb3NpdGlvbnNbaV0ubG5nLCBwb3NpdGlvbnNbaV0ubGF0KVxyXG4gICAgICAgIHBvc2l0aW9uczJbMF0ucHVzaChbcG9zaXRpb25zW2ldLmxuZywgcG9zaXRpb25zW2ldLmxhdF0pXHJcbiAgICAgIH1cclxuICAgICAgcG9zaXRpb25zMlswXS5wdXNoKFtwb3NpdGlvbnNbMF0ubG5nLCBwb3NpdGlvbnNbMF0ubGF0XSlcclxuICAgICAgdGhpcy5wb3NpdGlvbnMgPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlc0FycmF5KGZyb21EZWdyZWVzQXJyYXkpXHJcbiAgICB9XHJcbiAgICB0aGlzLmVudGl0eS5wb2x5Z29uLmhpZXJhcmNoeSA9IG5ldyBDZXNpdW0uUG9seWdvbkhpZXJhcmNoeSh0aGlzLnBvc2l0aW9ucylcclxuICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLnBvc2l0aW9ucyA9IFtcclxuICAgICAgLi4udGhpcy5wb3NpdGlvbnMsXHJcbiAgICAgIHRoaXMucG9zaXRpb25zWzBdLFxyXG4gICAgICB0aGlzLnBvc2l0aW9uc1sxXVxyXG4gICAgXVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICog6aOe5YiwXHJcbiAgICovXHJcbiAgYXN5bmMgZmx5VG8ob3B0aW9ucyA9IHt9KSB7XHJcbiAgICBpZiAodGhpcy5fZXJyb3IpIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcbiAgICBzZXRBY3RpdmVWaWV3ZXIoMClcclxuICAgIGNsb3NlUm90YXRlQXJvdW5kKHRoaXMuc2RrKVxyXG4gICAgY2xvc2VWaWV3Rm9sbG93KHRoaXMuc2RrKVxyXG5cclxuICAgIGlmICh0aGlzLm9wdGlvbnMuY3VzdG9tVmlldyAmJiB0aGlzLm9wdGlvbnMuY3VzdG9tVmlldy5yZWxhdGl2ZVBvc2l0aW9uICYmIHRoaXMub3B0aW9ucy5jdXN0b21WaWV3Lm9yaWVudGF0aW9uKSB7XHJcbiAgICAgIGxldCBvcmllbnRhdGlvbiA9IHtcclxuICAgICAgICBoZWFkaW5nOiBDZXNpdW0uTWF0aC50b1JhZGlhbnModGhpcy5vcHRpb25zLmN1c3RvbVZpZXcub3JpZW50YXRpb24uaGVhZGluZyB8fCAwLjApLFxyXG4gICAgICAgIHBpdGNoOiBDZXNpdW0uTWF0aC50b1JhZGlhbnModGhpcy5vcHRpb25zLmN1c3RvbVZpZXcub3JpZW50YXRpb24ucGl0Y2ggfHwgLTYwLjApLFxyXG4gICAgICAgIHJvbGw6IENlc2l1bS5NYXRoLnRvUmFkaWFucyh0aGlzLm9wdGlvbnMuY3VzdG9tVmlldy5vcmllbnRhdGlvbi5yb2xsIHx8IDAuMClcclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IGxuZyA9IHRoaXMub3B0aW9ucy5jdXN0b21WaWV3LnJlbGF0aXZlUG9zaXRpb24ubG5nXHJcbiAgICAgIGxldCBsYXQgPSB0aGlzLm9wdGlvbnMuY3VzdG9tVmlldy5yZWxhdGl2ZVBvc2l0aW9uLmxhdFxyXG4gICAgICBsZXQgYWx0ID0gdGhpcy5vcHRpb25zLmN1c3RvbVZpZXcucmVsYXRpdmVQb3NpdGlvbi5hbHRcclxuICAgICAgbGV0IGRlc3RpbmF0aW9uID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXMobG5nLCBsYXQsIGFsdClcclxuXHJcbiAgICAgIGxldCBwb3NpdGlvbiA9IHsgbG5nOiAwLCBsYXQ6IDAgfVxyXG4gICAgICBpZiAodGhpcy5vcHRpb25zLnBvc2l0aW9uKSB7XHJcbiAgICAgICAgcG9zaXRpb24gPSB7IC4uLnRoaXMub3B0aW9ucy5wb3NpdGlvbiB9XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAodGhpcy5vcHRpb25zLnBvc2l0aW9ucykge1xyXG4gICAgICAgIHBvc2l0aW9uID0geyAuLi50aGlzLm9wdGlvbnMucG9zaXRpb25zWzBdIH1cclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmICh0aGlzLm9wdGlvbnMuY2VudGVyKSB7XHJcbiAgICAgICAgcG9zaXRpb24gPSB7IC4uLnRoaXMub3B0aW9ucy5jZW50ZXIgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKHRoaXMub3B0aW9ucy5zdGFydCkge1xyXG4gICAgICAgIHBvc2l0aW9uID0geyAuLi50aGlzLm9wdGlvbnMuc3RhcnQgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ2xuZycpKSB7XHJcbiAgICAgICAgICBwb3NpdGlvbi5sbmcgPSB0aGlzLm9wdGlvbnMubG5nXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ2xhdCcpKSB7XHJcbiAgICAgICAgICBwb3NpdGlvbi5sYXQgPSB0aGlzLm9wdGlvbnMubGF0XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ2FsdCcpKSB7XHJcbiAgICAgICAgICBwb3NpdGlvbi5hbHQgPSB0aGlzLm9wdGlvbnMuYWx0XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIC8vIOWmguaenOayoeaciemrmOW6puWAvO+8jOWImeiOt+WPlue0p+i0tOmrmOW6puiuoeeul1xyXG4gICAgICBpZiAoIXBvc2l0aW9uLmhhc093blByb3BlcnR5KCdhbHQnKSkge1xyXG4gICAgICAgIHBvc2l0aW9uLmFsdCA9IGF3YWl0IHRoaXMuZ2V0Q2xhbXBUb0hlaWdodChwb3NpdGlvbilcclxuICAgICAgfVxyXG4gICAgICBsbmcgPSB0aGlzLm9wdGlvbnMuY3VzdG9tVmlldy5yZWxhdGl2ZVBvc2l0aW9uLmxuZyArIHBvc2l0aW9uLmxuZ1xyXG4gICAgICBsYXQgPSB0aGlzLm9wdGlvbnMuY3VzdG9tVmlldy5yZWxhdGl2ZVBvc2l0aW9uLmxhdCArIHBvc2l0aW9uLmxhdFxyXG4gICAgICBhbHQgPSB0aGlzLm9wdGlvbnMuY3VzdG9tVmlldy5yZWxhdGl2ZVBvc2l0aW9uLmFsdCArIHBvc2l0aW9uLmFsdFxyXG4gICAgICBkZXN0aW5hdGlvbiA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzKGxuZywgbGF0LCBhbHQpXHJcbiAgICAgIHRoaXMuc2RrLnZpZXdlci5jYW1lcmEuZmx5VG8oe1xyXG4gICAgICAgIGRlc3RpbmF0aW9uOiBkZXN0aW5hdGlvbixcclxuICAgICAgICBvcmllbnRhdGlvbjogb3JpZW50YXRpb25cclxuICAgICAgfSlcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBsZXQgcG9zaXRpb25BcnJheSA9IFtdXHJcbiAgICAgIGxldCBncm91bmRcclxuICAgICAgc3dpdGNoICh0aGlzLmhlaWdodE1vZGUpIHtcclxuICAgICAgICBjYXNlIDA6XHJcbiAgICAgICAgY2FzZSAnMCc6XHJcbiAgICAgICAgICBncm91bmQgPSBmYWxzZVxyXG4gICAgICAgICAgYnJlYWtcclxuICAgICAgICBjYXNlIDE6XHJcbiAgICAgICAgY2FzZSAnMSc6XHJcbiAgICAgICAgICBncm91bmQgPSBmYWxzZVxyXG4gICAgICAgICAgYnJlYWtcclxuICAgICAgICBjYXNlIDI6XHJcbiAgICAgICAgY2FzZSAnMic6XHJcbiAgICAgICAgICBncm91bmQgPSB0cnVlXHJcbiAgICAgICAgICBicmVha1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChncm91bmQpIHtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMub3B0aW9ucy5wb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGxldCBoZWlnaHQgPSBhd2FpdCB0aGlzLmdldENsYW1wVG9IZWlnaHQodGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXSlcclxuICAgICAgICAgIGxldCBhID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXMoXHJcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubG5nLFxyXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxhdCxcclxuICAgICAgICAgICAgaGVpZ2h0XHJcbiAgICAgICAgICApXHJcbiAgICAgICAgICBwb3NpdGlvbkFycmF5LnB1c2goYS54LCBhLnksIGEueilcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaWYgKHRoaXMucG9zaXRpb25zKSB7XHJcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHBvc2l0aW9uQXJyYXkucHVzaCh0aGlzLnBvc2l0aW9uc1tpXS54LCB0aGlzLnBvc2l0aW9uc1tpXS55LCB0aGlzLnBvc2l0aW9uc1tpXS56KVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBsZXQgQm91bmRpbmdTcGhlcmUgPSBDZXNpdW0uQm91bmRpbmdTcGhlcmUuZnJvbVZlcnRpY2VzKHBvc2l0aW9uQXJyYXkpXHJcbiAgICAgIHRoaXMuc2RrLnZpZXdlci5jYW1lcmEuZmx5VG9Cb3VuZGluZ1NwaGVyZShCb3VuZGluZ1NwaGVyZSwge1xyXG4gICAgICAgIG9mZnNldDogb3B0aW9ucy5vcmllbnRhdGlvbiB8fCB7XHJcbiAgICAgICAgICBoZWFkaW5nOiBDZXNpdW0uTWF0aC50b1JhZGlhbnMoMC4wKSxcclxuICAgICAgICAgIHBpdGNoOiBDZXNpdW0uTWF0aC50b1JhZGlhbnMoLTkwLjApLFxyXG4gICAgICAgICAgcm9sbDogQ2VzaXVtLk1hdGgudG9SYWRpYW5zKDAuMClcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiDliKDpmaRcclxuICAgKi9cclxuICBhc3luYyByZW1vdmUoKSB7XHJcbiAgICB0aGlzLmV2ZW50ICYmIHRoaXMuZXZlbnQuZGVzdHJveSgpXHJcbiAgICB0aGlzLnRpcCAmJiB0aGlzLnRpcC5kZXN0cm95KClcclxuICAgIHRoaXMuc2RrLnZpZXdlci5lbnRpdGllcy5yZW1vdmUodGhpcy5lbnRpdHkpXHJcbiAgICB0aGlzLmxhYmVsICYmIHRoaXMubGFiZWwucmVtb3ZlKClcclxuICAgIHRoaXMuZW50aXR5ID0gbnVsbFxyXG4gICAgaWYgKHRoaXMuX0RpYWxvZ09iamVjdCAmJiAhdGhpcy5fRGlhbG9nT2JqZWN0LmlzRGVzdHJveSkge1xyXG4gICAgICB0aGlzLl9EaWFsb2dPYmplY3QuY2xvc2UoKVxyXG4gICAgICB0aGlzLl9EaWFsb2dPYmplY3QgPSBudWxsXHJcbiAgICB9XHJcbiAgICBhd2FpdCB0aGlzLnNkay5yZW1vdmVJbmNldGFuY2UodGhpcy5vcHRpb25zLmlkKVxyXG4gICAgYXdhaXQgc3luY0RhdGEodGhpcy5zZGssIHRoaXMub3B0aW9ucy5pZClcclxuICB9XHJcblxyXG4gIC8qKkBkZXNjIOaJk+W8gOW5s+enu+WKn+iDvVxyXG4gICAqXHJcbiAgICogQG1lbWJlck9mIFNvdXJjZVxyXG4gICAqIEBwYXJhbSBzdGF0dXMge2Jvb2xlYW59XHJcbiAgICpcclxuICAgKiAqL1xyXG4gIHNldCBwb3NpdGlvbkVkaXRpbmcoc3RhdHVzKSB7XHJcbiAgICB0aGlzLmNsb3NlTm9kZUVkaXQoKVxyXG4gICAgaWYgKFlKLk1lYXN1cmUuR2V0TWVhc3VyZVN0YXR1cygpIHx8ICF0aGlzLnNkayB8fCAhdGhpcy5zZGsudmlld2VyIHx8ICF0aGlzLmVudGl0eSkge1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuICAgIGxldCBfdGhpcyA9IHRoaXNcclxuICAgIHRoaXMuZXZlbnQgJiYgdGhpcy5ldmVudC5kZXN0cm95KClcclxuICAgIHRoaXMuZXZlbnQgPSBuZXcgTW91c2VFdmVudCh0aGlzLnNkaylcclxuICAgIHRoaXMub3BlcmF0ZS5wb3NpdGlvbkVkaXRpbmcgPSBzdGF0dXNcclxuXHJcbiAgICBpZiAoc3RhdHVzID09PSB0cnVlKSB7XHJcbiAgICAgIHRoaXMucHJldmlvdXMgPSB7XHJcbiAgICAgICAgcG9zaXRpb25zOiBbLi4udGhpcy5wb3NpdGlvbnNdXHJcbiAgICAgIH1cclxuICAgICAgdGhpcy50aXAgJiYgdGhpcy50aXAuZGVzdHJveSgpXHJcbiAgICAgIHRoaXMudGlwID0gbmV3IE1vdXNlVGlwKCfngrnlh7vpvKDmoIflt6bplK7noa7orqTvvIzlj7PplK7lj5bmtognLCB0aGlzLnNkaylcclxuICAgICAgdGhpcy5sYWJlbCAmJlxyXG4gICAgICAgICh0aGlzLmxhYmVsLmVudGl0eS5iaWxsYm9hcmQuY29sb3IgPSBDZXNpdW0uQ29sb3IuZnJvbUNzc0NvbG9yU3RyaW5nKFxyXG4gICAgICAgICAgYHJnYmEoMjU1LDI1NSwyNTUsMC45KWBcclxuICAgICAgICApKVxyXG4gICAgICB0aGlzLnBpY2tpbmcgPSBmYWxzZVxyXG4gICAgICBsZXQgYXJyYXkgPSBbXVxyXG4gICAgICBsZXQgcG9zaXRpb25zID0gWy4uLnRoaXMucG9zaXRpb25zXVxyXG4gICAgICBsZXQgcG9zaXRpb25zODQgPSB0aGlzLmRlZXBDb3B5T2JqKHRoaXMub3B0aW9ucy5wb3NpdGlvbnMpXHJcbiAgICAgIGxldCBmcm9tRGVncmVlc0FycmF5ID0gW11cclxuXHJcbiAgICAgIGxldCBkaXNwYXJpdHkgPSBbXVxyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGxldCBwb3NpdGlvbiA9IHRoaXMuY2FydGVzaWFuM1Rvd2dzODQocG9zaXRpb25zW2ldLCB0aGlzLnNkay52aWV3ZXIpXHJcbiAgICAgICAgYXJyYXkucHVzaChbcG9zaXRpb24ubG5nLCBwb3NpdGlvbi5sYXRdKVxyXG4gICAgICB9XHJcbiAgICAgIGxldCBmaXJzdHBvc2l0aW9uID0gdGhpcy5jYXJ0ZXNpYW4zVG93Z3M4NChwb3NpdGlvbnNbMF0sIHRoaXMuc2RrLnZpZXdlcilcclxuICAgICAgYXJyYXkucHVzaChbZmlyc3Rwb3NpdGlvbi5sbmcsIGZpcnN0cG9zaXRpb24ubGF0XSlcclxuICAgICAgdmFyIHBvbHlnb24gPSB0dXJmLnBvbHlnb24oW2FycmF5XSlcclxuICAgICAgdmFyIGNlbnRyb2lkID0gdHVyZi5jZW50cm9pZChwb2x5Z29uKVxyXG4gICAgICBsZXQgY2VudGVyID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXMoXHJcbiAgICAgICAgLi4uY2VudHJvaWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNcclxuICAgICAgKVxyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGRpc3Bhcml0eS5wdXNoKHtcclxuICAgICAgICAgIHg6IGNlbnRlci54IC0gcG9zaXRpb25zW2ldLngsXHJcbiAgICAgICAgICB5OiBjZW50ZXIueSAtIHBvc2l0aW9uc1tpXS55LFxyXG4gICAgICAgICAgejogY2VudGVyLnogLSBwb3NpdGlvbnNbaV0uelxyXG4gICAgICAgIH0pXHJcbiAgICAgIH1cclxuICAgICAgbGV0IG5ld3Bvc2l0aW9ucyA9IFtdXHJcbiAgICAgIGxldCBsZWZ0RXZlbnQgPSAobW92ZW1lbnQsIGNhcnRlc2lhbikgPT4ge1xyXG4gICAgICAgIGxldCBwb3NpdGlvbjg0ID0gdGhpcy5jYXJ0ZXNpYW4zVG93Z3M4NChjYXJ0ZXNpYW4sIHRoaXMuc2RrLnZpZXdlcilcclxuICAgICAgICB0aGlzLmV2ZW50Lm1vdXNlX21vdmUoKCkgPT4geyB9KVxyXG4gICAgICAgIHRoaXMuZXZlbnQubW91c2VfbGVmdCgoKSA9PiB7IH0pXHJcbiAgICAgICAgdGhpcy5ldmVudC5tb3VzZV9yaWdodCgoKSA9PiB7IH0pXHJcbiAgICAgICAgbmV3cG9zaXRpb25zID0gW11cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRpc3Bhcml0eS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgbGV0IHBvczMgPSB7XHJcbiAgICAgICAgICAgIHg6IGNhcnRlc2lhbi54IC0gZGlzcGFyaXR5W2ldLngsXHJcbiAgICAgICAgICAgIHk6IGNhcnRlc2lhbi55IC0gZGlzcGFyaXR5W2ldLnksXHJcbiAgICAgICAgICAgIHo6IGNhcnRlc2lhbi56IC0gZGlzcGFyaXR5W2ldLnpcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIG5ld3Bvc2l0aW9ucy5wdXNoKHBvczMpXHJcbiAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldID0gdGhpcy5jYXJ0ZXNpYW4zVG93Z3M4NChcclxuICAgICAgICAgICAgcG9zMyxcclxuICAgICAgICAgICAgdGhpcy5zZGsudmlld2VyXHJcbiAgICAgICAgICApXHJcbiAgICAgICAgICBpZiAoX3RoaXMuX2VsbXMubG5nICYmIF90aGlzLl9lbG1zLmxuZ1tpXSkge1xyXG4gICAgICAgICAgICBfdGhpcy5fZWxtcy5sbmdbaV0uaW5uZXJIVE1MID0gdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sbmcudG9GaXhlZCg4KVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKF90aGlzLl9lbG1zLmxhdCAmJiBfdGhpcy5fZWxtcy5sYXRbaV0pIHtcclxuICAgICAgICAgICAgX3RoaXMuX2VsbXMubGF0W2ldLmlubmVySFRNTCA9IHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubGF0LnRvRml4ZWQoOClcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMucHJldmlvdXMgPSBudWxsXHJcbiAgICAgICAgZnJvbURlZ3JlZXNBcnJheSA9IFtdXHJcbiAgICAgICAgdGhpcy5oZWlnaHRNb2RlID0gdGhpcy5oZWlnaHRNb2RlXHJcblxyXG4gICAgICAgIGlmKHRoaXMuX3Bvc2l0aW9uRWRpdGluZ0NhbGxiYWNrKSB7XHJcbiAgICAgICAgICB0aGlzLl9wb3NpdGlvbkVkaXRpbmdDYWxsYmFjaygpXHJcbiAgICAgICAgICB0aGlzLl9wb3NpdGlvbkVkaXRpbmdDYWxsYmFjayA9IG51bGxcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5ldmVudC5tb3VzZV9tb3ZlKChtb3ZlbWVudCwgY2FydGVzaWFuKSA9PiB7XHJcbiAgICAgICAgbGV0IHBvc2l0aW9uODQgPSB0aGlzLmNhcnRlc2lhbjNUb3dnczg0KGNhcnRlc2lhbiwgdGhpcy5zZGsudmlld2VyKVxyXG4gICAgICAgIG5ld3Bvc2l0aW9ucyA9IFtdXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkaXNwYXJpdHkubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGxldCBwb3MzID0ge1xyXG4gICAgICAgICAgICB4OiBjYXJ0ZXNpYW4ueCAtIGRpc3Bhcml0eVtpXS54LFxyXG4gICAgICAgICAgICB5OiBjYXJ0ZXNpYW4ueSAtIGRpc3Bhcml0eVtpXS55LFxyXG4gICAgICAgICAgICB6OiBjYXJ0ZXNpYW4ueiAtIGRpc3Bhcml0eVtpXS56XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBuZXdwb3NpdGlvbnMucHVzaChwb3MzKVxyXG4gICAgICAgICAgcG9zaXRpb25zODRbaV0gPSB0aGlzLmNhcnRlc2lhbjNUb3dnczg0KFxyXG4gICAgICAgICAgICBwb3MzLFxyXG4gICAgICAgICAgICB0aGlzLnNkay52aWV3ZXJcclxuICAgICAgICAgIClcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBncm91bmQgPSBmYWxzZVxyXG4gICAgICAgIGxldCBhcnJheSA9IFtdXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb3NpdGlvbnM4NC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgYXJyYXkucHVzaChbcG9zaXRpb25zODRbaV0ubG5nLCBwb3NpdGlvbnM4NFtpXS5sYXRdKVxyXG4gICAgICAgIH1cclxuICAgICAgICBhcnJheS5wdXNoKFtwb3NpdGlvbnM4NFswXS5sbmcsIHBvc2l0aW9uczg0WzBdLmxhdF0pXHJcbiAgICAgICAgbGV0IGhlaWdodCA9IDBcclxuICAgICAgICBsZXQgcG9seWdvbiA9IHR1cmYucG9seWdvbihbYXJyYXldKVxyXG4gICAgICAgIGxldCBjZW50cm9pZCA9IHR1cmYuY2VudHJvaWQocG9seWdvbilcclxuICAgICAgICBzd2l0Y2ggKHRoaXMub3B0aW9ucy5oZWlnaHRNb2RlKSB7XHJcbiAgICAgICAgICBjYXNlICcwJzpcclxuICAgICAgICAgIGNhc2UgMDpcclxuICAgICAgICAgICAgZ3JvdW5kID0gZmFsc2VcclxuICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgIGNhc2UgJzEnOlxyXG4gICAgICAgICAgY2FzZSAxOlxyXG4gICAgICAgICAgICBoZWlnaHQgPSB0aGlzLnNkay52aWV3ZXIuc2NlbmUuZ2xvYmUuZ2V0SGVpZ2h0KENlc2l1bS5DYXJ0b2dyYXBoaWMuZnJvbURlZ3JlZXMoY2VudHJvaWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMF0sIGNlbnRyb2lkLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzFdKSlcclxuICAgICAgICAgICAgZ3JvdW5kID0gZmFsc2VcclxuICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgIGNhc2UgJzInOlxyXG4gICAgICAgICAgY2FzZSAyOlxyXG4gICAgICAgICAgICBncm91bmQgPSB0cnVlXHJcbiAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZyb21EZWdyZWVzQXJyYXkgPSBbXVxyXG4gICAgICAgIGlmICghZ3JvdW5kKSB7XHJcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvc2l0aW9uczg0Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGZyb21EZWdyZWVzQXJyYXkucHVzaChcclxuICAgICAgICAgICAgICBwb3NpdGlvbnM4NFtpXS5sbmcsXHJcbiAgICAgICAgICAgICAgcG9zaXRpb25zODRbaV0ubGF0LFxyXG4gICAgICAgICAgICAgIHRoaXMuaGVpZ2h0ICsgaGVpZ2h0XHJcbiAgICAgICAgICAgIClcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMucG9zaXRpb25zID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXNBcnJheUhlaWdodHMoXHJcbiAgICAgICAgICAgIGZyb21EZWdyZWVzQXJyYXlcclxuICAgICAgICAgIClcclxuICAgICAgICAgIHRoaXMubGFiZWwucG9zaXRpb24gPSBbcG9zaXRpb244NC5sbmcsIHBvc2l0aW9uODQubGF0LCB0aGlzLmhlaWdodCArIGhlaWdodF1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb3NpdGlvbnM4NC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBmcm9tRGVncmVlc0FycmF5LnB1c2gocG9zaXRpb25zODRbaV0ubG5nLCBwb3NpdGlvbnM4NFtpXS5sYXQpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLnBvc2l0aW9ucyA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzQXJyYXkoZnJvbURlZ3JlZXNBcnJheSlcclxuXHJcbiAgICAgICAgICBsZXQgb2JqZWN0c1RvRXhjbHVkZSA9IFsuLi50aGlzLnNkay52aWV3ZXIuZW50aXRpZXMudmFsdWVzXVxyXG4gICAgICAgICAgdGhpcy5nZXRDbGFtcFRvSGVpZ2h0KHtcclxuICAgICAgICAgICAgbG5nOiBwb3NpdGlvbjg0LmxuZyxcclxuICAgICAgICAgICAgbGF0OiBwb3NpdGlvbjg0LmxhdFxyXG4gICAgICAgICAgfSwgb2JqZWN0c1RvRXhjbHVkZSkudGhlbihoZWlnaHQgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxhYmVsLnBvc2l0aW9uID0gW3Bvc2l0aW9uODQubG5nLCBwb3NpdGlvbjg0LmxhdCwgaGVpZ2h0XVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMudGlwLnNldFBvc2l0aW9uKFxyXG4gICAgICAgICAgY2FydGVzaWFuLFxyXG4gICAgICAgICAgbW92ZW1lbnQuZW5kUG9zaXRpb24ueCxcclxuICAgICAgICAgIG1vdmVtZW50LmVuZFBvc2l0aW9uLnlcclxuICAgICAgICApXHJcbiAgICAgIH0pXHJcbiAgICAgIHRoaXMuZXZlbnQubW91c2VfbGVmdChsZWZ0RXZlbnQpXHJcbiAgICAgIHRoaXMuZXZlbnQubW91c2VfcmlnaHQoKG1vdmVtZW50LCBjYXJ0ZXNpYW4pID0+IHtcclxuICAgICAgICB0aGlzLmhlaWdodE1vZGUgPSB0aGlzLmhlaWdodE1vZGVcclxuICAgICAgfSlcclxuXHJcbiAgICAgIHRoaXMuZXZlbnQuZ2VzdHVyZV9waW5ja19zdGFydCgobW92ZW1lbnQsIGNhcnRlc2lhbikgPT4ge1xyXG4gICAgICAgIGxldCBzdGFydFRpbWUgPSBuZXcgRGF0ZSgpXHJcbiAgICAgICAgbGV0IHBvcyA9IHtcclxuICAgICAgICAgIHBvc2l0aW9uOiB7XHJcbiAgICAgICAgICAgIHg6IChtb3ZlbWVudC5wb3NpdGlvbjEueCArIG1vdmVtZW50LnBvc2l0aW9uMi54KSAvIDIsXHJcbiAgICAgICAgICAgIHk6IChtb3ZlbWVudC5wb3NpdGlvbjEueSArIG1vdmVtZW50LnBvc2l0aW9uMi55KSAvIDJcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5ldmVudC5nZXN0dXJlX3BpbmNrX2VuZCgoKSA9PiB7XHJcbiAgICAgICAgICBsZXQgZW5kVGltZSA9IG5ldyBEYXRlKClcclxuICAgICAgICAgIGlmIChlbmRUaW1lIC0gc3RhcnRUaW1lID49IDUwMCkge1xyXG4gICAgICAgICAgICAvLyDplb/mjInlj5bmtohcclxuICAgICAgICAgICAgdGhpcy5wb3NpdGlvbkVkaXRpbmcgPSBmYWxzZVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbGVmdEV2ZW50KHBvcywgY2FydGVzaWFuKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgIH0pXHJcblxyXG4gICAgICB0aGlzLmVudGl0eS5wb2x5Z29uLmhpZXJhcmNoeSA9IG5ldyBDZXNpdW0uQ2FsbGJhY2tQcm9wZXJ0eShmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBDZXNpdW0uUG9seWdvbkhpZXJhcmNoeShfdGhpcy5wb3NpdGlvbnMpXHJcbiAgICAgIH0sIGZhbHNlKVxyXG4gICAgICB0aGlzLmVudGl0eS5wb2x5bGluZS5wb3NpdGlvbnMgPSBuZXcgQ2VzaXVtLkNhbGxiYWNrUHJvcGVydHkoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHJldHVybiBbLi4uX3RoaXMucG9zaXRpb25zLCBfdGhpcy5wb3NpdGlvbnNbMF0sIF90aGlzLnBvc2l0aW9uc1sxXV1cclxuICAgICAgfSwgZmFsc2UpXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAoIXRoaXMucHJldmlvdXMpIHtcclxuICAgICAgICB0aGlzLnByZXZpb3VzID0ge1xyXG4gICAgICAgICAgcG9zaXRpb25zOiBbLi4udGhpcy5wb3NpdGlvbnNdXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRoaXMucG9zaXRpb25zID0gWy4uLnRoaXMucHJldmlvdXMucG9zaXRpb25zXVxyXG4gICAgICB9XHJcbiAgICAgIGlmICghdGhpcy5zZGsgfHwgIXRoaXMuc2RrLnZpZXdlciB8fCAhdGhpcy5sYWJlbCB8fCAhdGhpcy5sYWJlbC5lbnRpdHkpIHtcclxuICAgICAgICB0aGlzLmxhYmVsLmVudGl0eS5iaWxsYm9hcmQuY29sb3IgPSBDZXNpdW0uQ29sb3IuZnJvbUNzc0NvbG9yU3RyaW5nKFxyXG4gICAgICAgICAgYHJnYmEoMjU1LDI1NSwyNTUsMSlgXHJcbiAgICAgICAgKVxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMucGlja2luZyA9IHRydWVcclxuICAgICAgaWYgKHRoaXMuZXZlbnQpIHtcclxuICAgICAgICB0aGlzLmV2ZW50Lm1vdXNlX21vdmUoKCkgPT4geyB9KVxyXG4gICAgICAgIHRoaXMuZXZlbnQubW91c2VfbGVmdCgoKSA9PiB7IH0pXHJcbiAgICAgICAgdGhpcy5ldmVudC5tb3VzZV9yaWdodCgoKSA9PiB7IH0pXHJcbiAgICAgICAgdGhpcy5ldmVudC5kZXN0cm95KClcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnRpcCAmJiB0aGlzLnRpcC5kZXN0cm95KClcclxuICAgICAgbGV0IHBvc2l0aW9ucyA9IFtbXV1cclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnByZXZpb3VzLnBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGxldCBwb3NpdGlvbnM4NCA9IHRoaXMuY2FydGVzaWFuM1Rvd2dzODQoXHJcbiAgICAgICAgICB0aGlzLnByZXZpb3VzLnBvc2l0aW9uc1tpXSxcclxuICAgICAgICAgIHRoaXMuc2RrLnZpZXdlclxyXG4gICAgICAgIClcclxuICAgICAgICBwb3NpdGlvbnNbMF0ucHVzaChbcG9zaXRpb25zODQubG5nLCBwb3NpdGlvbnM4NC5sYXRdKVxyXG4gICAgICB9XHJcbiAgICAgIGxldCBwb3NpdGlvbnM4NCA9IHRoaXMuY2FydGVzaWFuM1Rvd2dzODQoXHJcbiAgICAgICAgdGhpcy5wcmV2aW91cy5wb3NpdGlvbnNbMF0sXHJcbiAgICAgICAgdGhpcy5zZGsudmlld2VyXHJcbiAgICAgIClcclxuICAgICAgcG9zaXRpb25zWzBdLnB1c2goW3Bvc2l0aW9uczg0LmxuZywgcG9zaXRpb25zODQubGF0XSlcclxuICAgICAgbGV0IHBvbHlnb24gPSB0dXJmLnBvbHlnb24ocG9zaXRpb25zKVxyXG4gICAgICBsZXQgY2VudHJvaWQgPSB0dXJmLmNlbnRyb2lkKHBvbHlnb24pXHJcblxyXG4gICAgICBsZXQgZ3JvdW5kID0gZmFsc2VcclxuICAgICAgbGV0IGhlaWdodCA9IDBcclxuICAgICAgc3dpdGNoICh0aGlzLm9wdGlvbnMuaGVpZ2h0TW9kZSkge1xyXG4gICAgICAgIGNhc2UgJzAnOlxyXG4gICAgICAgIGNhc2UgMDpcclxuICAgICAgICAgIGdyb3VuZCA9IGZhbHNlXHJcbiAgICAgICAgICBicmVha1xyXG4gICAgICAgIGNhc2UgJzEnOlxyXG4gICAgICAgIGNhc2UgMTpcclxuICAgICAgICAgIGhlaWdodCA9IHRoaXMuc2RrLnZpZXdlci5zY2VuZS5nbG9iZS5nZXRIZWlnaHQoQ2VzaXVtLkNhcnRvZ3JhcGhpYy5mcm9tRGVncmVlcyhjZW50cm9pZC5nZW9tZXRyeS5jb29yZGluYXRlc1swXSwgY2VudHJvaWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMV0pKVxyXG4gICAgICAgICAgZ3JvdW5kID0gZmFsc2VcclxuICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgY2FzZSAnMic6XHJcbiAgICAgICAgY2FzZSAyOlxyXG4gICAgICAgICAgZ3JvdW5kID0gdHJ1ZVxyXG4gICAgICAgICAgYnJlYWtcclxuICAgICAgfVxyXG4gICAgICBpZiAoIWdyb3VuZCkge1xyXG4gICAgICAgIHRoaXMubGFiZWwucG9zaXRpb24gPSBbXHJcbiAgICAgICAgICBjZW50cm9pZC5nZW9tZXRyeS5jb29yZGluYXRlc1swXSxcclxuICAgICAgICAgIGNlbnRyb2lkLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzFdLFxyXG4gICAgICAgICAgdGhpcy5oZWlnaHQgKyBoZWlnaHRcclxuICAgICAgICBdXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5sYWJlbC5wb3NpdGlvbiA9IFtcclxuICAgICAgICAgIGNlbnRyb2lkLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzBdLFxyXG4gICAgICAgICAgY2VudHJvaWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMV1cclxuICAgICAgICBdXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuZW50aXR5LnBvbHlnb24uaGllcmFyY2h5ID0gbmV3IENlc2l1bS5Qb2x5Z29uSGllcmFyY2h5KF90aGlzLnByZXZpb3VzLnBvc2l0aW9ucylcclxuICAgICAgdGhpcy5lbnRpdHkucG9seWxpbmUucG9zaXRpb25zID0gW1xyXG4gICAgICAgIC4uLl90aGlzLnByZXZpb3VzLnBvc2l0aW9ucyxcclxuICAgICAgICBfdGhpcy5wcmV2aW91cy5wb3NpdGlvbnNbMF0sXHJcbiAgICAgICAgX3RoaXMucHJldmlvdXMucG9zaXRpb25zWzFdXHJcbiAgICAgIF1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCBwb3NpdGlvbkVkaXRpbmcoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcGVyYXRlLnBvc2l0aW9uRWRpdGluZ1xyXG4gIH1cclxuXHJcbiAgb3BlblBvc2l0aW9uRWRpdGluZyhjZCkge1xyXG4gICAgdGhpcy5wb3NpdGlvbkVkaXRpbmcgPSB0cnVlXHJcbiAgICB0aGlzLl9wb3NpdGlvbkVkaXRpbmdDYWxsYmFjayA9IGNkXHJcbiAgfVxyXG5cclxuICBnZXQgYXJlYUNoYW5nZUNhbGxCYWNrKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2FyZWFDaGFuZ2VDYWxsQmFja1xyXG4gIH1cclxuXHJcbiAgc2V0IGFyZWFDaGFuZ2VDYWxsQmFjayAoY2QpIHtcclxuICAgIHRoaXMuX2FyZWFDaGFuZ2VDYWxsQmFjayA9IGNkXHJcbiAgfVxyXG5cclxuICBub2RlRWRpdChjYiA9ICgpID0+IHsgfSkge1xyXG4gICAgdGhpcy5wb3NpdGlvbkVkaXRpbmcgPSBmYWxzZVxyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIGlmIChZSi5NZWFzdXJlLkdldE1lYXN1cmVTdGF0dXMoKSkge1xyXG4gICAgICAgIGNiKCfkuIrkuIDmrKHmtYvph4/mnKrnu5PmnZ8nKVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIFlKLk1lYXN1cmUuU2V0TWVhc3VyZVN0YXR1cyh0cnVlKVxyXG4gICAgICAgIHRoaXMucGlja2luZyA9IGZhbHNlXHJcbiAgICAgICAgdGhpcy50aXAgPSBuZXcgTW91c2VUaXAoJ+ivt+mAieaLqeS4gOS4qumhtueCue+8jOWPs+mUruWPlua2iCcsIHRoaXMuc2RrKVxyXG4gICAgICAgIHRoaXMuZXZlbnQgPSBuZXcgTW91c2VFdmVudCh0aGlzLnNkaylcclxuICAgICAgICB0aGlzLm5vZGVQb2ludHMgPSBbXVxyXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXNcclxuICAgICAgICBsZXQgc2VsZWN0UG9pbnRcclxuICAgICAgICBsZXQgb3JpZ2luYWxQb3NpdGlvblxyXG4gICAgICAgIGxldCBuZXdwb3NpdGlvbnMgPSBbXVxyXG4gICAgICAgIGxldCBmcm9tRGVncmVlc0FycmF5ID0gW11cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMub3B0aW9ucy5wb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGZyb21EZWdyZWVzQXJyYXkucHVzaChcclxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sbmcsXHJcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubGF0XHJcbiAgICAgICAgICApXHJcbiAgICAgICAgfVxyXG4gICAgICAgIG5ld3Bvc2l0aW9ucyA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzQXJyYXkoZnJvbURlZ3JlZXNBcnJheSlcclxuXHJcbiAgICAgICAgbGV0IGFkZGVkID0gZmFsc2VcclxuICAgICAgICBsZXQgbGVmdEV2ZW50ID0gYXN5bmMgKG1vdmVtZW50LCBjYXJ0ZXNpYW4pID0+IHtcclxuICAgICAgICAgIGlmIChzZWxlY3RQb2ludCkge1xyXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zW3NlbGVjdFBvaW50LmluZGV4XSA9IHRoaXMuY2FydGVzaWFuM1Rvd2dzODQoXHJcbiAgICAgICAgICAgICAgY2FydGVzaWFuLFxyXG4gICAgICAgICAgICAgIHRoaXMuc2RrLnZpZXdlclxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICAgIG9yaWdpbmFsUG9zaXRpb24gPSB0aGlzLm9wdGlvbnMucG9zaXRpb25zW3NlbGVjdFBvaW50LmluZGV4XVxyXG4gICAgICAgICAgICBhZGRlZCA9IHRydWVcclxuICAgICAgICAgICAgbGV0IHBvdEhlaWdodCA9IGF3YWl0IHRoaXMuZ2V0Q2xhbXBUb0hlaWdodChcclxuICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zW3NlbGVjdFBvaW50LmluZGV4XVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICAgIGxldCBlbnRpdHkgPSB0aGlzLnNkay52aWV3ZXIuZW50aXRpZXMuYWRkKHtcclxuICAgICAgICAgICAgICBuYW1lOiAnbm9kZS1zZWNvbmRhcnktZWRpdC1wb2ludCcsXHJcbiAgICAgICAgICAgICAgcG9zaXRpb246IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzKFxyXG4gICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tzZWxlY3RQb2ludC5pbmRleF0ubG5nLFxyXG4gICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tzZWxlY3RQb2ludC5pbmRleF0ubGF0LFxyXG4gICAgICAgICAgICAgICAgcG90SGVpZ2h0XHJcbiAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICBiaWxsYm9hcmQ6IHtcclxuICAgICAgICAgICAgICAgIGltYWdlOiB0aGlzLmdldFNvdXJjZVJvb3RQYXRoKCkgKyAnL2ltZy9wb2ludC5wbmcnLFxyXG4gICAgICAgICAgICAgICAgd2lkdGg6IDE1LFxyXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiAxNSxcclxuICAgICAgICAgICAgICAgIGRpc2FibGVEZXB0aFRlc3REaXN0YW5jZTogTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLFxyXG4gICAgICAgICAgICAgICAgY29sb3I6IENlc2l1bS5Db2xvci5XSElURS53aXRoQWxwaGEoMC45OSlcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIHRoaXMubm9kZVBvaW50cy5zcGxpY2Uoc2VsZWN0UG9pbnQuaW5kZXgsIDAsIGVudGl0eSlcclxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9ucy5zcGxpY2UoXHJcbiAgICAgICAgICAgICAgc2VsZWN0UG9pbnQuaW5kZXgsXHJcbiAgICAgICAgICAgICAgMCxcclxuICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zW3NlbGVjdFBvaW50LmluZGV4XVxyXG4gICAgICAgICAgICApXHJcblxyXG4gICAgICAgICAgICBsZXQgcG9zaXRpb25zID0gdGhpcy5vcHRpb25zLnBvc2l0aW9uc1xyXG4gICAgICAgICAgICBsZXQgZnJvbURlZ3JlZXNBcnJheSA9IFtdXHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgZnJvbURlZ3JlZXNBcnJheS5wdXNoKHBvc2l0aW9uc1tpXS5sbmcsIHBvc2l0aW9uc1tpXS5sYXQpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5wb3NpdGlvbnMgPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlc0FycmF5KFxyXG4gICAgICAgICAgICAgIGZyb21EZWdyZWVzQXJyYXlcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICBuZXdwb3NpdGlvbnMgPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlc0FycmF5KGZyb21EZWdyZWVzQXJyYXkpXHJcblxyXG4gICAgICAgICAgICBsZXQgb2JqZWN0c1RvRXhjbHVkZSA9IFsuLi50aGlzLnNkay52aWV3ZXIuZW50aXRpZXMudmFsdWVzXVxyXG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnBvc2l0aW9ucy5sZW5ndGggPCAzKSB7XHJcbiAgICAgICAgICAgICAgdGhpc1xyXG4gICAgICAgICAgICAgICAgLmdldENsYW1wVG9IZWlnaHQoe1xyXG4gICAgICAgICAgICAgICAgICBsbmc6IHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0ubG5nLFxyXG4gICAgICAgICAgICAgICAgICBsYXQ6IHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0ubGF0XHJcbiAgICAgICAgICAgICAgICB9LCBvYmplY3RzVG9FeGNsdWRlKVxyXG4gICAgICAgICAgICAgICAgLnRoZW4oaGVpZ2h0ID0+IHtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5sYWJlbC5wb3NpdGlvbiA9IFtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zWzBdLmxuZyxcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zWzBdLmxhdCxcclxuICAgICAgICAgICAgICAgICAgICBoZWlnaHRcclxuICAgICAgICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBsZXQgcG9zaXRpb25zID0gW1tdXVxyXG4gICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5vcHRpb25zLnBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgcG9zaXRpb25zWzBdLnB1c2goW1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxuZyxcclxuICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sYXRcclxuICAgICAgICAgICAgICAgIF0pXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIHBvc2l0aW9uc1swXS5wdXNoKFtcclxuICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0ubG5nLFxyXG4gICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXS5sYXRcclxuICAgICAgICAgICAgICBdKVxyXG4gICAgICAgICAgICAgIGxldCBwb2x5Z29uID0gdHVyZi5wb2x5Z29uKHBvc2l0aW9ucylcclxuICAgICAgICAgICAgICBsZXQgY2VudHJvaWQgPSB0dXJmLmNlbnRyb2lkKHBvbHlnb24pXHJcbiAgICAgICAgICAgICAgdGhpc1xyXG4gICAgICAgICAgICAgICAgLmdldENsYW1wVG9IZWlnaHQoe1xyXG4gICAgICAgICAgICAgICAgICBsbmc6IGNlbnRyb2lkLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzBdLFxyXG4gICAgICAgICAgICAgICAgICBsYXQ6IGNlbnRyb2lkLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzFdXHJcbiAgICAgICAgICAgICAgICB9LCBvYmplY3RzVG9FeGNsdWRlKVxyXG4gICAgICAgICAgICAgICAgLnRoZW4oaGVpZ2h0ID0+IHtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5sYWJlbC5wb3NpdGlvbiA9IFtcclxuICAgICAgICAgICAgICAgICAgICBjZW50cm9pZC5nZW9tZXRyeS5jb29yZGluYXRlc1swXSxcclxuICAgICAgICAgICAgICAgICAgICBjZW50cm9pZC5nZW9tZXRyeS5jb29yZGluYXRlc1sxXSxcclxuICAgICAgICAgICAgICAgICAgICBoZWlnaHRcclxuICAgICAgICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5hcmVhQnlNZXRlciA9IHRoaXMuY29tcHV0ZUFyZWEodGhpcy5vcHRpb25zLnBvc2l0aW9ucylcclxuICAgICAgICAgICAgdGhpcy5hcmVhQ2hhbmdlQ2FsbEJhY2sgJiYgdGhpcy5hcmVhQ2hhbmdlQ2FsbEJhY2soKVxyXG4gICAgICAgICAgICBjYihudWxsLCB0aGlzLm9wdGlvbnMucG9zaXRpb25zLCB0aGlzLmFyZWFCeU1ldGVyKVxyXG4gICAgICAgICAgICAvLyBzd2l0Y2ggKHRoaXMub3B0aW9uc1snYXJlYS11bml0J10pIHtcclxuICAgICAgICAgICAgLy8gICBjYXNlICflubPmlrnnsbMnOlxyXG4gICAgICAgICAgICAvLyAgICAgdGhpcy5hcmVhID0gdGhpcy5vcHRpb25zLmFyZWFCeU1ldGVyXHJcbiAgICAgICAgICAgIC8vICAgICBicmVha1xyXG4gICAgICAgICAgICAvLyAgIGNhc2UgJ+W5s+aWueWNg+exsyc6XHJcbiAgICAgICAgICAgIC8vICAgICB0aGlzLmFyZWEgPSBOdW1iZXIoXHJcbiAgICAgICAgICAgIC8vICAgICAgICh0aGlzLm9wdGlvbnMuYXJlYUJ5TWV0ZXIgLyAxMDAwMDAwKS50b0ZpeGVkKDgpXHJcbiAgICAgICAgICAgIC8vICAgICApXHJcbiAgICAgICAgICAgIC8vICAgICBicmVha1xyXG4gICAgICAgICAgICAvLyAgIGNhc2UgJ+S6qSc6XHJcbiAgICAgICAgICAgIC8vICAgICB0aGlzLmFyZWEgPSBOdW1iZXIoXHJcbiAgICAgICAgICAgIC8vICAgICAgICh0aGlzLm9wdGlvbnMuYXJlYUJ5TWV0ZXIgLyA2NjYuNjY2NjY2NykudG9GaXhlZCg0KVxyXG4gICAgICAgICAgICAvLyAgICAgKVxyXG4gICAgICAgICAgICAvLyAgICAgYnJlYWtcclxuICAgICAgICAgICAgLy8gICBjYXNlICflhazpobcnOlxyXG4gICAgICAgICAgICAvLyAgICAgdGhpcy5hcmVhID0gTnVtYmVyKCh0aGlzLm9wdGlvbnMuYXJlYUJ5TWV0ZXIgLyAxMDAwMCkudG9GaXhlZCg2KSlcclxuICAgICAgICAgICAgLy8gICAgIGJyZWFrXHJcbiAgICAgICAgICAgIC8vICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgLy8gICAgIHRoaXMuYXJlYSA9IHRoaXMub3B0aW9ucy5hcmVhQnlNZXRlclxyXG4gICAgICAgICAgICAvLyB9XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB2YXIgcGljayA9IHRoaXMuc2RrLnZpZXdlci5zY2VuZS5waWNrKG1vdmVtZW50LnBvc2l0aW9uKVxyXG4gICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgcGljayAmJlxyXG4gICAgICAgICAgICAgIHBpY2suaWQgJiZcclxuICAgICAgICAgICAgICBwaWNrLmlkLm5hbWUgJiZcclxuICAgICAgICAgICAgICBwaWNrLmlkLm5hbWUgPT09ICdub2RlLXNlY29uZGFyeS1lZGl0LXBvaW50J1xyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICBzZWxlY3RQb2ludCA9IHBpY2suaWRcclxuICAgICAgICAgICAgICB0aGlzLm5vZGVQb2ludHMuc3BsaWNlKHBpY2suaWQuaW5kZXgsIDEpXHJcbiAgICAgICAgICAgICAgdGhpcy5zZGsudmlld2VyLmVudGl0aWVzLnJlbW92ZShwaWNrLmlkKVxyXG4gICAgICAgICAgICAgIHRoaXMudGlwLnNldF90ZXh0KCflt6bplK7lvIDlp4vvvIzlj7PplK7nu5PmnZ/vvIxDVFJMK+WPs+mUruaSpOmUgCcpXHJcbiAgICAgICAgICAgICAgb3JpZ2luYWxQb3NpdGlvbiA9IHRoaXMuY2FydGVzaWFuM1Rvd2dzODQoXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RQb2ludC5wb3NpdGlvbi5nZXRWYWx1ZSgpLFxyXG4gICAgICAgICAgICAgICAgdGhpcy5zZGsudmlld2VyXHJcbiAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCByaWdodEV2ZW50ID0gKG1vdmVtZW50LCBjYXJ0ZXNpYW4pID0+IHtcclxuICAgICAgICAgIGlmIChzZWxlY3RQb2ludCkge1xyXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zW3NlbGVjdFBvaW50LmluZGV4XSA9IG9yaWdpbmFsUG9zaXRpb25cclxuICAgICAgICAgICAgLy8gdGhpcy5vcHRpb25zLnBvc2l0aW9ucy5zcGxpY2Uoc2VsZWN0UG9pbnQuaW5kZXgsIDEpXHJcbiAgICAgICAgICAgIGlmIChhZGRlZCkge1xyXG4gICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnMuc3BsaWNlKHNlbGVjdFBvaW50LmluZGV4LCAxKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNiKG51bGwsIHRoaXMub3B0aW9ucy5wb3NpdGlvbnMpXHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgWUouTWVhc3VyZS5TZXRNZWFzdXJlU3RhdHVzKGZhbHNlKVxyXG4gICAgICAgICAgdGhpcy5ldmVudC5kZXN0cm95KClcclxuICAgICAgICAgIHRoaXMudGlwLmRlc3Ryb3koKVxyXG4gICAgICAgICAgdGhpcy5oZWlnaHRNb2RlID0gdGhpcy5oZWlnaHRNb2RlXHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgdGhpcy5lbnRpdHkucG9seWxpbmUuY2xhbXBUb0dyb3VuZCA9IHRydWVcclxuICAgICAgICB0aGlzLmVudGl0eS5wb2x5bGluZS5hcmNUeXBlID0gQ2VzaXVtLkFyY1R5cGUuR0VPREVTSUNcclxuICAgICAgICB0aGlzLmVudGl0eS5wb2x5Z29uLnBlclBvc2l0aW9uSGVpZ2h0ID0gZmFsc2VcclxuICAgICAgICB0aGlzLmVudGl0eS5wb2x5Z29uLmhpZXJhcmNoeSA9IG5ldyBDZXNpdW0uQ2FsbGJhY2tQcm9wZXJ0eShmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICByZXR1cm4gbmV3IENlc2l1bS5Qb2x5Z29uSGllcmFyY2h5KG5ld3Bvc2l0aW9ucylcclxuICAgICAgICB9LCBmYWxzZSlcclxuICAgICAgICB0aGlzLmVudGl0eS5wb2x5bGluZS5wb3NpdGlvbnMgPSBuZXcgQ2VzaXVtLkNhbGxiYWNrUHJvcGVydHkoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgaWYgKG5ld3Bvc2l0aW9ucy5sZW5ndGggPj0gMykge1xyXG4gICAgICAgICAgICByZXR1cm4gW1xyXG4gICAgICAgICAgICAgIC4uLm5ld3Bvc2l0aW9ucyxcclxuICAgICAgICAgICAgICBuZXdwb3NpdGlvbnNbMF0sXHJcbiAgICAgICAgICAgICAgbmV3cG9zaXRpb25zWzFdLFxyXG4gICAgICAgICAgICAgIG5ld3Bvc2l0aW9uc1syXVxyXG4gICAgICAgICAgICBdXHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3cG9zaXRpb25zXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSwgZmFsc2UpXHJcblxyXG4gICAgICAgIGxldCBvYmplY3RzVG9FeGNsdWRlID0gWy4uLnRoaXMuc2RrLnZpZXdlci5lbnRpdGllcy52YWx1ZXNdXHJcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5wb3NpdGlvbnMubGVuZ3RoIDwgMykge1xyXG4gICAgICAgICAgdGhpc1xyXG4gICAgICAgICAgICAuZ2V0Q2xhbXBUb0hlaWdodCh7XHJcbiAgICAgICAgICAgICAgbG5nOiB0aGlzLm9wdGlvbnMucG9zaXRpb25zWzBdLmxuZyxcclxuICAgICAgICAgICAgICBsYXQ6IHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0ubGF0XHJcbiAgICAgICAgICAgIH0sIG9iamVjdHNUb0V4Y2x1ZGUpXHJcbiAgICAgICAgICAgIC50aGVuKGhlaWdodCA9PiB7XHJcbiAgICAgICAgICAgICAgdGhpcy5sYWJlbC5wb3NpdGlvbiA9IFtcclxuICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0ubG5nLFxyXG4gICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXS5sYXQsXHJcbiAgICAgICAgICAgICAgICBoZWlnaHRcclxuICAgICAgICAgICAgICBdXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGxldCBwb3NpdGlvbnMgPSBbW11dXHJcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMub3B0aW9ucy5wb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgcG9zaXRpb25zWzBdLnB1c2goW1xyXG4gICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubG5nLFxyXG4gICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubGF0XHJcbiAgICAgICAgICAgIF0pXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBwb3NpdGlvbnNbMF0ucHVzaChbXHJcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0ubG5nLFxyXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zWzBdLmxhdFxyXG4gICAgICAgICAgXSlcclxuICAgICAgICAgIGxldCBwb2x5Z29uID0gdHVyZi5wb2x5Z29uKHBvc2l0aW9ucylcclxuICAgICAgICAgIGxldCBjZW50cm9pZCA9IHR1cmYuY2VudHJvaWQocG9seWdvbilcclxuICAgICAgICAgIHRoaXNcclxuICAgICAgICAgICAgLmdldENsYW1wVG9IZWlnaHQoe1xyXG4gICAgICAgICAgICAgIGxuZzogY2VudHJvaWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMF0sXHJcbiAgICAgICAgICAgICAgbGF0OiBjZW50cm9pZC5nZW9tZXRyeS5jb29yZGluYXRlc1sxXVxyXG4gICAgICAgICAgICB9LCBvYmplY3RzVG9FeGNsdWRlKVxyXG4gICAgICAgICAgICAudGhlbihoZWlnaHQgPT4ge1xyXG4gICAgICAgICAgICAgIHRoaXMubGFiZWwucG9zaXRpb24gPSBbXHJcbiAgICAgICAgICAgICAgICBjZW50cm9pZC5nZW9tZXRyeS5jb29yZGluYXRlc1swXSxcclxuICAgICAgICAgICAgICAgIGNlbnRyb2lkLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzFdLFxyXG4gICAgICAgICAgICAgICAgaGVpZ2h0XHJcbiAgICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmV2ZW50Lm1vdXNlX2xlZnQobGVmdEV2ZW50KVxyXG5cclxuICAgICAgICAgIHRoaXMuZXZlbnQubW91c2VfcmlnaHQocmlnaHRFdmVudClcclxuXHJcbiAgICAgICAgICB0aGlzLmV2ZW50Lm1vdXNlX21vdmUoKG1vdmVtZW50LCBjYXJ0ZXNpYW4pID0+IHtcclxuICAgICAgICAgICAgaWYgKHNlbGVjdFBvaW50KSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tzZWxlY3RQb2ludC5pbmRleF0gPSB0aGlzLmNhcnRlc2lhbjNUb3dnczg0KFxyXG4gICAgICAgICAgICAgICAgY2FydGVzaWFuLFxyXG4gICAgICAgICAgICAgICAgdGhpcy5zZGsudmlld2VyXHJcbiAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgIGxldCBwb3NpdGlvbnMgPSB0aGlzLm9wdGlvbnMucG9zaXRpb25zXHJcbiAgICAgICAgICAgICAgbGV0IGZyb21EZWdyZWVzQXJyYXkgPSBbXVxyXG5cclxuICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgZnJvbURlZ3JlZXNBcnJheS5wdXNoKHBvc2l0aW9uc1tpXS5sbmcsIHBvc2l0aW9uc1tpXS5sYXQpXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIHRoaXMucG9zaXRpb25zID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXNBcnJheShcclxuICAgICAgICAgICAgICAgIGZyb21EZWdyZWVzQXJyYXlcclxuICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgbmV3cG9zaXRpb25zID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXNBcnJheShmcm9tRGVncmVlc0FycmF5KVxyXG4gICAgICAgICAgICAgIGxldCBvYmplY3RzVG9FeGNsdWRlID0gWy4uLnRoaXMuc2RrLnZpZXdlci5lbnRpdGllcy52YWx1ZXNdXHJcbiAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5wb3NpdGlvbnMubGVuZ3RoIDwgMykge1xyXG4gICAgICAgICAgICAgICAgdGhpc1xyXG4gICAgICAgICAgICAgICAgICAuZ2V0Q2xhbXBUb0hlaWdodCh7XHJcbiAgICAgICAgICAgICAgICAgICAgbG5nOiB0aGlzLm9wdGlvbnMucG9zaXRpb25zWzBdLmxuZyxcclxuICAgICAgICAgICAgICAgICAgICBsYXQ6IHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0ubGF0XHJcbiAgICAgICAgICAgICAgICAgIH0sIG9iamVjdHNUb0V4Y2x1ZGUpXHJcbiAgICAgICAgICAgICAgICAgIC50aGVuKGhlaWdodCA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sYWJlbC5wb3NpdGlvbiA9IFtcclxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0ubG5nLFxyXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXS5sYXQsXHJcbiAgICAgICAgICAgICAgICAgICAgICBoZWlnaHRcclxuICAgICAgICAgICAgICAgICAgICBdXHJcbiAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGxldCBwb3NpdGlvbnMgPSBbW11dXHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMub3B0aW9ucy5wb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgcG9zaXRpb25zWzBdLnB1c2goW1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubG5nLFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubGF0XHJcbiAgICAgICAgICAgICAgICAgIF0pXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBwb3NpdGlvbnNbMF0ucHVzaChbXHJcbiAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0ubG5nLFxyXG4gICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zWzBdLmxhdFxyXG4gICAgICAgICAgICAgICAgXSlcclxuICAgICAgICAgICAgICAgIGxldCBwb2x5Z29uID0gdHVyZi5wb2x5Z29uKHBvc2l0aW9ucylcclxuICAgICAgICAgICAgICAgIGxldCBjZW50cm9pZCA9IHR1cmYuY2VudHJvaWQocG9seWdvbilcclxuICAgICAgICAgICAgICAgIHRoaXNcclxuICAgICAgICAgICAgICAgICAgLmdldENsYW1wVG9IZWlnaHQoe1xyXG4gICAgICAgICAgICAgICAgICAgIGxuZzogY2VudHJvaWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMF0sXHJcbiAgICAgICAgICAgICAgICAgICAgbGF0OiBjZW50cm9pZC5nZW9tZXRyeS5jb29yZGluYXRlc1sxXVxyXG4gICAgICAgICAgICAgICAgICB9LCBvYmplY3RzVG9FeGNsdWRlKVxyXG4gICAgICAgICAgICAgICAgICAudGhlbihoZWlnaHQgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGFiZWwucG9zaXRpb24gPSBbXHJcbiAgICAgICAgICAgICAgICAgICAgICBjZW50cm9pZC5nZW9tZXRyeS5jb29yZGluYXRlc1swXSxcclxuICAgICAgICAgICAgICAgICAgICAgIGNlbnRyb2lkLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzFdLFxyXG4gICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0XHJcbiAgICAgICAgICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLnRpcC5zZXRQb3NpdGlvbihcclxuICAgICAgICAgICAgICBjYXJ0ZXNpYW4sXHJcbiAgICAgICAgICAgICAgbW92ZW1lbnQuZW5kUG9zaXRpb24ueCxcclxuICAgICAgICAgICAgICBtb3ZlbWVudC5lbmRQb3NpdGlvbi55XHJcbiAgICAgICAgICAgIClcclxuICAgICAgICAgIH0pXHJcblxyXG4gICAgICAgICAgdGhpcy5ldmVudC5tb3VzZV9yaWdodF9rZXlib2FyZF9jdHJsKChtb3ZlbWVudCwgY2FydGVzaWFuKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChzZWxlY3RQb2ludCkge1xyXG4gICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnMucG9wKClcclxuICAgICAgICAgICAgICB0aGlzLnNkay52aWV3ZXIuZW50aXRpZXMucmVtb3ZlKFxyXG4gICAgICAgICAgICAgICAgdGhpcy5ub2RlUG9pbnRzW3RoaXMubm9kZVBvaW50cy5sZW5ndGggLSAxXVxyXG4gICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICBpZiAoc2VsZWN0UG9pbnQuaW5kZXggPT09IHRoaXMub3B0aW9ucy5wb3NpdGlvbnMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5ub2RlUG9pbnRzW3NlbGVjdFBvaW50LmluZGV4IC0gMV0pIHtcclxuICAgICAgICAgICAgICAgICAgc2VsZWN0UG9pbnQgPSB0aGlzLm5vZGVQb2ludHNbc2VsZWN0UG9pbnQuaW5kZXggLSAxXVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgc2VsZWN0UG9pbnQuaW5kZXggPSAwXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIHRoaXMubm9kZVBvaW50cy5wb3AoKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KVxyXG5cclxuICAgICAgICAgIHRoaXMuZXZlbnQuZ2VzdHVyZV9waW5ja19zdGFydCgobW92ZW1lbnQsIGNhcnRlc2lhbikgPT4ge1xyXG4gICAgICAgICAgICBsZXQgc3RhcnRUaW1lID0gbmV3IERhdGUoKVxyXG4gICAgICAgICAgICBsZXQgcG9zID0ge1xyXG4gICAgICAgICAgICAgIHBvc2l0aW9uOiB7XHJcbiAgICAgICAgICAgICAgICB4OiAobW92ZW1lbnQucG9zaXRpb24xLnggKyBtb3ZlbWVudC5wb3NpdGlvbjIueCkgLyAyLFxyXG4gICAgICAgICAgICAgICAgeTogKG1vdmVtZW50LnBvc2l0aW9uMS55ICsgbW92ZW1lbnQucG9zaXRpb24yLnkpIC8gMlxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmV2ZW50Lmdlc3R1cmVfcGluY2tfZW5kKCgpID0+IHtcclxuICAgICAgICAgICAgICBsZXQgZW5kVGltZSA9IG5ldyBEYXRlKClcclxuICAgICAgICAgICAgICBpZiAoZW5kVGltZSAtIHN0YXJ0VGltZSA+PSA1MDApIHtcclxuICAgICAgICAgICAgICAgIC8vIOmVv+aMieWPlua2iFxyXG4gICAgICAgICAgICAgICAgcmlnaHRFdmVudChwb3MsIGNhcnRlc2lhbilcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgbGVmdEV2ZW50KHBvcywgY2FydGVzaWFuKVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgIH0pXHJcblxyXG4gICAgICAgICAgY3JlYXRlTm9kZVBvaW50cygpXHJcbiAgICAgICAgfSwgMjAwKTtcclxuXHJcbiAgICAgICAgYXN5bmMgZnVuY3Rpb24gY3JlYXRlTm9kZVBvaW50cygpIHtcclxuICAgICAgICAgIC8vIHNkay52aWV3ZXIuc2NlbmUucHJpbWl0aXZlc1xyXG4gICAgICAgICAgbGV0IG9iamVjdHNUb0V4Y2x1ZGUgPSBbLi4uX3RoaXMuc2RrLnZpZXdlci5lbnRpdGllcy52YWx1ZXNdXHJcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IF90aGlzLm9wdGlvbnMucG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGxldCBoZWlnaHQgPSBhd2FpdCBfdGhpcy5nZXRDbGFtcFRvSGVpZ2h0KF90aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLCBvYmplY3RzVG9FeGNsdWRlKVxyXG4gICAgICAgICAgICBsZXQgZW50aXR5ID0gX3RoaXMuc2RrLnZpZXdlci5lbnRpdGllcy5hZGQoe1xyXG4gICAgICAgICAgICAgIG5hbWU6ICdub2RlLXNlY29uZGFyeS1lZGl0LXBvaW50JyxcclxuICAgICAgICAgICAgICBpbmRleDogaSxcclxuICAgICAgICAgICAgICBwb3NpdGlvbjogQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXMoXHJcbiAgICAgICAgICAgICAgICBfdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sbmcsXHJcbiAgICAgICAgICAgICAgICBfdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sYXQsXHJcbiAgICAgICAgICAgICAgICBoZWlnaHRcclxuICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgIGJpbGxib2FyZDoge1xyXG4gICAgICAgICAgICAgICAgaW1hZ2U6IF90aGlzLmdldFNvdXJjZVJvb3RQYXRoKCkgKyAnL2ltZy9wb2ludC5wbmcnLFxyXG4gICAgICAgICAgICAgICAgd2lkdGg6IDE1LFxyXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiAxNSxcclxuICAgICAgICAgICAgICAgIGRpc2FibGVEZXB0aFRlc3REaXN0YW5jZTogTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLFxyXG4gICAgICAgICAgICAgICAgY29sb3I6IENlc2l1bS5Db2xvci5XSElURS53aXRoQWxwaGEoMC45OSlcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIF90aGlzLm5vZGVQb2ludHMucHVzaChlbnRpdHkpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9LCA1MCk7XHJcbiAgfVxyXG5cclxuICBjbG9zZU5vZGVFZGl0KCkge1xyXG4gICAgaWYgKCF0aGlzLnNkayB8fCAhdGhpcy5zZGsudmlld2VyKSB7XHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG4gICAgWUouTWVhc3VyZS5TZXRNZWFzdXJlU3RhdHVzKGZhbHNlKVxyXG4gICAgdGhpcy5ldmVudCAmJiB0aGlzLmV2ZW50LmRlc3Ryb3koKVxyXG4gICAgdGhpcy50aXAgJiYgdGhpcy50aXAuZGVzdHJveSgpXHJcbiAgICB0aGlzLnRpcCA9IG51bGxcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubm9kZVBvaW50cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICB0aGlzLnNkay52aWV3ZXIuZW50aXRpZXMucmVtb3ZlKHRoaXMubm9kZVBvaW50c1tpXSlcclxuICAgIH1cclxuICAgIHRoaXMubm9kZVBvaW50cyA9IFtdXHJcbiAgICB0aGlzLnBpY2tpbmcgPSB0cnVlXHJcbiAgfVxyXG5cclxuICBzZXRQb3NpdGlvbih2KSB7XHJcbiAgICBsZXQgY2FydGVzaWFuID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXMoXHJcbiAgICAgIHYucG9zaXRpb24ubG5nLFxyXG4gICAgICB2LnBvc2l0aW9uLmxhdCxcclxuICAgICAgdi5wb3NpdGlvbi5hbHRcclxuICAgIClcclxuICAgIGxldCBwb3NpdGlvbnMgPSBbLi4udGhpcy5wb3NpdGlvbnNdXHJcbiAgICBsZXQgYXJyYXkgPSBbXVxyXG4gICAgbGV0IGRpc3Bhcml0eSA9IFtdXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBsZXQgcG9zaXRpb24gPSB0aGlzLmNhcnRlc2lhbjNUb3dnczg0KHBvc2l0aW9uc1tpXSwgdGhpcy5zZGsudmlld2VyKVxyXG4gICAgICBhcnJheS5wdXNoKFtwb3NpdGlvbi5sbmcsIHBvc2l0aW9uLmxhdF0pXHJcbiAgICB9XHJcbiAgICBsZXQgZmlyc3Rwb3NpdGlvbiA9IHRoaXMuY2FydGVzaWFuM1Rvd2dzODQocG9zaXRpb25zWzBdLCB0aGlzLnNkay52aWV3ZXIpXHJcbiAgICBhcnJheS5wdXNoKFtmaXJzdHBvc2l0aW9uLmxuZywgZmlyc3Rwb3NpdGlvbi5sYXRdKVxyXG4gICAgdmFyIHBvbHlnb24gPSB0dXJmLnBvbHlnb24oW2FycmF5XSlcclxuICAgIHZhciBjZW50cm9pZCA9IHR1cmYuY2VudHJvaWQocG9seWdvbilcclxuICAgIGxldCBjZW50ZXIgPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlcyguLi5jZW50cm9pZC5nZW9tZXRyeS5jb29yZGluYXRlcylcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGRpc3Bhcml0eS5wdXNoKHtcclxuICAgICAgICB4OiBjZW50ZXIueCAtIHBvc2l0aW9uc1tpXS54LFxyXG4gICAgICAgIHk6IGNlbnRlci55IC0gcG9zaXRpb25zW2ldLnksXHJcbiAgICAgICAgejogY2VudGVyLnogLSBwb3NpdGlvbnNbaV0uelxyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gICAgbGV0IG5ld3Bvc2l0aW9ucyA9IFtdXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRpc3Bhcml0eS5sZW5ndGg7IGkrKykge1xyXG4gICAgICBuZXdwb3NpdGlvbnMucHVzaCh7XHJcbiAgICAgICAgeDogY2FydGVzaWFuLnggLSBkaXNwYXJpdHlbaV0ueCxcclxuICAgICAgICB5OiBjYXJ0ZXNpYW4ueSAtIGRpc3Bhcml0eVtpXS55LFxyXG4gICAgICAgIHo6IGNhcnRlc2lhbi56IC0gZGlzcGFyaXR5W2ldLnpcclxuICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgICBsZXQgZ3JvdW5kID0gZmFsc2VcclxuICAgIGxldCBoZWlnaHQgPSAwXHJcbiAgICBzd2l0Y2ggKHRoaXMub3B0aW9ucy5oZWlnaHRNb2RlKSB7XHJcbiAgICAgIGNhc2UgJzAnOlxyXG4gICAgICBjYXNlIDA6XHJcbiAgICAgICAgZ3JvdW5kID0gZmFsc2VcclxuICAgICAgICBicmVha1xyXG4gICAgICBjYXNlICcxJzpcclxuICAgICAgY2FzZSAxOlxyXG4gICAgICAgIGhlaWdodCA9IHRoaXMuc2RrLnZpZXdlci5zY2VuZS5nbG9iZS5nZXRIZWlnaHQoQ2VzaXVtLkNhcnRvZ3JhcGhpYy5mcm9tRGVncmVlcyhjZW50cm9pZC5nZW9tZXRyeS5jb29yZGluYXRlc1swXSwgY2VudHJvaWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMV0pKVxyXG4gICAgICAgIGdyb3VuZCA9IGZhbHNlXHJcbiAgICAgICAgYnJlYWtcclxuICAgICAgY2FzZSAnMic6XHJcbiAgICAgIGNhc2UgMjpcclxuICAgICAgICBncm91bmQgPSB0cnVlXHJcbiAgICAgICAgYnJlYWtcclxuICAgIH1cclxuICAgIGlmICghZ3JvdW5kKSB7XHJcbiAgICAgIHRoaXMubGFiZWwucG9zaXRpb24gPSBbdi5wb3NpdGlvbi5sbmcsIHYucG9zaXRpb24ubGF0LCB2LnBvc2l0aW9uLmFsdCArIGhlaWdodF1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGxldCBvYmplY3RzVG9FeGNsdWRlID0gWy4uLnRoaXMuc2RrLnZpZXdlci5lbnRpdGllcy52YWx1ZXNdXHJcbiAgICAgIHRoaXMuZ2V0Q2xhbXBUb0hlaWdodCh7IGxuZzogdi5wb3NpdGlvbi5sbmcsIGxhdDogdi5wb3NpdGlvbi5sYXQgfSwgb2JqZWN0c1RvRXhjbHVkZSkudGhlbihcclxuICAgICAgICBoZWlnaHQgPT4ge1xyXG4gICAgICAgICAgdGhpcy5sYWJlbC5wb3NpdGlvbiA9IFt2LnBvc2l0aW9uLmxuZywgdi5wb3NpdGlvbi5sYXQsIGhlaWdodF1cclxuICAgICAgICB9XHJcbiAgICAgIClcclxuICAgIH1cclxuICAgIHRoaXMuZW50aXR5LnBvbHlnb24uaGllcmFyY2h5ID0gbmV3IENlc2l1bS5DYWxsYmFja1Byb3BlcnR5KGZ1bmN0aW9uICgpIHtcclxuICAgICAgaWYgKG5ld3Bvc2l0aW9ucy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBDZXNpdW0uUG9seWdvbkhpZXJhcmNoeShuZXdwb3NpdGlvbnMpXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBDZXNpdW0uUG9seWdvbkhpZXJhcmNoeShwb3NpdGlvbnMpXHJcbiAgICAgIH1cclxuICAgIH0sIGZhbHNlKVxyXG4gICAgdGhpcy5lbnRpdHkucG9seWxpbmUucG9zaXRpb25zID0gbmV3IENlc2l1bS5DYWxsYmFja1Byb3BlcnR5KGZ1bmN0aW9uICgpIHtcclxuICAgICAgaWYgKG5ld3Bvc2l0aW9ucy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgcmV0dXJuIFsuLi5uZXdwb3NpdGlvbnMsIG5ld3Bvc2l0aW9uc1swXSwgbmV3cG9zaXRpb25zWzFdXVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiBbLi4ucG9zaXRpb25zLCBwb3NpdGlvbnNbMF0sIHBvc2l0aW9uc1sxXV1cclxuICAgICAgfVxyXG4gICAgfSwgZmFsc2UpXHJcbiAgfVxyXG5cclxuICAvLyDmm7TmlrDlnZDmoIdcclxuICByZW5ld1Bvc2l0aW9ucygpIHtcclxuICAgIGlmICh0aGlzLl9lcnJvcikge1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuICAgIGxldCBncm91bmQgPSBmYWxzZVxyXG5cclxuICAgIGxldCBhcnJheSA9IFtdXHJcbiAgICBsZXQgcG9zaXRpb25zID0gdGhpcy5vcHRpb25zLnBvc2l0aW9uc1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgYXJyYXkucHVzaChbcG9zaXRpb25zW2ldLmxuZywgcG9zaXRpb25zW2ldLmxhdF0pXHJcbiAgICB9XHJcbiAgICBhcnJheS5wdXNoKFtwb3NpdGlvbnNbMF0ubG5nLCBwb3NpdGlvbnNbMF0ubGF0XSlcclxuICAgIGxldCBoZWlnaHQgPSAwXHJcbiAgICBsZXQgcG9seWdvbiA9IHR1cmYucG9seWdvbihbYXJyYXldKVxyXG4gICAgbGV0IGNlbnRyb2lkID0gdHVyZi5jZW50cm9pZChwb2x5Z29uKVxyXG4gICAgc3dpdGNoICh0aGlzLm9wdGlvbnMuaGVpZ2h0TW9kZSkge1xyXG4gICAgICBjYXNlICcwJzpcclxuICAgICAgY2FzZSAwOlxyXG4gICAgICAgIGdyb3VuZCA9IGZhbHNlXHJcbiAgICAgICAgYnJlYWtcclxuICAgICAgY2FzZSAnMSc6XHJcbiAgICAgIGNhc2UgMTpcclxuICAgICAgICBoZWlnaHQgPSB0aGlzLnNkay52aWV3ZXIuc2NlbmUuZ2xvYmUuZ2V0SGVpZ2h0KENlc2l1bS5DYXJ0b2dyYXBoaWMuZnJvbURlZ3JlZXMoY2VudHJvaWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMF0sIGNlbnRyb2lkLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzFdKSkgfHwgMFxyXG4gICAgICAgIGdyb3VuZCA9IGZhbHNlXHJcbiAgICAgICAgYnJlYWtcclxuICAgICAgY2FzZSAnMic6XHJcbiAgICAgIGNhc2UgMjpcclxuICAgICAgICBncm91bmQgPSB0cnVlXHJcbiAgICAgICAgYnJlYWtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgZnJvbURlZ3JlZXNBcnJheSA9IFtdXHJcbiAgICBpZiAoIWdyb3VuZCAmJiB0aGlzLm5vZGVQb2ludHMubGVuZ3RoID09IDApIHtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBmcm9tRGVncmVlc0FycmF5LnB1c2goXHJcbiAgICAgICAgICBwb3NpdGlvbnNbaV0ubG5nLFxyXG4gICAgICAgICAgcG9zaXRpb25zW2ldLmxhdCxcclxuICAgICAgICAgIHRoaXMuaGVpZ2h0ICsgaGVpZ2h0XHJcbiAgICAgICAgKVxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMucG9zaXRpb25zID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXNBcnJheUhlaWdodHMoXHJcbiAgICAgICAgZnJvbURlZ3JlZXNBcnJheVxyXG4gICAgICApXHJcblxyXG4gICAgICB0aGlzLmxhYmVsICYmICh0aGlzLmxhYmVsLnBvc2l0aW9uID0gW1xyXG4gICAgICAgIGNlbnRyb2lkLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzBdLFxyXG4gICAgICAgIGNlbnRyb2lkLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzFdLFxyXG4gICAgICAgIHRoaXMuaGVpZ2h0ICsgaGVpZ2h0XHJcbiAgICAgIF0pXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGZyb21EZWdyZWVzQXJyYXkucHVzaChwb3NpdGlvbnNbaV0ubG5nLCBwb3NpdGlvbnNbaV0ubGF0KVxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMucG9zaXRpb25zID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXNBcnJheShmcm9tRGVncmVlc0FycmF5KVxyXG5cclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnNkay52aWV3ZXIpIHtcclxuICAgICAgICAgIHJldHVyblxyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgb2JqZWN0c1RvRXhjbHVkZSA9IFsuLi50aGlzLnNkay52aWV3ZXIuZW50aXRpZXMudmFsdWVzXVxyXG4gICAgICAgIHRoaXMuZ2V0Q2xhbXBUb0hlaWdodCh7XHJcbiAgICAgICAgICBsbmc6IGNlbnRyb2lkLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzBdLFxyXG4gICAgICAgICAgbGF0OiBjZW50cm9pZC5nZW9tZXRyeS5jb29yZGluYXRlc1sxXVxyXG4gICAgICAgIH0sIG9iamVjdHNUb0V4Y2x1ZGUpLnRoZW4oaGVpZ2h0ID0+IHtcclxuICAgICAgICAgIHRoaXMubGFiZWwgJiYgKHRoaXMubGFiZWwucG9zaXRpb24gPSBbXHJcbiAgICAgICAgICAgIGNlbnRyb2lkLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzBdLFxyXG4gICAgICAgICAgICBjZW50cm9pZC5nZW9tZXRyeS5jb29yZGluYXRlc1sxXSxcclxuICAgICAgICAgICAgaGVpZ2h0XHJcbiAgICAgICAgICBdKVxyXG4gICAgICAgIH0pXHJcbiAgICAgIH0sIDEwMClcclxuICAgIH1cclxuXHJcbiAgICAvLyDorqHnrpfmipXlvbHpnaLnp69cclxuICAgIHRoaXMuYXJlYUJ5TWV0ZXIgPSB0aGlzLmNvbXB1dGVBcmVhKHBvc2l0aW9ucylcclxuICAgIHRoaXMuYXJlYUNoYW5nZUNhbGxCYWNrICYmIHRoaXMuYXJlYUNoYW5nZUNhbGxCYWNrKClcclxuICAgIHJldHVybiBmcm9tRGVncmVlc0FycmF5XHJcbiAgfVxyXG5cclxuICBhc3luYyBzZXRESVYob3B0aW9ucyA9IHsgZG9taWQ6ICcnLCB4OiAxMCwgeTogMTAgfSkge1xyXG4gICAgb3B0aW9ucy54ID0gb3B0aW9ucy54IHx8IG9wdGlvbnMueCA9PT0gMCA/IG9wdGlvbnMueCA6IDEwXHJcbiAgICBvcHRpb25zLnkgPSBvcHRpb25zLnkgfHwgb3B0aW9ucy55ID09PSAwID8gb3B0aW9ucy55IDogMTBcclxuXHJcbiAgICBsZXQgcG9zaXRpb25zID0gW1tdXVxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm9wdGlvbnMucG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIHBvc2l0aW9uc1swXS5wdXNoKFtcclxuICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxuZyxcclxuICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxhdFxyXG4gICAgICBdKVxyXG4gICAgfVxyXG4gICAgcG9zaXRpb25zWzBdLnB1c2goW1xyXG4gICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zWzBdLmxuZyxcclxuICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXS5sYXRcclxuICAgIF0pXHJcbiAgICBsZXQgcG9seWdvbiA9IHR1cmYucG9seWdvbihwb3NpdGlvbnMpXHJcbiAgICBsZXQgY2VudHJvaWQgPSB0dXJmLnBvaW50T25GZWF0dXJlKHBvbHlnb24pXHJcbiAgICBsZXQgaGVpZ2h0XHJcbiAgICBpZiAoIWdyb3VuZCkge1xyXG4gICAgICBoZWlnaHQgPSB0aGlzLm9wdGlvbnMuaGVpZ2h0XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBsZXQgb2JqZWN0c1RvRXhjbHVkZSA9IFsuLi50aGlzLnNkay52aWV3ZXIuZW50aXRpZXMudmFsdWVzXVxyXG4gICAgICBoZWlnaHQgPSBhd2FpdCB0aGlzLmdldENsYW1wVG9IZWlnaHQoe1xyXG4gICAgICAgIGxuZzogY2VudHJvaWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMF0sXHJcbiAgICAgICAgbGF0OiBjZW50cm9pZC5nZW9tZXRyeS5jb29yZGluYXRlc1sxXVxyXG4gICAgICB9LCBvYmplY3RzVG9FeGNsdWRlKVxyXG4gICAgfVxyXG5cclxuICAgIGxldCBzaXRlSW5mb0RvbSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKG9wdGlvbnMuZG9taWQpXHJcbiAgICBsZXQgc2l0ZUluZm9Qb3NpdGlvbiA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzKFxyXG4gICAgICBjZW50cm9pZC5nZW9tZXRyeS5jb29yZGluYXRlc1swXSxcclxuICAgICAgY2VudHJvaWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMV0sXHJcbiAgICAgIGhlaWdodFxyXG4gICAgKVxyXG5cclxuICAgIHRoaXMuc2RrLnZpZXdlci5zY2VuZS5wb3N0UmVuZGVyLmFkZEV2ZW50TGlzdGVuZXIocGVyY2VudGFnZSA9PiB7XHJcbiAgICAgIC8v6L2s5o2i5Yiw5bGP5bmV5Z2Q5qCHXHJcbiAgICAgIGlmIChcclxuICAgICAgICBzaXRlSW5mb0RvbS5zdHlsZS5kaXNwbGF5ID09PSAnYmxvY2snIHx8XHJcbiAgICAgICAgc2l0ZUluZm9Eb20uc3R5bGUuZGlzcGxheSA9PT0gJydcclxuICAgICAgKSB7XHJcbiAgICAgICAgbGV0IHdpbnBvcyA9IHRoaXMuc2RrLnZpZXdlci5zY2VuZS5jYXJ0ZXNpYW5Ub0NhbnZhc0Nvb3JkaW5hdGVzKFxyXG4gICAgICAgICAgc2l0ZUluZm9Qb3NpdGlvblxyXG4gICAgICAgIClcclxuICAgICAgICBpZiAod2lucG9zKSB7XHJcbiAgICAgICAgICBzaXRlSW5mb0RvbS5zdHlsZS5sZWZ0ID0gKHdpbnBvcy54ICsgb3B0aW9ucy54KS50b0ZpeGVkKDApICsgJ3B4J1xyXG4gICAgICAgICAgc2l0ZUluZm9Eb20uc3R5bGUudG9wID0gKHdpbnBvcy55ICsgb3B0aW9ucy55KS50b0ZpeGVkKDApICsgJ3B4J1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFBvbHlnb25PYmplY3RcclxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBSUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUtBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBR0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQWdJQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFpSkE7QUF5REE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFHQTtBQU1BO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFNQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBTUE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBSUE7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBN2lCQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQWdqQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUFBO0FBRUE7QUFVQTtBQUFBO0FBUEE7QUFBQTtBQUFBO0FBSUE7QUFBQTtBQUFBO0FBSUE7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBS0E7QUFBQTtBQVBBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBVUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBcEdBO0FBQUE7QUFBQTtBQUFBO0FBc0dBO0FBQ0E7QUFDQTtBQUZBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFaQTtBQUFBO0FBQUE7QUFBQTtBQWNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUxBO0FBQUE7QUFBQTtBQUFBO0FBNFFBO0FBQ0E7QUFBQTtBQXZRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUtBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUtBO0FBQ0E7QUFJQTtBQUVBO0FBQ0E7QUFLQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBT0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUE4VUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFsQkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBb0JBO0FBdkJBO0FBQUE7QUFBQTtBQTdVQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBSUE7QUFDQTtBQUFBO0FBQUE7QUFHQTtBQUZBO0FBR0E7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUtBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBOUhBO0FBQUE7QUFBQTtBQStIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFLQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUtBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUEwQkE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUFBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBSUE7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFJQTtBQUNBO0FBQUE7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBSEE7QUFBQTtBQU1BO0FBQ0E7QUFNQTtBQUNBO0FBQ0E7QUFJQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBbERBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBdnBEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUlBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUlBO0FBRUE7QUFFQTtBQUFBO0FBRUE7QUFhQTtBQUFBO0FBVkE7QUFBQTtBQUFBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBSUE7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBSEE7QUFBQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBOUVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQStwREEiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/Obj/Base/PolygonObject/index.js\n"); /***/ }), @@ -2435,7 +2435,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _bab /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/toConsumableArray */ \"./node_modules/@babel/runtime/helpers/toConsumableArray.js\");\n/* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ \"./node_modules/@babel/runtime/helpers/asyncToGenerator.js\");\n/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ \"./node_modules/@babel/runtime/helpers/defineProperty.js\");\n/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ \"./node_modules/@babel/runtime/helpers/classCallCheck.js\");\n/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ \"./node_modules/@babel/runtime/helpers/createClass.js\");\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ \"./node_modules/@babel/runtime/helpers/possibleConstructorReturn.js\");\n/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ \"./node_modules/@babel/runtime/helpers/getPrototypeOf.js\");\n/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ \"./node_modules/@babel/runtime/helpers/inherits.js\");\n/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @babel/runtime/regenerator */ \"./node_modules/@babel/runtime/regenerator/index.js\");\n/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8__);\n/* harmony import */ var _Element_Dialog__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../Element/Dialog */ \"./src/Obj/Element/Dialog/index.js\");\n/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./_element */ \"./src/Obj/Base/PolylineObject/_element.js\");\n/* harmony import */ var _index__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../index */ \"./src/Obj/Base/index.js\");\n/* harmony import */ var _Element_cy_html_tabs__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../../Element/cy_html_tabs */ \"./src/Obj/Element/cy_html_tabs.js\");\n/* harmony import */ var _Element_richText__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../../Element/richText */ \"./src/Obj/Element/richText.js\");\n/* harmony import */ var _eventBinding__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./eventBinding */ \"./src/Obj/Base/PolylineObject/eventBinding.js\");\n/* harmony import */ var _LabelObject__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../LabelObject */ \"./src/Obj/Base/LabelObject/index.js\");\n/* harmony import */ var _Event_index__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../../../Event/index */ \"./src/Event/index.js\");\n/* harmony import */ var _MouseTip__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../../../MouseTip */ \"./src/MouseTip/index.js\");\n/* harmony import */ var _Controller_index__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../../../Controller/index */ \"./src/Controller/index.js\");\n/* harmony import */ var _Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../../../Global/MultiViewportMode */ \"./src/Global/MultiViewportMode/index.js\");\n/* harmony import */ var _Element_datalist__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../../Element/datalist */ \"./src/Obj/Element/datalist.js\");\n/* harmony import */ var _Element_fontSelect__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../../Element/fontSelect */ \"./src/Obj/Element/fontSelect.js\");\n/* harmony import */ var _Global_SplitScreen__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ../../../Global/SplitScreen */ \"./src/Global/SplitScreen/index.js\");\n/* harmony import */ var _Global_global__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ../../../Global/global */ \"./src/Global/global.js\");\n\n\n\n\n\n\n\n\n\nfunction _createForOfIteratorHelper(r, e) { var t = \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && \"number\" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t.return || t.return(); } finally { if (u) throw o; } } }; }\nfunction _unsupportedIterableToArray(r, a) { if (r) { if (\"string\" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }\nfunction _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default()(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nfunction _callSuper(t, o, e) { return o = _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6___default()(o), _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_5___default()(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6___default()(t).constructor) : o.apply(t, e)); }\nfunction _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }\n/**\r\n * @description 线\r\n */\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nvar PolylineObject = /*#__PURE__*/function (_Base) {\n /**\r\n * @constructor\r\n * @param sdk\r\n * @description 折线\r\n * @param options {object} 线属性\r\n * @param options.name{string} 名称\r\n * @param options.width=3{number} 线宽\r\n * @param options.color=#ff0000 {string} 颜色\r\n * @param options.type=0 {number} 材质类型 0-实线 1-虚线 2-泛光...\r\n * @param options.heightMode=2{number} 高度模式(0:海拔高度;1:相对高度;2:依附模式)\r\n * @param options.noseToTail=false {boolean} 首尾相连\r\n * @param options.smooth=false {boolean} 线段圆滑\r\n * @param options.extend=false {boolean} 线缓冲\r\n * @param options.extendWidth=10 {number} 线缓冲宽度\r\n * @param options.extendColor=rgba(255,255,80,0.3) {number} 线缓冲颜色\r\n * @param options.show=true {boolean} 显隐\r\n * @param {Array.} options.positions 必填,经纬度和高度的列表,值交替 [{lon,lat,alt},...]\r\n * @param options.positions[].lng {number} 经度\r\n * @param options.positions[].lat {number} 纬度\r\n * @param options.positions[].alt {number} 高度\r\n * \r\n * \r\n * @param options.noseToTail=false {boolean} 是否首尾相连\r\n * \r\n * \r\n * \r\n * @param options.label {object} 标签对象\r\n * @param options.label.text {string} 标签文本\r\n * @param options.label.show {string} 标签显隐\r\n * @param options.label.position {string} 标签位置\r\n * @param options.label.position {object} 标签位置\r\n * @param options.label.position.lng {number} 经度\r\n * @param options.label.position.lat {number} 纬度\r\n * @param options.label.position.alt {number} 高度\r\n * @param options.label.fontSize=20 {number} 字体大小\r\n * @param options.label.fontFamily=0 {number} 字体项 0:黑体;1:思源黑体;2:庞门正道标题体;3:数黑体\r\n * @param options.label.color=#ffffff {string} 字体颜色\r\n * @param options.label.lineWidth=4 {number} 引线宽\r\n * @param options.label.lineColor=#00ffff80 {string} 引线颜色\r\n * @param options.label.pixelOffset=20 {number} 字体偏移(引线长度)\r\n * @param options.label.backgroundColor=['#00ffff80', '#00ffff80'] {array} 背景颜色\r\n * @param options.label.scaleByDistance {boolean} 距离缩放\r\n * @param options.label.near=2000 {number} 视野缩放最近距离\r\n * @param options.label.far=100000 {number} 视野缩放最远距离\r\n * @param options.attribute {object} 属性内容\r\n * @param options.attribute.link={} {string} 链接\r\n * @param options.attribute.link.content=[]] {array} 链接内容\r\n * @param options.attribute.link.content[].name {string} 链接名称\r\n * @param options.attribute.link.content[].url {string} 链接地址\r\n * @param options.richTextContent {string} 富文本内容\r\n * \r\n * \r\n * @param _Dialog {object} 弹框事件\r\n * @param _Dialog.confirmCallBack {function} 弹框确认时的回调\r\n * */\n function PolylineObject(sdk) {\n var _this2;\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var _Dialog = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3___default()(this, PolylineObject);\n _this2 = _callSuper(this, PolylineObject, [sdk, options]);\n _this2.options.name = options.name || '未命名对象';\n _this2.options.width = options.width || options.width === 0 ? options.width : 3;\n _this2.options.color = options.color || '#ff0000';\n _this2.options.type = options.type ? Number(options.type) : 0;\n _this2.options.noseToTail = options.noseToTail || false;\n _this2.options.smooth = options.smooth || false;\n _this2.options.extend = options.extend || false;\n _this2.options.rotate = options.rotate || options.rotate === false ? options.rotate : true;\n _this2.options.space = options.space || 1;\n _this2.options.speed = options.speed || 10;\n // this.options.dashSize = options.dashSize || 0.03\n _this2.options.wordsName = options.wordsName || 0;\n _this2.options.extendWidth = options.extendWidth || options.extendWidth === 0 ? options.extendWidth : 10;\n _this2.options.extendColor = options.extendColor || 'rgba(255,255,80,0.3)';\n _this2.options.show = options.show || options.show === false ? options.show : true;\n _this2.options.heightMode = options.heightMode || options.heightMode == 0 ? options.heightMode : 2;\n _this2._elms = [];\n options.label = options.label || {};\n _this2.options.label = {\n text: _this2.options.name,\n show: options.label.show || false,\n position: options.label.position,\n fontSize: options.label.fontSize || options.label.fontSize === 0 ? options.label.fontSize : 20,\n fontFamily: options.label.fontFamily ? options.label.fontFamily : 0,\n color: options.label.color || '#ffffff',\n lineWidth: options.label.lineWidth || options.label.lineWidth === 0 ? options.label.lineWidth : 4,\n pixelOffset: options.label.pixelOffset || options.label.pixelOffset === 0 ? options.label.pixelOffset : 20,\n backgroundColor: options.label.backgroundColor || ['#00ffff80', '#00ffff80'],\n lineColor: options.label.lineColor || '#00ffff80',\n scaleByDistance: options.label.scaleByDistance || false,\n near: options.label.near || options.label.near === 0 ? options.label.near : 2000,\n far: options.label.far || options.label.far === 0 ? options.label.far : 100000\n };\n _this2.options.attribute = options.attribute || {};\n _this2.options.attribute.link = _this2.options.attribute.link || {};\n _this2.options.attribute.link.content = _this2.options.attribute.link.content || [];\n // this.options.attribute.camera = this.options.attribute.camera || {}\n // this.options.attribute.camera.content =\n // this.options.attribute.camera.content || []\n // this.options.attribute.vr = this.options.attribute.vr || {}\n // this.options.attribute.vr.content =\n // this.options.attribute.vr.content || []\n // this.options.attribute.goods = this.options.attribute.goods || {}\n // this.options.attribute.goods.content =\n // this.options.attribute.goods.content || []\n\n delete _this2.options.attribute.camera;\n delete _this2.options.attribute.vr;\n delete _this2.options.attribute.goods;\n _this2.operate = {};\n _this2.nodePoints = [];\n _this2.unitNum = 0;\n _this2.inputSpeed = options.speed && Math.pow(options.speed, -1) * 100 || 10;\n _this2.Dialog = _Dialog;\n if (!_this2.options.positions || _this2.options.positions.length < 2) {\n _this2._error = '线段最少需要两个坐标!';\n console.warn(_this2._error);\n window.ELEMENT && window.ELEMENT.Message({\n message: _this2._error,\n type: 'warning',\n duration: 1500\n });\n } else {\n for (var i = 0; i < _this2.options.positions.length; i++) {\n _this2.options.positions[i].lng = Number(Number(_this2.options.positions[i].lng).toFixed(8));\n _this2.options.positions[i].lat = Number(Number(_this2.options.positions[i].lat).toFixed(8));\n _this2.options.positions[i].alt = Number(Number(_this2.options.positions[i].alt).toFixed(2));\n }\n _this2.sdk.addIncetance(_this2.options.id, _this2);\n PolylineObject.create(_this2);\n }\n return _this2;\n }\n _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_7___default()(PolylineObject, _Base);\n return _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4___default()(PolylineObject, [{\n key: \"color\",\n get: function get() {\n return this.options.color;\n },\n set: function set(v) {\n var _this3 = this;\n this.options.color = v || '#ff0000';\n var params = _objectSpread({}, this.options);\n params.speed = this.inputSpeed;\n // this.entity.polyline.material = this.getMaterial(this.options.color, this.options.type, this.entity, this.options)\n this.entity.polyline.material = this.getMaterial(this.options.color, this.options.type, this.entity, params);\n if (this._elms.color) {\n this._elms.color.forEach(function (item, i) {\n var colorPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: _this3.options.color,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(c) {\n _this3.color = c;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this3.color = 'rgba(255,0,0,1)';\n } //点击清空按钮事件回调\n });\n _this3._elms.color[i] = colorPicker;\n });\n }\n }\n }, {\n key: \"speed\",\n get: function get() {\n return this.options.speed;\n },\n set: function set(v) {\n this.options.speed = v;\n this.inputSpeed = v !== 0 ? Math.pow(v, -1) * 100 : 0;\n var params = _objectSpread({}, this.options);\n params.speed = this.inputSpeed;\n // this.options.speed = v !== 0 ? Math.pow(v, -1) * 100 : 0\n // this.entity.polyline.material = this.getMaterial(this.options.color, this.options.type, this.entity, this.options)\n this.entity.polyline.material = this.getMaterial(this.options.color, this.options.type, this.entity, params);\n }\n // get dashSize() {\n // return this.options.dashSize\n // }\n\n // set dashSize(v) {\n // this.options.dashSize = v\n // let params = { ...this.options }\n // params.speed = this.inputSpeed\n // // this.entity.polyline.material = this.getMaterial(this.options.color, this.options.type, this.entity, this.options)\n // this.entity.polyline.material = this.getMaterial(this.options.color, this.options.type, this.entity, params)\n // }\n }, {\n key: \"rotate\",\n get: function get() {\n return this.options.rotate;\n },\n set: function set(v) {\n this.options.rotate = v;\n this.closeNodeEdit();\n this._elms.rotate && this._elms.rotate.forEach(function (item) {\n item.checked = v;\n });\n this.options.rotate = v;\n var params = _objectSpread({}, this.options);\n params.speed = this.inputSpeed;\n // this.entity.polyline.material = this.getMaterial(this.options.color, this.options.type, this.entity, this.options)\n this.entity.polyline.material = this.getMaterial(this.options.color, this.options.type, this.entity, params);\n }\n }, {\n key: \"space\",\n get: function get() {\n return this.options.space;\n },\n set: function set(v) {\n this.options.space = v;\n var params = _objectSpread({}, this.options);\n params.speed = this.inputSpeed;\n // this.entity.polyline.material = this.getMaterial(this.options.color, this.options.type, this.entity, this.options)\n this.entity.polyline.material = this.getMaterial(this.options.color, this.options.type, this.entity, params);\n }\n }, {\n key: \"wordsName\",\n get: function get() {\n return this.options.wordsName;\n },\n set: function set(v) {\n var _this4 = this;\n this.options.wordsName = v;\n var _this = this;\n if (!this.noseToTail) {\n this.computeDistance(this.options.positions, 2, v).then(function (res) {\n // _this.options.lengthByMeter = res\n // if (res > 1000 || res == 1000) {\n // _this.length = (res / 1000).toFixed(5)\n // _this.lengthUnit = '千米'\n // } else {\n // _this.length = res\n // _this.lengthUnit = '米'\n // }\n _this.lengthByMeter = res;\n _this4.lengthChangeCallBack && _this4.lengthChangeCallBack();\n });\n } else {\n var fromDegreesArray = this.renewPositions(this.options.positions);\n }\n }\n\n // get fitLengthUnit() {\n // return this.options.fitLengthUnit\n // }\n // set fitLengthUnit(v) {\n // this.options.fitLengthUnit = v\n // this._elms.fitLengthUnit &&\n // this._elms.fitLengthUnit.forEach(item => {\n // item.value = v\n // })\n // if (this.fitLengthByMeter) {\n // switch (v) {\n // case '米':\n // this.fitLength = this.fitLengthByMeter\n // break\n // case '千米':\n // this.fitLength = Number(\n // (this.fitLengthByMeter / 1000).toFixed(5)\n // )\n // break\n // default:\n // this.fitLength = this.fitLengthByMeter\n // }\n // }\n // }\n }, {\n key: \"lineWidth\",\n get: function get() {\n return this.options.width;\n },\n set: function set(v) {\n var _this5 = this;\n this.options.width = v || v == 0 ? v : 3;\n this._elms.lineWidth && this._elms.lineWidth.forEach(function (item) {\n item.value = _this5.options.width;\n });\n if (this.entity && this.entity.polyline) {\n this.entity.polyline.width = this.entity.polyline.width + v - this.entity.polyline.oriWidth;\n this.entity.polyline.oriWidth = this.options.width;\n }\n // this.entity &&\n // this.entity.polyline &&\n // (this.entity.polyline.width = this.options.width) && (this.entity.polyline.oriWidth = this.options.width)\n }\n }, {\n key: \"lineType\",\n get: function get() {\n return this.options.type;\n },\n set: function set(v) {\n var _this6 = this;\n var lineTypeData = [{\n name: '实线',\n value: '实线',\n key: 0,\n icon: 'line'\n }, {\n name: '虚线',\n value: '虚线',\n key: 1,\n icon: 'dash-line'\n }, {\n name: '泛光',\n value: '泛光',\n key: 2,\n icon: 'light-line'\n }, {\n name: '尾迹光线',\n value: '尾迹光线',\n key: 3,\n icon: 'tail-line'\n }, {\n name: '多尾迹光线',\n value: '多尾迹光线',\n key: 4,\n icon: 'mult-tail-line'\n }, {\n name: '流动虚线1',\n value: '流动虚线1',\n key: 5,\n icon: 'flow-dash-line1'\n }, {\n name: '流动虚线2',\n value: '流动虚线2',\n key: 6,\n icon: 'flow-dash-line2'\n }, {\n name: '流动箭头1',\n value: '流动箭头1',\n key: 7,\n icon: 'pic-line1'\n }, {\n name: '流动箭头2',\n value: '流动箭头2',\n key: 8,\n icon: 'pic-line2'\n }, {\n name: '流动箭头3',\n value: '流动箭头3',\n key: 9,\n icon: 'pic-line3'\n }, {\n name: '流动箭头4',\n value: '流动箭头4',\n key: 10,\n icon: 'pic-line4'\n }, {\n name: '流动箭头5',\n value: '流动箭头5',\n key: 11,\n icon: 'pic-line5'\n }, {\n name: '流动箭头6',\n value: '流动箭头6',\n key: 12,\n icon: 'pic-line6'\n }];\n this.options.type = Number(v);\n var _loop = function _loop(i) {\n if (lineTypeData[i].key === Number(v)) {\n _this6._elms.lineType && _this6._elms.lineType.forEach(function (item) {\n item.value = lineTypeData[i].value;\n if (2 < item.value && item.value < 13) {\n //贴图参数\n document.getElementById('dashTextureDom') && (document.getElementById('dashTextureDom').style.display = 'flex');\n } else {\n document.getElementById('dashTextureDom') && (document.getElementById('dashTextureDom').style.display = 'none');\n }\n if (2 < item.value && item.value < 5) {\n //尾迹参数\n document.getElementsByClassName('lineSpace')[0] && (document.getElementsByClassName('lineSpace')[0].style.display = 'none');\n document.getElementsByClassName('lineSpace')[1] && (document.getElementsByClassName('lineSpace')[1].style.display = 'none');\n } else {\n document.getElementsByClassName('lineSpace')[0] && (document.getElementsByClassName('lineSpace')[0].style.display = 'flex');\n document.getElementsByClassName('lineSpace')[1] && (document.getElementsByClassName('lineSpace')[1].style.display = 'flex');\n }\n });\n return 1; // break\n }\n };\n for (var i = 0; i < lineTypeData.length; i++) {\n if (_loop(i)) break;\n }\n var params = _objectSpread({}, this.options);\n params.speed = this.inputSpeed;\n this.entity && this.entity.polyline && (this.entity.polyline.material = this.getMaterial(this.options.color, this.options.type, this.entity, params));\n }\n }, {\n key: \"noseToTail\",\n get: function get() {\n return this.options.noseToTail;\n },\n set: function set(v) {\n this.options.noseToTail = v;\n this.closeNodeEdit();\n this._elms.noseToTail && this._elms.noseToTail.forEach(function (item) {\n item.checked = v;\n });\n if (this.entity) {\n var fromDegreesArray = this.renewPositions(this.options.positions);\n this.entity.polyline.positions = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray);\n this.renewPolygon(fromDegreesArray);\n }\n // if (v) {\n // if (this.options.fitLengthByMeter > 1000 || this.options.fitLengthByMeter == 1000) {\n // let dom = document.getElementsByClassName('input-select-unit')[1]\n // dom && dom.querySelectorAll('dd')[1] && dom.querySelectorAll('dd')[1].click()\n // } else {\n // let dom = document.getElementsByClassName('input-select-unit')[1]\n // dom && dom.querySelectorAll('dd')[0] && dom.querySelectorAll('dd')[0].click()\n // }\n\n // } else {\n // if (this.options.lengthByMeter > 1000 || this.options.lengthByMeter == 1000) {\n // let dom = document.getElementsByClassName('input-select-unit')[1]\n // dom && dom.querySelectorAll('dd')[1] && dom.querySelectorAll('dd')[1].click()\n // } else {\n // let dom = document.getElementsByClassName('input-select-unit')[1]\n // dom && dom.querySelectorAll('dd')[0] && dom.querySelectorAll('dd')[0].click()\n // }\n // }\n }\n }, {\n key: \"smooth\",\n get: function get() {\n return this.options.smooth;\n },\n set: function set(v) {\n this.options.smooth = v;\n this.closeNodeEdit();\n this._elms.smooth && this._elms.smooth.forEach(function (item) {\n item.checked = v;\n });\n if (this.entity) {\n var fromDegreesArray = this.renewPositions(this.options.positions);\n this.entity.polyline.positions = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray);\n this.renewPolygon(fromDegreesArray);\n }\n }\n }, {\n key: \"heightMode\",\n get: function get() {\n return this.options.heightMode ? this.options.heightMode : 0;\n },\n set: function set(v) {\n var _this7 = this;\n this.positionEditing = false;\n this.options.heightMode = v || v == 0 ? v : 2;\n var heightModeName = '';\n this.closeNodeEdit();\n var ground = false;\n var disabled = false;\n var fromDegreesArray = this.renewPositions(this.options.positions);\n this.entity.polyline.positions = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray);\n this.renewPolygon(fromDegreesArray);\n switch (this.options.heightMode) {\n case '0':\n case 0:\n this.entity.polyline.clampToGround = ground;\n this.extend = false;\n heightModeName = '海拔高度';\n break;\n case '1':\n case 1:\n this.entity.polyline.clampToGround = ground;\n this.extend = false;\n heightModeName = '相对地表';\n break;\n case '2':\n case 2:\n ground = true;\n disabled = true;\n this.entity.polyline.clampToGround = ground;\n heightModeName = '依附模型';\n break;\n }\n setTimeout(function () {\n if (ground) {\n _this7.label.ground = ground;\n _this7._elms.heightMode && (_this7._elms.heightMode.value = '依附模型');\n _this7.label.position = [_this7.options.positions[0].lng, _this7.options.positions[0].lat];\n } else {\n _this7.label.ground = ground;\n _this7.label.position = [_this7.options.positions[0].lng, _this7.options.positions[0].lat, fromDegreesArray[2]];\n _this7.options.label.position = {\n lng: _this7.options.positions[0].lng,\n lat: _this7.options.positions[0].lat,\n alt: fromDegreesArray[2]\n };\n }\n }, 0);\n }\n }, {\n key: \"extend\",\n get: function get() {\n return this.options.extend;\n },\n set: function set(v) {\n this.options.extend = v;\n this.closeNodeEdit();\n if (v) {\n this.heightMode = 2;\n }\n this._elms.extend && this._elms.extend.forEach(function (item) {\n item.checked = v;\n });\n if (this.entity) {\n if (this.options.extend) {\n var fromDegreesArray = this.renewPositions(this.options.positions);\n this.renewPolygon(fromDegreesArray);\n } else {\n this.entity.polygon = undefined;\n }\n }\n }\n }, {\n key: \"extendWidth\",\n get: function get() {\n return this.options.extendWidth;\n },\n set: function set(v) {\n this.options.extendWidth = v;\n this.heightMode = this.heightMode;\n this._elms.extendWidth && this._elms.extendWidth.forEach(function (item) {\n item.value = v;\n });\n var fromDegreesArray = this.renewPositions(this.options.positions);\n this.renewPolygon(fromDegreesArray);\n }\n }, {\n key: \"extendColor\",\n get: function get() {\n return this.options.extendColor;\n },\n set: function set(v) {\n var _this8 = this;\n this.options.extendColor = v;\n if (this._elms.extendColor) {\n this._elms.extendColor.forEach(function (item, i) {\n var extendColorPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: _this8.extendColor,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this8.extendColor = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this8.extendColor = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n _this8._elms.extendColor[i] = extendColorPicker;\n });\n }\n this.entity && this.entity.polygon && (this.entity.polygon.material = Cesium.Color.fromCssColorString(this.options.extendColor));\n }\n }, {\n key: \"labelShow\",\n get: function get() {\n return this.options.label.show;\n },\n set: function set(v) {\n var _this9 = this;\n this.options.label.show = v;\n if (this.show && !this.showView || this.showView == 3) {\n this.label.show = v;\n setTimeout(function () {\n _this9.label.position = [_this9.options.positions[0].lng, _this9.options.positions[0].lat, _this9.options.positions[0].alt];\n }, 0);\n } else {\n this.label.show = false;\n }\n this._elms.labelShow && this._elms.labelShow.forEach(function (item) {\n item.checked = v;\n });\n }\n }, {\n key: \"labelFontFamily\",\n get: function get() {\n return this.options.label.fontFamily;\n },\n set: function set(v) {\n this.options.label.fontFamily = v || 0;\n this.label && (this.label.fontFamily = this.options.label.fontFamily);\n var name = Object(_Element_fontSelect__WEBPACK_IMPORTED_MODULE_21__[\"getFontFamilyName\"])(this.labelFontFamily) || '';\n this._elms.labelFontFamily && this._elms.labelFontFamily.forEach(function (item) {\n item.value = name;\n });\n }\n }, {\n key: \"labelColor\",\n get: function get() {\n return this.options.label.color;\n },\n set: function set(v) {\n var _this10 = this;\n this.options.label.color = v;\n this.label.color = v;\n if (this._elms.labelColor) {\n this._elms.labelColor.forEach(function (item, i) {\n var labelColorPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: _this10.labelColor,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this10.labelColor = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this10.labelColor = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n _this10._elms.labelColor[i] = labelColorPicker;\n });\n }\n }\n }, {\n key: \"labelFontSize\",\n get: function get() {\n return this.options.label.fontSize;\n },\n set: function set(v) {\n this.options.label.fontSize = v;\n this.label.fontSize = v;\n this._elms.labelFontSize && this._elms.labelFontSize.forEach(function (item) {\n item.value = v;\n });\n }\n }, {\n key: \"labelScaleByDistance\",\n get: function get() {\n return this.options.label.scaleByDistance;\n },\n set: function set(v) {\n this.options.label.scaleByDistance = v;\n this.label.scaleByDistance = v;\n this._elms.labelScaleByDistance && this._elms.labelScaleByDistance.forEach(function (item) {\n item.checked = v;\n });\n }\n }, {\n key: \"labelNear\",\n get: function get() {\n return this.options.label.near;\n },\n set: function set(v) {\n var near = v;\n if (near > this.labelFar) {\n near = this.labelFar;\n }\n this.options.label.near = near;\n this.label.near = near;\n this._elms.labelNear && this._elms.labelNear.forEach(function (item) {\n item.value = near;\n });\n }\n }, {\n key: \"labelFar\",\n get: function get() {\n return this.options.label.far;\n },\n set: function set(v) {\n var far = v;\n if (far < this.labelNear) {\n far = this.labelNear;\n }\n this.options.label.far = far;\n this.label.far = far;\n this._elms.labelFar && this._elms.labelFar.forEach(function (item) {\n item.value = far;\n });\n }\n }, {\n key: \"labelLineWidth\",\n get: function get() {\n return this.options.label.lineWidth;\n },\n set: function set(v) {\n this.options.label.lineWidth = v;\n this.label.lineWidth = v;\n this._elms.labelLineWidth && this._elms.labelLineWidth.forEach(function (item) {\n item.value = v;\n });\n }\n }, {\n key: \"labelPixelOffset\",\n get: function get() {\n return this.options.label.pixelOffset;\n },\n set: function set(v) {\n this.options.label.pixelOffset = v;\n this.label.pixelOffset = v;\n this._elms.labelPixelOffset && this._elms.labelPixelOffset.forEach(function (item) {\n item.value = v;\n });\n }\n }, {\n key: \"labelLineColor\",\n get: function get() {\n return this.options.label.lineColor;\n },\n set: function set(v) {\n var _this11 = this;\n this.options.label.lineColor = v;\n this.label.lineColor = v;\n if (this._elms.labelLineColor) {\n this._elms.labelLineColor.forEach(function (item, i) {\n var lineColorPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: _this11.labelLineColor,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this11.labelLineColor = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this11.labelLineColor = 'rgba(0,255,255,0.5)';\n } //点击清空按钮事件回调\n });\n _this11._elms.labelLineColor[i] = lineColorPicker;\n });\n }\n }\n }, {\n key: \"labelBackgroundColorStart\",\n get: function get() {\n return this.options.label.backgroundColor[0];\n },\n set: function set(v) {\n var _this12 = this;\n this.options.label.backgroundColor[0] = v;\n this.label.backgroundColor = [v, this.label.backgroundColor[1]];\n if (this._elms.labelBackgroundColorStart) {\n this._elms.labelBackgroundColorStart.forEach(function (item, i) {\n var labelBackgroundColorStartPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: _this12.labelBackgroundColorStart,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this12.labelBackgroundColorStart = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this12.labelBackgroundColorStart = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n _this12._elms.labelBackgroundColorStart[i] = labelBackgroundColorStartPicker;\n });\n }\n }\n }, {\n key: \"labelBackgroundColorEnd\",\n get: function get() {\n return this.options.label.backgroundColor[1];\n },\n set: function set(v) {\n var _this13 = this;\n this.options.label.backgroundColor[1] = v;\n this.label.backgroundColor = [this.label.backgroundColor[0], v];\n if (this._elms.labelBackgroundColorEnd) {\n this._elms.labelBackgroundColorEnd.forEach(function (item, i) {\n var labelBackgroundColorEndPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: _this13.labelBackgroundColorEnd,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this13.labelBackgroundColorEnd = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this13.labelBackgroundColorEnd = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n _this13._elms.labelBackgroundColorEnd[i] = labelBackgroundColorEndPicker;\n });\n }\n }\n }, {\n key: \"attributeType\",\n get: function get() {\n return this.options.attributeType;\n },\n set: function set(v) {\n this.options.attributeType = v;\n this._elms.attributeType && this._elms.attributeType.forEach(function (item) {\n item.value = v;\n });\n var attributeContent = this._DialogObject._element.content.getElementsByClassName('attribute-content');\n for (var i = 0; i < attributeContent.length; i++) {\n if (attributeContent[i].className.indexOf('attribute-content-' + v) > -1) {\n attributeContent[i].style.display = 'block';\n } else {\n attributeContent[i].style.display = 'none';\n }\n }\n }\n }, {\n key: \"attributeLink\",\n get: function get() {\n return this.options.attribute.link.content;\n },\n set: function set(v) {\n var _this14 = this;\n this.options.attribute.link.content = v;\n if (!this._DialogObject || !this._DialogObject._element || !this._DialogObject._element.content || this._DialogObject._element.content.getElementsByClassName('attribute-content-link').length == 0) {\n return;\n }\n var table = this._DialogObject._element.content.getElementsByClassName('attribute-content-link')[1].getElementsByClassName('table')[0];\n var tableContent = table.getElementsByClassName('table-body')[0];\n tableContent.innerHTML = '';\n if (this.options.attribute.link.content.length > 0) {\n table.getElementsByClassName('table-empty')[0].style.display = 'none';\n } else {\n table.getElementsByClassName('table-empty')[0].style.display = 'flex';\n }\n for (var i = 0; i < this.options.attribute.link.content.length; i++) {\n var tr = \"\\n
\\n
\" + this.options.attribute.link.content[i].name + \"
\\n
\" + this.options.attribute.link.content[i].url + \"
\\n
\\n \\n \\n
\\n
\";\n var trElm = document.createRange().createContextualFragment(tr);\n tableContent.appendChild(trElm);\n }\n var item = tableContent.getElementsByClassName('tr');\n var fun = {\n linkEdit: function () {\n var _linkEdit = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee(index) {\n var table, tableContent, item, _loop2, _i;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee$(_context3) {\n while (1) switch (_context3.prev = _context3.next) {\n case 0:\n _context3.next = 2;\n return _this14.options.attribute.link.content;\n case 2:\n _this14.attributeLink = _context3.sent;\n table = _this14._DialogObject._element.content.getElementsByClassName('attribute-content-link')[1].getElementsByClassName('table')[0];\n tableContent = table.getElementsByClassName('table-body')[0];\n item = tableContent.getElementsByClassName('tr');\n _loop2 = /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _loop2(_i) {\n var height, _html, textareaElm, td, btn, n, _iterator, _step, _loop3;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _loop2$(_context2) {\n while (1) switch (_context2.prev = _context2.next) {\n case 0:\n if (!(index === _i)) {\n _context2.next = 36;\n break;\n }\n height = item[_i].offsetHeight;\n _html = \"\\n
\\n \\n
\\n
\\n \\n
\\n
\\n \\n \\n
\";\n item[_i].innerHTML = _html;\n textareaElm = item[_i].getElementsByClassName('link-edit')[0];\n textareaElm.style.height = height - 10 + 'px';\n td = item[_i].getElementsByClassName('td');\n td[0].getElementsByClassName('input')[0].value = _this14.options.attribute.link.content[index].name;\n td[1].getElementsByClassName('input')[0].value = _this14.options.attribute.link.content[index].url;\n btn = item[_i].getElementsByTagName('button');\n n = 0;\n case 11:\n if (!(n < btn.length)) {\n _context2.next = 35;\n break;\n }\n if (!(!btn[n] || !btn[n].attributes)) {\n _context2.next = 14;\n break;\n }\n return _context2.abrupt(\"continue\", 32);\n case 14:\n _iterator = _createForOfIteratorHelper(btn[n].attributes);\n _context2.prev = 15;\n _loop3 = /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _loop3() {\n var m;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _loop3$(_context) {\n while (1) switch (_context.prev = _context.next) {\n case 0:\n m = _step.value;\n if (!(m.name === '@click')) {\n _context.next = 5;\n break;\n }\n btn[n].addEventListener('click', function (e) {\n if (typeof fun[m.value] === 'function') {\n fun[m.value]({\n name: td[0].getElementsByClassName('input')[0].value,\n url: td[1].getElementsByClassName('input')[0].value\n }, _i);\n }\n });\n btn[n].attributes.removeNamedItem(m.name);\n return _context.abrupt(\"return\", 1);\n case 5:\n case \"end\":\n return _context.stop();\n }\n }, _loop3);\n });\n _iterator.s();\n case 18:\n if ((_step = _iterator.n()).done) {\n _context2.next = 24;\n break;\n }\n return _context2.delegateYield(_loop3(), \"t0\", 20);\n case 20:\n if (!_context2.t0) {\n _context2.next = 22;\n break;\n }\n return _context2.abrupt(\"break\", 24);\n case 22:\n _context2.next = 18;\n break;\n case 24:\n _context2.next = 29;\n break;\n case 26:\n _context2.prev = 26;\n _context2.t1 = _context2[\"catch\"](15);\n _iterator.e(_context2.t1);\n case 29:\n _context2.prev = 29;\n _iterator.f();\n return _context2.finish(29);\n case 32:\n n++;\n _context2.next = 11;\n break;\n case 35:\n return _context2.abrupt(\"return\", 1);\n case 36:\n case \"end\":\n return _context2.stop();\n }\n }, _loop2, null, [[15, 26, 29, 32]]);\n });\n _i = 0;\n case 8:\n if (!(_i < item.length)) {\n _context3.next = 15;\n break;\n }\n return _context3.delegateYield(_loop2(_i), \"t0\", 10);\n case 10:\n if (!_context3.t0) {\n _context3.next = 12;\n break;\n }\n return _context3.abrupt(\"break\", 15);\n case 12:\n _i++;\n _context3.next = 8;\n break;\n case 15:\n case \"end\":\n return _context3.stop();\n }\n }, _callee);\n }));\n function linkEdit(_x) {\n return _linkEdit.apply(this, arguments);\n }\n return linkEdit;\n }(),\n linkDelete: function linkDelete(i) {\n _this14.options.attribute.link.content.splice(i, 1);\n _this14.attributeLink = _this14.options.attribute.link.content;\n },\n confirmEdit: function confirmEdit(value, i) {\n var name = value.name && value.name.replace(/\\s/g, '');\n var url = value.url && value.url.replace(/\\s/g, '');\n if (name && url) {\n _this14.options.attribute.link.content[i] = value;\n } else {\n window.ELEMENT && window.ELEMENT.Message({\n message: '名称或链接不能为空!',\n type: 'warning',\n duration: 1500\n });\n }\n _this14.attributeLink = _this14.options.attribute.link.content;\n },\n cancelEdit: function cancelEdit() {\n _this14.attributeLink = _this14.options.attribute.link.content;\n },\n fileSelect: function fileSelect(value, i) {\n var fileElm = item[i].getElementsByClassName('file-select')[0];\n fileElm.click();\n fileElm.removeEventListener('change', _fileSelect);\n fileElm.addEventListener('change', _fileSelect);\n }\n };\n var _fileSelect = function _fileSelect(event) {\n if (event.target.value) {\n var td = item[event.target.getAttribute('index')].getElementsByClassName('td');\n td[1].getElementsByClassName('input')[0].value = event.target.value;\n event.target.value = null;\n }\n };\n var _loop4 = function _loop4(_i2) {\n var btn = item[_i2].getElementsByTagName('button');\n for (var n = 0; n < btn.length; n++) {\n if (!btn[n] || !btn[n].attributes) {\n continue;\n }\n var _iterator2 = _createForOfIteratorHelper(btn[n].attributes),\n _step2;\n try {\n var _loop5 = function _loop5() {\n var m = _step2.value;\n if (m.name === '@click') {\n btn[n].addEventListener('click', function (e) {\n if (typeof fun[m.value] === 'function') {\n fun[m.value](_i2);\n }\n });\n btn[n].attributes.removeNamedItem(m.name);\n return 1; // break\n }\n };\n for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {\n if (_loop5()) break;\n }\n } catch (err) {\n _iterator2.e(err);\n } finally {\n _iterator2.f();\n }\n }\n };\n for (var _i2 = 0; _i2 < item.length; _i2++) {\n _loop4(_i2);\n }\n }\n\n // get attributeCamera() {\n // return this.options.attribute.camera.content\n // }\n\n // set attributeCamera(v) {\n // this.options.attribute.camera.content = v\n // }\n\n // get attributeVr() {\n // return this.options.attribute.vr.content\n // }\n\n // set attributeVr(v) {\n // this.options.attribute.vr.content = v\n // if (\n // !this._DialogObject ||\n // !this._DialogObject._element ||\n // !this._DialogObject._element.content ||\n // this._DialogObject._element.content.getElementsByClassName(\n // 'attribute-content-vr'\n // ).length == 0\n // ) {\n // return\n // }\n // let table = this._DialogObject._element.content\n // .getElementsByClassName('attribute-content-vr')[1]\n // .getElementsByClassName('table')[0]\n // let tableContent = table.getElementsByClassName('table-body')[0]\n // tableContent.innerHTML = ''\n // if (this.options.attribute.vr.content.length > 0) {\n // table.getElementsByClassName('table-empty')[0].style.display = 'none'\n // } else {\n // table.getElementsByClassName('table-empty')[0].style.display = 'flex'\n // }\n // for (let i = 0; i < this.options.attribute.vr.content.length; i++) {\n // let tr =\n // `\n //
\n //
` +\n // this.options.attribute.vr.content[i].name +\n // `
\n //
` +\n // this.options.attribute.vr.content[i].url +\n // `
\n //
\n // \n // \n //
\n //
`\n // let trElm = document.createRange().createContextualFragment(tr)\n // tableContent.appendChild(trElm)\n // }\n // let item = tableContent.getElementsByClassName('tr')\n // let fun = {\n // vrEdit: async index => {\n // this.attributeVr = await this.options.attribute.vr.content\n // let table = this._DialogObject._element.content\n // .getElementsByClassName('attribute-content-vr')[1]\n // .getElementsByClassName('table')[0]\n // let tableContent = table.getElementsByClassName('table-body')[0]\n // let item = tableContent.getElementsByClassName('tr')\n // for (let i = 0; i < item.length; i++) {\n // if (index === i) {\n // let height = item[i].offsetHeight\n // let html = `\n //
\n // \n //
\n //
\n // \n //
\n //
\n // \n // \n //
`\n // item[i].innerHTML = html\n // let textareaElm = item[i].getElementsByClassName('link-edit')[0]\n // textareaElm.style.height = height - 10 + 'px'\n // let td = item[i].getElementsByClassName('td')\n // td[0].getElementsByClassName(\n // 'input'\n // )[0].value = this.options.attribute.vr.content[index].name\n // td[1].getElementsByClassName(\n // 'input'\n // )[0].value = this.options.attribute.vr.content[index].url\n // let btn = item[i].getElementsByTagName('button')\n // for (let n = 0; n < btn.length; n++) {\n // if (!btn[n] || !btn[n].attributes) {\n // continue\n // }\n // for (let m of btn[n].attributes) {\n // if (m.name === '@click') {\n // btn[n].addEventListener('click', e => {\n // if (typeof fun[m.value] === 'function') {\n // fun[m.value](\n // {\n // name: td[0].getElementsByClassName('input')[0].value,\n // url: td[1].getElementsByClassName('input')[0].value\n // },\n // i\n // )\n // }\n // })\n // btn[n].attributes.removeNamedItem(m.name)\n // break\n // }\n // }\n // }\n // break\n // }\n // }\n // },\n // vrDelete: i => {\n // this.options.attribute.vr.content.splice(i, 1)\n // this.attributeVr = this.options.attribute.vr.content\n // },\n\n // confirmEdit: (value, i) => {\n // let name = value.name && value.name.replace(/\\s/g, '')\n // let url = value.url && value.url.replace(/\\s/g, '')\n // if (name && url) {\n // this.options.attribute.vr.content[i] = value\n // } else {\n // window.ELEMENT &&\n // window.ELEMENT.Message({\n // message: '名称或链接不能为空!',\n // type: 'warning',\n // duration: 1500\n // })\n // }\n // this.attributeVr = this.options.attribute.vr.content\n // },\n // cancelEdit: () => {\n // this.attributeVr = this.options.attribute.vr.content\n // },\n // fileSelect: (value, i) => {\n // let fileElm = item[i].getElementsByClassName('file-select')[0]\n // fileElm.click()\n // fileElm.removeEventListener('change', fileSelect)\n // fileElm.addEventListener('change', fileSelect)\n // }\n // }\n // let fileSelect = event => {\n // if (event.target.value) {\n // let td = item[\n // event.target.getAttribute('index')\n // ].getElementsByClassName('td')\n // td[1].getElementsByClassName('input')[0].value = event.target.value\n // event.target.value = null\n // }\n // }\n // for (let i = 0; i < item.length; i++) {\n // let btn = item[i].getElementsByTagName('button')\n // for (let n = 0; n < btn.length; n++) {\n // if (!btn[n] || !btn[n].attributes) {\n // continue\n // }\n // for (let m of btn[n].attributes) {\n // if (m.name === '@click') {\n // btn[n].addEventListener('click', e => {\n // if (typeof fun[m.value] === 'function') {\n // fun[m.value](i)\n // }\n // })\n // btn[n].attributes.removeNamedItem(m.name)\n // break\n // }\n // }\n // }\n // }\n // }\n\n // get attributeGoods() {\n // return this.options.attribute.goods.content\n // }\n\n // set attributeGoods(v) {\n // this.options.attribute.goods.content = v\n // }\n }, {\n key: \"positions\",\n get: function get() {\n return this.options.positions;\n }\n }, {\n key: \"judgeLine\",\n value: function judgeLine(entity, newParam) {\n if (!entity.polyline.oriRepeat) {\n var param = {\n color: newParam.color,\n image: this.getSourceRootPath() + \"/img/arrow/1.png\",\n space: newParam.space,\n speed: newParam.speed\n };\n param.speed = newParam.rotate ? param.speed : 0 - param.speed;\n var canvasEle = document.createElement('canvas');\n var ctx = canvasEle.getContext('2d');\n var myImg = new Image();\n // myImg.src = that.getSourceRootPath() + '/img/arrow/1.png'\n myImg.src = param.image;\n var that = this;\n myImg.onload = function () {\n canvasEle.width = myImg.width * (param.space + 1);\n canvasEle.height = myImg.height;\n var oriRepeat = that.getSceenLine(entity, param, canvasEle);\n oriRepeat && (entity.polyline.oriRepeat = oriRepeat);\n var positionProperty = entity.polyline.positions;\n var positions = positionProperty.getValue(that.sdk.viewer.clock.currentTime);\n if (!Cesium.defined(positions)) {\n return new Cesium.Cartesian2(1.0, 1.0);\n // return 1.0;\n }\n var distance = 0;\n for (var i = 0; i < positions.length - 1; ++i) {\n distance += Cesium.Cartesian3.distance(positions[i], positions[i + 1]);\n }\n var repeatX = distance / entity.polyline.width.getValue();\n // 根据地图缩放程度调整repeatX\n var cameraHeight = that.sdk.viewer.camera.positionCartographic.height;\n var boundingSphere = new Cesium.BoundingSphere(new Cesium.Cartesian3(-1000000, 0, 0),\n // 中心点坐标\n 500000 // 半径(距离)\n );\n\n // 获取绘图缓冲区的宽度和高度(通常是屏幕的分辨率)\n var drawingBufferWidth = that.sdk.viewer.canvas.clientWidth;\n var drawingBufferHeight = that.sdk.viewer.canvas.clientHeight;\n\n // 使用 getPixelSize 方法获取包围球在屏幕上的像素大小\n var groundResolution = that.sdk.viewer.scene.camera.getPixelSize(boundingSphere, drawingBufferWidth, drawingBufferHeight);\n repeatX *= groundResolution / cameraHeight / (param.space * (canvasEle.width / canvasEle.height * 5) + 1);\n // if (entity.polyline.material.oriRepeat) {\n\n if (that.sdk.viewer.scene.mode === Cesium.SceneMode.SCENE3D) {\n var speed = repeatX / entity.polyline.oriRepeat;\n entity.polyline.oriSpeed = speed;\n entity.polyline.oriRepeatX = repeatX;\n } else {\n var sdk3d = Object(_Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_19__[\"get3DView\"])();\n var sdk3dEntity = sdk3d.viewer.entities.getById(that.options.id);\n entity.polyline.oriSpeed = sdk3dEntity.polyline.oriSpeed;\n entity.polyline.oriRepeatX = sdk3dEntity.polyline.oriRepeatX;\n }\n };\n }\n }\n /**获取当前满屏横线速度 */\n }, {\n key: \"getSceenLine\",\n value: function getSceenLine(entity, options, canvasEle) {\n var point1 = new Cesium.Cartesian2(0, this.sdk.viewer.canvas.clientHeight);\n var point2 = new Cesium.Cartesian2(this.sdk.viewer.canvas.clientWidth / 2, this.sdk.viewer.canvas.clientHeight);\n // var cartesian1 = this.sdk.viewer.scene.pickPosition(point1)\n // var cartesian2 = this.sdk.viewer.scene.pickPosition(point2)\n\n var ray = this.sdk.viewer.camera.getPickRay(point1);\n var cartesian1 = this.sdk.viewer.scene.globe.pick(ray, this.sdk.viewer.scene);\n var ray2 = this.sdk.viewer.camera.getPickRay(point2);\n var cartesian2 = this.sdk.viewer.scene.globe.pick(ray2, this.sdk.viewer.scene);\n // if (!cartesian1 || !cartesian2) {\n // let ray = this.sdk.viewer.camera.getPickRay(point1);\n // cartesian1 = this.sdk.viewer.scene.globe.pick(ray, this.sdk.viewer.scene);\n\n // let ray2 = this.sdk.viewer.camera.getPickRay(point2);\n // cartesian2 = this.sdk.viewer.scene.globe.pick(ray2, this.sdk.viewer.scene);\n // }\n if (cartesian1 && cartesian2) {\n var distance = Cesium.Cartesian3.distance(cartesian1, cartesian2);\n var repeatX = distance / entity.polyline.width.getValue();\n // 根据地图缩放程度调整repeatX\n var cameraHeight = this.sdk.viewer.camera.positionCartographic.height;\n var boundingSphere = new Cesium.BoundingSphere(new Cesium.Cartesian3(-1000000, 0, 0),\n // 中心点坐标\n 500000 // 半径(距离)\n );\n\n // 获取绘图缓冲区的宽度和高度(通常是屏幕的分辨率)\n var drawingBufferWidth = this.sdk.viewer.canvas.clientWidth;\n var drawingBufferHeight = this.sdk.viewer.canvas.clientHeight;\n\n // 使用 getPixelSize 方法获取包围球在屏幕上的像素大小\n var groundResolution = this.sdk.viewer.scene.camera.getPixelSize(boundingSphere, drawingBufferWidth, drawingBufferHeight);\n // repeatX *= groundResolution / cameraHeight / ((myImg.width / myImg.height * 5) + 1);\n if (groundResolution > 700) {\n repeatX *= groundResolution / cameraHeight / (options.space * (canvasEle.width / canvasEle.height * 5) + 1);\n } else {\n repeatX = undefined;\n }\n if (this.sdk.viewer.scene.mode === Cesium.SceneMode.SCENE3D) {\n return repeatX;\n } else {\n var sdk3d = Object(_Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_19__[\"get3DView\"])();\n var sdk3dEntity = sdk3d.viewer.entities.getById(this.options.id);\n return sdk3dEntity.polyline.oriRepeatX;\n }\n }\n }\n /**\r\n * 编辑框\r\n * @param {boolean} state true打开,false关闭\r\n */\n }, {\n key: \"edit\",\n value: (function () {\n var _edit = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee2(state) {\n var _this15 = this;\n var _this, tabClick, contentElm, tabsElm, colorPicker, labelColorPicker, extendColorPicker, lineColorPicker, labelBackgroundColorEndPicker, all_elm;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee2$(_context4) {\n while (1) switch (_context4.prev = _context4.next) {\n case 0:\n return _context4.abrupt(\"return\");\n case 8:\n this._DialogObject = _context4.sent;\n this._DialogObject._element.body.className = this._DialogObject._element.body.className + ' polyline';\n contentElm = document.createElement('div');\n contentElm.innerHTML = Object(_element__WEBPACK_IMPORTED_MODULE_10__[\"html\"])(this);\n this._DialogObject.contentAppChild(contentElm);\n this.attributeType = this.options.attributeType;\n // this.attributeCamera = this.options.attribute.camera.content\n // this.attributeGoods = this.options.attribute.goods.content\n // 创建标签页\n tabsElm = new _Element_cy_html_tabs__WEBPACK_IMPORTED_MODULE_12__[\"default\"]('polyline-object-edit-tabs', tabClick, this.sdk); // 颜色组件\n colorPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName('color')[0],\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: this.color,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this15.color = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this15.color = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n labelColorPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName('labelColor')[0],\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: this.labelColor,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this15.labelColor = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this15.labelColor = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n extendColorPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName('extendColor')[0],\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: this.extendColor,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this15.extendColor = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this15.extendColor = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n lineColorPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName('labelLineColor')[0],\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: this.labelLineColor,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this15.labelLineColor = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this15.labelLineColor = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n _this.labelBackgroundColorStartPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName('labelBackgroundColorStart')[0],\n size: 'mini',\n alpha: true,\n defaultColor: this.labelBackgroundColorStart,\n disabled: false,\n openPickerAni: 'opacity',\n sure: function sure(color) {\n _this15.labelBackgroundColorStart = color;\n },\n clear: function clear() {\n _this15.labelBackgroundColorStart = 'rgba(255,255,255,1)';\n }\n });\n labelBackgroundColorEndPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName('labelBackgroundColorEnd')[0],\n size: 'mini',\n alpha: true,\n defaultColor: this.labelBackgroundColorEnd,\n disabled: false,\n openPickerAni: 'opacity',\n sure: function sure(color) {\n _this15.labelBackgroundColorEnd = color;\n },\n clear: function clear() {\n _this15.labelBackgroundColorEnd = 'rgba(255,255,255,1)';\n }\n });\n all_elm = contentElm.getElementsByTagName('*');\n _eventBinding__WEBPACK_IMPORTED_MODULE_14__[\"default\"].on(this, all_elm);\n this._elms = _eventBinding__WEBPACK_IMPORTED_MODULE_14__[\"default\"].element;\n this._elms.color = [colorPicker];\n this._elms.labelColor = [labelColorPicker];\n this._elms.extendColor = [extendColorPicker];\n this._elms.labelLineColor = [lineColorPicker];\n this._elms.labelBackgroundColorStart = [_this.labelBackgroundColorStartPicker];\n this._elms.labelBackgroundColorEnd = [labelBackgroundColorEndPicker];\n setTimeout(function () {\n _this15.attributeLink = _this15.options.attribute.link.content;\n // this.attributeVr = this.options.attribute.vr.content\n // this.cameraSelect && this.cameraSelect()\n // this.goodsSelect && this.goodsSelect()\n var tagData = _this15.attributeSelect;\n var attributeElm = _this15._DialogObject._element.content.getElementsByClassName('attribute-select-box')[0];\n if (attributeElm) {\n var legpObject = Object(_Element_datalist__WEBPACK_IMPORTED_MODULE_20__[\"legp\"])(attributeElm, '.attribute-select');\n legpObject.legp_search(tagData);\n var attributeSelectElm = _this15._DialogObject._element.content.getElementsByClassName('attribute-select')[0].getElementsByTagName('input')[0];\n for (var i = 0; i < tagData.length; i++) {\n if (tagData[i].key === _this15.options.attributeType) {\n attributeSelectElm.value = tagData[i].value;\n legpObject.legp_searchActive(tagData[i].value);\n break;\n }\n }\n attributeSelectElm.addEventListener('input', function () {\n for (var _i3 = 0; _i3 < tagData.length; _i3++) {\n if (tagData[_i3].value === attributeSelectElm.value) {\n _this15.attributeType = tagData[_i3].key;\n break;\n }\n }\n });\n }\n var nameData = [{\n name: '空间长度',\n value: '空间长度'\n }, {\n name: '投影长度',\n value: '投影长度'\n }, {\n name: '地表长度',\n value: '地表长度'\n }];\n var nameDataLegpObject = Object(_Element_datalist__WEBPACK_IMPORTED_MODULE_20__[\"legp\"])(_this15._DialogObject._element.content.getElementsByClassName('input-select-unit-box')[0], '.input-select-unit');\n if (nameDataLegpObject) {\n nameDataLegpObject.legp_search(nameData);\n var nameDataLegpElm = _this15._DialogObject._element.content.getElementsByClassName('input-select-unit')[0].getElementsByTagName('input')[0];\n _this15._elms.wordsName = [nameDataLegpElm];\n nameDataLegpElm.value = _this15.options.wordsName;\n for (var _i4 = 0; _i4 < nameData.length; _i4++) {\n if (nameData[_i4].value === nameDataLegpElm.value) {\n nameDataLegpObject.legp_searchActive(nameData[_i4].value);\n break;\n }\n }\n nameDataLegpElm.addEventListener('input', function () {\n for (var _i5 = 0; _i5 < nameData.length; _i5++) {\n if (nameData[_i5].value === nameDataLegpElm.value) {\n _this15.wordsName = nameData[_i5].value;\n break;\n }\n }\n });\n }\n\n // 原始长度单位\n var unitData = [{\n name: '米',\n value: '米'\n }, {\n name: '千米',\n value: '千米'\n }];\n var unitDataLegpObject = Object(_Element_datalist__WEBPACK_IMPORTED_MODULE_20__[\"legp\"])(_this15._DialogObject._element.content.getElementsByClassName('input-select-unit-box')[0], '.input-select-unit', 1);\n if (unitDataLegpObject) {\n unitDataLegpObject.legp_search(unitData);\n var unitDataLegpElm = _this15._DialogObject._element.content.getElementsByClassName('input-select-unit')[1].getElementsByTagName('input')[0];\n _this15._elms.lengthUnit = [unitDataLegpElm];\n unitDataLegpElm.value = _this15.options.lengthUnit;\n for (var _i6 = 0; _i6 < unitData.length; _i6++) {\n if (unitData[_i6].value === unitDataLegpElm.value) {\n unitDataLegpObject.legp_searchActive(unitData[_i6].value);\n break;\n }\n }\n unitDataLegpElm.addEventListener('input', function () {\n for (var _i7 = 0; _i7 < unitData.length; _i7++) {\n if (unitData[_i7].value === unitDataLegpElm.value) {\n _this15.lengthUnit = unitData[_i7].value;\n break;\n }\n }\n });\n }\n //\n\n // 拟合长度单位\n // let fitUnitData = [\n // {\n // name: '米',\n // value: '米'\n // },\n // {\n // name: '千米',\n // value: '千米'\n // }\n // ]\n\n // let fitUnitDataLegpObject = legp(\n // this._DialogObject._element.content.getElementsByClassName(\n // 'input-select-fit-unit-box'\n // )[0],\n // '.input-select-fit-unit'\n // )\n // if (fitUnitDataLegpObject) {\n // fitUnitDataLegpObject.legp_search(fitUnitData)\n // let fitUnitDataLegpElm = this._DialogObject._element.content\n // .getElementsByClassName('input-select-fit-unit')[0]\n // .getElementsByTagName('input')[0]\n // this._elms.fitLengthUnit = [fitUnitDataLegpElm]\n // fitUnitDataLegpElm.value = this.options.fitLengthUnit\n // for (let i = 0; i < fitUnitData.length; i++) {\n // if (fitUnitData[i].value === fitUnitDataLegpElm.value) {\n // fitUnitDataLegpObject.legp_searchActive(fitUnitData[i].value)\n // break\n // }\n // }\n // fitUnitDataLegpElm.addEventListener('input', () => {\n // for (let i = 0; i < fitUnitData.length; i++) {\n // if (fitUnitData[i].value === fitUnitDataLegpElm.value) {\n // this.fitLengthUnit = fitUnitData[i].value\n // break\n // }\n // }\n // })\n // }\n\n var lineTypeData = [{\n name: '实线',\n value: '实线',\n key: 0,\n icon: 'line'\n }, {\n name: '虚线',\n value: '虚线',\n key: 1,\n icon: 'dash-line'\n }, {\n name: '泛光',\n value: '泛光',\n key: 2,\n icon: 'light-line'\n }, {\n name: '尾迹光线',\n value: '尾迹光线',\n key: 3,\n icon: 'tail-line'\n }, {\n name: '多尾迹光线',\n value: '多尾迹光线',\n key: 4,\n icon: 'mult-tail-line'\n }, {\n name: '流动虚线1',\n value: '流动虚线1',\n key: 5,\n icon: 'flow-dash-line1'\n }, {\n name: '流动虚线2',\n value: '流动虚线2',\n key: 6,\n icon: 'flow-dash-line2'\n }, {\n name: '流动箭头1',\n value: '流动箭头1',\n key: 7,\n icon: 'pic-line1'\n }, {\n name: '流动箭头2',\n value: '流动箭头2',\n key: 8,\n icon: 'pic-line2'\n }, {\n name: '流动箭头3',\n value: '流动箭头3',\n key: 9,\n icon: 'pic-line3'\n }, {\n name: '流动箭头4',\n value: '流动箭头4',\n key: 10,\n icon: 'pic-line4'\n }, {\n name: '流动箭头5',\n value: '流动箭头5',\n key: 11,\n icon: 'pic-line5'\n }, {\n name: '流动箭头6',\n value: '流动箭头6',\n key: 12,\n icon: 'pic-line6'\n }];\n var lineTypeDataLegpObject = Object(_Element_datalist__WEBPACK_IMPORTED_MODULE_20__[\"legp\"])(_this15._DialogObject._element.content.getElementsByClassName('input-select-line-type-box')[0], '.input-select-line-type');\n if (lineTypeDataLegpObject) {\n lineTypeDataLegpObject.legp_search(lineTypeData);\n var iActiveElm2 = document.createElement('i');\n iActiveElm2.className = 'icon icon-active';\n _this15._DialogObject._element.content.getElementsByClassName('input-select-line-type')[0].getElementsByClassName('cy_datalist')[0].appendChild(iActiveElm2);\n var lineTypeDataLegpElm = _this15._DialogObject._element.content.getElementsByClassName('input-select-line-type')[0].getElementsByTagName('input')[0];\n _this15._elms.lineType = [lineTypeDataLegpElm];\n for (var _i8 = 0; _i8 < lineTypeData.length; _i8++) {\n if (lineTypeData[_i8].key === _this15.options.type) {\n lineTypeDataLegpObject.legp_searchActive(lineTypeData[_i8].value);\n lineTypeDataLegpElm.value = lineTypeData[_i8].value;\n iActiveElm2.className = \"icon icon-active \".concat(lineTypeData[_i8].icon);\n break;\n }\n }\n lineTypeDataLegpElm.addEventListener('input', function () {\n for (var _i9 = 0; _i9 < lineTypeData.length; _i9++) {\n if (lineTypeData[_i9].value === lineTypeDataLegpElm.value) {\n _this15.lineType = lineTypeData[_i9].key;\n iActiveElm2.className = \"icon icon-active \".concat(lineTypeData[_i9].icon);\n\n //控制参数显隐\n if (2 < _this15.lineType && _this15.lineType < 13) {\n //贴图参数\n document.getElementById('dashTextureDom') && (document.getElementById('dashTextureDom').style.display = 'flex');\n } else {\n document.getElementById('dashTextureDom') && (document.getElementById('dashTextureDom').style.display = 'none');\n }\n if (2 < _this15.lineType && _this15.lineType < 5) {\n //尾迹参数\n document.getElementsByClassName('lineSpace')[0] && (document.getElementsByClassName('lineSpace')[0].style.display = 'none');\n document.getElementsByClassName('lineSpace')[1] && (document.getElementsByClassName('lineSpace')[1].style.display = 'none');\n } else {\n document.getElementsByClassName('lineSpace')[0] && (document.getElementsByClassName('lineSpace')[0].style.display = 'flex');\n document.getElementsByClassName('lineSpace')[1] && (document.getElementsByClassName('lineSpace')[1].style.display = 'flex');\n }\n break;\n }\n }\n });\n }\n var heightBoxElm = _this15._DialogObject._element.content.getElementsByClassName('height-box')[0];\n var heightElm = heightBoxElm.getElementsByClassName('height')[0];\n var heightConfirmElm = _this15._DialogObject._element.content.getElementsByClassName('height-confirm')[0];\n heightElm.value = 10;\n if (_this15.heightMode == 2) {\n heightBoxElm && (heightBoxElm.className = 'input-number input-number-unit-1 height-box disabled');\n heightConfirmElm && heightConfirmElm.setAttribute('disabled', 'disabled');\n } else {\n heightBoxElm && (heightBoxElm.className = 'input-number input-number-unit-1 height-box');\n heightConfirmElm && heightConfirmElm.removeAttribute('disabled');\n }\n var heightModeData = [{\n name: '海拔高度',\n value: '海拔高度',\n key: '0'\n }, {\n name: '相对地表',\n value: '相对地表',\n key: '1'\n }, {\n name: '依附模型',\n value: '依附模型',\n key: '2'\n }];\n var heightModeObject = Object(_Element_datalist__WEBPACK_IMPORTED_MODULE_20__[\"legp\"])(_this15._DialogObject._element.content.getElementsByClassName('height-mode-box')[0], '.height-mode');\n if (heightModeObject) {\n heightModeObject.legp_search(heightModeData);\n var heightModeDataLegpElm = _this15._DialogObject._element.content.getElementsByClassName('height-mode')[0].getElementsByTagName('input')[0];\n for (var _i10 = 0; _i10 < heightModeData.length; _i10++) {\n if (heightModeData[_i10].key == _this15.heightMode) {\n heightModeDataLegpElm.value = heightModeData[_i10].value;\n heightModeObject.legp_searchActive(heightModeData[_i10].value);\n break;\n }\n }\n heightModeDataLegpElm.addEventListener('input', function () {\n for (var _i11 = 0; _i11 < heightModeData.length; _i11++) {\n if (heightModeData[_i11].value === heightModeDataLegpElm.value) {\n _this15.heightMode = heightModeData[_i11].key;\n break;\n }\n }\n });\n heightElm.addEventListener('input', function () {\n switch (_this15.heightMode) {\n case 0:\n case '0':\n break;\n case 1:\n case '1':\n break;\n case 2:\n case '2':\n break;\n }\n });\n _this15._elms.height = heightElm;\n _this15._elms.heightBox = heightBoxElm;\n _this15._elms.heightMode = heightModeDataLegpElm;\n _this15._elms.heightConfirm = heightConfirmElm;\n _this15._elms.heightModeObject = heightModeObject;\n heightConfirmElm.addEventListener('click', function () {\n _this15.positionEditing = false;\n for (var _i12 = 0; _i12 < _this15.options.positions.length; _i12++) {\n _this15.options.positions[_i12].alt = Number((_this15.options.positions[_i12].alt + Number(heightElm.value)).toFixed(2));\n _this15._elms.alt[_i12].innerHTML = _this15.options.positions[_i12].alt;\n }\n var fromDegreesArray = _this15.renewPositions(_this15.options.positions);\n _this15.entity.polyline.positions = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray);\n _this15.positionEditing = false;\n _this15.closeNodeEdit();\n });\n }\n var tableElm = contentElm.getElementsByClassName('spatial-info-table')[0];\n var tBodyElm = tableElm.getElementsByClassName('table-body')[0];\n _this15._elms.lng = [];\n _this15._elms.lngInput = [];\n _this15._elms.lat = [];\n _this15._elms.latInput = [];\n _this15._elms.alt = [];\n _this15._elms.altInput = [];\n var _loop6 = function _loop6(_i13) {\n var tr = document.createElement('div');\n tr.className = 'tr';\n tr.innerHTML = \"\\n
\".concat(_i13 + 1, \"
\\n
\\n
\\n
\\n \");\n var lngBox = tr.getElementsByClassName('lng')[0];\n var lng = document.createElement('span');\n lng.innerHTML = _this15.options.positions[_i13].lng.toFixed(8);\n lngBox.appendChild(lng);\n var lngInput = document.createElement('input');\n lngInput.className = 'input';\n lngInput.type = 'number';\n lngInput.title = '';\n lngInput.min = -180;\n lngInput.max = 180;\n lngInput.value = _this15.options.positions[_i13].lng.toFixed(8);\n var latBox = tr.getElementsByClassName('lat')[0];\n var lat = document.createElement('span');\n lat.innerHTML = _this15.options.positions[_i13].lat.toFixed(8);\n latBox.appendChild(lat);\n var latInput = document.createElement('input');\n latInput.className = 'input';\n latInput.type = 'number';\n latInput.title = '';\n latInput.min = -90;\n latInput.max = 90;\n latInput.value = _this15.options.positions[_i13].lat.toFixed(8);\n var altBox = tr.getElementsByClassName('alt')[0];\n var alt = document.createElement('span');\n alt.innerHTML = _this15.options.positions[_i13].alt.toFixed(2);\n altBox.appendChild(alt);\n var altInput = document.createElement('input');\n altInput.className = 'input';\n altInput.type = 'number';\n altInput.title = '';\n altInput.min = -9999999;\n altInput.max = 999999999;\n altInput.value = _this15.options.positions[_i13].alt.toFixed(2);\n lngBox.addEventListener('dblclick', function () {\n lngBox.innerHTML = '';\n lngInput.value = Number(_this15.options.positions[_i13].lng.toFixed(8));\n lngBox.appendChild(lngInput);\n lngInput.focus();\n _this15.positionEditing = false;\n _this15.closeNodeEdit();\n });\n lngInput.addEventListener('blur', function () {\n lngInput.value = Number(_this15.options.positions[_i13].lng.toFixed(8));\n lngBox.innerHTML = '';\n lngBox.appendChild(lng);\n });\n lngInput.addEventListener('input', function () {\n _this15.options.positions[_i13].lng = Number(Number(lngInput.value).toFixed(8));\n lng.innerHTML = _this15.options.positions[_i13].lng.toFixed(8);\n var fromDegreesArray = _this15.renewPositions(_this15.options.positions);\n _this15.entity.polyline.positions = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray);\n _this15.label.position = [_this15.options.positions[0].lng, _this15.options.positions[0].lat, fromDegreesArray[2]];\n });\n latBox.addEventListener('dblclick', function () {\n latBox.innerHTML = '';\n latInput.value = Number(_this15.options.positions[_i13].lat.toFixed(8));\n latBox.appendChild(latInput);\n latInput.focus();\n _this15.positionEditing = false;\n _this15.closeNodeEdit();\n });\n latInput.addEventListener('blur', function () {\n latInput.value = Number(_this15.options.positions[_i13].lat.toFixed(8));\n latBox.innerHTML = '';\n latBox.appendChild(lat);\n });\n latInput.addEventListener('input', function () {\n _this15.options.positions[_i13].lat = Number(Number(latInput.value).toFixed(8));\n lat.innerHTML = _this15.options.positions[_i13].lat.toFixed(8);\n var fromDegreesArray = _this15.renewPositions(_this15.options.positions);\n _this15.entity.polyline.positions = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray);\n _this15.label.position = [_this15.options.positions[0].lng, _this15.options.positions[0].lat, fromDegreesArray[2]];\n });\n altBox.addEventListener('dblclick', function () {\n if (_this15.heightMode == 2) {\n return;\n }\n altBox.innerHTML = '';\n altInput.value = Number(_this15.options.positions[_i13].alt.toFixed(2));\n altBox.appendChild(altInput);\n altInput.focus();\n _this15.positionEditing = false;\n _this15.closeNodeEdit();\n });\n altInput.addEventListener('blur', function () {\n altInput.value = Number(_this15.options.positions[_i13].alt.toFixed(2));\n altBox.innerHTML = '';\n altBox.appendChild(alt);\n });\n altInput.addEventListener('input', function () {\n _this15.options.positions[_i13].alt = Number(Number(altInput.value).toFixed(2));\n alt.innerHTML = _this15.options.positions[_i13].alt.toFixed(2);\n var fromDegreesArray = _this15.renewPositions(_this15.options.positions);\n _this15.entity.polyline.positions = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray);\n _this15.label.position = [_this15.options.positions[0].lng, _this15.options.positions[0].lat, fromDegreesArray[2]];\n });\n _this15._elms.lng.push(lng);\n _this15._elms.lngInput.push(lngInput);\n _this15._elms.lat.push(lat);\n _this15._elms.latInput.push(latInput);\n _this15._elms.alt.push(alt);\n _this15._elms.altInput.push(altInput);\n tBodyElm.appendChild(tr);\n };\n for (var _i13 = 0; _i13 < _this15.options.positions.length; _i13++) {\n _loop6(_i13);\n }\n var fontData = Object(_Element_fontSelect__WEBPACK_IMPORTED_MODULE_21__[\"getFontList\"])();\n var fontObject = Object(_Element_datalist__WEBPACK_IMPORTED_MODULE_20__[\"legp\"])(_this15._DialogObject._element.content.getElementsByClassName('font-select-box')[0], '.font-select');\n if (fontObject) {\n fontObject.legp_search(fontData);\n var fontDataLegpElm = _this15._DialogObject._element.content.getElementsByClassName('font-select')[0].getElementsByTagName('input')[0];\n fontDataLegpElm.value = fontData[_this15.labelFontFamily].value;\n for (var _i14 = 0; _i14 < fontData.length; _i14++) {\n if (fontData[_i14].value == fontDataLegpElm.value) {\n fontObject.legp_searchActive(fontData[_i14].value);\n break;\n }\n }\n fontDataLegpElm.addEventListener('input', function () {\n for (var _i15 = 0; _i15 < fontData.length; _i15++) {\n if (fontData[_i15].value === fontDataLegpElm.value) {\n _this15.labelFontFamily = fontData[_i15].key;\n break;\n }\n }\n });\n _this15._elms.labelFontFamily = [fontDataLegpElm];\n }\n }, 0);\n _context4.next = 34;\n break;\n case 33:\n if (this._DialogObject && this._DialogObject.close) {\n this._DialogObject.close();\n this._DialogObject = null;\n }\n case 34:\n case \"end\":\n return _context4.stop();\n }\n }, _callee2, this);\n }));\n function edit(_x2) {\n return _edit.apply(this, arguments);\n }\n return edit;\n }() // 平滑处理\n )\n }, {\n key: \"smoothHandle\",\n value: function smoothHandle(positions) {\n var newPositions = [];\n var time = [];\n var fromDegreesArrayHeights = [];\n for (var i = 0; i < positions.length; i++) {\n fromDegreesArrayHeights.push(positions[i].lng, positions[i].lat, positions[i].alt);\n time.push(i / (positions.length - 1));\n }\n var spline = new Cesium.CatmullRomSpline({\n times: time,\n points: Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArrayHeights)\n });\n var length = positions.length * 20;\n for (var _i16 = 0; _i16 <= length; _i16++) {\n var cartesian3 = spline.evaluate(_i16 / length);\n newPositions.push(this.cartesian3Towgs84(cartesian3, this.sdk.viewer));\n }\n return newPositions;\n }\n\n // 更新坐标\n }, {\n key: \"renewPositions\",\n value: function renewPositions(positionsArray, cd) {\n var _this17 = this;\n if (this._error) {\n return;\n }\n var positions = JSON.parse(JSON.stringify(positionsArray));\n var ground;\n switch (this.heightMode) {\n case 0:\n case '0':\n ground = false;\n break;\n case 1:\n case '1':\n for (var i = 0; i < positions.length; i++) {\n var height = this.sdk.viewer.scene.globe.getHeight(Cesium.Cartographic.fromDegrees(positions[i].lng, positions[i].lat));\n positions[i].alt = height ? Number((positions[i].alt + Number(height)).toFixed(2)) : Number(positions[i].alt.toFixed(2));\n }\n ground = false;\n break;\n case 2:\n case '2':\n ground = true;\n break;\n }\n var newPositions;\n var fromDegreesArray = [];\n if (this.options.noseToTail && this.options.noseToTail !== 'false') {\n newPositions = [].concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default()(positions), [positions[0]]);\n } else {\n newPositions = _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default()(positions);\n }\n if (this.options.smooth && this.options.smooth !== 'false') {\n newPositions = this.smoothHandle(newPositions);\n for (var _i17 = 0; _i17 < newPositions.length; _i17++) {\n fromDegreesArray.push(newPositions[_i17].lng, newPositions[_i17].lat, newPositions[_i17].alt);\n }\n } else {\n for (var _i18 = 0; _i18 < newPositions.length; _i18++) {\n fromDegreesArray.push(newPositions[_i18].lng, newPositions[_i18].lat, newPositions[_i18].alt);\n }\n }\n\n // 计算长度\n if (this.options.noseToTail && this.options.noseToTail !== 'false' || this.options.smooth && this.options.smooth !== 'false') {\n var array = [];\n for (var _i19 = 0; _i19 < fromDegreesArray.length; _i19 += 3) {\n array.push({\n lng: fromDegreesArray[_i19],\n lat: fromDegreesArray[_i19 + 1],\n alt: fromDegreesArray[_i19 + 2]\n });\n }\n var _this16 = this;\n this.computeDistance(array, 2, this.options.wordsName).then(function (res) {\n _this16.lengthByMeter = res;\n _this17.lengthChangeCallBack && _this17.lengthChangeCallBack();\n cd && cd();\n });\n } else {\n var _this18 = this;\n this.computeDistance(positions, 2, this.options.wordsName).then(function (res) {\n _this18.lengthByMeter = res;\n _this17.lengthChangeCallBack && _this17.lengthChangeCallBack();\n cd && cd();\n });\n }\n return fromDegreesArray;\n }\n\n // 更新多边形(线扩展)\n }, {\n key: \"renewPolygon\",\n value: function renewPolygon(fromDegreesArray) {\n var linePositions = [];\n if (this.options.extend && this.options.extend !== 'false') {\n var outerHole = [];\n for (var i = 0; i < fromDegreesArray.length; i += 3) {\n linePositions.push([fromDegreesArray[i], fromDegreesArray[i + 1]]);\n }\n var linestring = turf.lineString(linePositions);\n var buffered = turf.buffer(linestring, this.options.extendWidth / 1000, {\n units: 'kilometers'\n });\n for (var _i20 = 0; _i20 < buffered.geometry.coordinates[0].length; _i20++) {\n outerHole.push(buffered.geometry.coordinates[0][_i20][0], buffered.geometry.coordinates[0][_i20][1]);\n }\n var holes = []; // 孔\n for (var _i21 = 1; _i21 < buffered.geometry.coordinates.length; _i21++) {\n var array = [];\n for (var m = 0; m < buffered.geometry.coordinates[_i21].length; m++) {\n array.push(buffered.geometry.coordinates[_i21][m][0], buffered.geometry.coordinates[_i21][m][1]);\n }\n holes.push({\n positions: Cesium.Cartesian3.fromDegreesArray(array)\n });\n }\n this.entity.polygon = new Cesium.PolygonGraphics({\n hierarchy: {\n positions: Cesium.Cartesian3.fromDegreesArray(outerHole),\n holes: holes\n },\n material: Cesium.Color.fromCssColorString(this.options.extendColor)\n });\n } else {\n this.entity.polygon = undefined;\n }\n }\n }, {\n key: \"reset\",\n value: function () {\n var _reset = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee3() {\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee3$(_context5) {\n while (1) switch (_context5.prev = _context5.next) {\n case 0:\n if (this.entity) {\n _context5.next = 2;\n break;\n }\n return _context5.abrupt(\"return\");\n case 2:\n this.options = this.deepCopyObj(this.originalOptions);\n this.name = this.originalOptions.name;\n this.color = this.originalOptions.color;\n this.lineWidth = this.originalOptions.width;\n this.lineType = this.originalOptions.type;\n this.noseToTail = this.originalOptions.noseToTail;\n this.smooth = this.originalOptions.smooth;\n this.extend = this.originalOptions.extend;\n this.extendWidth = this.originalOptions.extendWidth;\n this.extendColor = this.originalOptions.extendColor;\n this.labelShow = this.originalOptions.label.show;\n this.labelColor = this.originalOptions.label.color;\n this.labelFontSize = this.originalOptions.label.fontSize;\n this.labelFontFamily = this.originalOptions.label.fontFamily;\n this.labelLineWidth = this.originalOptions.label.lineWidth;\n this.labelPixelOffset = this.originalOptions.label.pixelOffset;\n this.labelLineColor = this.originalOptions.label.lineColor;\n this.labelBackgroundColorStart = this.originalOptions.label.backgroundColor[0];\n this.labelBackgroundColorEnd = this.originalOptions.label.backgroundColor[1];\n this.attributeLink = this.options.attribute.link.content;\n // this.attributeVr = this.options.attribute.vr.content\n // this.attributeCamera = this.options.attribute.camera.content\n // this.attributeGoods = this.options.attribute.goods.content\n this.rotate = this.originalOptions.rotate;\n this.speed = this.originalOptions.speed;\n // this.dashSize = this.originalOptions.dashSize\n this.space = this.originalOptions.space;\n // this.cameraSelect && this.cameraSelect()\n // this.goodsSelect && this.goodsSelect()\n\n this.heightMode = this.options.heightMode;\n\n // let height\n // if (this.ground) {\n // height = await that.getClampToHeight({\n // lng: this.options.positions[0].lng,\n // lat: this.options.positions[0].lat\n // })\n // } else {\n // height = this.options.positions[0].alt\n // }\n // this.options.label.position = {\n // lng: this.options.positions[0].lng,\n // lat: this.options.positions[0].lat,\n // alt: height\n // }\n // this.label.position = [\n // this.options.label.position.lng,\n // this.options.label.position.lat,\n // this.options.label.position.alt\n // ]\n case 26:\n case \"end\":\n return _context5.stop();\n }\n }, _callee3, this);\n }));\n function reset() {\n return _reset.apply(this, arguments);\n }\n return reset;\n }()\n }, {\n key: \"_addLink\",\n value: function _addLink() {\n if (this._DialogObject._element.content.getElementsByClassName('link_add')[0].value) {\n this.options.attribute.link.content.push({\n name: '链接' + (this.options.attribute.link.content.length + 1),\n url: this._DialogObject._element.content.getElementsByClassName('link_add')[0].value\n });\n this._DialogObject._element.content.getElementsByClassName('link_add')[0].value = '';\n this.attributeLink = this.options.attribute.link.content;\n } else {\n this.Dialog.clickAddLink && this.Dialog.clickAddLink();\n // let input = document.createElement('input');\n // input.type = \"file\";\n // input.accept = \".mp4, .pdf\"\n // input.click()\n // input.addEventListener('change', (event) => {\n // if (input.value) {\n // this.options.attribute.link.content.push({\n // name: '链接' + (this.options.attribute.link.content.length + 1),\n // url: input.value\n // })\n // this.attributeLink = this.options.attribute.link.content\n // }\n // })\n }\n }\n }, {\n key: \"addAttributeLink\",\n value: function addAttributeLink(link) {\n this.options.attribute.link.content.push({\n name: '链接' + (this.options.attribute.link.content.length + 1),\n url: link\n });\n this.attributeLink = this.options.attribute.link.content;\n }\n\n // _addRr() {\n // if (\n // this._DialogObject._element.content.getElementsByClassName(\n // 'vr_add'\n // )[0].value\n // ) {\n // this.options.attribute.vr.content.push({\n // name: '全景图' + (this.options.attribute.vr.content.length + 1),\n // url: this._DialogObject._element.content.getElementsByClassName(\n // 'vr_add'\n // )[0].value\n // })\n // this._DialogObject._element.content.getElementsByClassName(\n // 'vr_add'\n // )[0].value = ''\n // this.attributeVr = this.options.attribute.vr.content\n // } else {\n // this.Dialog.clickAddVr && this.Dialog.clickAddVr()\n // }\n // }\n\n // addAttributeRr(vr) {\n // this.options.attribute.vr.content.push({\n // name: '全景图' + (this.options.attribute.vr.content.length + 1),\n // url: vr\n // })\n // this.attributeVr = this.options.attribute.vr.content\n // }\n\n /**\r\n * 飞到\r\n */\n }, {\n key: \"flyTo\",\n value: function () {\n var _flyTo = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee4() {\n var options,\n orientation,\n lng,\n lat,\n alt,\n destination,\n position,\n positionArray,\n height,\n i,\n a,\n _i22,\n _a,\n _i23,\n _a2,\n BoundingSphere,\n _args6 = arguments;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee4$(_context6) {\n while (1) switch (_context6.prev = _context6.next) {\n case 0:\n options = _args6.length > 0 && _args6[0] !== undefined ? _args6[0] : {};\n if (!this._error) {\n _context6.next = 3;\n break;\n }\n return _context6.abrupt(\"return\");\n case 3:\n Object(_Global_global__WEBPACK_IMPORTED_MODULE_23__[\"setActiveViewer\"])(0);\n Object(_Global_global__WEBPACK_IMPORTED_MODULE_23__[\"closeRotateAround\"])(this.sdk);\n Object(_Global_global__WEBPACK_IMPORTED_MODULE_23__[\"closeViewFollow\"])(this.sdk);\n if (!(this.options.customView && this.options.customView.relativePosition && this.options.customView.orientation)) {\n _context6.next = 25;\n break;\n }\n orientation = {\n heading: Cesium.Math.toRadians(this.options.customView.orientation.heading || 0.0),\n pitch: Cesium.Math.toRadians(this.options.customView.orientation.pitch || -60.0),\n roll: Cesium.Math.toRadians(this.options.customView.orientation.roll || 0.0)\n };\n lng = this.options.customView.relativePosition.lng;\n lat = this.options.customView.relativePosition.lat;\n alt = this.options.customView.relativePosition.alt;\n destination = Cesium.Cartesian3.fromDegrees(lng, lat, alt);\n position = {\n lng: 0,\n lat: 0\n };\n if (this.options.position) {\n position = _objectSpread({}, this.options.position);\n } else if (this.options.positions) {\n position = _objectSpread({}, this.options.positions[0]);\n } else if (this.options.center) {\n position = _objectSpread({}, this.options.center);\n } else if (this.options.start) {\n position = _objectSpread({}, this.options.start);\n } else {\n if (this.options.hasOwnProperty('lng')) {\n position.lng = this.options.lng;\n }\n if (this.options.hasOwnProperty('lat')) {\n position.lat = this.options.lat;\n }\n if (this.options.hasOwnProperty('alt')) {\n position.alt = this.options.alt;\n }\n }\n // 如果没有高度值,则获取紧贴高度计算\n if (position.hasOwnProperty('alt')) {\n _context6.next = 18;\n break;\n }\n _context6.next = 17;\n return this.getClampToHeight(position);\n case 17:\n position.alt = _context6.sent;\n case 18:\n lng = this.options.customView.relativePosition.lng + position.lng;\n lat = this.options.customView.relativePosition.lat + position.lat;\n alt = this.options.customView.relativePosition.alt + position.alt;\n destination = Cesium.Cartesian3.fromDegrees(lng, lat, alt);\n this.sdk.viewer.camera.flyTo({\n destination: destination,\n orientation: orientation\n });\n _context6.next = 43;\n break;\n case 25:\n positionArray = [];\n _context6.t0 = this.options.heightMode;\n _context6.next = _context6.t0 === '0' ? 29 : _context6.t0 === 0 ? 29 : _context6.t0 === '1' ? 31 : _context6.t0 === 1 ? 31 : _context6.t0 === '2' ? 36 : _context6.t0 === 2 ? 36 : 41;\n break;\n case 29:\n for (i = 0; i < this.options.positions.length; i++) {\n a = Cesium.Cartesian3.fromDegrees(this.options.positions[i].lng, this.options.positions[i].lat, this.options.positions[i].alt);\n positionArray.push(a.x, a.y, a.z);\n }\n return _context6.abrupt(\"break\", 41);\n case 31:\n _context6.next = 33;\n return this.getClampToHeight(this.options.positions[0]);\n case 33:\n height = _context6.sent;\n for (_i22 = 0; _i22 < this.options.positions.length; _i22++) {\n _a = Cesium.Cartesian3.fromDegrees(this.options.positions[_i22].lng, this.options.positions[_i22].lat, height + this.options.positions[_i22].alt);\n positionArray.push(_a.x, _a.y, _a.z);\n }\n return _context6.abrupt(\"break\", 41);\n case 36:\n _context6.next = 38;\n return this.getClampToHeight(this.options.positions[0]);\n case 38:\n height = _context6.sent;\n for (_i23 = 0; _i23 < this.options.positions.length; _i23++) {\n _a2 = Cesium.Cartesian3.fromDegrees(this.options.positions[_i23].lng, this.options.positions[_i23].lat, height);\n positionArray.push(_a2.x, _a2.y, _a2.z);\n }\n return _context6.abrupt(\"break\", 41);\n case 41:\n BoundingSphere = Cesium.BoundingSphere.fromVertices(positionArray);\n this.sdk.viewer.camera.flyToBoundingSphere(BoundingSphere, {\n offset: options.orientation || {\n heading: Cesium.Math.toRadians(0.0),\n pitch: Cesium.Math.toRadians(-90.0),\n roll: Cesium.Math.toRadians(0.0)\n }\n });\n case 43:\n case \"end\":\n return _context6.stop();\n }\n }, _callee4, this);\n }));\n function flyTo() {\n return _flyTo.apply(this, arguments);\n }\n return flyTo;\n }()\n /**\r\n * 打开富文本框\r\n */\n }, {\n key: \"openRichTextEditor\",\n value: function openRichTextEditor(e) {\n var _this19 = this;\n // var ue = UE.getEditor('app');\n _Element_richText__WEBPACK_IMPORTED_MODULE_13__[\"default\"].open(this.options.id, this.options.name, this.options.richTextContent);\n _Element_richText__WEBPACK_IMPORTED_MODULE_13__[\"default\"].primaryCallBack = function (content) {\n _this19.options.richTextContent = content;\n };\n }\n\n // static nodeEdit2(that, cb = () => { }) {\n // that.positionEditing = false\n // if (YJ.Measure.GetMeasureStatus()) {\n // cb('上一次测量未结束')\n // } else {\n // YJ.Measure.SetMeasureStatus(true)\n // that.tip = new MouseTip('请选择一个顶点,右键取消', that.sdk)\n // that.event = new MouseEvent(that.sdk)\n // that.nodePoints = []\n // let selectPoint\n // let originalPosition\n // let newpositions = []\n // let fromDegreesArray = []\n // for (let i = 0; i < that.options.positions.length; i++) {\n // fromDegreesArray.push(\n // that.options.positions[i].lng,\n // that.options.positions[i].lat,\n // that.options.positions[i].alt\n // )\n // }\n // newpositions = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray)\n\n // that.event.mouse_left((movement, cartesian) => {\n // if (selectPoint) {\n // that.options.positions[selectPoint.index] = that.cartesian3Towgs84(\n // cartesian,\n // that.sdk.viewer\n // )\n // originalPosition = that.options.positions[selectPoint.index]\n // let entity = that.sdk.viewer.entities.add({\n // name: 'node-secondary-edit-point',\n // position: Cesium.Cartesian3.fromDegrees(\n // that.options.positions[selectPoint.index].lng,\n // that.options.positions[selectPoint.index].lat,\n // that.options.positions[selectPoint.index].alt\n // ),\n // billboard: {\n // image: that.getSourceRootPath() + '/img/point.png',\n // width: 15,\n // height: 15,\n // disableDepthTestDistance: Number.POSITIVE_INFINITY\n // }\n // })\n // that.nodePoints.splice(selectPoint.index, 0, entity)\n // that.options.positions.splice(\n // selectPoint.index,\n // 0,\n // that.options.positions[selectPoint.index]\n // )\n // let fromDegreesArray = that.renewPositions(that.options.positions)\n // that.renewPolygon(fromDegreesArray)\n // that.options.lengthByMeter = that.computeDistance(\n // that.options.positions,\n // 2,\n // that.ground\n // )\n // that.lengthUnit = that.options.lengthUnit\n // } else {\n // var pick = that.sdk.viewer.scene.pick(movement.position)\n // if (\n // pick &&\n // pick.id &&\n // pick.id.name &&\n // pick.id.name === 'node-secondary-edit-point'\n // ) {\n // selectPoint = pick.id\n // that.nodePoints.splice(pick.id.index, 1)\n // that.sdk.viewer.entities.remove(pick.id)\n // that.tip.set_text('左键开始,右键结束,CTRL+右键撤销')\n // originalPosition = that.cartesian3Towgs84(\n // cartesian,\n // that.sdk.viewer\n // )\n // }\n // }\n // })\n\n // that.event.mouse_right((movement, cartesian) => {\n // if (selectPoint) {\n // that.options.positions[selectPoint.index] = originalPosition\n // cb(null, that.options.positions)\n // }\n // let positions = that.options.positions\n // let fromDegreesArray = []\n // for (let i = 0; i < positions.length; i++) {\n // fromDegreesArray.push(\n // positions[i].lng,\n // positions[i].lat,\n // positions[i].alt\n // )\n // }\n // newpositions = Cesium.Cartesian3.fromDegreesArrayHeights(\n // fromDegreesArray\n // )\n // for (let i = 0; i < that.nodePoints.length; i++) {\n // that.sdk.viewer.entities.remove(that.nodePoints[i])\n // }\n // that.nodePoints = []\n // that.event.destroy()\n // that.tip.destroy()\n // })\n\n // that.event.mouse_move((movement, cartesian) => {\n // if (selectPoint) {\n // that.options.positions[selectPoint.index] = that.cartesian3Towgs84(\n // cartesian,\n // that.sdk.viewer\n // )\n // let positions = that.options.positions\n // let fromDegreesArray = []\n // for (let i = 0; i < positions.length; i++) {\n // fromDegreesArray.push(\n // positions[i].lng,\n // positions[i].lat,\n // positions[i].alt\n // )\n // }\n // newpositions = Cesium.Cartesian3.fromDegreesArrayHeights(\n // fromDegreesArray\n // )\n // if (that.options.positions.length === 1) {\n // that.label.position = [\n // that.options.positions[0].lng,\n // that.options.positions[0].lat,\n // that.options.positions[0].alt\n // ]\n // that.options.label.position = {\n // lng: that.options.positions[0].lng,\n // lat: that.options.positions[0].lat,\n // alt: that.options.positions[0].alt\n // }\n // }\n // }\n // that.tip.setPosition(\n // cartesian,\n // movement.endPosition.x,\n // movement.endPosition.y\n // )\n // })\n\n // that.event.mouse_right_keyboard_ctrl((movement, cartesian) => {\n // if (selectPoint) {\n // that.options.positions.pop()\n // that.sdk.viewer.entities.remove(\n // that.nodePoints[that.nodePoints.length - 1]\n // )\n // that.nodePoints.pop()\n // if (selectPoint.index === that.options.positions.length) {\n // if (that.nodePoints[selectPoint.index - 1]) {\n // selectPoint = that.nodePoints[selectPoint.index - 1]\n // } else {\n // selectPoint.index = 0\n // }\n // }\n // }\n // })\n\n // that.entity.polyline.positions = new Cesium.CallbackProperty(function () {\n // return newpositions\n // }, false)\n\n // for (let i = 0; i < that.options.positions.length; i++) {\n // let entity = that.sdk.viewer.entities.add({\n // name: 'node-secondary-edit-point',\n // index: i,\n // position: Cesium.Cartesian3.fromDegrees(\n // that.options.positions[i].lng,\n // that.options.positions[i].lat,\n // that.options.positions[i].alt\n // ),\n // billboard: {\n // image: that.getSourceRootPath() + '/img/point.png',\n // width: 15,\n // height: 15,\n // disableDepthTestDistance: Number.POSITIVE_INFINITY\n // }\n // })\n // that.nodePoints.push(entity)\n // }\n // }\n // }\n }, {\n key: \"nodeEdit\",\n value: function nodeEdit(cd) {\n var _this20 = this;\n this.positionEditing = false;\n this.noseToTail = false;\n // this.smooth = false\n this.heightMode = 0;\n if (YJ.Measure.GetMeasureStatus()) {} else {\n this.closeNodeEdit();\n YJ.Measure.SetMeasureStatus(true);\n this._nodeEditCallback = cd;\n this.tip = new _MouseTip__WEBPACK_IMPORTED_MODULE_17__[\"default\"]('请选择一个顶点,右键取消', this.sdk);\n this.event = new _Event_index__WEBPACK_IMPORTED_MODULE_16__[\"default\"](this.sdk);\n this.ControllerObject = new _Controller_index__WEBPACK_IMPORTED_MODULE_18__[\"default\"](this.sdk);\n var selectPoint;\n this.event.mouse_left(function (movement, cartesian) {\n var pick = _this20.sdk.viewer.scene.pick(movement.position);\n if (pick && pick.id && pick.id.name && pick.id.name === 'node-secondary-edit-point') {\n selectPoint = pick.id;\n _this20.ControllerObject.position = _this20.options.positions[selectPoint.index];\n _this20.ControllerObject.editTranslational();\n _this20.tip && _this20.tip.destroy();\n _this20.ControllerObject.controllerCallBack = function (params) {\n if (selectPoint.index === 0) {\n _this20.label.position = [params.position.lng, params.position.lat, params.position.alt];\n _this20.options.label.position = {\n lng: params.position.lng,\n lat: params.position.lat,\n alt: params.position.alt\n };\n }\n _this20.options.positions[selectPoint.index] = params.position;\n _this20._elms.lng && (_this20._elms.lng[selectPoint.index].innerHTML = params.position.lng.toFixed(8));\n _this20._elms.lngInput && (_this20._elms.lngInput[selectPoint.index].value = params.position.lng.toFixed(8));\n _this20._elms.lat && (_this20._elms.lat[selectPoint.index].innerHTML = params.position.lat.toFixed(8));\n _this20._elms.latInput && (_this20._elms.latInput[selectPoint.index].value = params.position.lat.toFixed(8));\n _this20._elms.alt && (_this20._elms.alt[selectPoint.index].innerHTML = params.position.alt.toFixed(2));\n _this20._elms.altInput && (_this20._elms.altInput[selectPoint.index].value = params.position.alt.toFixed(2));\n selectPoint.position = Cesium.Cartesian3.fromDegrees(params.position.lng, params.position.lat, params.position.alt);\n };\n }\n });\n this.event.mouse_right(function (movement, cartesian) {\n for (var i = 0; i < _this20.nodePoints.length; i++) {\n _this20.sdk.viewer.entities.remove(_this20.nodePoints[i]);\n }\n _this20.nodePoints = [];\n _this20.event.destroy();\n _this20.tip && _this20.tip.destroy();\n _this20.tip = null;\n _this20.ControllerObject.destroy();\n var fromDegreesArray = _this20.renewPositions(_this20.options.positions);\n _this20.entity.polyline.positions = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray);\n YJ.Measure.SetMeasureStatus(false);\n _this20._nodeEditCallback = null;\n });\n this.event.mouse_move(function (movement, cartesian) {\n _this20.tip.setPosition(cartesian, movement.endPosition.x, movement.endPosition.y);\n });\n this.entity.polyline.positions = new Cesium.CallbackProperty(function () {\n var fromDegreesArray = _this20.renewPositions(_this20.options.positions);\n _this20._nodeEditCallback(_this20.options.positions, _this20.lengthByMeter);\n return Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray);\n }, false);\n for (var i = 0; i < this.options.positions.length; i++) {\n var entity = this.sdk.viewer.entities.add({\n name: 'node-secondary-edit-point',\n index: i,\n position: Cesium.Cartesian3.fromDegrees(this.options.positions[i].lng, this.options.positions[i].lat, this.options.positions[i].alt),\n billboard: {\n image: this.getSourceRootPath() + '/img/point.png',\n width: 15,\n height: 15,\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\n color: Cesium.Color.WHITE.withAlpha(0.99)\n }\n });\n this.nodePoints.push(entity);\n }\n }\n }\n }, {\n key: \"closeNodeEdit\",\n value: function closeNodeEdit() {\n YJ.Measure.SetMeasureStatus(false);\n this.ControllerObject && this.ControllerObject.destroy();\n this.event && this.event.destroy();\n this.tip && this.tip.destroy();\n this.tip = null;\n for (var i = 0; i < this.nodePoints.length; i++) {\n this.sdk.viewer.entities.remove(this.nodePoints[i]);\n }\n this.nodePoints = [];\n this._nodeEditCallback = null;\n }\n\n /**\r\n * 删除\r\n */\n }, {\n key: \"remove\",\n value: (function () {\n var _remove = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee5() {\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee5$(_context7) {\n while (1) switch (_context7.prev = _context7.next) {\n case 0:\n this.event && this.event.destroy();\n this.tip && this.tip.destroy();\n this.label && this.label.remove();\n this.sdk.viewer.entities.remove(this.entity);\n this.entity = null;\n if (this._DialogObject && !this._DialogObject.isDestroy) {\n this._DialogObject.close();\n this._DialogObject = null;\n }\n _context7.next = 8;\n return this.sdk.removeIncetance(this.options.id);\n case 8:\n _context7.next = 10;\n return Object(_Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_19__[\"syncData\"])(this.sdk, this.options.id);\n case 10:\n case \"end\":\n return _context7.stop();\n }\n }, _callee5, this);\n }));\n function remove() {\n return _remove.apply(this, arguments);\n }\n return remove;\n }()\n /**@desc 打开平移功能\r\n *\r\n * @memberOf Source\r\n * @param status {boolean}\r\n *\r\n * */\n )\n }, {\n key: \"positionEditing\",\n get: function get() {\n return this.operate.positionEditing;\n },\n set: function set(status) {\n var _this21 = this;\n if (YJ.Measure.GetMeasureStatus() || !this.sdk || !this.sdk.viewer || !this.entity) {\n return;\n }\n this.operate.positionEditing = status;\n if (status === true) {\n this.closeNodeEdit();\n this.event && this.event.destroy();\n this.event = new _Event_index__WEBPACK_IMPORTED_MODULE_16__[\"default\"](this.sdk);\n this.tip && this.tip.destroy();\n this.tip = new _MouseTip__WEBPACK_IMPORTED_MODULE_17__[\"default\"]('点击鼠标左键确认,右键取消', this.sdk);\n this.label && (this.label.entity.billboard.color = Cesium.Color.fromCssColorString(\"rgba(255,255,255,0.9)\"));\n this.picking = false;\n var positions = JSON.parse(JSON.stringify(this.options.positions));\n // let positions2 = JSON.parse(JSON.stringify(positions))\n // for (let i = 0; i < positions2.length; i++) {\n // let height = this.sdk.viewer.scene.globe.getHeight(Cesium.Cartographic.fromDegrees(positions2[i].lng, positions2[i].lat))\n // positions2[i] = Cesium.Cartesian3.fromDegrees(\n // positions2[i].lng,\n // positions2[i].lat,\n // Number((positions2[i].alt + Number(height)).toFixed(2))\n // )\n // }\n this.previous = {\n positions: _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default()(this.options.positions)\n };\n for (var i = 0; i < positions.length; i++) {\n positions[i] = Cesium.Cartesian3.fromDegrees(positions[i].lng, positions[i].lat, positions[i].alt);\n }\n var center = positions[Math.floor(positions.length / 2)];\n var disparity = [];\n for (var _i24 = 0; _i24 < positions.length; _i24++) {\n center.x - positions[_i24].x;\n disparity.push({\n x: center.x - positions[_i24].x,\n y: center.y - positions[_i24].y,\n z: center.z - positions[_i24].z\n });\n }\n var newpositions = [];\n this.event.mouse_move(function (movement, cartesian) {\n newpositions = [];\n for (var _i25 = 0; _i25 < disparity.length; _i25++) {\n var newP = {\n x: cartesian.x - disparity[_i25].x,\n y: cartesian.y - disparity[_i25].y,\n z: cartesian.z - disparity[_i25].z\n };\n // let pos84 = this.cartesian3Towgs84(\n // newP,\n // this.sdk.viewer\n // )\n // let height = this.sdk.viewer.scene.globe.getHeight(Cesium.Cartographic.fromDegrees(pos84.lng, pos84.lat))\n // pos84.alt = Number((pos84.alt + Number(height)).toFixed(2))\n // newP = Cesium.Cartesian3.fromDegrees(\n // pos84.lng,\n // pos84.lat,\n // pos84.alt\n // )\n newpositions.push(newP);\n }\n var position84 = _this21.cartesian3Towgs84(newpositions[0], _this21.sdk.viewer);\n _this21.label.position = [position84.lng, position84.lat, position84.alt];\n _this21.options.label.position = {\n lng: position84.lng,\n lat: position84.lat,\n alt: position84.alt\n };\n _this21.tip.setPosition(cartesian, movement.endPosition.x, movement.endPosition.y);\n });\n this.event.mouse_left(function (movement, cartesian) {\n _this21.event.mouse_move(function () {});\n _this21.event.mouse_left(function () {});\n _this21.event.mouse_right(function () {});\n newpositions = [];\n for (var _i26 = 0; _i26 < disparity.length; _i26++) {\n newpositions.push({\n x: cartesian.x - disparity[_i26].x,\n y: cartesian.y - disparity[_i26].y,\n z: cartesian.z - disparity[_i26].z\n });\n }\n var positionsLngLat = [];\n for (var _i27 = 0; _i27 < newpositions.length; _i27++) {\n var position = _this21.cartesian3Towgs84(newpositions[_i27], _this21.sdk.viewer);\n position.alt = _this21.options.positions[_i27].alt;\n positionsLngLat.push(position);\n _this21._elms.lng && (_this21._elms.lng[_i27].innerHTML = position.lng.toFixed(8));\n _this21._elms.lngInput && (_this21._elms.lngInput[_i27].value = position.lng.toFixed(8));\n _this21._elms.lat && (_this21._elms.lat[_i27].innerHTML = position.lat.toFixed(8));\n _this21._elms.latInput && (_this21._elms.latInput[_i27].value = position.lat.toFixed(8));\n _this21._elms.alt && (_this21._elms.alt[_i27].innerHTML = position.alt.toFixed(2));\n _this21._elms.altInput && (_this21._elms.altInput[_i27].value = position.alt.toFixed(2));\n }\n _this21.options.positions = positionsLngLat;\n _this21.previous.positions = positionsLngLat;\n\n // this.entity.polyline.positionsLngLat = positionsLngLat\n var fromDegreesArray = _this21.renewPositions(_this21.options.positions, function () {\n if (_this21._positionEditingCallback) {\n _this21._positionEditingCallback();\n _this21._positionEditingCallback = null;\n }\n });\n _this21.entity.polyline.positions = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray);\n _this21.renewPolygon(fromDegreesArray);\n _this21.positionEditing = false;\n });\n this.event.mouse_right(function (movement, cartesian) {\n _this21.event.mouse_move(function () {});\n _this21.event.mouse_left(function () {});\n _this21.event.mouse_right(function () {});\n _this21.positionEditing = false;\n });\n this.event.gesture_pinck_start(function (movement, cartesian) {\n var startTime = new Date();\n _this21.event.gesture_pinck_end(function () {\n var endTime = new Date();\n var pos = {\n position: {\n x: (movement.position1.x + movement.position2.x) / 2,\n y: (movement.position1.y + movement.position2.y) / 2\n }\n };\n if (endTime - startTime >= 500) {\n // 长按取消\n _this21.event.mouse_move(function () {});\n _this21.event.mouse_left(function () {});\n _this21.event.mouse_right(function () {});\n _this21.positionEditing = false;\n } else {\n leftEvent(pos, cartesian);\n }\n });\n });\n this.entity.polyline.positions = new Cesium.CallbackProperty(function () {\n if (newpositions.length > 0) {\n return newpositions;\n } else {\n return positions;\n }\n }, false);\n } else {\n if (!this.sdk || !this.sdk.viewer || !this.label || !this.label.entity) {\n this.label.entity.billboard.color = Cesium.Color.fromCssColorString(\"rgba(255,255,255,1)\");\n }\n this.picking = true;\n if (this.event) {\n this.event.mouse_move(function () {});\n this.event.mouse_left(function () {});\n this.event.mouse_right(function () {});\n this.event.destroy();\n }\n this.tip && this.tip.destroy();\n var fromDegreesArray = this.renewPositions(this.options.positions);\n this.entity.polyline.positions = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray);\n this.renewPolygon(fromDegreesArray);\n switch (this.heightMode) {\n case 0:\n case '0':\n case 1:\n case '1':\n this.label.position = [this.options.positions[0].lng, this.options.positions[0].lat, fromDegreesArray[2]];\n this.options.label.position = {\n lng: this.options.positions[0].lng,\n lat: this.options.positions[0].lat,\n alt: fromDegreesArray[2]\n };\n break;\n case 2:\n case '2':\n this.label.position = [this.options.positions[0].lng, this.options.positions[0].lat];\n this.options.label.position = {\n lng: this.options.positions[0].lng,\n lat: this.options.positions[0].lat,\n alt: fromDegreesArray[2]\n };\n break;\n }\n }\n }\n }, {\n key: \"openPositionEditing\",\n value: function openPositionEditing(cd) {\n this.positionEditing = true;\n this._positionEditingCallback = cd;\n }\n }, {\n key: \"lengthChangeCallBack\",\n get: function get() {\n return this._lengthChangeCallBack;\n },\n set: function set(cd) {\n this._lengthChangeCallBack = cd;\n }\n }, {\n key: \"setDIV\",\n value: function setDIV() {\n var _Cesium$Cartesian,\n _this22 = this;\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {\n domid: '',\n x: 10,\n y: 10\n };\n options.x = options.x || options.x === 0 ? options.x : 10;\n options.y = options.y || options.y === 0 ? options.y : 10;\n var points = [];\n for (var i = 0; i < this.options.positions.length; i++) {\n points.push([this.options.positions[i].lng, this.options.positions[i].lat]);\n }\n var line = turf.lineString(points);\n var length = turf.length(line, {\n units: 'kilometers'\n });\n var sliced = turf.lineSliceAlong(line, 0, length / 2, {\n units: 'kilometers'\n });\n var siteInfoDom = document.getElementById(options.domid);\n var siteInfoPosition = (_Cesium$Cartesian = Cesium.Cartesian3).fromDegrees.apply(_Cesium$Cartesian, _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default()(sliced.geometry.coordinates[sliced.geometry.coordinates.length - 1]));\n this.sdk.viewer.scene.postRender.addEventListener(function (percentage) {\n //转换到屏幕坐标\n if (siteInfoDom.style.display === 'block' || siteInfoDom.style.display === '') {\n var winpos = _this22.sdk.viewer.scene.cartesianToCanvasCoordinates(siteInfoPosition);\n if (winpos) {\n siteInfoDom.style.left = (winpos.x + options.x).toFixed(0) + 'px';\n siteInfoDom.style.top = (winpos.y + options.y).toFixed(0) + 'px';\n }\n }\n });\n }\n }], [{\n key: \"createLabel\",\n value: function () {\n var _createLabel = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee6(that) {\n var height, ground;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee6$(_context8) {\n while (1) switch (_context8.prev = _context8.next) {\n case 0:\n _context8.t0 = that.options.heightMode;\n _context8.next = _context8.t0 === '0' ? 3 : _context8.t0 === 0 ? 3 : _context8.t0 === '1' ? 6 : _context8.t0 === 1 ? 6 : _context8.t0 === '2' ? 13 : _context8.t0 === 2 ? 13 : 18;\n break;\n case 3:\n ground = false;\n height = that.options.positions[0].alt;\n return _context8.abrupt(\"break\", 18);\n case 6:\n ground = false;\n _context8.next = 9;\n return that.getClampToHeight({\n lng: that.options.positions[0].lng,\n lat: that.options.positions[0].lat\n });\n case 9:\n _context8.t1 = _context8.sent;\n _context8.t2 = that.options.positions[0].alt;\n height = _context8.t1 + _context8.t2;\n return _context8.abrupt(\"break\", 18);\n case 13:\n ground = true;\n _context8.next = 16;\n return that.getClampToHeight({\n lng: that.options.positions[0].lng,\n lat: that.options.positions[0].lat\n });\n case 16:\n height = _context8.sent;\n return _context8.abrupt(\"break\", 18);\n case 18:\n if (!that.options.label.position) {\n that.options.label.position = {\n lng: that.options.positions[0].lng,\n lat: that.options.positions[0].lat,\n alt: height\n };\n }\n that.label = new _LabelObject__WEBPACK_IMPORTED_MODULE_15__[\"default\"](that.sdk, {\n id: that.options.id,\n show: that.options.show ? that.options.label.show : false,\n position: [that.options.label.position.lng, that.options.label.position.lat, that.options.label.position.alt],\n text: that.options.name,\n fontSize: that.options.label.fontSize,\n fontFamily: that.options.label.fontFamily,\n color: that.options.label.color,\n pixelOffset: that.options.label.pixelOffset,\n backgroundColor: that.options.label.backgroundColor,\n lineColor: that.options.label.lineColor,\n lineWidth: that.options.label.lineWidth,\n scaleByDistance: that.options.label.scaleByDistance,\n near: that.options.label.near,\n far: that.options.label.far,\n ground: ground\n });\n case 20:\n case \"end\":\n return _context8.stop();\n }\n }, _callee6);\n }));\n function createLabel(_x3) {\n return _createLabel.apply(this, arguments);\n }\n return createLabel;\n }()\n }, {\n key: \"create\",\n value: function create(that) {\n var ground;\n if (that.heightMode == 2) {\n ground = true;\n } else {\n ground = false;\n }\n var positions = that.options.positions;\n var fromDegreesArray = that.renewPositions(positions);\n that.entity = that.sdk.viewer.entities.add({\n id: that.options.id,\n show: that.options.show,\n polyline: {\n positions: Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray),\n width: that.options.width,\n clampToGround: ground,\n // material: that.getMaterial(that.options.color, that.options.type, that.entity, that.options),\n zIndex: that.sdk._entityZIndex\n }\n });\n that.entity.polyline.oriWidth = that.options.width;\n that.judgeLine(that.entity, that.options);\n var params = _objectSpread({}, that.options);\n params.speed = that.inputSpeed;\n that.entity.polyline.material = that.getMaterial(that.options.color, that.options.type, that.entity, params);\n that.sdk._entityZIndex++;\n PolylineObject.createLabel(that);\n // that.entity.polyline.positionsLngLat = positions\n that.renewPolygon(fromDegreesArray);\n that.computeDistance(positions, 2, that.options.wordsName).then(function (res) {\n that.lengthByMeter = res;\n that.lengthChangeCallBack && that.lengthChangeCallBack();\n Object(_Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_19__[\"syncData\"])(that.sdk, that.options.id);\n });\n if (that.options.show) {\n Object(_Global_SplitScreen__WEBPACK_IMPORTED_MODULE_22__[\"setSplitDirection\"])(0, that.options.id);\n }\n\n // if (this.options.noseToTail) {\n // let array = []\n // for (let i = 0; i < fromDegreesArray.length; i += 2) {\n // array.push({ lng: fromDegreesArray[i], lat: fromDegreesArray[i + 1] })\n // }\n // this.options.fit_length = tool.computeDistance(array)\n // }\n // else {\n // this.options.fit_length = tool.computeDistance(positions)\n // }\n // if (this.options.fit_length_unit === 'km') {\n // this.options.fit_length = this.options.fit_length / 1000\n // }\n\n var scene = that.sdk.viewer.scene;\n }\n }]);\n}(_index__WEBPACK_IMPORTED_MODULE_11__[\"default\"]);\n/* harmony default export */ __webpack_exports__[\"default\"] = (PolylineObject);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvT2JqL0Jhc2UvUG9seWxpbmVPYmplY3QvaW5kZXguanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvT2JqL0Jhc2UvUG9seWxpbmVPYmplY3QvaW5kZXguanM/YmM3OSJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogQGRlc2NyaXB0aW9uIOe6v1xyXG4gKi9cclxuaW1wb3J0IERpYWxvZyBmcm9tICcuLi8uLi9FbGVtZW50L0RpYWxvZydcclxuaW1wb3J0IHsgaHRtbCB9IGZyb20gJy4vX2VsZW1lbnQnXHJcbmltcG9ydCBCYXNlIGZyb20gJy4uL2luZGV4J1xyXG5pbXBvcnQgY3lfdGFicyBmcm9tICcuLi8uLi9FbGVtZW50L2N5X2h0bWxfdGFicydcclxuaW1wb3J0IHJpY2hUZXh0IGZyb20gJy4uLy4uL0VsZW1lbnQvcmljaFRleHQnXHJcbmltcG9ydCBFdmVudEJpbmRpbmcgZnJvbSAnLi9ldmVudEJpbmRpbmcnXHJcbmltcG9ydCBMYWJlbE9iamVjdCBmcm9tICcuLi9MYWJlbE9iamVjdCdcclxuaW1wb3J0IE1vdXNlRXZlbnQgZnJvbSAnLi4vLi4vLi4vRXZlbnQvaW5kZXgnXHJcbmltcG9ydCBNb3VzZVRpcCBmcm9tICcuLi8uLi8uLi9Nb3VzZVRpcCdcclxuaW1wb3J0IENvbnRyb2xsZXIgZnJvbSAnLi4vLi4vLi4vQ29udHJvbGxlci9pbmRleCdcclxuaW1wb3J0IHsgc3luY0RhdGEsIGdldDNEVmlldyB9IGZyb20gJy4uLy4uLy4uL0dsb2JhbC9NdWx0aVZpZXdwb3J0TW9kZSdcclxuaW1wb3J0IHsgbGVncCB9IGZyb20gJy4uLy4uL0VsZW1lbnQvZGF0YWxpc3QnXHJcbmltcG9ydCB7IGdldEZvbnRMaXN0LCBnZXRGb250RmFtaWx5TmFtZSB9IGZyb20gJy4uLy4uL0VsZW1lbnQvZm9udFNlbGVjdCdcclxuaW1wb3J0IHsgc2V0U3BsaXREaXJlY3Rpb24sIHN5bmNTcGxpdERhdGEsIHNldEFjdGl2ZUlkIH0gZnJvbSAnLi4vLi4vLi4vR2xvYmFsL1NwbGl0U2NyZWVuJ1xyXG5pbXBvcnQgeyBzZXRBY3RpdmVWaWV3ZXIsIGNsb3NlUm90YXRlQXJvdW5kLCBjbG9zZVZpZXdGb2xsb3cgfSBmcm9tICcuLi8uLi8uLi9HbG9iYWwvZ2xvYmFsJ1xyXG5cclxuY2xhc3MgUG9seWxpbmVPYmplY3QgZXh0ZW5kcyBCYXNlIHtcclxuICAvKipcclxuICAgKiBAY29uc3RydWN0b3JcclxuICAgKiBAcGFyYW0gc2RrXHJcbiAgICogQGRlc2NyaXB0aW9uIOaKmOe6v1xyXG4gICAqIEBwYXJhbSBvcHRpb25zIHtvYmplY3R9IOe6v+WxnuaAp1xyXG4gICAqIEBwYXJhbSBvcHRpb25zLm5hbWV7c3RyaW5nfSDlkI3np7BcclxuICAgKiBAcGFyYW0gb3B0aW9ucy53aWR0aD0ze251bWJlcn0g57q/5a69XHJcbiAgICogQHBhcmFtIG9wdGlvbnMuY29sb3I9I2ZmMDAwMCB7c3RyaW5nfSDpopzoibJcclxuICAgKiBAcGFyYW0gb3B0aW9ucy50eXBlPTAge251bWJlcn0g5p2Q6LSo57G75Z6LIDAt5a6e57q/IDEt6Jma57q/IDIt5rOb5YWJLi4uXHJcbiAgICogQHBhcmFtIG9wdGlvbnMuaGVpZ2h0TW9kZT0ye251bWJlcn0g6auY5bqm5qih5byP77yIMO+8mua1t+aLlOmrmOW6pu+8mzHvvJrnm7jlr7npq5jluqbvvJsy77ya5L6d6ZmE5qih5byP77yJXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubm9zZVRvVGFpbD1mYWxzZSB7Ym9vbGVhbn0g6aaW5bC+55u46L+eXHJcbiAgICogQHBhcmFtIG9wdGlvbnMuc21vb3RoPWZhbHNlIHtib29sZWFufSDnur/mrrXlnIbmu5FcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5leHRlbmQ9ZmFsc2Uge2Jvb2xlYW59IOe6v+e8k+WGslxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmV4dGVuZFdpZHRoPTEwIHtudW1iZXJ9IOe6v+e8k+WGsuWuveW6plxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmV4dGVuZENvbG9yPXJnYmEoMjU1LDI1NSw4MCwwLjMpIHtudW1iZXJ9IOe6v+e8k+WGsuminOiJslxyXG4gICAqIEBwYXJhbSBvcHRpb25zLnNob3c9dHJ1ZSB7Ym9vbGVhbn0g5pi+6ZqQXHJcbiAgICogQHBhcmFtIHtBcnJheS48b2JqZWN0Pn0gb3B0aW9ucy5wb3NpdGlvbnMg5b+F5aGr77yM57uP57qs5bqm5ZKM6auY5bqm55qE5YiX6KGo77yM5YC85Lqk5pu/IFt7bG9uLGxhdCxhbHR9LC4uLl1cclxuICAgKiBAcGFyYW0gb3B0aW9ucy5wb3NpdGlvbnNbXS5sbmcge251bWJlcn0g57uP5bqmXHJcbiAgICogQHBhcmFtIG9wdGlvbnMucG9zaXRpb25zW10ubGF0IHtudW1iZXJ9IOe6rOW6plxyXG4gICAqIEBwYXJhbSBvcHRpb25zLnBvc2l0aW9uc1tdLmFsdCB7bnVtYmVyfSDpq5jluqZcclxuICAgKiBcclxuICAgKiBcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5ub3NlVG9UYWlsPWZhbHNlIHtib29sZWFufSDmmK/lkKbpppblsL7nm7jov55cclxuICAgKiBcclxuICAgKiBcclxuICAgKiBcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5sYWJlbCB7b2JqZWN0fSDmoIfnrb7lr7nosaFcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5sYWJlbC50ZXh0IHtzdHJpbmd9IOagh+etvuaWh+acrFxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLnNob3cge3N0cmluZ30g5qCH562+5pi+6ZqQXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwucG9zaXRpb24ge3N0cmluZ30g5qCH562+5L2N572uXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwucG9zaXRpb24ge29iamVjdH0g5qCH562+5L2N572uXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwucG9zaXRpb24ubG5nIHtudW1iZXJ9IOe7j+W6plxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLnBvc2l0aW9uLmxhdCB7bnVtYmVyfSDnuqzluqZcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5sYWJlbC5wb3NpdGlvbi5hbHQge251bWJlcn0g6auY5bqmXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwuZm9udFNpemU9MjAge251bWJlcn0g5a2X5L2T5aSn5bCPXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwuZm9udEZhbWlseT0wIHtudW1iZXJ9IOWtl+S9k+mhuSAw77ya6buR5L2T77ybMe+8muaAnea6kOm7keS9k++8mzLvvJrlup7pl6jmraPpgZPmoIfpopjkvZPvvJsz77ya5pWw6buR5L2TXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwuY29sb3I9I2ZmZmZmZiB7c3RyaW5nfSDlrZfkvZPpopzoibJcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5sYWJlbC5saW5lV2lkdGg9NCB7bnVtYmVyfSDlvJXnur/lrr1cclxuICAgKiBAcGFyYW0gb3B0aW9ucy5sYWJlbC5saW5lQ29sb3I9IzAwZmZmZjgwIHtzdHJpbmd9IOW8lee6v+minOiJslxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLnBpeGVsT2Zmc2V0PTIwIHtudW1iZXJ9IOWtl+S9k+WBj+enuyjlvJXnur/plb/luqYpXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwuYmFja2dyb3VuZENvbG9yPVsnIzAwZmZmZjgwJywgJyMwMGZmZmY4MCddIHthcnJheX0g6IOM5pmv6aKc6ImyXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwuc2NhbGVCeURpc3RhbmNlIHtib29sZWFufSDot53nprvnvKnmlL5cclxuICAgKiBAcGFyYW0gb3B0aW9ucy5sYWJlbC5uZWFyPTIwMDAge251bWJlcn0g6KeG6YeO57yp5pS+5pyA6L+R6Led56a7XHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwuZmFyPTEwMDAwMCB7bnVtYmVyfSDop4bph47nvKnmlL7mnIDov5zot53nprtcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5hdHRyaWJ1dGUge29iamVjdH0g5bGe5oCn5YaF5a65XHJcbiAgICogQHBhcmFtIG9wdGlvbnMuYXR0cmlidXRlLmxpbms9e30ge3N0cmluZ30g6ZO+5o6lXHJcbiAgICogQHBhcmFtIG9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudD1bXV0ge2FycmF5fSDpk77mjqXlhoXlrrlcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50W10ubmFtZSB7c3RyaW5nfSDpk77mjqXlkI3np7BcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50W10udXJsIHtzdHJpbmd9IOmTvuaOpeWcsOWdgFxyXG4gICAqIEBwYXJhbSBvcHRpb25zLnJpY2hUZXh0Q29udGVudCB7c3RyaW5nfSDlr4zmlofmnKzlhoXlrrlcclxuICAgKiBcclxuICAgKiBcclxuICAgKiBAcGFyYW0gX0RpYWxvZyB7b2JqZWN0fSDlvLnmoYbkuovku7ZcclxuICAgKiBAcGFyYW0gX0RpYWxvZy5jb25maXJtQ2FsbEJhY2sge2Z1bmN0aW9ufSDlvLnmoYbnoa7orqTml7bnmoTlm57osINcclxuICAgKiAqL1xyXG4gIGNvbnN0cnVjdG9yKHNkaywgb3B0aW9ucyA9IHt9LCBfRGlhbG9nID0ge30pIHtcclxuICAgIHN1cGVyKHNkaywgb3B0aW9ucylcclxuICAgIHRoaXMub3B0aW9ucy5uYW1lID0gb3B0aW9ucy5uYW1lIHx8ICfmnKrlkb3lkI3lr7nosaEnXHJcbiAgICB0aGlzLm9wdGlvbnMud2lkdGggPSAoKG9wdGlvbnMud2lkdGggfHwgb3B0aW9ucy53aWR0aCA9PT0gMCkgPyBvcHRpb25zLndpZHRoIDogMylcclxuICAgIHRoaXMub3B0aW9ucy5jb2xvciA9IG9wdGlvbnMuY29sb3IgfHwgJyNmZjAwMDAnXHJcbiAgICB0aGlzLm9wdGlvbnMudHlwZSA9IG9wdGlvbnMudHlwZSA/IE51bWJlcihvcHRpb25zLnR5cGUpIDogMFxyXG4gICAgdGhpcy5vcHRpb25zLm5vc2VUb1RhaWwgPSBvcHRpb25zLm5vc2VUb1RhaWwgfHwgZmFsc2VcclxuICAgIHRoaXMub3B0aW9ucy5zbW9vdGggPSBvcHRpb25zLnNtb290aCB8fCBmYWxzZVxyXG4gICAgdGhpcy5vcHRpb25zLmV4dGVuZCA9IG9wdGlvbnMuZXh0ZW5kIHx8IGZhbHNlXHJcbiAgICB0aGlzLm9wdGlvbnMucm90YXRlID0gKG9wdGlvbnMucm90YXRlIHx8IG9wdGlvbnMucm90YXRlID09PSBmYWxzZSkgPyBvcHRpb25zLnJvdGF0ZSA6IHRydWVcclxuICAgIHRoaXMub3B0aW9ucy5zcGFjZSA9IG9wdGlvbnMuc3BhY2UgfHwgMVxyXG4gICAgdGhpcy5vcHRpb25zLnNwZWVkID0gb3B0aW9ucy5zcGVlZCB8fCAxMFxyXG4gICAgLy8gdGhpcy5vcHRpb25zLmRhc2hTaXplID0gb3B0aW9ucy5kYXNoU2l6ZSB8fCAwLjAzXHJcbiAgICB0aGlzLm9wdGlvbnMud29yZHNOYW1lID0gb3B0aW9ucy53b3Jkc05hbWUgfHwgMFxyXG4gICAgdGhpcy5vcHRpb25zLmV4dGVuZFdpZHRoID1cclxuICAgICAgb3B0aW9ucy5leHRlbmRXaWR0aCB8fCBvcHRpb25zLmV4dGVuZFdpZHRoID09PSAwXHJcbiAgICAgICAgPyBvcHRpb25zLmV4dGVuZFdpZHRoXHJcbiAgICAgICAgOiAxMFxyXG4gICAgdGhpcy5vcHRpb25zLmV4dGVuZENvbG9yID0gb3B0aW9ucy5leHRlbmRDb2xvciB8fCAncmdiYSgyNTUsMjU1LDgwLDAuMyknXHJcbiAgICB0aGlzLm9wdGlvbnMuc2hvdyA9XHJcbiAgICAgIG9wdGlvbnMuc2hvdyB8fCBvcHRpb25zLnNob3cgPT09IGZhbHNlID8gb3B0aW9ucy5zaG93IDogdHJ1ZVxyXG4gICAgdGhpcy5vcHRpb25zLmhlaWdodE1vZGUgPSAob3B0aW9ucy5oZWlnaHRNb2RlIHx8IG9wdGlvbnMuaGVpZ2h0TW9kZSA9PSAwKSA/IG9wdGlvbnMuaGVpZ2h0TW9kZSA6IDJcclxuICAgIHRoaXMuX2VsbXMgPSBbXVxyXG4gICAgb3B0aW9ucy5sYWJlbCA9IG9wdGlvbnMubGFiZWwgfHwge31cclxuICAgIHRoaXMub3B0aW9ucy5sYWJlbCA9IHtcclxuICAgICAgdGV4dDogdGhpcy5vcHRpb25zLm5hbWUsXHJcbiAgICAgIHNob3c6IG9wdGlvbnMubGFiZWwuc2hvdyB8fCBmYWxzZSxcclxuICAgICAgcG9zaXRpb246IG9wdGlvbnMubGFiZWwucG9zaXRpb24sXHJcbiAgICAgIGZvbnRTaXplOlxyXG4gICAgICAgIG9wdGlvbnMubGFiZWwuZm9udFNpemUgfHwgb3B0aW9ucy5sYWJlbC5mb250U2l6ZSA9PT0gMFxyXG4gICAgICAgICAgPyBvcHRpb25zLmxhYmVsLmZvbnRTaXplXHJcbiAgICAgICAgICA6IDIwLFxyXG4gICAgICBmb250RmFtaWx5OiBvcHRpb25zLmxhYmVsLmZvbnRGYW1pbHkgPyBvcHRpb25zLmxhYmVsLmZvbnRGYW1pbHkgOiAwLFxyXG4gICAgICBjb2xvcjogb3B0aW9ucy5sYWJlbC5jb2xvciB8fCAnI2ZmZmZmZicsXHJcbiAgICAgIGxpbmVXaWR0aDpcclxuICAgICAgICBvcHRpb25zLmxhYmVsLmxpbmVXaWR0aCB8fCBvcHRpb25zLmxhYmVsLmxpbmVXaWR0aCA9PT0gMFxyXG4gICAgICAgICAgPyBvcHRpb25zLmxhYmVsLmxpbmVXaWR0aFxyXG4gICAgICAgICAgOiA0LFxyXG4gICAgICBwaXhlbE9mZnNldDpcclxuICAgICAgICBvcHRpb25zLmxhYmVsLnBpeGVsT2Zmc2V0IHx8IG9wdGlvbnMubGFiZWwucGl4ZWxPZmZzZXQgPT09IDBcclxuICAgICAgICAgID8gb3B0aW9ucy5sYWJlbC5waXhlbE9mZnNldFxyXG4gICAgICAgICAgOiAyMCxcclxuICAgICAgYmFja2dyb3VuZENvbG9yOiBvcHRpb25zLmxhYmVsLmJhY2tncm91bmRDb2xvciB8fCBbJyMwMGZmZmY4MCcsICcjMDBmZmZmODAnXSxcclxuICAgICAgbGluZUNvbG9yOiBvcHRpb25zLmxhYmVsLmxpbmVDb2xvciB8fCAnIzAwZmZmZjgwJyxcclxuICAgICAgc2NhbGVCeURpc3RhbmNlOiBvcHRpb25zLmxhYmVsLnNjYWxlQnlEaXN0YW5jZSB8fCBmYWxzZSxcclxuICAgICAgbmVhcjpcclxuICAgICAgICBvcHRpb25zLmxhYmVsLm5lYXIgfHwgb3B0aW9ucy5sYWJlbC5uZWFyID09PSAwXHJcbiAgICAgICAgICA/IG9wdGlvbnMubGFiZWwubmVhclxyXG4gICAgICAgICAgOiAyMDAwLFxyXG4gICAgICBmYXI6XHJcbiAgICAgICAgb3B0aW9ucy5sYWJlbC5mYXIgfHwgb3B0aW9ucy5sYWJlbC5mYXIgPT09IDBcclxuICAgICAgICAgID8gb3B0aW9ucy5sYWJlbC5mYXJcclxuICAgICAgICAgIDogMTAwMDAwXHJcbiAgICB9XHJcbiAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlID0gb3B0aW9ucy5hdHRyaWJ1dGUgfHwge31cclxuICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluayA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluayB8fCB7fVxyXG4gICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnQgPVxyXG4gICAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudCB8fCBbXVxyXG4gICAgLy8gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5jYW1lcmEgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmNhbWVyYSB8fCB7fVxyXG4gICAgLy8gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5jYW1lcmEuY29udGVudCA9XHJcbiAgICAvLyAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUuY2FtZXJhLmNvbnRlbnQgfHwgW11cclxuICAgIC8vIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyIHx8IHt9XHJcbiAgICAvLyB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnQgPVxyXG4gICAgLy8gICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnQgfHwgW11cclxuICAgIC8vIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUuZ29vZHMgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmdvb2RzIHx8IHt9XHJcbiAgICAvLyB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmdvb2RzLmNvbnRlbnQgPVxyXG4gICAgLy8gICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmdvb2RzLmNvbnRlbnQgfHwgW11cclxuXHJcbiAgICAgIGRlbGV0ZSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmNhbWVyYVxyXG4gICAgICBkZWxldGUgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52clxyXG4gICAgICBkZWxldGUgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5nb29kc1xyXG5cclxuXHJcbiAgICB0aGlzLm9wZXJhdGUgPSB7fVxyXG4gICAgdGhpcy5ub2RlUG9pbnRzID0gW11cclxuICAgIHRoaXMudW5pdE51bSA9IDBcclxuICAgIHRoaXMuaW5wdXRTcGVlZCA9IChvcHRpb25zLnNwZWVkICYmIE1hdGgucG93KG9wdGlvbnMuc3BlZWQsIC0xKSAqIDEwMCkgfHwgMTBcclxuICAgIHRoaXMuRGlhbG9nID0gX0RpYWxvZ1xyXG4gICAgaWYgKCF0aGlzLm9wdGlvbnMucG9zaXRpb25zIHx8IHRoaXMub3B0aW9ucy5wb3NpdGlvbnMubGVuZ3RoIDwgMikge1xyXG4gICAgICB0aGlzLl9lcnJvciA9ICfnur/mrrXmnIDlsJHpnIDopoHkuKTkuKrlnZDmoIfvvIEnXHJcbiAgICAgIGNvbnNvbGUud2Fybih0aGlzLl9lcnJvcilcclxuICAgICAgd2luZG93LkVMRU1FTlQgJiZcclxuICAgICAgICB3aW5kb3cuRUxFTUVOVC5NZXNzYWdlKHtcclxuICAgICAgICAgIG1lc3NhZ2U6IHRoaXMuX2Vycm9yLFxyXG4gICAgICAgICAgdHlwZTogJ3dhcm5pbmcnLFxyXG4gICAgICAgICAgZHVyYXRpb246IDE1MDBcclxuICAgICAgICB9KVxyXG4gICAgfSBlbHNlIHtcclxuXHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5vcHRpb25zLnBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubG5nID0gTnVtYmVyKE51bWJlcih0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxuZykudG9GaXhlZCg4KSlcclxuICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxhdCA9IE51bWJlcihOdW1iZXIodGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sYXQpLnRvRml4ZWQoOCkpXHJcbiAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5hbHQgPSBOdW1iZXIoTnVtYmVyKHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0uYWx0KS50b0ZpeGVkKDIpKVxyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLnNkay5hZGRJbmNldGFuY2UodGhpcy5vcHRpb25zLmlkLCB0aGlzKVxyXG4gICAgICBQb2x5bGluZU9iamVjdC5jcmVhdGUodGhpcylcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCBjb2xvcigpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuY29sb3JcclxuICB9XHJcbiAgc2V0IGNvbG9yKHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5jb2xvciA9IHYgfHwgJyNmZjAwMDAnXHJcbiAgICBsZXQgcGFyYW1zID0geyAuLi50aGlzLm9wdGlvbnMgfVxyXG4gICAgcGFyYW1zLnNwZWVkID0gdGhpcy5pbnB1dFNwZWVkXHJcbiAgICAvLyB0aGlzLmVudGl0eS5wb2x5bGluZS5tYXRlcmlhbCA9IHRoaXMuZ2V0TWF0ZXJpYWwodGhpcy5vcHRpb25zLmNvbG9yLCB0aGlzLm9wdGlvbnMudHlwZSwgdGhpcy5lbnRpdHksIHRoaXMub3B0aW9ucylcclxuICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLm1hdGVyaWFsID0gdGhpcy5nZXRNYXRlcmlhbCh0aGlzLm9wdGlvbnMuY29sb3IsIHRoaXMub3B0aW9ucy50eXBlLCB0aGlzLmVudGl0eSwgcGFyYW1zKVxyXG4gICAgaWYgKHRoaXMuX2VsbXMuY29sb3IpIHtcclxuICAgICAgdGhpcy5fZWxtcy5jb2xvci5mb3JFYWNoKChpdGVtLCBpKSA9PiB7XHJcbiAgICAgICAgbGV0IGNvbG9yUGlja2VyID0gbmV3IFlKQ29sb3JQaWNrZXIoe1xyXG4gICAgICAgICAgZWw6IGl0ZW0uZWwsXHJcbiAgICAgICAgICBzaXplOiAnbWluaScsIC8v6aKc6ImyYm9457G75Z6LXHJcbiAgICAgICAgICBhbHBoYTogdHJ1ZSwgLy/mmK/lkKblvIDlkK/pgI/mmI7luqZcclxuICAgICAgICAgIGRlZmF1bHRDb2xvcjogdGhpcy5vcHRpb25zLmNvbG9yLFxyXG4gICAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLCAvL+aYr+WQpuemgeatouaJk+W8gOminOiJsumAieaLqeWZqFxyXG4gICAgICAgICAgb3BlblBpY2tlckFuaTogJ29wYWNpdHknLCAvL+aJk+W8gOminOiJsumAieaLqeWZqOWKqOeUu1xyXG4gICAgICAgICAgc3VyZTogYyA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuY29sb3IgPSBjXHJcbiAgICAgICAgICB9LCAvL+eCueWHu+ehruiupOaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICAgICAgY2xlYXI6ICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5jb2xvciA9ICdyZ2JhKDI1NSwwLDAsMSknXHJcbiAgICAgICAgICB9IC8v54K55Ye75riF56m65oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgICAgfSlcclxuICAgICAgICB0aGlzLl9lbG1zLmNvbG9yW2ldID0gY29sb3JQaWNrZXJcclxuICAgICAgfSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCBzcGVlZCgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuc3BlZWRcclxuICB9XHJcblxyXG4gIHNldCBzcGVlZCh2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMuc3BlZWQgPSB2XHJcbiAgICB0aGlzLmlucHV0U3BlZWQgPSB2ICE9PSAwID8gTWF0aC5wb3codiwgLTEpICogMTAwIDogMFxyXG4gICAgbGV0IHBhcmFtcyA9IHsgLi4udGhpcy5vcHRpb25zIH1cclxuICAgIHBhcmFtcy5zcGVlZCA9IHRoaXMuaW5wdXRTcGVlZFxyXG4gICAgLy8gdGhpcy5vcHRpb25zLnNwZWVkID0gdiAhPT0gMCA/IE1hdGgucG93KHYsIC0xKSAqIDEwMCA6IDBcclxuICAgIC8vIHRoaXMuZW50aXR5LnBvbHlsaW5lLm1hdGVyaWFsID0gdGhpcy5nZXRNYXRlcmlhbCh0aGlzLm9wdGlvbnMuY29sb3IsIHRoaXMub3B0aW9ucy50eXBlLCB0aGlzLmVudGl0eSwgdGhpcy5vcHRpb25zKVxyXG4gICAgdGhpcy5lbnRpdHkucG9seWxpbmUubWF0ZXJpYWwgPSB0aGlzLmdldE1hdGVyaWFsKHRoaXMub3B0aW9ucy5jb2xvciwgdGhpcy5vcHRpb25zLnR5cGUsIHRoaXMuZW50aXR5LCBwYXJhbXMpXHJcbiAgfVxyXG4gIC8vIGdldCBkYXNoU2l6ZSgpIHtcclxuICAvLyAgIHJldHVybiB0aGlzLm9wdGlvbnMuZGFzaFNpemVcclxuICAvLyB9XHJcblxyXG4gIC8vIHNldCBkYXNoU2l6ZSh2KSB7XHJcbiAgLy8gICB0aGlzLm9wdGlvbnMuZGFzaFNpemUgPSB2XHJcbiAgLy8gICBsZXQgcGFyYW1zID0geyAuLi50aGlzLm9wdGlvbnMgfVxyXG4gIC8vICAgcGFyYW1zLnNwZWVkID0gdGhpcy5pbnB1dFNwZWVkXHJcbiAgLy8gICAvLyB0aGlzLmVudGl0eS5wb2x5bGluZS5tYXRlcmlhbCA9IHRoaXMuZ2V0TWF0ZXJpYWwodGhpcy5vcHRpb25zLmNvbG9yLCB0aGlzLm9wdGlvbnMudHlwZSwgdGhpcy5lbnRpdHksIHRoaXMub3B0aW9ucylcclxuICAvLyAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLm1hdGVyaWFsID0gdGhpcy5nZXRNYXRlcmlhbCh0aGlzLm9wdGlvbnMuY29sb3IsIHRoaXMub3B0aW9ucy50eXBlLCB0aGlzLmVudGl0eSwgcGFyYW1zKVxyXG4gIC8vIH1cclxuXHJcbiAgZ2V0IHJvdGF0ZSgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMucm90YXRlXHJcbiAgfVxyXG5cclxuICBzZXQgcm90YXRlKHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5yb3RhdGUgPSB2XHJcbiAgICB0aGlzLmNsb3NlTm9kZUVkaXQoKVxyXG4gICAgdGhpcy5fZWxtcy5yb3RhdGUgJiZcclxuICAgICAgdGhpcy5fZWxtcy5yb3RhdGUuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICBpdGVtLmNoZWNrZWQgPSB2XHJcbiAgICAgIH0pXHJcblxyXG4gICAgdGhpcy5vcHRpb25zLnJvdGF0ZSA9IHZcclxuICAgIGxldCBwYXJhbXMgPSB7IC4uLnRoaXMub3B0aW9ucyB9XHJcbiAgICBwYXJhbXMuc3BlZWQgPSB0aGlzLmlucHV0U3BlZWRcclxuICAgIC8vIHRoaXMuZW50aXR5LnBvbHlsaW5lLm1hdGVyaWFsID0gdGhpcy5nZXRNYXRlcmlhbCh0aGlzLm9wdGlvbnMuY29sb3IsIHRoaXMub3B0aW9ucy50eXBlLCB0aGlzLmVudGl0eSwgdGhpcy5vcHRpb25zKVxyXG4gICAgdGhpcy5lbnRpdHkucG9seWxpbmUubWF0ZXJpYWwgPSB0aGlzLmdldE1hdGVyaWFsKHRoaXMub3B0aW9ucy5jb2xvciwgdGhpcy5vcHRpb25zLnR5cGUsIHRoaXMuZW50aXR5LCBwYXJhbXMpXHJcbiAgfVxyXG5cclxuICBnZXQgc3BhY2UoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLnNwYWNlXHJcbiAgfVxyXG5cclxuICBzZXQgc3BhY2Uodikge1xyXG4gICAgdGhpcy5vcHRpb25zLnNwYWNlID0gdlxyXG4gICAgbGV0IHBhcmFtcyA9IHsgLi4udGhpcy5vcHRpb25zIH1cclxuICAgIHBhcmFtcy5zcGVlZCA9IHRoaXMuaW5wdXRTcGVlZFxyXG4gICAgLy8gdGhpcy5lbnRpdHkucG9seWxpbmUubWF0ZXJpYWwgPSB0aGlzLmdldE1hdGVyaWFsKHRoaXMub3B0aW9ucy5jb2xvciwgdGhpcy5vcHRpb25zLnR5cGUsIHRoaXMuZW50aXR5LCB0aGlzLm9wdGlvbnMpXHJcbiAgICB0aGlzLmVudGl0eS5wb2x5bGluZS5tYXRlcmlhbCA9IHRoaXMuZ2V0TWF0ZXJpYWwodGhpcy5vcHRpb25zLmNvbG9yLCB0aGlzLm9wdGlvbnMudHlwZSwgdGhpcy5lbnRpdHksIHBhcmFtcylcclxuICB9XHJcblxyXG4gIGdldCB3b3Jkc05hbWUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLndvcmRzTmFtZVxyXG4gIH1cclxuICBzZXQgd29yZHNOYW1lKHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy53b3Jkc05hbWUgPSB2XHJcblxyXG4gICAgbGV0IF90aGlzID0gdGhpc1xyXG4gICAgaWYgKCF0aGlzLm5vc2VUb1RhaWwpIHtcclxuICAgICAgdGhpcy5jb21wdXRlRGlzdGFuY2UoXHJcbiAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9ucyxcclxuICAgICAgICAyLFxyXG4gICAgICAgIHZcclxuICAgICAgKS50aGVuKHJlcyA9PiB7XHJcbiAgICAgICAgLy8gX3RoaXMub3B0aW9ucy5sZW5ndGhCeU1ldGVyID0gcmVzXHJcbiAgICAgICAgLy8gaWYgKHJlcyA+IDEwMDAgfHwgcmVzID09IDEwMDApIHtcclxuICAgICAgICAvLyAgIF90aGlzLmxlbmd0aCA9IChyZXMgLyAxMDAwKS50b0ZpeGVkKDUpXHJcbiAgICAgICAgLy8gICBfdGhpcy5sZW5ndGhVbml0ID0gJ+WNg+exsydcclxuICAgICAgICAvLyB9IGVsc2Uge1xyXG4gICAgICAgIC8vICAgX3RoaXMubGVuZ3RoID0gcmVzXHJcbiAgICAgICAgLy8gICBfdGhpcy5sZW5ndGhVbml0ID0gJ+exsydcclxuICAgICAgICAvLyB9XHJcbiAgICAgICAgX3RoaXMubGVuZ3RoQnlNZXRlciA9IHJlc1xyXG4gICAgICAgIHRoaXMubGVuZ3RoQ2hhbmdlQ2FsbEJhY2sgJiYgdGhpcy5sZW5ndGhDaGFuZ2VDYWxsQmFjaygpXHJcbiAgICAgIH0pXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBsZXQgZnJvbURlZ3JlZXNBcnJheSA9IHRoaXMucmVuZXdQb3NpdGlvbnModGhpcy5vcHRpb25zLnBvc2l0aW9ucylcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIGdldCBmaXRMZW5ndGhVbml0KCkge1xyXG4gIC8vICAgcmV0dXJuIHRoaXMub3B0aW9ucy5maXRMZW5ndGhVbml0XHJcbiAgLy8gfVxyXG4gIC8vIHNldCBmaXRMZW5ndGhVbml0KHYpIHtcclxuICAvLyAgIHRoaXMub3B0aW9ucy5maXRMZW5ndGhVbml0ID0gdlxyXG4gIC8vICAgdGhpcy5fZWxtcy5maXRMZW5ndGhVbml0ICYmXHJcbiAgLy8gICAgIHRoaXMuX2VsbXMuZml0TGVuZ3RoVW5pdC5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gIC8vICAgICAgIGl0ZW0udmFsdWUgPSB2XHJcbiAgLy8gICAgIH0pXHJcbiAgLy8gICBpZiAodGhpcy5maXRMZW5ndGhCeU1ldGVyKSB7XHJcbiAgLy8gICAgIHN3aXRjaCAodikge1xyXG4gIC8vICAgICAgIGNhc2UgJ+exsyc6XHJcbiAgLy8gICAgICAgICB0aGlzLmZpdExlbmd0aCA9IHRoaXMuZml0TGVuZ3RoQnlNZXRlclxyXG4gIC8vICAgICAgICAgYnJlYWtcclxuICAvLyAgICAgICBjYXNlICfljYPnsbMnOlxyXG4gIC8vICAgICAgICAgdGhpcy5maXRMZW5ndGggPSBOdW1iZXIoXHJcbiAgLy8gICAgICAgICAgICh0aGlzLmZpdExlbmd0aEJ5TWV0ZXIgLyAxMDAwKS50b0ZpeGVkKDUpXHJcbiAgLy8gICAgICAgICApXHJcbiAgLy8gICAgICAgICBicmVha1xyXG4gIC8vICAgICAgIGRlZmF1bHQ6XHJcbiAgLy8gICAgICAgICB0aGlzLmZpdExlbmd0aCA9IHRoaXMuZml0TGVuZ3RoQnlNZXRlclxyXG4gIC8vICAgICB9XHJcbiAgLy8gICB9XHJcbiAgLy8gfVxyXG5cclxuICBnZXQgbGluZVdpZHRoKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy53aWR0aFxyXG4gIH1cclxuXHJcbiAgc2V0IGxpbmVXaWR0aCh2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMud2lkdGggPSAodiB8fCB2ID09IDApID8gdiA6IDNcclxuICAgIHRoaXMuX2VsbXMubGluZVdpZHRoICYmXHJcbiAgICAgIHRoaXMuX2VsbXMubGluZVdpZHRoLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgaXRlbS52YWx1ZSA9IHRoaXMub3B0aW9ucy53aWR0aFxyXG4gICAgICB9KVxyXG4gICAgaWYgKHRoaXMuZW50aXR5ICYmIHRoaXMuZW50aXR5LnBvbHlsaW5lKSB7XHJcbiAgICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLndpZHRoID0gdGhpcy5lbnRpdHkucG9seWxpbmUud2lkdGggKyB2IC0gdGhpcy5lbnRpdHkucG9seWxpbmUub3JpV2lkdGhcclxuICAgICAgdGhpcy5lbnRpdHkucG9seWxpbmUub3JpV2lkdGggPSB0aGlzLm9wdGlvbnMud2lkdGhcclxuICAgIH1cclxuICAgIC8vIHRoaXMuZW50aXR5ICYmXHJcbiAgICAvLyAgIHRoaXMuZW50aXR5LnBvbHlsaW5lICYmXHJcbiAgICAvLyAgICh0aGlzLmVudGl0eS5wb2x5bGluZS53aWR0aCA9IHRoaXMub3B0aW9ucy53aWR0aCkgJiYgKHRoaXMuZW50aXR5LnBvbHlsaW5lLm9yaVdpZHRoID0gdGhpcy5vcHRpb25zLndpZHRoKVxyXG4gIH1cclxuXHJcbiAgZ2V0IGxpbmVUeXBlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy50eXBlXHJcbiAgfVxyXG5cclxuICBzZXQgbGluZVR5cGUodikge1xyXG4gICAgbGV0IGxpbmVUeXBlRGF0YSA9IFtcclxuICAgICAge1xyXG4gICAgICAgIG5hbWU6ICc8aSBjbGFzcz1cImljb24gbGluZVwiPjwvaT7lrp7nur8nLFxyXG4gICAgICAgIHZhbHVlOiAn5a6e57q/JyxcclxuICAgICAgICBrZXk6IDAsXHJcbiAgICAgICAgaWNvbjogJ2xpbmUnXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBuYW1lOiAnPGkgY2xhc3M9XCJpY29uIGRhc2gtbGluZVwiPjwvaT7omZrnur8nLFxyXG4gICAgICAgIHZhbHVlOiAn6Jma57q/JyxcclxuICAgICAgICBrZXk6IDEsXHJcbiAgICAgICAgaWNvbjogJ2Rhc2gtbGluZSdcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIG5hbWU6ICc8aSBjbGFzcz1cImljb24gbGlnaHQtbGluZVwiPjwvaT7ms5vlhYknLFxyXG4gICAgICAgIHZhbHVlOiAn5rOb5YWJJyxcclxuICAgICAgICBrZXk6IDIsXHJcbiAgICAgICAgaWNvbjogJ2xpZ2h0LWxpbmUnXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBuYW1lOiAnPGkgY2xhc3M9XCJpY29uIHRhaWwtbGluZVwiPjwvaT7lsL7ov7nlhYnnur8nLFxyXG4gICAgICAgIHZhbHVlOiAn5bC+6L+55YWJ57q/JyxcclxuICAgICAgICBrZXk6IDMsXHJcbiAgICAgICAgaWNvbjogJ3RhaWwtbGluZSdcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIG5hbWU6ICc8aSBjbGFzcz1cImljb24gbXVsdC10YWlsLWxpbmVcIj48L2k+5aSa5bC+6L+55YWJ57q/JyxcclxuICAgICAgICB2YWx1ZTogJ+WkmuWwvui/ueWFiee6vycsXHJcbiAgICAgICAga2V5OiA0LFxyXG4gICAgICAgIGljb246ICdtdWx0LXRhaWwtbGluZSdcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIG5hbWU6ICc8aSBjbGFzcz1cImljb24gZmxvdy1kYXNoLWxpbmUxXCI+PC9pPua1geWKqOiZmue6vzEnLFxyXG4gICAgICAgIHZhbHVlOiAn5rWB5Yqo6Jma57q/MScsXHJcbiAgICAgICAga2V5OiA1LFxyXG4gICAgICAgIGljb246ICdmbG93LWRhc2gtbGluZTEnXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBuYW1lOiAnPGkgY2xhc3M9XCJpY29uIGZsb3ctZGFzaC1saW5lMlwiPjwvaT7mtYHliqjomZrnur8yJyxcclxuICAgICAgICB2YWx1ZTogJ+a1geWKqOiZmue6vzInLFxyXG4gICAgICAgIGtleTogNixcclxuICAgICAgICBpY29uOiAnZmxvdy1kYXNoLWxpbmUyJ1xyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgbmFtZTogJzxpIGNsYXNzPVwiaWNvbiBwaWMtbGluZTFcIj48L2k+5rWB5Yqo566t5aS0MScsXHJcbiAgICAgICAgdmFsdWU6ICfmtYHliqjnrq3lpLQxJyxcclxuICAgICAgICBrZXk6IDcsXHJcbiAgICAgICAgaWNvbjogJ3BpYy1saW5lMSdcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIG5hbWU6ICc8aSBjbGFzcz1cImljb24gcGljLWxpbmUyXCI+PC9pPua1geWKqOeureWktDInLFxyXG4gICAgICAgIHZhbHVlOiAn5rWB5Yqo566t5aS0MicsXHJcbiAgICAgICAga2V5OiA4LFxyXG4gICAgICAgIGljb246ICdwaWMtbGluZTInXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBuYW1lOiAnPGkgY2xhc3M9XCJpY29uIHBpYy1saW5lM1wiPjwvaT7mtYHliqjnrq3lpLQzJyxcclxuICAgICAgICB2YWx1ZTogJ+a1geWKqOeureWktDMnLFxyXG4gICAgICAgIGtleTogOSxcclxuICAgICAgICBpY29uOiAncGljLWxpbmUzJ1xyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgbmFtZTogJzxpIGNsYXNzPVwiaWNvbiBwaWMtbGluZTRcIj48L2k+5rWB5Yqo566t5aS0NCcsXHJcbiAgICAgICAgdmFsdWU6ICfmtYHliqjnrq3lpLQ0JyxcclxuICAgICAgICBrZXk6IDEwLFxyXG4gICAgICAgIGljb246ICdwaWMtbGluZTQnXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBuYW1lOiAnPGkgY2xhc3M9XCJpY29uIHBpYy1saW5lNVwiPjwvaT7mtYHliqjnrq3lpLQ1JyxcclxuICAgICAgICB2YWx1ZTogJ+a1geWKqOeureWktDUnLFxyXG4gICAgICAgIGtleTogMTEsXHJcbiAgICAgICAgaWNvbjogJ3BpYy1saW5lNSdcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIG5hbWU6ICc8aSBjbGFzcz1cImljb24gcGljLWxpbmU2XCI+PC9pPua1geWKqOeureWktDYnLFxyXG4gICAgICAgIHZhbHVlOiAn5rWB5Yqo566t5aS0NicsXHJcbiAgICAgICAga2V5OiAxMixcclxuICAgICAgICBpY29uOiAncGljLWxpbmU2J1xyXG4gICAgICB9XHJcbiAgICBdXHJcbiAgICB0aGlzLm9wdGlvbnMudHlwZSA9IE51bWJlcih2KVxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lVHlwZURhdGEubGVuZ3RoOyBpKyspIHtcclxuICAgICAgaWYgKGxpbmVUeXBlRGF0YVtpXS5rZXkgPT09IE51bWJlcih2KSkge1xyXG4gICAgICAgIHRoaXMuX2VsbXMubGluZVR5cGUgJiZcclxuICAgICAgICAgIHRoaXMuX2VsbXMubGluZVR5cGUuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICAgICAgaXRlbS52YWx1ZSA9IGxpbmVUeXBlRGF0YVtpXS52YWx1ZVxyXG4gICAgICAgICAgICBpZiAoMiA8IGl0ZW0udmFsdWUgJiYgaXRlbS52YWx1ZSA8IDEzKSB7Ly/otLTlm77lj4LmlbBcclxuICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGFzaFRleHR1cmVEb20nKSAmJiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rhc2hUZXh0dXJlRG9tJykuc3R5bGUuZGlzcGxheSA9ICdmbGV4JylcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGFzaFRleHR1cmVEb20nKSAmJiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rhc2hUZXh0dXJlRG9tJykuc3R5bGUuZGlzcGxheSA9ICdub25lJylcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoMiA8IGl0ZW0udmFsdWUgJiYgaXRlbS52YWx1ZSA8IDUpIHsvL+Wwvui/ueWPguaVsFxyXG4gICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xpbmVTcGFjZScpWzBdICYmIChkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdsaW5lU3BhY2UnKVswXS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnKVxyXG4gICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xpbmVTcGFjZScpWzFdICYmIChkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdsaW5lU3BhY2UnKVsxXS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnKVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xpbmVTcGFjZScpWzBdICYmIChkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdsaW5lU3BhY2UnKVswXS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnKVxyXG4gICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xpbmVTcGFjZScpWzFdICYmIChkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdsaW5lU3BhY2UnKVsxXS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIGJyZWFrXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGxldCBwYXJhbXMgPSB7IC4uLnRoaXMub3B0aW9ucyB9XHJcbiAgICBwYXJhbXMuc3BlZWQgPSB0aGlzLmlucHV0U3BlZWRcclxuICAgIHRoaXMuZW50aXR5ICYmXHJcbiAgICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lICYmXHJcbiAgICAgICh0aGlzLmVudGl0eS5wb2x5bGluZS5tYXRlcmlhbCA9IHRoaXMuZ2V0TWF0ZXJpYWwoXHJcbiAgICAgICAgdGhpcy5vcHRpb25zLmNvbG9yLFxyXG4gICAgICAgIHRoaXMub3B0aW9ucy50eXBlLFxyXG4gICAgICAgIHRoaXMuZW50aXR5LFxyXG4gICAgICAgIHBhcmFtc1xyXG4gICAgICApKVxyXG4gIH1cclxuICBnZXQgbm9zZVRvVGFpbCgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubm9zZVRvVGFpbFxyXG4gIH1cclxuXHJcbiAgc2V0IG5vc2VUb1RhaWwodikge1xyXG4gICAgdGhpcy5vcHRpb25zLm5vc2VUb1RhaWwgPSB2XHJcbiAgICB0aGlzLmNsb3NlTm9kZUVkaXQoKVxyXG4gICAgdGhpcy5fZWxtcy5ub3NlVG9UYWlsICYmXHJcbiAgICAgIHRoaXMuX2VsbXMubm9zZVRvVGFpbC5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgIGl0ZW0uY2hlY2tlZCA9IHZcclxuICAgICAgfSlcclxuICAgIGlmICh0aGlzLmVudGl0eSkge1xyXG4gICAgICBsZXQgZnJvbURlZ3JlZXNBcnJheSA9IHRoaXMucmVuZXdQb3NpdGlvbnModGhpcy5vcHRpb25zLnBvc2l0aW9ucylcclxuICAgICAgdGhpcy5lbnRpdHkucG9seWxpbmUucG9zaXRpb25zID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXNBcnJheUhlaWdodHMoXHJcbiAgICAgICAgZnJvbURlZ3JlZXNBcnJheVxyXG4gICAgICApXHJcbiAgICAgIHRoaXMucmVuZXdQb2x5Z29uKGZyb21EZWdyZWVzQXJyYXkpXHJcbiAgICB9XHJcbiAgICAvLyBpZiAodikge1xyXG4gICAgLy8gICBpZiAodGhpcy5vcHRpb25zLmZpdExlbmd0aEJ5TWV0ZXIgPiAxMDAwIHx8IHRoaXMub3B0aW9ucy5maXRMZW5ndGhCeU1ldGVyID09IDEwMDApIHtcclxuICAgIC8vICAgICBsZXQgZG9tID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaW5wdXQtc2VsZWN0LXVuaXQnKVsxXVxyXG4gICAgLy8gICAgIGRvbSAmJiBkb20ucXVlcnlTZWxlY3RvckFsbCgnZGQnKVsxXSAmJiBkb20ucXVlcnlTZWxlY3RvckFsbCgnZGQnKVsxXS5jbGljaygpXHJcbiAgICAvLyAgIH0gZWxzZSB7XHJcbiAgICAvLyAgICAgbGV0IGRvbSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2lucHV0LXNlbGVjdC11bml0JylbMV1cclxuICAgIC8vICAgICBkb20gJiYgZG9tLnF1ZXJ5U2VsZWN0b3JBbGwoJ2RkJylbMF0gJiYgZG9tLnF1ZXJ5U2VsZWN0b3JBbGwoJ2RkJylbMF0uY2xpY2soKVxyXG4gICAgLy8gICB9XHJcblxyXG4gICAgLy8gfSBlbHNlIHtcclxuICAgIC8vICAgaWYgKHRoaXMub3B0aW9ucy5sZW5ndGhCeU1ldGVyID4gMTAwMCB8fCB0aGlzLm9wdGlvbnMubGVuZ3RoQnlNZXRlciA9PSAxMDAwKSB7XHJcbiAgICAvLyAgICAgbGV0IGRvbSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2lucHV0LXNlbGVjdC11bml0JylbMV1cclxuICAgIC8vICAgICBkb20gJiYgZG9tLnF1ZXJ5U2VsZWN0b3JBbGwoJ2RkJylbMV0gJiYgZG9tLnF1ZXJ5U2VsZWN0b3JBbGwoJ2RkJylbMV0uY2xpY2soKVxyXG4gICAgLy8gICB9IGVsc2Uge1xyXG4gICAgLy8gICAgIGxldCBkb20gPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdpbnB1dC1zZWxlY3QtdW5pdCcpWzFdXHJcbiAgICAvLyAgICAgZG9tICYmIGRvbS5xdWVyeVNlbGVjdG9yQWxsKCdkZCcpWzBdICYmIGRvbS5xdWVyeVNlbGVjdG9yQWxsKCdkZCcpWzBdLmNsaWNrKClcclxuICAgIC8vICAgfVxyXG4gICAgLy8gfVxyXG4gIH1cclxuXHJcbiAgZ2V0IHNtb290aCgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuc21vb3RoXHJcbiAgfVxyXG5cclxuICBzZXQgc21vb3RoKHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5zbW9vdGggPSB2XHJcbiAgICB0aGlzLmNsb3NlTm9kZUVkaXQoKVxyXG4gICAgdGhpcy5fZWxtcy5zbW9vdGggJiZcclxuICAgICAgdGhpcy5fZWxtcy5zbW9vdGguZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICBpdGVtLmNoZWNrZWQgPSB2XHJcbiAgICAgIH0pXHJcbiAgICBpZiAodGhpcy5lbnRpdHkpIHtcclxuICAgICAgbGV0IGZyb21EZWdyZWVzQXJyYXkgPSB0aGlzLnJlbmV3UG9zaXRpb25zKHRoaXMub3B0aW9ucy5wb3NpdGlvbnMpXHJcbiAgICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLnBvc2l0aW9ucyA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzQXJyYXlIZWlnaHRzKFxyXG4gICAgICAgIGZyb21EZWdyZWVzQXJyYXlcclxuICAgICAgKVxyXG4gICAgICB0aGlzLnJlbmV3UG9seWdvbihmcm9tRGVncmVlc0FycmF5KVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IGhlaWdodE1vZGUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmhlaWdodE1vZGUgPyB0aGlzLm9wdGlvbnMuaGVpZ2h0TW9kZSA6IDBcclxuICB9XHJcbiAgc2V0IGhlaWdodE1vZGUodikge1xyXG4gICAgdGhpcy5wb3NpdGlvbkVkaXRpbmcgPSBmYWxzZVxyXG4gICAgdGhpcy5vcHRpb25zLmhlaWdodE1vZGUgPSAodiB8fCB2ID09IDApID8gdiA6IDJcclxuICAgIGxldCBoZWlnaHRNb2RlTmFtZSA9ICcnXHJcbiAgICB0aGlzLmNsb3NlTm9kZUVkaXQoKVxyXG4gICAgbGV0IGdyb3VuZCA9IGZhbHNlXHJcbiAgICBsZXQgZGlzYWJsZWQgPSBmYWxzZVxyXG4gICAgbGV0IGZyb21EZWdyZWVzQXJyYXkgPSB0aGlzLnJlbmV3UG9zaXRpb25zKHRoaXMub3B0aW9ucy5wb3NpdGlvbnMpXHJcbiAgICB0aGlzLmVudGl0eS5wb2x5bGluZS5wb3NpdGlvbnMgPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlc0FycmF5SGVpZ2h0cyhcclxuICAgICAgZnJvbURlZ3JlZXNBcnJheVxyXG4gICAgKVxyXG4gICAgdGhpcy5yZW5ld1BvbHlnb24oZnJvbURlZ3JlZXNBcnJheSlcclxuICAgIHN3aXRjaCAodGhpcy5vcHRpb25zLmhlaWdodE1vZGUpIHtcclxuICAgICAgY2FzZSAnMCc6XHJcbiAgICAgIGNhc2UgMDpcclxuICAgICAgICB0aGlzLmVudGl0eS5wb2x5bGluZS5jbGFtcFRvR3JvdW5kID0gZ3JvdW5kXHJcbiAgICAgICAgdGhpcy5leHRlbmQgPSBmYWxzZVxyXG4gICAgICAgIGhlaWdodE1vZGVOYW1lID0gJ+a1t+aLlOmrmOW6pidcclxuICAgICAgICBicmVha1xyXG4gICAgICBjYXNlICcxJzpcclxuICAgICAgY2FzZSAxOlxyXG4gICAgICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLmNsYW1wVG9Hcm91bmQgPSBncm91bmRcclxuICAgICAgICB0aGlzLmV4dGVuZCA9IGZhbHNlXHJcbiAgICAgICAgaGVpZ2h0TW9kZU5hbWUgPSAn55u45a+55Zyw6KGoJ1xyXG4gICAgICAgIGJyZWFrXHJcbiAgICAgIGNhc2UgJzInOlxyXG4gICAgICBjYXNlIDI6XHJcbiAgICAgICAgZ3JvdW5kID0gdHJ1ZVxyXG4gICAgICAgIGRpc2FibGVkID0gdHJ1ZVxyXG4gICAgICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLmNsYW1wVG9Hcm91bmQgPSBncm91bmRcclxuICAgICAgICBoZWlnaHRNb2RlTmFtZSA9ICfkvp3pmYTmqKHlnosnXHJcbiAgICAgICAgYnJlYWtcclxuICAgIH1cclxuXHJcblxyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIGlmIChncm91bmQpIHtcclxuICAgICAgICB0aGlzLmxhYmVsLmdyb3VuZCA9IGdyb3VuZFxyXG4gICAgICAgIHRoaXMuX2VsbXMuaGVpZ2h0TW9kZSAmJiAodGhpcy5fZWxtcy5oZWlnaHRNb2RlLnZhbHVlID0gJ+S+nemZhOaooeWeiycpXHJcbiAgICAgICAgdGhpcy5sYWJlbC5wb3NpdGlvbiA9IFtcclxuICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0ubG5nLFxyXG4gICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXS5sYXRcclxuICAgICAgICBdXHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdGhpcy5sYWJlbC5ncm91bmQgPSBncm91bmRcclxuICAgICAgICB0aGlzLmxhYmVsLnBvc2l0aW9uID0gW1xyXG4gICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXS5sbmcsXHJcbiAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zWzBdLmxhdCxcclxuICAgICAgICAgIGZyb21EZWdyZWVzQXJyYXlbMl1cclxuICAgICAgICBdXHJcbiAgICAgICAgdGhpcy5vcHRpb25zLmxhYmVsLnBvc2l0aW9uID0ge1xyXG4gICAgICAgICAgbG5nOiB0aGlzLm9wdGlvbnMucG9zaXRpb25zWzBdLmxuZyxcclxuICAgICAgICAgIGxhdDogdGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXS5sYXQsXHJcbiAgICAgICAgICBhbHQ6IGZyb21EZWdyZWVzQXJyYXlbMl1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0sIDApO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGV4dGVuZCgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuZXh0ZW5kXHJcbiAgfVxyXG5cclxuICBzZXQgZXh0ZW5kKHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5leHRlbmQgPSB2XHJcbiAgICB0aGlzLmNsb3NlTm9kZUVkaXQoKVxyXG4gICAgaWYgKHYpIHtcclxuICAgICAgdGhpcy5oZWlnaHRNb2RlID0gMlxyXG4gICAgfVxyXG4gICAgdGhpcy5fZWxtcy5leHRlbmQgJiZcclxuICAgICAgdGhpcy5fZWxtcy5leHRlbmQuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICBpdGVtLmNoZWNrZWQgPSB2XHJcbiAgICAgIH0pXHJcbiAgICBpZiAodGhpcy5lbnRpdHkpIHtcclxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5leHRlbmQpIHtcclxuICAgICAgICBsZXQgZnJvbURlZ3JlZXNBcnJheSA9IHRoaXMucmVuZXdQb3NpdGlvbnModGhpcy5vcHRpb25zLnBvc2l0aW9ucylcclxuICAgICAgICB0aGlzLnJlbmV3UG9seWdvbihmcm9tRGVncmVlc0FycmF5KVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuZW50aXR5LnBvbHlnb24gPSB1bmRlZmluZWRcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IGV4dGVuZFdpZHRoKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5leHRlbmRXaWR0aFxyXG4gIH1cclxuXHJcbiAgc2V0IGV4dGVuZFdpZHRoKHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5leHRlbmRXaWR0aCA9IHZcclxuICAgIHRoaXMuaGVpZ2h0TW9kZSA9IHRoaXMuaGVpZ2h0TW9kZVxyXG4gICAgdGhpcy5fZWxtcy5leHRlbmRXaWR0aCAmJlxyXG4gICAgICB0aGlzLl9lbG1zLmV4dGVuZFdpZHRoLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgaXRlbS52YWx1ZSA9IHZcclxuICAgICAgfSlcclxuICAgIGxldCBmcm9tRGVncmVlc0FycmF5ID0gdGhpcy5yZW5ld1Bvc2l0aW9ucyh0aGlzLm9wdGlvbnMucG9zaXRpb25zKVxyXG4gICAgdGhpcy5yZW5ld1BvbHlnb24oZnJvbURlZ3JlZXNBcnJheSlcclxuICB9XHJcblxyXG4gIGdldCBleHRlbmRDb2xvcigpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuZXh0ZW5kQ29sb3JcclxuICB9XHJcbiAgc2V0IGV4dGVuZENvbG9yKHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5leHRlbmRDb2xvciA9IHZcclxuICAgIGlmICh0aGlzLl9lbG1zLmV4dGVuZENvbG9yKSB7XHJcbiAgICAgIHRoaXMuX2VsbXMuZXh0ZW5kQ29sb3IuZm9yRWFjaCgoaXRlbSwgaSkgPT4ge1xyXG4gICAgICAgIGxldCBleHRlbmRDb2xvclBpY2tlciA9IG5ldyBZSkNvbG9yUGlja2VyKHtcclxuICAgICAgICAgIGVsOiBpdGVtLmVsLFxyXG4gICAgICAgICAgc2l6ZTogJ21pbmknLCAvL+minOiJsmJveOexu+Wei1xyXG4gICAgICAgICAgYWxwaGE6IHRydWUsIC8v5piv5ZCm5byA5ZCv6YCP5piO5bqmXHJcbiAgICAgICAgICBkZWZhdWx0Q29sb3I6IHRoaXMuZXh0ZW5kQ29sb3IsXHJcbiAgICAgICAgICBkaXNhYmxlZDogZmFsc2UsIC8v5piv5ZCm56aB5q2i5omT5byA6aKc6Imy6YCJ5oup5ZmoXHJcbiAgICAgICAgICBvcGVuUGlja2VyQW5pOiAnb3BhY2l0eScsIC8v5omT5byA6aKc6Imy6YCJ5oup5Zmo5Yqo55S7XHJcbiAgICAgICAgICBzdXJlOiBjb2xvciA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuZXh0ZW5kQ29sb3IgPSBjb2xvclxyXG4gICAgICAgICAgfSwgLy/ngrnlh7vnoa7orqTmjInpkq7kuovku7blm57osINcclxuICAgICAgICAgIGNsZWFyOiAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuZXh0ZW5kQ29sb3IgPSAncmdiYSgyNTUsMjU1LDI1NSwxKSdcclxuICAgICAgICAgIH0gLy/ngrnlh7vmuIXnqbrmjInpkq7kuovku7blm57osINcclxuICAgICAgICB9KVxyXG4gICAgICAgIHRoaXMuX2VsbXMuZXh0ZW5kQ29sb3JbaV0gPSBleHRlbmRDb2xvclBpY2tlclxyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gICAgdGhpcy5lbnRpdHkgJiZcclxuICAgICAgdGhpcy5lbnRpdHkucG9seWdvbiAmJlxyXG4gICAgICAodGhpcy5lbnRpdHkucG9seWdvbi5tYXRlcmlhbCA9IENlc2l1bS5Db2xvci5mcm9tQ3NzQ29sb3JTdHJpbmcoXHJcbiAgICAgICAgdGhpcy5vcHRpb25zLmV4dGVuZENvbG9yXHJcbiAgICAgICkpXHJcbiAgfVxyXG5cclxuICBnZXQgbGFiZWxTaG93KCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5sYWJlbC5zaG93XHJcbiAgfVxyXG4gIHNldCBsYWJlbFNob3codikge1xyXG4gICAgdGhpcy5vcHRpb25zLmxhYmVsLnNob3cgPSB2XHJcbiAgICBpZiAodGhpcy5zaG93ICYmICF0aGlzLnNob3dWaWV3IHx8IHRoaXMuc2hvd1ZpZXcgPT0gMykge1xyXG4gICAgICB0aGlzLmxhYmVsLnNob3cgPSB2XHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMubGFiZWwucG9zaXRpb24gPSBbXHJcbiAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zWzBdLmxuZyxcclxuICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0ubGF0LFxyXG4gICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXS5hbHRcclxuICAgICAgICBdXHJcbiAgICAgIH0sIDApXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmxhYmVsLnNob3cgPSBmYWxzZVxyXG4gICAgfVxyXG4gICAgdGhpcy5fZWxtcy5sYWJlbFNob3cgJiZcclxuICAgICAgdGhpcy5fZWxtcy5sYWJlbFNob3cuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICBpdGVtLmNoZWNrZWQgPSB2XHJcbiAgICAgIH0pXHJcbiAgfVxyXG5cclxuICBnZXQgbGFiZWxGb250RmFtaWx5KCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5sYWJlbC5mb250RmFtaWx5XHJcbiAgfVxyXG5cclxuICBzZXQgbGFiZWxGb250RmFtaWx5KHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5sYWJlbC5mb250RmFtaWx5ID0gdiB8fCAwXHJcbiAgICB0aGlzLmxhYmVsICYmICh0aGlzLmxhYmVsLmZvbnRGYW1pbHkgPSB0aGlzLm9wdGlvbnMubGFiZWwuZm9udEZhbWlseSlcclxuXHJcbiAgICBsZXQgbmFtZSA9IGdldEZvbnRGYW1pbHlOYW1lKHRoaXMubGFiZWxGb250RmFtaWx5KSB8fCAnJ1xyXG4gICAgdGhpcy5fZWxtcy5sYWJlbEZvbnRGYW1pbHkgJiZcclxuICAgICAgdGhpcy5fZWxtcy5sYWJlbEZvbnRGYW1pbHkuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICBpdGVtLnZhbHVlID0gbmFtZVxyXG4gICAgICB9KVxyXG4gIH1cclxuXHJcbiAgZ2V0IGxhYmVsQ29sb3IoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmxhYmVsLmNvbG9yXHJcbiAgfVxyXG4gIHNldCBsYWJlbENvbG9yKHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5sYWJlbC5jb2xvciA9IHZcclxuICAgIHRoaXMubGFiZWwuY29sb3IgPSB2XHJcbiAgICBpZiAodGhpcy5fZWxtcy5sYWJlbENvbG9yKSB7XHJcbiAgICAgIHRoaXMuX2VsbXMubGFiZWxDb2xvci5mb3JFYWNoKChpdGVtLCBpKSA9PiB7XHJcbiAgICAgICAgbGV0IGxhYmVsQ29sb3JQaWNrZXIgPSBuZXcgWUpDb2xvclBpY2tlcih7XHJcbiAgICAgICAgICBlbDogaXRlbS5lbCxcclxuICAgICAgICAgIHNpemU6ICdtaW5pJywgLy/popzoibJib3jnsbvlnotcclxuICAgICAgICAgIGFscGhhOiB0cnVlLCAvL+aYr+WQpuW8gOWQr+mAj+aYjuW6plxyXG4gICAgICAgICAgZGVmYXVsdENvbG9yOiB0aGlzLmxhYmVsQ29sb3IsXHJcbiAgICAgICAgICBkaXNhYmxlZDogZmFsc2UsIC8v5piv5ZCm56aB5q2i5omT5byA6aKc6Imy6YCJ5oup5ZmoXHJcbiAgICAgICAgICBvcGVuUGlja2VyQW5pOiAnb3BhY2l0eScsIC8v5omT5byA6aKc6Imy6YCJ5oup5Zmo5Yqo55S7XHJcbiAgICAgICAgICBzdXJlOiBjb2xvciA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubGFiZWxDb2xvciA9IGNvbG9yXHJcbiAgICAgICAgICB9LCAvL+eCueWHu+ehruiupOaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICAgICAgY2xlYXI6ICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5sYWJlbENvbG9yID0gJ3JnYmEoMjU1LDI1NSwyNTUsMSknXHJcbiAgICAgICAgICB9IC8v54K55Ye75riF56m65oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgICAgfSlcclxuICAgICAgICB0aGlzLl9lbG1zLmxhYmVsQ29sb3JbaV0gPSBsYWJlbENvbG9yUGlja2VyXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgbGFiZWxGb250U2l6ZSgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubGFiZWwuZm9udFNpemVcclxuICB9XHJcbiAgc2V0IGxhYmVsRm9udFNpemUodikge1xyXG4gICAgdGhpcy5vcHRpb25zLmxhYmVsLmZvbnRTaXplID0gdlxyXG4gICAgdGhpcy5sYWJlbC5mb250U2l6ZSA9IHZcclxuICAgIHRoaXMuX2VsbXMubGFiZWxGb250U2l6ZSAmJlxyXG4gICAgICB0aGlzLl9lbG1zLmxhYmVsRm9udFNpemUuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICBpdGVtLnZhbHVlID0gdlxyXG4gICAgICB9KVxyXG4gIH1cclxuXHJcbiAgZ2V0IGxhYmVsU2NhbGVCeURpc3RhbmNlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5sYWJlbC5zY2FsZUJ5RGlzdGFuY2VcclxuICB9XHJcbiAgc2V0IGxhYmVsU2NhbGVCeURpc3RhbmNlKHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5sYWJlbC5zY2FsZUJ5RGlzdGFuY2UgPSB2XHJcbiAgICB0aGlzLmxhYmVsLnNjYWxlQnlEaXN0YW5jZSA9IHZcclxuICAgIHRoaXMuX2VsbXMubGFiZWxTY2FsZUJ5RGlzdGFuY2UgJiZcclxuICAgICAgdGhpcy5fZWxtcy5sYWJlbFNjYWxlQnlEaXN0YW5jZS5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgIGl0ZW0uY2hlY2tlZCA9IHZcclxuICAgICAgfSlcclxuICB9XHJcblxyXG4gIGdldCBsYWJlbE5lYXIoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmxhYmVsLm5lYXJcclxuICB9XHJcbiAgc2V0IGxhYmVsTmVhcih2KSB7XHJcbiAgICBsZXQgbmVhciA9IHZcclxuICAgIGlmIChuZWFyID4gdGhpcy5sYWJlbEZhcikge1xyXG4gICAgICBuZWFyID0gdGhpcy5sYWJlbEZhclxyXG4gICAgfVxyXG4gICAgdGhpcy5vcHRpb25zLmxhYmVsLm5lYXIgPSBuZWFyXHJcbiAgICB0aGlzLmxhYmVsLm5lYXIgPSBuZWFyXHJcbiAgICB0aGlzLl9lbG1zLmxhYmVsTmVhciAmJiB0aGlzLl9lbG1zLmxhYmVsTmVhci5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgIGl0ZW0udmFsdWUgPSBuZWFyXHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgZ2V0IGxhYmVsRmFyKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5sYWJlbC5mYXJcclxuICB9XHJcbiAgc2V0IGxhYmVsRmFyKHYpIHtcclxuICAgIGxldCBmYXIgPSB2XHJcbiAgICBpZiAoZmFyIDwgdGhpcy5sYWJlbE5lYXIpIHtcclxuICAgICAgZmFyID0gdGhpcy5sYWJlbE5lYXJcclxuICAgIH1cclxuICAgIHRoaXMub3B0aW9ucy5sYWJlbC5mYXIgPSBmYXJcclxuICAgIHRoaXMubGFiZWwuZmFyID0gZmFyXHJcbiAgICB0aGlzLl9lbG1zLmxhYmVsRmFyICYmIHRoaXMuX2VsbXMubGFiZWxGYXIuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICBpdGVtLnZhbHVlID0gZmFyXHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgZ2V0IGxhYmVsTGluZVdpZHRoKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5sYWJlbC5saW5lV2lkdGhcclxuICB9XHJcbiAgc2V0IGxhYmVsTGluZVdpZHRoKHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5sYWJlbC5saW5lV2lkdGggPSB2XHJcbiAgICB0aGlzLmxhYmVsLmxpbmVXaWR0aCA9IHZcclxuICAgIHRoaXMuX2VsbXMubGFiZWxMaW5lV2lkdGggJiZcclxuICAgICAgdGhpcy5fZWxtcy5sYWJlbExpbmVXaWR0aC5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgIGl0ZW0udmFsdWUgPSB2XHJcbiAgICAgIH0pXHJcbiAgfVxyXG5cclxuICBnZXQgbGFiZWxQaXhlbE9mZnNldCgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubGFiZWwucGl4ZWxPZmZzZXRcclxuICB9XHJcbiAgc2V0IGxhYmVsUGl4ZWxPZmZzZXQodikge1xyXG4gICAgdGhpcy5vcHRpb25zLmxhYmVsLnBpeGVsT2Zmc2V0ID0gdlxyXG4gICAgdGhpcy5sYWJlbC5waXhlbE9mZnNldCA9IHZcclxuICAgIHRoaXMuX2VsbXMubGFiZWxQaXhlbE9mZnNldCAmJlxyXG4gICAgICB0aGlzLl9lbG1zLmxhYmVsUGl4ZWxPZmZzZXQuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICBpdGVtLnZhbHVlID0gdlxyXG4gICAgICB9KVxyXG4gIH1cclxuICBnZXQgbGFiZWxMaW5lQ29sb3IoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmxhYmVsLmxpbmVDb2xvclxyXG4gIH1cclxuICBzZXQgbGFiZWxMaW5lQ29sb3Iodikge1xyXG4gICAgdGhpcy5vcHRpb25zLmxhYmVsLmxpbmVDb2xvciA9IHZcclxuICAgIHRoaXMubGFiZWwubGluZUNvbG9yID0gdlxyXG4gICAgaWYgKHRoaXMuX2VsbXMubGFiZWxMaW5lQ29sb3IpIHtcclxuICAgICAgdGhpcy5fZWxtcy5sYWJlbExpbmVDb2xvci5mb3JFYWNoKChpdGVtLCBpKSA9PiB7XHJcbiAgICAgICAgbGV0IGxpbmVDb2xvclBpY2tlciA9IG5ldyBZSkNvbG9yUGlja2VyKHtcclxuICAgICAgICAgIGVsOiBpdGVtLmVsLFxyXG4gICAgICAgICAgc2l6ZTogJ21pbmknLCAvL+minOiJsmJveOexu+Wei1xyXG4gICAgICAgICAgYWxwaGE6IHRydWUsIC8v5piv5ZCm5byA5ZCv6YCP5piO5bqmXHJcbiAgICAgICAgICBkZWZhdWx0Q29sb3I6IHRoaXMubGFiZWxMaW5lQ29sb3IsXHJcbiAgICAgICAgICBkaXNhYmxlZDogZmFsc2UsIC8v5piv5ZCm56aB5q2i5omT5byA6aKc6Imy6YCJ5oup5ZmoXHJcbiAgICAgICAgICBvcGVuUGlja2VyQW5pOiAnb3BhY2l0eScsIC8v5omT5byA6aKc6Imy6YCJ5oup5Zmo5Yqo55S7XHJcbiAgICAgICAgICBzdXJlOiBjb2xvciA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubGFiZWxMaW5lQ29sb3IgPSBjb2xvclxyXG4gICAgICAgICAgfSwgLy/ngrnlh7vnoa7orqTmjInpkq7kuovku7blm57osINcclxuICAgICAgICAgIGNsZWFyOiAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubGFiZWxMaW5lQ29sb3IgPSAncmdiYSgwLDI1NSwyNTUsMC41KSdcclxuICAgICAgICAgIH0gLy/ngrnlh7vmuIXnqbrmjInpkq7kuovku7blm57osINcclxuICAgICAgICB9KVxyXG4gICAgICAgIHRoaXMuX2VsbXMubGFiZWxMaW5lQ29sb3JbaV0gPSBsaW5lQ29sb3JQaWNrZXJcclxuICAgICAgfSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCBsYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0KCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5sYWJlbC5iYWNrZ3JvdW5kQ29sb3JbMF1cclxuICB9XHJcbiAgc2V0IGxhYmVsQmFja2dyb3VuZENvbG9yU3RhcnQodikge1xyXG4gICAgdGhpcy5vcHRpb25zLmxhYmVsLmJhY2tncm91bmRDb2xvclswXSA9IHZcclxuICAgIHRoaXMubGFiZWwuYmFja2dyb3VuZENvbG9yID0gW3YsIHRoaXMubGFiZWwuYmFja2dyb3VuZENvbG9yWzFdXVxyXG4gICAgaWYgKHRoaXMuX2VsbXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JTdGFydCkge1xyXG4gICAgICB0aGlzLl9lbG1zLmxhYmVsQmFja2dyb3VuZENvbG9yU3RhcnQuZm9yRWFjaCgoaXRlbSwgaSkgPT4ge1xyXG4gICAgICAgIGxldCBsYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0UGlja2VyID0gbmV3IFlKQ29sb3JQaWNrZXIoe1xyXG4gICAgICAgICAgZWw6IGl0ZW0uZWwsXHJcbiAgICAgICAgICBzaXplOiAnbWluaScsIC8v6aKc6ImyYm9457G75Z6LXHJcbiAgICAgICAgICBhbHBoYTogdHJ1ZSwgLy/mmK/lkKblvIDlkK/pgI/mmI7luqZcclxuICAgICAgICAgIGRlZmF1bHRDb2xvcjogdGhpcy5sYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0LFxyXG4gICAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLCAvL+aYr+WQpuemgeatouaJk+W8gOminOiJsumAieaLqeWZqFxyXG4gICAgICAgICAgb3BlblBpY2tlckFuaTogJ29wYWNpdHknLCAvL+aJk+W8gOminOiJsumAieaLqeWZqOWKqOeUu1xyXG4gICAgICAgICAgc3VyZTogY29sb3IgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxhYmVsQmFja2dyb3VuZENvbG9yU3RhcnQgPSBjb2xvclxyXG4gICAgICAgICAgfSwgLy/ngrnlh7vnoa7orqTmjInpkq7kuovku7blm57osINcclxuICAgICAgICAgIGNsZWFyOiAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JTdGFydCA9ICdyZ2JhKDI1NSwyNTUsMjU1LDEpJ1xyXG4gICAgICAgICAgfSAvL+eCueWHu+a4heepuuaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgdGhpcy5fZWxtcy5sYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0W1xyXG4gICAgICAgICAgaVxyXG4gICAgICAgIF0gPSBsYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0UGlja2VyXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgfVxyXG4gIGdldCBsYWJlbEJhY2tncm91bmRDb2xvckVuZCgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubGFiZWwuYmFja2dyb3VuZENvbG9yWzFdXHJcbiAgfVxyXG4gIHNldCBsYWJlbEJhY2tncm91bmRDb2xvckVuZCh2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMubGFiZWwuYmFja2dyb3VuZENvbG9yWzFdID0gdlxyXG4gICAgdGhpcy5sYWJlbC5iYWNrZ3JvdW5kQ29sb3IgPSBbdGhpcy5sYWJlbC5iYWNrZ3JvdW5kQ29sb3JbMF0sIHZdXHJcbiAgICBpZiAodGhpcy5fZWxtcy5sYWJlbEJhY2tncm91bmRDb2xvckVuZCkge1xyXG4gICAgICB0aGlzLl9lbG1zLmxhYmVsQmFja2dyb3VuZENvbG9yRW5kLmZvckVhY2goKGl0ZW0sIGkpID0+IHtcclxuICAgICAgICBsZXQgbGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmRQaWNrZXIgPSBuZXcgWUpDb2xvclBpY2tlcih7XHJcbiAgICAgICAgICBlbDogaXRlbS5lbCxcclxuICAgICAgICAgIHNpemU6ICdtaW5pJywgLy/popzoibJib3jnsbvlnotcclxuICAgICAgICAgIGFscGhhOiB0cnVlLCAvL+aYr+WQpuW8gOWQr+mAj+aYjuW6plxyXG4gICAgICAgICAgZGVmYXVsdENvbG9yOiB0aGlzLmxhYmVsQmFja2dyb3VuZENvbG9yRW5kLFxyXG4gICAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLCAvL+aYr+WQpuemgeatouaJk+W8gOminOiJsumAieaLqeWZqFxyXG4gICAgICAgICAgb3BlblBpY2tlckFuaTogJ29wYWNpdHknLCAvL+aJk+W8gOminOiJsumAieaLqeWZqOWKqOeUu1xyXG4gICAgICAgICAgc3VyZTogY29sb3IgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxhYmVsQmFja2dyb3VuZENvbG9yRW5kID0gY29sb3JcclxuICAgICAgICAgIH0sIC8v54K55Ye756Gu6K6k5oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgICAgICBjbGVhcjogKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxhYmVsQmFja2dyb3VuZENvbG9yRW5kID0gJ3JnYmEoMjU1LDI1NSwyNTUsMSknXHJcbiAgICAgICAgICB9IC8v54K55Ye75riF56m65oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgICAgfSlcclxuICAgICAgICB0aGlzLl9lbG1zLmxhYmVsQmFja2dyb3VuZENvbG9yRW5kW2ldID0gbGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmRQaWNrZXJcclxuICAgICAgfSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCBhdHRyaWJ1dGVUeXBlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGVUeXBlXHJcbiAgfVxyXG5cclxuICBzZXQgYXR0cmlidXRlVHlwZSh2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlVHlwZSA9IHZcclxuICAgIHRoaXMuX2VsbXMuYXR0cmlidXRlVHlwZSAmJlxyXG4gICAgICB0aGlzLl9lbG1zLmF0dHJpYnV0ZVR5cGUuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICBpdGVtLnZhbHVlID0gdlxyXG4gICAgICB9KVxyXG4gICAgbGV0IGF0dHJpYnV0ZUNvbnRlbnQgPSB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFxyXG4gICAgICAnYXR0cmlidXRlLWNvbnRlbnQnXHJcbiAgICApXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGF0dHJpYnV0ZUNvbnRlbnQubGVuZ3RoOyBpKyspIHtcclxuICAgICAgaWYgKFxyXG4gICAgICAgIGF0dHJpYnV0ZUNvbnRlbnRbaV0uY2xhc3NOYW1lLmluZGV4T2YoJ2F0dHJpYnV0ZS1jb250ZW50LScgKyB2KSA+IC0xXHJcbiAgICAgICkge1xyXG4gICAgICAgIGF0dHJpYnV0ZUNvbnRlbnRbaV0uc3R5bGUuZGlzcGxheSA9ICdibG9jaydcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBhdHRyaWJ1dGVDb250ZW50W2ldLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSdcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IGF0dHJpYnV0ZUxpbmsoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnRcclxuICB9XHJcblxyXG4gIHNldCBhdHRyaWJ1dGVMaW5rKHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50ID0gdlxyXG4gICAgaWYgKFxyXG4gICAgICAhdGhpcy5fRGlhbG9nT2JqZWN0IHx8XHJcbiAgICAgICF0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQgfHxcclxuICAgICAgIXRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50IHx8XHJcbiAgICAgIHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXHJcbiAgICAgICAgJ2F0dHJpYnV0ZS1jb250ZW50LWxpbmsnXHJcbiAgICAgICkubGVuZ3RoID09IDBcclxuICAgICkge1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuICAgIGxldCB0YWJsZSA9IHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50XHJcbiAgICAgIC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdhdHRyaWJ1dGUtY29udGVudC1saW5rJylbMV1cclxuICAgICAgLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RhYmxlJylbMF1cclxuICAgIGxldCB0YWJsZUNvbnRlbnQgPSB0YWJsZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0YWJsZS1ib2R5JylbMF1cclxuICAgIHRhYmxlQ29udGVudC5pbm5lckhUTUwgPSAnJ1xyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50Lmxlbmd0aCA+IDApIHtcclxuICAgICAgdGFibGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndGFibGUtZW1wdHknKVswXS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0YWJsZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0YWJsZS1lbXB0eScpWzBdLnN0eWxlLmRpc3BsYXkgPSAnZmxleCdcclxuICAgIH1cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnQubGVuZ3RoOyBpKyspIHtcclxuICAgICAgbGV0IHRyID1cclxuICAgICAgICBgXHJcbiAgICAgIDxkaXYgY2xhc3M9XCJ0clwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRkXCI+YCArXHJcbiAgICAgICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnRbaV0ubmFtZSArXHJcbiAgICAgICAgYDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRkXCI+YCArXHJcbiAgICAgICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnRbaV0udXJsICtcclxuICAgICAgICBgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidGRcIj5cclxuICAgICAgICAgICAgICA8YnV0dG9uIEBjbGljaz1cImxpbmtFZGl0XCI+57yW6L6RPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvbiBAY2xpY2s9XCJsaW5rRGVsZXRlXCI+5Yig6ZmkPC9idXR0b24+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+YFxyXG4gICAgICBsZXQgdHJFbG0gPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpLmNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudCh0cilcclxuICAgICAgdGFibGVDb250ZW50LmFwcGVuZENoaWxkKHRyRWxtKVxyXG4gICAgfVxyXG4gICAgbGV0IGl0ZW0gPSB0YWJsZUNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndHInKVxyXG4gICAgbGV0IGZ1biA9IHtcclxuICAgICAgbGlua0VkaXQ6IGFzeW5jIGluZGV4ID0+IHtcclxuICAgICAgICB0aGlzLmF0dHJpYnV0ZUxpbmsgPSBhd2FpdCB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudFxyXG4gICAgICAgIGxldCB0YWJsZSA9IHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50XHJcbiAgICAgICAgICAuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnYXR0cmlidXRlLWNvbnRlbnQtbGluaycpWzFdXHJcbiAgICAgICAgICAuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndGFibGUnKVswXVxyXG4gICAgICAgIGxldCB0YWJsZUNvbnRlbnQgPSB0YWJsZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0YWJsZS1ib2R5JylbMF1cclxuICAgICAgICBsZXQgaXRlbSA9IHRhYmxlQ29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0cicpXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpdGVtLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBpZiAoaW5kZXggPT09IGkpIHtcclxuICAgICAgICAgICAgbGV0IGhlaWdodCA9IGl0ZW1baV0ub2Zmc2V0SGVpZ2h0XHJcbiAgICAgICAgICAgIGxldCBodG1sID0gYFxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZFwiPlxyXG4gICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiaW5wdXRcIiB0eXBlPVwidGV4dFwiPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZFwiPlxyXG4gICAgICAgICAgICAgICAgPHRleHRhcmVhIGNsYXNzPVwiaW5wdXQgbGluay1lZGl0XCIgdHlwZT1cInRleHRcIj48L3RleHRhcmVhPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZFwiPlxyXG4gICAgICAgICAgICAgICAgICA8YnV0dG9uIEBjbGljaz1cImNvbmZpcm1FZGl0XCI+56Gu6K6kPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgIDxidXR0b24gQGNsaWNrPVwiY2FuY2VsRWRpdFwiPuWPlua2iDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDwvZGl2PmBcclxuICAgICAgICAgICAgaXRlbVtpXS5pbm5lckhUTUwgPSBodG1sXHJcbiAgICAgICAgICAgIGxldCB0ZXh0YXJlYUVsbSA9IGl0ZW1baV0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbGluay1lZGl0JylbMF1cclxuICAgICAgICAgICAgdGV4dGFyZWFFbG0uc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0IC0gMTAgKyAncHgnXHJcbiAgICAgICAgICAgIGxldCB0ZCA9IGl0ZW1baV0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndGQnKVxyXG4gICAgICAgICAgICB0ZFswXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFxyXG4gICAgICAgICAgICAgICdpbnB1dCdcclxuICAgICAgICAgICAgKVswXS52YWx1ZSA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50W2luZGV4XS5uYW1lXHJcbiAgICAgICAgICAgIHRkWzFdLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXHJcbiAgICAgICAgICAgICAgJ2lucHV0J1xyXG4gICAgICAgICAgICApWzBdLnZhbHVlID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnRbaW5kZXhdLnVybFxyXG4gICAgICAgICAgICBsZXQgYnRuID0gaXRlbVtpXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnYnV0dG9uJylcclxuICAgICAgICAgICAgZm9yIChsZXQgbiA9IDA7IG4gPCBidG4ubGVuZ3RoOyBuKyspIHtcclxuICAgICAgICAgICAgICBpZiAoIWJ0bltuXSB8fCAhYnRuW25dLmF0dHJpYnV0ZXMpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGZvciAobGV0IG0gb2YgYnRuW25dLmF0dHJpYnV0ZXMpIHtcclxuICAgICAgICAgICAgICAgIGlmIChtLm5hbWUgPT09ICdAY2xpY2snKSB7XHJcbiAgICAgICAgICAgICAgICAgIGJ0bltuXS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGUgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZnVuW20udmFsdWVdID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBmdW5bbS52YWx1ZV0oXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiB0ZFswXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdpbnB1dCcpWzBdLnZhbHVlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogdGRbMV0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaW5wdXQnKVswXS52YWx1ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpXHJcbiAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICBidG5bbl0uYXR0cmlidXRlcy5yZW1vdmVOYW1lZEl0ZW0obS5uYW1lKVxyXG4gICAgICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgbGlua0RlbGV0ZTogaSA9PiB7XHJcbiAgICAgICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnQuc3BsaWNlKGksIDEpXHJcbiAgICAgICAgdGhpcy5hdHRyaWJ1dGVMaW5rID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnRcclxuICAgICAgfSxcclxuXHJcbiAgICAgIGNvbmZpcm1FZGl0OiAodmFsdWUsIGkpID0+IHtcclxuICAgICAgICBsZXQgbmFtZSA9IHZhbHVlLm5hbWUgJiYgdmFsdWUubmFtZS5yZXBsYWNlKC9cXHMvZywgJycpXHJcbiAgICAgICAgbGV0IHVybCA9IHZhbHVlLnVybCAmJiB2YWx1ZS51cmwucmVwbGFjZSgvXFxzL2csICcnKVxyXG4gICAgICAgIGlmIChuYW1lICYmIHVybCkge1xyXG4gICAgICAgICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnRbaV0gPSB2YWx1ZVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB3aW5kb3cuRUxFTUVOVCAmJlxyXG4gICAgICAgICAgICB3aW5kb3cuRUxFTUVOVC5NZXNzYWdlKHtcclxuICAgICAgICAgICAgICBtZXNzYWdlOiAn5ZCN56ew5oiW6ZO+5o6l5LiN6IO95Li656m677yBJyxcclxuICAgICAgICAgICAgICB0eXBlOiAnd2FybmluZycsXHJcbiAgICAgICAgICAgICAgZHVyYXRpb246IDE1MDBcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5hdHRyaWJ1dGVMaW5rID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnRcclxuICAgICAgfSxcclxuICAgICAgY2FuY2VsRWRpdDogKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuYXR0cmlidXRlTGluayA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50XHJcbiAgICAgIH0sXHJcbiAgICAgIGZpbGVTZWxlY3Q6ICh2YWx1ZSwgaSkgPT4ge1xyXG4gICAgICAgIGxldCBmaWxlRWxtID0gaXRlbVtpXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdmaWxlLXNlbGVjdCcpWzBdXHJcbiAgICAgICAgZmlsZUVsbS5jbGljaygpXHJcbiAgICAgICAgZmlsZUVsbS5yZW1vdmVFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBmaWxlU2VsZWN0KVxyXG4gICAgICAgIGZpbGVFbG0uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgZmlsZVNlbGVjdClcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgbGV0IGZpbGVTZWxlY3QgPSBldmVudCA9PiB7XHJcbiAgICAgIGlmIChldmVudC50YXJnZXQudmFsdWUpIHtcclxuICAgICAgICBsZXQgdGQgPSBpdGVtW1xyXG4gICAgICAgICAgZXZlbnQudGFyZ2V0LmdldEF0dHJpYnV0ZSgnaW5kZXgnKVxyXG4gICAgICAgIF0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndGQnKVxyXG4gICAgICAgIHRkWzFdLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2lucHV0JylbMF0udmFsdWUgPSBldmVudC50YXJnZXQudmFsdWVcclxuICAgICAgICBldmVudC50YXJnZXQudmFsdWUgPSBudWxsXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbS5sZW5ndGg7IGkrKykge1xyXG4gICAgICBsZXQgYnRuID0gaXRlbVtpXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnYnV0dG9uJylcclxuICAgICAgZm9yIChsZXQgbiA9IDA7IG4gPCBidG4ubGVuZ3RoOyBuKyspIHtcclxuICAgICAgICBpZiAoIWJ0bltuXSB8fCAhYnRuW25dLmF0dHJpYnV0ZXMpIHtcclxuICAgICAgICAgIGNvbnRpbnVlXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvciAobGV0IG0gb2YgYnRuW25dLmF0dHJpYnV0ZXMpIHtcclxuICAgICAgICAgIGlmIChtLm5hbWUgPT09ICdAY2xpY2snKSB7XHJcbiAgICAgICAgICAgIGJ0bltuXS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGUgPT4ge1xyXG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgZnVuW20udmFsdWVdID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgICAgICBmdW5bbS52YWx1ZV0oaSlcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIGJ0bltuXS5hdHRyaWJ1dGVzLnJlbW92ZU5hbWVkSXRlbShtLm5hbWUpXHJcbiAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBnZXQgYXR0cmlidXRlQ2FtZXJhKCkge1xyXG4gIC8vICAgcmV0dXJuIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUuY2FtZXJhLmNvbnRlbnRcclxuICAvLyB9XHJcblxyXG4gIC8vIHNldCBhdHRyaWJ1dGVDYW1lcmEodikge1xyXG4gIC8vICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5jYW1lcmEuY29udGVudCA9IHZcclxuICAvLyB9XHJcblxyXG4gIC8vIGdldCBhdHRyaWJ1dGVWcigpIHtcclxuICAvLyAgIHJldHVybiB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnRcclxuICAvLyB9XHJcblxyXG4gIC8vIHNldCBhdHRyaWJ1dGVWcih2KSB7XHJcbiAgLy8gICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnQgPSB2XHJcbiAgLy8gICBpZiAoXHJcbiAgLy8gICAgICF0aGlzLl9EaWFsb2dPYmplY3QgfHxcclxuICAvLyAgICAgIXRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudCB8fFxyXG4gIC8vICAgICAhdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQgfHxcclxuICAvLyAgICAgdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcclxuICAvLyAgICAgICAnYXR0cmlidXRlLWNvbnRlbnQtdnInXHJcbiAgLy8gICAgICkubGVuZ3RoID09IDBcclxuICAvLyAgICkge1xyXG4gIC8vICAgICByZXR1cm5cclxuICAvLyAgIH1cclxuICAvLyAgIGxldCB0YWJsZSA9IHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50XHJcbiAgLy8gICAgIC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdhdHRyaWJ1dGUtY29udGVudC12cicpWzFdXHJcbiAgLy8gICAgIC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0YWJsZScpWzBdXHJcbiAgLy8gICBsZXQgdGFibGVDb250ZW50ID0gdGFibGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndGFibGUtYm9keScpWzBdXHJcbiAgLy8gICB0YWJsZUNvbnRlbnQuaW5uZXJIVE1MID0gJydcclxuICAvLyAgIGlmICh0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnQubGVuZ3RoID4gMCkge1xyXG4gIC8vICAgICB0YWJsZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0YWJsZS1lbXB0eScpWzBdLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSdcclxuICAvLyAgIH0gZWxzZSB7XHJcbiAgLy8gICAgIHRhYmxlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RhYmxlLWVtcHR5JylbMF0uc3R5bGUuZGlzcGxheSA9ICdmbGV4J1xyXG4gIC8vICAgfVxyXG4gIC8vICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnQubGVuZ3RoOyBpKyspIHtcclxuICAvLyAgICAgbGV0IHRyID1cclxuICAvLyAgICAgICBgXHJcbiAgLy8gICAgIDxkaXYgY2xhc3M9XCJ0clwiPlxyXG4gIC8vICAgICAgICAgPGRpdiBjbGFzcz1cInRkXCI+YCArXHJcbiAgLy8gICAgICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52ci5jb250ZW50W2ldLm5hbWUgK1xyXG4gIC8vICAgICAgIGA8L2Rpdj5cclxuICAvLyAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZFwiPmAgK1xyXG4gIC8vICAgICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudFtpXS51cmwgK1xyXG4gIC8vICAgICAgIGA8L2Rpdj5cclxuICAvLyAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZFwiPlxyXG4gIC8vICAgICAgICAgICAgIDxidXR0b24gQGNsaWNrPVwidnJFZGl0XCI+57yW6L6RPC9idXR0b24+XHJcbiAgLy8gICAgICAgICAgICAgPGJ1dHRvbiBAY2xpY2s9XCJ2ckRlbGV0ZVwiPuWIoOmZpDwvYnV0dG9uPlxyXG4gIC8vICAgICAgICAgPC9kaXY+XHJcbiAgLy8gICAgIDwvZGl2PmBcclxuICAvLyAgICAgbGV0IHRyRWxtID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKS5jcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQodHIpXHJcbiAgLy8gICAgIHRhYmxlQ29udGVudC5hcHBlbmRDaGlsZCh0ckVsbSlcclxuICAvLyAgIH1cclxuICAvLyAgIGxldCBpdGVtID0gdGFibGVDb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RyJylcclxuICAvLyAgIGxldCBmdW4gPSB7XHJcbiAgLy8gICAgIHZyRWRpdDogYXN5bmMgaW5kZXggPT4ge1xyXG4gIC8vICAgICAgIHRoaXMuYXR0cmlidXRlVnIgPSBhd2FpdCB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnRcclxuICAvLyAgICAgICBsZXQgdGFibGUgPSB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudFxyXG4gIC8vICAgICAgICAgLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2F0dHJpYnV0ZS1jb250ZW50LXZyJylbMV1cclxuICAvLyAgICAgICAgIC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0YWJsZScpWzBdXHJcbiAgLy8gICAgICAgbGV0IHRhYmxlQ29udGVudCA9IHRhYmxlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RhYmxlLWJvZHknKVswXVxyXG4gIC8vICAgICAgIGxldCBpdGVtID0gdGFibGVDb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RyJylcclxuICAvLyAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW0ubGVuZ3RoOyBpKyspIHtcclxuICAvLyAgICAgICAgIGlmIChpbmRleCA9PT0gaSkge1xyXG4gIC8vICAgICAgICAgICBsZXQgaGVpZ2h0ID0gaXRlbVtpXS5vZmZzZXRIZWlnaHRcclxuICAvLyAgICAgICAgICAgbGV0IGh0bWwgPSBgXHJcbiAgLy8gICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRkXCI+XHJcbiAgLy8gICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJpbnB1dFwiIHR5cGU9XCJ0ZXh0XCI+XHJcbiAgLy8gICAgICAgICAgICAgPC9kaXY+XHJcbiAgLy8gICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRkXCI+XHJcbiAgLy8gICAgICAgICAgICAgICA8dGV4dGFyZWEgY2xhc3M9XCJpbnB1dCBsaW5rLWVkaXRcIiB0eXBlPVwidGV4dFwiPjwvdGV4dGFyZWE+XHJcbiAgLy8gICAgICAgICAgICAgPC9kaXY+XHJcbiAgLy8gICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRkXCI+XHJcbiAgLy8gICAgICAgICAgICAgICAgIDxidXR0b24gQGNsaWNrPVwiY29uZmlybUVkaXRcIj7noa7orqQ8L2J1dHRvbj5cclxuICAvLyAgICAgICAgICAgICAgICAgPGJ1dHRvbiBAY2xpY2s9XCJjYW5jZWxFZGl0XCI+5Y+W5raIPC9idXR0b24+XHJcbiAgLy8gICAgICAgICAgICAgPC9kaXY+YFxyXG4gIC8vICAgICAgICAgICBpdGVtW2ldLmlubmVySFRNTCA9IGh0bWxcclxuICAvLyAgICAgICAgICAgbGV0IHRleHRhcmVhRWxtID0gaXRlbVtpXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdsaW5rLWVkaXQnKVswXVxyXG4gIC8vICAgICAgICAgICB0ZXh0YXJlYUVsbS5zdHlsZS5oZWlnaHQgPSBoZWlnaHQgLSAxMCArICdweCdcclxuICAvLyAgICAgICAgICAgbGV0IHRkID0gaXRlbVtpXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0ZCcpXHJcbiAgLy8gICAgICAgICAgIHRkWzBdLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXHJcbiAgLy8gICAgICAgICAgICAgJ2lucHV0J1xyXG4gIC8vICAgICAgICAgICApWzBdLnZhbHVlID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52ci5jb250ZW50W2luZGV4XS5uYW1lXHJcbiAgLy8gICAgICAgICAgIHRkWzFdLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXHJcbiAgLy8gICAgICAgICAgICAgJ2lucHV0J1xyXG4gIC8vICAgICAgICAgICApWzBdLnZhbHVlID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52ci5jb250ZW50W2luZGV4XS51cmxcclxuICAvLyAgICAgICAgICAgbGV0IGJ0biA9IGl0ZW1baV0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2J1dHRvbicpXHJcbiAgLy8gICAgICAgICAgIGZvciAobGV0IG4gPSAwOyBuIDwgYnRuLmxlbmd0aDsgbisrKSB7XHJcbiAgLy8gICAgICAgICAgICAgaWYgKCFidG5bbl0gfHwgIWJ0bltuXS5hdHRyaWJ1dGVzKSB7XHJcbiAgLy8gICAgICAgICAgICAgICBjb250aW51ZVxyXG4gIC8vICAgICAgICAgICAgIH1cclxuICAvLyAgICAgICAgICAgICBmb3IgKGxldCBtIG9mIGJ0bltuXS5hdHRyaWJ1dGVzKSB7XHJcbiAgLy8gICAgICAgICAgICAgICBpZiAobS5uYW1lID09PSAnQGNsaWNrJykge1xyXG4gIC8vICAgICAgICAgICAgICAgICBidG5bbl0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBlID0+IHtcclxuICAvLyAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGZ1blttLnZhbHVlXSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gIC8vICAgICAgICAgICAgICAgICAgICAgZnVuW20udmFsdWVdKFxyXG4gIC8vICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogdGRbMF0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaW5wdXQnKVswXS52YWx1ZSxcclxuICAvLyAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6IHRkWzFdLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2lucHV0JylbMF0udmFsdWVcclxuICAvLyAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAvLyAgICAgICAgICAgICAgICAgICAgICAgaVxyXG4gIC8vICAgICAgICAgICAgICAgICAgICAgKVxyXG4gIC8vICAgICAgICAgICAgICAgICAgIH1cclxuICAvLyAgICAgICAgICAgICAgICAgfSlcclxuICAvLyAgICAgICAgICAgICAgICAgYnRuW25dLmF0dHJpYnV0ZXMucmVtb3ZlTmFtZWRJdGVtKG0ubmFtZSlcclxuICAvLyAgICAgICAgICAgICAgICAgYnJlYWtcclxuICAvLyAgICAgICAgICAgICAgIH1cclxuICAvLyAgICAgICAgICAgICB9XHJcbiAgLy8gICAgICAgICAgIH1cclxuICAvLyAgICAgICAgICAgYnJlYWtcclxuICAvLyAgICAgICAgIH1cclxuICAvLyAgICAgICB9XHJcbiAgLy8gICAgIH0sXHJcbiAgLy8gICAgIHZyRGVsZXRlOiBpID0+IHtcclxuICAvLyAgICAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnQuc3BsaWNlKGksIDEpXHJcbiAgLy8gICAgICAgdGhpcy5hdHRyaWJ1dGVWciA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudFxyXG4gIC8vICAgICB9LFxyXG5cclxuICAvLyAgICAgY29uZmlybUVkaXQ6ICh2YWx1ZSwgaSkgPT4ge1xyXG4gIC8vICAgICAgIGxldCBuYW1lID0gdmFsdWUubmFtZSAmJiB2YWx1ZS5uYW1lLnJlcGxhY2UoL1xccy9nLCAnJylcclxuICAvLyAgICAgICBsZXQgdXJsID0gdmFsdWUudXJsICYmIHZhbHVlLnVybC5yZXBsYWNlKC9cXHMvZywgJycpXHJcbiAgLy8gICAgICAgaWYgKG5hbWUgJiYgdXJsKSB7XHJcbiAgLy8gICAgICAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnRbaV0gPSB2YWx1ZVxyXG4gIC8vICAgICAgIH0gZWxzZSB7XHJcbiAgLy8gICAgICAgICB3aW5kb3cuRUxFTUVOVCAmJlxyXG4gIC8vICAgICAgICAgICB3aW5kb3cuRUxFTUVOVC5NZXNzYWdlKHtcclxuICAvLyAgICAgICAgICAgICBtZXNzYWdlOiAn5ZCN56ew5oiW6ZO+5o6l5LiN6IO95Li656m677yBJyxcclxuICAvLyAgICAgICAgICAgICB0eXBlOiAnd2FybmluZycsXHJcbiAgLy8gICAgICAgICAgICAgZHVyYXRpb246IDE1MDBcclxuICAvLyAgICAgICAgICAgfSlcclxuICAvLyAgICAgICB9XHJcbiAgLy8gICAgICAgdGhpcy5hdHRyaWJ1dGVWciA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudFxyXG4gIC8vICAgICB9LFxyXG4gIC8vICAgICBjYW5jZWxFZGl0OiAoKSA9PiB7XHJcbiAgLy8gICAgICAgdGhpcy5hdHRyaWJ1dGVWciA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudFxyXG4gIC8vICAgICB9LFxyXG4gIC8vICAgICBmaWxlU2VsZWN0OiAodmFsdWUsIGkpID0+IHtcclxuICAvLyAgICAgICBsZXQgZmlsZUVsbSA9IGl0ZW1baV0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnZmlsZS1zZWxlY3QnKVswXVxyXG4gIC8vICAgICAgIGZpbGVFbG0uY2xpY2soKVxyXG4gIC8vICAgICAgIGZpbGVFbG0ucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgZmlsZVNlbGVjdClcclxuICAvLyAgICAgICBmaWxlRWxtLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGZpbGVTZWxlY3QpXHJcbiAgLy8gICAgIH1cclxuICAvLyAgIH1cclxuICAvLyAgIGxldCBmaWxlU2VsZWN0ID0gZXZlbnQgPT4ge1xyXG4gIC8vICAgICBpZiAoZXZlbnQudGFyZ2V0LnZhbHVlKSB7XHJcbiAgLy8gICAgICAgbGV0IHRkID0gaXRlbVtcclxuICAvLyAgICAgICAgIGV2ZW50LnRhcmdldC5nZXRBdHRyaWJ1dGUoJ2luZGV4JylcclxuICAvLyAgICAgICBdLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RkJylcclxuICAvLyAgICAgICB0ZFsxXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdpbnB1dCcpWzBdLnZhbHVlID0gZXZlbnQudGFyZ2V0LnZhbHVlXHJcbiAgLy8gICAgICAgZXZlbnQudGFyZ2V0LnZhbHVlID0gbnVsbFxyXG4gIC8vICAgICB9XHJcbiAgLy8gICB9XHJcbiAgLy8gICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW0ubGVuZ3RoOyBpKyspIHtcclxuICAvLyAgICAgbGV0IGJ0biA9IGl0ZW1baV0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2J1dHRvbicpXHJcbiAgLy8gICAgIGZvciAobGV0IG4gPSAwOyBuIDwgYnRuLmxlbmd0aDsgbisrKSB7XHJcbiAgLy8gICAgICAgaWYgKCFidG5bbl0gfHwgIWJ0bltuXS5hdHRyaWJ1dGVzKSB7XHJcbiAgLy8gICAgICAgICBjb250aW51ZVxyXG4gIC8vICAgICAgIH1cclxuICAvLyAgICAgICBmb3IgKGxldCBtIG9mIGJ0bltuXS5hdHRyaWJ1dGVzKSB7XHJcbiAgLy8gICAgICAgICBpZiAobS5uYW1lID09PSAnQGNsaWNrJykge1xyXG4gIC8vICAgICAgICAgICBidG5bbl0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBlID0+IHtcclxuICAvLyAgICAgICAgICAgICBpZiAodHlwZW9mIGZ1blttLnZhbHVlXSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gIC8vICAgICAgICAgICAgICAgZnVuW20udmFsdWVdKGkpXHJcbiAgLy8gICAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgICB9KVxyXG4gIC8vICAgICAgICAgICBidG5bbl0uYXR0cmlidXRlcy5yZW1vdmVOYW1lZEl0ZW0obS5uYW1lKVxyXG4gIC8vICAgICAgICAgICBicmVha1xyXG4gIC8vICAgICAgICAgfVxyXG4gIC8vICAgICAgIH1cclxuICAvLyAgICAgfVxyXG4gIC8vICAgfVxyXG4gIC8vIH1cclxuXHJcbiAgLy8gZ2V0IGF0dHJpYnV0ZUdvb2RzKCkge1xyXG4gIC8vICAgcmV0dXJuIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUuZ29vZHMuY29udGVudFxyXG4gIC8vIH1cclxuXHJcbiAgLy8gc2V0IGF0dHJpYnV0ZUdvb2RzKHYpIHtcclxuICAvLyAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUuZ29vZHMuY29udGVudCA9IHZcclxuICAvLyB9XHJcblxyXG4gIGdldCBwb3NpdGlvbnMoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLnBvc2l0aW9uc1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGFzeW5jIGNyZWF0ZUxhYmVsKHRoYXQpIHtcclxuICAgIGxldCBoZWlnaHRcclxuICAgIGxldCBncm91bmRcclxuICAgIHN3aXRjaCAodGhhdC5vcHRpb25zLmhlaWdodE1vZGUpIHtcclxuICAgICAgY2FzZSAnMCc6XHJcbiAgICAgIGNhc2UgMDpcclxuICAgICAgICBncm91bmQgPSBmYWxzZVxyXG4gICAgICAgIGhlaWdodCA9IHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbMF0uYWx0XHJcbiAgICAgICAgYnJlYWtcclxuICAgICAgY2FzZSAnMSc6XHJcbiAgICAgIGNhc2UgMTpcclxuICAgICAgICBncm91bmQgPSBmYWxzZVxyXG4gICAgICAgIGhlaWdodCA9IGF3YWl0IHRoYXQuZ2V0Q2xhbXBUb0hlaWdodCh7XHJcbiAgICAgICAgICBsbmc6IHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbMF0ubG5nLFxyXG4gICAgICAgICAgbGF0OiB0aGF0Lm9wdGlvbnMucG9zaXRpb25zWzBdLmxhdFxyXG4gICAgICAgIH0pICsgdGhhdC5vcHRpb25zLnBvc2l0aW9uc1swXS5hbHRcclxuICAgICAgICBicmVha1xyXG4gICAgICBjYXNlICcyJzpcclxuICAgICAgY2FzZSAyOlxyXG4gICAgICAgIGdyb3VuZCA9IHRydWVcclxuICAgICAgICBoZWlnaHQgPSBhd2FpdCB0aGF0LmdldENsYW1wVG9IZWlnaHQoe1xyXG4gICAgICAgICAgbG5nOiB0aGF0Lm9wdGlvbnMucG9zaXRpb25zWzBdLmxuZyxcclxuICAgICAgICAgIGxhdDogdGhhdC5vcHRpb25zLnBvc2l0aW9uc1swXS5sYXRcclxuICAgICAgICB9KVxyXG4gICAgICAgIGJyZWFrXHJcbiAgICB9XHJcbiAgICBpZiAoIXRoYXQub3B0aW9ucy5sYWJlbC5wb3NpdGlvbikge1xyXG4gICAgICB0aGF0Lm9wdGlvbnMubGFiZWwucG9zaXRpb24gPSB7XHJcbiAgICAgICAgbG5nOiB0aGF0Lm9wdGlvbnMucG9zaXRpb25zWzBdLmxuZyxcclxuICAgICAgICBsYXQ6IHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbMF0ubGF0LFxyXG4gICAgICAgIGFsdDogaGVpZ2h0XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoYXQubGFiZWwgPSBuZXcgTGFiZWxPYmplY3QodGhhdC5zZGssIHtcclxuICAgICAgaWQ6IHRoYXQub3B0aW9ucy5pZCxcclxuICAgICAgc2hvdzogdGhhdC5vcHRpb25zLnNob3cgPyB0aGF0Lm9wdGlvbnMubGFiZWwuc2hvdyA6IGZhbHNlLFxyXG4gICAgICBwb3NpdGlvbjogW1xyXG4gICAgICAgIHRoYXQub3B0aW9ucy5sYWJlbC5wb3NpdGlvbi5sbmcsXHJcbiAgICAgICAgdGhhdC5vcHRpb25zLmxhYmVsLnBvc2l0aW9uLmxhdCxcclxuICAgICAgICB0aGF0Lm9wdGlvbnMubGFiZWwucG9zaXRpb24uYWx0XHJcbiAgICAgIF0sXHJcbiAgICAgIHRleHQ6IHRoYXQub3B0aW9ucy5uYW1lLFxyXG4gICAgICBmb250U2l6ZTogdGhhdC5vcHRpb25zLmxhYmVsLmZvbnRTaXplLFxyXG4gICAgICBmb250RmFtaWx5OiB0aGF0Lm9wdGlvbnMubGFiZWwuZm9udEZhbWlseSxcclxuICAgICAgY29sb3I6IHRoYXQub3B0aW9ucy5sYWJlbC5jb2xvcixcclxuICAgICAgcGl4ZWxPZmZzZXQ6IHRoYXQub3B0aW9ucy5sYWJlbC5waXhlbE9mZnNldCxcclxuICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGF0Lm9wdGlvbnMubGFiZWwuYmFja2dyb3VuZENvbG9yLFxyXG4gICAgICBsaW5lQ29sb3I6IHRoYXQub3B0aW9ucy5sYWJlbC5saW5lQ29sb3IsXHJcbiAgICAgIGxpbmVXaWR0aDogdGhhdC5vcHRpb25zLmxhYmVsLmxpbmVXaWR0aCxcclxuICAgICAgc2NhbGVCeURpc3RhbmNlOiB0aGF0Lm9wdGlvbnMubGFiZWwuc2NhbGVCeURpc3RhbmNlLFxyXG4gICAgICBuZWFyOiB0aGF0Lm9wdGlvbnMubGFiZWwubmVhcixcclxuICAgICAgZmFyOiB0aGF0Lm9wdGlvbnMubGFiZWwuZmFyLFxyXG4gICAgICBncm91bmQ6IGdyb3VuZFxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIHN0YXRpYyBjcmVhdGUodGhhdCkge1xyXG5cclxuICAgIGxldCBncm91bmRcclxuICAgIGlmICh0aGF0LmhlaWdodE1vZGUgPT0gMikge1xyXG4gICAgICBncm91bmQgPSB0cnVlXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBncm91bmQgPSBmYWxzZVxyXG4gICAgfVxyXG4gICAgbGV0IHBvc2l0aW9ucyA9IHRoYXQub3B0aW9ucy5wb3NpdGlvbnNcclxuICAgIGxldCBmcm9tRGVncmVlc0FycmF5ID0gdGhhdC5yZW5ld1Bvc2l0aW9ucyhwb3NpdGlvbnMpXHJcbiAgICB0aGF0LmVudGl0eSA9IHRoYXQuc2RrLnZpZXdlci5lbnRpdGllcy5hZGQoe1xyXG4gICAgICBpZDogdGhhdC5vcHRpb25zLmlkLFxyXG4gICAgICBzaG93OiB0aGF0Lm9wdGlvbnMuc2hvdyxcclxuICAgICAgcG9seWxpbmU6IHtcclxuICAgICAgICBwb3NpdGlvbnM6IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzQXJyYXlIZWlnaHRzKGZyb21EZWdyZWVzQXJyYXkpLFxyXG4gICAgICAgIHdpZHRoOiB0aGF0Lm9wdGlvbnMud2lkdGgsXHJcbiAgICAgICAgY2xhbXBUb0dyb3VuZDogZ3JvdW5kLFxyXG4gICAgICAgIC8vIG1hdGVyaWFsOiB0aGF0LmdldE1hdGVyaWFsKHRoYXQub3B0aW9ucy5jb2xvciwgdGhhdC5vcHRpb25zLnR5cGUsIHRoYXQuZW50aXR5LCB0aGF0Lm9wdGlvbnMpLFxyXG4gICAgICAgIHpJbmRleDogdGhhdC5zZGsuX2VudGl0eVpJbmRleFxyXG4gICAgICB9XHJcbiAgICB9KVxyXG5cclxuICAgIHRoYXQuZW50aXR5LnBvbHlsaW5lLm9yaVdpZHRoID0gdGhhdC5vcHRpb25zLndpZHRoXHJcbiAgICB0aGF0Lmp1ZGdlTGluZSh0aGF0LmVudGl0eSwgdGhhdC5vcHRpb25zKVxyXG4gICAgbGV0IHBhcmFtcyA9IHsgLi4udGhhdC5vcHRpb25zIH1cclxuICAgIHBhcmFtcy5zcGVlZCA9IHRoYXQuaW5wdXRTcGVlZFxyXG4gICAgdGhhdC5lbnRpdHkucG9seWxpbmUubWF0ZXJpYWwgPSB0aGF0LmdldE1hdGVyaWFsKFxyXG4gICAgICB0aGF0Lm9wdGlvbnMuY29sb3IsXHJcbiAgICAgIHRoYXQub3B0aW9ucy50eXBlLFxyXG4gICAgICB0aGF0LmVudGl0eSxcclxuICAgICAgcGFyYW1zXHJcbiAgICApXHJcbiAgICB0aGF0LnNkay5fZW50aXR5WkluZGV4KytcclxuICAgIFBvbHlsaW5lT2JqZWN0LmNyZWF0ZUxhYmVsKHRoYXQpXHJcbiAgICAvLyB0aGF0LmVudGl0eS5wb2x5bGluZS5wb3NpdGlvbnNMbmdMYXQgPSBwb3NpdGlvbnNcclxuICAgIHRoYXQucmVuZXdQb2x5Z29uKGZyb21EZWdyZWVzQXJyYXkpXHJcbiAgICB0aGF0LmNvbXB1dGVEaXN0YW5jZShcclxuICAgICAgcG9zaXRpb25zLFxyXG4gICAgICAyLFxyXG4gICAgICB0aGF0Lm9wdGlvbnMud29yZHNOYW1lXHJcbiAgICApLnRoZW4ocmVzID0+IHtcclxuICAgICAgdGhhdC5sZW5ndGhCeU1ldGVyID0gcmVzXHJcbiAgICAgIHRoYXQubGVuZ3RoQ2hhbmdlQ2FsbEJhY2sgJiYgdGhhdC5sZW5ndGhDaGFuZ2VDYWxsQmFjaygpXHJcbiAgICAgIHN5bmNEYXRhKHRoYXQuc2RrLCB0aGF0Lm9wdGlvbnMuaWQpXHJcbiAgICB9KVxyXG4gICAgaWYgKHRoYXQub3B0aW9ucy5zaG93KSB7XHJcbiAgICAgIHNldFNwbGl0RGlyZWN0aW9uKDAsIHRoYXQub3B0aW9ucy5pZClcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy8gaWYgKHRoaXMub3B0aW9ucy5ub3NlVG9UYWlsKSB7XHJcbiAgICAvLyAgIGxldCBhcnJheSA9IFtdXHJcbiAgICAvLyAgIGZvciAobGV0IGkgPSAwOyBpIDwgZnJvbURlZ3JlZXNBcnJheS5sZW5ndGg7IGkgKz0gMikge1xyXG4gICAgLy8gICAgIGFycmF5LnB1c2goeyBsbmc6IGZyb21EZWdyZWVzQXJyYXlbaV0sIGxhdDogZnJvbURlZ3JlZXNBcnJheVtpICsgMV0gfSlcclxuICAgIC8vICAgfVxyXG4gICAgLy8gICB0aGlzLm9wdGlvbnMuZml0X2xlbmd0aCA9IHRvb2wuY29tcHV0ZURpc3RhbmNlKGFycmF5KVxyXG4gICAgLy8gfVxyXG4gICAgLy8gZWxzZSB7XHJcbiAgICAvLyAgIHRoaXMub3B0aW9ucy5maXRfbGVuZ3RoID0gdG9vbC5jb21wdXRlRGlzdGFuY2UocG9zaXRpb25zKVxyXG4gICAgLy8gfVxyXG4gICAgLy8gaWYgKHRoaXMub3B0aW9ucy5maXRfbGVuZ3RoX3VuaXQgPT09ICdrbScpIHtcclxuICAgIC8vICAgdGhpcy5vcHRpb25zLmZpdF9sZW5ndGggPSB0aGlzLm9wdGlvbnMuZml0X2xlbmd0aCAvIDEwMDBcclxuICAgIC8vIH1cclxuXHJcbiAgICBsZXQgc2NlbmUgPSB0aGF0LnNkay52aWV3ZXIuc2NlbmVcclxuICB9XHJcbiAganVkZ2VMaW5lKGVudGl0eSwgbmV3UGFyYW0pIHtcclxuICAgIGlmICghZW50aXR5LnBvbHlsaW5lLm9yaVJlcGVhdCkge1xyXG4gICAgICBsZXQgcGFyYW0gPSB7XHJcbiAgICAgICAgY29sb3I6IG5ld1BhcmFtLmNvbG9yLFxyXG4gICAgICAgIGltYWdlOiB0aGlzLmdldFNvdXJjZVJvb3RQYXRoKCkgKyBgL2ltZy9hcnJvdy8xLnBuZ2AsXHJcbiAgICAgICAgc3BhY2U6IG5ld1BhcmFtLnNwYWNlLFxyXG4gICAgICAgIHNwZWVkOiBuZXdQYXJhbS5zcGVlZFxyXG4gICAgICB9XHJcblxyXG4gICAgICBwYXJhbS5zcGVlZCA9IG5ld1BhcmFtLnJvdGF0ZSA/IHBhcmFtLnNwZWVkIDogMCAtIHBhcmFtLnNwZWVkXHJcblxyXG4gICAgICBjb25zdCBjYW52YXNFbGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcclxuICAgICAgY29uc3QgY3R4ID0gY2FudmFzRWxlLmdldENvbnRleHQoJzJkJylcclxuICAgICAgY29uc3QgbXlJbWcgPSBuZXcgSW1hZ2UoKVxyXG4gICAgICAvLyBteUltZy5zcmMgPSB0aGF0LmdldFNvdXJjZVJvb3RQYXRoKCkgKyAnL2ltZy9hcnJvdy8xLnBuZydcclxuICAgICAgbXlJbWcuc3JjID0gcGFyYW0uaW1hZ2VcclxuICAgICAgbGV0IHRoYXQgPSB0aGlzXHJcbiAgICAgIG15SW1nLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBjYW52YXNFbGUud2lkdGggPSBteUltZy53aWR0aCAqIChwYXJhbS5zcGFjZSArIDEpXHJcbiAgICAgICAgY2FudmFzRWxlLmhlaWdodCA9IG15SW1nLmhlaWdodFxyXG5cclxuICAgICAgICBsZXQgb3JpUmVwZWF0ID0gdGhhdC5nZXRTY2VlbkxpbmUoZW50aXR5LCBwYXJhbSwgY2FudmFzRWxlKVxyXG4gICAgICAgIG9yaVJlcGVhdCAmJiAoZW50aXR5LnBvbHlsaW5lLm9yaVJlcGVhdCA9IG9yaVJlcGVhdClcclxuXHJcblxyXG4gICAgICAgIHZhciBwb3NpdGlvblByb3BlcnR5ID0gZW50aXR5LnBvbHlsaW5lLnBvc2l0aW9ucztcclxuICAgICAgICB2YXIgcG9zaXRpb25zID0gcG9zaXRpb25Qcm9wZXJ0eS5nZXRWYWx1ZSh0aGF0LnNkay52aWV3ZXIuY2xvY2suY3VycmVudFRpbWUpO1xyXG5cclxuICAgICAgICBpZiAoIUNlc2l1bS5kZWZpbmVkKHBvc2l0aW9ucykpIHtcclxuICAgICAgICAgIHJldHVybiBuZXcgQ2VzaXVtLkNhcnRlc2lhbjIoMS4wLCAxLjApO1xyXG4gICAgICAgICAgLy8gcmV0dXJuIDEuMDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBkaXN0YW5jZSA9IDA7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwb3NpdGlvbnMubGVuZ3RoIC0gMTsgKytpKSB7XHJcbiAgICAgICAgICBkaXN0YW5jZSArPSBDZXNpdW0uQ2FydGVzaWFuMy5kaXN0YW5jZShwb3NpdGlvbnNbaV0sIHBvc2l0aW9uc1tpICsgMV0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIHJlcGVhdFggPSBkaXN0YW5jZSAvIGVudGl0eS5wb2x5bGluZS53aWR0aC5nZXRWYWx1ZSgpO1xyXG4gICAgICAgIC8vIOagueaNruWcsOWbvue8qeaUvueoi+W6puiwg+aVtHJlcGVhdFhcclxuICAgICAgICB2YXIgY2FtZXJhSGVpZ2h0ID0gdGhhdC5zZGsudmlld2VyLmNhbWVyYS5wb3NpdGlvbkNhcnRvZ3JhcGhpYy5oZWlnaHQ7XHJcbiAgICAgICAgdmFyIGJvdW5kaW5nU3BoZXJlID0gbmV3IENlc2l1bS5Cb3VuZGluZ1NwaGVyZShcclxuICAgICAgICAgIG5ldyBDZXNpdW0uQ2FydGVzaWFuMygtMTAwMDAwMCwgMCwgMCksIC8vIOS4reW/g+eCueWdkOagh1xyXG4gICAgICAgICAgNTAwMDAwIC8vIOWNiuW+hO+8iOi3neemu++8iVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIC8vIOiOt+WPlue7mOWbvue8k+WGsuWMuueahOWuveW6puWSjOmrmOW6pu+8iOmAmuW4uOaYr+Wxj+W5leeahOWIhui+qOeOh++8iVxyXG4gICAgICAgIHZhciBkcmF3aW5nQnVmZmVyV2lkdGggPSB0aGF0LnNkay52aWV3ZXIuY2FudmFzLmNsaWVudFdpZHRoO1xyXG4gICAgICAgIHZhciBkcmF3aW5nQnVmZmVySGVpZ2h0ID0gdGhhdC5zZGsudmlld2VyLmNhbnZhcy5jbGllbnRIZWlnaHQ7XHJcblxyXG4gICAgICAgIC8vIOS9v+eUqCBnZXRQaXhlbFNpemUg5pa55rOV6I635Y+W5YyF5Zu055CD5Zyo5bGP5bmV5LiK55qE5YOP57Sg5aSn5bCPXHJcbiAgICAgICAgdmFyIGdyb3VuZFJlc29sdXRpb24gPSB0aGF0LnNkay52aWV3ZXIuc2NlbmUuY2FtZXJhLmdldFBpeGVsU2l6ZShib3VuZGluZ1NwaGVyZSwgZHJhd2luZ0J1ZmZlcldpZHRoLCBkcmF3aW5nQnVmZmVySGVpZ2h0KVxyXG4gICAgICAgIHJlcGVhdFggKj0gZ3JvdW5kUmVzb2x1dGlvbiAvIGNhbWVyYUhlaWdodCAvIChwYXJhbS5zcGFjZSAqIChjYW52YXNFbGUud2lkdGggLyBjYW52YXNFbGUuaGVpZ2h0ICogNSkgKyAxKTtcclxuICAgICAgICAvLyBpZiAoZW50aXR5LnBvbHlsaW5lLm1hdGVyaWFsLm9yaVJlcGVhdCkge1xyXG5cclxuICAgICAgICBpZiAodGhhdC5zZGsudmlld2VyLnNjZW5lLm1vZGUgPT09IENlc2l1bS5TY2VuZU1vZGUuU0NFTkUzRCkge1xyXG4gICAgICAgICAgbGV0IHNwZWVkID0gcmVwZWF0WCAvIGVudGl0eS5wb2x5bGluZS5vcmlSZXBlYXRcclxuICAgICAgICAgIGVudGl0eS5wb2x5bGluZS5vcmlTcGVlZCA9IHNwZWVkXHJcbiAgICAgICAgICBlbnRpdHkucG9seWxpbmUub3JpUmVwZWF0WCA9IHJlcGVhdFhcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgbGV0IHNkazNkID0gZ2V0M0RWaWV3KClcclxuICAgICAgICAgIGxldCBzZGszZEVudGl0eSA9IHNkazNkLnZpZXdlci5lbnRpdGllcy5nZXRCeUlkKHRoYXQub3B0aW9ucy5pZClcclxuICAgICAgICAgIGVudGl0eS5wb2x5bGluZS5vcmlTcGVlZCA9IHNkazNkRW50aXR5LnBvbHlsaW5lLm9yaVNwZWVkXHJcbiAgICAgICAgICBlbnRpdHkucG9seWxpbmUub3JpUmVwZWF0WCA9IHNkazNkRW50aXR5LnBvbHlsaW5lLm9yaVJlcGVhdFhcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcblxyXG5cclxuXHJcbiAgICB9XHJcbiAgfVxyXG4gIC8qKuiOt+WPluW9k+WJjea7oeWxj+aoque6v+mAn+W6piAqL1xyXG4gIGdldFNjZWVuTGluZShlbnRpdHksIG9wdGlvbnMsIGNhbnZhc0VsZSkge1xyXG4gICAgbGV0IHBvaW50MSA9IG5ldyBDZXNpdW0uQ2FydGVzaWFuMigwLCB0aGlzLnNkay52aWV3ZXIuY2FudmFzLmNsaWVudEhlaWdodClcclxuICAgIGxldCBwb2ludDIgPSBuZXcgQ2VzaXVtLkNhcnRlc2lhbjIodGhpcy5zZGsudmlld2VyLmNhbnZhcy5jbGllbnRXaWR0aCAvIDIsIHRoaXMuc2RrLnZpZXdlci5jYW52YXMuY2xpZW50SGVpZ2h0KVxyXG4gICAgLy8gdmFyIGNhcnRlc2lhbjEgPSB0aGlzLnNkay52aWV3ZXIuc2NlbmUucGlja1Bvc2l0aW9uKHBvaW50MSlcclxuICAgIC8vIHZhciBjYXJ0ZXNpYW4yID0gdGhpcy5zZGsudmlld2VyLnNjZW5lLnBpY2tQb3NpdGlvbihwb2ludDIpXHJcblxyXG4gICAgbGV0IHJheSA9IHRoaXMuc2RrLnZpZXdlci5jYW1lcmEuZ2V0UGlja1JheShwb2ludDEpO1xyXG4gICAgbGV0IGNhcnRlc2lhbjEgPSB0aGlzLnNkay52aWV3ZXIuc2NlbmUuZ2xvYmUucGljayhyYXksIHRoaXMuc2RrLnZpZXdlci5zY2VuZSk7XHJcblxyXG4gICAgbGV0IHJheTIgPSB0aGlzLnNkay52aWV3ZXIuY2FtZXJhLmdldFBpY2tSYXkocG9pbnQyKTtcclxuICAgIGxldCBjYXJ0ZXNpYW4yID0gdGhpcy5zZGsudmlld2VyLnNjZW5lLmdsb2JlLnBpY2socmF5MiwgdGhpcy5zZGsudmlld2VyLnNjZW5lKTtcclxuICAgIC8vIGlmICghY2FydGVzaWFuMSB8fCAhY2FydGVzaWFuMikge1xyXG4gICAgLy8gICBsZXQgcmF5ID0gdGhpcy5zZGsudmlld2VyLmNhbWVyYS5nZXRQaWNrUmF5KHBvaW50MSk7XHJcbiAgICAvLyAgIGNhcnRlc2lhbjEgPSB0aGlzLnNkay52aWV3ZXIuc2NlbmUuZ2xvYmUucGljayhyYXksIHRoaXMuc2RrLnZpZXdlci5zY2VuZSk7XHJcblxyXG4gICAgLy8gICBsZXQgcmF5MiA9IHRoaXMuc2RrLnZpZXdlci5jYW1lcmEuZ2V0UGlja1JheShwb2ludDIpO1xyXG4gICAgLy8gICBjYXJ0ZXNpYW4yID0gdGhpcy5zZGsudmlld2VyLnNjZW5lLmdsb2JlLnBpY2socmF5MiwgdGhpcy5zZGsudmlld2VyLnNjZW5lKTtcclxuICAgIC8vIH1cclxuICAgIGlmIChjYXJ0ZXNpYW4xICYmIGNhcnRlc2lhbjIpIHtcclxuXHJcblxyXG4gICAgICB2YXIgZGlzdGFuY2UgPSBDZXNpdW0uQ2FydGVzaWFuMy5kaXN0YW5jZShjYXJ0ZXNpYW4xLCBjYXJ0ZXNpYW4yKTtcclxuXHJcbiAgICAgIHZhciByZXBlYXRYID0gZGlzdGFuY2UgLyBlbnRpdHkucG9seWxpbmUud2lkdGguZ2V0VmFsdWUoKTtcclxuICAgICAgLy8g5qC55o2u5Zyw5Zu+57yp5pS+56iL5bqm6LCD5pW0cmVwZWF0WFxyXG4gICAgICB2YXIgY2FtZXJhSGVpZ2h0ID0gdGhpcy5zZGsudmlld2VyLmNhbWVyYS5wb3NpdGlvbkNhcnRvZ3JhcGhpYy5oZWlnaHQ7XHJcbiAgICAgIHZhciBib3VuZGluZ1NwaGVyZSA9IG5ldyBDZXNpdW0uQm91bmRpbmdTcGhlcmUoXHJcbiAgICAgICAgbmV3IENlc2l1bS5DYXJ0ZXNpYW4zKC0xMDAwMDAwLCAwLCAwKSwgLy8g5Lit5b+D54K55Z2Q5qCHXHJcbiAgICAgICAgNTAwMDAwIC8vIOWNiuW+hO+8iOi3neemu++8iVxyXG4gICAgICApO1xyXG5cclxuXHJcbiAgICAgIC8vIOiOt+WPlue7mOWbvue8k+WGsuWMuueahOWuveW6puWSjOmrmOW6pu+8iOmAmuW4uOaYr+Wxj+W5leeahOWIhui+qOeOh++8iVxyXG4gICAgICB2YXIgZHJhd2luZ0J1ZmZlcldpZHRoID0gdGhpcy5zZGsudmlld2VyLmNhbnZhcy5jbGllbnRXaWR0aDtcclxuICAgICAgdmFyIGRyYXdpbmdCdWZmZXJIZWlnaHQgPSB0aGlzLnNkay52aWV3ZXIuY2FudmFzLmNsaWVudEhlaWdodDtcclxuXHJcbiAgICAgIC8vIOS9v+eUqCBnZXRQaXhlbFNpemUg5pa55rOV6I635Y+W5YyF5Zu055CD5Zyo5bGP5bmV5LiK55qE5YOP57Sg5aSn5bCPXHJcbiAgICAgIHZhciBncm91bmRSZXNvbHV0aW9uID0gdGhpcy5zZGsudmlld2VyLnNjZW5lLmNhbWVyYS5nZXRQaXhlbFNpemUoYm91bmRpbmdTcGhlcmUsIGRyYXdpbmdCdWZmZXJXaWR0aCwgZHJhd2luZ0J1ZmZlckhlaWdodClcclxuICAgICAgLy8gcmVwZWF0WCAqPSBncm91bmRSZXNvbHV0aW9uIC8gY2FtZXJhSGVpZ2h0IC8gKChteUltZy53aWR0aCAvIG15SW1nLmhlaWdodCAqIDUpICsgMSk7XHJcbiAgICAgIGlmIChncm91bmRSZXNvbHV0aW9uID4gNzAwKSB7XHJcbiAgICAgICAgcmVwZWF0WCAqPSBncm91bmRSZXNvbHV0aW9uIC8gY2FtZXJhSGVpZ2h0IC8gKG9wdGlvbnMuc3BhY2UgKiAoY2FudmFzRWxlLndpZHRoIC8gY2FudmFzRWxlLmhlaWdodCAqIDUpICsgMSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmVwZWF0WCA9IHVuZGVmaW5lZDtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHRoaXMuc2RrLnZpZXdlci5zY2VuZS5tb2RlID09PSBDZXNpdW0uU2NlbmVNb2RlLlNDRU5FM0QpIHtcclxuICAgICAgICByZXR1cm4gcmVwZWF0WFxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGxldCBzZGszZCA9IGdldDNEVmlldygpXHJcbiAgICAgICAgbGV0IHNkazNkRW50aXR5ID0gc2RrM2Qudmlld2VyLmVudGl0aWVzLmdldEJ5SWQodGhpcy5vcHRpb25zLmlkKVxyXG4gICAgICAgIHJldHVybiBzZGszZEVudGl0eS5wb2x5bGluZS5vcmlSZXBlYXRYXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbiAgLyoqXHJcbiAgICog57yW6L6R5qGGXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBzdGF0ZSB0cnVl5omT5byA77yMZmFsc2XlhbPpl61cclxuICAgKi9cclxuICBhc3luYyBlZGl0KHN0YXRlKSB7XHJcbiAgICByZXR1cm5cclxuICAgIGxldCBfdGhpcyA9IHRoaXNcclxuICAgIHRoaXMub3JpZ2luYWxPcHRpb25zID0gdGhpcy5kZWVwQ29weU9iaih0aGlzLm9wdGlvbnMpXHJcbiAgICBpZiAodGhpcy5fRGlhbG9nT2JqZWN0ICYmIHRoaXMuX0RpYWxvZ09iamVjdC5jbG9zZSkge1xyXG4gICAgICB0aGlzLl9EaWFsb2dPYmplY3QuY2xvc2UoKVxyXG4gICAgICB0aGlzLl9EaWFsb2dPYmplY3QgPSBudWxsXHJcbiAgICB9XHJcbiAgICBpZiAoc3RhdGUpIHtcclxuICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0ID0gYXdhaXQgbmV3IERpYWxvZyh0aGlzLnNkaywgdGhpcy5vcHRpb25zLCB7XHJcbiAgICAgICAgdGl0bGU6ICfnur/lsZ7mgKcnLFxyXG4gICAgICAgIGxlZnQ6ICcxODBweCcsXHJcbiAgICAgICAgdG9wOiAnMTAwcHgnLFxyXG4gICAgICAgIGNvbmZpcm1DYWxsQmFjazogb3B0aW9ucyA9PiB7XHJcbiAgICAgICAgICB0aGlzLm5hbWUgPSB0aGlzLm5hbWUudHJpbSgpXHJcbiAgICAgICAgICBpZiAoIXRoaXMubmFtZSkge1xyXG4gICAgICAgICAgICB0aGlzLm5hbWUgPSAn5pyq5ZG95ZCN5a+56LGhJ1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5vcHRpb25zLmxhYmVsLnBvc2l0aW9uID0ge1xyXG4gICAgICAgICAgICBsbmc6IHRoaXMubGFiZWwucG9zaXRpb25bMF0sXHJcbiAgICAgICAgICAgIGxhdDogdGhpcy5sYWJlbC5wb3NpdGlvblsxXSxcclxuICAgICAgICAgICAgYWx0OiB0aGlzLmxhYmVsLnBvc2l0aW9uWzJdXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLm9yaWdpbmFsT3B0aW9ucyA9IHRoaXMuZGVlcENvcHlPYmoodGhpcy5vcHRpb25zKVxyXG4gICAgICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0LmNsb3NlKClcclxuICAgICAgICAgIHRoaXMuRGlhbG9nLmNvbmZpcm1DYWxsQmFjayAmJlxyXG4gICAgICAgICAgICB0aGlzLkRpYWxvZy5jb25maXJtQ2FsbEJhY2sodGhpcy5vcmlnaW5hbE9wdGlvbnMpXHJcbiAgICAgICAgICBzeW5jRGF0YSh0aGlzLnNkaywgdGhpcy5vcHRpb25zLmlkKVxyXG4gICAgICAgICAgc3luY1NwbGl0RGF0YSh0aGlzLnNkaywgdGhpcy5vcHRpb25zLmlkKVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgcmVzZXRDYWxsQmFjazogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5yZXNldCgpXHJcbiAgICAgICAgICB0aGlzLkRpYWxvZy5yZXNldENhbGxCYWNrICYmIHRoaXMuRGlhbG9nLnJlc2V0Q2FsbEJhY2soKVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgcmVtb3ZlQ2FsbEJhY2s6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMuRGlhbG9nLnJlbW92ZUNhbGxCYWNrICYmIHRoaXMuRGlhbG9nLnJlbW92ZUNhbGxCYWNrKClcclxuICAgICAgICB9LFxyXG4gICAgICAgIGNsb3NlQ2FsbEJhY2s6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMucmVzZXQoKVxyXG4gICAgICAgICAgdGhpcy5EaWFsb2cuY2xvc2VDYWxsQmFjayAmJiB0aGlzLkRpYWxvZy5jbG9zZUNhbGxCYWNrKClcclxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5ub2RlUG9pbnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2RrLnZpZXdlci5lbnRpdGllcy5yZW1vdmUodGhpcy5ub2RlUG9pbnRzW2ldKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5ub2RlUG9pbnRzID0gW11cclxuICAgICAgICAgIHRoaXMucG9zaXRpb25FZGl0aW5nID0gZmFsc2VcclxuICAgICAgICAgIFlKLk1lYXN1cmUuU2V0TWVhc3VyZVN0YXR1cyhmYWxzZSlcclxuICAgICAgICAgIHRoaXMuZXZlbnQgJiYgdGhpcy5ldmVudC5kZXN0cm95KClcclxuICAgICAgICAgIHRoaXMudGlwICYmIHRoaXMudGlwLmRlc3Ryb3koKVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgc2hvd0NhbGxCYWNrOiBzaG93ID0+IHtcclxuICAgICAgICAgIHRoaXMub3B0aW9ucy5zaG93ID0gc2hvd1xyXG4gICAgICAgICAgdGhpcy5vcmlnaW5hbE9wdGlvbnMuc2hvdyA9IHNob3dcclxuICAgICAgICAgIHRoaXMuc2hvdyA9IHNob3dcclxuICAgICAgICAgIHRoaXMuRGlhbG9nLnNob3dDYWxsQmFjayAmJiB0aGlzLkRpYWxvZy5zaG93Q2FsbEJhY2soKVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgdHJhbnNsYXRpb25hbENhbGxCYWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnBvc2l0aW9uRWRpdGluZyA9ICF0aGlzLnBvc2l0aW9uRWRpdGluZ1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgLy8g5LqM5qyh57yW6L6R5Zue6LCDXHJcbiAgICAgICAgc2Vjb25kYXJ5RWRpdENhbGxCYWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLm5vZGVFZGl0KClcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICAgIHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5ib2R5LmNsYXNzTmFtZSA9XHJcbiAgICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmJvZHkuY2xhc3NOYW1lICsgJyBwb2x5bGluZSdcclxuICAgICAgbGV0IGNvbnRlbnRFbG0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKVxyXG4gICAgICBjb250ZW50RWxtLmlubmVySFRNTCA9IGh0bWwodGhpcylcclxuICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0LmNvbnRlbnRBcHBDaGlsZChjb250ZW50RWxtKVxyXG4gICAgICB0aGlzLmF0dHJpYnV0ZVR5cGUgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlVHlwZVxyXG4gICAgICAvLyB0aGlzLmF0dHJpYnV0ZUNhbWVyYSA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUuY2FtZXJhLmNvbnRlbnRcclxuICAgICAgLy8gdGhpcy5hdHRyaWJ1dGVHb29kcyA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUuZ29vZHMuY29udGVudFxyXG5cclxuICAgICAgZnVuY3Rpb24gdGFiQ2xpY2soZSkge1xyXG4gICAgICAgIGlmIChlID09PSAnMicgfHwgZSA9PT0gMikgey8v54K55Ye757q/5p2h5qC35byPXHJcbiAgICAgICAgICBpZiAoMiA8IF90aGlzLm9wdGlvbnMudHlwZSAmJiBfdGhpcy5vcHRpb25zLnR5cGUgPCAxMykgey8v6LS05Zu+5Y+C5pWwXHJcbiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkYXNoVGV4dHVyZURvbScpICYmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGFzaFRleHR1cmVEb20nKS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnKVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rhc2hUZXh0dXJlRG9tJykgJiYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkYXNoVGV4dHVyZURvbScpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZScpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyDliJvlu7rmoIfnrb7pobVcclxuICAgICAgbGV0IHRhYnNFbG0gPSBuZXcgY3lfdGFicyhcclxuICAgICAgICAncG9seWxpbmUtb2JqZWN0LWVkaXQtdGFicycsXHJcbiAgICAgICAgdGFiQ2xpY2ssXHJcbiAgICAgICAgdGhpcy5zZGtcclxuICAgICAgKVxyXG4gICAgICAvLyDpopzoibLnu4Tku7ZcclxuICAgICAgbGV0IGNvbG9yUGlja2VyID0gbmV3IFlKQ29sb3JQaWNrZXIoe1xyXG4gICAgICAgIGVsOiBjb250ZW50RWxtLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2NvbG9yJylbMF0sXHJcbiAgICAgICAgc2l6ZTogJ21pbmknLCAvL+minOiJsmJveOexu+Wei1xyXG4gICAgICAgIGFscGhhOiB0cnVlLCAvL+aYr+WQpuW8gOWQr+mAj+aYjuW6plxyXG4gICAgICAgIGRlZmF1bHRDb2xvcjogdGhpcy5jb2xvcixcclxuICAgICAgICBkaXNhYmxlZDogZmFsc2UsIC8v5piv5ZCm56aB5q2i5omT5byA6aKc6Imy6YCJ5oup5ZmoXHJcbiAgICAgICAgb3BlblBpY2tlckFuaTogJ29wYWNpdHknLCAvL+aJk+W8gOminOiJsumAieaLqeWZqOWKqOeUu1xyXG4gICAgICAgIHN1cmU6IGNvbG9yID0+IHtcclxuICAgICAgICAgIHRoaXMuY29sb3IgPSBjb2xvclxyXG4gICAgICAgIH0sIC8v54K55Ye756Gu6K6k5oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgICAgY2xlYXI6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMuY29sb3IgPSAncmdiYSgyNTUsMjU1LDI1NSwxKSdcclxuICAgICAgICB9IC8v54K55Ye75riF56m65oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgIH0pXHJcbiAgICAgIGxldCBsYWJlbENvbG9yUGlja2VyID0gbmV3IFlKQ29sb3JQaWNrZXIoe1xyXG4gICAgICAgIGVsOiBjb250ZW50RWxtLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xhYmVsQ29sb3InKVswXSxcclxuICAgICAgICBzaXplOiAnbWluaScsIC8v6aKc6ImyYm9457G75Z6LXHJcbiAgICAgICAgYWxwaGE6IHRydWUsIC8v5piv5ZCm5byA5ZCv6YCP5piO5bqmXHJcbiAgICAgICAgZGVmYXVsdENvbG9yOiB0aGlzLmxhYmVsQ29sb3IsXHJcbiAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLCAvL+aYr+WQpuemgeatouaJk+W8gOminOiJsumAieaLqeWZqFxyXG4gICAgICAgIG9wZW5QaWNrZXJBbmk6ICdvcGFjaXR5JywgLy/miZPlvIDpopzoibLpgInmi6nlmajliqjnlLtcclxuICAgICAgICBzdXJlOiBjb2xvciA9PiB7XHJcbiAgICAgICAgICB0aGlzLmxhYmVsQ29sb3IgPSBjb2xvclxyXG4gICAgICAgIH0sIC8v54K55Ye756Gu6K6k5oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgICAgY2xlYXI6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMubGFiZWxDb2xvciA9ICdyZ2JhKDI1NSwyNTUsMjU1LDEpJ1xyXG4gICAgICAgIH0gLy/ngrnlh7vmuIXnqbrmjInpkq7kuovku7blm57osINcclxuICAgICAgfSlcclxuICAgICAgbGV0IGV4dGVuZENvbG9yUGlja2VyID0gbmV3IFlKQ29sb3JQaWNrZXIoe1xyXG4gICAgICAgIGVsOiBjb250ZW50RWxtLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2V4dGVuZENvbG9yJylbMF0sXHJcbiAgICAgICAgc2l6ZTogJ21pbmknLCAvL+minOiJsmJveOexu+Wei1xyXG4gICAgICAgIGFscGhhOiB0cnVlLCAvL+aYr+WQpuW8gOWQr+mAj+aYjuW6plxyXG4gICAgICAgIGRlZmF1bHRDb2xvcjogdGhpcy5leHRlbmRDb2xvcixcclxuICAgICAgICBkaXNhYmxlZDogZmFsc2UsIC8v5piv5ZCm56aB5q2i5omT5byA6aKc6Imy6YCJ5oup5ZmoXHJcbiAgICAgICAgb3BlblBpY2tlckFuaTogJ29wYWNpdHknLCAvL+aJk+W8gOminOiJsumAieaLqeWZqOWKqOeUu1xyXG4gICAgICAgIHN1cmU6IGNvbG9yID0+IHtcclxuICAgICAgICAgIHRoaXMuZXh0ZW5kQ29sb3IgPSBjb2xvclxyXG4gICAgICAgIH0sIC8v54K55Ye756Gu6K6k5oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgICAgY2xlYXI6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMuZXh0ZW5kQ29sb3IgPSAncmdiYSgyNTUsMjU1LDI1NSwxKSdcclxuICAgICAgICB9IC8v54K55Ye75riF56m65oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgIH0pXHJcbiAgICAgIGxldCBsaW5lQ29sb3JQaWNrZXIgPSBuZXcgWUpDb2xvclBpY2tlcih7XHJcbiAgICAgICAgZWw6IGNvbnRlbnRFbG0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbGFiZWxMaW5lQ29sb3InKVswXSxcclxuICAgICAgICBzaXplOiAnbWluaScsIC8v6aKc6ImyYm9457G75Z6LXHJcbiAgICAgICAgYWxwaGE6IHRydWUsIC8v5piv5ZCm5byA5ZCv6YCP5piO5bqmXHJcbiAgICAgICAgZGVmYXVsdENvbG9yOiB0aGlzLmxhYmVsTGluZUNvbG9yLFxyXG4gICAgICAgIGRpc2FibGVkOiBmYWxzZSwgLy/mmK/lkKbnpoHmraLmiZPlvIDpopzoibLpgInmi6nlmahcclxuICAgICAgICBvcGVuUGlja2VyQW5pOiAnb3BhY2l0eScsIC8v5omT5byA6aKc6Imy6YCJ5oup5Zmo5Yqo55S7XHJcbiAgICAgICAgc3VyZTogY29sb3IgPT4ge1xyXG4gICAgICAgICAgdGhpcy5sYWJlbExpbmVDb2xvciA9IGNvbG9yXHJcbiAgICAgICAgfSwgLy/ngrnlh7vnoa7orqTmjInpkq7kuovku7blm57osINcclxuICAgICAgICBjbGVhcjogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5sYWJlbExpbmVDb2xvciA9ICdyZ2JhKDI1NSwyNTUsMjU1LDEpJ1xyXG4gICAgICAgIH0gLy/ngrnlh7vmuIXnqbrmjInpkq7kuovku7blm57osINcclxuICAgICAgfSlcclxuICAgICAgX3RoaXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JTdGFydFBpY2tlciA9IG5ldyBZSkNvbG9yUGlja2VyKHtcclxuICAgICAgICBlbDogY29udGVudEVsbS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdsYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0JylbMF0sXHJcbiAgICAgICAgc2l6ZTogJ21pbmknLFxyXG4gICAgICAgIGFscGhhOiB0cnVlLFxyXG4gICAgICAgIGRlZmF1bHRDb2xvcjogdGhpcy5sYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0LFxyXG4gICAgICAgIGRpc2FibGVkOiBmYWxzZSxcclxuICAgICAgICBvcGVuUGlja2VyQW5pOiAnb3BhY2l0eScsXHJcbiAgICAgICAgc3VyZTogY29sb3IgPT4ge1xyXG4gICAgICAgICAgdGhpcy5sYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0ID0gY29sb3JcclxuICAgICAgICB9LFxyXG4gICAgICAgIGNsZWFyOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmxhYmVsQmFja2dyb3VuZENvbG9yU3RhcnQgPSAncmdiYSgyNTUsMjU1LDI1NSwxKSdcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICAgIGxldCBsYWJlbEJhY2tncm91bmRDb2xvckVuZFBpY2tlciA9IG5ldyBZSkNvbG9yUGlja2VyKHtcclxuICAgICAgICBlbDogY29udGVudEVsbS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdsYWJlbEJhY2tncm91bmRDb2xvckVuZCcpWzBdLFxyXG4gICAgICAgIHNpemU6ICdtaW5pJyxcclxuICAgICAgICBhbHBoYTogdHJ1ZSxcclxuICAgICAgICBkZWZhdWx0Q29sb3I6IHRoaXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmQsXHJcbiAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLFxyXG4gICAgICAgIG9wZW5QaWNrZXJBbmk6ICdvcGFjaXR5JyxcclxuICAgICAgICBzdXJlOiBjb2xvciA9PiB7XHJcbiAgICAgICAgICB0aGlzLmxhYmVsQmFja2dyb3VuZENvbG9yRW5kID0gY29sb3JcclxuICAgICAgICB9LFxyXG4gICAgICAgIGNsZWFyOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmxhYmVsQmFja2dyb3VuZENvbG9yRW5kID0gJ3JnYmEoMjU1LDI1NSwyNTUsMSknXHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgICBsZXQgYWxsX2VsbSA9IGNvbnRlbnRFbG0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoJyonKVxyXG4gICAgICBFdmVudEJpbmRpbmcub24odGhpcywgYWxsX2VsbSlcclxuICAgICAgdGhpcy5fZWxtcyA9IEV2ZW50QmluZGluZy5lbGVtZW50XHJcbiAgICAgIHRoaXMuX2VsbXMuY29sb3IgPSBbY29sb3JQaWNrZXJdXHJcbiAgICAgIHRoaXMuX2VsbXMubGFiZWxDb2xvciA9IFtsYWJlbENvbG9yUGlja2VyXVxyXG4gICAgICB0aGlzLl9lbG1zLmV4dGVuZENvbG9yID0gW2V4dGVuZENvbG9yUGlja2VyXVxyXG4gICAgICB0aGlzLl9lbG1zLmxhYmVsTGluZUNvbG9yID0gW2xpbmVDb2xvclBpY2tlcl1cclxuICAgICAgdGhpcy5fZWxtcy5sYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0ID0gW190aGlzLmxhYmVsQmFja2dyb3VuZENvbG9yU3RhcnRQaWNrZXJdXHJcbiAgICAgIHRoaXMuX2VsbXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmQgPSBbbGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmRQaWNrZXJdXHJcblxyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICB0aGlzLmF0dHJpYnV0ZUxpbmsgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudFxyXG4gICAgICAgIC8vIHRoaXMuYXR0cmlidXRlVnIgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnRcclxuICAgICAgICAvLyB0aGlzLmNhbWVyYVNlbGVjdCAmJiB0aGlzLmNhbWVyYVNlbGVjdCgpXHJcbiAgICAgICAgLy8gdGhpcy5nb29kc1NlbGVjdCAmJiB0aGlzLmdvb2RzU2VsZWN0KClcclxuICAgICAgICBsZXQgdGFnRGF0YSA9IHRoaXMuYXR0cmlidXRlU2VsZWN0XHJcbiAgICAgICAgbGV0IGF0dHJpYnV0ZUVsbSA9IHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXHJcbiAgICAgICAgICAnYXR0cmlidXRlLXNlbGVjdC1ib3gnXHJcbiAgICAgICAgKVswXVxyXG4gICAgICAgIGlmIChhdHRyaWJ1dGVFbG0pIHtcclxuICAgICAgICAgIGxldCBsZWdwT2JqZWN0ID0gbGVncChhdHRyaWJ1dGVFbG0sICcuYXR0cmlidXRlLXNlbGVjdCcpXHJcbiAgICAgICAgICBsZWdwT2JqZWN0LmxlZ3Bfc2VhcmNoKHRhZ0RhdGEpXHJcbiAgICAgICAgICBsZXQgYXR0cmlidXRlU2VsZWN0RWxtID0gdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnRcclxuICAgICAgICAgICAgLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2F0dHJpYnV0ZS1zZWxlY3QnKVswXVxyXG4gICAgICAgICAgICAuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2lucHV0JylbMF1cclxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGFnRGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAodGFnRGF0YVtpXS5rZXkgPT09IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGVUeXBlKSB7XHJcbiAgICAgICAgICAgICAgYXR0cmlidXRlU2VsZWN0RWxtLnZhbHVlID0gdGFnRGF0YVtpXS52YWx1ZVxyXG4gICAgICAgICAgICAgIGxlZ3BPYmplY3QubGVncF9zZWFyY2hBY3RpdmUodGFnRGF0YVtpXS52YWx1ZSlcclxuICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBhdHRyaWJ1dGVTZWxlY3RFbG0uYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGFnRGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgIGlmICh0YWdEYXRhW2ldLnZhbHVlID09PSBhdHRyaWJ1dGVTZWxlY3RFbG0udmFsdWUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYXR0cmlidXRlVHlwZSA9IHRhZ0RhdGFbaV0ua2V5XHJcbiAgICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBuYW1lRGF0YSA9IFtcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJ+epuumXtOmVv+W6picsXHJcbiAgICAgICAgICAgIHZhbHVlOiAn56m66Ze06ZW/5bqmJ1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJ+aKleW9semVv+W6picsXHJcbiAgICAgICAgICAgIHZhbHVlOiAn5oqV5b2x6ZW/5bqmJ1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJ+WcsOihqOmVv+W6picsXHJcbiAgICAgICAgICAgIHZhbHVlOiAn5Zyw6KGo6ZW/5bqmJ1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIF1cclxuXHJcbiAgICAgICAgbGV0IG5hbWVEYXRhTGVncE9iamVjdCA9IGxlZ3AoXHJcbiAgICAgICAgICB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFxyXG4gICAgICAgICAgICAnaW5wdXQtc2VsZWN0LXVuaXQtYm94J1xyXG4gICAgICAgICAgKVswXSxcclxuICAgICAgICAgICcuaW5wdXQtc2VsZWN0LXVuaXQnXHJcbiAgICAgICAgKVxyXG4gICAgICAgIGlmIChuYW1lRGF0YUxlZ3BPYmplY3QpIHtcclxuICAgICAgICAgIG5hbWVEYXRhTGVncE9iamVjdC5sZWdwX3NlYXJjaChuYW1lRGF0YSlcclxuICAgICAgICAgIGxldCBuYW1lRGF0YUxlZ3BFbG0gPSB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudFxyXG4gICAgICAgICAgICAuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaW5wdXQtc2VsZWN0LXVuaXQnKVswXVxyXG4gICAgICAgICAgICAuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2lucHV0JylbMF1cclxuICAgICAgICAgIHRoaXMuX2VsbXMud29yZHNOYW1lID0gW25hbWVEYXRhTGVncEVsbV1cclxuICAgICAgICAgIG5hbWVEYXRhTGVncEVsbS52YWx1ZSA9IHRoaXMub3B0aW9ucy53b3Jkc05hbWVcclxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmFtZURhdGEubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKG5hbWVEYXRhW2ldLnZhbHVlID09PSBuYW1lRGF0YUxlZ3BFbG0udmFsdWUpIHtcclxuICAgICAgICAgICAgICBuYW1lRGF0YUxlZ3BPYmplY3QubGVncF9zZWFyY2hBY3RpdmUobmFtZURhdGFbaV0udmFsdWUpXHJcbiAgICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgbmFtZURhdGFMZWdwRWxtLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKCkgPT4ge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5hbWVEYXRhLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgaWYgKG5hbWVEYXRhW2ldLnZhbHVlID09PSBuYW1lRGF0YUxlZ3BFbG0udmFsdWUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMud29yZHNOYW1lID0gbmFtZURhdGFbaV0udmFsdWVcclxuICAgICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8g5Y6f5aeL6ZW/5bqm5Y2V5L2NXHJcbiAgICAgICAgbGV0IHVuaXREYXRhID0gW1xyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lOiAn57GzJyxcclxuICAgICAgICAgICAgdmFsdWU6ICfnsbMnXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lOiAn5Y2D57GzJyxcclxuICAgICAgICAgICAgdmFsdWU6ICfljYPnsbMnXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgXVxyXG5cclxuICAgICAgICBsZXQgdW5pdERhdGFMZWdwT2JqZWN0ID0gbGVncChcclxuICAgICAgICAgIHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXHJcbiAgICAgICAgICAgICdpbnB1dC1zZWxlY3QtdW5pdC1ib3gnXHJcbiAgICAgICAgICApWzBdLFxyXG4gICAgICAgICAgJy5pbnB1dC1zZWxlY3QtdW5pdCcsXHJcbiAgICAgICAgICAxXHJcbiAgICAgICAgKVxyXG4gICAgICAgIGlmICh1bml0RGF0YUxlZ3BPYmplY3QpIHtcclxuICAgICAgICAgIHVuaXREYXRhTGVncE9iamVjdC5sZWdwX3NlYXJjaCh1bml0RGF0YSlcclxuICAgICAgICAgIGxldCB1bml0RGF0YUxlZ3BFbG0gPSB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudFxyXG4gICAgICAgICAgICAuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaW5wdXQtc2VsZWN0LXVuaXQnKVsxXVxyXG4gICAgICAgICAgICAuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2lucHV0JylbMF1cclxuICAgICAgICAgIHRoaXMuX2VsbXMubGVuZ3RoVW5pdCA9IFt1bml0RGF0YUxlZ3BFbG1dXHJcbiAgICAgICAgICB1bml0RGF0YUxlZ3BFbG0udmFsdWUgPSB0aGlzLm9wdGlvbnMubGVuZ3RoVW5pdFxyXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB1bml0RGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAodW5pdERhdGFbaV0udmFsdWUgPT09IHVuaXREYXRhTGVncEVsbS52YWx1ZSkge1xyXG4gICAgICAgICAgICAgIHVuaXREYXRhTGVncE9iamVjdC5sZWdwX3NlYXJjaEFjdGl2ZSh1bml0RGF0YVtpXS52YWx1ZSlcclxuICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB1bml0RGF0YUxlZ3BFbG0uYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdW5pdERhdGEubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICBpZiAodW5pdERhdGFbaV0udmFsdWUgPT09IHVuaXREYXRhTGVncEVsbS52YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sZW5ndGhVbml0ID0gdW5pdERhdGFbaV0udmFsdWVcclxuICAgICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuICAgICAgICAvL1xyXG5cclxuXHJcbiAgICAgICAgLy8g5ouf5ZCI6ZW/5bqm5Y2V5L2NXHJcbiAgICAgICAgLy8gbGV0IGZpdFVuaXREYXRhID0gW1xyXG4gICAgICAgIC8vICAge1xyXG4gICAgICAgIC8vICAgICBuYW1lOiAn57GzJyxcclxuICAgICAgICAvLyAgICAgdmFsdWU6ICfnsbMnXHJcbiAgICAgICAgLy8gICB9LFxyXG4gICAgICAgIC8vICAge1xyXG4gICAgICAgIC8vICAgICBuYW1lOiAn5Y2D57GzJyxcclxuICAgICAgICAvLyAgICAgdmFsdWU6ICfljYPnsbMnXHJcbiAgICAgICAgLy8gICB9XHJcbiAgICAgICAgLy8gXVxyXG5cclxuICAgICAgICAvLyBsZXQgZml0VW5pdERhdGFMZWdwT2JqZWN0ID0gbGVncChcclxuICAgICAgICAvLyAgIHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXHJcbiAgICAgICAgLy8gICAgICdpbnB1dC1zZWxlY3QtZml0LXVuaXQtYm94J1xyXG4gICAgICAgIC8vICAgKVswXSxcclxuICAgICAgICAvLyAgICcuaW5wdXQtc2VsZWN0LWZpdC11bml0J1xyXG4gICAgICAgIC8vIClcclxuICAgICAgICAvLyBpZiAoZml0VW5pdERhdGFMZWdwT2JqZWN0KSB7XHJcbiAgICAgICAgLy8gICBmaXRVbml0RGF0YUxlZ3BPYmplY3QubGVncF9zZWFyY2goZml0VW5pdERhdGEpXHJcbiAgICAgICAgLy8gICBsZXQgZml0VW5pdERhdGFMZWdwRWxtID0gdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnRcclxuICAgICAgICAvLyAgICAgLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2lucHV0LXNlbGVjdC1maXQtdW5pdCcpWzBdXHJcbiAgICAgICAgLy8gICAgIC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaW5wdXQnKVswXVxyXG4gICAgICAgIC8vICAgdGhpcy5fZWxtcy5maXRMZW5ndGhVbml0ID0gW2ZpdFVuaXREYXRhTGVncEVsbV1cclxuICAgICAgICAvLyAgIGZpdFVuaXREYXRhTGVncEVsbS52YWx1ZSA9IHRoaXMub3B0aW9ucy5maXRMZW5ndGhVbml0XHJcbiAgICAgICAgLy8gICBmb3IgKGxldCBpID0gMDsgaSA8IGZpdFVuaXREYXRhLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgLy8gICAgIGlmIChmaXRVbml0RGF0YVtpXS52YWx1ZSA9PT0gZml0VW5pdERhdGFMZWdwRWxtLnZhbHVlKSB7XHJcbiAgICAgICAgLy8gICAgICAgZml0VW5pdERhdGFMZWdwT2JqZWN0LmxlZ3Bfc2VhcmNoQWN0aXZlKGZpdFVuaXREYXRhW2ldLnZhbHVlKVxyXG4gICAgICAgIC8vICAgICAgIGJyZWFrXHJcbiAgICAgICAgLy8gICAgIH1cclxuICAgICAgICAvLyAgIH1cclxuICAgICAgICAvLyAgIGZpdFVuaXREYXRhTGVncEVsbS5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICgpID0+IHtcclxuICAgICAgICAvLyAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaXRVbml0RGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIC8vICAgICAgIGlmIChmaXRVbml0RGF0YVtpXS52YWx1ZSA9PT0gZml0VW5pdERhdGFMZWdwRWxtLnZhbHVlKSB7XHJcbiAgICAgICAgLy8gICAgICAgICB0aGlzLmZpdExlbmd0aFVuaXQgPSBmaXRVbml0RGF0YVtpXS52YWx1ZVxyXG4gICAgICAgIC8vICAgICAgICAgYnJlYWtcclxuICAgICAgICAvLyAgICAgICB9XHJcbiAgICAgICAgLy8gICAgIH1cclxuICAgICAgICAvLyAgIH0pXHJcbiAgICAgICAgLy8gfVxyXG5cclxuICAgICAgICBsZXQgbGluZVR5cGVEYXRhID0gW1xyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lOiAnPGkgY2xhc3M9XCJpY29uIGxpbmVcIj48L2k+5a6e57q/JyxcclxuICAgICAgICAgICAgdmFsdWU6ICflrp7nur8nLFxyXG4gICAgICAgICAgICBrZXk6IDAsXHJcbiAgICAgICAgICAgIGljb246ICdsaW5lJ1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJzxpIGNsYXNzPVwiaWNvbiBkYXNoLWxpbmVcIj48L2k+6Jma57q/JyxcclxuICAgICAgICAgICAgdmFsdWU6ICfomZrnur8nLFxyXG4gICAgICAgICAgICBrZXk6IDEsXHJcbiAgICAgICAgICAgIGljb246ICdkYXNoLWxpbmUnXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lOiAnPGkgY2xhc3M9XCJpY29uIGxpZ2h0LWxpbmVcIj48L2k+5rOb5YWJJyxcclxuICAgICAgICAgICAgdmFsdWU6ICfms5vlhYknLFxyXG4gICAgICAgICAgICBrZXk6IDIsXHJcbiAgICAgICAgICAgIGljb246ICdsaWdodC1saW5lJ1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJzxpIGNsYXNzPVwiaWNvbiB0YWlsLWxpbmVcIj48L2k+5bC+6L+55YWJ57q/JyxcclxuICAgICAgICAgICAgdmFsdWU6ICflsL7ov7nlhYnnur8nLFxyXG4gICAgICAgICAgICBrZXk6IDMsXHJcbiAgICAgICAgICAgIGljb246ICd0YWlsLWxpbmUnXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lOiAnPGkgY2xhc3M9XCJpY29uIG11bHQtdGFpbC1saW5lXCI+PC9pPuWkmuWwvui/ueWFiee6vycsXHJcbiAgICAgICAgICAgIHZhbHVlOiAn5aSa5bC+6L+55YWJ57q/JyxcclxuICAgICAgICAgICAga2V5OiA0LFxyXG4gICAgICAgICAgICBpY29uOiAnbXVsdC10YWlsLWxpbmUnXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lOiAnPGkgY2xhc3M9XCJpY29uIGZsb3ctZGFzaC1saW5lMVwiPjwvaT7mtYHliqjomZrnur8xJyxcclxuICAgICAgICAgICAgdmFsdWU6ICfmtYHliqjomZrnur8xJyxcclxuICAgICAgICAgICAga2V5OiA1LFxyXG4gICAgICAgICAgICBpY29uOiAnZmxvdy1kYXNoLWxpbmUxJ1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJzxpIGNsYXNzPVwiaWNvbiBmbG93LWRhc2gtbGluZTJcIj48L2k+5rWB5Yqo6Jma57q/MicsXHJcbiAgICAgICAgICAgIHZhbHVlOiAn5rWB5Yqo6Jma57q/MicsXHJcbiAgICAgICAgICAgIGtleTogNixcclxuICAgICAgICAgICAgaWNvbjogJ2Zsb3ctZGFzaC1saW5lMidcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIG5hbWU6ICc8aSBjbGFzcz1cImljb24gcGljLWxpbmUxXCI+PC9pPua1geWKqOeureWktDEnLFxyXG4gICAgICAgICAgICB2YWx1ZTogJ+a1geWKqOeureWktDEnLFxyXG4gICAgICAgICAgICBrZXk6IDcsXHJcbiAgICAgICAgICAgIGljb246ICdwaWMtbGluZTEnXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lOiAnPGkgY2xhc3M9XCJpY29uIHBpYy1saW5lMlwiPjwvaT7mtYHliqjnrq3lpLQyJyxcclxuICAgICAgICAgICAgdmFsdWU6ICfmtYHliqjnrq3lpLQyJyxcclxuICAgICAgICAgICAga2V5OiA4LFxyXG4gICAgICAgICAgICBpY29uOiAncGljLWxpbmUyJ1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJzxpIGNsYXNzPVwiaWNvbiBwaWMtbGluZTNcIj48L2k+5rWB5Yqo566t5aS0MycsXHJcbiAgICAgICAgICAgIHZhbHVlOiAn5rWB5Yqo566t5aS0MycsXHJcbiAgICAgICAgICAgIGtleTogOSxcclxuICAgICAgICAgICAgaWNvbjogJ3BpYy1saW5lMydcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIG5hbWU6ICc8aSBjbGFzcz1cImljb24gcGljLWxpbmU0XCI+PC9pPua1geWKqOeureWktDQnLFxyXG4gICAgICAgICAgICB2YWx1ZTogJ+a1geWKqOeureWktDQnLFxyXG4gICAgICAgICAgICBrZXk6IDEwLFxyXG4gICAgICAgICAgICBpY29uOiAncGljLWxpbmU0J1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJzxpIGNsYXNzPVwiaWNvbiBwaWMtbGluZTVcIj48L2k+5rWB5Yqo566t5aS0NScsXHJcbiAgICAgICAgICAgIHZhbHVlOiAn5rWB5Yqo566t5aS0NScsXHJcbiAgICAgICAgICAgIGtleTogMTEsXHJcbiAgICAgICAgICAgIGljb246ICdwaWMtbGluZTUnXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lOiAnPGkgY2xhc3M9XCJpY29uIHBpYy1saW5lNlwiPjwvaT7mtYHliqjnrq3lpLQ2JyxcclxuICAgICAgICAgICAgdmFsdWU6ICfmtYHliqjnrq3lpLQ2JyxcclxuICAgICAgICAgICAga2V5OiAxMixcclxuICAgICAgICAgICAgaWNvbjogJ3BpYy1saW5lNidcclxuICAgICAgICAgIH1cclxuICAgICAgICBdXHJcbiAgICAgICAgbGV0IGxpbmVUeXBlRGF0YUxlZ3BPYmplY3QgPSBsZWdwKFxyXG4gICAgICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcclxuICAgICAgICAgICAgJ2lucHV0LXNlbGVjdC1saW5lLXR5cGUtYm94J1xyXG4gICAgICAgICAgKVswXSxcclxuICAgICAgICAgICcuaW5wdXQtc2VsZWN0LWxpbmUtdHlwZSdcclxuICAgICAgICApXHJcbiAgICAgICAgaWYgKGxpbmVUeXBlRGF0YUxlZ3BPYmplY3QpIHtcclxuICAgICAgICAgIGxpbmVUeXBlRGF0YUxlZ3BPYmplY3QubGVncF9zZWFyY2gobGluZVR5cGVEYXRhKVxyXG5cclxuICAgICAgICAgIGxldCBpQWN0aXZlRWxtMiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2knKVxyXG4gICAgICAgICAgaUFjdGl2ZUVsbTIuY2xhc3NOYW1lID0gJ2ljb24gaWNvbi1hY3RpdmUnXHJcbiAgICAgICAgICB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdpbnB1dC1zZWxlY3QtbGluZS10eXBlJylbMF0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnY3lfZGF0YWxpc3QnKVswXS5hcHBlbmRDaGlsZChpQWN0aXZlRWxtMilcclxuXHJcbiAgICAgICAgICBsZXQgbGluZVR5cGVEYXRhTGVncEVsbSA9IHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50XHJcbiAgICAgICAgICAgIC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdpbnB1dC1zZWxlY3QtbGluZS10eXBlJylbMF1cclxuICAgICAgICAgICAgLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdpbnB1dCcpWzBdXHJcbiAgICAgICAgICB0aGlzLl9lbG1zLmxpbmVUeXBlID0gW2xpbmVUeXBlRGF0YUxlZ3BFbG1dXHJcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmVUeXBlRGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAobGluZVR5cGVEYXRhW2ldLmtleSA9PT0gdGhpcy5vcHRpb25zLnR5cGUpIHtcclxuICAgICAgICAgICAgICBsaW5lVHlwZURhdGFMZWdwT2JqZWN0LmxlZ3Bfc2VhcmNoQWN0aXZlKGxpbmVUeXBlRGF0YVtpXS52YWx1ZSlcclxuICAgICAgICAgICAgICBsaW5lVHlwZURhdGFMZWdwRWxtLnZhbHVlID0gbGluZVR5cGVEYXRhW2ldLnZhbHVlXHJcbiAgICAgICAgICAgICAgaUFjdGl2ZUVsbTIuY2xhc3NOYW1lID0gYGljb24gaWNvbi1hY3RpdmUgJHtsaW5lVHlwZURhdGFbaV0uaWNvbn1gXHJcbiAgICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgbGluZVR5cGVEYXRhTGVncEVsbS5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICgpID0+IHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lVHlwZURhdGEubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICBpZiAobGluZVR5cGVEYXRhW2ldLnZhbHVlID09PSBsaW5lVHlwZURhdGFMZWdwRWxtLnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxpbmVUeXBlID0gbGluZVR5cGVEYXRhW2ldLmtleVxyXG4gICAgICAgICAgICAgICAgaUFjdGl2ZUVsbTIuY2xhc3NOYW1lID0gYGljb24gaWNvbi1hY3RpdmUgJHtsaW5lVHlwZURhdGFbaV0uaWNvbn1gXHJcblxyXG4gICAgICAgICAgICAgICAgLy/mjqfliLblj4LmlbDmmL7pmpBcclxuICAgICAgICAgICAgICAgIGlmICgyIDwgdGhpcy5saW5lVHlwZSAmJiB0aGlzLmxpbmVUeXBlIDwgMTMpIHsvL+i0tOWbvuWPguaVsFxyXG4gICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGFzaFRleHR1cmVEb20nKSAmJiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rhc2hUZXh0dXJlRG9tJykuc3R5bGUuZGlzcGxheSA9ICdmbGV4JylcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkYXNoVGV4dHVyZURvbScpICYmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGFzaFRleHR1cmVEb20nKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKDIgPCB0aGlzLmxpbmVUeXBlICYmIHRoaXMubGluZVR5cGUgPCA1KSB7Ly/lsL7ov7nlj4LmlbBcclxuICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbGluZVNwYWNlJylbMF0gJiYgKGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xpbmVTcGFjZScpWzBdLnN0eWxlLmRpc3BsYXkgPSAnbm9uZScpXHJcbiAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xpbmVTcGFjZScpWzFdICYmIChkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdsaW5lU3BhY2UnKVsxXS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnKVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbGluZVNwYWNlJylbMF0gJiYgKGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xpbmVTcGFjZScpWzBdLnN0eWxlLmRpc3BsYXkgPSAnZmxleCcpXHJcbiAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xpbmVTcGFjZScpWzFdICYmIChkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdsaW5lU3BhY2UnKVsxXS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG4gICAgICAgIGxldCBoZWlnaHRCb3hFbG0gPSB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdoZWlnaHQtYm94JylbMF1cclxuICAgICAgICBsZXQgaGVpZ2h0RWxtID0gaGVpZ2h0Qm94RWxtLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2hlaWdodCcpWzBdXHJcbiAgICAgICAgbGV0IGhlaWdodENvbmZpcm1FbG0gPSB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdoZWlnaHQtY29uZmlybScpWzBdXHJcbiAgICAgICAgaGVpZ2h0RWxtLnZhbHVlID0gMTBcclxuICAgICAgICBpZiAodGhpcy5oZWlnaHRNb2RlID09IDIpIHtcclxuICAgICAgICAgIGhlaWdodEJveEVsbSAmJiAoaGVpZ2h0Qm94RWxtLmNsYXNzTmFtZSA9ICdpbnB1dC1udW1iZXIgaW5wdXQtbnVtYmVyLXVuaXQtMSBoZWlnaHQtYm94IGRpc2FibGVkJyk7XHJcbiAgICAgICAgICBoZWlnaHRDb25maXJtRWxtICYmIGhlaWdodENvbmZpcm1FbG0uc2V0QXR0cmlidXRlKCdkaXNhYmxlZCcsICdkaXNhYmxlZCcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIGhlaWdodEJveEVsbSAmJiAoaGVpZ2h0Qm94RWxtLmNsYXNzTmFtZSA9ICdpbnB1dC1udW1iZXIgaW5wdXQtbnVtYmVyLXVuaXQtMSBoZWlnaHQtYm94Jyk7XHJcbiAgICAgICAgICBoZWlnaHRDb25maXJtRWxtICYmIGhlaWdodENvbmZpcm1FbG0ucmVtb3ZlQXR0cmlidXRlKCdkaXNhYmxlZCcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgaGVpZ2h0TW9kZURhdGEgPSBbXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIG5hbWU6ICfmtbfmi5Tpq5jluqYnLFxyXG4gICAgICAgICAgICB2YWx1ZTogJ+a1t+aLlOmrmOW6picsXHJcbiAgICAgICAgICAgIGtleTogJzAnLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJ+ebuOWvueWcsOihqCcsXHJcbiAgICAgICAgICAgIHZhbHVlOiAn55u45a+55Zyw6KGoJyxcclxuICAgICAgICAgICAga2V5OiAnMScsXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lOiAn5L6d6ZmE5qih5Z6LJyxcclxuICAgICAgICAgICAgdmFsdWU6ICfkvp3pmYTmqKHlnosnLFxyXG4gICAgICAgICAgICBrZXk6ICcyJyxcclxuICAgICAgICAgIH1cclxuICAgICAgICBdXHJcbiAgICAgICAgbGV0IGhlaWdodE1vZGVPYmplY3QgPSBsZWdwKFxyXG4gICAgICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcclxuICAgICAgICAgICAgJ2hlaWdodC1tb2RlLWJveCdcclxuICAgICAgICAgIClbMF0sXHJcbiAgICAgICAgICAnLmhlaWdodC1tb2RlJ1xyXG4gICAgICAgIClcclxuICAgICAgICBpZiAoaGVpZ2h0TW9kZU9iamVjdCkge1xyXG4gICAgICAgICAgaGVpZ2h0TW9kZU9iamVjdC5sZWdwX3NlYXJjaChoZWlnaHRNb2RlRGF0YSlcclxuICAgICAgICAgIGxldCBoZWlnaHRNb2RlRGF0YUxlZ3BFbG0gPSB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudFxyXG4gICAgICAgICAgICAuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaGVpZ2h0LW1vZGUnKVswXVxyXG4gICAgICAgICAgICAuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2lucHV0JylbMF1cclxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaGVpZ2h0TW9kZURhdGEubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKGhlaWdodE1vZGVEYXRhW2ldLmtleSA9PSB0aGlzLmhlaWdodE1vZGUpIHtcclxuICAgICAgICAgICAgICBoZWlnaHRNb2RlRGF0YUxlZ3BFbG0udmFsdWUgPSBoZWlnaHRNb2RlRGF0YVtpXS52YWx1ZVxyXG4gICAgICAgICAgICAgIGhlaWdodE1vZGVPYmplY3QubGVncF9zZWFyY2hBY3RpdmUoXHJcbiAgICAgICAgICAgICAgICBoZWlnaHRNb2RlRGF0YVtpXS52YWx1ZVxyXG4gICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBoZWlnaHRNb2RlRGF0YUxlZ3BFbG0uYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaGVpZ2h0TW9kZURhdGEubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICBpZiAoaGVpZ2h0TW9kZURhdGFbaV0udmFsdWUgPT09IGhlaWdodE1vZGVEYXRhTGVncEVsbS52YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5oZWlnaHRNb2RlID0gaGVpZ2h0TW9kZURhdGFbaV0ua2V5XHJcbiAgICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSlcclxuXHJcbiAgICAgICAgICBoZWlnaHRFbG0uYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIHN3aXRjaCAodGhpcy5oZWlnaHRNb2RlKSB7XHJcbiAgICAgICAgICAgICAgY2FzZSAwOlxyXG4gICAgICAgICAgICAgIGNhc2UgJzAnOlxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgY2FzZSAxOlxyXG4gICAgICAgICAgICAgIGNhc2UgJzEnOlxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgY2FzZSAyOlxyXG4gICAgICAgICAgICAgIGNhc2UgJzInOlxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pXHJcblxyXG4gICAgICAgICAgdGhpcy5fZWxtcy5oZWlnaHQgPSBoZWlnaHRFbG1cclxuICAgICAgICAgIHRoaXMuX2VsbXMuaGVpZ2h0Qm94ID0gaGVpZ2h0Qm94RWxtXHJcbiAgICAgICAgICB0aGlzLl9lbG1zLmhlaWdodE1vZGUgPSBoZWlnaHRNb2RlRGF0YUxlZ3BFbG1cclxuICAgICAgICAgIHRoaXMuX2VsbXMuaGVpZ2h0Q29uZmlybSA9IGhlaWdodENvbmZpcm1FbG1cclxuICAgICAgICAgIHRoaXMuX2VsbXMuaGVpZ2h0TW9kZU9iamVjdCA9IGhlaWdodE1vZGVPYmplY3RcclxuXHJcbiAgICAgICAgICBoZWlnaHRDb25maXJtRWxtLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uRWRpdGluZyA9IGZhbHNlXHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5vcHRpb25zLnBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0uYWx0ID0gTnVtYmVyKCh0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmFsdCArIE51bWJlcihoZWlnaHRFbG0udmFsdWUpKS50b0ZpeGVkKDIpKVxyXG4gICAgICAgICAgICAgIHRoaXMuX2VsbXMuYWx0W2ldLmlubmVySFRNTCA9IHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0uYWx0XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGV0IGZyb21EZWdyZWVzQXJyYXkgPSB0aGlzLnJlbmV3UG9zaXRpb25zKHRoaXMub3B0aW9ucy5wb3NpdGlvbnMpXHJcbiAgICAgICAgICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLnBvc2l0aW9ucyA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzQXJyYXlIZWlnaHRzKFxyXG4gICAgICAgICAgICAgIGZyb21EZWdyZWVzQXJyYXlcclxuICAgICAgICAgICAgKVxyXG5cclxuICAgICAgICAgICAgdGhpcy5wb3NpdGlvbkVkaXRpbmcgPSBmYWxzZVxyXG4gICAgICAgICAgICB0aGlzLmNsb3NlTm9kZUVkaXQoKVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCB0YWJsZUVsbSA9IGNvbnRlbnRFbG0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnc3BhdGlhbC1pbmZvLXRhYmxlJylbMF1cclxuICAgICAgICBsZXQgdEJvZHlFbG0gPSB0YWJsZUVsbS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0YWJsZS1ib2R5JylbMF1cclxuICAgICAgICB0aGlzLl9lbG1zLmxuZyA9IFtdXHJcbiAgICAgICAgdGhpcy5fZWxtcy5sbmdJbnB1dCA9IFtdXHJcbiAgICAgICAgdGhpcy5fZWxtcy5sYXQgPSBbXVxyXG4gICAgICAgIHRoaXMuX2VsbXMubGF0SW5wdXQgPSBbXVxyXG4gICAgICAgIHRoaXMuX2VsbXMuYWx0ID0gW11cclxuICAgICAgICB0aGlzLl9lbG1zLmFsdElucHV0ID0gW11cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMub3B0aW9ucy5wb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGxldCB0ciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpXHJcbiAgICAgICAgICB0ci5jbGFzc05hbWUgPSAndHInXHJcbiAgICAgICAgICB0ci5pbm5lckhUTUwgPSBgXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZFwiPiR7aSArIDF9PC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZCBsbmcgYWxpZ24tY2VudGVyXCI+PC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZCBsYXQgYWxpZ24tY2VudGVyXCI+PC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZCBhbHQgYWxpZ24tY2VudGVyXCI+PC9kaXY+XHJcbiAgICAgICAgICBgXHJcbiAgICAgICAgICBsZXQgbG5nQm94ID0gdHIuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbG5nJylbMF1cclxuICAgICAgICAgIGxldCBsbmcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJylcclxuICAgICAgICAgIGxuZy5pbm5lckhUTUwgPSAodGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sbmcpLnRvRml4ZWQoOClcclxuICAgICAgICAgIGxuZ0JveC5hcHBlbmRDaGlsZChsbmcpXHJcbiAgICAgICAgICBsZXQgbG5nSW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpXHJcbiAgICAgICAgICBsbmdJbnB1dC5jbGFzc05hbWUgPSAnaW5wdXQnXHJcbiAgICAgICAgICBsbmdJbnB1dC50eXBlID0gJ251bWJlcidcclxuICAgICAgICAgIGxuZ0lucHV0LnRpdGxlID0gJydcclxuICAgICAgICAgIGxuZ0lucHV0Lm1pbiA9IC0xODBcclxuICAgICAgICAgIGxuZ0lucHV0Lm1heCA9IDE4MFxyXG4gICAgICAgICAgbG5nSW5wdXQudmFsdWUgPSAodGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sbmcpLnRvRml4ZWQoOClcclxuXHJcbiAgICAgICAgICBsZXQgbGF0Qm94ID0gdHIuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbGF0JylbMF1cclxuICAgICAgICAgIGxldCBsYXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJylcclxuICAgICAgICAgIGxhdC5pbm5lckhUTUwgPSAodGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sYXQpLnRvRml4ZWQoOClcclxuICAgICAgICAgIGxhdEJveC5hcHBlbmRDaGlsZChsYXQpXHJcbiAgICAgICAgICBsZXQgbGF0SW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpXHJcbiAgICAgICAgICBsYXRJbnB1dC5jbGFzc05hbWUgPSAnaW5wdXQnXHJcbiAgICAgICAgICBsYXRJbnB1dC50eXBlID0gJ251bWJlcidcclxuICAgICAgICAgIGxhdElucHV0LnRpdGxlID0gJydcclxuICAgICAgICAgIGxhdElucHV0Lm1pbiA9IC05MFxyXG4gICAgICAgICAgbGF0SW5wdXQubWF4ID0gOTBcclxuICAgICAgICAgIGxhdElucHV0LnZhbHVlID0gKHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubGF0KS50b0ZpeGVkKDgpXHJcblxyXG4gICAgICAgICAgbGV0IGFsdEJveCA9IHRyLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2FsdCcpWzBdXHJcbiAgICAgICAgICBsZXQgYWx0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpXHJcbiAgICAgICAgICBhbHQuaW5uZXJIVE1MID0gKHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0uYWx0KS50b0ZpeGVkKDIpXHJcbiAgICAgICAgICBhbHRCb3guYXBwZW5kQ2hpbGQoYWx0KVxyXG4gICAgICAgICAgbGV0IGFsdElucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKVxyXG4gICAgICAgICAgYWx0SW5wdXQuY2xhc3NOYW1lID0gJ2lucHV0J1xyXG4gICAgICAgICAgYWx0SW5wdXQudHlwZSA9ICdudW1iZXInXHJcbiAgICAgICAgICBhbHRJbnB1dC50aXRsZSA9ICcnXHJcbiAgICAgICAgICBhbHRJbnB1dC5taW4gPSAtOTk5OTk5OVxyXG4gICAgICAgICAgYWx0SW5wdXQubWF4ID0gOTk5OTk5OTk5XHJcbiAgICAgICAgICBhbHRJbnB1dC52YWx1ZSA9ICh0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmFsdCkudG9GaXhlZCgyKVxyXG5cclxuICAgICAgICAgIGxuZ0JveC5hZGRFdmVudExpc3RlbmVyKCdkYmxjbGljaycsICgpID0+IHtcclxuICAgICAgICAgICAgbG5nQm94LmlubmVySFRNTCA9ICcnXHJcbiAgICAgICAgICAgIGxuZ0lucHV0LnZhbHVlID0gTnVtYmVyKHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubG5nLnRvRml4ZWQoOCkpXHJcbiAgICAgICAgICAgIGxuZ0JveC5hcHBlbmRDaGlsZChsbmdJbnB1dClcclxuICAgICAgICAgICAgbG5nSW5wdXQuZm9jdXMoKVxyXG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uRWRpdGluZyA9IGZhbHNlXHJcbiAgICAgICAgICAgIHRoaXMuY2xvc2VOb2RlRWRpdCgpXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgbG5nSW5wdXQuYWRkRXZlbnRMaXN0ZW5lcignYmx1cicsICgpID0+IHtcclxuICAgICAgICAgICAgbG5nSW5wdXQudmFsdWUgPSBOdW1iZXIodGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sbmcudG9GaXhlZCg4KSlcclxuICAgICAgICAgICAgbG5nQm94LmlubmVySFRNTCA9ICcnXHJcbiAgICAgICAgICAgIGxuZ0JveC5hcHBlbmRDaGlsZChsbmcpXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgbG5nSW5wdXQuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubG5nID0gTnVtYmVyKE51bWJlcihsbmdJbnB1dC52YWx1ZSkudG9GaXhlZCg4KSlcclxuICAgICAgICAgICAgbG5nLmlubmVySFRNTCA9IHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubG5nLnRvRml4ZWQoOClcclxuICAgICAgICAgICAgbGV0IGZyb21EZWdyZWVzQXJyYXkgPSB0aGlzLnJlbmV3UG9zaXRpb25zKHRoaXMub3B0aW9ucy5wb3NpdGlvbnMpXHJcbiAgICAgICAgICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLnBvc2l0aW9ucyA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzQXJyYXlIZWlnaHRzKGZyb21EZWdyZWVzQXJyYXkpXHJcbiAgICAgICAgICAgIHRoaXMubGFiZWwucG9zaXRpb24gPSBbdGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXS5sbmcsIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0ubGF0LCBmcm9tRGVncmVlc0FycmF5WzJdXVxyXG4gICAgICAgICAgfSlcclxuXHJcbiAgICAgICAgICBsYXRCb3guYWRkRXZlbnRMaXN0ZW5lcignZGJsY2xpY2snLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGxhdEJveC5pbm5lckhUTUwgPSAnJ1xyXG4gICAgICAgICAgICBsYXRJbnB1dC52YWx1ZSA9IE51bWJlcih0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxhdC50b0ZpeGVkKDgpKVxyXG4gICAgICAgICAgICBsYXRCb3guYXBwZW5kQ2hpbGQobGF0SW5wdXQpXHJcbiAgICAgICAgICAgIGxhdElucHV0LmZvY3VzKClcclxuICAgICAgICAgICAgdGhpcy5wb3NpdGlvbkVkaXRpbmcgPSBmYWxzZVxyXG4gICAgICAgICAgICB0aGlzLmNsb3NlTm9kZUVkaXQoKVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIGxhdElucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2JsdXInLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGxhdElucHV0LnZhbHVlID0gTnVtYmVyKHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubGF0LnRvRml4ZWQoOCkpXHJcbiAgICAgICAgICAgIGxhdEJveC5pbm5lckhUTUwgPSAnJ1xyXG4gICAgICAgICAgICBsYXRCb3guYXBwZW5kQ2hpbGQobGF0KVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIGxhdElucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxhdCA9IE51bWJlcihOdW1iZXIobGF0SW5wdXQudmFsdWUpLnRvRml4ZWQoOCkpXHJcbiAgICAgICAgICAgIGxhdC5pbm5lckhUTUwgPSB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxhdC50b0ZpeGVkKDgpXHJcbiAgICAgICAgICAgIGxldCBmcm9tRGVncmVlc0FycmF5ID0gdGhpcy5yZW5ld1Bvc2l0aW9ucyh0aGlzLm9wdGlvbnMucG9zaXRpb25zKVxyXG4gICAgICAgICAgICB0aGlzLmVudGl0eS5wb2x5bGluZS5wb3NpdGlvbnMgPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlc0FycmF5SGVpZ2h0cyhmcm9tRGVncmVlc0FycmF5KVxyXG4gICAgICAgICAgICB0aGlzLmxhYmVsLnBvc2l0aW9uID0gW3RoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0ubG5nLCB0aGlzLm9wdGlvbnMucG9zaXRpb25zWzBdLmxhdCwgZnJvbURlZ3JlZXNBcnJheVsyXV1cclxuICAgICAgICAgIH0pXHJcblxyXG4gICAgICAgICAgYWx0Qm94LmFkZEV2ZW50TGlzdGVuZXIoJ2RibGNsaWNrJywgKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5oZWlnaHRNb2RlID09IDIpIHtcclxuICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYWx0Qm94LmlubmVySFRNTCA9ICcnXHJcbiAgICAgICAgICAgIGFsdElucHV0LnZhbHVlID0gTnVtYmVyKHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0uYWx0LnRvRml4ZWQoMikpXHJcbiAgICAgICAgICAgIGFsdEJveC5hcHBlbmRDaGlsZChhbHRJbnB1dClcclxuICAgICAgICAgICAgYWx0SW5wdXQuZm9jdXMoKVxyXG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uRWRpdGluZyA9IGZhbHNlXHJcbiAgICAgICAgICAgIHRoaXMuY2xvc2VOb2RlRWRpdCgpXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgYWx0SW5wdXQuYWRkRXZlbnRMaXN0ZW5lcignYmx1cicsICgpID0+IHtcclxuICAgICAgICAgICAgYWx0SW5wdXQudmFsdWUgPSBOdW1iZXIodGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5hbHQudG9GaXhlZCgyKSlcclxuICAgICAgICAgICAgYWx0Qm94LmlubmVySFRNTCA9ICcnXHJcbiAgICAgICAgICAgIGFsdEJveC5hcHBlbmRDaGlsZChhbHQpXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgYWx0SW5wdXQuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0uYWx0ID0gTnVtYmVyKE51bWJlcihhbHRJbnB1dC52YWx1ZSkudG9GaXhlZCgyKSlcclxuICAgICAgICAgICAgYWx0LmlubmVySFRNTCA9IHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0uYWx0LnRvRml4ZWQoMilcclxuICAgICAgICAgICAgbGV0IGZyb21EZWdyZWVzQXJyYXkgPSB0aGlzLnJlbmV3UG9zaXRpb25zKHRoaXMub3B0aW9ucy5wb3NpdGlvbnMpXHJcbiAgICAgICAgICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLnBvc2l0aW9ucyA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzQXJyYXlIZWlnaHRzKGZyb21EZWdyZWVzQXJyYXkpXHJcbiAgICAgICAgICAgIHRoaXMubGFiZWwucG9zaXRpb24gPSBbdGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXS5sbmcsIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0ubGF0LCBmcm9tRGVncmVlc0FycmF5WzJdXVxyXG4gICAgICAgICAgfSlcclxuXHJcbiAgICAgICAgICB0aGlzLl9lbG1zLmxuZy5wdXNoKGxuZylcclxuICAgICAgICAgIHRoaXMuX2VsbXMubG5nSW5wdXQucHVzaChsbmdJbnB1dClcclxuICAgICAgICAgIHRoaXMuX2VsbXMubGF0LnB1c2gobGF0KVxyXG4gICAgICAgICAgdGhpcy5fZWxtcy5sYXRJbnB1dC5wdXNoKGxhdElucHV0KVxyXG4gICAgICAgICAgdGhpcy5fZWxtcy5hbHQucHVzaChhbHQpXHJcbiAgICAgICAgICB0aGlzLl9lbG1zLmFsdElucHV0LnB1c2goYWx0SW5wdXQpXHJcbiAgICAgICAgICB0Qm9keUVsbS5hcHBlbmRDaGlsZCh0cilcclxuICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICBsZXQgZm9udERhdGEgPSBnZXRGb250TGlzdCgpXHJcbiAgICAgICAgbGV0IGZvbnRPYmplY3QgPSBsZWdwKFxyXG4gICAgICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcclxuICAgICAgICAgICAgJ2ZvbnQtc2VsZWN0LWJveCdcclxuICAgICAgICAgIClbMF0sXHJcbiAgICAgICAgICAnLmZvbnQtc2VsZWN0J1xyXG4gICAgICAgIClcclxuICAgICAgICBpZiAoZm9udE9iamVjdCkge1xyXG4gICAgICAgICAgZm9udE9iamVjdC5sZWdwX3NlYXJjaChmb250RGF0YSlcclxuICAgICAgICAgIGxldCBmb250RGF0YUxlZ3BFbG0gPSB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudFxyXG4gICAgICAgICAgICAuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnZm9udC1zZWxlY3QnKVswXVxyXG4gICAgICAgICAgICAuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2lucHV0JylbMF1cclxuICAgICAgICAgIGZvbnREYXRhTGVncEVsbS52YWx1ZSA9IGZvbnREYXRhW3RoaXMubGFiZWxGb250RmFtaWx5XS52YWx1ZVxyXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmb250RGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoZm9udERhdGFbaV0udmFsdWUgPT0gZm9udERhdGFMZWdwRWxtLnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgZm9udE9iamVjdC5sZWdwX3NlYXJjaEFjdGl2ZShmb250RGF0YVtpXS52YWx1ZSlcclxuICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBmb250RGF0YUxlZ3BFbG0uYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZm9udERhdGEubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICBpZiAoZm9udERhdGFbaV0udmFsdWUgPT09IGZvbnREYXRhTGVncEVsbS52YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sYWJlbEZvbnRGYW1pbHkgPSBmb250RGF0YVtpXS5rZXlcclxuICAgICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgdGhpcy5fZWxtcy5sYWJlbEZvbnRGYW1pbHkgPSBbZm9udERhdGFMZWdwRWxtXVxyXG4gICAgICAgIH1cclxuICAgICAgfSwgMClcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmICh0aGlzLl9EaWFsb2dPYmplY3QgJiYgdGhpcy5fRGlhbG9nT2JqZWN0LmNsb3NlKSB7XHJcbiAgICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0LmNsb3NlKClcclxuICAgICAgICB0aGlzLl9EaWFsb2dPYmplY3QgPSBudWxsXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIOW5s+a7keWkhOeQhlxyXG4gIHNtb290aEhhbmRsZShwb3NpdGlvbnMpIHtcclxuICAgIGxldCBuZXdQb3NpdGlvbnMgPSBbXVxyXG4gICAgbGV0IHRpbWUgPSBbXVxyXG4gICAgbGV0IGZyb21EZWdyZWVzQXJyYXlIZWlnaHRzID0gW11cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGZyb21EZWdyZWVzQXJyYXlIZWlnaHRzLnB1c2goXHJcbiAgICAgICAgcG9zaXRpb25zW2ldLmxuZyxcclxuICAgICAgICBwb3NpdGlvbnNbaV0ubGF0LFxyXG4gICAgICAgIHBvc2l0aW9uc1tpXS5hbHRcclxuICAgICAgKVxyXG4gICAgICB0aW1lLnB1c2goaSAvIChwb3NpdGlvbnMubGVuZ3RoIC0gMSkpXHJcbiAgICB9XHJcbiAgICBsZXQgc3BsaW5lID0gbmV3IENlc2l1bS5DYXRtdWxsUm9tU3BsaW5lKHtcclxuICAgICAgdGltZXM6IHRpbWUsXHJcbiAgICAgIHBvaW50czogQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXNBcnJheUhlaWdodHMoZnJvbURlZ3JlZXNBcnJheUhlaWdodHMpXHJcbiAgICB9KVxyXG4gICAgbGV0IGxlbmd0aCA9IHBvc2l0aW9ucy5sZW5ndGggKiAyMFxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gbGVuZ3RoOyBpKyspIHtcclxuICAgICAgbGV0IGNhcnRlc2lhbjMgPSBzcGxpbmUuZXZhbHVhdGUoaSAvIGxlbmd0aClcclxuICAgICAgbmV3UG9zaXRpb25zLnB1c2godGhpcy5jYXJ0ZXNpYW4zVG93Z3M4NChjYXJ0ZXNpYW4zLCB0aGlzLnNkay52aWV3ZXIpKVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5ld1Bvc2l0aW9uc1xyXG4gIH1cclxuXHJcbiAgLy8g5pu05paw5Z2Q5qCHXHJcbiAgcmVuZXdQb3NpdGlvbnMocG9zaXRpb25zQXJyYXksIGNkKSB7XHJcbiAgICBpZiAodGhpcy5fZXJyb3IpIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcbiAgICBsZXQgcG9zaXRpb25zID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShwb3NpdGlvbnNBcnJheSkpXHJcbiAgICBsZXQgZ3JvdW5kXHJcbiAgICBzd2l0Y2ggKHRoaXMuaGVpZ2h0TW9kZSkge1xyXG4gICAgICBjYXNlIDA6XHJcbiAgICAgIGNhc2UgJzAnOlxyXG4gICAgICAgIGdyb3VuZCA9IGZhbHNlXHJcbiAgICAgICAgYnJlYWtcclxuICAgICAgY2FzZSAxOlxyXG4gICAgICBjYXNlICcxJzpcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgbGV0IGhlaWdodCA9IHRoaXMuc2RrLnZpZXdlci5zY2VuZS5nbG9iZS5nZXRIZWlnaHQoQ2VzaXVtLkNhcnRvZ3JhcGhpYy5mcm9tRGVncmVlcyhwb3NpdGlvbnNbaV0ubG5nLCBwb3NpdGlvbnNbaV0ubGF0KSlcclxuICAgICAgICAgIHBvc2l0aW9uc1tpXS5hbHQgPSBoZWlnaHQgPyBOdW1iZXIoKHBvc2l0aW9uc1tpXS5hbHQgKyBOdW1iZXIoaGVpZ2h0KSkudG9GaXhlZCgyKSkgOiBOdW1iZXIoKHBvc2l0aW9uc1tpXS5hbHQpLnRvRml4ZWQoMikpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGdyb3VuZCA9IGZhbHNlXHJcbiAgICAgICAgYnJlYWtcclxuICAgICAgY2FzZSAyOlxyXG4gICAgICBjYXNlICcyJzpcclxuICAgICAgICBncm91bmQgPSB0cnVlXHJcbiAgICAgICAgYnJlYWtcclxuICAgIH1cclxuICAgIGxldCBuZXdQb3NpdGlvbnNcclxuICAgIGxldCBmcm9tRGVncmVlc0FycmF5ID0gW11cclxuICAgIGlmIChcclxuICAgICAgdGhpcy5vcHRpb25zLm5vc2VUb1RhaWwgJiZcclxuICAgICAgdGhpcy5vcHRpb25zLm5vc2VUb1RhaWwgIT09ICdmYWxzZSdcclxuICAgICkge1xyXG4gICAgICBuZXdQb3NpdGlvbnMgPSBbLi4ucG9zaXRpb25zLCBwb3NpdGlvbnNbMF1dXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBuZXdQb3NpdGlvbnMgPSBbLi4ucG9zaXRpb25zXVxyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5zbW9vdGggJiYgdGhpcy5vcHRpb25zLnNtb290aCAhPT0gJ2ZhbHNlJykge1xyXG4gICAgICBuZXdQb3NpdGlvbnMgPSB0aGlzLnNtb290aEhhbmRsZShuZXdQb3NpdGlvbnMpXHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmV3UG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgZnJvbURlZ3JlZXNBcnJheS5wdXNoKFxyXG4gICAgICAgICAgbmV3UG9zaXRpb25zW2ldLmxuZyxcclxuICAgICAgICAgIG5ld1Bvc2l0aW9uc1tpXS5sYXQsXHJcbiAgICAgICAgICBuZXdQb3NpdGlvbnNbaV0uYWx0XHJcbiAgICAgICAgKVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5ld1Bvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGZyb21EZWdyZWVzQXJyYXkucHVzaChcclxuICAgICAgICAgIG5ld1Bvc2l0aW9uc1tpXS5sbmcsXHJcbiAgICAgICAgICBuZXdQb3NpdGlvbnNbaV0ubGF0LFxyXG4gICAgICAgICAgbmV3UG9zaXRpb25zW2ldLmFsdFxyXG4gICAgICAgIClcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIOiuoeeul+mVv+W6plxyXG4gICAgaWYgKFxyXG4gICAgICAodGhpcy5vcHRpb25zLm5vc2VUb1RhaWwgJiZcclxuICAgICAgICB0aGlzLm9wdGlvbnMubm9zZVRvVGFpbCAhPT0gJ2ZhbHNlJykgfHxcclxuICAgICAgKHRoaXMub3B0aW9ucy5zbW9vdGggJiYgdGhpcy5vcHRpb25zLnNtb290aCAhPT0gJ2ZhbHNlJylcclxuICAgICkge1xyXG4gICAgICBsZXQgYXJyYXkgPSBbXVxyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZyb21EZWdyZWVzQXJyYXkubGVuZ3RoOyBpICs9IDMpIHtcclxuICAgICAgICBhcnJheS5wdXNoKHtcclxuICAgICAgICAgIGxuZzogZnJvbURlZ3JlZXNBcnJheVtpXSxcclxuICAgICAgICAgIGxhdDogZnJvbURlZ3JlZXNBcnJheVtpICsgMV0sXHJcbiAgICAgICAgICBhbHQ6IGZyb21EZWdyZWVzQXJyYXlbaSArIDJdXHJcbiAgICAgICAgfSlcclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IF90aGlzID0gdGhpc1xyXG4gICAgICB0aGlzLmNvbXB1dGVEaXN0YW5jZShcclxuICAgICAgICBhcnJheSxcclxuICAgICAgICAyLFxyXG4gICAgICAgIHRoaXMub3B0aW9ucy53b3Jkc05hbWVcclxuICAgICAgKS50aGVuKHJlcyA9PiB7XHJcbiAgICAgICAgX3RoaXMubGVuZ3RoQnlNZXRlciA9IHJlc1xyXG4gICAgICAgIHRoaXMubGVuZ3RoQ2hhbmdlQ2FsbEJhY2sgJiYgdGhpcy5sZW5ndGhDaGFuZ2VDYWxsQmFjaygpXHJcbiAgICAgICAgY2QgJiYgY2QoKVxyXG4gICAgICB9KVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbGV0IF90aGlzID0gdGhpc1xyXG4gICAgICB0aGlzLmNvbXB1dGVEaXN0YW5jZShcclxuICAgICAgICBwb3NpdGlvbnMsXHJcbiAgICAgICAgMixcclxuICAgICAgICB0aGlzLm9wdGlvbnMud29yZHNOYW1lXHJcbiAgICAgICkudGhlbihyZXMgPT4ge1xyXG4gICAgICAgIF90aGlzLmxlbmd0aEJ5TWV0ZXIgPSByZXNcclxuICAgICAgICB0aGlzLmxlbmd0aENoYW5nZUNhbGxCYWNrICYmIHRoaXMubGVuZ3RoQ2hhbmdlQ2FsbEJhY2soKVxyXG4gICAgICAgIGNkICYmIGNkKClcclxuICAgICAgfSlcclxuICAgIH1cclxuICAgIHJldHVybiBmcm9tRGVncmVlc0FycmF5XHJcbiAgfVxyXG5cclxuICAvLyDmm7TmlrDlpJrovrnlvaLvvIjnur/mianlsZXvvIlcclxuICByZW5ld1BvbHlnb24oZnJvbURlZ3JlZXNBcnJheSkge1xyXG4gICAgbGV0IGxpbmVQb3NpdGlvbnMgPSBbXVxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5leHRlbmQgJiYgdGhpcy5vcHRpb25zLmV4dGVuZCAhPT0gJ2ZhbHNlJykge1xyXG4gICAgICBsZXQgb3V0ZXJIb2xlID0gW11cclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmcm9tRGVncmVlc0FycmF5Lmxlbmd0aDsgaSArPSAzKSB7XHJcbiAgICAgICAgbGluZVBvc2l0aW9ucy5wdXNoKFtmcm9tRGVncmVlc0FycmF5W2ldLCBmcm9tRGVncmVlc0FycmF5W2kgKyAxXV0pXHJcbiAgICAgIH1cclxuICAgICAgbGV0IGxpbmVzdHJpbmcgPSB0dXJmLmxpbmVTdHJpbmcobGluZVBvc2l0aW9ucylcclxuICAgICAgbGV0IGJ1ZmZlcmVkID0gdHVyZi5idWZmZXIoXHJcbiAgICAgICAgbGluZXN0cmluZyxcclxuICAgICAgICB0aGlzLm9wdGlvbnMuZXh0ZW5kV2lkdGggLyAxMDAwLFxyXG4gICAgICAgIHsgdW5pdHM6ICdraWxvbWV0ZXJzJyB9XHJcbiAgICAgIClcclxuXHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnVmZmVyZWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMF0ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBvdXRlckhvbGUucHVzaChcclxuICAgICAgICAgIGJ1ZmZlcmVkLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzBdW2ldWzBdLFxyXG4gICAgICAgICAgYnVmZmVyZWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMF1baV1bMV1cclxuICAgICAgICApXHJcbiAgICAgIH1cclxuICAgICAgbGV0IGhvbGVzID0gW10gLy8g5a2UXHJcbiAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgYnVmZmVyZWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBsZXQgYXJyYXkgPSBbXVxyXG4gICAgICAgIGZvciAobGV0IG0gPSAwOyBtIDwgYnVmZmVyZWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbaV0ubGVuZ3RoOyBtKyspIHtcclxuICAgICAgICAgIGFycmF5LnB1c2goXHJcbiAgICAgICAgICAgIGJ1ZmZlcmVkLmdlb21ldHJ5LmNvb3JkaW5hdGVzW2ldW21dWzBdLFxyXG4gICAgICAgICAgICBidWZmZXJlZC5nZW9tZXRyeS5jb29yZGluYXRlc1tpXVttXVsxXVxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIH1cclxuICAgICAgICBob2xlcy5wdXNoKHsgcG9zaXRpb25zOiBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlc0FycmF5KGFycmF5KSB9KVxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuZW50aXR5LnBvbHlnb24gPSBuZXcgQ2VzaXVtLlBvbHlnb25HcmFwaGljcyh7XHJcbiAgICAgICAgaGllcmFyY2h5OiB7XHJcbiAgICAgICAgICBwb3NpdGlvbnM6IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzQXJyYXkob3V0ZXJIb2xlKSxcclxuICAgICAgICAgIGhvbGVzOiBob2xlc1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgbWF0ZXJpYWw6IENlc2l1bS5Db2xvci5mcm9tQ3NzQ29sb3JTdHJpbmcodGhpcy5vcHRpb25zLmV4dGVuZENvbG9yKVxyXG4gICAgICB9KVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5lbnRpdHkucG9seWdvbiA9IHVuZGVmaW5lZFxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgcmVzZXQoKSB7XHJcbiAgICBpZiAoIXRoaXMuZW50aXR5KSB7XHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG4gICAgdGhpcy5vcHRpb25zID0gdGhpcy5kZWVwQ29weU9iaih0aGlzLm9yaWdpbmFsT3B0aW9ucylcclxuICAgIHRoaXMubmFtZSA9IHRoaXMub3JpZ2luYWxPcHRpb25zLm5hbWVcclxuICAgIHRoaXMuY29sb3IgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5jb2xvclxyXG4gICAgdGhpcy5saW5lV2lkdGggPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy53aWR0aFxyXG4gICAgdGhpcy5saW5lVHlwZSA9IHRoaXMub3JpZ2luYWxPcHRpb25zLnR5cGVcclxuICAgIHRoaXMubm9zZVRvVGFpbCA9IHRoaXMub3JpZ2luYWxPcHRpb25zLm5vc2VUb1RhaWxcclxuICAgIHRoaXMuc21vb3RoID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMuc21vb3RoXHJcbiAgICB0aGlzLmV4dGVuZCA9IHRoaXMub3JpZ2luYWxPcHRpb25zLmV4dGVuZFxyXG4gICAgdGhpcy5leHRlbmRXaWR0aCA9IHRoaXMub3JpZ2luYWxPcHRpb25zLmV4dGVuZFdpZHRoXHJcbiAgICB0aGlzLmV4dGVuZENvbG9yID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMuZXh0ZW5kQ29sb3JcclxuICAgIHRoaXMubGFiZWxTaG93ID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMubGFiZWwuc2hvd1xyXG4gICAgdGhpcy5sYWJlbENvbG9yID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMubGFiZWwuY29sb3JcclxuICAgIHRoaXMubGFiZWxGb250U2l6ZSA9IHRoaXMub3JpZ2luYWxPcHRpb25zLmxhYmVsLmZvbnRTaXplXHJcbiAgICB0aGlzLmxhYmVsRm9udEZhbWlseSA9IHRoaXMub3JpZ2luYWxPcHRpb25zLmxhYmVsLmZvbnRGYW1pbHlcclxuICAgIHRoaXMubGFiZWxMaW5lV2lkdGggPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5sYWJlbC5saW5lV2lkdGhcclxuICAgIHRoaXMubGFiZWxQaXhlbE9mZnNldCA9IHRoaXMub3JpZ2luYWxPcHRpb25zLmxhYmVsLnBpeGVsT2Zmc2V0XHJcbiAgICB0aGlzLmxhYmVsTGluZUNvbG9yID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMubGFiZWwubGluZUNvbG9yXHJcbiAgICB0aGlzLmxhYmVsQmFja2dyb3VuZENvbG9yU3RhcnQgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5sYWJlbC5iYWNrZ3JvdW5kQ29sb3JbMF1cclxuICAgIHRoaXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmQgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5sYWJlbC5iYWNrZ3JvdW5kQ29sb3JbMV1cclxuICAgIHRoaXMuYXR0cmlidXRlTGluayA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50XHJcbiAgICAvLyB0aGlzLmF0dHJpYnV0ZVZyID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52ci5jb250ZW50XHJcbiAgICAvLyB0aGlzLmF0dHJpYnV0ZUNhbWVyYSA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUuY2FtZXJhLmNvbnRlbnRcclxuICAgIC8vIHRoaXMuYXR0cmlidXRlR29vZHMgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmdvb2RzLmNvbnRlbnRcclxuICAgIHRoaXMucm90YXRlID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMucm90YXRlXHJcbiAgICB0aGlzLnNwZWVkID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMuc3BlZWRcclxuICAgIC8vIHRoaXMuZGFzaFNpemUgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5kYXNoU2l6ZVxyXG4gICAgdGhpcy5zcGFjZSA9IHRoaXMub3JpZ2luYWxPcHRpb25zLnNwYWNlXHJcbiAgICAvLyB0aGlzLmNhbWVyYVNlbGVjdCAmJiB0aGlzLmNhbWVyYVNlbGVjdCgpXHJcbiAgICAvLyB0aGlzLmdvb2RzU2VsZWN0ICYmIHRoaXMuZ29vZHNTZWxlY3QoKVxyXG5cclxuICAgIHRoaXMuaGVpZ2h0TW9kZSA9IHRoaXMub3B0aW9ucy5oZWlnaHRNb2RlXHJcblxyXG4gICAgLy8gbGV0IGhlaWdodFxyXG4gICAgLy8gaWYgKHRoaXMuZ3JvdW5kKSB7XHJcbiAgICAvLyAgIGhlaWdodCA9IGF3YWl0IHRoYXQuZ2V0Q2xhbXBUb0hlaWdodCh7XHJcbiAgICAvLyAgICAgbG5nOiB0aGlzLm9wdGlvbnMucG9zaXRpb25zWzBdLmxuZyxcclxuICAgIC8vICAgICBsYXQ6IHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0ubGF0XHJcbiAgICAvLyAgIH0pXHJcbiAgICAvLyB9IGVsc2Uge1xyXG4gICAgLy8gICBoZWlnaHQgPSB0aGlzLm9wdGlvbnMucG9zaXRpb25zWzBdLmFsdFxyXG4gICAgLy8gfVxyXG4gICAgLy8gdGhpcy5vcHRpb25zLmxhYmVsLnBvc2l0aW9uID0ge1xyXG4gICAgLy8gICBsbmc6IHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0ubG5nLFxyXG4gICAgLy8gICBsYXQ6IHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0ubGF0LFxyXG4gICAgLy8gICBhbHQ6IGhlaWdodFxyXG4gICAgLy8gfVxyXG4gICAgLy8gdGhpcy5sYWJlbC5wb3NpdGlvbiA9IFtcclxuICAgIC8vICAgdGhpcy5vcHRpb25zLmxhYmVsLnBvc2l0aW9uLmxuZyxcclxuICAgIC8vICAgdGhpcy5vcHRpb25zLmxhYmVsLnBvc2l0aW9uLmxhdCxcclxuICAgIC8vICAgdGhpcy5vcHRpb25zLmxhYmVsLnBvc2l0aW9uLmFsdFxyXG4gICAgLy8gXVxyXG4gIH1cclxuXHJcbiAgX2FkZExpbmsoKSB7XHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xpbmtfYWRkJylbMF1cclxuICAgICAgICAudmFsdWVcclxuICAgICkge1xyXG4gICAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudC5wdXNoKHtcclxuICAgICAgICBuYW1lOiAn6ZO+5o6lJyArICh0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudC5sZW5ndGggKyAxKSxcclxuICAgICAgICB1cmw6IHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXHJcbiAgICAgICAgICAnbGlua19hZGQnXHJcbiAgICAgICAgKVswXS52YWx1ZVxyXG4gICAgICB9KVxyXG4gICAgICB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFxyXG4gICAgICAgICdsaW5rX2FkZCdcclxuICAgICAgKVswXS52YWx1ZSA9ICcnXHJcbiAgICAgIHRoaXMuYXR0cmlidXRlTGluayA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLkRpYWxvZy5jbGlja0FkZExpbmsgJiYgdGhpcy5EaWFsb2cuY2xpY2tBZGRMaW5rKClcclxuICAgICAgLy8gbGV0IGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcclxuICAgICAgLy8gaW5wdXQudHlwZSA9IFwiZmlsZVwiO1xyXG4gICAgICAvLyBpbnB1dC5hY2NlcHQgPSBcIi5tcDQsIC5wZGZcIlxyXG4gICAgICAvLyBpbnB1dC5jbGljaygpXHJcbiAgICAgIC8vIGlucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIChldmVudCkgPT4ge1xyXG4gICAgICAvLyAgIGlmIChpbnB1dC52YWx1ZSkge1xyXG4gICAgICAvLyAgICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnQucHVzaCh7XHJcbiAgICAgIC8vICAgICAgIG5hbWU6ICfpk77mjqUnICsgKHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50Lmxlbmd0aCArIDEpLFxyXG4gICAgICAvLyAgICAgICB1cmw6IGlucHV0LnZhbHVlXHJcbiAgICAgIC8vICAgICB9KVxyXG4gICAgICAvLyAgICAgdGhpcy5hdHRyaWJ1dGVMaW5rID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnRcclxuICAgICAgLy8gICB9XHJcbiAgICAgIC8vIH0pXHJcbiAgICB9XHJcbiAgfVxyXG4gIGFkZEF0dHJpYnV0ZUxpbmsobGluaykge1xyXG4gICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnQucHVzaCh7XHJcbiAgICAgIG5hbWU6ICfpk77mjqUnICsgKHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50Lmxlbmd0aCArIDEpLFxyXG4gICAgICB1cmw6IGxpbmtcclxuICAgIH0pXHJcbiAgICB0aGlzLmF0dHJpYnV0ZUxpbmsgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudFxyXG4gIH1cclxuXHJcbiAgLy8gX2FkZFJyKCkge1xyXG4gIC8vICAgaWYgKFxyXG4gIC8vICAgICB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFxyXG4gIC8vICAgICAgICd2cl9hZGQnXHJcbiAgLy8gICAgIClbMF0udmFsdWVcclxuICAvLyAgICkge1xyXG4gIC8vICAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnQucHVzaCh7XHJcbiAgLy8gICAgICAgbmFtZTogJ+WFqOaZr+WbvicgKyAodGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52ci5jb250ZW50Lmxlbmd0aCArIDEpLFxyXG4gIC8vICAgICAgIHVybDogdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcclxuICAvLyAgICAgICAgICd2cl9hZGQnXHJcbiAgLy8gICAgICAgKVswXS52YWx1ZVxyXG4gIC8vICAgICB9KVxyXG4gIC8vICAgICB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFxyXG4gIC8vICAgICAgICd2cl9hZGQnXHJcbiAgLy8gICAgIClbMF0udmFsdWUgPSAnJ1xyXG4gIC8vICAgICB0aGlzLmF0dHJpYnV0ZVZyID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52ci5jb250ZW50XHJcbiAgLy8gICB9IGVsc2Uge1xyXG4gIC8vICAgICB0aGlzLkRpYWxvZy5jbGlja0FkZFZyICYmIHRoaXMuRGlhbG9nLmNsaWNrQWRkVnIoKVxyXG4gIC8vICAgfVxyXG4gIC8vIH1cclxuXHJcbiAgLy8gYWRkQXR0cmlidXRlUnIodnIpIHtcclxuICAvLyAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudC5wdXNoKHtcclxuICAvLyAgICAgbmFtZTogJ+WFqOaZr+WbvicgKyAodGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52ci5jb250ZW50Lmxlbmd0aCArIDEpLFxyXG4gIC8vICAgICB1cmw6IHZyXHJcbiAgLy8gICB9KVxyXG4gIC8vICAgdGhpcy5hdHRyaWJ1dGVWciA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudFxyXG4gIC8vIH1cclxuXHJcbiAgLyoqXHJcbiAgICog6aOe5YiwXHJcbiAgICovXHJcbiAgYXN5bmMgZmx5VG8ob3B0aW9ucyA9IHt9KSB7XHJcbiAgICBpZiAodGhpcy5fZXJyb3IpIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcbiAgICBzZXRBY3RpdmVWaWV3ZXIoMClcclxuICAgIGNsb3NlUm90YXRlQXJvdW5kKHRoaXMuc2RrKVxyXG4gICAgY2xvc2VWaWV3Rm9sbG93KHRoaXMuc2RrKVxyXG5cclxuICAgIGlmICh0aGlzLm9wdGlvbnMuY3VzdG9tVmlldyAmJiB0aGlzLm9wdGlvbnMuY3VzdG9tVmlldy5yZWxhdGl2ZVBvc2l0aW9uICYmIHRoaXMub3B0aW9ucy5jdXN0b21WaWV3Lm9yaWVudGF0aW9uKSB7XHJcbiAgICAgIGxldCBvcmllbnRhdGlvbiA9IHtcclxuICAgICAgICBoZWFkaW5nOiBDZXNpdW0uTWF0aC50b1JhZGlhbnModGhpcy5vcHRpb25zLmN1c3RvbVZpZXcub3JpZW50YXRpb24uaGVhZGluZyB8fCAwLjApLFxyXG4gICAgICAgIHBpdGNoOiBDZXNpdW0uTWF0aC50b1JhZGlhbnModGhpcy5vcHRpb25zLmN1c3RvbVZpZXcub3JpZW50YXRpb24ucGl0Y2ggfHwgLTYwLjApLFxyXG4gICAgICAgIHJvbGw6IENlc2l1bS5NYXRoLnRvUmFkaWFucyh0aGlzLm9wdGlvbnMuY3VzdG9tVmlldy5vcmllbnRhdGlvbi5yb2xsIHx8IDAuMClcclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IGxuZyA9IHRoaXMub3B0aW9ucy5jdXN0b21WaWV3LnJlbGF0aXZlUG9zaXRpb24ubG5nXHJcbiAgICAgIGxldCBsYXQgPSB0aGlzLm9wdGlvbnMuY3VzdG9tVmlldy5yZWxhdGl2ZVBvc2l0aW9uLmxhdFxyXG4gICAgICBsZXQgYWx0ID0gdGhpcy5vcHRpb25zLmN1c3RvbVZpZXcucmVsYXRpdmVQb3NpdGlvbi5hbHRcclxuICAgICAgbGV0IGRlc3RpbmF0aW9uID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXMobG5nLCBsYXQsIGFsdClcclxuXHJcbiAgICAgIGxldCBwb3NpdGlvbiA9IHsgbG5nOiAwLCBsYXQ6IDAgfVxyXG4gICAgICBpZiAodGhpcy5vcHRpb25zLnBvc2l0aW9uKSB7XHJcbiAgICAgICAgcG9zaXRpb24gPSB7IC4uLnRoaXMub3B0aW9ucy5wb3NpdGlvbiB9XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAodGhpcy5vcHRpb25zLnBvc2l0aW9ucykge1xyXG4gICAgICAgIHBvc2l0aW9uID0geyAuLi50aGlzLm9wdGlvbnMucG9zaXRpb25zWzBdIH1cclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmICh0aGlzLm9wdGlvbnMuY2VudGVyKSB7XHJcbiAgICAgICAgcG9zaXRpb24gPSB7IC4uLnRoaXMub3B0aW9ucy5jZW50ZXIgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKHRoaXMub3B0aW9ucy5zdGFydCkge1xyXG4gICAgICAgIHBvc2l0aW9uID0geyAuLi50aGlzLm9wdGlvbnMuc3RhcnQgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ2xuZycpKSB7XHJcbiAgICAgICAgICBwb3NpdGlvbi5sbmcgPSB0aGlzLm9wdGlvbnMubG5nXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ2xhdCcpKSB7XHJcbiAgICAgICAgICBwb3NpdGlvbi5sYXQgPSB0aGlzLm9wdGlvbnMubGF0XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ2FsdCcpKSB7XHJcbiAgICAgICAgICBwb3NpdGlvbi5hbHQgPSB0aGlzLm9wdGlvbnMuYWx0XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIC8vIOWmguaenOayoeaciemrmOW6puWAvO+8jOWImeiOt+WPlue0p+i0tOmrmOW6puiuoeeul1xyXG4gICAgICBpZiAoIXBvc2l0aW9uLmhhc093blByb3BlcnR5KCdhbHQnKSkge1xyXG4gICAgICAgIHBvc2l0aW9uLmFsdCA9IGF3YWl0IHRoaXMuZ2V0Q2xhbXBUb0hlaWdodChwb3NpdGlvbilcclxuICAgICAgfVxyXG4gICAgICBsbmcgPSB0aGlzLm9wdGlvbnMuY3VzdG9tVmlldy5yZWxhdGl2ZVBvc2l0aW9uLmxuZyArIHBvc2l0aW9uLmxuZ1xyXG4gICAgICBsYXQgPSB0aGlzLm9wdGlvbnMuY3VzdG9tVmlldy5yZWxhdGl2ZVBvc2l0aW9uLmxhdCArIHBvc2l0aW9uLmxhdFxyXG4gICAgICBhbHQgPSB0aGlzLm9wdGlvbnMuY3VzdG9tVmlldy5yZWxhdGl2ZVBvc2l0aW9uLmFsdCArIHBvc2l0aW9uLmFsdFxyXG4gICAgICBkZXN0aW5hdGlvbiA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzKGxuZywgbGF0LCBhbHQpXHJcbiAgICAgIHRoaXMuc2RrLnZpZXdlci5jYW1lcmEuZmx5VG8oe1xyXG4gICAgICAgIGRlc3RpbmF0aW9uOiBkZXN0aW5hdGlvbixcclxuICAgICAgICBvcmllbnRhdGlvbjogb3JpZW50YXRpb25cclxuICAgICAgfSlcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBsZXQgcG9zaXRpb25BcnJheSA9IFtdXHJcbiAgICAgIGxldCBoZWlnaHRcclxuICAgICAgc3dpdGNoICh0aGlzLm9wdGlvbnMuaGVpZ2h0TW9kZSkge1xyXG4gICAgICAgIGNhc2UgJzAnOlxyXG4gICAgICAgIGNhc2UgMDpcclxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5vcHRpb25zLnBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBsZXQgYSA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzKFxyXG4gICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubG5nLFxyXG4gICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubGF0LFxyXG4gICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0uYWx0XHJcbiAgICAgICAgICAgIClcclxuICAgICAgICAgICAgcG9zaXRpb25BcnJheS5wdXNoKGEueCwgYS55LCBhLnopXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVha1xyXG4gICAgICAgIGNhc2UgJzEnOlxyXG4gICAgICAgIGNhc2UgMTpcclxuICAgICAgICAgIGhlaWdodCA9IGF3YWl0IHRoaXMuZ2V0Q2xhbXBUb0hlaWdodCh0aGlzLm9wdGlvbnMucG9zaXRpb25zWzBdKVxyXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm9wdGlvbnMucG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGxldCBhID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXMoXHJcbiAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sbmcsXHJcbiAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sYXQsXHJcbiAgICAgICAgICAgICAgaGVpZ2h0ICsgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5hbHRcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICBwb3NpdGlvbkFycmF5LnB1c2goYS54LCBhLnksIGEueilcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgY2FzZSAnMic6XHJcbiAgICAgICAgY2FzZSAyOlxyXG4gICAgICAgICAgaGVpZ2h0ID0gYXdhaXQgdGhpcy5nZXRDbGFtcFRvSGVpZ2h0KHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0pXHJcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMub3B0aW9ucy5wb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgbGV0IGEgPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlcyhcclxuICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxuZyxcclxuICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxhdCxcclxuICAgICAgICAgICAgICBoZWlnaHRcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICBwb3NpdGlvbkFycmF5LnB1c2goYS54LCBhLnksIGEueilcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrXHJcbiAgICAgIH1cclxuICAgICAgbGV0IEJvdW5kaW5nU3BoZXJlID0gQ2VzaXVtLkJvdW5kaW5nU3BoZXJlLmZyb21WZXJ0aWNlcyhwb3NpdGlvbkFycmF5KVxyXG4gICAgICB0aGlzLnNkay52aWV3ZXIuY2FtZXJhLmZseVRvQm91bmRpbmdTcGhlcmUoQm91bmRpbmdTcGhlcmUsIHtcclxuICAgICAgICBvZmZzZXQ6IG9wdGlvbnMub3JpZW50YXRpb24gfHwge1xyXG4gICAgICAgICAgaGVhZGluZzogQ2VzaXVtLk1hdGgudG9SYWRpYW5zKDAuMCksXHJcbiAgICAgICAgICBwaXRjaDogQ2VzaXVtLk1hdGgudG9SYWRpYW5zKC05MC4wKSxcclxuICAgICAgICAgIHJvbGw6IENlc2l1bS5NYXRoLnRvUmFkaWFucygwLjApXHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICog5omT5byA5a+M5paH5pys5qGGXHJcbiAgICovXHJcbiAgb3BlblJpY2hUZXh0RWRpdG9yKGUpIHtcclxuICAgIC8vIHZhciB1ZSA9IFVFLmdldEVkaXRvcignYXBwJyk7XHJcbiAgICByaWNoVGV4dC5vcGVuKFxyXG4gICAgICB0aGlzLm9wdGlvbnMuaWQsXHJcbiAgICAgIHRoaXMub3B0aW9ucy5uYW1lLFxyXG4gICAgICB0aGlzLm9wdGlvbnMucmljaFRleHRDb250ZW50XHJcbiAgICApXHJcbiAgICByaWNoVGV4dC5wcmltYXJ5Q2FsbEJhY2sgPSBjb250ZW50ID0+IHtcclxuICAgICAgdGhpcy5vcHRpb25zLnJpY2hUZXh0Q29udGVudCA9IGNvbnRlbnRcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIHN0YXRpYyBub2RlRWRpdDIodGhhdCwgY2IgPSAoKSA9PiB7IH0pIHtcclxuICAvLyAgIHRoYXQucG9zaXRpb25FZGl0aW5nID0gZmFsc2VcclxuICAvLyAgIGlmIChZSi5NZWFzdXJlLkdldE1lYXN1cmVTdGF0dXMoKSkge1xyXG4gIC8vICAgICBjYign5LiK5LiA5qyh5rWL6YeP5pyq57uT5p2fJylcclxuICAvLyAgIH0gZWxzZSB7XHJcbiAgLy8gICAgIFlKLk1lYXN1cmUuU2V0TWVhc3VyZVN0YXR1cyh0cnVlKVxyXG4gIC8vICAgICB0aGF0LnRpcCA9IG5ldyBNb3VzZVRpcCgn6K+36YCJ5oup5LiA5Liq6aG254K577yM5Y+z6ZSu5Y+W5raIJywgdGhhdC5zZGspXHJcbiAgLy8gICAgIHRoYXQuZXZlbnQgPSBuZXcgTW91c2VFdmVudCh0aGF0LnNkaylcclxuICAvLyAgICAgdGhhdC5ub2RlUG9pbnRzID0gW11cclxuICAvLyAgICAgbGV0IHNlbGVjdFBvaW50XHJcbiAgLy8gICAgIGxldCBvcmlnaW5hbFBvc2l0aW9uXHJcbiAgLy8gICAgIGxldCBuZXdwb3NpdGlvbnMgPSBbXVxyXG4gIC8vICAgICBsZXQgZnJvbURlZ3JlZXNBcnJheSA9IFtdXHJcbiAgLy8gICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhhdC5vcHRpb25zLnBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gIC8vICAgICAgIGZyb21EZWdyZWVzQXJyYXkucHVzaChcclxuICAvLyAgICAgICAgIHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbaV0ubG5nLFxyXG4gIC8vICAgICAgICAgdGhhdC5vcHRpb25zLnBvc2l0aW9uc1tpXS5sYXQsXHJcbiAgLy8gICAgICAgICB0aGF0Lm9wdGlvbnMucG9zaXRpb25zW2ldLmFsdFxyXG4gIC8vICAgICAgIClcclxuICAvLyAgICAgfVxyXG4gIC8vICAgICBuZXdwb3NpdGlvbnMgPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlc0FycmF5SGVpZ2h0cyhmcm9tRGVncmVlc0FycmF5KVxyXG5cclxuICAvLyAgICAgdGhhdC5ldmVudC5tb3VzZV9sZWZ0KChtb3ZlbWVudCwgY2FydGVzaWFuKSA9PiB7XHJcbiAgLy8gICAgICAgaWYgKHNlbGVjdFBvaW50KSB7XHJcbiAgLy8gICAgICAgICB0aGF0Lm9wdGlvbnMucG9zaXRpb25zW3NlbGVjdFBvaW50LmluZGV4XSA9IHRoYXQuY2FydGVzaWFuM1Rvd2dzODQoXHJcbiAgLy8gICAgICAgICAgIGNhcnRlc2lhbixcclxuICAvLyAgICAgICAgICAgdGhhdC5zZGsudmlld2VyXHJcbiAgLy8gICAgICAgICApXHJcbiAgLy8gICAgICAgICBvcmlnaW5hbFBvc2l0aW9uID0gdGhhdC5vcHRpb25zLnBvc2l0aW9uc1tzZWxlY3RQb2ludC5pbmRleF1cclxuICAvLyAgICAgICAgIGxldCBlbnRpdHkgPSB0aGF0LnNkay52aWV3ZXIuZW50aXRpZXMuYWRkKHtcclxuICAvLyAgICAgICAgICAgbmFtZTogJ25vZGUtc2Vjb25kYXJ5LWVkaXQtcG9pbnQnLFxyXG4gIC8vICAgICAgICAgICBwb3NpdGlvbjogQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXMoXHJcbiAgLy8gICAgICAgICAgICAgdGhhdC5vcHRpb25zLnBvc2l0aW9uc1tzZWxlY3RQb2ludC5pbmRleF0ubG5nLFxyXG4gIC8vICAgICAgICAgICAgIHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbc2VsZWN0UG9pbnQuaW5kZXhdLmxhdCxcclxuICAvLyAgICAgICAgICAgICB0aGF0Lm9wdGlvbnMucG9zaXRpb25zW3NlbGVjdFBvaW50LmluZGV4XS5hbHRcclxuICAvLyAgICAgICAgICAgKSxcclxuICAvLyAgICAgICAgICAgYmlsbGJvYXJkOiB7XHJcbiAgLy8gICAgICAgICAgICAgaW1hZ2U6IHRoYXQuZ2V0U291cmNlUm9vdFBhdGgoKSArICcvaW1nL3BvaW50LnBuZycsXHJcbiAgLy8gICAgICAgICAgICAgd2lkdGg6IDE1LFxyXG4gIC8vICAgICAgICAgICAgIGhlaWdodDogMTUsXHJcbiAgLy8gICAgICAgICAgICAgZGlzYWJsZURlcHRoVGVzdERpc3RhbmNlOiBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFlcclxuICAvLyAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgfSlcclxuICAvLyAgICAgICAgIHRoYXQubm9kZVBvaW50cy5zcGxpY2Uoc2VsZWN0UG9pbnQuaW5kZXgsIDAsIGVudGl0eSlcclxuICAvLyAgICAgICAgIHRoYXQub3B0aW9ucy5wb3NpdGlvbnMuc3BsaWNlKFxyXG4gIC8vICAgICAgICAgICBzZWxlY3RQb2ludC5pbmRleCxcclxuICAvLyAgICAgICAgICAgMCxcclxuICAvLyAgICAgICAgICAgdGhhdC5vcHRpb25zLnBvc2l0aW9uc1tzZWxlY3RQb2ludC5pbmRleF1cclxuICAvLyAgICAgICAgIClcclxuICAvLyAgICAgICAgIGxldCBmcm9tRGVncmVlc0FycmF5ID0gdGhhdC5yZW5ld1Bvc2l0aW9ucyh0aGF0Lm9wdGlvbnMucG9zaXRpb25zKVxyXG4gIC8vICAgICAgICAgdGhhdC5yZW5ld1BvbHlnb24oZnJvbURlZ3JlZXNBcnJheSlcclxuICAvLyAgICAgICAgIHRoYXQub3B0aW9ucy5sZW5ndGhCeU1ldGVyID0gdGhhdC5jb21wdXRlRGlzdGFuY2UoXHJcbiAgLy8gICAgICAgICAgIHRoYXQub3B0aW9ucy5wb3NpdGlvbnMsXHJcbiAgLy8gICAgICAgICAgIDIsXHJcbiAgLy8gICAgICAgICAgIHRoYXQuZ3JvdW5kXHJcbiAgLy8gICAgICAgICApXHJcbiAgLy8gICAgICAgICB0aGF0Lmxlbmd0aFVuaXQgPSB0aGF0Lm9wdGlvbnMubGVuZ3RoVW5pdFxyXG4gIC8vICAgICAgIH0gZWxzZSB7XHJcbiAgLy8gICAgICAgICB2YXIgcGljayA9IHRoYXQuc2RrLnZpZXdlci5zY2VuZS5waWNrKG1vdmVtZW50LnBvc2l0aW9uKVxyXG4gIC8vICAgICAgICAgaWYgKFxyXG4gIC8vICAgICAgICAgICBwaWNrICYmXHJcbiAgLy8gICAgICAgICAgIHBpY2suaWQgJiZcclxuICAvLyAgICAgICAgICAgcGljay5pZC5uYW1lICYmXHJcbiAgLy8gICAgICAgICAgIHBpY2suaWQubmFtZSA9PT0gJ25vZGUtc2Vjb25kYXJ5LWVkaXQtcG9pbnQnXHJcbiAgLy8gICAgICAgICApIHtcclxuICAvLyAgICAgICAgICAgc2VsZWN0UG9pbnQgPSBwaWNrLmlkXHJcbiAgLy8gICAgICAgICAgIHRoYXQubm9kZVBvaW50cy5zcGxpY2UocGljay5pZC5pbmRleCwgMSlcclxuICAvLyAgICAgICAgICAgdGhhdC5zZGsudmlld2VyLmVudGl0aWVzLnJlbW92ZShwaWNrLmlkKVxyXG4gIC8vICAgICAgICAgICB0aGF0LnRpcC5zZXRfdGV4dCgn5bem6ZSu5byA5aeL77yM5Y+z6ZSu57uT5p2f77yMQ1RSTCvlj7PplK7mkqTplIAnKVxyXG4gIC8vICAgICAgICAgICBvcmlnaW5hbFBvc2l0aW9uID0gdGhhdC5jYXJ0ZXNpYW4zVG93Z3M4NChcclxuICAvLyAgICAgICAgICAgICBjYXJ0ZXNpYW4sXHJcbiAgLy8gICAgICAgICAgICAgdGhhdC5zZGsudmlld2VyXHJcbiAgLy8gICAgICAgICAgIClcclxuICAvLyAgICAgICAgIH1cclxuICAvLyAgICAgICB9XHJcbiAgLy8gICAgIH0pXHJcblxyXG4gIC8vICAgICB0aGF0LmV2ZW50Lm1vdXNlX3JpZ2h0KChtb3ZlbWVudCwgY2FydGVzaWFuKSA9PiB7XHJcbiAgLy8gICAgICAgaWYgKHNlbGVjdFBvaW50KSB7XHJcbiAgLy8gICAgICAgICB0aGF0Lm9wdGlvbnMucG9zaXRpb25zW3NlbGVjdFBvaW50LmluZGV4XSA9IG9yaWdpbmFsUG9zaXRpb25cclxuICAvLyAgICAgICAgIGNiKG51bGwsIHRoYXQub3B0aW9ucy5wb3NpdGlvbnMpXHJcbiAgLy8gICAgICAgfVxyXG4gIC8vICAgICAgIGxldCBwb3NpdGlvbnMgPSB0aGF0Lm9wdGlvbnMucG9zaXRpb25zXHJcbiAgLy8gICAgICAgbGV0IGZyb21EZWdyZWVzQXJyYXkgPSBbXVxyXG4gIC8vICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgLy8gICAgICAgICBmcm9tRGVncmVlc0FycmF5LnB1c2goXHJcbiAgLy8gICAgICAgICAgIHBvc2l0aW9uc1tpXS5sbmcsXHJcbiAgLy8gICAgICAgICAgIHBvc2l0aW9uc1tpXS5sYXQsXHJcbiAgLy8gICAgICAgICAgIHBvc2l0aW9uc1tpXS5hbHRcclxuICAvLyAgICAgICAgIClcclxuICAvLyAgICAgICB9XHJcbiAgLy8gICAgICAgbmV3cG9zaXRpb25zID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXNBcnJheUhlaWdodHMoXHJcbiAgLy8gICAgICAgICBmcm9tRGVncmVlc0FycmF5XHJcbiAgLy8gICAgICAgKVxyXG4gIC8vICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhhdC5ub2RlUG9pbnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgLy8gICAgICAgICB0aGF0LnNkay52aWV3ZXIuZW50aXRpZXMucmVtb3ZlKHRoYXQubm9kZVBvaW50c1tpXSlcclxuICAvLyAgICAgICB9XHJcbiAgLy8gICAgICAgdGhhdC5ub2RlUG9pbnRzID0gW11cclxuICAvLyAgICAgICB0aGF0LmV2ZW50LmRlc3Ryb3koKVxyXG4gIC8vICAgICAgIHRoYXQudGlwLmRlc3Ryb3koKVxyXG4gIC8vICAgICB9KVxyXG5cclxuICAvLyAgICAgdGhhdC5ldmVudC5tb3VzZV9tb3ZlKChtb3ZlbWVudCwgY2FydGVzaWFuKSA9PiB7XHJcbiAgLy8gICAgICAgaWYgKHNlbGVjdFBvaW50KSB7XHJcbiAgLy8gICAgICAgICB0aGF0Lm9wdGlvbnMucG9zaXRpb25zW3NlbGVjdFBvaW50LmluZGV4XSA9IHRoYXQuY2FydGVzaWFuM1Rvd2dzODQoXHJcbiAgLy8gICAgICAgICAgIGNhcnRlc2lhbixcclxuICAvLyAgICAgICAgICAgdGhhdC5zZGsudmlld2VyXHJcbiAgLy8gICAgICAgICApXHJcbiAgLy8gICAgICAgICBsZXQgcG9zaXRpb25zID0gdGhhdC5vcHRpb25zLnBvc2l0aW9uc1xyXG4gIC8vICAgICAgICAgbGV0IGZyb21EZWdyZWVzQXJyYXkgPSBbXVxyXG4gIC8vICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAvLyAgICAgICAgICAgZnJvbURlZ3JlZXNBcnJheS5wdXNoKFxyXG4gIC8vICAgICAgICAgICAgIHBvc2l0aW9uc1tpXS5sbmcsXHJcbiAgLy8gICAgICAgICAgICAgcG9zaXRpb25zW2ldLmxhdCxcclxuICAvLyAgICAgICAgICAgICBwb3NpdGlvbnNbaV0uYWx0XHJcbiAgLy8gICAgICAgICAgIClcclxuICAvLyAgICAgICAgIH1cclxuICAvLyAgICAgICAgIG5ld3Bvc2l0aW9ucyA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzQXJyYXlIZWlnaHRzKFxyXG4gIC8vICAgICAgICAgICBmcm9tRGVncmVlc0FycmF5XHJcbiAgLy8gICAgICAgICApXHJcbiAgLy8gICAgICAgICBpZiAodGhhdC5vcHRpb25zLnBvc2l0aW9ucy5sZW5ndGggPT09IDEpIHtcclxuICAvLyAgICAgICAgICAgdGhhdC5sYWJlbC5wb3NpdGlvbiA9IFtcclxuICAvLyAgICAgICAgICAgICB0aGF0Lm9wdGlvbnMucG9zaXRpb25zWzBdLmxuZyxcclxuICAvLyAgICAgICAgICAgICB0aGF0Lm9wdGlvbnMucG9zaXRpb25zWzBdLmxhdCxcclxuICAvLyAgICAgICAgICAgICB0aGF0Lm9wdGlvbnMucG9zaXRpb25zWzBdLmFsdFxyXG4gIC8vICAgICAgICAgICBdXHJcbiAgLy8gICAgICAgICAgIHRoYXQub3B0aW9ucy5sYWJlbC5wb3NpdGlvbiA9IHtcclxuICAvLyAgICAgICAgICAgICBsbmc6IHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbMF0ubG5nLFxyXG4gIC8vICAgICAgICAgICAgIGxhdDogdGhhdC5vcHRpb25zLnBvc2l0aW9uc1swXS5sYXQsXHJcbiAgLy8gICAgICAgICAgICAgYWx0OiB0aGF0Lm9wdGlvbnMucG9zaXRpb25zWzBdLmFsdFxyXG4gIC8vICAgICAgICAgICB9XHJcbiAgLy8gICAgICAgICB9XHJcbiAgLy8gICAgICAgfVxyXG4gIC8vICAgICAgIHRoYXQudGlwLnNldFBvc2l0aW9uKFxyXG4gIC8vICAgICAgICAgY2FydGVzaWFuLFxyXG4gIC8vICAgICAgICAgbW92ZW1lbnQuZW5kUG9zaXRpb24ueCxcclxuICAvLyAgICAgICAgIG1vdmVtZW50LmVuZFBvc2l0aW9uLnlcclxuICAvLyAgICAgICApXHJcbiAgLy8gICAgIH0pXHJcblxyXG4gIC8vICAgICB0aGF0LmV2ZW50Lm1vdXNlX3JpZ2h0X2tleWJvYXJkX2N0cmwoKG1vdmVtZW50LCBjYXJ0ZXNpYW4pID0+IHtcclxuICAvLyAgICAgICBpZiAoc2VsZWN0UG9pbnQpIHtcclxuICAvLyAgICAgICAgIHRoYXQub3B0aW9ucy5wb3NpdGlvbnMucG9wKClcclxuICAvLyAgICAgICAgIHRoYXQuc2RrLnZpZXdlci5lbnRpdGllcy5yZW1vdmUoXHJcbiAgLy8gICAgICAgICAgIHRoYXQubm9kZVBvaW50c1t0aGF0Lm5vZGVQb2ludHMubGVuZ3RoIC0gMV1cclxuICAvLyAgICAgICAgIClcclxuICAvLyAgICAgICAgIHRoYXQubm9kZVBvaW50cy5wb3AoKVxyXG4gIC8vICAgICAgICAgaWYgKHNlbGVjdFBvaW50LmluZGV4ID09PSB0aGF0Lm9wdGlvbnMucG9zaXRpb25zLmxlbmd0aCkge1xyXG4gIC8vICAgICAgICAgICBpZiAodGhhdC5ub2RlUG9pbnRzW3NlbGVjdFBvaW50LmluZGV4IC0gMV0pIHtcclxuICAvLyAgICAgICAgICAgICBzZWxlY3RQb2ludCA9IHRoYXQubm9kZVBvaW50c1tzZWxlY3RQb2ludC5pbmRleCAtIDFdXHJcbiAgLy8gICAgICAgICAgIH0gZWxzZSB7XHJcbiAgLy8gICAgICAgICAgICAgc2VsZWN0UG9pbnQuaW5kZXggPSAwXHJcbiAgLy8gICAgICAgICAgIH1cclxuICAvLyAgICAgICAgIH1cclxuICAvLyAgICAgICB9XHJcbiAgLy8gICAgIH0pXHJcblxyXG4gIC8vICAgICB0aGF0LmVudGl0eS5wb2x5bGluZS5wb3NpdGlvbnMgPSBuZXcgQ2VzaXVtLkNhbGxiYWNrUHJvcGVydHkoZnVuY3Rpb24gKCkge1xyXG4gIC8vICAgICAgIHJldHVybiBuZXdwb3NpdGlvbnNcclxuICAvLyAgICAgfSwgZmFsc2UpXHJcblxyXG4gIC8vICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoYXQub3B0aW9ucy5wb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAvLyAgICAgICBsZXQgZW50aXR5ID0gdGhhdC5zZGsudmlld2VyLmVudGl0aWVzLmFkZCh7XHJcbiAgLy8gICAgICAgICBuYW1lOiAnbm9kZS1zZWNvbmRhcnktZWRpdC1wb2ludCcsXHJcbiAgLy8gICAgICAgICBpbmRleDogaSxcclxuICAvLyAgICAgICAgIHBvc2l0aW9uOiBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlcyhcclxuICAvLyAgICAgICAgICAgdGhhdC5vcHRpb25zLnBvc2l0aW9uc1tpXS5sbmcsXHJcbiAgLy8gICAgICAgICAgIHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbaV0ubGF0LFxyXG4gIC8vICAgICAgICAgICB0aGF0Lm9wdGlvbnMucG9zaXRpb25zW2ldLmFsdFxyXG4gIC8vICAgICAgICAgKSxcclxuICAvLyAgICAgICAgIGJpbGxib2FyZDoge1xyXG4gIC8vICAgICAgICAgICBpbWFnZTogdGhhdC5nZXRTb3VyY2VSb290UGF0aCgpICsgJy9pbWcvcG9pbnQucG5nJyxcclxuICAvLyAgICAgICAgICAgd2lkdGg6IDE1LFxyXG4gIC8vICAgICAgICAgICBoZWlnaHQ6IDE1LFxyXG4gIC8vICAgICAgICAgICBkaXNhYmxlRGVwdGhUZXN0RGlzdGFuY2U6IE51bWJlci5QT1NJVElWRV9JTkZJTklUWVxyXG4gIC8vICAgICAgICAgfVxyXG4gIC8vICAgICAgIH0pXHJcbiAgLy8gICAgICAgdGhhdC5ub2RlUG9pbnRzLnB1c2goZW50aXR5KVxyXG4gIC8vICAgICB9XHJcbiAgLy8gICB9XHJcbiAgLy8gfVxyXG5cclxuICBub2RlRWRpdChjZCkge1xyXG4gICAgdGhpcy5wb3NpdGlvbkVkaXRpbmcgPSBmYWxzZVxyXG4gICAgdGhpcy5ub3NlVG9UYWlsID0gZmFsc2VcclxuICAgIC8vIHRoaXMuc21vb3RoID0gZmFsc2VcclxuICAgIHRoaXMuaGVpZ2h0TW9kZSA9IDBcclxuICAgIGlmIChZSi5NZWFzdXJlLkdldE1lYXN1cmVTdGF0dXMoKSkge1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5jbG9zZU5vZGVFZGl0KClcclxuICAgICAgWUouTWVhc3VyZS5TZXRNZWFzdXJlU3RhdHVzKHRydWUpXHJcbiAgICAgIHRoaXMuX25vZGVFZGl0Q2FsbGJhY2sgPSBjZFxyXG4gICAgICB0aGlzLnRpcCA9IG5ldyBNb3VzZVRpcCgn6K+36YCJ5oup5LiA5Liq6aG254K577yM5Y+z6ZSu5Y+W5raIJywgdGhpcy5zZGspXHJcbiAgICAgIHRoaXMuZXZlbnQgPSBuZXcgTW91c2VFdmVudCh0aGlzLnNkaylcclxuICAgICAgdGhpcy5Db250cm9sbGVyT2JqZWN0ID0gbmV3IENvbnRyb2xsZXIodGhpcy5zZGspXHJcblxyXG4gICAgICBsZXQgc2VsZWN0UG9pbnRcclxuICAgICAgdGhpcy5ldmVudC5tb3VzZV9sZWZ0KChtb3ZlbWVudCwgY2FydGVzaWFuKSA9PiB7XHJcbiAgICAgICAgdmFyIHBpY2sgPSB0aGlzLnNkay52aWV3ZXIuc2NlbmUucGljayhtb3ZlbWVudC5wb3NpdGlvbilcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICBwaWNrICYmXHJcbiAgICAgICAgICBwaWNrLmlkICYmXHJcbiAgICAgICAgICBwaWNrLmlkLm5hbWUgJiZcclxuICAgICAgICAgIHBpY2suaWQubmFtZSA9PT0gJ25vZGUtc2Vjb25kYXJ5LWVkaXQtcG9pbnQnXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICBzZWxlY3RQb2ludCA9IHBpY2suaWRcclxuICAgICAgICAgIHRoaXMuQ29udHJvbGxlck9iamVjdC5wb3NpdGlvbiA9XHJcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbc2VsZWN0UG9pbnQuaW5kZXhdXHJcbiAgICAgICAgICB0aGlzLkNvbnRyb2xsZXJPYmplY3QuZWRpdFRyYW5zbGF0aW9uYWwoKVxyXG4gICAgICAgICAgdGhpcy50aXAgJiYgdGhpcy50aXAuZGVzdHJveSgpXHJcbiAgICAgICAgICB0aGlzLkNvbnRyb2xsZXJPYmplY3QuY29udHJvbGxlckNhbGxCYWNrID0gcGFyYW1zID0+IHtcclxuICAgICAgICAgICAgaWYgKHNlbGVjdFBvaW50LmluZGV4ID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5sYWJlbC5wb3NpdGlvbiA9IFtcclxuICAgICAgICAgICAgICAgIHBhcmFtcy5wb3NpdGlvbi5sbmcsXHJcbiAgICAgICAgICAgICAgICBwYXJhbXMucG9zaXRpb24ubGF0LFxyXG4gICAgICAgICAgICAgICAgcGFyYW1zLnBvc2l0aW9uLmFsdFxyXG4gICAgICAgICAgICAgIF1cclxuICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMubGFiZWwucG9zaXRpb24gPSB7XHJcbiAgICAgICAgICAgICAgICBsbmc6IHBhcmFtcy5wb3NpdGlvbi5sbmcsXHJcbiAgICAgICAgICAgICAgICBsYXQ6IHBhcmFtcy5wb3NpdGlvbi5sYXQsXHJcbiAgICAgICAgICAgICAgICBhbHQ6IHBhcmFtcy5wb3NpdGlvbi5hbHRcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tzZWxlY3RQb2ludC5pbmRleF0gPSBwYXJhbXMucG9zaXRpb25cclxuICAgICAgICAgICAgdGhpcy5fZWxtcy5sbmcgJiYgKHRoaXMuX2VsbXMubG5nW3NlbGVjdFBvaW50LmluZGV4XS5pbm5lckhUTUwgPSBwYXJhbXMucG9zaXRpb24ubG5nLnRvRml4ZWQoOCkpXHJcbiAgICAgICAgICAgIHRoaXMuX2VsbXMubG5nSW5wdXQgJiYgKHRoaXMuX2VsbXMubG5nSW5wdXRbc2VsZWN0UG9pbnQuaW5kZXhdLnZhbHVlID0gcGFyYW1zLnBvc2l0aW9uLmxuZy50b0ZpeGVkKDgpKVxyXG4gICAgICAgICAgICB0aGlzLl9lbG1zLmxhdCAmJiAodGhpcy5fZWxtcy5sYXRbc2VsZWN0UG9pbnQuaW5kZXhdLmlubmVySFRNTCA9IHBhcmFtcy5wb3NpdGlvbi5sYXQudG9GaXhlZCg4KSlcclxuICAgICAgICAgICAgdGhpcy5fZWxtcy5sYXRJbnB1dCAmJiAodGhpcy5fZWxtcy5sYXRJbnB1dFtzZWxlY3RQb2ludC5pbmRleF0udmFsdWUgPSBwYXJhbXMucG9zaXRpb24ubGF0LnRvRml4ZWQoOCkpXHJcbiAgICAgICAgICAgIHRoaXMuX2VsbXMuYWx0ICYmICh0aGlzLl9lbG1zLmFsdFtzZWxlY3RQb2ludC5pbmRleF0uaW5uZXJIVE1MID0gcGFyYW1zLnBvc2l0aW9uLmFsdC50b0ZpeGVkKDIpKVxyXG4gICAgICAgICAgICB0aGlzLl9lbG1zLmFsdElucHV0ICYmICh0aGlzLl9lbG1zLmFsdElucHV0W3NlbGVjdFBvaW50LmluZGV4XS52YWx1ZSA9IHBhcmFtcy5wb3NpdGlvbi5hbHQudG9GaXhlZCgyKSlcclxuICAgICAgICAgICAgc2VsZWN0UG9pbnQucG9zaXRpb24gPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlcyhcclxuICAgICAgICAgICAgICBwYXJhbXMucG9zaXRpb24ubG5nLFxyXG4gICAgICAgICAgICAgIHBhcmFtcy5wb3NpdGlvbi5sYXQsXHJcbiAgICAgICAgICAgICAgcGFyYW1zLnBvc2l0aW9uLmFsdFxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG5cclxuICAgICAgdGhpcy5ldmVudC5tb3VzZV9yaWdodCgobW92ZW1lbnQsIGNhcnRlc2lhbikgPT4ge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5ub2RlUG9pbnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICB0aGlzLnNkay52aWV3ZXIuZW50aXRpZXMucmVtb3ZlKHRoaXMubm9kZVBvaW50c1tpXSlcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5ub2RlUG9pbnRzID0gW11cclxuICAgICAgICB0aGlzLmV2ZW50LmRlc3Ryb3koKVxyXG4gICAgICAgIHRoaXMudGlwICYmIHRoaXMudGlwLmRlc3Ryb3koKVxyXG4gICAgICAgIHRoaXMudGlwID0gbnVsbFxyXG4gICAgICAgIHRoaXMuQ29udHJvbGxlck9iamVjdC5kZXN0cm95KClcclxuXHJcbiAgICAgICAgbGV0IGZyb21EZWdyZWVzQXJyYXkgPSB0aGlzLnJlbmV3UG9zaXRpb25zKHRoaXMub3B0aW9ucy5wb3NpdGlvbnMpXHJcbiAgICAgICAgdGhpcy5lbnRpdHkucG9seWxpbmUucG9zaXRpb25zID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXNBcnJheUhlaWdodHMoZnJvbURlZ3JlZXNBcnJheSlcclxuICAgICAgICBZSi5NZWFzdXJlLlNldE1lYXN1cmVTdGF0dXMoZmFsc2UpXHJcbiAgICAgICAgdGhpcy5fbm9kZUVkaXRDYWxsYmFjayA9IG51bGxcclxuICAgICAgfSlcclxuXHJcbiAgICAgIHRoaXMuZXZlbnQubW91c2VfbW92ZSgobW92ZW1lbnQsIGNhcnRlc2lhbikgPT4ge1xyXG4gICAgICAgIHRoaXMudGlwLnNldFBvc2l0aW9uKFxyXG4gICAgICAgICAgY2FydGVzaWFuLFxyXG4gICAgICAgICAgbW92ZW1lbnQuZW5kUG9zaXRpb24ueCxcclxuICAgICAgICAgIG1vdmVtZW50LmVuZFBvc2l0aW9uLnlcclxuICAgICAgICApXHJcbiAgICAgIH0pXHJcblxyXG4gICAgICB0aGlzLmVudGl0eS5wb2x5bGluZS5wb3NpdGlvbnMgPSBuZXcgQ2VzaXVtLkNhbGxiYWNrUHJvcGVydHkoKCkgPT4ge1xyXG4gICAgICAgIGxldCBmcm9tRGVncmVlc0FycmF5ID0gdGhpcy5yZW5ld1Bvc2l0aW9ucyh0aGlzLm9wdGlvbnMucG9zaXRpb25zKVxyXG4gICAgICAgIHRoaXMuX25vZGVFZGl0Q2FsbGJhY2sodGhpcy5vcHRpb25zLnBvc2l0aW9ucywgdGhpcy5sZW5ndGhCeU1ldGVyKVxyXG4gICAgICAgIHJldHVybiBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlc0FycmF5SGVpZ2h0cyhmcm9tRGVncmVlc0FycmF5KVxyXG4gICAgICB9LCBmYWxzZSlcclxuXHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5vcHRpb25zLnBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGxldCBlbnRpdHkgPSB0aGlzLnNkay52aWV3ZXIuZW50aXRpZXMuYWRkKHtcclxuICAgICAgICAgIG5hbWU6ICdub2RlLXNlY29uZGFyeS1lZGl0LXBvaW50JyxcclxuICAgICAgICAgIGluZGV4OiBpLFxyXG4gICAgICAgICAgcG9zaXRpb246IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzKFxyXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxuZyxcclxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sYXQsXHJcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0uYWx0XHJcbiAgICAgICAgICApLFxyXG4gICAgICAgICAgYmlsbGJvYXJkOiB7XHJcbiAgICAgICAgICAgIGltYWdlOiB0aGlzLmdldFNvdXJjZVJvb3RQYXRoKCkgKyAnL2ltZy9wb2ludC5wbmcnLFxyXG4gICAgICAgICAgICB3aWR0aDogMTUsXHJcbiAgICAgICAgICAgIGhlaWdodDogMTUsXHJcbiAgICAgICAgICAgIGRpc2FibGVEZXB0aFRlc3REaXN0YW5jZTogTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLFxyXG4gICAgICAgICAgICBjb2xvcjogQ2VzaXVtLkNvbG9yLldISVRFLndpdGhBbHBoYSgwLjk5KVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgdGhpcy5ub2RlUG9pbnRzLnB1c2goZW50aXR5KVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjbG9zZU5vZGVFZGl0KCkge1xyXG4gICAgWUouTWVhc3VyZS5TZXRNZWFzdXJlU3RhdHVzKGZhbHNlKVxyXG4gICAgdGhpcy5Db250cm9sbGVyT2JqZWN0ICYmIHRoaXMuQ29udHJvbGxlck9iamVjdC5kZXN0cm95KClcclxuICAgIHRoaXMuZXZlbnQgJiYgdGhpcy5ldmVudC5kZXN0cm95KClcclxuICAgIHRoaXMudGlwICYmIHRoaXMudGlwLmRlc3Ryb3koKVxyXG4gICAgdGhpcy50aXAgPSBudWxsXHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm5vZGVQb2ludHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgdGhpcy5zZGsudmlld2VyLmVudGl0aWVzLnJlbW92ZSh0aGlzLm5vZGVQb2ludHNbaV0pXHJcbiAgICB9XHJcbiAgICB0aGlzLm5vZGVQb2ludHMgPSBbXVxyXG4gICAgdGhpcy5fbm9kZUVkaXRDYWxsYmFjayA9IG51bGxcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIOWIoOmZpFxyXG4gICAqL1xyXG4gIGFzeW5jIHJlbW92ZSgpIHtcclxuICAgIHRoaXMuZXZlbnQgJiYgdGhpcy5ldmVudC5kZXN0cm95KClcclxuICAgIHRoaXMudGlwICYmIHRoaXMudGlwLmRlc3Ryb3koKVxyXG4gICAgdGhpcy5sYWJlbCAmJiB0aGlzLmxhYmVsLnJlbW92ZSgpXHJcbiAgICB0aGlzLnNkay52aWV3ZXIuZW50aXRpZXMucmVtb3ZlKHRoaXMuZW50aXR5KVxyXG4gICAgdGhpcy5lbnRpdHkgPSBudWxsXHJcbiAgICBpZiAodGhpcy5fRGlhbG9nT2JqZWN0ICYmICF0aGlzLl9EaWFsb2dPYmplY3QuaXNEZXN0cm95KSB7XHJcbiAgICAgIHRoaXMuX0RpYWxvZ09iamVjdC5jbG9zZSgpXHJcbiAgICAgIHRoaXMuX0RpYWxvZ09iamVjdCA9IG51bGxcclxuICAgIH1cclxuICAgIGF3YWl0IHRoaXMuc2RrLnJlbW92ZUluY2V0YW5jZSh0aGlzLm9wdGlvbnMuaWQpXHJcbiAgICBhd2FpdCBzeW5jRGF0YSh0aGlzLnNkaywgdGhpcy5vcHRpb25zLmlkKVxyXG4gIH1cclxuXHJcbiAgLyoqQGRlc2Mg5omT5byA5bmz56e75Yqf6IO9XHJcbiAgICpcclxuICAgKiBAbWVtYmVyT2YgU291cmNlXHJcbiAgICogQHBhcmFtIHN0YXR1cyB7Ym9vbGVhbn1cclxuICAgKlxyXG4gICAqICovXHJcbiAgc2V0IHBvc2l0aW9uRWRpdGluZyhzdGF0dXMpIHtcclxuICAgIGlmIChZSi5NZWFzdXJlLkdldE1lYXN1cmVTdGF0dXMoKSB8fCAhdGhpcy5zZGsgfHwgIXRoaXMuc2RrLnZpZXdlciB8fCAhdGhpcy5lbnRpdHkpIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcbiAgICB0aGlzLm9wZXJhdGUucG9zaXRpb25FZGl0aW5nID0gc3RhdHVzXHJcbiAgICBpZiAoc3RhdHVzID09PSB0cnVlKSB7XHJcbiAgICAgIHRoaXMuY2xvc2VOb2RlRWRpdCgpXHJcbiAgICAgIHRoaXMuZXZlbnQgJiYgdGhpcy5ldmVudC5kZXN0cm95KClcclxuICAgICAgdGhpcy5ldmVudCA9IG5ldyBNb3VzZUV2ZW50KHRoaXMuc2RrKVxyXG4gICAgICB0aGlzLnRpcCAmJiB0aGlzLnRpcC5kZXN0cm95KClcclxuICAgICAgdGhpcy50aXAgPSBuZXcgTW91c2VUaXAoJ+eCueWHu+m8oOagh+W3pumUruehruiupO+8jOWPs+mUruWPlua2iCcsIHRoaXMuc2RrKVxyXG4gICAgICB0aGlzLmxhYmVsICYmXHJcbiAgICAgICAgKHRoaXMubGFiZWwuZW50aXR5LmJpbGxib2FyZC5jb2xvciA9IENlc2l1bS5Db2xvci5mcm9tQ3NzQ29sb3JTdHJpbmcoXHJcbiAgICAgICAgICBgcmdiYSgyNTUsMjU1LDI1NSwwLjkpYFxyXG4gICAgICAgICkpXHJcbiAgICAgIHRoaXMucGlja2luZyA9IGZhbHNlXHJcbiAgICAgIGxldCBwb3NpdGlvbnMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMub3B0aW9ucy5wb3NpdGlvbnMpKVxyXG4gICAgICAvLyBsZXQgcG9zaXRpb25zMiA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkocG9zaXRpb25zKSlcclxuICAgICAgLy8gZm9yIChsZXQgaSA9IDA7IGkgPCBwb3NpdGlvbnMyLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIC8vICAgbGV0IGhlaWdodCA9IHRoaXMuc2RrLnZpZXdlci5zY2VuZS5nbG9iZS5nZXRIZWlnaHQoQ2VzaXVtLkNhcnRvZ3JhcGhpYy5mcm9tRGVncmVlcyhwb3NpdGlvbnMyW2ldLmxuZywgcG9zaXRpb25zMltpXS5sYXQpKVxyXG4gICAgICAvLyAgIHBvc2l0aW9uczJbaV0gPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlcyhcclxuICAgICAgLy8gICAgIHBvc2l0aW9uczJbaV0ubG5nLFxyXG4gICAgICAvLyAgICAgcG9zaXRpb25zMltpXS5sYXQsXHJcbiAgICAgIC8vICAgICBOdW1iZXIoKHBvc2l0aW9uczJbaV0uYWx0ICsgTnVtYmVyKGhlaWdodCkpLnRvRml4ZWQoMikpXHJcbiAgICAgIC8vICAgKVxyXG4gICAgICAvLyB9XHJcbiAgICAgIHRoaXMucHJldmlvdXMgPSB7XHJcbiAgICAgICAgcG9zaXRpb25zOiBbLi4udGhpcy5vcHRpb25zLnBvc2l0aW9uc11cclxuICAgICAgfVxyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIHBvc2l0aW9uc1tpXSA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzKFxyXG4gICAgICAgICAgcG9zaXRpb25zW2ldLmxuZyxcclxuICAgICAgICAgIHBvc2l0aW9uc1tpXS5sYXQsXHJcbiAgICAgICAgICBwb3NpdGlvbnNbaV0uYWx0XHJcbiAgICAgICAgKVxyXG4gICAgICB9XHJcbiAgICAgIGxldCBjZW50ZXIgPSBwb3NpdGlvbnNbTWF0aC5mbG9vcihwb3NpdGlvbnMubGVuZ3RoIC8gMildXHJcbiAgICAgIGxldCBkaXNwYXJpdHkgPSBbXVxyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGNlbnRlci54IC0gcG9zaXRpb25zW2ldLnhcclxuICAgICAgICBkaXNwYXJpdHkucHVzaCh7XHJcbiAgICAgICAgICB4OiBjZW50ZXIueCAtIHBvc2l0aW9uc1tpXS54LFxyXG4gICAgICAgICAgeTogY2VudGVyLnkgLSBwb3NpdGlvbnNbaV0ueSxcclxuICAgICAgICAgIHo6IGNlbnRlci56IC0gcG9zaXRpb25zW2ldLnpcclxuICAgICAgICB9KVxyXG4gICAgICB9XHJcbiAgICAgIGxldCBuZXdwb3NpdGlvbnMgPSBbXVxyXG4gICAgICB0aGlzLmV2ZW50Lm1vdXNlX21vdmUoKG1vdmVtZW50LCBjYXJ0ZXNpYW4pID0+IHtcclxuICAgICAgICBuZXdwb3NpdGlvbnMgPSBbXVxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGlzcGFyaXR5Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBsZXQgbmV3UCA9IHtcclxuICAgICAgICAgICAgeDogY2FydGVzaWFuLnggLSBkaXNwYXJpdHlbaV0ueCxcclxuICAgICAgICAgICAgeTogY2FydGVzaWFuLnkgLSBkaXNwYXJpdHlbaV0ueSxcclxuICAgICAgICAgICAgejogY2FydGVzaWFuLnogLSBkaXNwYXJpdHlbaV0uelxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgLy8gbGV0IHBvczg0ID0gdGhpcy5jYXJ0ZXNpYW4zVG93Z3M4NChcclxuICAgICAgICAgIC8vICAgbmV3UCxcclxuICAgICAgICAgIC8vICAgdGhpcy5zZGsudmlld2VyXHJcbiAgICAgICAgICAvLyApXHJcbiAgICAgICAgICAvLyBsZXQgaGVpZ2h0ID0gdGhpcy5zZGsudmlld2VyLnNjZW5lLmdsb2JlLmdldEhlaWdodChDZXNpdW0uQ2FydG9ncmFwaGljLmZyb21EZWdyZWVzKHBvczg0LmxuZywgcG9zODQubGF0KSlcclxuICAgICAgICAgIC8vIHBvczg0LmFsdCA9IE51bWJlcigocG9zODQuYWx0ICsgTnVtYmVyKGhlaWdodCkpLnRvRml4ZWQoMikpXHJcbiAgICAgICAgICAvLyBuZXdQID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXMoXHJcbiAgICAgICAgICAvLyAgIHBvczg0LmxuZyxcclxuICAgICAgICAgIC8vICAgcG9zODQubGF0LFxyXG4gICAgICAgICAgLy8gICBwb3M4NC5hbHRcclxuICAgICAgICAgIC8vIClcclxuICAgICAgICAgIG5ld3Bvc2l0aW9ucy5wdXNoKG5ld1ApXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBwb3NpdGlvbjg0ID0gdGhpcy5jYXJ0ZXNpYW4zVG93Z3M4NChcclxuICAgICAgICAgIG5ld3Bvc2l0aW9uc1swXSxcclxuICAgICAgICAgIHRoaXMuc2RrLnZpZXdlclxyXG4gICAgICAgIClcclxuICAgICAgICB0aGlzLmxhYmVsLnBvc2l0aW9uID0gW3Bvc2l0aW9uODQubG5nLCBwb3NpdGlvbjg0LmxhdCwgcG9zaXRpb244NC5hbHRdXHJcbiAgICAgICAgdGhpcy5vcHRpb25zLmxhYmVsLnBvc2l0aW9uID0ge1xyXG4gICAgICAgICAgbG5nOiBwb3NpdGlvbjg0LmxuZyxcclxuICAgICAgICAgIGxhdDogcG9zaXRpb244NC5sYXQsXHJcbiAgICAgICAgICBhbHQ6IHBvc2l0aW9uODQuYWx0XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMudGlwLnNldFBvc2l0aW9uKFxyXG4gICAgICAgICAgY2FydGVzaWFuLFxyXG4gICAgICAgICAgbW92ZW1lbnQuZW5kUG9zaXRpb24ueCxcclxuICAgICAgICAgIG1vdmVtZW50LmVuZFBvc2l0aW9uLnlcclxuICAgICAgICApXHJcbiAgICAgIH0pXHJcbiAgICAgIHRoaXMuZXZlbnQubW91c2VfbGVmdCgobW92ZW1lbnQsIGNhcnRlc2lhbikgPT4ge1xyXG4gICAgICAgIHRoaXMuZXZlbnQubW91c2VfbW92ZSgoKSA9PiB7IH0pXHJcbiAgICAgICAgdGhpcy5ldmVudC5tb3VzZV9sZWZ0KCgpID0+IHsgfSlcclxuICAgICAgICB0aGlzLmV2ZW50Lm1vdXNlX3JpZ2h0KCgpID0+IHsgfSlcclxuICAgICAgICBuZXdwb3NpdGlvbnMgPSBbXVxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGlzcGFyaXR5Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBuZXdwb3NpdGlvbnMucHVzaCh7XHJcbiAgICAgICAgICAgIHg6IGNhcnRlc2lhbi54IC0gZGlzcGFyaXR5W2ldLngsXHJcbiAgICAgICAgICAgIHk6IGNhcnRlc2lhbi55IC0gZGlzcGFyaXR5W2ldLnksXHJcbiAgICAgICAgICAgIHo6IGNhcnRlc2lhbi56IC0gZGlzcGFyaXR5W2ldLnpcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBwb3NpdGlvbnNMbmdMYXQgPSBbXVxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmV3cG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBsZXQgcG9zaXRpb24gPSB0aGlzLmNhcnRlc2lhbjNUb3dnczg0KG5ld3Bvc2l0aW9uc1tpXSwgdGhpcy5zZGsudmlld2VyKVxyXG4gICAgICAgICAgcG9zaXRpb24uYWx0ID0gdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5hbHRcclxuICAgICAgICAgIHBvc2l0aW9uc0xuZ0xhdC5wdXNoKHBvc2l0aW9uKVxyXG5cclxuICAgICAgICAgIHRoaXMuX2VsbXMubG5nICYmICh0aGlzLl9lbG1zLmxuZ1tpXS5pbm5lckhUTUwgPSBwb3NpdGlvbi5sbmcudG9GaXhlZCg4KSlcclxuICAgICAgICAgIHRoaXMuX2VsbXMubG5nSW5wdXQgJiYgKHRoaXMuX2VsbXMubG5nSW5wdXRbaV0udmFsdWUgPSBwb3NpdGlvbi5sbmcudG9GaXhlZCg4KSlcclxuICAgICAgICAgIHRoaXMuX2VsbXMubGF0ICYmICh0aGlzLl9lbG1zLmxhdFtpXS5pbm5lckhUTUwgPSBwb3NpdGlvbi5sYXQudG9GaXhlZCg4KSlcclxuICAgICAgICAgIHRoaXMuX2VsbXMubGF0SW5wdXQgJiYgKHRoaXMuX2VsbXMubGF0SW5wdXRbaV0udmFsdWUgPSBwb3NpdGlvbi5sYXQudG9GaXhlZCg4KSlcclxuICAgICAgICAgIHRoaXMuX2VsbXMuYWx0ICYmICh0aGlzLl9lbG1zLmFsdFtpXS5pbm5lckhUTUwgPSBwb3NpdGlvbi5hbHQudG9GaXhlZCgyKSlcclxuICAgICAgICAgIHRoaXMuX2VsbXMuYWx0SW5wdXQgJiYgKHRoaXMuX2VsbXMuYWx0SW5wdXRbaV0udmFsdWUgPSBwb3NpdGlvbi5hbHQudG9GaXhlZCgyKSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnMgPSBwb3NpdGlvbnNMbmdMYXRcclxuICAgICAgICB0aGlzLnByZXZpb3VzLnBvc2l0aW9ucyA9IHBvc2l0aW9uc0xuZ0xhdFxyXG5cclxuICAgICAgICAvLyB0aGlzLmVudGl0eS5wb2x5bGluZS5wb3NpdGlvbnNMbmdMYXQgPSBwb3NpdGlvbnNMbmdMYXRcclxuICAgICAgICBsZXQgZnJvbURlZ3JlZXNBcnJheSA9IHRoaXMucmVuZXdQb3NpdGlvbnModGhpcy5vcHRpb25zLnBvc2l0aW9ucywgKCk9PntcclxuICAgICAgICAgIGlmKHRoaXMuX3Bvc2l0aW9uRWRpdGluZ0NhbGxiYWNrKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3Bvc2l0aW9uRWRpdGluZ0NhbGxiYWNrKClcclxuICAgICAgICAgICAgdGhpcy5fcG9zaXRpb25FZGl0aW5nQ2FsbGJhY2sgPSBudWxsXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgICB0aGlzLmVudGl0eS5wb2x5bGluZS5wb3NpdGlvbnMgPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlc0FycmF5SGVpZ2h0cyhcclxuICAgICAgICAgIGZyb21EZWdyZWVzQXJyYXlcclxuICAgICAgICApXHJcbiAgICAgICAgdGhpcy5yZW5ld1BvbHlnb24oZnJvbURlZ3JlZXNBcnJheSlcclxuICAgICAgICB0aGlzLnBvc2l0aW9uRWRpdGluZyA9IGZhbHNlXHJcbiAgICAgIH0pXHJcblxyXG4gICAgICB0aGlzLmV2ZW50Lm1vdXNlX3JpZ2h0KChtb3ZlbWVudCwgY2FydGVzaWFuKSA9PiB7XHJcbiAgICAgICAgdGhpcy5ldmVudC5tb3VzZV9tb3ZlKCgpID0+IHsgfSlcclxuICAgICAgICB0aGlzLmV2ZW50Lm1vdXNlX2xlZnQoKCkgPT4geyB9KVxyXG4gICAgICAgIHRoaXMuZXZlbnQubW91c2VfcmlnaHQoKCkgPT4geyB9KVxyXG4gICAgICAgIHRoaXMucG9zaXRpb25FZGl0aW5nID0gZmFsc2VcclxuICAgICAgfSlcclxuICAgICAgdGhpcy5ldmVudC5nZXN0dXJlX3BpbmNrX3N0YXJ0KChtb3ZlbWVudCwgY2FydGVzaWFuKSA9PiB7XHJcbiAgICAgICAgbGV0IHN0YXJ0VGltZSA9IG5ldyBEYXRlKClcclxuICAgICAgICB0aGlzLmV2ZW50Lmdlc3R1cmVfcGluY2tfZW5kKCgpID0+IHtcclxuICAgICAgICAgIGxldCBlbmRUaW1lID0gbmV3IERhdGUoKVxyXG4gICAgICAgICAgbGV0IHBvcyA9IHtcclxuICAgICAgICAgICAgcG9zaXRpb246IHtcclxuICAgICAgICAgICAgICB4OiAobW92ZW1lbnQucG9zaXRpb24xLnggKyBtb3ZlbWVudC5wb3NpdGlvbjIueCkgLyAyLFxyXG4gICAgICAgICAgICAgIHk6IChtb3ZlbWVudC5wb3NpdGlvbjEueSArIG1vdmVtZW50LnBvc2l0aW9uMi55KSAvIDJcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKGVuZFRpbWUgLSBzdGFydFRpbWUgPj0gNTAwKSB7XHJcbiAgICAgICAgICAgIC8vIOmVv+aMieWPlua2iFxyXG4gICAgICAgICAgICB0aGlzLmV2ZW50Lm1vdXNlX21vdmUoKCkgPT4geyB9KVxyXG4gICAgICAgICAgICB0aGlzLmV2ZW50Lm1vdXNlX2xlZnQoKCkgPT4geyB9KVxyXG4gICAgICAgICAgICB0aGlzLmV2ZW50Lm1vdXNlX3JpZ2h0KCgpID0+IHsgfSlcclxuICAgICAgICAgICAgdGhpcy5wb3NpdGlvbkVkaXRpbmcgPSBmYWxzZVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbGVmdEV2ZW50KHBvcywgY2FydGVzaWFuKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgIH0pXHJcbiAgICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLnBvc2l0aW9ucyA9IG5ldyBDZXNpdW0uQ2FsbGJhY2tQcm9wZXJ0eShmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgaWYgKG5ld3Bvc2l0aW9ucy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICByZXR1cm4gbmV3cG9zaXRpb25zXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJldHVybiBwb3NpdGlvbnNcclxuICAgICAgICB9XHJcbiAgICAgIH0sIGZhbHNlKVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKCF0aGlzLnNkayB8fCAhdGhpcy5zZGsudmlld2VyIHx8ICF0aGlzLmxhYmVsIHx8ICF0aGlzLmxhYmVsLmVudGl0eSkge1xyXG4gICAgICAgIHRoaXMubGFiZWwuZW50aXR5LmJpbGxib2FyZC5jb2xvciA9IENlc2l1bS5Db2xvci5mcm9tQ3NzQ29sb3JTdHJpbmcoXHJcbiAgICAgICAgICBgcmdiYSgyNTUsMjU1LDI1NSwxKWBcclxuICAgICAgICApXHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5waWNraW5nID0gdHJ1ZVxyXG4gICAgICBpZiAodGhpcy5ldmVudCkge1xyXG4gICAgICAgIHRoaXMuZXZlbnQubW91c2VfbW92ZSgoKSA9PiB7IH0pXHJcbiAgICAgICAgdGhpcy5ldmVudC5tb3VzZV9sZWZ0KCgpID0+IHsgfSlcclxuICAgICAgICB0aGlzLmV2ZW50Lm1vdXNlX3JpZ2h0KCgpID0+IHsgfSlcclxuICAgICAgICB0aGlzLmV2ZW50LmRlc3Ryb3koKVxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMudGlwICYmIHRoaXMudGlwLmRlc3Ryb3koKVxyXG4gICAgICBsZXQgZnJvbURlZ3JlZXNBcnJheSA9IHRoaXMucmVuZXdQb3NpdGlvbnModGhpcy5vcHRpb25zLnBvc2l0aW9ucylcclxuICAgICAgdGhpcy5lbnRpdHkucG9seWxpbmUucG9zaXRpb25zID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXNBcnJheUhlaWdodHMoXHJcbiAgICAgICAgZnJvbURlZ3JlZXNBcnJheVxyXG4gICAgICApXHJcbiAgICAgIHRoaXMucmVuZXdQb2x5Z29uKGZyb21EZWdyZWVzQXJyYXkpXHJcblxyXG4gICAgICBzd2l0Y2ggKHRoaXMuaGVpZ2h0TW9kZSkge1xyXG4gICAgICAgIGNhc2UgMDpcclxuICAgICAgICBjYXNlICcwJzpcclxuICAgICAgICBjYXNlIDE6XHJcbiAgICAgICAgY2FzZSAnMSc6XHJcbiAgICAgICAgICB0aGlzLmxhYmVsLnBvc2l0aW9uID0gW1xyXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zWzBdLmxuZyxcclxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXS5sYXQsXHJcbiAgICAgICAgICAgIGZyb21EZWdyZWVzQXJyYXlbMl1cclxuICAgICAgICAgIF1cclxuICAgICAgICAgIHRoaXMub3B0aW9ucy5sYWJlbC5wb3NpdGlvbiA9IHtcclxuICAgICAgICAgICAgbG5nOiB0aGlzLm9wdGlvbnMucG9zaXRpb25zWzBdLmxuZyxcclxuICAgICAgICAgICAgbGF0OiB0aGlzLm9wdGlvbnMucG9zaXRpb25zWzBdLmxhdCxcclxuICAgICAgICAgICAgYWx0OiBmcm9tRGVncmVlc0FycmF5WzJdXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIDI6XHJcbiAgICAgICAgY2FzZSAnMic6XHJcbiAgICAgICAgICB0aGlzLmxhYmVsLnBvc2l0aW9uID0gW1xyXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zWzBdLmxuZyxcclxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXS5sYXRcclxuICAgICAgICAgIF1cclxuICAgICAgICAgIHRoaXMub3B0aW9ucy5sYWJlbC5wb3NpdGlvbiA9IHtcclxuICAgICAgICAgICAgbG5nOiB0aGlzLm9wdGlvbnMucG9zaXRpb25zWzBdLmxuZyxcclxuICAgICAgICAgICAgbGF0OiB0aGlzLm9wdGlvbnMucG9zaXRpb25zWzBdLmxhdCxcclxuICAgICAgICAgICAgYWx0OiBmcm9tRGVncmVlc0FycmF5WzJdXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IHBvc2l0aW9uRWRpdGluZygpIHtcclxuICAgIHJldHVybiB0aGlzLm9wZXJhdGUucG9zaXRpb25FZGl0aW5nXHJcbiAgfVxyXG5cclxuICBvcGVuUG9zaXRpb25FZGl0aW5nKGNkKSB7XHJcbiAgICB0aGlzLnBvc2l0aW9uRWRpdGluZyA9IHRydWVcclxuICAgIHRoaXMuX3Bvc2l0aW9uRWRpdGluZ0NhbGxiYWNrID0gY2RcclxuICB9XHJcblxyXG4gIGdldCBsZW5ndGhDaGFuZ2VDYWxsQmFjaygpIHtcclxuICAgIHJldHVybiB0aGlzLl9sZW5ndGhDaGFuZ2VDYWxsQmFja1xyXG4gIH1cclxuXHJcbiAgc2V0IGxlbmd0aENoYW5nZUNhbGxCYWNrIChjZCkge1xyXG4gICAgdGhpcy5fbGVuZ3RoQ2hhbmdlQ2FsbEJhY2sgPSBjZFxyXG4gIH1cclxuXHJcbiAgc2V0RElWKG9wdGlvbnMgPSB7IGRvbWlkOiAnJywgeDogMTAsIHk6IDEwIH0pIHtcclxuICAgIG9wdGlvbnMueCA9IG9wdGlvbnMueCB8fCBvcHRpb25zLnggPT09IDAgPyBvcHRpb25zLnggOiAxMFxyXG4gICAgb3B0aW9ucy55ID0gb3B0aW9ucy55IHx8IG9wdGlvbnMueSA9PT0gMCA/IG9wdGlvbnMueSA6IDEwXHJcblxyXG4gICAgbGV0IHBvaW50cyA9IFtdXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMub3B0aW9ucy5wb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgcG9pbnRzLnB1c2goW1xyXG4gICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubG5nLFxyXG4gICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubGF0XHJcbiAgICAgIF0pXHJcbiAgICB9XHJcbiAgICBsZXQgbGluZSA9IHR1cmYubGluZVN0cmluZyhwb2ludHMpXHJcbiAgICBsZXQgbGVuZ3RoID0gdHVyZi5sZW5ndGgobGluZSwgeyB1bml0czogJ2tpbG9tZXRlcnMnIH0pXHJcbiAgICBsZXQgc2xpY2VkID0gdHVyZi5saW5lU2xpY2VBbG9uZyhsaW5lLCAwLCBsZW5ndGggLyAyLCB7XHJcbiAgICAgIHVuaXRzOiAna2lsb21ldGVycydcclxuICAgIH0pXHJcblxyXG4gICAgbGV0IHNpdGVJbmZvRG9tID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQob3B0aW9ucy5kb21pZClcclxuICAgIGxldCBzaXRlSW5mb1Bvc2l0aW9uID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXMoXHJcbiAgICAgIC4uLnNsaWNlZC5nZW9tZXRyeS5jb29yZGluYXRlc1tzbGljZWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXMubGVuZ3RoIC0gMV1cclxuICAgIClcclxuICAgIHRoaXMuc2RrLnZpZXdlci5zY2VuZS5wb3N0UmVuZGVyLmFkZEV2ZW50TGlzdGVuZXIocGVyY2VudGFnZSA9PiB7XHJcbiAgICAgIC8v6L2s5o2i5Yiw5bGP5bmV5Z2Q5qCHXHJcbiAgICAgIGlmIChcclxuICAgICAgICBzaXRlSW5mb0RvbS5zdHlsZS5kaXNwbGF5ID09PSAnYmxvY2snIHx8XHJcbiAgICAgICAgc2l0ZUluZm9Eb20uc3R5bGUuZGlzcGxheSA9PT0gJydcclxuICAgICAgKSB7XHJcbiAgICAgICAgbGV0IHdpbnBvcyA9IHRoaXMuc2RrLnZpZXdlci5zY2VuZS5jYXJ0ZXNpYW5Ub0NhbnZhc0Nvb3JkaW5hdGVzKFxyXG4gICAgICAgICAgc2l0ZUluZm9Qb3NpdGlvblxyXG4gICAgICAgIClcclxuICAgICAgICBpZiAod2lucG9zKSB7XHJcbiAgICAgICAgICBzaXRlSW5mb0RvbS5zdHlsZS5sZWZ0ID0gKHdpbnBvcy54ICsgb3B0aW9ucy54KS50b0ZpeGVkKDApICsgJ3B4J1xyXG4gICAgICAgICAgc2l0ZUluZm9Eb20uc3R5bGUudG9wID0gKHdpbnBvcy55ICsgb3B0aW9ucy55KS50b0ZpeGVkKDApICsgJ3B4J1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcbn1cclxuZXhwb3J0IGRlZmF1bHQgUG9seWxpbmVPYmplY3RcclxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBSUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQXBCQTtBQUFBO0FBa0JBO0FBR0E7QUFDQTtBQUNBO0FBUUE7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBRUE7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUtBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFRQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFjQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUdBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBV0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBR0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBakJBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUF6QkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQWtEQTtBQXpEQTtBQUFBO0FBQUE7QUFBQTtBQTBEQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBVkE7QUFBQTtBQVFBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFsQkE7QUFBQTtBQUFBO0FBbUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQTZIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUdBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUFBO0FBQUE7QUFBQTtBQUlBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBU0E7QUFzREE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFZQTtBQUNBO0FBTUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBR0E7QUFNQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBR0E7QUFPQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQU1BO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQU1BO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUF0SEE7QUFBQTtBQUFBO0FBeUhBO0FBQ0E7QUFNQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBbHVCQTtBQUFBO0FBQUE7QUFBQTtBQW91QkE7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFBQTtBQUdBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUF2REE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUEwREE7QUFJQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUFBO0FBRUE7QUF5QkE7QUFBQTtBQXRCQTtBQUNBO0FBS0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBSUE7QUFBQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFJQTtBQUFBO0FBQ0E7QUFDQTtBQUtBO0FBQ0E7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBMUdBO0FBQUE7QUFBQTtBQUFBO0FBNEdBO0FBQ0E7QUFDQTtBQUZBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBTUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFLQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFaQTtBQUFBO0FBQUE7QUFBQTtBQWNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUxBO0FBQUE7QUFBQTtBQUFBO0FBNE5BO0FBQ0E7QUFBQTtBQXZOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQU9BO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUlBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQWw5REE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBZUE7QUFBQTtBQVpBO0FBQ0E7QUFBQTtBQUFBO0FBSUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBSEE7QUFBQTtBQUFBO0FBT0E7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFIQTtBQUFBO0FBQUE7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQXREQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQTBEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQTIxREEiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/Obj/Base/PolylineObject/index.js\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/toConsumableArray */ \"./node_modules/@babel/runtime/helpers/toConsumableArray.js\");\n/* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ \"./node_modules/@babel/runtime/helpers/asyncToGenerator.js\");\n/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ \"./node_modules/@babel/runtime/helpers/defineProperty.js\");\n/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ \"./node_modules/@babel/runtime/helpers/classCallCheck.js\");\n/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ \"./node_modules/@babel/runtime/helpers/createClass.js\");\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ \"./node_modules/@babel/runtime/helpers/possibleConstructorReturn.js\");\n/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ \"./node_modules/@babel/runtime/helpers/getPrototypeOf.js\");\n/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ \"./node_modules/@babel/runtime/helpers/inherits.js\");\n/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @babel/runtime/regenerator */ \"./node_modules/@babel/runtime/regenerator/index.js\");\n/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8__);\n/* harmony import */ var _Element_Dialog__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../Element/Dialog */ \"./src/Obj/Element/Dialog/index.js\");\n/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./_element */ \"./src/Obj/Base/PolylineObject/_element.js\");\n/* harmony import */ var _index__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../index */ \"./src/Obj/Base/index.js\");\n/* harmony import */ var _Element_cy_html_tabs__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../../Element/cy_html_tabs */ \"./src/Obj/Element/cy_html_tabs.js\");\n/* harmony import */ var _Element_richText__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../../Element/richText */ \"./src/Obj/Element/richText.js\");\n/* harmony import */ var _eventBinding__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./eventBinding */ \"./src/Obj/Base/PolylineObject/eventBinding.js\");\n/* harmony import */ var _LabelObject__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../LabelObject */ \"./src/Obj/Base/LabelObject/index.js\");\n/* harmony import */ var _Event_index__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../../../Event/index */ \"./src/Event/index.js\");\n/* harmony import */ var _MouseTip__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../../../MouseTip */ \"./src/MouseTip/index.js\");\n/* harmony import */ var _Controller_index__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../../../Controller/index */ \"./src/Controller/index.js\");\n/* harmony import */ var _Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../../../Global/MultiViewportMode */ \"./src/Global/MultiViewportMode/index.js\");\n/* harmony import */ var _Element_datalist__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../../Element/datalist */ \"./src/Obj/Element/datalist.js\");\n/* harmony import */ var _Element_fontSelect__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../../Element/fontSelect */ \"./src/Obj/Element/fontSelect.js\");\n/* harmony import */ var _Global_SplitScreen__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ../../../Global/SplitScreen */ \"./src/Global/SplitScreen/index.js\");\n/* harmony import */ var _Global_global__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ../../../Global/global */ \"./src/Global/global.js\");\n\n\n\n\n\n\n\n\n\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default()(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nfunction _callSuper(t, o, e) { return o = _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6___default()(o), _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_5___default()(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6___default()(t).constructor) : o.apply(t, e)); }\nfunction _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }\n/**\r\n * @description 线\r\n */\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nvar PolylineObject = /*#__PURE__*/function (_Base) {\n /**\r\n * @constructor\r\n * @param sdk\r\n * @description 折线\r\n * @param options {object} 线属性\r\n * @param options.name{string} 名称\r\n * @param options.width=3{number} 线宽\r\n * @param options.color=#ff0000 {string} 颜色\r\n * @param options.type=0 {number} 材质类型 0-实线 1-虚线 2-泛光...\r\n * @param options.heightMode=2{number} 高度模式(0:海拔高度;1:相对高度;2:依附模式)\r\n * @param options.noseToTail=false {boolean} 首尾相连\r\n * @param options.smooth=false {boolean} 线段圆滑\r\n * @param options.extend=false {boolean} 线缓冲\r\n * @param options.extendWidth=10 {number} 线缓冲宽度\r\n * @param options.extendColor=rgba(255,255,80,0.3) {number} 线缓冲颜色\r\n * @param options.show=true {boolean} 显隐\r\n * @param {Array.} options.positions 必填,经纬度和高度的列表,值交替 [{lon,lat,alt},...]\r\n * @param options.positions[].lng {number} 经度\r\n * @param options.positions[].lat {number} 纬度\r\n * @param options.positions[].alt {number} 高度\r\n * \r\n * \r\n * @param options.noseToTail=false {boolean} 是否首尾相连\r\n * \r\n * \r\n * \r\n * @param options.label {object} 标签对象\r\n * @param options.label.text {string} 标签文本\r\n * @param options.label.show {string} 标签显隐\r\n * @param options.label.position {string} 标签位置\r\n * @param options.label.position {object} 标签位置\r\n * @param options.label.position.lng {number} 经度\r\n * @param options.label.position.lat {number} 纬度\r\n * @param options.label.position.alt {number} 高度\r\n * @param options.label.fontSize=20 {number} 字体大小\r\n * @param options.label.fontFamily=0 {number} 字体项 0:黑体;1:思源黑体;2:庞门正道标题体;3:数黑体\r\n * @param options.label.color=#ffffff {string} 字体颜色\r\n * @param options.label.lineWidth=4 {number} 引线宽\r\n * @param options.label.lineColor=#00ffff80 {string} 引线颜色\r\n * @param options.label.pixelOffset=20 {number} 字体偏移(引线长度)\r\n * @param options.label.backgroundColor=['#00ffff80', '#00ffff80'] {array} 背景颜色\r\n * @param options.label.scaleByDistance {boolean} 距离缩放\r\n * @param options.label.near=2000 {number} 视野缩放最近距离\r\n * @param options.label.far=100000 {number} 视野缩放最远距离\r\n * @param options.attribute {object} 属性内容\r\n * @param options.attribute.link={} {string} 链接\r\n * @param options.attribute.link.content=[]] {array} 链接内容\r\n * @param options.attribute.link.content[].name {string} 链接名称\r\n * @param options.attribute.link.content[].url {string} 链接地址\r\n * @param options.richTextContent {string} 富文本内容\r\n * \r\n * \r\n * @param _Dialog {object} 弹框事件\r\n * @param _Dialog.confirmCallBack {function} 弹框确认时的回调\r\n * */\n function PolylineObject(sdk) {\n var _this2;\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var _Dialog = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3___default()(this, PolylineObject);\n _this2 = _callSuper(this, PolylineObject, [sdk, options]);\n _this2.options.name = options.name || '未命名对象';\n _this2.options.width = options.width || options.width === 0 ? options.width : 3;\n _this2.options.color = options.color || '#ff0000';\n _this2.options.type = options.type ? Number(options.type) : 0;\n _this2.options.noseToTail = options.noseToTail || false;\n _this2.options.smooth = options.smooth || false;\n _this2.options.extend = options.extend || false;\n _this2.options.rotate = options.rotate || options.rotate === false ? options.rotate : true;\n _this2.options.space = options.space || 1;\n _this2.options.speed = options.speed || 10;\n // this.options.dashSize = options.dashSize || 0.03\n _this2.options.wordsName = options.wordsName || 0;\n _this2.options.extendWidth = options.extendWidth || options.extendWidth === 0 ? options.extendWidth : 10;\n _this2.options.extendColor = options.extendColor || 'rgba(255,255,80,0.3)';\n _this2.options.show = options.show || options.show === false ? options.show : true;\n _this2.options.heightMode = options.heightMode || options.heightMode == 0 ? options.heightMode : 2;\n _this2._elms = [];\n options.label = options.label || {};\n _this2.options.label = {\n text: _this2.options.name,\n show: options.label.show || false,\n position: options.label.position,\n fontSize: options.label.fontSize || options.label.fontSize === 0 ? options.label.fontSize : 20,\n fontFamily: options.label.fontFamily ? options.label.fontFamily : 0,\n color: options.label.color || '#ffffff',\n lineWidth: options.label.lineWidth || options.label.lineWidth === 0 ? options.label.lineWidth : 4,\n pixelOffset: options.label.pixelOffset || options.label.pixelOffset === 0 ? options.label.pixelOffset : 20,\n backgroundColor: options.label.backgroundColor || ['#00ffff80', '#00ffff80'],\n lineColor: options.label.lineColor || '#00ffff80',\n scaleByDistance: options.label.scaleByDistance || false,\n near: options.label.near || options.label.near === 0 ? options.label.near : 2000,\n far: options.label.far || options.label.far === 0 ? options.label.far : 100000\n };\n _this2.options.attribute = options.attribute || {};\n _this2.options.attribute.link = _this2.options.attribute.link || {};\n _this2.options.attribute.link.content = _this2.options.attribute.link.content || [];\n // this.options.attribute.camera = this.options.attribute.camera || {}\n // this.options.attribute.camera.content =\n // this.options.attribute.camera.content || []\n // this.options.attribute.vr = this.options.attribute.vr || {}\n // this.options.attribute.vr.content =\n // this.options.attribute.vr.content || []\n // this.options.attribute.goods = this.options.attribute.goods || {}\n // this.options.attribute.goods.content =\n // this.options.attribute.goods.content || []\n\n delete _this2.options.attribute.camera;\n delete _this2.options.attribute.vr;\n delete _this2.options.attribute.goods;\n _this2.operate = {};\n _this2.nodePoints = [];\n _this2.unitNum = 0;\n _this2.inputSpeed = options.speed && Math.pow(options.speed, -1) * 100 || 10;\n _this2.Dialog = _Dialog;\n if (!_this2.options.positions || _this2.options.positions.length < 2) {\n _this2._error = '线段最少需要两个坐标!';\n console.warn(_this2._error);\n window.ELEMENT && window.ELEMENT.Message({\n message: _this2._error,\n type: 'warning',\n duration: 1500\n });\n } else {\n for (var i = 0; i < _this2.options.positions.length; i++) {\n _this2.options.positions[i].lng = Number(Number(_this2.options.positions[i].lng).toFixed(8));\n _this2.options.positions[i].lat = Number(Number(_this2.options.positions[i].lat).toFixed(8));\n _this2.options.positions[i].alt = Number(Number(_this2.options.positions[i].alt).toFixed(2));\n }\n _this2.sdk.addIncetance(_this2.options.id, _this2);\n PolylineObject.create(_this2);\n }\n return _this2;\n }\n _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_7___default()(PolylineObject, _Base);\n return _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4___default()(PolylineObject, [{\n key: \"color\",\n get: function get() {\n return this.options.color;\n },\n set: function set(v) {\n var _this3 = this;\n this.options.color = v || '#ff0000';\n var params = _objectSpread({}, this.options);\n params.speed = this.inputSpeed;\n // this.entity.polyline.material = this.getMaterial(this.options.color, this.options.type, this.entity, this.options)\n this.entity.polyline.material = this.getMaterial(this.options.color, this.options.type, this.entity, params);\n if (this._elms.color) {\n this._elms.color.forEach(function (item, i) {\n var colorPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: _this3.options.color,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(c) {\n _this3.color = c;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this3.color = 'rgba(255,0,0,1)';\n } //点击清空按钮事件回调\n });\n _this3._elms.color[i] = colorPicker;\n });\n }\n }\n }, {\n key: \"speed\",\n get: function get() {\n return this.options.speed;\n },\n set: function set(v) {\n this.options.speed = v;\n this.inputSpeed = v !== 0 ? Math.pow(v, -1) * 100 : 0;\n var params = _objectSpread({}, this.options);\n params.speed = this.inputSpeed;\n // this.options.speed = v !== 0 ? Math.pow(v, -1) * 100 : 0\n // this.entity.polyline.material = this.getMaterial(this.options.color, this.options.type, this.entity, this.options)\n this.entity.polyline.material = this.getMaterial(this.options.color, this.options.type, this.entity, params);\n }\n // get dashSize() {\n // return this.options.dashSize\n // }\n\n // set dashSize(v) {\n // this.options.dashSize = v\n // let params = { ...this.options }\n // params.speed = this.inputSpeed\n // // this.entity.polyline.material = this.getMaterial(this.options.color, this.options.type, this.entity, this.options)\n // this.entity.polyline.material = this.getMaterial(this.options.color, this.options.type, this.entity, params)\n // }\n }, {\n key: \"rotate\",\n get: function get() {\n return this.options.rotate;\n },\n set: function set(v) {\n this.options.rotate = v;\n this.closeNodeEdit();\n this._elms.rotate && this._elms.rotate.forEach(function (item) {\n item.checked = v;\n });\n this.options.rotate = v;\n var params = _objectSpread({}, this.options);\n params.speed = this.inputSpeed;\n // this.entity.polyline.material = this.getMaterial(this.options.color, this.options.type, this.entity, this.options)\n this.entity.polyline.material = this.getMaterial(this.options.color, this.options.type, this.entity, params);\n }\n }, {\n key: \"space\",\n get: function get() {\n return this.options.space;\n },\n set: function set(v) {\n this.options.space = v;\n var params = _objectSpread({}, this.options);\n params.speed = this.inputSpeed;\n // this.entity.polyline.material = this.getMaterial(this.options.color, this.options.type, this.entity, this.options)\n this.entity.polyline.material = this.getMaterial(this.options.color, this.options.type, this.entity, params);\n }\n }, {\n key: \"wordsName\",\n get: function get() {\n return this.options.wordsName;\n },\n set: function set(v) {\n var _this4 = this;\n this.options.wordsName = v;\n var _this = this;\n if (!this.noseToTail) {\n this.computeDistance(this.options.positions, 2, v).then(function (res) {\n // _this.options.lengthByMeter = res\n // if (res > 1000 || res == 1000) {\n // _this.length = (res / 1000).toFixed(5)\n // _this.lengthUnit = '千米'\n // } else {\n // _this.length = res\n // _this.lengthUnit = '米'\n // }\n _this.lengthByMeter = res;\n _this4.lengthChangeCallBack && _this4.lengthChangeCallBack();\n });\n } else {\n var fromDegreesArray = this.renewPositions(this.options.positions);\n }\n }\n\n // get fitLengthUnit() {\n // return this.options.fitLengthUnit\n // }\n // set fitLengthUnit(v) {\n // this.options.fitLengthUnit = v\n // this._elms.fitLengthUnit &&\n // this._elms.fitLengthUnit.forEach(item => {\n // item.value = v\n // })\n // if (this.fitLengthByMeter) {\n // switch (v) {\n // case '米':\n // this.fitLength = this.fitLengthByMeter\n // break\n // case '千米':\n // this.fitLength = Number(\n // (this.fitLengthByMeter / 1000).toFixed(5)\n // )\n // break\n // default:\n // this.fitLength = this.fitLengthByMeter\n // }\n // }\n // }\n }, {\n key: \"lineWidth\",\n get: function get() {\n return this.options.width;\n },\n set: function set(v) {\n var _this5 = this;\n this.options.width = v || v == 0 ? v : 3;\n this._elms.lineWidth && this._elms.lineWidth.forEach(function (item) {\n item.value = _this5.options.width;\n });\n if (this.entity && this.entity.polyline) {\n this.entity.polyline.width = this.entity.polyline.width + v - this.entity.polyline.oriWidth;\n this.entity.polyline.oriWidth = this.options.width;\n }\n // this.entity &&\n // this.entity.polyline &&\n // (this.entity.polyline.width = this.options.width) && (this.entity.polyline.oriWidth = this.options.width)\n }\n }, {\n key: \"lineType\",\n get: function get() {\n return this.options.type;\n },\n set: function set(v) {\n var _this6 = this;\n var lineTypeData = [{\n name: '实线',\n value: '实线',\n key: 0,\n icon: 'line'\n }, {\n name: '虚线',\n value: '虚线',\n key: 1,\n icon: 'dash-line'\n }, {\n name: '泛光',\n value: '泛光',\n key: 2,\n icon: 'light-line'\n }, {\n name: '尾迹光线',\n value: '尾迹光线',\n key: 3,\n icon: 'tail-line'\n }, {\n name: '多尾迹光线',\n value: '多尾迹光线',\n key: 4,\n icon: 'mult-tail-line'\n }, {\n name: '流动虚线1',\n value: '流动虚线1',\n key: 5,\n icon: 'flow-dash-line1'\n }, {\n name: '流动虚线2',\n value: '流动虚线2',\n key: 6,\n icon: 'flow-dash-line2'\n }, {\n name: '流动箭头1',\n value: '流动箭头1',\n key: 7,\n icon: 'pic-line1'\n }, {\n name: '流动箭头2',\n value: '流动箭头2',\n key: 8,\n icon: 'pic-line2'\n }, {\n name: '流动箭头3',\n value: '流动箭头3',\n key: 9,\n icon: 'pic-line3'\n }, {\n name: '流动箭头4',\n value: '流动箭头4',\n key: 10,\n icon: 'pic-line4'\n }, {\n name: '流动箭头5',\n value: '流动箭头5',\n key: 11,\n icon: 'pic-line5'\n }, {\n name: '流动箭头6',\n value: '流动箭头6',\n key: 12,\n icon: 'pic-line6'\n }];\n this.options.type = Number(v);\n var _loop = function _loop(i) {\n if (lineTypeData[i].key === Number(v)) {\n _this6._elms.lineType && _this6._elms.lineType.forEach(function (item) {\n item.value = lineTypeData[i].value;\n if (2 < item.value && item.value < 13) {\n //贴图参数\n document.getElementById('dashTextureDom') && (document.getElementById('dashTextureDom').style.display = 'flex');\n } else {\n document.getElementById('dashTextureDom') && (document.getElementById('dashTextureDom').style.display = 'none');\n }\n if (2 < item.value && item.value < 5) {\n //尾迹参数\n document.getElementsByClassName('lineSpace')[0] && (document.getElementsByClassName('lineSpace')[0].style.display = 'none');\n document.getElementsByClassName('lineSpace')[1] && (document.getElementsByClassName('lineSpace')[1].style.display = 'none');\n } else {\n document.getElementsByClassName('lineSpace')[0] && (document.getElementsByClassName('lineSpace')[0].style.display = 'flex');\n document.getElementsByClassName('lineSpace')[1] && (document.getElementsByClassName('lineSpace')[1].style.display = 'flex');\n }\n });\n return 1; // break\n }\n };\n for (var i = 0; i < lineTypeData.length; i++) {\n if (_loop(i)) break;\n }\n var params = _objectSpread({}, this.options);\n params.speed = this.inputSpeed;\n this.entity && this.entity.polyline && (this.entity.polyline.material = this.getMaterial(this.options.color, this.options.type, this.entity, params));\n }\n }, {\n key: \"noseToTail\",\n get: function get() {\n return this.options.noseToTail;\n },\n set: function set(v) {\n this.options.noseToTail = v;\n this.closeNodeEdit();\n this._elms.noseToTail && this._elms.noseToTail.forEach(function (item) {\n item.checked = v;\n });\n if (this.entity) {\n var fromDegreesArray = this.renewPositions(this.options.positions);\n this.entity.polyline.positions = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray);\n this.renewPolygon(fromDegreesArray);\n }\n // if (v) {\n // if (this.options.fitLengthByMeter > 1000 || this.options.fitLengthByMeter == 1000) {\n // let dom = document.getElementsByClassName('input-select-unit')[1]\n // dom && dom.querySelectorAll('dd')[1] && dom.querySelectorAll('dd')[1].click()\n // } else {\n // let dom = document.getElementsByClassName('input-select-unit')[1]\n // dom && dom.querySelectorAll('dd')[0] && dom.querySelectorAll('dd')[0].click()\n // }\n\n // } else {\n // if (this.options.lengthByMeter > 1000 || this.options.lengthByMeter == 1000) {\n // let dom = document.getElementsByClassName('input-select-unit')[1]\n // dom && dom.querySelectorAll('dd')[1] && dom.querySelectorAll('dd')[1].click()\n // } else {\n // let dom = document.getElementsByClassName('input-select-unit')[1]\n // dom && dom.querySelectorAll('dd')[0] && dom.querySelectorAll('dd')[0].click()\n // }\n // }\n }\n }, {\n key: \"smooth\",\n get: function get() {\n return this.options.smooth;\n },\n set: function set(v) {\n this.options.smooth = v;\n this.closeNodeEdit();\n this._elms.smooth && this._elms.smooth.forEach(function (item) {\n item.checked = v;\n });\n if (this.entity) {\n var fromDegreesArray = this.renewPositions(this.options.positions);\n this.entity.polyline.positions = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray);\n this.renewPolygon(fromDegreesArray);\n }\n }\n }, {\n key: \"heightMode\",\n get: function get() {\n return this.options.heightMode ? this.options.heightMode : 0;\n },\n set: function set(v) {\n var _this7 = this;\n this.positionEditing = false;\n this.options.heightMode = v || v == 0 ? v : 2;\n var heightModeName = '';\n this.closeNodeEdit();\n var ground = false;\n var disabled = false;\n var fromDegreesArray = this.renewPositions(this.options.positions);\n this.entity.polyline.positions = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray);\n this.renewPolygon(fromDegreesArray);\n switch (this.options.heightMode) {\n case '0':\n case 0:\n this.entity.polyline.clampToGround = ground;\n this.extend = false;\n heightModeName = '海拔高度';\n break;\n case '1':\n case 1:\n this.entity.polyline.clampToGround = ground;\n this.extend = false;\n heightModeName = '相对地表';\n break;\n case '2':\n case 2:\n ground = true;\n disabled = true;\n this.entity.polyline.clampToGround = ground;\n heightModeName = '依附模型';\n break;\n }\n setTimeout(function () {\n if (ground) {\n _this7.label.ground = ground;\n _this7._elms.heightMode && (_this7._elms.heightMode.value = '依附模型');\n _this7.label.position = [_this7.options.positions[0].lng, _this7.options.positions[0].lat];\n } else {\n _this7.label.ground = ground;\n _this7.label.position = [_this7.options.positions[0].lng, _this7.options.positions[0].lat, fromDegreesArray[2]];\n _this7.options.label.position = {\n lng: _this7.options.positions[0].lng,\n lat: _this7.options.positions[0].lat,\n alt: fromDegreesArray[2]\n };\n }\n }, 0);\n }\n }, {\n key: \"extend\",\n get: function get() {\n return this.options.extend;\n },\n set: function set(v) {\n this.options.extend = v;\n this.closeNodeEdit();\n if (v) {\n this.heightMode = 2;\n }\n this._elms.extend && this._elms.extend.forEach(function (item) {\n item.checked = v;\n });\n if (this.entity) {\n if (this.options.extend) {\n var fromDegreesArray = this.renewPositions(this.options.positions);\n this.renewPolygon(fromDegreesArray);\n } else {\n this.entity.polygon = undefined;\n }\n }\n }\n }, {\n key: \"extendWidth\",\n get: function get() {\n return this.options.extendWidth;\n },\n set: function set(v) {\n this.options.extendWidth = v;\n this.heightMode = this.heightMode;\n this._elms.extendWidth && this._elms.extendWidth.forEach(function (item) {\n item.value = v;\n });\n var fromDegreesArray = this.renewPositions(this.options.positions);\n this.renewPolygon(fromDegreesArray);\n }\n }, {\n key: \"extendColor\",\n get: function get() {\n return this.options.extendColor;\n },\n set: function set(v) {\n var _this8 = this;\n this.options.extendColor = v;\n if (this._elms.extendColor) {\n this._elms.extendColor.forEach(function (item, i) {\n var extendColorPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: _this8.extendColor,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this8.extendColor = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this8.extendColor = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n _this8._elms.extendColor[i] = extendColorPicker;\n });\n }\n this.entity && this.entity.polygon && (this.entity.polygon.material = Cesium.Color.fromCssColorString(this.options.extendColor));\n }\n }, {\n key: \"labelShow\",\n get: function get() {\n return this.options.label.show;\n },\n set: function set(v) {\n var _this9 = this;\n this.options.label.show = v;\n if (this.show && !this.showView || this.showView == 3) {\n this.label.show = v;\n setTimeout(function () {\n _this9.label.position = [_this9.options.positions[0].lng, _this9.options.positions[0].lat, _this9.options.positions[0].alt];\n }, 0);\n } else {\n this.label.show = false;\n }\n this._elms.labelShow && this._elms.labelShow.forEach(function (item) {\n item.checked = v;\n });\n }\n }, {\n key: \"labelFontFamily\",\n get: function get() {\n return this.options.label.fontFamily;\n },\n set: function set(v) {\n this.options.label.fontFamily = v || 0;\n this.label && (this.label.fontFamily = this.options.label.fontFamily);\n var name = Object(_Element_fontSelect__WEBPACK_IMPORTED_MODULE_21__[\"getFontFamilyName\"])(this.labelFontFamily) || '';\n this._elms.labelFontFamily && this._elms.labelFontFamily.forEach(function (item) {\n item.value = name;\n });\n }\n }, {\n key: \"labelColor\",\n get: function get() {\n return this.options.label.color;\n },\n set: function set(v) {\n var _this10 = this;\n this.options.label.color = v;\n this.label.color = v;\n if (this._elms.labelColor) {\n this._elms.labelColor.forEach(function (item, i) {\n var labelColorPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: _this10.labelColor,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this10.labelColor = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this10.labelColor = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n _this10._elms.labelColor[i] = labelColorPicker;\n });\n }\n }\n }, {\n key: \"labelFontSize\",\n get: function get() {\n return this.options.label.fontSize;\n },\n set: function set(v) {\n this.options.label.fontSize = v;\n this.label.fontSize = v;\n this._elms.labelFontSize && this._elms.labelFontSize.forEach(function (item) {\n item.value = v;\n });\n }\n }, {\n key: \"labelScaleByDistance\",\n get: function get() {\n return this.options.label.scaleByDistance;\n },\n set: function set(v) {\n this.options.label.scaleByDistance = v;\n this.label.scaleByDistance = v;\n this._elms.labelScaleByDistance && this._elms.labelScaleByDistance.forEach(function (item) {\n item.checked = v;\n });\n }\n }, {\n key: \"labelNear\",\n get: function get() {\n return this.options.label.near;\n },\n set: function set(v) {\n var near = v;\n if (near > this.labelFar) {\n near = this.labelFar;\n }\n this.options.label.near = near;\n this.label.near = near;\n this._elms.labelNear && this._elms.labelNear.forEach(function (item) {\n item.value = near;\n });\n }\n }, {\n key: \"labelFar\",\n get: function get() {\n return this.options.label.far;\n },\n set: function set(v) {\n var far = v;\n if (far < this.labelNear) {\n far = this.labelNear;\n }\n this.options.label.far = far;\n this.label.far = far;\n this._elms.labelFar && this._elms.labelFar.forEach(function (item) {\n item.value = far;\n });\n }\n }, {\n key: \"labelLineWidth\",\n get: function get() {\n return this.options.label.lineWidth;\n },\n set: function set(v) {\n this.options.label.lineWidth = v;\n this.label.lineWidth = v;\n this._elms.labelLineWidth && this._elms.labelLineWidth.forEach(function (item) {\n item.value = v;\n });\n }\n }, {\n key: \"labelPixelOffset\",\n get: function get() {\n return this.options.label.pixelOffset;\n },\n set: function set(v) {\n this.options.label.pixelOffset = v;\n this.label.pixelOffset = v;\n this._elms.labelPixelOffset && this._elms.labelPixelOffset.forEach(function (item) {\n item.value = v;\n });\n }\n }, {\n key: \"labelLineColor\",\n get: function get() {\n return this.options.label.lineColor;\n },\n set: function set(v) {\n var _this11 = this;\n this.options.label.lineColor = v;\n this.label.lineColor = v;\n if (this._elms.labelLineColor) {\n this._elms.labelLineColor.forEach(function (item, i) {\n var lineColorPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: _this11.labelLineColor,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this11.labelLineColor = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this11.labelLineColor = 'rgba(0,255,255,0.5)';\n } //点击清空按钮事件回调\n });\n _this11._elms.labelLineColor[i] = lineColorPicker;\n });\n }\n }\n }, {\n key: \"labelBackgroundColorStart\",\n get: function get() {\n return this.options.label.backgroundColor[0];\n },\n set: function set(v) {\n var _this12 = this;\n this.options.label.backgroundColor[0] = v;\n this.label.backgroundColor = [v, this.label.backgroundColor[1]];\n if (this._elms.labelBackgroundColorStart) {\n this._elms.labelBackgroundColorStart.forEach(function (item, i) {\n var labelBackgroundColorStartPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: _this12.labelBackgroundColorStart,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this12.labelBackgroundColorStart = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this12.labelBackgroundColorStart = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n _this12._elms.labelBackgroundColorStart[i] = labelBackgroundColorStartPicker;\n });\n }\n }\n }, {\n key: \"labelBackgroundColorEnd\",\n get: function get() {\n return this.options.label.backgroundColor[1];\n },\n set: function set(v) {\n var _this13 = this;\n this.options.label.backgroundColor[1] = v;\n this.label.backgroundColor = [this.label.backgroundColor[0], v];\n if (this._elms.labelBackgroundColorEnd) {\n this._elms.labelBackgroundColorEnd.forEach(function (item, i) {\n var labelBackgroundColorEndPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: _this13.labelBackgroundColorEnd,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this13.labelBackgroundColorEnd = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this13.labelBackgroundColorEnd = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n _this13._elms.labelBackgroundColorEnd[i] = labelBackgroundColorEndPicker;\n });\n }\n }\n\n // get attributeCamera() {\n // return this.options.attribute.camera.content\n // }\n\n // set attributeCamera(v) {\n // this.options.attribute.camera.content = v\n // }\n\n // get attributeVr() {\n // return this.options.attribute.vr.content\n // }\n\n // set attributeVr(v) {\n // this.options.attribute.vr.content = v\n // if (\n // !this._DialogObject ||\n // !this._DialogObject._element ||\n // !this._DialogObject._element.content ||\n // this._DialogObject._element.content.getElementsByClassName(\n // 'attribute-content-vr'\n // ).length == 0\n // ) {\n // return\n // }\n // let table = this._DialogObject._element.content\n // .getElementsByClassName('attribute-content-vr')[1]\n // .getElementsByClassName('table')[0]\n // let tableContent = table.getElementsByClassName('table-body')[0]\n // tableContent.innerHTML = ''\n // if (this.options.attribute.vr.content.length > 0) {\n // table.getElementsByClassName('table-empty')[0].style.display = 'none'\n // } else {\n // table.getElementsByClassName('table-empty')[0].style.display = 'flex'\n // }\n // for (let i = 0; i < this.options.attribute.vr.content.length; i++) {\n // let tr =\n // `\n //
\n //
` +\n // this.options.attribute.vr.content[i].name +\n // `
\n //
` +\n // this.options.attribute.vr.content[i].url +\n // `
\n //
\n // \n // \n //
\n //
`\n // let trElm = document.createRange().createContextualFragment(tr)\n // tableContent.appendChild(trElm)\n // }\n // let item = tableContent.getElementsByClassName('tr')\n // let fun = {\n // vrEdit: async index => {\n // this.attributeVr = await this.options.attribute.vr.content\n // let table = this._DialogObject._element.content\n // .getElementsByClassName('attribute-content-vr')[1]\n // .getElementsByClassName('table')[0]\n // let tableContent = table.getElementsByClassName('table-body')[0]\n // let item = tableContent.getElementsByClassName('tr')\n // for (let i = 0; i < item.length; i++) {\n // if (index === i) {\n // let height = item[i].offsetHeight\n // let html = `\n //
\n // \n //
\n //
\n // \n //
\n //
\n // \n // \n //
`\n // item[i].innerHTML = html\n // let textareaElm = item[i].getElementsByClassName('link-edit')[0]\n // textareaElm.style.height = height - 10 + 'px'\n // let td = item[i].getElementsByClassName('td')\n // td[0].getElementsByClassName(\n // 'input'\n // )[0].value = this.options.attribute.vr.content[index].name\n // td[1].getElementsByClassName(\n // 'input'\n // )[0].value = this.options.attribute.vr.content[index].url\n // let btn = item[i].getElementsByTagName('button')\n // for (let n = 0; n < btn.length; n++) {\n // if (!btn[n] || !btn[n].attributes) {\n // continue\n // }\n // for (let m of btn[n].attributes) {\n // if (m.name === '@click') {\n // btn[n].addEventListener('click', e => {\n // if (typeof fun[m.value] === 'function') {\n // fun[m.value](\n // {\n // name: td[0].getElementsByClassName('input')[0].value,\n // url: td[1].getElementsByClassName('input')[0].value\n // },\n // i\n // )\n // }\n // })\n // btn[n].attributes.removeNamedItem(m.name)\n // break\n // }\n // }\n // }\n // break\n // }\n // }\n // },\n // vrDelete: i => {\n // this.options.attribute.vr.content.splice(i, 1)\n // this.attributeVr = this.options.attribute.vr.content\n // },\n\n // confirmEdit: (value, i) => {\n // let name = value.name && value.name.replace(/\\s/g, '')\n // let url = value.url && value.url.replace(/\\s/g, '')\n // if (name && url) {\n // this.options.attribute.vr.content[i] = value\n // } else {\n // window.ELEMENT &&\n // window.ELEMENT.Message({\n // message: '名称或链接不能为空!',\n // type: 'warning',\n // duration: 1500\n // })\n // }\n // this.attributeVr = this.options.attribute.vr.content\n // },\n // cancelEdit: () => {\n // this.attributeVr = this.options.attribute.vr.content\n // },\n // fileSelect: (value, i) => {\n // let fileElm = item[i].getElementsByClassName('file-select')[0]\n // fileElm.click()\n // fileElm.removeEventListener('change', fileSelect)\n // fileElm.addEventListener('change', fileSelect)\n // }\n // }\n // let fileSelect = event => {\n // if (event.target.value) {\n // let td = item[\n // event.target.getAttribute('index')\n // ].getElementsByClassName('td')\n // td[1].getElementsByClassName('input')[0].value = event.target.value\n // event.target.value = null\n // }\n // }\n // for (let i = 0; i < item.length; i++) {\n // let btn = item[i].getElementsByTagName('button')\n // for (let n = 0; n < btn.length; n++) {\n // if (!btn[n] || !btn[n].attributes) {\n // continue\n // }\n // for (let m of btn[n].attributes) {\n // if (m.name === '@click') {\n // btn[n].addEventListener('click', e => {\n // if (typeof fun[m.value] === 'function') {\n // fun[m.value](i)\n // }\n // })\n // btn[n].attributes.removeNamedItem(m.name)\n // break\n // }\n // }\n // }\n // }\n // }\n\n // get attributeGoods() {\n // return this.options.attribute.goods.content\n // }\n\n // set attributeGoods(v) {\n // this.options.attribute.goods.content = v\n // }\n }, {\n key: \"positions\",\n get: function get() {\n return this.options.positions;\n }\n }, {\n key: \"judgeLine\",\n value: function judgeLine(entity, newParam) {\n if (!entity.polyline.oriRepeat) {\n var param = {\n color: newParam.color,\n image: this.getSourceRootPath() + \"/img/arrow/1.png\",\n space: newParam.space,\n speed: newParam.speed\n };\n param.speed = newParam.rotate ? param.speed : 0 - param.speed;\n var canvasEle = document.createElement('canvas');\n var ctx = canvasEle.getContext('2d');\n var myImg = new Image();\n // myImg.src = that.getSourceRootPath() + '/img/arrow/1.png'\n myImg.src = param.image;\n var that = this;\n myImg.onload = function () {\n canvasEle.width = myImg.width * (param.space + 1);\n canvasEle.height = myImg.height;\n var oriRepeat = that.getSceenLine(entity, param, canvasEle);\n oriRepeat && (entity.polyline.oriRepeat = oriRepeat);\n var positionProperty = entity.polyline.positions;\n var positions = positionProperty.getValue(that.sdk.viewer.clock.currentTime);\n if (!Cesium.defined(positions)) {\n return new Cesium.Cartesian2(1.0, 1.0);\n // return 1.0;\n }\n var distance = 0;\n for (var i = 0; i < positions.length - 1; ++i) {\n distance += Cesium.Cartesian3.distance(positions[i], positions[i + 1]);\n }\n var repeatX = distance / entity.polyline.width.getValue();\n // 根据地图缩放程度调整repeatX\n var cameraHeight = that.sdk.viewer.camera.positionCartographic.height;\n var boundingSphere = new Cesium.BoundingSphere(new Cesium.Cartesian3(-1000000, 0, 0),\n // 中心点坐标\n 500000 // 半径(距离)\n );\n\n // 获取绘图缓冲区的宽度和高度(通常是屏幕的分辨率)\n var drawingBufferWidth = that.sdk.viewer.canvas.clientWidth;\n var drawingBufferHeight = that.sdk.viewer.canvas.clientHeight;\n\n // 使用 getPixelSize 方法获取包围球在屏幕上的像素大小\n var groundResolution = that.sdk.viewer.scene.camera.getPixelSize(boundingSphere, drawingBufferWidth, drawingBufferHeight);\n repeatX *= groundResolution / cameraHeight / (param.space * (canvasEle.width / canvasEle.height * 5) + 1);\n // if (entity.polyline.material.oriRepeat) {\n\n if (that.sdk.viewer.scene.mode === Cesium.SceneMode.SCENE3D) {\n var speed = repeatX / entity.polyline.oriRepeat;\n entity.polyline.oriSpeed = speed;\n entity.polyline.oriRepeatX = repeatX;\n } else {\n var sdk3d = Object(_Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_19__[\"get3DView\"])();\n var sdk3dEntity = sdk3d.viewer.entities.getById(that.options.id);\n entity.polyline.oriSpeed = sdk3dEntity.polyline.oriSpeed;\n entity.polyline.oriRepeatX = sdk3dEntity.polyline.oriRepeatX;\n }\n };\n }\n }\n /**获取当前满屏横线速度 */\n }, {\n key: \"getSceenLine\",\n value: function getSceenLine(entity, options, canvasEle) {\n var point1 = new Cesium.Cartesian2(0, this.sdk.viewer.canvas.clientHeight);\n var point2 = new Cesium.Cartesian2(this.sdk.viewer.canvas.clientWidth / 2, this.sdk.viewer.canvas.clientHeight);\n // var cartesian1 = this.sdk.viewer.scene.pickPosition(point1)\n // var cartesian2 = this.sdk.viewer.scene.pickPosition(point2)\n\n var ray = this.sdk.viewer.camera.getPickRay(point1);\n var cartesian1 = this.sdk.viewer.scene.globe.pick(ray, this.sdk.viewer.scene);\n var ray2 = this.sdk.viewer.camera.getPickRay(point2);\n var cartesian2 = this.sdk.viewer.scene.globe.pick(ray2, this.sdk.viewer.scene);\n // if (!cartesian1 || !cartesian2) {\n // let ray = this.sdk.viewer.camera.getPickRay(point1);\n // cartesian1 = this.sdk.viewer.scene.globe.pick(ray, this.sdk.viewer.scene);\n\n // let ray2 = this.sdk.viewer.camera.getPickRay(point2);\n // cartesian2 = this.sdk.viewer.scene.globe.pick(ray2, this.sdk.viewer.scene);\n // }\n if (cartesian1 && cartesian2) {\n var distance = Cesium.Cartesian3.distance(cartesian1, cartesian2);\n var repeatX = distance / entity.polyline.width.getValue();\n // 根据地图缩放程度调整repeatX\n var cameraHeight = this.sdk.viewer.camera.positionCartographic.height;\n var boundingSphere = new Cesium.BoundingSphere(new Cesium.Cartesian3(-1000000, 0, 0),\n // 中心点坐标\n 500000 // 半径(距离)\n );\n\n // 获取绘图缓冲区的宽度和高度(通常是屏幕的分辨率)\n var drawingBufferWidth = this.sdk.viewer.canvas.clientWidth;\n var drawingBufferHeight = this.sdk.viewer.canvas.clientHeight;\n\n // 使用 getPixelSize 方法获取包围球在屏幕上的像素大小\n var groundResolution = this.sdk.viewer.scene.camera.getPixelSize(boundingSphere, drawingBufferWidth, drawingBufferHeight);\n // repeatX *= groundResolution / cameraHeight / ((myImg.width / myImg.height * 5) + 1);\n if (groundResolution > 700) {\n repeatX *= groundResolution / cameraHeight / (options.space * (canvasEle.width / canvasEle.height * 5) + 1);\n } else {\n repeatX = undefined;\n }\n if (this.sdk.viewer.scene.mode === Cesium.SceneMode.SCENE3D) {\n return repeatX;\n } else {\n var sdk3d = Object(_Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_19__[\"get3DView\"])();\n var sdk3dEntity = sdk3d.viewer.entities.getById(this.options.id);\n return sdk3dEntity.polyline.oriRepeatX;\n }\n }\n }\n /**\r\n * 编辑框\r\n * @param {boolean} state true打开,false关闭\r\n */\n }, {\n key: \"edit\",\n value: (function () {\n var _edit = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee(state) {\n var _this14 = this;\n var _this, tabClick, contentElm, tabsElm, colorPicker, labelColorPicker, extendColorPicker, lineColorPicker, labelBackgroundColorEndPicker, all_elm;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee$(_context) {\n while (1) switch (_context.prev = _context.next) {\n case 0:\n return _context.abrupt(\"return\");\n case 8:\n this._DialogObject = _context.sent;\n this._DialogObject._element.body.className = this._DialogObject._element.body.className + ' polyline';\n contentElm = document.createElement('div');\n contentElm.innerHTML = Object(_element__WEBPACK_IMPORTED_MODULE_10__[\"html\"])(this);\n this._DialogObject.contentAppChild(contentElm);\n this.attributeType = this.options.attributeType;\n // this.attributeCamera = this.options.attribute.camera.content\n // this.attributeGoods = this.options.attribute.goods.content\n // 创建标签页\n tabsElm = new _Element_cy_html_tabs__WEBPACK_IMPORTED_MODULE_12__[\"default\"]('polyline-object-edit-tabs', tabClick, this.sdk); // 颜色组件\n colorPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName('color')[0],\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: this.color,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this14.color = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this14.color = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n labelColorPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName('labelColor')[0],\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: this.labelColor,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this14.labelColor = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this14.labelColor = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n extendColorPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName('extendColor')[0],\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: this.extendColor,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this14.extendColor = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this14.extendColor = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n lineColorPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName('labelLineColor')[0],\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: this.labelLineColor,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this14.labelLineColor = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this14.labelLineColor = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n _this.labelBackgroundColorStartPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName('labelBackgroundColorStart')[0],\n size: 'mini',\n alpha: true,\n defaultColor: this.labelBackgroundColorStart,\n disabled: false,\n openPickerAni: 'opacity',\n sure: function sure(color) {\n _this14.labelBackgroundColorStart = color;\n },\n clear: function clear() {\n _this14.labelBackgroundColorStart = 'rgba(255,255,255,1)';\n }\n });\n labelBackgroundColorEndPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName('labelBackgroundColorEnd')[0],\n size: 'mini',\n alpha: true,\n defaultColor: this.labelBackgroundColorEnd,\n disabled: false,\n openPickerAni: 'opacity',\n sure: function sure(color) {\n _this14.labelBackgroundColorEnd = color;\n },\n clear: function clear() {\n _this14.labelBackgroundColorEnd = 'rgba(255,255,255,1)';\n }\n });\n all_elm = contentElm.getElementsByTagName('*');\n _eventBinding__WEBPACK_IMPORTED_MODULE_14__[\"default\"].on(this, all_elm);\n this._elms = _eventBinding__WEBPACK_IMPORTED_MODULE_14__[\"default\"].element;\n this._elms.color = [colorPicker];\n this._elms.labelColor = [labelColorPicker];\n this._elms.extendColor = [extendColorPicker];\n this._elms.labelLineColor = [lineColorPicker];\n this._elms.labelBackgroundColorStart = [_this.labelBackgroundColorStartPicker];\n this._elms.labelBackgroundColorEnd = [labelBackgroundColorEndPicker];\n setTimeout(function () {\n _this14.attributeLink = _this14.options.attribute.link.content;\n // this.attributeVr = this.options.attribute.vr.content\n // this.cameraSelect && this.cameraSelect()\n // this.goodsSelect && this.goodsSelect()\n var tagData = _this14.attributeSelect;\n var attributeElm = _this14._DialogObject._element.content.getElementsByClassName('attribute-select-box')[0];\n if (attributeElm) {\n var legpObject = Object(_Element_datalist__WEBPACK_IMPORTED_MODULE_20__[\"legp\"])(attributeElm, '.attribute-select');\n legpObject.legp_search(tagData);\n var attributeSelectElm = _this14._DialogObject._element.content.getElementsByClassName('attribute-select')[0].getElementsByTagName('input')[0];\n for (var i = 0; i < tagData.length; i++) {\n if (tagData[i].key === _this14.options.attributeType) {\n attributeSelectElm.value = tagData[i].value;\n legpObject.legp_searchActive(tagData[i].value);\n break;\n }\n }\n attributeSelectElm.addEventListener('input', function () {\n for (var _i = 0; _i < tagData.length; _i++) {\n if (tagData[_i].value === attributeSelectElm.value) {\n _this14.attributeType = tagData[_i].key;\n break;\n }\n }\n });\n }\n var nameData = [{\n name: '空间长度',\n value: '空间长度'\n }, {\n name: '投影长度',\n value: '投影长度'\n }, {\n name: '地表长度',\n value: '地表长度'\n }];\n var nameDataLegpObject = Object(_Element_datalist__WEBPACK_IMPORTED_MODULE_20__[\"legp\"])(_this14._DialogObject._element.content.getElementsByClassName('input-select-unit-box')[0], '.input-select-unit');\n if (nameDataLegpObject) {\n nameDataLegpObject.legp_search(nameData);\n var nameDataLegpElm = _this14._DialogObject._element.content.getElementsByClassName('input-select-unit')[0].getElementsByTagName('input')[0];\n _this14._elms.wordsName = [nameDataLegpElm];\n nameDataLegpElm.value = _this14.options.wordsName;\n for (var _i2 = 0; _i2 < nameData.length; _i2++) {\n if (nameData[_i2].value === nameDataLegpElm.value) {\n nameDataLegpObject.legp_searchActive(nameData[_i2].value);\n break;\n }\n }\n nameDataLegpElm.addEventListener('input', function () {\n for (var _i3 = 0; _i3 < nameData.length; _i3++) {\n if (nameData[_i3].value === nameDataLegpElm.value) {\n _this14.wordsName = nameData[_i3].value;\n break;\n }\n }\n });\n }\n\n // 原始长度单位\n var unitData = [{\n name: '米',\n value: '米'\n }, {\n name: '千米',\n value: '千米'\n }];\n var unitDataLegpObject = Object(_Element_datalist__WEBPACK_IMPORTED_MODULE_20__[\"legp\"])(_this14._DialogObject._element.content.getElementsByClassName('input-select-unit-box')[0], '.input-select-unit', 1);\n if (unitDataLegpObject) {\n unitDataLegpObject.legp_search(unitData);\n var unitDataLegpElm = _this14._DialogObject._element.content.getElementsByClassName('input-select-unit')[1].getElementsByTagName('input')[0];\n _this14._elms.lengthUnit = [unitDataLegpElm];\n unitDataLegpElm.value = _this14.options.lengthUnit;\n for (var _i4 = 0; _i4 < unitData.length; _i4++) {\n if (unitData[_i4].value === unitDataLegpElm.value) {\n unitDataLegpObject.legp_searchActive(unitData[_i4].value);\n break;\n }\n }\n unitDataLegpElm.addEventListener('input', function () {\n for (var _i5 = 0; _i5 < unitData.length; _i5++) {\n if (unitData[_i5].value === unitDataLegpElm.value) {\n _this14.lengthUnit = unitData[_i5].value;\n break;\n }\n }\n });\n }\n //\n\n // 拟合长度单位\n // let fitUnitData = [\n // {\n // name: '米',\n // value: '米'\n // },\n // {\n // name: '千米',\n // value: '千米'\n // }\n // ]\n\n // let fitUnitDataLegpObject = legp(\n // this._DialogObject._element.content.getElementsByClassName(\n // 'input-select-fit-unit-box'\n // )[0],\n // '.input-select-fit-unit'\n // )\n // if (fitUnitDataLegpObject) {\n // fitUnitDataLegpObject.legp_search(fitUnitData)\n // let fitUnitDataLegpElm = this._DialogObject._element.content\n // .getElementsByClassName('input-select-fit-unit')[0]\n // .getElementsByTagName('input')[0]\n // this._elms.fitLengthUnit = [fitUnitDataLegpElm]\n // fitUnitDataLegpElm.value = this.options.fitLengthUnit\n // for (let i = 0; i < fitUnitData.length; i++) {\n // if (fitUnitData[i].value === fitUnitDataLegpElm.value) {\n // fitUnitDataLegpObject.legp_searchActive(fitUnitData[i].value)\n // break\n // }\n // }\n // fitUnitDataLegpElm.addEventListener('input', () => {\n // for (let i = 0; i < fitUnitData.length; i++) {\n // if (fitUnitData[i].value === fitUnitDataLegpElm.value) {\n // this.fitLengthUnit = fitUnitData[i].value\n // break\n // }\n // }\n // })\n // }\n\n var lineTypeData = [{\n name: '实线',\n value: '实线',\n key: 0,\n icon: 'line'\n }, {\n name: '虚线',\n value: '虚线',\n key: 1,\n icon: 'dash-line'\n }, {\n name: '泛光',\n value: '泛光',\n key: 2,\n icon: 'light-line'\n }, {\n name: '尾迹光线',\n value: '尾迹光线',\n key: 3,\n icon: 'tail-line'\n }, {\n name: '多尾迹光线',\n value: '多尾迹光线',\n key: 4,\n icon: 'mult-tail-line'\n }, {\n name: '流动虚线1',\n value: '流动虚线1',\n key: 5,\n icon: 'flow-dash-line1'\n }, {\n name: '流动虚线2',\n value: '流动虚线2',\n key: 6,\n icon: 'flow-dash-line2'\n }, {\n name: '流动箭头1',\n value: '流动箭头1',\n key: 7,\n icon: 'pic-line1'\n }, {\n name: '流动箭头2',\n value: '流动箭头2',\n key: 8,\n icon: 'pic-line2'\n }, {\n name: '流动箭头3',\n value: '流动箭头3',\n key: 9,\n icon: 'pic-line3'\n }, {\n name: '流动箭头4',\n value: '流动箭头4',\n key: 10,\n icon: 'pic-line4'\n }, {\n name: '流动箭头5',\n value: '流动箭头5',\n key: 11,\n icon: 'pic-line5'\n }, {\n name: '流动箭头6',\n value: '流动箭头6',\n key: 12,\n icon: 'pic-line6'\n }];\n var lineTypeDataLegpObject = Object(_Element_datalist__WEBPACK_IMPORTED_MODULE_20__[\"legp\"])(_this14._DialogObject._element.content.getElementsByClassName('input-select-line-type-box')[0], '.input-select-line-type');\n if (lineTypeDataLegpObject) {\n lineTypeDataLegpObject.legp_search(lineTypeData);\n var iActiveElm2 = document.createElement('i');\n iActiveElm2.className = 'icon icon-active';\n _this14._DialogObject._element.content.getElementsByClassName('input-select-line-type')[0].getElementsByClassName('cy_datalist')[0].appendChild(iActiveElm2);\n var lineTypeDataLegpElm = _this14._DialogObject._element.content.getElementsByClassName('input-select-line-type')[0].getElementsByTagName('input')[0];\n _this14._elms.lineType = [lineTypeDataLegpElm];\n for (var _i6 = 0; _i6 < lineTypeData.length; _i6++) {\n if (lineTypeData[_i6].key === _this14.options.type) {\n lineTypeDataLegpObject.legp_searchActive(lineTypeData[_i6].value);\n lineTypeDataLegpElm.value = lineTypeData[_i6].value;\n iActiveElm2.className = \"icon icon-active \".concat(lineTypeData[_i6].icon);\n break;\n }\n }\n lineTypeDataLegpElm.addEventListener('input', function () {\n for (var _i7 = 0; _i7 < lineTypeData.length; _i7++) {\n if (lineTypeData[_i7].value === lineTypeDataLegpElm.value) {\n _this14.lineType = lineTypeData[_i7].key;\n iActiveElm2.className = \"icon icon-active \".concat(lineTypeData[_i7].icon);\n\n //控制参数显隐\n if (2 < _this14.lineType && _this14.lineType < 13) {\n //贴图参数\n document.getElementById('dashTextureDom') && (document.getElementById('dashTextureDom').style.display = 'flex');\n } else {\n document.getElementById('dashTextureDom') && (document.getElementById('dashTextureDom').style.display = 'none');\n }\n if (2 < _this14.lineType && _this14.lineType < 5) {\n //尾迹参数\n document.getElementsByClassName('lineSpace')[0] && (document.getElementsByClassName('lineSpace')[0].style.display = 'none');\n document.getElementsByClassName('lineSpace')[1] && (document.getElementsByClassName('lineSpace')[1].style.display = 'none');\n } else {\n document.getElementsByClassName('lineSpace')[0] && (document.getElementsByClassName('lineSpace')[0].style.display = 'flex');\n document.getElementsByClassName('lineSpace')[1] && (document.getElementsByClassName('lineSpace')[1].style.display = 'flex');\n }\n break;\n }\n }\n });\n }\n var heightBoxElm = _this14._DialogObject._element.content.getElementsByClassName('height-box')[0];\n var heightElm = heightBoxElm.getElementsByClassName('height')[0];\n var heightConfirmElm = _this14._DialogObject._element.content.getElementsByClassName('height-confirm')[0];\n heightElm.value = 10;\n if (_this14.heightMode == 2) {\n heightBoxElm && (heightBoxElm.className = 'input-number input-number-unit-1 height-box disabled');\n heightConfirmElm && heightConfirmElm.setAttribute('disabled', 'disabled');\n } else {\n heightBoxElm && (heightBoxElm.className = 'input-number input-number-unit-1 height-box');\n heightConfirmElm && heightConfirmElm.removeAttribute('disabled');\n }\n var heightModeData = [{\n name: '海拔高度',\n value: '海拔高度',\n key: '0'\n }, {\n name: '相对地表',\n value: '相对地表',\n key: '1'\n }, {\n name: '依附模型',\n value: '依附模型',\n key: '2'\n }];\n var heightModeObject = Object(_Element_datalist__WEBPACK_IMPORTED_MODULE_20__[\"legp\"])(_this14._DialogObject._element.content.getElementsByClassName('height-mode-box')[0], '.height-mode');\n if (heightModeObject) {\n heightModeObject.legp_search(heightModeData);\n var heightModeDataLegpElm = _this14._DialogObject._element.content.getElementsByClassName('height-mode')[0].getElementsByTagName('input')[0];\n for (var _i8 = 0; _i8 < heightModeData.length; _i8++) {\n if (heightModeData[_i8].key == _this14.heightMode) {\n heightModeDataLegpElm.value = heightModeData[_i8].value;\n heightModeObject.legp_searchActive(heightModeData[_i8].value);\n break;\n }\n }\n heightModeDataLegpElm.addEventListener('input', function () {\n for (var _i9 = 0; _i9 < heightModeData.length; _i9++) {\n if (heightModeData[_i9].value === heightModeDataLegpElm.value) {\n _this14.heightMode = heightModeData[_i9].key;\n break;\n }\n }\n });\n heightElm.addEventListener('input', function () {\n switch (_this14.heightMode) {\n case 0:\n case '0':\n break;\n case 1:\n case '1':\n break;\n case 2:\n case '2':\n break;\n }\n });\n _this14._elms.height = heightElm;\n _this14._elms.heightBox = heightBoxElm;\n _this14._elms.heightMode = heightModeDataLegpElm;\n _this14._elms.heightConfirm = heightConfirmElm;\n _this14._elms.heightModeObject = heightModeObject;\n heightConfirmElm.addEventListener('click', function () {\n _this14.positionEditing = false;\n for (var _i10 = 0; _i10 < _this14.options.positions.length; _i10++) {\n _this14.options.positions[_i10].alt = Number((_this14.options.positions[_i10].alt + Number(heightElm.value)).toFixed(2));\n _this14._elms.alt[_i10].innerHTML = _this14.options.positions[_i10].alt;\n }\n var fromDegreesArray = _this14.renewPositions(_this14.options.positions);\n _this14.entity.polyline.positions = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray);\n _this14.positionEditing = false;\n _this14.closeNodeEdit();\n });\n }\n var tableElm = contentElm.getElementsByClassName('spatial-info-table')[0];\n var tBodyElm = tableElm.getElementsByClassName('table-body')[0];\n _this14._elms.lng = [];\n _this14._elms.lngInput = [];\n _this14._elms.lat = [];\n _this14._elms.latInput = [];\n _this14._elms.alt = [];\n _this14._elms.altInput = [];\n var _loop2 = function _loop2(_i11) {\n var tr = document.createElement('div');\n tr.className = 'tr';\n tr.innerHTML = \"\\n
\".concat(_i11 + 1, \"
\\n
\\n
\\n
\\n \");\n var lngBox = tr.getElementsByClassName('lng')[0];\n var lng = document.createElement('span');\n lng.innerHTML = _this14.options.positions[_i11].lng.toFixed(8);\n lngBox.appendChild(lng);\n var lngInput = document.createElement('input');\n lngInput.className = 'input';\n lngInput.type = 'number';\n lngInput.title = '';\n lngInput.min = -180;\n lngInput.max = 180;\n lngInput.value = _this14.options.positions[_i11].lng.toFixed(8);\n var latBox = tr.getElementsByClassName('lat')[0];\n var lat = document.createElement('span');\n lat.innerHTML = _this14.options.positions[_i11].lat.toFixed(8);\n latBox.appendChild(lat);\n var latInput = document.createElement('input');\n latInput.className = 'input';\n latInput.type = 'number';\n latInput.title = '';\n latInput.min = -90;\n latInput.max = 90;\n latInput.value = _this14.options.positions[_i11].lat.toFixed(8);\n var altBox = tr.getElementsByClassName('alt')[0];\n var alt = document.createElement('span');\n alt.innerHTML = _this14.options.positions[_i11].alt.toFixed(2);\n altBox.appendChild(alt);\n var altInput = document.createElement('input');\n altInput.className = 'input';\n altInput.type = 'number';\n altInput.title = '';\n altInput.min = -9999999;\n altInput.max = 999999999;\n altInput.value = _this14.options.positions[_i11].alt.toFixed(2);\n lngBox.addEventListener('dblclick', function () {\n lngBox.innerHTML = '';\n lngInput.value = Number(_this14.options.positions[_i11].lng.toFixed(8));\n lngBox.appendChild(lngInput);\n lngInput.focus();\n _this14.positionEditing = false;\n _this14.closeNodeEdit();\n });\n lngInput.addEventListener('blur', function () {\n lngInput.value = Number(_this14.options.positions[_i11].lng.toFixed(8));\n lngBox.innerHTML = '';\n lngBox.appendChild(lng);\n });\n lngInput.addEventListener('input', function () {\n _this14.options.positions[_i11].lng = Number(Number(lngInput.value).toFixed(8));\n lng.innerHTML = _this14.options.positions[_i11].lng.toFixed(8);\n var fromDegreesArray = _this14.renewPositions(_this14.options.positions);\n _this14.entity.polyline.positions = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray);\n _this14.label.position = [_this14.options.positions[0].lng, _this14.options.positions[0].lat, fromDegreesArray[2]];\n });\n latBox.addEventListener('dblclick', function () {\n latBox.innerHTML = '';\n latInput.value = Number(_this14.options.positions[_i11].lat.toFixed(8));\n latBox.appendChild(latInput);\n latInput.focus();\n _this14.positionEditing = false;\n _this14.closeNodeEdit();\n });\n latInput.addEventListener('blur', function () {\n latInput.value = Number(_this14.options.positions[_i11].lat.toFixed(8));\n latBox.innerHTML = '';\n latBox.appendChild(lat);\n });\n latInput.addEventListener('input', function () {\n _this14.options.positions[_i11].lat = Number(Number(latInput.value).toFixed(8));\n lat.innerHTML = _this14.options.positions[_i11].lat.toFixed(8);\n var fromDegreesArray = _this14.renewPositions(_this14.options.positions);\n _this14.entity.polyline.positions = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray);\n _this14.label.position = [_this14.options.positions[0].lng, _this14.options.positions[0].lat, fromDegreesArray[2]];\n });\n altBox.addEventListener('dblclick', function () {\n if (_this14.heightMode == 2) {\n return;\n }\n altBox.innerHTML = '';\n altInput.value = Number(_this14.options.positions[_i11].alt.toFixed(2));\n altBox.appendChild(altInput);\n altInput.focus();\n _this14.positionEditing = false;\n _this14.closeNodeEdit();\n });\n altInput.addEventListener('blur', function () {\n altInput.value = Number(_this14.options.positions[_i11].alt.toFixed(2));\n altBox.innerHTML = '';\n altBox.appendChild(alt);\n });\n altInput.addEventListener('input', function () {\n _this14.options.positions[_i11].alt = Number(Number(altInput.value).toFixed(2));\n alt.innerHTML = _this14.options.positions[_i11].alt.toFixed(2);\n var fromDegreesArray = _this14.renewPositions(_this14.options.positions);\n _this14.entity.polyline.positions = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray);\n _this14.label.position = [_this14.options.positions[0].lng, _this14.options.positions[0].lat, fromDegreesArray[2]];\n });\n _this14._elms.lng.push(lng);\n _this14._elms.lngInput.push(lngInput);\n _this14._elms.lat.push(lat);\n _this14._elms.latInput.push(latInput);\n _this14._elms.alt.push(alt);\n _this14._elms.altInput.push(altInput);\n tBodyElm.appendChild(tr);\n };\n for (var _i11 = 0; _i11 < _this14.options.positions.length; _i11++) {\n _loop2(_i11);\n }\n var fontData = Object(_Element_fontSelect__WEBPACK_IMPORTED_MODULE_21__[\"getFontList\"])();\n var fontObject = Object(_Element_datalist__WEBPACK_IMPORTED_MODULE_20__[\"legp\"])(_this14._DialogObject._element.content.getElementsByClassName('font-select-box')[0], '.font-select');\n if (fontObject) {\n fontObject.legp_search(fontData);\n var fontDataLegpElm = _this14._DialogObject._element.content.getElementsByClassName('font-select')[0].getElementsByTagName('input')[0];\n fontDataLegpElm.value = fontData[_this14.labelFontFamily].value;\n for (var _i12 = 0; _i12 < fontData.length; _i12++) {\n if (fontData[_i12].value == fontDataLegpElm.value) {\n fontObject.legp_searchActive(fontData[_i12].value);\n break;\n }\n }\n fontDataLegpElm.addEventListener('input', function () {\n for (var _i13 = 0; _i13 < fontData.length; _i13++) {\n if (fontData[_i13].value === fontDataLegpElm.value) {\n _this14.labelFontFamily = fontData[_i13].key;\n break;\n }\n }\n });\n _this14._elms.labelFontFamily = [fontDataLegpElm];\n }\n }, 0);\n _context.next = 34;\n break;\n case 33:\n if (this._DialogObject && this._DialogObject.close) {\n this._DialogObject.close();\n this._DialogObject = null;\n }\n case 34:\n case \"end\":\n return _context.stop();\n }\n }, _callee, this);\n }));\n function edit(_x) {\n return _edit.apply(this, arguments);\n }\n return edit;\n }() // 平滑处理\n )\n }, {\n key: \"smoothHandle\",\n value: function smoothHandle(positions) {\n var newPositions = [];\n var time = [];\n var fromDegreesArrayHeights = [];\n for (var i = 0; i < positions.length; i++) {\n fromDegreesArrayHeights.push(positions[i].lng, positions[i].lat, positions[i].alt);\n time.push(i / (positions.length - 1));\n }\n var spline = new Cesium.CatmullRomSpline({\n times: time,\n points: Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArrayHeights)\n });\n var length = positions.length * 20;\n for (var _i14 = 0; _i14 <= length; _i14++) {\n var cartesian3 = spline.evaluate(_i14 / length);\n newPositions.push(this.cartesian3Towgs84(cartesian3, this.sdk.viewer));\n }\n return newPositions;\n }\n\n // 更新坐标\n }, {\n key: \"renewPositions\",\n value: function renewPositions(positionsArray, cd) {\n var _this16 = this;\n if (this._error) {\n return;\n }\n var positions = JSON.parse(JSON.stringify(positionsArray));\n var ground;\n switch (this.heightMode) {\n case 0:\n case '0':\n ground = false;\n break;\n case 1:\n case '1':\n for (var i = 0; i < positions.length; i++) {\n var height = this.sdk.viewer.scene.globe.getHeight(Cesium.Cartographic.fromDegrees(positions[i].lng, positions[i].lat));\n positions[i].alt = height ? Number((positions[i].alt + Number(height)).toFixed(2)) : Number(positions[i].alt.toFixed(2));\n }\n ground = false;\n break;\n case 2:\n case '2':\n ground = true;\n break;\n }\n var newPositions;\n var fromDegreesArray = [];\n if (this.options.noseToTail && this.options.noseToTail !== 'false') {\n newPositions = [].concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default()(positions), [positions[0]]);\n } else {\n newPositions = _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default()(positions);\n }\n if (this.options.smooth && this.options.smooth !== 'false') {\n newPositions = this.smoothHandle(newPositions);\n for (var _i15 = 0; _i15 < newPositions.length; _i15++) {\n fromDegreesArray.push(newPositions[_i15].lng, newPositions[_i15].lat, newPositions[_i15].alt);\n }\n } else {\n for (var _i16 = 0; _i16 < newPositions.length; _i16++) {\n fromDegreesArray.push(newPositions[_i16].lng, newPositions[_i16].lat, newPositions[_i16].alt);\n }\n }\n\n // 计算长度\n if (this.options.noseToTail && this.options.noseToTail !== 'false' || this.options.smooth && this.options.smooth !== 'false') {\n var array = [];\n for (var _i17 = 0; _i17 < fromDegreesArray.length; _i17 += 3) {\n array.push({\n lng: fromDegreesArray[_i17],\n lat: fromDegreesArray[_i17 + 1],\n alt: fromDegreesArray[_i17 + 2]\n });\n }\n var _this15 = this;\n this.computeDistance(array, 2, this.options.wordsName).then(function (res) {\n _this15.lengthByMeter = res;\n _this16.lengthChangeCallBack && _this16.lengthChangeCallBack();\n cd && cd();\n });\n } else {\n var _this17 = this;\n this.computeDistance(positions, 2, this.options.wordsName).then(function (res) {\n _this17.lengthByMeter = res;\n _this16.lengthChangeCallBack && _this16.lengthChangeCallBack();\n cd && cd();\n });\n }\n return fromDegreesArray;\n }\n\n // 更新多边形(线扩展)\n }, {\n key: \"renewPolygon\",\n value: function renewPolygon(fromDegreesArray) {\n var linePositions = [];\n if (this.options.extend && this.options.extend !== 'false') {\n var outerHole = [];\n for (var i = 0; i < fromDegreesArray.length; i += 3) {\n linePositions.push([fromDegreesArray[i], fromDegreesArray[i + 1]]);\n }\n var linestring = turf.lineString(linePositions);\n var buffered = turf.buffer(linestring, this.options.extendWidth / 1000, {\n units: 'kilometers'\n });\n for (var _i18 = 0; _i18 < buffered.geometry.coordinates[0].length; _i18++) {\n outerHole.push(buffered.geometry.coordinates[0][_i18][0], buffered.geometry.coordinates[0][_i18][1]);\n }\n var holes = []; // 孔\n for (var _i19 = 1; _i19 < buffered.geometry.coordinates.length; _i19++) {\n var array = [];\n for (var m = 0; m < buffered.geometry.coordinates[_i19].length; m++) {\n array.push(buffered.geometry.coordinates[_i19][m][0], buffered.geometry.coordinates[_i19][m][1]);\n }\n holes.push({\n positions: Cesium.Cartesian3.fromDegreesArray(array)\n });\n }\n this.entity.polygon = new Cesium.PolygonGraphics({\n hierarchy: {\n positions: Cesium.Cartesian3.fromDegreesArray(outerHole),\n holes: holes\n },\n material: Cesium.Color.fromCssColorString(this.options.extendColor)\n });\n } else {\n this.entity.polygon = undefined;\n }\n }\n }, {\n key: \"reset\",\n value: function () {\n var _reset = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee2() {\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee2$(_context2) {\n while (1) switch (_context2.prev = _context2.next) {\n case 0:\n if (this.entity) {\n _context2.next = 2;\n break;\n }\n return _context2.abrupt(\"return\");\n case 2:\n this.options = this.deepCopyObj(this.originalOptions);\n this.name = this.originalOptions.name;\n this.color = this.originalOptions.color;\n this.lineWidth = this.originalOptions.width;\n this.lineType = this.originalOptions.type;\n this.noseToTail = this.originalOptions.noseToTail;\n this.smooth = this.originalOptions.smooth;\n this.extend = this.originalOptions.extend;\n this.extendWidth = this.originalOptions.extendWidth;\n this.extendColor = this.originalOptions.extendColor;\n this.labelShow = this.originalOptions.label.show;\n this.labelColor = this.originalOptions.label.color;\n this.labelFontSize = this.originalOptions.label.fontSize;\n this.labelFontFamily = this.originalOptions.label.fontFamily;\n this.labelLineWidth = this.originalOptions.label.lineWidth;\n this.labelPixelOffset = this.originalOptions.label.pixelOffset;\n this.labelLineColor = this.originalOptions.label.lineColor;\n this.labelBackgroundColorStart = this.originalOptions.label.backgroundColor[0];\n this.labelBackgroundColorEnd = this.originalOptions.label.backgroundColor[1];\n // this.attributeVr = this.options.attribute.vr.content\n // this.attributeCamera = this.options.attribute.camera.content\n // this.attributeGoods = this.options.attribute.goods.content\n this.rotate = this.originalOptions.rotate;\n this.speed = this.originalOptions.speed;\n // this.dashSize = this.originalOptions.dashSize\n this.space = this.originalOptions.space;\n // this.cameraSelect && this.cameraSelect()\n // this.goodsSelect && this.goodsSelect()\n\n this.heightMode = this.options.heightMode;\n\n // let height\n // if (this.ground) {\n // height = await that.getClampToHeight({\n // lng: this.options.positions[0].lng,\n // lat: this.options.positions[0].lat\n // })\n // } else {\n // height = this.options.positions[0].alt\n // }\n // this.options.label.position = {\n // lng: this.options.positions[0].lng,\n // lat: this.options.positions[0].lat,\n // alt: height\n // }\n // this.label.position = [\n // this.options.label.position.lng,\n // this.options.label.position.lat,\n // this.options.label.position.alt\n // ]\n case 25:\n case \"end\":\n return _context2.stop();\n }\n }, _callee2, this);\n }));\n function reset() {\n return _reset.apply(this, arguments);\n }\n return reset;\n }() // _addRr() {\n // if (\n // this._DialogObject._element.content.getElementsByClassName(\n // 'vr_add'\n // )[0].value\n // ) {\n // this.options.attribute.vr.content.push({\n // name: '全景图' + (this.options.attribute.vr.content.length + 1),\n // url: this._DialogObject._element.content.getElementsByClassName(\n // 'vr_add'\n // )[0].value\n // })\n // this._DialogObject._element.content.getElementsByClassName(\n // 'vr_add'\n // )[0].value = ''\n // this.attributeVr = this.options.attribute.vr.content\n // } else {\n // this.Dialog.clickAddVr && this.Dialog.clickAddVr()\n // }\n // }\n // addAttributeRr(vr) {\n // this.options.attribute.vr.content.push({\n // name: '全景图' + (this.options.attribute.vr.content.length + 1),\n // url: vr\n // })\n // this.attributeVr = this.options.attribute.vr.content\n // }\n /**\r\n * 飞到\r\n */\n }, {\n key: \"flyTo\",\n value: function () {\n var _flyTo = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee3() {\n var options,\n orientation,\n lng,\n lat,\n alt,\n destination,\n position,\n positionArray,\n height,\n i,\n a,\n _i20,\n _a,\n _i21,\n _a2,\n BoundingSphere,\n _args3 = arguments;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee3$(_context3) {\n while (1) switch (_context3.prev = _context3.next) {\n case 0:\n options = _args3.length > 0 && _args3[0] !== undefined ? _args3[0] : {};\n if (!this._error) {\n _context3.next = 3;\n break;\n }\n return _context3.abrupt(\"return\");\n case 3:\n Object(_Global_global__WEBPACK_IMPORTED_MODULE_23__[\"setActiveViewer\"])(0);\n Object(_Global_global__WEBPACK_IMPORTED_MODULE_23__[\"closeRotateAround\"])(this.sdk);\n Object(_Global_global__WEBPACK_IMPORTED_MODULE_23__[\"closeViewFollow\"])(this.sdk);\n if (!(this.options.customView && this.options.customView.relativePosition && this.options.customView.orientation)) {\n _context3.next = 25;\n break;\n }\n orientation = {\n heading: Cesium.Math.toRadians(this.options.customView.orientation.heading || 0.0),\n pitch: Cesium.Math.toRadians(this.options.customView.orientation.pitch || -60.0),\n roll: Cesium.Math.toRadians(this.options.customView.orientation.roll || 0.0)\n };\n lng = this.options.customView.relativePosition.lng;\n lat = this.options.customView.relativePosition.lat;\n alt = this.options.customView.relativePosition.alt;\n destination = Cesium.Cartesian3.fromDegrees(lng, lat, alt);\n position = {\n lng: 0,\n lat: 0\n };\n if (this.options.position) {\n position = _objectSpread({}, this.options.position);\n } else if (this.options.positions) {\n position = _objectSpread({}, this.options.positions[0]);\n } else if (this.options.center) {\n position = _objectSpread({}, this.options.center);\n } else if (this.options.start) {\n position = _objectSpread({}, this.options.start);\n } else {\n if (this.options.hasOwnProperty('lng')) {\n position.lng = this.options.lng;\n }\n if (this.options.hasOwnProperty('lat')) {\n position.lat = this.options.lat;\n }\n if (this.options.hasOwnProperty('alt')) {\n position.alt = this.options.alt;\n }\n }\n // 如果没有高度值,则获取紧贴高度计算\n if (position.hasOwnProperty('alt')) {\n _context3.next = 18;\n break;\n }\n _context3.next = 17;\n return this.getClampToHeight(position);\n case 17:\n position.alt = _context3.sent;\n case 18:\n lng = this.options.customView.relativePosition.lng + position.lng;\n lat = this.options.customView.relativePosition.lat + position.lat;\n alt = this.options.customView.relativePosition.alt + position.alt;\n destination = Cesium.Cartesian3.fromDegrees(lng, lat, alt);\n this.sdk.viewer.camera.flyTo({\n destination: destination,\n orientation: orientation\n });\n _context3.next = 43;\n break;\n case 25:\n positionArray = [];\n _context3.t0 = this.options.heightMode;\n _context3.next = _context3.t0 === '0' ? 29 : _context3.t0 === 0 ? 29 : _context3.t0 === '1' ? 31 : _context3.t0 === 1 ? 31 : _context3.t0 === '2' ? 36 : _context3.t0 === 2 ? 36 : 41;\n break;\n case 29:\n for (i = 0; i < this.options.positions.length; i++) {\n a = Cesium.Cartesian3.fromDegrees(this.options.positions[i].lng, this.options.positions[i].lat, this.options.positions[i].alt);\n positionArray.push(a.x, a.y, a.z);\n }\n return _context3.abrupt(\"break\", 41);\n case 31:\n _context3.next = 33;\n return this.getClampToHeight(this.options.positions[0]);\n case 33:\n height = _context3.sent;\n for (_i20 = 0; _i20 < this.options.positions.length; _i20++) {\n _a = Cesium.Cartesian3.fromDegrees(this.options.positions[_i20].lng, this.options.positions[_i20].lat, height + this.options.positions[_i20].alt);\n positionArray.push(_a.x, _a.y, _a.z);\n }\n return _context3.abrupt(\"break\", 41);\n case 36:\n _context3.next = 38;\n return this.getClampToHeight(this.options.positions[0]);\n case 38:\n height = _context3.sent;\n for (_i21 = 0; _i21 < this.options.positions.length; _i21++) {\n _a2 = Cesium.Cartesian3.fromDegrees(this.options.positions[_i21].lng, this.options.positions[_i21].lat, height);\n positionArray.push(_a2.x, _a2.y, _a2.z);\n }\n return _context3.abrupt(\"break\", 41);\n case 41:\n BoundingSphere = Cesium.BoundingSphere.fromVertices(positionArray);\n this.sdk.viewer.camera.flyToBoundingSphere(BoundingSphere, {\n offset: options.orientation || {\n heading: Cesium.Math.toRadians(0.0),\n pitch: Cesium.Math.toRadians(-90.0),\n roll: Cesium.Math.toRadians(0.0)\n }\n });\n case 43:\n case \"end\":\n return _context3.stop();\n }\n }, _callee3, this);\n }));\n function flyTo() {\n return _flyTo.apply(this, arguments);\n }\n return flyTo;\n }() // static nodeEdit2(that, cb = () => { }) {\n // that.positionEditing = false\n // if (YJ.Measure.GetMeasureStatus()) {\n // cb('上一次测量未结束')\n // } else {\n // YJ.Measure.SetMeasureStatus(true)\n // that.tip = new MouseTip('请选择一个顶点,右键取消', that.sdk)\n // that.event = new MouseEvent(that.sdk)\n // that.nodePoints = []\n // let selectPoint\n // let originalPosition\n // let newpositions = []\n // let fromDegreesArray = []\n // for (let i = 0; i < that.options.positions.length; i++) {\n // fromDegreesArray.push(\n // that.options.positions[i].lng,\n // that.options.positions[i].lat,\n // that.options.positions[i].alt\n // )\n // }\n // newpositions = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray)\n // that.event.mouse_left((movement, cartesian) => {\n // if (selectPoint) {\n // that.options.positions[selectPoint.index] = that.cartesian3Towgs84(\n // cartesian,\n // that.sdk.viewer\n // )\n // originalPosition = that.options.positions[selectPoint.index]\n // let entity = that.sdk.viewer.entities.add({\n // name: 'node-secondary-edit-point',\n // position: Cesium.Cartesian3.fromDegrees(\n // that.options.positions[selectPoint.index].lng,\n // that.options.positions[selectPoint.index].lat,\n // that.options.positions[selectPoint.index].alt\n // ),\n // billboard: {\n // image: that.getSourceRootPath() + '/img/point.png',\n // width: 15,\n // height: 15,\n // disableDepthTestDistance: Number.POSITIVE_INFINITY\n // }\n // })\n // that.nodePoints.splice(selectPoint.index, 0, entity)\n // that.options.positions.splice(\n // selectPoint.index,\n // 0,\n // that.options.positions[selectPoint.index]\n // )\n // let fromDegreesArray = that.renewPositions(that.options.positions)\n // that.renewPolygon(fromDegreesArray)\n // that.options.lengthByMeter = that.computeDistance(\n // that.options.positions,\n // 2,\n // that.ground\n // )\n // that.lengthUnit = that.options.lengthUnit\n // } else {\n // var pick = that.sdk.viewer.scene.pick(movement.position)\n // if (\n // pick &&\n // pick.id &&\n // pick.id.name &&\n // pick.id.name === 'node-secondary-edit-point'\n // ) {\n // selectPoint = pick.id\n // that.nodePoints.splice(pick.id.index, 1)\n // that.sdk.viewer.entities.remove(pick.id)\n // that.tip.set_text('左键开始,右键结束,CTRL+右键撤销')\n // originalPosition = that.cartesian3Towgs84(\n // cartesian,\n // that.sdk.viewer\n // )\n // }\n // }\n // })\n // that.event.mouse_right((movement, cartesian) => {\n // if (selectPoint) {\n // that.options.positions[selectPoint.index] = originalPosition\n // cb(null, that.options.positions)\n // }\n // let positions = that.options.positions\n // let fromDegreesArray = []\n // for (let i = 0; i < positions.length; i++) {\n // fromDegreesArray.push(\n // positions[i].lng,\n // positions[i].lat,\n // positions[i].alt\n // )\n // }\n // newpositions = Cesium.Cartesian3.fromDegreesArrayHeights(\n // fromDegreesArray\n // )\n // for (let i = 0; i < that.nodePoints.length; i++) {\n // that.sdk.viewer.entities.remove(that.nodePoints[i])\n // }\n // that.nodePoints = []\n // that.event.destroy()\n // that.tip.destroy()\n // })\n // that.event.mouse_move((movement, cartesian) => {\n // if (selectPoint) {\n // that.options.positions[selectPoint.index] = that.cartesian3Towgs84(\n // cartesian,\n // that.sdk.viewer\n // )\n // let positions = that.options.positions\n // let fromDegreesArray = []\n // for (let i = 0; i < positions.length; i++) {\n // fromDegreesArray.push(\n // positions[i].lng,\n // positions[i].lat,\n // positions[i].alt\n // )\n // }\n // newpositions = Cesium.Cartesian3.fromDegreesArrayHeights(\n // fromDegreesArray\n // )\n // if (that.options.positions.length === 1) {\n // that.label.position = [\n // that.options.positions[0].lng,\n // that.options.positions[0].lat,\n // that.options.positions[0].alt\n // ]\n // that.options.label.position = {\n // lng: that.options.positions[0].lng,\n // lat: that.options.positions[0].lat,\n // alt: that.options.positions[0].alt\n // }\n // }\n // }\n // that.tip.setPosition(\n // cartesian,\n // movement.endPosition.x,\n // movement.endPosition.y\n // )\n // })\n // that.event.mouse_right_keyboard_ctrl((movement, cartesian) => {\n // if (selectPoint) {\n // that.options.positions.pop()\n // that.sdk.viewer.entities.remove(\n // that.nodePoints[that.nodePoints.length - 1]\n // )\n // that.nodePoints.pop()\n // if (selectPoint.index === that.options.positions.length) {\n // if (that.nodePoints[selectPoint.index - 1]) {\n // selectPoint = that.nodePoints[selectPoint.index - 1]\n // } else {\n // selectPoint.index = 0\n // }\n // }\n // }\n // })\n // that.entity.polyline.positions = new Cesium.CallbackProperty(function () {\n // return newpositions\n // }, false)\n // for (let i = 0; i < that.options.positions.length; i++) {\n // let entity = that.sdk.viewer.entities.add({\n // name: 'node-secondary-edit-point',\n // index: i,\n // position: Cesium.Cartesian3.fromDegrees(\n // that.options.positions[i].lng,\n // that.options.positions[i].lat,\n // that.options.positions[i].alt\n // ),\n // billboard: {\n // image: that.getSourceRootPath() + '/img/point.png',\n // width: 15,\n // height: 15,\n // disableDepthTestDistance: Number.POSITIVE_INFINITY\n // }\n // })\n // that.nodePoints.push(entity)\n // }\n // }\n // }\n }, {\n key: \"nodeEdit\",\n value: function nodeEdit(cb) {\n var _this18 = this;\n this.positionEditing = false;\n this.noseToTail = false;\n // this.smooth = false\n this.heightMode = 0;\n if (YJ.Measure.GetMeasureStatus()) {} else {\n this.closeNodeEdit();\n YJ.Measure.SetMeasureStatus(true);\n this._nodeEditCallback = cb;\n this.tip = new _MouseTip__WEBPACK_IMPORTED_MODULE_17__[\"default\"]('请选择一个顶点,右键取消', this.sdk);\n this.event = new _Event_index__WEBPACK_IMPORTED_MODULE_16__[\"default\"](this.sdk);\n this.ControllerObject = new _Controller_index__WEBPACK_IMPORTED_MODULE_18__[\"default\"](this.sdk);\n var selectPoint;\n this.event.mouse_left(function (movement, cartesian) {\n var pick = _this18.sdk.viewer.scene.pick(movement.position);\n if (pick && pick.id && pick.id.name && pick.id.name === 'node-secondary-edit-point') {\n selectPoint = pick.id;\n _this18.ControllerObject.position = _this18.options.positions[selectPoint.index];\n _this18.ControllerObject.editTranslational();\n _this18.tip && _this18.tip.destroy();\n _this18.ControllerObject.controllerCallBack = function (params) {\n if (selectPoint.index === 0) {\n _this18.label.position = [params.position.lng, params.position.lat, params.position.alt];\n _this18.options.label.position = {\n lng: params.position.lng,\n lat: params.position.lat,\n alt: params.position.alt\n };\n }\n _this18.options.positions[selectPoint.index] = params.position;\n _this18._elms.lng && (_this18._elms.lng[selectPoint.index].innerHTML = params.position.lng.toFixed(8));\n _this18._elms.lngInput && (_this18._elms.lngInput[selectPoint.index].value = params.position.lng.toFixed(8));\n _this18._elms.lat && (_this18._elms.lat[selectPoint.index].innerHTML = params.position.lat.toFixed(8));\n _this18._elms.latInput && (_this18._elms.latInput[selectPoint.index].value = params.position.lat.toFixed(8));\n _this18._elms.alt && (_this18._elms.alt[selectPoint.index].innerHTML = params.position.alt.toFixed(2));\n _this18._elms.altInput && (_this18._elms.altInput[selectPoint.index].value = params.position.alt.toFixed(2));\n selectPoint.position = Cesium.Cartesian3.fromDegrees(params.position.lng, params.position.lat, params.position.alt);\n };\n }\n });\n this.event.mouse_right(function (movement, cartesian) {\n for (var i = 0; i < _this18.nodePoints.length; i++) {\n _this18.sdk.viewer.entities.remove(_this18.nodePoints[i]);\n }\n _this18.nodePoints = [];\n _this18.event.destroy();\n _this18.tip && _this18.tip.destroy();\n _this18.tip = null;\n _this18.ControllerObject.destroy();\n var fromDegreesArray = _this18.renewPositions(_this18.options.positions);\n _this18.entity.polyline.positions = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray);\n YJ.Measure.SetMeasureStatus(false);\n _this18._nodeEditCallback = null;\n });\n this.event.mouse_move(function (movement, cartesian) {\n _this18.tip.setPosition(cartesian, movement.endPosition.x, movement.endPosition.y);\n });\n this.entity.polyline.positions = new Cesium.CallbackProperty(function () {\n var fromDegreesArray = _this18.renewPositions(_this18.options.positions);\n _this18._nodeEditCallback(_this18.options.positions, _this18.lengthByMeter);\n return Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray);\n }, false);\n for (var i = 0; i < this.options.positions.length; i++) {\n var entity = this.sdk.viewer.entities.add({\n name: 'node-secondary-edit-point',\n index: i,\n position: Cesium.Cartesian3.fromDegrees(this.options.positions[i].lng, this.options.positions[i].lat, this.options.positions[i].alt),\n billboard: {\n image: this.getSourceRootPath() + '/img/point.png',\n width: 15,\n height: 15,\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\n color: Cesium.Color.WHITE.withAlpha(0.99)\n }\n });\n this.nodePoints.push(entity);\n }\n }\n }\n }, {\n key: \"closeNodeEdit\",\n value: function closeNodeEdit() {\n YJ.Measure.SetMeasureStatus(false);\n this.ControllerObject && this.ControllerObject.destroy();\n this.event && this.event.destroy();\n this.tip && this.tip.destroy();\n this.tip = null;\n for (var i = 0; i < this.nodePoints.length; i++) {\n this.sdk.viewer.entities.remove(this.nodePoints[i]);\n }\n this.nodePoints = [];\n this._nodeEditCallback = null;\n }\n\n /**\r\n * 删除\r\n */\n }, {\n key: \"remove\",\n value: (function () {\n var _remove = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee4() {\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee4$(_context4) {\n while (1) switch (_context4.prev = _context4.next) {\n case 0:\n this.event && this.event.destroy();\n this.tip && this.tip.destroy();\n this.label && this.label.remove();\n this.sdk.viewer.entities.remove(this.entity);\n this.entity = null;\n if (this._DialogObject && !this._DialogObject.isDestroy) {\n this._DialogObject.close();\n this._DialogObject = null;\n }\n _context4.next = 8;\n return this.sdk.removeIncetance(this.options.id);\n case 8:\n _context4.next = 10;\n return Object(_Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_19__[\"syncData\"])(this.sdk, this.options.id);\n case 10:\n case \"end\":\n return _context4.stop();\n }\n }, _callee4, this);\n }));\n function remove() {\n return _remove.apply(this, arguments);\n }\n return remove;\n }()\n /**@desc 打开平移功能\r\n *\r\n * @memberOf Source\r\n * @param status {boolean}\r\n *\r\n * */\n )\n }, {\n key: \"positionEditing\",\n get: function get() {\n return this.operate.positionEditing;\n },\n set: function set(status) {\n var _this19 = this;\n if (YJ.Measure.GetMeasureStatus() || !this.sdk || !this.sdk.viewer || !this.entity) {\n return;\n }\n this.operate.positionEditing = status;\n if (status === true) {\n this.closeNodeEdit();\n this.event && this.event.destroy();\n this.event = new _Event_index__WEBPACK_IMPORTED_MODULE_16__[\"default\"](this.sdk);\n this.tip && this.tip.destroy();\n this.tip = new _MouseTip__WEBPACK_IMPORTED_MODULE_17__[\"default\"]('点击鼠标左键确认,右键取消', this.sdk);\n this.label && (this.label.entity.billboard.color = Cesium.Color.fromCssColorString(\"rgba(255,255,255,0.9)\"));\n this.picking = false;\n var positions = JSON.parse(JSON.stringify(this.options.positions));\n // let positions2 = JSON.parse(JSON.stringify(positions))\n // for (let i = 0; i < positions2.length; i++) {\n // let height = this.sdk.viewer.scene.globe.getHeight(Cesium.Cartographic.fromDegrees(positions2[i].lng, positions2[i].lat))\n // positions2[i] = Cesium.Cartesian3.fromDegrees(\n // positions2[i].lng,\n // positions2[i].lat,\n // Number((positions2[i].alt + Number(height)).toFixed(2))\n // )\n // }\n this.previous = {\n positions: _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default()(this.options.positions)\n };\n for (var i = 0; i < positions.length; i++) {\n positions[i] = Cesium.Cartesian3.fromDegrees(positions[i].lng, positions[i].lat, positions[i].alt);\n }\n var center = positions[Math.floor(positions.length / 2)];\n var disparity = [];\n for (var _i22 = 0; _i22 < positions.length; _i22++) {\n center.x - positions[_i22].x;\n disparity.push({\n x: center.x - positions[_i22].x,\n y: center.y - positions[_i22].y,\n z: center.z - positions[_i22].z\n });\n }\n var newpositions = [];\n this.event.mouse_move(function (movement, cartesian) {\n newpositions = [];\n for (var _i23 = 0; _i23 < disparity.length; _i23++) {\n var newP = {\n x: cartesian.x - disparity[_i23].x,\n y: cartesian.y - disparity[_i23].y,\n z: cartesian.z - disparity[_i23].z\n };\n // let pos84 = this.cartesian3Towgs84(\n // newP,\n // this.sdk.viewer\n // )\n // let height = this.sdk.viewer.scene.globe.getHeight(Cesium.Cartographic.fromDegrees(pos84.lng, pos84.lat))\n // pos84.alt = Number((pos84.alt + Number(height)).toFixed(2))\n // newP = Cesium.Cartesian3.fromDegrees(\n // pos84.lng,\n // pos84.lat,\n // pos84.alt\n // )\n newpositions.push(newP);\n }\n var position84 = _this19.cartesian3Towgs84(newpositions[0], _this19.sdk.viewer);\n _this19.label.position = [position84.lng, position84.lat, position84.alt];\n _this19.options.label.position = {\n lng: position84.lng,\n lat: position84.lat,\n alt: position84.alt\n };\n _this19.tip.setPosition(cartesian, movement.endPosition.x, movement.endPosition.y);\n });\n this.event.mouse_left(function (movement, cartesian) {\n _this19.event.mouse_move(function () {});\n _this19.event.mouse_left(function () {});\n _this19.event.mouse_right(function () {});\n newpositions = [];\n for (var _i24 = 0; _i24 < disparity.length; _i24++) {\n newpositions.push({\n x: cartesian.x - disparity[_i24].x,\n y: cartesian.y - disparity[_i24].y,\n z: cartesian.z - disparity[_i24].z\n });\n }\n var positionsLngLat = [];\n for (var _i25 = 0; _i25 < newpositions.length; _i25++) {\n var position = _this19.cartesian3Towgs84(newpositions[_i25], _this19.sdk.viewer);\n position.alt = _this19.options.positions[_i25].alt;\n positionsLngLat.push(position);\n _this19._elms.lng && (_this19._elms.lng[_i25].innerHTML = position.lng.toFixed(8));\n _this19._elms.lngInput && (_this19._elms.lngInput[_i25].value = position.lng.toFixed(8));\n _this19._elms.lat && (_this19._elms.lat[_i25].innerHTML = position.lat.toFixed(8));\n _this19._elms.latInput && (_this19._elms.latInput[_i25].value = position.lat.toFixed(8));\n _this19._elms.alt && (_this19._elms.alt[_i25].innerHTML = position.alt.toFixed(2));\n _this19._elms.altInput && (_this19._elms.altInput[_i25].value = position.alt.toFixed(2));\n }\n _this19.options.positions = positionsLngLat;\n _this19.previous.positions = positionsLngLat;\n\n // this.entity.polyline.positionsLngLat = positionsLngLat\n var fromDegreesArray = _this19.renewPositions(_this19.options.positions, function () {\n if (_this19._positionEditingCallback) {\n _this19._positionEditingCallback();\n _this19._positionEditingCallback = null;\n }\n });\n _this19.entity.polyline.positions = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray);\n _this19.renewPolygon(fromDegreesArray);\n _this19.positionEditing = false;\n });\n this.event.mouse_right(function (movement, cartesian) {\n _this19.event.mouse_move(function () {});\n _this19.event.mouse_left(function () {});\n _this19.event.mouse_right(function () {});\n _this19.positionEditing = false;\n });\n this.event.gesture_pinck_start(function (movement, cartesian) {\n var startTime = new Date();\n _this19.event.gesture_pinck_end(function () {\n var endTime = new Date();\n var pos = {\n position: {\n x: (movement.position1.x + movement.position2.x) / 2,\n y: (movement.position1.y + movement.position2.y) / 2\n }\n };\n if (endTime - startTime >= 500) {\n // 长按取消\n _this19.event.mouse_move(function () {});\n _this19.event.mouse_left(function () {});\n _this19.event.mouse_right(function () {});\n _this19.positionEditing = false;\n } else {\n leftEvent(pos, cartesian);\n }\n });\n });\n this.entity.polyline.positions = new Cesium.CallbackProperty(function () {\n if (newpositions.length > 0) {\n return newpositions;\n } else {\n return positions;\n }\n }, false);\n } else {\n if (!this.sdk || !this.sdk.viewer || !this.label || !this.label.entity) {\n this.label.entity.billboard.color = Cesium.Color.fromCssColorString(\"rgba(255,255,255,1)\");\n }\n this.picking = true;\n if (this.event) {\n this.event.mouse_move(function () {});\n this.event.mouse_left(function () {});\n this.event.mouse_right(function () {});\n this.event.destroy();\n }\n this.tip && this.tip.destroy();\n var fromDegreesArray = this.renewPositions(this.options.positions);\n this.entity.polyline.positions = Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray);\n this.renewPolygon(fromDegreesArray);\n switch (this.heightMode) {\n case 0:\n case '0':\n case 1:\n case '1':\n this.label.position = [this.options.positions[0].lng, this.options.positions[0].lat, fromDegreesArray[2]];\n this.options.label.position = {\n lng: this.options.positions[0].lng,\n lat: this.options.positions[0].lat,\n alt: fromDegreesArray[2]\n };\n break;\n case 2:\n case '2':\n this.label.position = [this.options.positions[0].lng, this.options.positions[0].lat];\n this.options.label.position = {\n lng: this.options.positions[0].lng,\n lat: this.options.positions[0].lat,\n alt: fromDegreesArray[2]\n };\n break;\n }\n }\n }\n }, {\n key: \"openPositionEditing\",\n value: function openPositionEditing(cd) {\n this.positionEditing = true;\n this._positionEditingCallback = cd;\n }\n }, {\n key: \"lengthChangeCallBack\",\n get: function get() {\n return this._lengthChangeCallBack;\n },\n set: function set(cd) {\n this._lengthChangeCallBack = cd;\n }\n }, {\n key: \"setDIV\",\n value: function setDIV() {\n var _Cesium$Cartesian,\n _this20 = this;\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {\n domid: '',\n x: 10,\n y: 10\n };\n options.x = options.x || options.x === 0 ? options.x : 10;\n options.y = options.y || options.y === 0 ? options.y : 10;\n var points = [];\n for (var i = 0; i < this.options.positions.length; i++) {\n points.push([this.options.positions[i].lng, this.options.positions[i].lat]);\n }\n var line = turf.lineString(points);\n var length = turf.length(line, {\n units: 'kilometers'\n });\n var sliced = turf.lineSliceAlong(line, 0, length / 2, {\n units: 'kilometers'\n });\n var siteInfoDom = document.getElementById(options.domid);\n var siteInfoPosition = (_Cesium$Cartesian = Cesium.Cartesian3).fromDegrees.apply(_Cesium$Cartesian, _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default()(sliced.geometry.coordinates[sliced.geometry.coordinates.length - 1]));\n this.sdk.viewer.scene.postRender.addEventListener(function (percentage) {\n //转换到屏幕坐标\n if (siteInfoDom.style.display === 'block' || siteInfoDom.style.display === '') {\n var winpos = _this20.sdk.viewer.scene.cartesianToCanvasCoordinates(siteInfoPosition);\n if (winpos) {\n siteInfoDom.style.left = (winpos.x + options.x).toFixed(0) + 'px';\n siteInfoDom.style.top = (winpos.y + options.y).toFixed(0) + 'px';\n }\n }\n });\n }\n }], [{\n key: \"createLabel\",\n value: function () {\n var _createLabel = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee5(that) {\n var height, ground;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee5$(_context5) {\n while (1) switch (_context5.prev = _context5.next) {\n case 0:\n _context5.t0 = that.options.heightMode;\n _context5.next = _context5.t0 === '0' ? 3 : _context5.t0 === 0 ? 3 : _context5.t0 === '1' ? 6 : _context5.t0 === 1 ? 6 : _context5.t0 === '2' ? 13 : _context5.t0 === 2 ? 13 : 18;\n break;\n case 3:\n ground = false;\n height = that.options.positions[0].alt;\n return _context5.abrupt(\"break\", 18);\n case 6:\n ground = false;\n _context5.next = 9;\n return that.getClampToHeight({\n lng: that.options.positions[0].lng,\n lat: that.options.positions[0].lat\n });\n case 9:\n _context5.t1 = _context5.sent;\n _context5.t2 = that.options.positions[0].alt;\n height = _context5.t1 + _context5.t2;\n return _context5.abrupt(\"break\", 18);\n case 13:\n ground = true;\n _context5.next = 16;\n return that.getClampToHeight({\n lng: that.options.positions[0].lng,\n lat: that.options.positions[0].lat\n });\n case 16:\n height = _context5.sent;\n return _context5.abrupt(\"break\", 18);\n case 18:\n if (!that.options.label.position) {\n that.options.label.position = {\n lng: that.options.positions[0].lng,\n lat: that.options.positions[0].lat,\n alt: height\n };\n }\n that.label = new _LabelObject__WEBPACK_IMPORTED_MODULE_15__[\"default\"](that.sdk, {\n id: that.options.id,\n show: that.options.show ? that.options.label.show : false,\n position: [that.options.label.position.lng, that.options.label.position.lat, that.options.label.position.alt],\n text: that.options.name,\n fontSize: that.options.label.fontSize,\n fontFamily: that.options.label.fontFamily,\n color: that.options.label.color,\n pixelOffset: that.options.label.pixelOffset,\n backgroundColor: that.options.label.backgroundColor,\n lineColor: that.options.label.lineColor,\n lineWidth: that.options.label.lineWidth,\n scaleByDistance: that.options.label.scaleByDistance,\n near: that.options.label.near,\n far: that.options.label.far,\n ground: ground\n });\n case 20:\n case \"end\":\n return _context5.stop();\n }\n }, _callee5);\n }));\n function createLabel(_x2) {\n return _createLabel.apply(this, arguments);\n }\n return createLabel;\n }()\n }, {\n key: \"create\",\n value: function create(that) {\n var ground;\n if (that.heightMode == 2) {\n ground = true;\n } else {\n ground = false;\n }\n var positions = that.options.positions;\n var fromDegreesArray = that.renewPositions(positions);\n that.entity = that.sdk.viewer.entities.add({\n id: that.options.id,\n show: that.options.show,\n polyline: {\n positions: Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray),\n width: that.options.width,\n clampToGround: ground,\n // material: that.getMaterial(that.options.color, that.options.type, that.entity, that.options),\n zIndex: that.sdk._entityZIndex\n }\n });\n that.entity.polyline.oriWidth = that.options.width;\n that.judgeLine(that.entity, that.options);\n var params = _objectSpread({}, that.options);\n params.speed = that.inputSpeed;\n that.entity.polyline.material = that.getMaterial(that.options.color, that.options.type, that.entity, params);\n that.sdk._entityZIndex++;\n PolylineObject.createLabel(that);\n // that.entity.polyline.positionsLngLat = positions\n that.renewPolygon(fromDegreesArray);\n that.computeDistance(positions, 2, that.options.wordsName).then(function (res) {\n that.lengthByMeter = res;\n that.lengthChangeCallBack && that.lengthChangeCallBack();\n Object(_Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_19__[\"syncData\"])(that.sdk, that.options.id);\n });\n if (that.options.show) {\n Object(_Global_SplitScreen__WEBPACK_IMPORTED_MODULE_22__[\"setSplitDirection\"])(0, that.options.id);\n }\n\n // if (this.options.noseToTail) {\n // let array = []\n // for (let i = 0; i < fromDegreesArray.length; i += 2) {\n // array.push({ lng: fromDegreesArray[i], lat: fromDegreesArray[i + 1] })\n // }\n // this.options.fit_length = tool.computeDistance(array)\n // }\n // else {\n // this.options.fit_length = tool.computeDistance(positions)\n // }\n // if (this.options.fit_length_unit === 'km') {\n // this.options.fit_length = this.options.fit_length / 1000\n // }\n\n var scene = that.sdk.viewer.scene;\n }\n }]);\n}(_index__WEBPACK_IMPORTED_MODULE_11__[\"default\"]);\n/* harmony default export */ __webpack_exports__[\"default\"] = (PolylineObject);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvT2JqL0Jhc2UvUG9seWxpbmVPYmplY3QvaW5kZXguanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvT2JqL0Jhc2UvUG9seWxpbmVPYmplY3QvaW5kZXguanM/YmM3OSJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogQGRlc2NyaXB0aW9uIOe6v1xyXG4gKi9cclxuaW1wb3J0IERpYWxvZyBmcm9tICcuLi8uLi9FbGVtZW50L0RpYWxvZydcclxuaW1wb3J0IHsgaHRtbCB9IGZyb20gJy4vX2VsZW1lbnQnXHJcbmltcG9ydCBCYXNlIGZyb20gJy4uL2luZGV4J1xyXG5pbXBvcnQgY3lfdGFicyBmcm9tICcuLi8uLi9FbGVtZW50L2N5X2h0bWxfdGFicydcclxuaW1wb3J0IHJpY2hUZXh0IGZyb20gJy4uLy4uL0VsZW1lbnQvcmljaFRleHQnXHJcbmltcG9ydCBFdmVudEJpbmRpbmcgZnJvbSAnLi9ldmVudEJpbmRpbmcnXHJcbmltcG9ydCBMYWJlbE9iamVjdCBmcm9tICcuLi9MYWJlbE9iamVjdCdcclxuaW1wb3J0IE1vdXNlRXZlbnQgZnJvbSAnLi4vLi4vLi4vRXZlbnQvaW5kZXgnXHJcbmltcG9ydCBNb3VzZVRpcCBmcm9tICcuLi8uLi8uLi9Nb3VzZVRpcCdcclxuaW1wb3J0IENvbnRyb2xsZXIgZnJvbSAnLi4vLi4vLi4vQ29udHJvbGxlci9pbmRleCdcclxuaW1wb3J0IHsgc3luY0RhdGEsIGdldDNEVmlldyB9IGZyb20gJy4uLy4uLy4uL0dsb2JhbC9NdWx0aVZpZXdwb3J0TW9kZSdcclxuaW1wb3J0IHsgbGVncCB9IGZyb20gJy4uLy4uL0VsZW1lbnQvZGF0YWxpc3QnXHJcbmltcG9ydCB7IGdldEZvbnRMaXN0LCBnZXRGb250RmFtaWx5TmFtZSB9IGZyb20gJy4uLy4uL0VsZW1lbnQvZm9udFNlbGVjdCdcclxuaW1wb3J0IHsgc2V0U3BsaXREaXJlY3Rpb24sIHN5bmNTcGxpdERhdGEsIHNldEFjdGl2ZUlkIH0gZnJvbSAnLi4vLi4vLi4vR2xvYmFsL1NwbGl0U2NyZWVuJ1xyXG5pbXBvcnQgeyBzZXRBY3RpdmVWaWV3ZXIsIGNsb3NlUm90YXRlQXJvdW5kLCBjbG9zZVZpZXdGb2xsb3cgfSBmcm9tICcuLi8uLi8uLi9HbG9iYWwvZ2xvYmFsJ1xyXG5cclxuY2xhc3MgUG9seWxpbmVPYmplY3QgZXh0ZW5kcyBCYXNlIHtcclxuICAvKipcclxuICAgKiBAY29uc3RydWN0b3JcclxuICAgKiBAcGFyYW0gc2RrXHJcbiAgICogQGRlc2NyaXB0aW9uIOaKmOe6v1xyXG4gICAqIEBwYXJhbSBvcHRpb25zIHtvYmplY3R9IOe6v+WxnuaAp1xyXG4gICAqIEBwYXJhbSBvcHRpb25zLm5hbWV7c3RyaW5nfSDlkI3np7BcclxuICAgKiBAcGFyYW0gb3B0aW9ucy53aWR0aD0ze251bWJlcn0g57q/5a69XHJcbiAgICogQHBhcmFtIG9wdGlvbnMuY29sb3I9I2ZmMDAwMCB7c3RyaW5nfSDpopzoibJcclxuICAgKiBAcGFyYW0gb3B0aW9ucy50eXBlPTAge251bWJlcn0g5p2Q6LSo57G75Z6LIDAt5a6e57q/IDEt6Jma57q/IDIt5rOb5YWJLi4uXHJcbiAgICogQHBhcmFtIG9wdGlvbnMuaGVpZ2h0TW9kZT0ye251bWJlcn0g6auY5bqm5qih5byP77yIMO+8mua1t+aLlOmrmOW6pu+8mzHvvJrnm7jlr7npq5jluqbvvJsy77ya5L6d6ZmE5qih5byP77yJXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubm9zZVRvVGFpbD1mYWxzZSB7Ym9vbGVhbn0g6aaW5bC+55u46L+eXHJcbiAgICogQHBhcmFtIG9wdGlvbnMuc21vb3RoPWZhbHNlIHtib29sZWFufSDnur/mrrXlnIbmu5FcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5leHRlbmQ9ZmFsc2Uge2Jvb2xlYW59IOe6v+e8k+WGslxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmV4dGVuZFdpZHRoPTEwIHtudW1iZXJ9IOe6v+e8k+WGsuWuveW6plxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmV4dGVuZENvbG9yPXJnYmEoMjU1LDI1NSw4MCwwLjMpIHtudW1iZXJ9IOe6v+e8k+WGsuminOiJslxyXG4gICAqIEBwYXJhbSBvcHRpb25zLnNob3c9dHJ1ZSB7Ym9vbGVhbn0g5pi+6ZqQXHJcbiAgICogQHBhcmFtIHtBcnJheS48b2JqZWN0Pn0gb3B0aW9ucy5wb3NpdGlvbnMg5b+F5aGr77yM57uP57qs5bqm5ZKM6auY5bqm55qE5YiX6KGo77yM5YC85Lqk5pu/IFt7bG9uLGxhdCxhbHR9LC4uLl1cclxuICAgKiBAcGFyYW0gb3B0aW9ucy5wb3NpdGlvbnNbXS5sbmcge251bWJlcn0g57uP5bqmXHJcbiAgICogQHBhcmFtIG9wdGlvbnMucG9zaXRpb25zW10ubGF0IHtudW1iZXJ9IOe6rOW6plxyXG4gICAqIEBwYXJhbSBvcHRpb25zLnBvc2l0aW9uc1tdLmFsdCB7bnVtYmVyfSDpq5jluqZcclxuICAgKiBcclxuICAgKiBcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5ub3NlVG9UYWlsPWZhbHNlIHtib29sZWFufSDmmK/lkKbpppblsL7nm7jov55cclxuICAgKiBcclxuICAgKiBcclxuICAgKiBcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5sYWJlbCB7b2JqZWN0fSDmoIfnrb7lr7nosaFcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5sYWJlbC50ZXh0IHtzdHJpbmd9IOagh+etvuaWh+acrFxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLnNob3cge3N0cmluZ30g5qCH562+5pi+6ZqQXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwucG9zaXRpb24ge3N0cmluZ30g5qCH562+5L2N572uXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwucG9zaXRpb24ge29iamVjdH0g5qCH562+5L2N572uXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwucG9zaXRpb24ubG5nIHtudW1iZXJ9IOe7j+W6plxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLnBvc2l0aW9uLmxhdCB7bnVtYmVyfSDnuqzluqZcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5sYWJlbC5wb3NpdGlvbi5hbHQge251bWJlcn0g6auY5bqmXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwuZm9udFNpemU9MjAge251bWJlcn0g5a2X5L2T5aSn5bCPXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwuZm9udEZhbWlseT0wIHtudW1iZXJ9IOWtl+S9k+mhuSAw77ya6buR5L2T77ybMe+8muaAnea6kOm7keS9k++8mzLvvJrlup7pl6jmraPpgZPmoIfpopjkvZPvvJsz77ya5pWw6buR5L2TXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwuY29sb3I9I2ZmZmZmZiB7c3RyaW5nfSDlrZfkvZPpopzoibJcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5sYWJlbC5saW5lV2lkdGg9NCB7bnVtYmVyfSDlvJXnur/lrr1cclxuICAgKiBAcGFyYW0gb3B0aW9ucy5sYWJlbC5saW5lQ29sb3I9IzAwZmZmZjgwIHtzdHJpbmd9IOW8lee6v+minOiJslxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmxhYmVsLnBpeGVsT2Zmc2V0PTIwIHtudW1iZXJ9IOWtl+S9k+WBj+enuyjlvJXnur/plb/luqYpXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwuYmFja2dyb3VuZENvbG9yPVsnIzAwZmZmZjgwJywgJyMwMGZmZmY4MCddIHthcnJheX0g6IOM5pmv6aKc6ImyXHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwuc2NhbGVCeURpc3RhbmNlIHtib29sZWFufSDot53nprvnvKnmlL5cclxuICAgKiBAcGFyYW0gb3B0aW9ucy5sYWJlbC5uZWFyPTIwMDAge251bWJlcn0g6KeG6YeO57yp5pS+5pyA6L+R6Led56a7XHJcbiAgICogQHBhcmFtIG9wdGlvbnMubGFiZWwuZmFyPTEwMDAwMCB7bnVtYmVyfSDop4bph47nvKnmlL7mnIDov5zot53nprtcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5hdHRyaWJ1dGUge29iamVjdH0g5bGe5oCn5YaF5a65XHJcbiAgICogQHBhcmFtIG9wdGlvbnMuYXR0cmlidXRlLmxpbms9e30ge3N0cmluZ30g6ZO+5o6lXHJcbiAgICogQHBhcmFtIG9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudD1bXV0ge2FycmF5fSDpk77mjqXlhoXlrrlcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50W10ubmFtZSB7c3RyaW5nfSDpk77mjqXlkI3np7BcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50W10udXJsIHtzdHJpbmd9IOmTvuaOpeWcsOWdgFxyXG4gICAqIEBwYXJhbSBvcHRpb25zLnJpY2hUZXh0Q29udGVudCB7c3RyaW5nfSDlr4zmlofmnKzlhoXlrrlcclxuICAgKiBcclxuICAgKiBcclxuICAgKiBAcGFyYW0gX0RpYWxvZyB7b2JqZWN0fSDlvLnmoYbkuovku7ZcclxuICAgKiBAcGFyYW0gX0RpYWxvZy5jb25maXJtQ2FsbEJhY2sge2Z1bmN0aW9ufSDlvLnmoYbnoa7orqTml7bnmoTlm57osINcclxuICAgKiAqL1xyXG4gIGNvbnN0cnVjdG9yKHNkaywgb3B0aW9ucyA9IHt9LCBfRGlhbG9nID0ge30pIHtcclxuICAgIHN1cGVyKHNkaywgb3B0aW9ucylcclxuICAgIHRoaXMub3B0aW9ucy5uYW1lID0gb3B0aW9ucy5uYW1lIHx8ICfmnKrlkb3lkI3lr7nosaEnXHJcbiAgICB0aGlzLm9wdGlvbnMud2lkdGggPSAoKG9wdGlvbnMud2lkdGggfHwgb3B0aW9ucy53aWR0aCA9PT0gMCkgPyBvcHRpb25zLndpZHRoIDogMylcclxuICAgIHRoaXMub3B0aW9ucy5jb2xvciA9IG9wdGlvbnMuY29sb3IgfHwgJyNmZjAwMDAnXHJcbiAgICB0aGlzLm9wdGlvbnMudHlwZSA9IG9wdGlvbnMudHlwZSA/IE51bWJlcihvcHRpb25zLnR5cGUpIDogMFxyXG4gICAgdGhpcy5vcHRpb25zLm5vc2VUb1RhaWwgPSBvcHRpb25zLm5vc2VUb1RhaWwgfHwgZmFsc2VcclxuICAgIHRoaXMub3B0aW9ucy5zbW9vdGggPSBvcHRpb25zLnNtb290aCB8fCBmYWxzZVxyXG4gICAgdGhpcy5vcHRpb25zLmV4dGVuZCA9IG9wdGlvbnMuZXh0ZW5kIHx8IGZhbHNlXHJcbiAgICB0aGlzLm9wdGlvbnMucm90YXRlID0gKG9wdGlvbnMucm90YXRlIHx8IG9wdGlvbnMucm90YXRlID09PSBmYWxzZSkgPyBvcHRpb25zLnJvdGF0ZSA6IHRydWVcclxuICAgIHRoaXMub3B0aW9ucy5zcGFjZSA9IG9wdGlvbnMuc3BhY2UgfHwgMVxyXG4gICAgdGhpcy5vcHRpb25zLnNwZWVkID0gb3B0aW9ucy5zcGVlZCB8fCAxMFxyXG4gICAgLy8gdGhpcy5vcHRpb25zLmRhc2hTaXplID0gb3B0aW9ucy5kYXNoU2l6ZSB8fCAwLjAzXHJcbiAgICB0aGlzLm9wdGlvbnMud29yZHNOYW1lID0gb3B0aW9ucy53b3Jkc05hbWUgfHwgMFxyXG4gICAgdGhpcy5vcHRpb25zLmV4dGVuZFdpZHRoID1cclxuICAgICAgb3B0aW9ucy5leHRlbmRXaWR0aCB8fCBvcHRpb25zLmV4dGVuZFdpZHRoID09PSAwXHJcbiAgICAgICAgPyBvcHRpb25zLmV4dGVuZFdpZHRoXHJcbiAgICAgICAgOiAxMFxyXG4gICAgdGhpcy5vcHRpb25zLmV4dGVuZENvbG9yID0gb3B0aW9ucy5leHRlbmRDb2xvciB8fCAncmdiYSgyNTUsMjU1LDgwLDAuMyknXHJcbiAgICB0aGlzLm9wdGlvbnMuc2hvdyA9XHJcbiAgICAgIG9wdGlvbnMuc2hvdyB8fCBvcHRpb25zLnNob3cgPT09IGZhbHNlID8gb3B0aW9ucy5zaG93IDogdHJ1ZVxyXG4gICAgdGhpcy5vcHRpb25zLmhlaWdodE1vZGUgPSAob3B0aW9ucy5oZWlnaHRNb2RlIHx8IG9wdGlvbnMuaGVpZ2h0TW9kZSA9PSAwKSA/IG9wdGlvbnMuaGVpZ2h0TW9kZSA6IDJcclxuICAgIHRoaXMuX2VsbXMgPSBbXVxyXG4gICAgb3B0aW9ucy5sYWJlbCA9IG9wdGlvbnMubGFiZWwgfHwge31cclxuICAgIHRoaXMub3B0aW9ucy5sYWJlbCA9IHtcclxuICAgICAgdGV4dDogdGhpcy5vcHRpb25zLm5hbWUsXHJcbiAgICAgIHNob3c6IG9wdGlvbnMubGFiZWwuc2hvdyB8fCBmYWxzZSxcclxuICAgICAgcG9zaXRpb246IG9wdGlvbnMubGFiZWwucG9zaXRpb24sXHJcbiAgICAgIGZvbnRTaXplOlxyXG4gICAgICAgIG9wdGlvbnMubGFiZWwuZm9udFNpemUgfHwgb3B0aW9ucy5sYWJlbC5mb250U2l6ZSA9PT0gMFxyXG4gICAgICAgICAgPyBvcHRpb25zLmxhYmVsLmZvbnRTaXplXHJcbiAgICAgICAgICA6IDIwLFxyXG4gICAgICBmb250RmFtaWx5OiBvcHRpb25zLmxhYmVsLmZvbnRGYW1pbHkgPyBvcHRpb25zLmxhYmVsLmZvbnRGYW1pbHkgOiAwLFxyXG4gICAgICBjb2xvcjogb3B0aW9ucy5sYWJlbC5jb2xvciB8fCAnI2ZmZmZmZicsXHJcbiAgICAgIGxpbmVXaWR0aDpcclxuICAgICAgICBvcHRpb25zLmxhYmVsLmxpbmVXaWR0aCB8fCBvcHRpb25zLmxhYmVsLmxpbmVXaWR0aCA9PT0gMFxyXG4gICAgICAgICAgPyBvcHRpb25zLmxhYmVsLmxpbmVXaWR0aFxyXG4gICAgICAgICAgOiA0LFxyXG4gICAgICBwaXhlbE9mZnNldDpcclxuICAgICAgICBvcHRpb25zLmxhYmVsLnBpeGVsT2Zmc2V0IHx8IG9wdGlvbnMubGFiZWwucGl4ZWxPZmZzZXQgPT09IDBcclxuICAgICAgICAgID8gb3B0aW9ucy5sYWJlbC5waXhlbE9mZnNldFxyXG4gICAgICAgICAgOiAyMCxcclxuICAgICAgYmFja2dyb3VuZENvbG9yOiBvcHRpb25zLmxhYmVsLmJhY2tncm91bmRDb2xvciB8fCBbJyMwMGZmZmY4MCcsICcjMDBmZmZmODAnXSxcclxuICAgICAgbGluZUNvbG9yOiBvcHRpb25zLmxhYmVsLmxpbmVDb2xvciB8fCAnIzAwZmZmZjgwJyxcclxuICAgICAgc2NhbGVCeURpc3RhbmNlOiBvcHRpb25zLmxhYmVsLnNjYWxlQnlEaXN0YW5jZSB8fCBmYWxzZSxcclxuICAgICAgbmVhcjpcclxuICAgICAgICBvcHRpb25zLmxhYmVsLm5lYXIgfHwgb3B0aW9ucy5sYWJlbC5uZWFyID09PSAwXHJcbiAgICAgICAgICA/IG9wdGlvbnMubGFiZWwubmVhclxyXG4gICAgICAgICAgOiAyMDAwLFxyXG4gICAgICBmYXI6XHJcbiAgICAgICAgb3B0aW9ucy5sYWJlbC5mYXIgfHwgb3B0aW9ucy5sYWJlbC5mYXIgPT09IDBcclxuICAgICAgICAgID8gb3B0aW9ucy5sYWJlbC5mYXJcclxuICAgICAgICAgIDogMTAwMDAwXHJcbiAgICB9XHJcbiAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlID0gb3B0aW9ucy5hdHRyaWJ1dGUgfHwge31cclxuICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluayA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluayB8fCB7fVxyXG4gICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnQgPVxyXG4gICAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudCB8fCBbXVxyXG4gICAgLy8gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5jYW1lcmEgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmNhbWVyYSB8fCB7fVxyXG4gICAgLy8gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5jYW1lcmEuY29udGVudCA9XHJcbiAgICAvLyAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUuY2FtZXJhLmNvbnRlbnQgfHwgW11cclxuICAgIC8vIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyIHx8IHt9XHJcbiAgICAvLyB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnQgPVxyXG4gICAgLy8gICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnQgfHwgW11cclxuICAgIC8vIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUuZ29vZHMgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmdvb2RzIHx8IHt9XHJcbiAgICAvLyB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmdvb2RzLmNvbnRlbnQgPVxyXG4gICAgLy8gICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmdvb2RzLmNvbnRlbnQgfHwgW11cclxuXHJcbiAgICAgIGRlbGV0ZSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmNhbWVyYVxyXG4gICAgICBkZWxldGUgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52clxyXG4gICAgICBkZWxldGUgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5nb29kc1xyXG5cclxuXHJcbiAgICB0aGlzLm9wZXJhdGUgPSB7fVxyXG4gICAgdGhpcy5ub2RlUG9pbnRzID0gW11cclxuICAgIHRoaXMudW5pdE51bSA9IDBcclxuICAgIHRoaXMuaW5wdXRTcGVlZCA9IChvcHRpb25zLnNwZWVkICYmIE1hdGgucG93KG9wdGlvbnMuc3BlZWQsIC0xKSAqIDEwMCkgfHwgMTBcclxuICAgIHRoaXMuRGlhbG9nID0gX0RpYWxvZ1xyXG4gICAgaWYgKCF0aGlzLm9wdGlvbnMucG9zaXRpb25zIHx8IHRoaXMub3B0aW9ucy5wb3NpdGlvbnMubGVuZ3RoIDwgMikge1xyXG4gICAgICB0aGlzLl9lcnJvciA9ICfnur/mrrXmnIDlsJHpnIDopoHkuKTkuKrlnZDmoIfvvIEnXHJcbiAgICAgIGNvbnNvbGUud2Fybih0aGlzLl9lcnJvcilcclxuICAgICAgd2luZG93LkVMRU1FTlQgJiZcclxuICAgICAgICB3aW5kb3cuRUxFTUVOVC5NZXNzYWdlKHtcclxuICAgICAgICAgIG1lc3NhZ2U6IHRoaXMuX2Vycm9yLFxyXG4gICAgICAgICAgdHlwZTogJ3dhcm5pbmcnLFxyXG4gICAgICAgICAgZHVyYXRpb246IDE1MDBcclxuICAgICAgICB9KVxyXG4gICAgfSBlbHNlIHtcclxuXHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5vcHRpb25zLnBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubG5nID0gTnVtYmVyKE51bWJlcih0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxuZykudG9GaXhlZCg4KSlcclxuICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxhdCA9IE51bWJlcihOdW1iZXIodGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sYXQpLnRvRml4ZWQoOCkpXHJcbiAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5hbHQgPSBOdW1iZXIoTnVtYmVyKHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0uYWx0KS50b0ZpeGVkKDIpKVxyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLnNkay5hZGRJbmNldGFuY2UodGhpcy5vcHRpb25zLmlkLCB0aGlzKVxyXG4gICAgICBQb2x5bGluZU9iamVjdC5jcmVhdGUodGhpcylcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCBjb2xvcigpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuY29sb3JcclxuICB9XHJcbiAgc2V0IGNvbG9yKHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5jb2xvciA9IHYgfHwgJyNmZjAwMDAnXHJcbiAgICBsZXQgcGFyYW1zID0geyAuLi50aGlzLm9wdGlvbnMgfVxyXG4gICAgcGFyYW1zLnNwZWVkID0gdGhpcy5pbnB1dFNwZWVkXHJcbiAgICAvLyB0aGlzLmVudGl0eS5wb2x5bGluZS5tYXRlcmlhbCA9IHRoaXMuZ2V0TWF0ZXJpYWwodGhpcy5vcHRpb25zLmNvbG9yLCB0aGlzLm9wdGlvbnMudHlwZSwgdGhpcy5lbnRpdHksIHRoaXMub3B0aW9ucylcclxuICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLm1hdGVyaWFsID0gdGhpcy5nZXRNYXRlcmlhbCh0aGlzLm9wdGlvbnMuY29sb3IsIHRoaXMub3B0aW9ucy50eXBlLCB0aGlzLmVudGl0eSwgcGFyYW1zKVxyXG4gICAgaWYgKHRoaXMuX2VsbXMuY29sb3IpIHtcclxuICAgICAgdGhpcy5fZWxtcy5jb2xvci5mb3JFYWNoKChpdGVtLCBpKSA9PiB7XHJcbiAgICAgICAgbGV0IGNvbG9yUGlja2VyID0gbmV3IFlKQ29sb3JQaWNrZXIoe1xyXG4gICAgICAgICAgZWw6IGl0ZW0uZWwsXHJcbiAgICAgICAgICBzaXplOiAnbWluaScsIC8v6aKc6ImyYm9457G75Z6LXHJcbiAgICAgICAgICBhbHBoYTogdHJ1ZSwgLy/mmK/lkKblvIDlkK/pgI/mmI7luqZcclxuICAgICAgICAgIGRlZmF1bHRDb2xvcjogdGhpcy5vcHRpb25zLmNvbG9yLFxyXG4gICAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLCAvL+aYr+WQpuemgeatouaJk+W8gOminOiJsumAieaLqeWZqFxyXG4gICAgICAgICAgb3BlblBpY2tlckFuaTogJ29wYWNpdHknLCAvL+aJk+W8gOminOiJsumAieaLqeWZqOWKqOeUu1xyXG4gICAgICAgICAgc3VyZTogYyA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuY29sb3IgPSBjXHJcbiAgICAgICAgICB9LCAvL+eCueWHu+ehruiupOaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICAgICAgY2xlYXI6ICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5jb2xvciA9ICdyZ2JhKDI1NSwwLDAsMSknXHJcbiAgICAgICAgICB9IC8v54K55Ye75riF56m65oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgICAgfSlcclxuICAgICAgICB0aGlzLl9lbG1zLmNvbG9yW2ldID0gY29sb3JQaWNrZXJcclxuICAgICAgfSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCBzcGVlZCgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuc3BlZWRcclxuICB9XHJcblxyXG4gIHNldCBzcGVlZCh2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMuc3BlZWQgPSB2XHJcbiAgICB0aGlzLmlucHV0U3BlZWQgPSB2ICE9PSAwID8gTWF0aC5wb3codiwgLTEpICogMTAwIDogMFxyXG4gICAgbGV0IHBhcmFtcyA9IHsgLi4udGhpcy5vcHRpb25zIH1cclxuICAgIHBhcmFtcy5zcGVlZCA9IHRoaXMuaW5wdXRTcGVlZFxyXG4gICAgLy8gdGhpcy5vcHRpb25zLnNwZWVkID0gdiAhPT0gMCA/IE1hdGgucG93KHYsIC0xKSAqIDEwMCA6IDBcclxuICAgIC8vIHRoaXMuZW50aXR5LnBvbHlsaW5lLm1hdGVyaWFsID0gdGhpcy5nZXRNYXRlcmlhbCh0aGlzLm9wdGlvbnMuY29sb3IsIHRoaXMub3B0aW9ucy50eXBlLCB0aGlzLmVudGl0eSwgdGhpcy5vcHRpb25zKVxyXG4gICAgdGhpcy5lbnRpdHkucG9seWxpbmUubWF0ZXJpYWwgPSB0aGlzLmdldE1hdGVyaWFsKHRoaXMub3B0aW9ucy5jb2xvciwgdGhpcy5vcHRpb25zLnR5cGUsIHRoaXMuZW50aXR5LCBwYXJhbXMpXHJcbiAgfVxyXG4gIC8vIGdldCBkYXNoU2l6ZSgpIHtcclxuICAvLyAgIHJldHVybiB0aGlzLm9wdGlvbnMuZGFzaFNpemVcclxuICAvLyB9XHJcblxyXG4gIC8vIHNldCBkYXNoU2l6ZSh2KSB7XHJcbiAgLy8gICB0aGlzLm9wdGlvbnMuZGFzaFNpemUgPSB2XHJcbiAgLy8gICBsZXQgcGFyYW1zID0geyAuLi50aGlzLm9wdGlvbnMgfVxyXG4gIC8vICAgcGFyYW1zLnNwZWVkID0gdGhpcy5pbnB1dFNwZWVkXHJcbiAgLy8gICAvLyB0aGlzLmVudGl0eS5wb2x5bGluZS5tYXRlcmlhbCA9IHRoaXMuZ2V0TWF0ZXJpYWwodGhpcy5vcHRpb25zLmNvbG9yLCB0aGlzLm9wdGlvbnMudHlwZSwgdGhpcy5lbnRpdHksIHRoaXMub3B0aW9ucylcclxuICAvLyAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLm1hdGVyaWFsID0gdGhpcy5nZXRNYXRlcmlhbCh0aGlzLm9wdGlvbnMuY29sb3IsIHRoaXMub3B0aW9ucy50eXBlLCB0aGlzLmVudGl0eSwgcGFyYW1zKVxyXG4gIC8vIH1cclxuXHJcbiAgZ2V0IHJvdGF0ZSgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMucm90YXRlXHJcbiAgfVxyXG5cclxuICBzZXQgcm90YXRlKHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5yb3RhdGUgPSB2XHJcbiAgICB0aGlzLmNsb3NlTm9kZUVkaXQoKVxyXG4gICAgdGhpcy5fZWxtcy5yb3RhdGUgJiZcclxuICAgICAgdGhpcy5fZWxtcy5yb3RhdGUuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICBpdGVtLmNoZWNrZWQgPSB2XHJcbiAgICAgIH0pXHJcblxyXG4gICAgdGhpcy5vcHRpb25zLnJvdGF0ZSA9IHZcclxuICAgIGxldCBwYXJhbXMgPSB7IC4uLnRoaXMub3B0aW9ucyB9XHJcbiAgICBwYXJhbXMuc3BlZWQgPSB0aGlzLmlucHV0U3BlZWRcclxuICAgIC8vIHRoaXMuZW50aXR5LnBvbHlsaW5lLm1hdGVyaWFsID0gdGhpcy5nZXRNYXRlcmlhbCh0aGlzLm9wdGlvbnMuY29sb3IsIHRoaXMub3B0aW9ucy50eXBlLCB0aGlzLmVudGl0eSwgdGhpcy5vcHRpb25zKVxyXG4gICAgdGhpcy5lbnRpdHkucG9seWxpbmUubWF0ZXJpYWwgPSB0aGlzLmdldE1hdGVyaWFsKHRoaXMub3B0aW9ucy5jb2xvciwgdGhpcy5vcHRpb25zLnR5cGUsIHRoaXMuZW50aXR5LCBwYXJhbXMpXHJcbiAgfVxyXG5cclxuICBnZXQgc3BhY2UoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLnNwYWNlXHJcbiAgfVxyXG5cclxuICBzZXQgc3BhY2Uodikge1xyXG4gICAgdGhpcy5vcHRpb25zLnNwYWNlID0gdlxyXG4gICAgbGV0IHBhcmFtcyA9IHsgLi4udGhpcy5vcHRpb25zIH1cclxuICAgIHBhcmFtcy5zcGVlZCA9IHRoaXMuaW5wdXRTcGVlZFxyXG4gICAgLy8gdGhpcy5lbnRpdHkucG9seWxpbmUubWF0ZXJpYWwgPSB0aGlzLmdldE1hdGVyaWFsKHRoaXMub3B0aW9ucy5jb2xvciwgdGhpcy5vcHRpb25zLnR5cGUsIHRoaXMuZW50aXR5LCB0aGlzLm9wdGlvbnMpXHJcbiAgICB0aGlzLmVudGl0eS5wb2x5bGluZS5tYXRlcmlhbCA9IHRoaXMuZ2V0TWF0ZXJpYWwodGhpcy5vcHRpb25zLmNvbG9yLCB0aGlzLm9wdGlvbnMudHlwZSwgdGhpcy5lbnRpdHksIHBhcmFtcylcclxuICB9XHJcblxyXG4gIGdldCB3b3Jkc05hbWUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLndvcmRzTmFtZVxyXG4gIH1cclxuICBzZXQgd29yZHNOYW1lKHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy53b3Jkc05hbWUgPSB2XHJcblxyXG4gICAgbGV0IF90aGlzID0gdGhpc1xyXG4gICAgaWYgKCF0aGlzLm5vc2VUb1RhaWwpIHtcclxuICAgICAgdGhpcy5jb21wdXRlRGlzdGFuY2UoXHJcbiAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9ucyxcclxuICAgICAgICAyLFxyXG4gICAgICAgIHZcclxuICAgICAgKS50aGVuKHJlcyA9PiB7XHJcbiAgICAgICAgLy8gX3RoaXMub3B0aW9ucy5sZW5ndGhCeU1ldGVyID0gcmVzXHJcbiAgICAgICAgLy8gaWYgKHJlcyA+IDEwMDAgfHwgcmVzID09IDEwMDApIHtcclxuICAgICAgICAvLyAgIF90aGlzLmxlbmd0aCA9IChyZXMgLyAxMDAwKS50b0ZpeGVkKDUpXHJcbiAgICAgICAgLy8gICBfdGhpcy5sZW5ndGhVbml0ID0gJ+WNg+exsydcclxuICAgICAgICAvLyB9IGVsc2Uge1xyXG4gICAgICAgIC8vICAgX3RoaXMubGVuZ3RoID0gcmVzXHJcbiAgICAgICAgLy8gICBfdGhpcy5sZW5ndGhVbml0ID0gJ+exsydcclxuICAgICAgICAvLyB9XHJcbiAgICAgICAgX3RoaXMubGVuZ3RoQnlNZXRlciA9IHJlc1xyXG4gICAgICAgIHRoaXMubGVuZ3RoQ2hhbmdlQ2FsbEJhY2sgJiYgdGhpcy5sZW5ndGhDaGFuZ2VDYWxsQmFjaygpXHJcbiAgICAgIH0pXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBsZXQgZnJvbURlZ3JlZXNBcnJheSA9IHRoaXMucmVuZXdQb3NpdGlvbnModGhpcy5vcHRpb25zLnBvc2l0aW9ucylcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIGdldCBmaXRMZW5ndGhVbml0KCkge1xyXG4gIC8vICAgcmV0dXJuIHRoaXMub3B0aW9ucy5maXRMZW5ndGhVbml0XHJcbiAgLy8gfVxyXG4gIC8vIHNldCBmaXRMZW5ndGhVbml0KHYpIHtcclxuICAvLyAgIHRoaXMub3B0aW9ucy5maXRMZW5ndGhVbml0ID0gdlxyXG4gIC8vICAgdGhpcy5fZWxtcy5maXRMZW5ndGhVbml0ICYmXHJcbiAgLy8gICAgIHRoaXMuX2VsbXMuZml0TGVuZ3RoVW5pdC5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gIC8vICAgICAgIGl0ZW0udmFsdWUgPSB2XHJcbiAgLy8gICAgIH0pXHJcbiAgLy8gICBpZiAodGhpcy5maXRMZW5ndGhCeU1ldGVyKSB7XHJcbiAgLy8gICAgIHN3aXRjaCAodikge1xyXG4gIC8vICAgICAgIGNhc2UgJ+exsyc6XHJcbiAgLy8gICAgICAgICB0aGlzLmZpdExlbmd0aCA9IHRoaXMuZml0TGVuZ3RoQnlNZXRlclxyXG4gIC8vICAgICAgICAgYnJlYWtcclxuICAvLyAgICAgICBjYXNlICfljYPnsbMnOlxyXG4gIC8vICAgICAgICAgdGhpcy5maXRMZW5ndGggPSBOdW1iZXIoXHJcbiAgLy8gICAgICAgICAgICh0aGlzLmZpdExlbmd0aEJ5TWV0ZXIgLyAxMDAwKS50b0ZpeGVkKDUpXHJcbiAgLy8gICAgICAgICApXHJcbiAgLy8gICAgICAgICBicmVha1xyXG4gIC8vICAgICAgIGRlZmF1bHQ6XHJcbiAgLy8gICAgICAgICB0aGlzLmZpdExlbmd0aCA9IHRoaXMuZml0TGVuZ3RoQnlNZXRlclxyXG4gIC8vICAgICB9XHJcbiAgLy8gICB9XHJcbiAgLy8gfVxyXG5cclxuICBnZXQgbGluZVdpZHRoKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy53aWR0aFxyXG4gIH1cclxuXHJcbiAgc2V0IGxpbmVXaWR0aCh2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMud2lkdGggPSAodiB8fCB2ID09IDApID8gdiA6IDNcclxuICAgIHRoaXMuX2VsbXMubGluZVdpZHRoICYmXHJcbiAgICAgIHRoaXMuX2VsbXMubGluZVdpZHRoLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgaXRlbS52YWx1ZSA9IHRoaXMub3B0aW9ucy53aWR0aFxyXG4gICAgICB9KVxyXG4gICAgaWYgKHRoaXMuZW50aXR5ICYmIHRoaXMuZW50aXR5LnBvbHlsaW5lKSB7XHJcbiAgICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLndpZHRoID0gdGhpcy5lbnRpdHkucG9seWxpbmUud2lkdGggKyB2IC0gdGhpcy5lbnRpdHkucG9seWxpbmUub3JpV2lkdGhcclxuICAgICAgdGhpcy5lbnRpdHkucG9seWxpbmUub3JpV2lkdGggPSB0aGlzLm9wdGlvbnMud2lkdGhcclxuICAgIH1cclxuICAgIC8vIHRoaXMuZW50aXR5ICYmXHJcbiAgICAvLyAgIHRoaXMuZW50aXR5LnBvbHlsaW5lICYmXHJcbiAgICAvLyAgICh0aGlzLmVudGl0eS5wb2x5bGluZS53aWR0aCA9IHRoaXMub3B0aW9ucy53aWR0aCkgJiYgKHRoaXMuZW50aXR5LnBvbHlsaW5lLm9yaVdpZHRoID0gdGhpcy5vcHRpb25zLndpZHRoKVxyXG4gIH1cclxuXHJcbiAgZ2V0IGxpbmVUeXBlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy50eXBlXHJcbiAgfVxyXG5cclxuICBzZXQgbGluZVR5cGUodikge1xyXG4gICAgbGV0IGxpbmVUeXBlRGF0YSA9IFtcclxuICAgICAge1xyXG4gICAgICAgIG5hbWU6ICc8aSBjbGFzcz1cImljb24gbGluZVwiPjwvaT7lrp7nur8nLFxyXG4gICAgICAgIHZhbHVlOiAn5a6e57q/JyxcclxuICAgICAgICBrZXk6IDAsXHJcbiAgICAgICAgaWNvbjogJ2xpbmUnXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBuYW1lOiAnPGkgY2xhc3M9XCJpY29uIGRhc2gtbGluZVwiPjwvaT7omZrnur8nLFxyXG4gICAgICAgIHZhbHVlOiAn6Jma57q/JyxcclxuICAgICAgICBrZXk6IDEsXHJcbiAgICAgICAgaWNvbjogJ2Rhc2gtbGluZSdcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIG5hbWU6ICc8aSBjbGFzcz1cImljb24gbGlnaHQtbGluZVwiPjwvaT7ms5vlhYknLFxyXG4gICAgICAgIHZhbHVlOiAn5rOb5YWJJyxcclxuICAgICAgICBrZXk6IDIsXHJcbiAgICAgICAgaWNvbjogJ2xpZ2h0LWxpbmUnXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBuYW1lOiAnPGkgY2xhc3M9XCJpY29uIHRhaWwtbGluZVwiPjwvaT7lsL7ov7nlhYnnur8nLFxyXG4gICAgICAgIHZhbHVlOiAn5bC+6L+55YWJ57q/JyxcclxuICAgICAgICBrZXk6IDMsXHJcbiAgICAgICAgaWNvbjogJ3RhaWwtbGluZSdcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIG5hbWU6ICc8aSBjbGFzcz1cImljb24gbXVsdC10YWlsLWxpbmVcIj48L2k+5aSa5bC+6L+55YWJ57q/JyxcclxuICAgICAgICB2YWx1ZTogJ+WkmuWwvui/ueWFiee6vycsXHJcbiAgICAgICAga2V5OiA0LFxyXG4gICAgICAgIGljb246ICdtdWx0LXRhaWwtbGluZSdcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIG5hbWU6ICc8aSBjbGFzcz1cImljb24gZmxvdy1kYXNoLWxpbmUxXCI+PC9pPua1geWKqOiZmue6vzEnLFxyXG4gICAgICAgIHZhbHVlOiAn5rWB5Yqo6Jma57q/MScsXHJcbiAgICAgICAga2V5OiA1LFxyXG4gICAgICAgIGljb246ICdmbG93LWRhc2gtbGluZTEnXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBuYW1lOiAnPGkgY2xhc3M9XCJpY29uIGZsb3ctZGFzaC1saW5lMlwiPjwvaT7mtYHliqjomZrnur8yJyxcclxuICAgICAgICB2YWx1ZTogJ+a1geWKqOiZmue6vzInLFxyXG4gICAgICAgIGtleTogNixcclxuICAgICAgICBpY29uOiAnZmxvdy1kYXNoLWxpbmUyJ1xyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgbmFtZTogJzxpIGNsYXNzPVwiaWNvbiBwaWMtbGluZTFcIj48L2k+5rWB5Yqo566t5aS0MScsXHJcbiAgICAgICAgdmFsdWU6ICfmtYHliqjnrq3lpLQxJyxcclxuICAgICAgICBrZXk6IDcsXHJcbiAgICAgICAgaWNvbjogJ3BpYy1saW5lMSdcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIG5hbWU6ICc8aSBjbGFzcz1cImljb24gcGljLWxpbmUyXCI+PC9pPua1geWKqOeureWktDInLFxyXG4gICAgICAgIHZhbHVlOiAn5rWB5Yqo566t5aS0MicsXHJcbiAgICAgICAga2V5OiA4LFxyXG4gICAgICAgIGljb246ICdwaWMtbGluZTInXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBuYW1lOiAnPGkgY2xhc3M9XCJpY29uIHBpYy1saW5lM1wiPjwvaT7mtYHliqjnrq3lpLQzJyxcclxuICAgICAgICB2YWx1ZTogJ+a1geWKqOeureWktDMnLFxyXG4gICAgICAgIGtleTogOSxcclxuICAgICAgICBpY29uOiAncGljLWxpbmUzJ1xyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgbmFtZTogJzxpIGNsYXNzPVwiaWNvbiBwaWMtbGluZTRcIj48L2k+5rWB5Yqo566t5aS0NCcsXHJcbiAgICAgICAgdmFsdWU6ICfmtYHliqjnrq3lpLQ0JyxcclxuICAgICAgICBrZXk6IDEwLFxyXG4gICAgICAgIGljb246ICdwaWMtbGluZTQnXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBuYW1lOiAnPGkgY2xhc3M9XCJpY29uIHBpYy1saW5lNVwiPjwvaT7mtYHliqjnrq3lpLQ1JyxcclxuICAgICAgICB2YWx1ZTogJ+a1geWKqOeureWktDUnLFxyXG4gICAgICAgIGtleTogMTEsXHJcbiAgICAgICAgaWNvbjogJ3BpYy1saW5lNSdcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIG5hbWU6ICc8aSBjbGFzcz1cImljb24gcGljLWxpbmU2XCI+PC9pPua1geWKqOeureWktDYnLFxyXG4gICAgICAgIHZhbHVlOiAn5rWB5Yqo566t5aS0NicsXHJcbiAgICAgICAga2V5OiAxMixcclxuICAgICAgICBpY29uOiAncGljLWxpbmU2J1xyXG4gICAgICB9XHJcbiAgICBdXHJcbiAgICB0aGlzLm9wdGlvbnMudHlwZSA9IE51bWJlcih2KVxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lVHlwZURhdGEubGVuZ3RoOyBpKyspIHtcclxuICAgICAgaWYgKGxpbmVUeXBlRGF0YVtpXS5rZXkgPT09IE51bWJlcih2KSkge1xyXG4gICAgICAgIHRoaXMuX2VsbXMubGluZVR5cGUgJiZcclxuICAgICAgICAgIHRoaXMuX2VsbXMubGluZVR5cGUuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICAgICAgaXRlbS52YWx1ZSA9IGxpbmVUeXBlRGF0YVtpXS52YWx1ZVxyXG4gICAgICAgICAgICBpZiAoMiA8IGl0ZW0udmFsdWUgJiYgaXRlbS52YWx1ZSA8IDEzKSB7Ly/otLTlm77lj4LmlbBcclxuICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGFzaFRleHR1cmVEb20nKSAmJiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rhc2hUZXh0dXJlRG9tJykuc3R5bGUuZGlzcGxheSA9ICdmbGV4JylcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGFzaFRleHR1cmVEb20nKSAmJiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rhc2hUZXh0dXJlRG9tJykuc3R5bGUuZGlzcGxheSA9ICdub25lJylcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoMiA8IGl0ZW0udmFsdWUgJiYgaXRlbS52YWx1ZSA8IDUpIHsvL+Wwvui/ueWPguaVsFxyXG4gICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xpbmVTcGFjZScpWzBdICYmIChkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdsaW5lU3BhY2UnKVswXS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnKVxyXG4gICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xpbmVTcGFjZScpWzFdICYmIChkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdsaW5lU3BhY2UnKVsxXS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnKVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xpbmVTcGFjZScpWzBdICYmIChkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdsaW5lU3BhY2UnKVswXS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnKVxyXG4gICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xpbmVTcGFjZScpWzFdICYmIChkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdsaW5lU3BhY2UnKVsxXS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIGJyZWFrXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGxldCBwYXJhbXMgPSB7IC4uLnRoaXMub3B0aW9ucyB9XHJcbiAgICBwYXJhbXMuc3BlZWQgPSB0aGlzLmlucHV0U3BlZWRcclxuICAgIHRoaXMuZW50aXR5ICYmXHJcbiAgICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lICYmXHJcbiAgICAgICh0aGlzLmVudGl0eS5wb2x5bGluZS5tYXRlcmlhbCA9IHRoaXMuZ2V0TWF0ZXJpYWwoXHJcbiAgICAgICAgdGhpcy5vcHRpb25zLmNvbG9yLFxyXG4gICAgICAgIHRoaXMub3B0aW9ucy50eXBlLFxyXG4gICAgICAgIHRoaXMuZW50aXR5LFxyXG4gICAgICAgIHBhcmFtc1xyXG4gICAgICApKVxyXG4gIH1cclxuICBnZXQgbm9zZVRvVGFpbCgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubm9zZVRvVGFpbFxyXG4gIH1cclxuXHJcbiAgc2V0IG5vc2VUb1RhaWwodikge1xyXG4gICAgdGhpcy5vcHRpb25zLm5vc2VUb1RhaWwgPSB2XHJcbiAgICB0aGlzLmNsb3NlTm9kZUVkaXQoKVxyXG4gICAgdGhpcy5fZWxtcy5ub3NlVG9UYWlsICYmXHJcbiAgICAgIHRoaXMuX2VsbXMubm9zZVRvVGFpbC5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgIGl0ZW0uY2hlY2tlZCA9IHZcclxuICAgICAgfSlcclxuICAgIGlmICh0aGlzLmVudGl0eSkge1xyXG4gICAgICBsZXQgZnJvbURlZ3JlZXNBcnJheSA9IHRoaXMucmVuZXdQb3NpdGlvbnModGhpcy5vcHRpb25zLnBvc2l0aW9ucylcclxuICAgICAgdGhpcy5lbnRpdHkucG9seWxpbmUucG9zaXRpb25zID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXNBcnJheUhlaWdodHMoXHJcbiAgICAgICAgZnJvbURlZ3JlZXNBcnJheVxyXG4gICAgICApXHJcbiAgICAgIHRoaXMucmVuZXdQb2x5Z29uKGZyb21EZWdyZWVzQXJyYXkpXHJcbiAgICB9XHJcbiAgICAvLyBpZiAodikge1xyXG4gICAgLy8gICBpZiAodGhpcy5vcHRpb25zLmZpdExlbmd0aEJ5TWV0ZXIgPiAxMDAwIHx8IHRoaXMub3B0aW9ucy5maXRMZW5ndGhCeU1ldGVyID09IDEwMDApIHtcclxuICAgIC8vICAgICBsZXQgZG9tID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaW5wdXQtc2VsZWN0LXVuaXQnKVsxXVxyXG4gICAgLy8gICAgIGRvbSAmJiBkb20ucXVlcnlTZWxlY3RvckFsbCgnZGQnKVsxXSAmJiBkb20ucXVlcnlTZWxlY3RvckFsbCgnZGQnKVsxXS5jbGljaygpXHJcbiAgICAvLyAgIH0gZWxzZSB7XHJcbiAgICAvLyAgICAgbGV0IGRvbSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2lucHV0LXNlbGVjdC11bml0JylbMV1cclxuICAgIC8vICAgICBkb20gJiYgZG9tLnF1ZXJ5U2VsZWN0b3JBbGwoJ2RkJylbMF0gJiYgZG9tLnF1ZXJ5U2VsZWN0b3JBbGwoJ2RkJylbMF0uY2xpY2soKVxyXG4gICAgLy8gICB9XHJcblxyXG4gICAgLy8gfSBlbHNlIHtcclxuICAgIC8vICAgaWYgKHRoaXMub3B0aW9ucy5sZW5ndGhCeU1ldGVyID4gMTAwMCB8fCB0aGlzLm9wdGlvbnMubGVuZ3RoQnlNZXRlciA9PSAxMDAwKSB7XHJcbiAgICAvLyAgICAgbGV0IGRvbSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2lucHV0LXNlbGVjdC11bml0JylbMV1cclxuICAgIC8vICAgICBkb20gJiYgZG9tLnF1ZXJ5U2VsZWN0b3JBbGwoJ2RkJylbMV0gJiYgZG9tLnF1ZXJ5U2VsZWN0b3JBbGwoJ2RkJylbMV0uY2xpY2soKVxyXG4gICAgLy8gICB9IGVsc2Uge1xyXG4gICAgLy8gICAgIGxldCBkb20gPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdpbnB1dC1zZWxlY3QtdW5pdCcpWzFdXHJcbiAgICAvLyAgICAgZG9tICYmIGRvbS5xdWVyeVNlbGVjdG9yQWxsKCdkZCcpWzBdICYmIGRvbS5xdWVyeVNlbGVjdG9yQWxsKCdkZCcpWzBdLmNsaWNrKClcclxuICAgIC8vICAgfVxyXG4gICAgLy8gfVxyXG4gIH1cclxuXHJcbiAgZ2V0IHNtb290aCgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuc21vb3RoXHJcbiAgfVxyXG5cclxuICBzZXQgc21vb3RoKHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5zbW9vdGggPSB2XHJcbiAgICB0aGlzLmNsb3NlTm9kZUVkaXQoKVxyXG4gICAgdGhpcy5fZWxtcy5zbW9vdGggJiZcclxuICAgICAgdGhpcy5fZWxtcy5zbW9vdGguZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICBpdGVtLmNoZWNrZWQgPSB2XHJcbiAgICAgIH0pXHJcbiAgICBpZiAodGhpcy5lbnRpdHkpIHtcclxuICAgICAgbGV0IGZyb21EZWdyZWVzQXJyYXkgPSB0aGlzLnJlbmV3UG9zaXRpb25zKHRoaXMub3B0aW9ucy5wb3NpdGlvbnMpXHJcbiAgICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLnBvc2l0aW9ucyA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzQXJyYXlIZWlnaHRzKFxyXG4gICAgICAgIGZyb21EZWdyZWVzQXJyYXlcclxuICAgICAgKVxyXG4gICAgICB0aGlzLnJlbmV3UG9seWdvbihmcm9tRGVncmVlc0FycmF5KVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IGhlaWdodE1vZGUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmhlaWdodE1vZGUgPyB0aGlzLm9wdGlvbnMuaGVpZ2h0TW9kZSA6IDBcclxuICB9XHJcbiAgc2V0IGhlaWdodE1vZGUodikge1xyXG4gICAgdGhpcy5wb3NpdGlvbkVkaXRpbmcgPSBmYWxzZVxyXG4gICAgdGhpcy5vcHRpb25zLmhlaWdodE1vZGUgPSAodiB8fCB2ID09IDApID8gdiA6IDJcclxuICAgIGxldCBoZWlnaHRNb2RlTmFtZSA9ICcnXHJcbiAgICB0aGlzLmNsb3NlTm9kZUVkaXQoKVxyXG4gICAgbGV0IGdyb3VuZCA9IGZhbHNlXHJcbiAgICBsZXQgZGlzYWJsZWQgPSBmYWxzZVxyXG4gICAgbGV0IGZyb21EZWdyZWVzQXJyYXkgPSB0aGlzLnJlbmV3UG9zaXRpb25zKHRoaXMub3B0aW9ucy5wb3NpdGlvbnMpXHJcbiAgICB0aGlzLmVudGl0eS5wb2x5bGluZS5wb3NpdGlvbnMgPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlc0FycmF5SGVpZ2h0cyhcclxuICAgICAgZnJvbURlZ3JlZXNBcnJheVxyXG4gICAgKVxyXG4gICAgdGhpcy5yZW5ld1BvbHlnb24oZnJvbURlZ3JlZXNBcnJheSlcclxuICAgIHN3aXRjaCAodGhpcy5vcHRpb25zLmhlaWdodE1vZGUpIHtcclxuICAgICAgY2FzZSAnMCc6XHJcbiAgICAgIGNhc2UgMDpcclxuICAgICAgICB0aGlzLmVudGl0eS5wb2x5bGluZS5jbGFtcFRvR3JvdW5kID0gZ3JvdW5kXHJcbiAgICAgICAgdGhpcy5leHRlbmQgPSBmYWxzZVxyXG4gICAgICAgIGhlaWdodE1vZGVOYW1lID0gJ+a1t+aLlOmrmOW6pidcclxuICAgICAgICBicmVha1xyXG4gICAgICBjYXNlICcxJzpcclxuICAgICAgY2FzZSAxOlxyXG4gICAgICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLmNsYW1wVG9Hcm91bmQgPSBncm91bmRcclxuICAgICAgICB0aGlzLmV4dGVuZCA9IGZhbHNlXHJcbiAgICAgICAgaGVpZ2h0TW9kZU5hbWUgPSAn55u45a+55Zyw6KGoJ1xyXG4gICAgICAgIGJyZWFrXHJcbiAgICAgIGNhc2UgJzInOlxyXG4gICAgICBjYXNlIDI6XHJcbiAgICAgICAgZ3JvdW5kID0gdHJ1ZVxyXG4gICAgICAgIGRpc2FibGVkID0gdHJ1ZVxyXG4gICAgICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLmNsYW1wVG9Hcm91bmQgPSBncm91bmRcclxuICAgICAgICBoZWlnaHRNb2RlTmFtZSA9ICfkvp3pmYTmqKHlnosnXHJcbiAgICAgICAgYnJlYWtcclxuICAgIH1cclxuXHJcblxyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIGlmIChncm91bmQpIHtcclxuICAgICAgICB0aGlzLmxhYmVsLmdyb3VuZCA9IGdyb3VuZFxyXG4gICAgICAgIHRoaXMuX2VsbXMuaGVpZ2h0TW9kZSAmJiAodGhpcy5fZWxtcy5oZWlnaHRNb2RlLnZhbHVlID0gJ+S+nemZhOaooeWeiycpXHJcbiAgICAgICAgdGhpcy5sYWJlbC5wb3NpdGlvbiA9IFtcclxuICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0ubG5nLFxyXG4gICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXS5sYXRcclxuICAgICAgICBdXHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdGhpcy5sYWJlbC5ncm91bmQgPSBncm91bmRcclxuICAgICAgICB0aGlzLmxhYmVsLnBvc2l0aW9uID0gW1xyXG4gICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXS5sbmcsXHJcbiAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zWzBdLmxhdCxcclxuICAgICAgICAgIGZyb21EZWdyZWVzQXJyYXlbMl1cclxuICAgICAgICBdXHJcbiAgICAgICAgdGhpcy5vcHRpb25zLmxhYmVsLnBvc2l0aW9uID0ge1xyXG4gICAgICAgICAgbG5nOiB0aGlzLm9wdGlvbnMucG9zaXRpb25zWzBdLmxuZyxcclxuICAgICAgICAgIGxhdDogdGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXS5sYXQsXHJcbiAgICAgICAgICBhbHQ6IGZyb21EZWdyZWVzQXJyYXlbMl1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0sIDApO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGV4dGVuZCgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuZXh0ZW5kXHJcbiAgfVxyXG5cclxuICBzZXQgZXh0ZW5kKHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5leHRlbmQgPSB2XHJcbiAgICB0aGlzLmNsb3NlTm9kZUVkaXQoKVxyXG4gICAgaWYgKHYpIHtcclxuICAgICAgdGhpcy5oZWlnaHRNb2RlID0gMlxyXG4gICAgfVxyXG4gICAgdGhpcy5fZWxtcy5leHRlbmQgJiZcclxuICAgICAgdGhpcy5fZWxtcy5leHRlbmQuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICBpdGVtLmNoZWNrZWQgPSB2XHJcbiAgICAgIH0pXHJcbiAgICBpZiAodGhpcy5lbnRpdHkpIHtcclxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5leHRlbmQpIHtcclxuICAgICAgICBsZXQgZnJvbURlZ3JlZXNBcnJheSA9IHRoaXMucmVuZXdQb3NpdGlvbnModGhpcy5vcHRpb25zLnBvc2l0aW9ucylcclxuICAgICAgICB0aGlzLnJlbmV3UG9seWdvbihmcm9tRGVncmVlc0FycmF5KVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuZW50aXR5LnBvbHlnb24gPSB1bmRlZmluZWRcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IGV4dGVuZFdpZHRoKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5leHRlbmRXaWR0aFxyXG4gIH1cclxuXHJcbiAgc2V0IGV4dGVuZFdpZHRoKHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5leHRlbmRXaWR0aCA9IHZcclxuICAgIHRoaXMuaGVpZ2h0TW9kZSA9IHRoaXMuaGVpZ2h0TW9kZVxyXG4gICAgdGhpcy5fZWxtcy5leHRlbmRXaWR0aCAmJlxyXG4gICAgICB0aGlzLl9lbG1zLmV4dGVuZFdpZHRoLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgaXRlbS52YWx1ZSA9IHZcclxuICAgICAgfSlcclxuICAgIGxldCBmcm9tRGVncmVlc0FycmF5ID0gdGhpcy5yZW5ld1Bvc2l0aW9ucyh0aGlzLm9wdGlvbnMucG9zaXRpb25zKVxyXG4gICAgdGhpcy5yZW5ld1BvbHlnb24oZnJvbURlZ3JlZXNBcnJheSlcclxuICB9XHJcblxyXG4gIGdldCBleHRlbmRDb2xvcigpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuZXh0ZW5kQ29sb3JcclxuICB9XHJcbiAgc2V0IGV4dGVuZENvbG9yKHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5leHRlbmRDb2xvciA9IHZcclxuICAgIGlmICh0aGlzLl9lbG1zLmV4dGVuZENvbG9yKSB7XHJcbiAgICAgIHRoaXMuX2VsbXMuZXh0ZW5kQ29sb3IuZm9yRWFjaCgoaXRlbSwgaSkgPT4ge1xyXG4gICAgICAgIGxldCBleHRlbmRDb2xvclBpY2tlciA9IG5ldyBZSkNvbG9yUGlja2VyKHtcclxuICAgICAgICAgIGVsOiBpdGVtLmVsLFxyXG4gICAgICAgICAgc2l6ZTogJ21pbmknLCAvL+minOiJsmJveOexu+Wei1xyXG4gICAgICAgICAgYWxwaGE6IHRydWUsIC8v5piv5ZCm5byA5ZCv6YCP5piO5bqmXHJcbiAgICAgICAgICBkZWZhdWx0Q29sb3I6IHRoaXMuZXh0ZW5kQ29sb3IsXHJcbiAgICAgICAgICBkaXNhYmxlZDogZmFsc2UsIC8v5piv5ZCm56aB5q2i5omT5byA6aKc6Imy6YCJ5oup5ZmoXHJcbiAgICAgICAgICBvcGVuUGlja2VyQW5pOiAnb3BhY2l0eScsIC8v5omT5byA6aKc6Imy6YCJ5oup5Zmo5Yqo55S7XHJcbiAgICAgICAgICBzdXJlOiBjb2xvciA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuZXh0ZW5kQ29sb3IgPSBjb2xvclxyXG4gICAgICAgICAgfSwgLy/ngrnlh7vnoa7orqTmjInpkq7kuovku7blm57osINcclxuICAgICAgICAgIGNsZWFyOiAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuZXh0ZW5kQ29sb3IgPSAncmdiYSgyNTUsMjU1LDI1NSwxKSdcclxuICAgICAgICAgIH0gLy/ngrnlh7vmuIXnqbrmjInpkq7kuovku7blm57osINcclxuICAgICAgICB9KVxyXG4gICAgICAgIHRoaXMuX2VsbXMuZXh0ZW5kQ29sb3JbaV0gPSBleHRlbmRDb2xvclBpY2tlclxyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gICAgdGhpcy5lbnRpdHkgJiZcclxuICAgICAgdGhpcy5lbnRpdHkucG9seWdvbiAmJlxyXG4gICAgICAodGhpcy5lbnRpdHkucG9seWdvbi5tYXRlcmlhbCA9IENlc2l1bS5Db2xvci5mcm9tQ3NzQ29sb3JTdHJpbmcoXHJcbiAgICAgICAgdGhpcy5vcHRpb25zLmV4dGVuZENvbG9yXHJcbiAgICAgICkpXHJcbiAgfVxyXG5cclxuICBnZXQgbGFiZWxTaG93KCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5sYWJlbC5zaG93XHJcbiAgfVxyXG4gIHNldCBsYWJlbFNob3codikge1xyXG4gICAgdGhpcy5vcHRpb25zLmxhYmVsLnNob3cgPSB2XHJcbiAgICBpZiAodGhpcy5zaG93ICYmICF0aGlzLnNob3dWaWV3IHx8IHRoaXMuc2hvd1ZpZXcgPT0gMykge1xyXG4gICAgICB0aGlzLmxhYmVsLnNob3cgPSB2XHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMubGFiZWwucG9zaXRpb24gPSBbXHJcbiAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zWzBdLmxuZyxcclxuICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0ubGF0LFxyXG4gICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXS5hbHRcclxuICAgICAgICBdXHJcbiAgICAgIH0sIDApXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmxhYmVsLnNob3cgPSBmYWxzZVxyXG4gICAgfVxyXG4gICAgdGhpcy5fZWxtcy5sYWJlbFNob3cgJiZcclxuICAgICAgdGhpcy5fZWxtcy5sYWJlbFNob3cuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICBpdGVtLmNoZWNrZWQgPSB2XHJcbiAgICAgIH0pXHJcbiAgfVxyXG5cclxuICBnZXQgbGFiZWxGb250RmFtaWx5KCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5sYWJlbC5mb250RmFtaWx5XHJcbiAgfVxyXG5cclxuICBzZXQgbGFiZWxGb250RmFtaWx5KHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5sYWJlbC5mb250RmFtaWx5ID0gdiB8fCAwXHJcbiAgICB0aGlzLmxhYmVsICYmICh0aGlzLmxhYmVsLmZvbnRGYW1pbHkgPSB0aGlzLm9wdGlvbnMubGFiZWwuZm9udEZhbWlseSlcclxuXHJcbiAgICBsZXQgbmFtZSA9IGdldEZvbnRGYW1pbHlOYW1lKHRoaXMubGFiZWxGb250RmFtaWx5KSB8fCAnJ1xyXG4gICAgdGhpcy5fZWxtcy5sYWJlbEZvbnRGYW1pbHkgJiZcclxuICAgICAgdGhpcy5fZWxtcy5sYWJlbEZvbnRGYW1pbHkuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICBpdGVtLnZhbHVlID0gbmFtZVxyXG4gICAgICB9KVxyXG4gIH1cclxuXHJcbiAgZ2V0IGxhYmVsQ29sb3IoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmxhYmVsLmNvbG9yXHJcbiAgfVxyXG4gIHNldCBsYWJlbENvbG9yKHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5sYWJlbC5jb2xvciA9IHZcclxuICAgIHRoaXMubGFiZWwuY29sb3IgPSB2XHJcbiAgICBpZiAodGhpcy5fZWxtcy5sYWJlbENvbG9yKSB7XHJcbiAgICAgIHRoaXMuX2VsbXMubGFiZWxDb2xvci5mb3JFYWNoKChpdGVtLCBpKSA9PiB7XHJcbiAgICAgICAgbGV0IGxhYmVsQ29sb3JQaWNrZXIgPSBuZXcgWUpDb2xvclBpY2tlcih7XHJcbiAgICAgICAgICBlbDogaXRlbS5lbCxcclxuICAgICAgICAgIHNpemU6ICdtaW5pJywgLy/popzoibJib3jnsbvlnotcclxuICAgICAgICAgIGFscGhhOiB0cnVlLCAvL+aYr+WQpuW8gOWQr+mAj+aYjuW6plxyXG4gICAgICAgICAgZGVmYXVsdENvbG9yOiB0aGlzLmxhYmVsQ29sb3IsXHJcbiAgICAgICAgICBkaXNhYmxlZDogZmFsc2UsIC8v5piv5ZCm56aB5q2i5omT5byA6aKc6Imy6YCJ5oup5ZmoXHJcbiAgICAgICAgICBvcGVuUGlja2VyQW5pOiAnb3BhY2l0eScsIC8v5omT5byA6aKc6Imy6YCJ5oup5Zmo5Yqo55S7XHJcbiAgICAgICAgICBzdXJlOiBjb2xvciA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubGFiZWxDb2xvciA9IGNvbG9yXHJcbiAgICAgICAgICB9LCAvL+eCueWHu+ehruiupOaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICAgICAgY2xlYXI6ICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5sYWJlbENvbG9yID0gJ3JnYmEoMjU1LDI1NSwyNTUsMSknXHJcbiAgICAgICAgICB9IC8v54K55Ye75riF56m65oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgICAgfSlcclxuICAgICAgICB0aGlzLl9lbG1zLmxhYmVsQ29sb3JbaV0gPSBsYWJlbENvbG9yUGlja2VyXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgbGFiZWxGb250U2l6ZSgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubGFiZWwuZm9udFNpemVcclxuICB9XHJcbiAgc2V0IGxhYmVsRm9udFNpemUodikge1xyXG4gICAgdGhpcy5vcHRpb25zLmxhYmVsLmZvbnRTaXplID0gdlxyXG4gICAgdGhpcy5sYWJlbC5mb250U2l6ZSA9IHZcclxuICAgIHRoaXMuX2VsbXMubGFiZWxGb250U2l6ZSAmJlxyXG4gICAgICB0aGlzLl9lbG1zLmxhYmVsRm9udFNpemUuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICBpdGVtLnZhbHVlID0gdlxyXG4gICAgICB9KVxyXG4gIH1cclxuXHJcbiAgZ2V0IGxhYmVsU2NhbGVCeURpc3RhbmNlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5sYWJlbC5zY2FsZUJ5RGlzdGFuY2VcclxuICB9XHJcbiAgc2V0IGxhYmVsU2NhbGVCeURpc3RhbmNlKHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5sYWJlbC5zY2FsZUJ5RGlzdGFuY2UgPSB2XHJcbiAgICB0aGlzLmxhYmVsLnNjYWxlQnlEaXN0YW5jZSA9IHZcclxuICAgIHRoaXMuX2VsbXMubGFiZWxTY2FsZUJ5RGlzdGFuY2UgJiZcclxuICAgICAgdGhpcy5fZWxtcy5sYWJlbFNjYWxlQnlEaXN0YW5jZS5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgIGl0ZW0uY2hlY2tlZCA9IHZcclxuICAgICAgfSlcclxuICB9XHJcblxyXG4gIGdldCBsYWJlbE5lYXIoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmxhYmVsLm5lYXJcclxuICB9XHJcbiAgc2V0IGxhYmVsTmVhcih2KSB7XHJcbiAgICBsZXQgbmVhciA9IHZcclxuICAgIGlmIChuZWFyID4gdGhpcy5sYWJlbEZhcikge1xyXG4gICAgICBuZWFyID0gdGhpcy5sYWJlbEZhclxyXG4gICAgfVxyXG4gICAgdGhpcy5vcHRpb25zLmxhYmVsLm5lYXIgPSBuZWFyXHJcbiAgICB0aGlzLmxhYmVsLm5lYXIgPSBuZWFyXHJcbiAgICB0aGlzLl9lbG1zLmxhYmVsTmVhciAmJiB0aGlzLl9lbG1zLmxhYmVsTmVhci5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgIGl0ZW0udmFsdWUgPSBuZWFyXHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgZ2V0IGxhYmVsRmFyKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5sYWJlbC5mYXJcclxuICB9XHJcbiAgc2V0IGxhYmVsRmFyKHYpIHtcclxuICAgIGxldCBmYXIgPSB2XHJcbiAgICBpZiAoZmFyIDwgdGhpcy5sYWJlbE5lYXIpIHtcclxuICAgICAgZmFyID0gdGhpcy5sYWJlbE5lYXJcclxuICAgIH1cclxuICAgIHRoaXMub3B0aW9ucy5sYWJlbC5mYXIgPSBmYXJcclxuICAgIHRoaXMubGFiZWwuZmFyID0gZmFyXHJcbiAgICB0aGlzLl9lbG1zLmxhYmVsRmFyICYmIHRoaXMuX2VsbXMubGFiZWxGYXIuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICBpdGVtLnZhbHVlID0gZmFyXHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgZ2V0IGxhYmVsTGluZVdpZHRoKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5sYWJlbC5saW5lV2lkdGhcclxuICB9XHJcbiAgc2V0IGxhYmVsTGluZVdpZHRoKHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5sYWJlbC5saW5lV2lkdGggPSB2XHJcbiAgICB0aGlzLmxhYmVsLmxpbmVXaWR0aCA9IHZcclxuICAgIHRoaXMuX2VsbXMubGFiZWxMaW5lV2lkdGggJiZcclxuICAgICAgdGhpcy5fZWxtcy5sYWJlbExpbmVXaWR0aC5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgIGl0ZW0udmFsdWUgPSB2XHJcbiAgICAgIH0pXHJcbiAgfVxyXG5cclxuICBnZXQgbGFiZWxQaXhlbE9mZnNldCgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubGFiZWwucGl4ZWxPZmZzZXRcclxuICB9XHJcbiAgc2V0IGxhYmVsUGl4ZWxPZmZzZXQodikge1xyXG4gICAgdGhpcy5vcHRpb25zLmxhYmVsLnBpeGVsT2Zmc2V0ID0gdlxyXG4gICAgdGhpcy5sYWJlbC5waXhlbE9mZnNldCA9IHZcclxuICAgIHRoaXMuX2VsbXMubGFiZWxQaXhlbE9mZnNldCAmJlxyXG4gICAgICB0aGlzLl9lbG1zLmxhYmVsUGl4ZWxPZmZzZXQuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICBpdGVtLnZhbHVlID0gdlxyXG4gICAgICB9KVxyXG4gIH1cclxuICBnZXQgbGFiZWxMaW5lQ29sb3IoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmxhYmVsLmxpbmVDb2xvclxyXG4gIH1cclxuICBzZXQgbGFiZWxMaW5lQ29sb3Iodikge1xyXG4gICAgdGhpcy5vcHRpb25zLmxhYmVsLmxpbmVDb2xvciA9IHZcclxuICAgIHRoaXMubGFiZWwubGluZUNvbG9yID0gdlxyXG4gICAgaWYgKHRoaXMuX2VsbXMubGFiZWxMaW5lQ29sb3IpIHtcclxuICAgICAgdGhpcy5fZWxtcy5sYWJlbExpbmVDb2xvci5mb3JFYWNoKChpdGVtLCBpKSA9PiB7XHJcbiAgICAgICAgbGV0IGxpbmVDb2xvclBpY2tlciA9IG5ldyBZSkNvbG9yUGlja2VyKHtcclxuICAgICAgICAgIGVsOiBpdGVtLmVsLFxyXG4gICAgICAgICAgc2l6ZTogJ21pbmknLCAvL+minOiJsmJveOexu+Wei1xyXG4gICAgICAgICAgYWxwaGE6IHRydWUsIC8v5piv5ZCm5byA5ZCv6YCP5piO5bqmXHJcbiAgICAgICAgICBkZWZhdWx0Q29sb3I6IHRoaXMubGFiZWxMaW5lQ29sb3IsXHJcbiAgICAgICAgICBkaXNhYmxlZDogZmFsc2UsIC8v5piv5ZCm56aB5q2i5omT5byA6aKc6Imy6YCJ5oup5ZmoXHJcbiAgICAgICAgICBvcGVuUGlja2VyQW5pOiAnb3BhY2l0eScsIC8v5omT5byA6aKc6Imy6YCJ5oup5Zmo5Yqo55S7XHJcbiAgICAgICAgICBzdXJlOiBjb2xvciA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubGFiZWxMaW5lQ29sb3IgPSBjb2xvclxyXG4gICAgICAgICAgfSwgLy/ngrnlh7vnoa7orqTmjInpkq7kuovku7blm57osINcclxuICAgICAgICAgIGNsZWFyOiAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubGFiZWxMaW5lQ29sb3IgPSAncmdiYSgwLDI1NSwyNTUsMC41KSdcclxuICAgICAgICAgIH0gLy/ngrnlh7vmuIXnqbrmjInpkq7kuovku7blm57osINcclxuICAgICAgICB9KVxyXG4gICAgICAgIHRoaXMuX2VsbXMubGFiZWxMaW5lQ29sb3JbaV0gPSBsaW5lQ29sb3JQaWNrZXJcclxuICAgICAgfSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCBsYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0KCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5sYWJlbC5iYWNrZ3JvdW5kQ29sb3JbMF1cclxuICB9XHJcbiAgc2V0IGxhYmVsQmFja2dyb3VuZENvbG9yU3RhcnQodikge1xyXG4gICAgdGhpcy5vcHRpb25zLmxhYmVsLmJhY2tncm91bmRDb2xvclswXSA9IHZcclxuICAgIHRoaXMubGFiZWwuYmFja2dyb3VuZENvbG9yID0gW3YsIHRoaXMubGFiZWwuYmFja2dyb3VuZENvbG9yWzFdXVxyXG4gICAgaWYgKHRoaXMuX2VsbXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JTdGFydCkge1xyXG4gICAgICB0aGlzLl9lbG1zLmxhYmVsQmFja2dyb3VuZENvbG9yU3RhcnQuZm9yRWFjaCgoaXRlbSwgaSkgPT4ge1xyXG4gICAgICAgIGxldCBsYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0UGlja2VyID0gbmV3IFlKQ29sb3JQaWNrZXIoe1xyXG4gICAgICAgICAgZWw6IGl0ZW0uZWwsXHJcbiAgICAgICAgICBzaXplOiAnbWluaScsIC8v6aKc6ImyYm9457G75Z6LXHJcbiAgICAgICAgICBhbHBoYTogdHJ1ZSwgLy/mmK/lkKblvIDlkK/pgI/mmI7luqZcclxuICAgICAgICAgIGRlZmF1bHRDb2xvcjogdGhpcy5sYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0LFxyXG4gICAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLCAvL+aYr+WQpuemgeatouaJk+W8gOminOiJsumAieaLqeWZqFxyXG4gICAgICAgICAgb3BlblBpY2tlckFuaTogJ29wYWNpdHknLCAvL+aJk+W8gOminOiJsumAieaLqeWZqOWKqOeUu1xyXG4gICAgICAgICAgc3VyZTogY29sb3IgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxhYmVsQmFja2dyb3VuZENvbG9yU3RhcnQgPSBjb2xvclxyXG4gICAgICAgICAgfSwgLy/ngrnlh7vnoa7orqTmjInpkq7kuovku7blm57osINcclxuICAgICAgICAgIGNsZWFyOiAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JTdGFydCA9ICdyZ2JhKDI1NSwyNTUsMjU1LDEpJ1xyXG4gICAgICAgICAgfSAvL+eCueWHu+a4heepuuaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgdGhpcy5fZWxtcy5sYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0W1xyXG4gICAgICAgICAgaVxyXG4gICAgICAgIF0gPSBsYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0UGlja2VyXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgfVxyXG4gIGdldCBsYWJlbEJhY2tncm91bmRDb2xvckVuZCgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubGFiZWwuYmFja2dyb3VuZENvbG9yWzFdXHJcbiAgfVxyXG4gIHNldCBsYWJlbEJhY2tncm91bmRDb2xvckVuZCh2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMubGFiZWwuYmFja2dyb3VuZENvbG9yWzFdID0gdlxyXG4gICAgdGhpcy5sYWJlbC5iYWNrZ3JvdW5kQ29sb3IgPSBbdGhpcy5sYWJlbC5iYWNrZ3JvdW5kQ29sb3JbMF0sIHZdXHJcbiAgICBpZiAodGhpcy5fZWxtcy5sYWJlbEJhY2tncm91bmRDb2xvckVuZCkge1xyXG4gICAgICB0aGlzLl9lbG1zLmxhYmVsQmFja2dyb3VuZENvbG9yRW5kLmZvckVhY2goKGl0ZW0sIGkpID0+IHtcclxuICAgICAgICBsZXQgbGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmRQaWNrZXIgPSBuZXcgWUpDb2xvclBpY2tlcih7XHJcbiAgICAgICAgICBlbDogaXRlbS5lbCxcclxuICAgICAgICAgIHNpemU6ICdtaW5pJywgLy/popzoibJib3jnsbvlnotcclxuICAgICAgICAgIGFscGhhOiB0cnVlLCAvL+aYr+WQpuW8gOWQr+mAj+aYjuW6plxyXG4gICAgICAgICAgZGVmYXVsdENvbG9yOiB0aGlzLmxhYmVsQmFja2dyb3VuZENvbG9yRW5kLFxyXG4gICAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLCAvL+aYr+WQpuemgeatouaJk+W8gOminOiJsumAieaLqeWZqFxyXG4gICAgICAgICAgb3BlblBpY2tlckFuaTogJ29wYWNpdHknLCAvL+aJk+W8gOminOiJsumAieaLqeWZqOWKqOeUu1xyXG4gICAgICAgICAgc3VyZTogY29sb3IgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxhYmVsQmFja2dyb3VuZENvbG9yRW5kID0gY29sb3JcclxuICAgICAgICAgIH0sIC8v54K55Ye756Gu6K6k5oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgICAgICBjbGVhcjogKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxhYmVsQmFja2dyb3VuZENvbG9yRW5kID0gJ3JnYmEoMjU1LDI1NSwyNTUsMSknXHJcbiAgICAgICAgICB9IC8v54K55Ye75riF56m65oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgICAgfSlcclxuICAgICAgICB0aGlzLl9lbG1zLmxhYmVsQmFja2dyb3VuZENvbG9yRW5kW2ldID0gbGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmRQaWNrZXJcclxuICAgICAgfSlcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICAvLyBnZXQgYXR0cmlidXRlQ2FtZXJhKCkge1xyXG4gIC8vICAgcmV0dXJuIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUuY2FtZXJhLmNvbnRlbnRcclxuICAvLyB9XHJcblxyXG4gIC8vIHNldCBhdHRyaWJ1dGVDYW1lcmEodikge1xyXG4gIC8vICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5jYW1lcmEuY29udGVudCA9IHZcclxuICAvLyB9XHJcblxyXG4gIC8vIGdldCBhdHRyaWJ1dGVWcigpIHtcclxuICAvLyAgIHJldHVybiB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnRcclxuICAvLyB9XHJcblxyXG4gIC8vIHNldCBhdHRyaWJ1dGVWcih2KSB7XHJcbiAgLy8gICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnQgPSB2XHJcbiAgLy8gICBpZiAoXHJcbiAgLy8gICAgICF0aGlzLl9EaWFsb2dPYmplY3QgfHxcclxuICAvLyAgICAgIXRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudCB8fFxyXG4gIC8vICAgICAhdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQgfHxcclxuICAvLyAgICAgdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcclxuICAvLyAgICAgICAnYXR0cmlidXRlLWNvbnRlbnQtdnInXHJcbiAgLy8gICAgICkubGVuZ3RoID09IDBcclxuICAvLyAgICkge1xyXG4gIC8vICAgICByZXR1cm5cclxuICAvLyAgIH1cclxuICAvLyAgIGxldCB0YWJsZSA9IHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50XHJcbiAgLy8gICAgIC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdhdHRyaWJ1dGUtY29udGVudC12cicpWzFdXHJcbiAgLy8gICAgIC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0YWJsZScpWzBdXHJcbiAgLy8gICBsZXQgdGFibGVDb250ZW50ID0gdGFibGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndGFibGUtYm9keScpWzBdXHJcbiAgLy8gICB0YWJsZUNvbnRlbnQuaW5uZXJIVE1MID0gJydcclxuICAvLyAgIGlmICh0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnQubGVuZ3RoID4gMCkge1xyXG4gIC8vICAgICB0YWJsZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0YWJsZS1lbXB0eScpWzBdLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSdcclxuICAvLyAgIH0gZWxzZSB7XHJcbiAgLy8gICAgIHRhYmxlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RhYmxlLWVtcHR5JylbMF0uc3R5bGUuZGlzcGxheSA9ICdmbGV4J1xyXG4gIC8vICAgfVxyXG4gIC8vICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnQubGVuZ3RoOyBpKyspIHtcclxuICAvLyAgICAgbGV0IHRyID1cclxuICAvLyAgICAgICBgXHJcbiAgLy8gICAgIDxkaXYgY2xhc3M9XCJ0clwiPlxyXG4gIC8vICAgICAgICAgPGRpdiBjbGFzcz1cInRkXCI+YCArXHJcbiAgLy8gICAgICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52ci5jb250ZW50W2ldLm5hbWUgK1xyXG4gIC8vICAgICAgIGA8L2Rpdj5cclxuICAvLyAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZFwiPmAgK1xyXG4gIC8vICAgICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudFtpXS51cmwgK1xyXG4gIC8vICAgICAgIGA8L2Rpdj5cclxuICAvLyAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZFwiPlxyXG4gIC8vICAgICAgICAgICAgIDxidXR0b24gQGNsaWNrPVwidnJFZGl0XCI+57yW6L6RPC9idXR0b24+XHJcbiAgLy8gICAgICAgICAgICAgPGJ1dHRvbiBAY2xpY2s9XCJ2ckRlbGV0ZVwiPuWIoOmZpDwvYnV0dG9uPlxyXG4gIC8vICAgICAgICAgPC9kaXY+XHJcbiAgLy8gICAgIDwvZGl2PmBcclxuICAvLyAgICAgbGV0IHRyRWxtID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKS5jcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQodHIpXHJcbiAgLy8gICAgIHRhYmxlQ29udGVudC5hcHBlbmRDaGlsZCh0ckVsbSlcclxuICAvLyAgIH1cclxuICAvLyAgIGxldCBpdGVtID0gdGFibGVDb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RyJylcclxuICAvLyAgIGxldCBmdW4gPSB7XHJcbiAgLy8gICAgIHZyRWRpdDogYXN5bmMgaW5kZXggPT4ge1xyXG4gIC8vICAgICAgIHRoaXMuYXR0cmlidXRlVnIgPSBhd2FpdCB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnRcclxuICAvLyAgICAgICBsZXQgdGFibGUgPSB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudFxyXG4gIC8vICAgICAgICAgLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2F0dHJpYnV0ZS1jb250ZW50LXZyJylbMV1cclxuICAvLyAgICAgICAgIC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0YWJsZScpWzBdXHJcbiAgLy8gICAgICAgbGV0IHRhYmxlQ29udGVudCA9IHRhYmxlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RhYmxlLWJvZHknKVswXVxyXG4gIC8vICAgICAgIGxldCBpdGVtID0gdGFibGVDb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RyJylcclxuICAvLyAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW0ubGVuZ3RoOyBpKyspIHtcclxuICAvLyAgICAgICAgIGlmIChpbmRleCA9PT0gaSkge1xyXG4gIC8vICAgICAgICAgICBsZXQgaGVpZ2h0ID0gaXRlbVtpXS5vZmZzZXRIZWlnaHRcclxuICAvLyAgICAgICAgICAgbGV0IGh0bWwgPSBgXHJcbiAgLy8gICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRkXCI+XHJcbiAgLy8gICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJpbnB1dFwiIHR5cGU9XCJ0ZXh0XCI+XHJcbiAgLy8gICAgICAgICAgICAgPC9kaXY+XHJcbiAgLy8gICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRkXCI+XHJcbiAgLy8gICAgICAgICAgICAgICA8dGV4dGFyZWEgY2xhc3M9XCJpbnB1dCBsaW5rLWVkaXRcIiB0eXBlPVwidGV4dFwiPjwvdGV4dGFyZWE+XHJcbiAgLy8gICAgICAgICAgICAgPC9kaXY+XHJcbiAgLy8gICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRkXCI+XHJcbiAgLy8gICAgICAgICAgICAgICAgIDxidXR0b24gQGNsaWNrPVwiY29uZmlybUVkaXRcIj7noa7orqQ8L2J1dHRvbj5cclxuICAvLyAgICAgICAgICAgICAgICAgPGJ1dHRvbiBAY2xpY2s9XCJjYW5jZWxFZGl0XCI+5Y+W5raIPC9idXR0b24+XHJcbiAgLy8gICAgICAgICAgICAgPC9kaXY+YFxyXG4gIC8vICAgICAgICAgICBpdGVtW2ldLmlubmVySFRNTCA9IGh0bWxcclxuICAvLyAgICAgICAgICAgbGV0IHRleHRhcmVhRWxtID0gaXRlbVtpXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdsaW5rLWVkaXQnKVswXVxyXG4gIC8vICAgICAgICAgICB0ZXh0YXJlYUVsbS5zdHlsZS5oZWlnaHQgPSBoZWlnaHQgLSAxMCArICdweCdcclxuICAvLyAgICAgICAgICAgbGV0IHRkID0gaXRlbVtpXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0ZCcpXHJcbiAgLy8gICAgICAgICAgIHRkWzBdLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXHJcbiAgLy8gICAgICAgICAgICAgJ2lucHV0J1xyXG4gIC8vICAgICAgICAgICApWzBdLnZhbHVlID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52ci5jb250ZW50W2luZGV4XS5uYW1lXHJcbiAgLy8gICAgICAgICAgIHRkWzFdLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXHJcbiAgLy8gICAgICAgICAgICAgJ2lucHV0J1xyXG4gIC8vICAgICAgICAgICApWzBdLnZhbHVlID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52ci5jb250ZW50W2luZGV4XS51cmxcclxuICAvLyAgICAgICAgICAgbGV0IGJ0biA9IGl0ZW1baV0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2J1dHRvbicpXHJcbiAgLy8gICAgICAgICAgIGZvciAobGV0IG4gPSAwOyBuIDwgYnRuLmxlbmd0aDsgbisrKSB7XHJcbiAgLy8gICAgICAgICAgICAgaWYgKCFidG5bbl0gfHwgIWJ0bltuXS5hdHRyaWJ1dGVzKSB7XHJcbiAgLy8gICAgICAgICAgICAgICBjb250aW51ZVxyXG4gIC8vICAgICAgICAgICAgIH1cclxuICAvLyAgICAgICAgICAgICBmb3IgKGxldCBtIG9mIGJ0bltuXS5hdHRyaWJ1dGVzKSB7XHJcbiAgLy8gICAgICAgICAgICAgICBpZiAobS5uYW1lID09PSAnQGNsaWNrJykge1xyXG4gIC8vICAgICAgICAgICAgICAgICBidG5bbl0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBlID0+IHtcclxuICAvLyAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGZ1blttLnZhbHVlXSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gIC8vICAgICAgICAgICAgICAgICAgICAgZnVuW20udmFsdWVdKFxyXG4gIC8vICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogdGRbMF0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaW5wdXQnKVswXS52YWx1ZSxcclxuICAvLyAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6IHRkWzFdLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2lucHV0JylbMF0udmFsdWVcclxuICAvLyAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAvLyAgICAgICAgICAgICAgICAgICAgICAgaVxyXG4gIC8vICAgICAgICAgICAgICAgICAgICAgKVxyXG4gIC8vICAgICAgICAgICAgICAgICAgIH1cclxuICAvLyAgICAgICAgICAgICAgICAgfSlcclxuICAvLyAgICAgICAgICAgICAgICAgYnRuW25dLmF0dHJpYnV0ZXMucmVtb3ZlTmFtZWRJdGVtKG0ubmFtZSlcclxuICAvLyAgICAgICAgICAgICAgICAgYnJlYWtcclxuICAvLyAgICAgICAgICAgICAgIH1cclxuICAvLyAgICAgICAgICAgICB9XHJcbiAgLy8gICAgICAgICAgIH1cclxuICAvLyAgICAgICAgICAgYnJlYWtcclxuICAvLyAgICAgICAgIH1cclxuICAvLyAgICAgICB9XHJcbiAgLy8gICAgIH0sXHJcbiAgLy8gICAgIHZyRGVsZXRlOiBpID0+IHtcclxuICAvLyAgICAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnQuc3BsaWNlKGksIDEpXHJcbiAgLy8gICAgICAgdGhpcy5hdHRyaWJ1dGVWciA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudFxyXG4gIC8vICAgICB9LFxyXG5cclxuICAvLyAgICAgY29uZmlybUVkaXQ6ICh2YWx1ZSwgaSkgPT4ge1xyXG4gIC8vICAgICAgIGxldCBuYW1lID0gdmFsdWUubmFtZSAmJiB2YWx1ZS5uYW1lLnJlcGxhY2UoL1xccy9nLCAnJylcclxuICAvLyAgICAgICBsZXQgdXJsID0gdmFsdWUudXJsICYmIHZhbHVlLnVybC5yZXBsYWNlKC9cXHMvZywgJycpXHJcbiAgLy8gICAgICAgaWYgKG5hbWUgJiYgdXJsKSB7XHJcbiAgLy8gICAgICAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnRbaV0gPSB2YWx1ZVxyXG4gIC8vICAgICAgIH0gZWxzZSB7XHJcbiAgLy8gICAgICAgICB3aW5kb3cuRUxFTUVOVCAmJlxyXG4gIC8vICAgICAgICAgICB3aW5kb3cuRUxFTUVOVC5NZXNzYWdlKHtcclxuICAvLyAgICAgICAgICAgICBtZXNzYWdlOiAn5ZCN56ew5oiW6ZO+5o6l5LiN6IO95Li656m677yBJyxcclxuICAvLyAgICAgICAgICAgICB0eXBlOiAnd2FybmluZycsXHJcbiAgLy8gICAgICAgICAgICAgZHVyYXRpb246IDE1MDBcclxuICAvLyAgICAgICAgICAgfSlcclxuICAvLyAgICAgICB9XHJcbiAgLy8gICAgICAgdGhpcy5hdHRyaWJ1dGVWciA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudFxyXG4gIC8vICAgICB9LFxyXG4gIC8vICAgICBjYW5jZWxFZGl0OiAoKSA9PiB7XHJcbiAgLy8gICAgICAgdGhpcy5hdHRyaWJ1dGVWciA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudFxyXG4gIC8vICAgICB9LFxyXG4gIC8vICAgICBmaWxlU2VsZWN0OiAodmFsdWUsIGkpID0+IHtcclxuICAvLyAgICAgICBsZXQgZmlsZUVsbSA9IGl0ZW1baV0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnZmlsZS1zZWxlY3QnKVswXVxyXG4gIC8vICAgICAgIGZpbGVFbG0uY2xpY2soKVxyXG4gIC8vICAgICAgIGZpbGVFbG0ucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgZmlsZVNlbGVjdClcclxuICAvLyAgICAgICBmaWxlRWxtLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGZpbGVTZWxlY3QpXHJcbiAgLy8gICAgIH1cclxuICAvLyAgIH1cclxuICAvLyAgIGxldCBmaWxlU2VsZWN0ID0gZXZlbnQgPT4ge1xyXG4gIC8vICAgICBpZiAoZXZlbnQudGFyZ2V0LnZhbHVlKSB7XHJcbiAgLy8gICAgICAgbGV0IHRkID0gaXRlbVtcclxuICAvLyAgICAgICAgIGV2ZW50LnRhcmdldC5nZXRBdHRyaWJ1dGUoJ2luZGV4JylcclxuICAvLyAgICAgICBdLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RkJylcclxuICAvLyAgICAgICB0ZFsxXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdpbnB1dCcpWzBdLnZhbHVlID0gZXZlbnQudGFyZ2V0LnZhbHVlXHJcbiAgLy8gICAgICAgZXZlbnQudGFyZ2V0LnZhbHVlID0gbnVsbFxyXG4gIC8vICAgICB9XHJcbiAgLy8gICB9XHJcbiAgLy8gICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW0ubGVuZ3RoOyBpKyspIHtcclxuICAvLyAgICAgbGV0IGJ0biA9IGl0ZW1baV0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2J1dHRvbicpXHJcbiAgLy8gICAgIGZvciAobGV0IG4gPSAwOyBuIDwgYnRuLmxlbmd0aDsgbisrKSB7XHJcbiAgLy8gICAgICAgaWYgKCFidG5bbl0gfHwgIWJ0bltuXS5hdHRyaWJ1dGVzKSB7XHJcbiAgLy8gICAgICAgICBjb250aW51ZVxyXG4gIC8vICAgICAgIH1cclxuICAvLyAgICAgICBmb3IgKGxldCBtIG9mIGJ0bltuXS5hdHRyaWJ1dGVzKSB7XHJcbiAgLy8gICAgICAgICBpZiAobS5uYW1lID09PSAnQGNsaWNrJykge1xyXG4gIC8vICAgICAgICAgICBidG5bbl0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBlID0+IHtcclxuICAvLyAgICAgICAgICAgICBpZiAodHlwZW9mIGZ1blttLnZhbHVlXSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gIC8vICAgICAgICAgICAgICAgZnVuW20udmFsdWVdKGkpXHJcbiAgLy8gICAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgICB9KVxyXG4gIC8vICAgICAgICAgICBidG5bbl0uYXR0cmlidXRlcy5yZW1vdmVOYW1lZEl0ZW0obS5uYW1lKVxyXG4gIC8vICAgICAgICAgICBicmVha1xyXG4gIC8vICAgICAgICAgfVxyXG4gIC8vICAgICAgIH1cclxuICAvLyAgICAgfVxyXG4gIC8vICAgfVxyXG4gIC8vIH1cclxuXHJcbiAgLy8gZ2V0IGF0dHJpYnV0ZUdvb2RzKCkge1xyXG4gIC8vICAgcmV0dXJuIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUuZ29vZHMuY29udGVudFxyXG4gIC8vIH1cclxuXHJcbiAgLy8gc2V0IGF0dHJpYnV0ZUdvb2RzKHYpIHtcclxuICAvLyAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUuZ29vZHMuY29udGVudCA9IHZcclxuICAvLyB9XHJcblxyXG4gIGdldCBwb3NpdGlvbnMoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLnBvc2l0aW9uc1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGFzeW5jIGNyZWF0ZUxhYmVsKHRoYXQpIHtcclxuICAgIGxldCBoZWlnaHRcclxuICAgIGxldCBncm91bmRcclxuICAgIHN3aXRjaCAodGhhdC5vcHRpb25zLmhlaWdodE1vZGUpIHtcclxuICAgICAgY2FzZSAnMCc6XHJcbiAgICAgIGNhc2UgMDpcclxuICAgICAgICBncm91bmQgPSBmYWxzZVxyXG4gICAgICAgIGhlaWdodCA9IHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbMF0uYWx0XHJcbiAgICAgICAgYnJlYWtcclxuICAgICAgY2FzZSAnMSc6XHJcbiAgICAgIGNhc2UgMTpcclxuICAgICAgICBncm91bmQgPSBmYWxzZVxyXG4gICAgICAgIGhlaWdodCA9IGF3YWl0IHRoYXQuZ2V0Q2xhbXBUb0hlaWdodCh7XHJcbiAgICAgICAgICBsbmc6IHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbMF0ubG5nLFxyXG4gICAgICAgICAgbGF0OiB0aGF0Lm9wdGlvbnMucG9zaXRpb25zWzBdLmxhdFxyXG4gICAgICAgIH0pICsgdGhhdC5vcHRpb25zLnBvc2l0aW9uc1swXS5hbHRcclxuICAgICAgICBicmVha1xyXG4gICAgICBjYXNlICcyJzpcclxuICAgICAgY2FzZSAyOlxyXG4gICAgICAgIGdyb3VuZCA9IHRydWVcclxuICAgICAgICBoZWlnaHQgPSBhd2FpdCB0aGF0LmdldENsYW1wVG9IZWlnaHQoe1xyXG4gICAgICAgICAgbG5nOiB0aGF0Lm9wdGlvbnMucG9zaXRpb25zWzBdLmxuZyxcclxuICAgICAgICAgIGxhdDogdGhhdC5vcHRpb25zLnBvc2l0aW9uc1swXS5sYXRcclxuICAgICAgICB9KVxyXG4gICAgICAgIGJyZWFrXHJcbiAgICB9XHJcbiAgICBpZiAoIXRoYXQub3B0aW9ucy5sYWJlbC5wb3NpdGlvbikge1xyXG4gICAgICB0aGF0Lm9wdGlvbnMubGFiZWwucG9zaXRpb24gPSB7XHJcbiAgICAgICAgbG5nOiB0aGF0Lm9wdGlvbnMucG9zaXRpb25zWzBdLmxuZyxcclxuICAgICAgICBsYXQ6IHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbMF0ubGF0LFxyXG4gICAgICAgIGFsdDogaGVpZ2h0XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoYXQubGFiZWwgPSBuZXcgTGFiZWxPYmplY3QodGhhdC5zZGssIHtcclxuICAgICAgaWQ6IHRoYXQub3B0aW9ucy5pZCxcclxuICAgICAgc2hvdzogdGhhdC5vcHRpb25zLnNob3cgPyB0aGF0Lm9wdGlvbnMubGFiZWwuc2hvdyA6IGZhbHNlLFxyXG4gICAgICBwb3NpdGlvbjogW1xyXG4gICAgICAgIHRoYXQub3B0aW9ucy5sYWJlbC5wb3NpdGlvbi5sbmcsXHJcbiAgICAgICAgdGhhdC5vcHRpb25zLmxhYmVsLnBvc2l0aW9uLmxhdCxcclxuICAgICAgICB0aGF0Lm9wdGlvbnMubGFiZWwucG9zaXRpb24uYWx0XHJcbiAgICAgIF0sXHJcbiAgICAgIHRleHQ6IHRoYXQub3B0aW9ucy5uYW1lLFxyXG4gICAgICBmb250U2l6ZTogdGhhdC5vcHRpb25zLmxhYmVsLmZvbnRTaXplLFxyXG4gICAgICBmb250RmFtaWx5OiB0aGF0Lm9wdGlvbnMubGFiZWwuZm9udEZhbWlseSxcclxuICAgICAgY29sb3I6IHRoYXQub3B0aW9ucy5sYWJlbC5jb2xvcixcclxuICAgICAgcGl4ZWxPZmZzZXQ6IHRoYXQub3B0aW9ucy5sYWJlbC5waXhlbE9mZnNldCxcclxuICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGF0Lm9wdGlvbnMubGFiZWwuYmFja2dyb3VuZENvbG9yLFxyXG4gICAgICBsaW5lQ29sb3I6IHRoYXQub3B0aW9ucy5sYWJlbC5saW5lQ29sb3IsXHJcbiAgICAgIGxpbmVXaWR0aDogdGhhdC5vcHRpb25zLmxhYmVsLmxpbmVXaWR0aCxcclxuICAgICAgc2NhbGVCeURpc3RhbmNlOiB0aGF0Lm9wdGlvbnMubGFiZWwuc2NhbGVCeURpc3RhbmNlLFxyXG4gICAgICBuZWFyOiB0aGF0Lm9wdGlvbnMubGFiZWwubmVhcixcclxuICAgICAgZmFyOiB0aGF0Lm9wdGlvbnMubGFiZWwuZmFyLFxyXG4gICAgICBncm91bmQ6IGdyb3VuZFxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIHN0YXRpYyBjcmVhdGUodGhhdCkge1xyXG5cclxuICAgIGxldCBncm91bmRcclxuICAgIGlmICh0aGF0LmhlaWdodE1vZGUgPT0gMikge1xyXG4gICAgICBncm91bmQgPSB0cnVlXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBncm91bmQgPSBmYWxzZVxyXG4gICAgfVxyXG4gICAgbGV0IHBvc2l0aW9ucyA9IHRoYXQub3B0aW9ucy5wb3NpdGlvbnNcclxuICAgIGxldCBmcm9tRGVncmVlc0FycmF5ID0gdGhhdC5yZW5ld1Bvc2l0aW9ucyhwb3NpdGlvbnMpXHJcbiAgICB0aGF0LmVudGl0eSA9IHRoYXQuc2RrLnZpZXdlci5lbnRpdGllcy5hZGQoe1xyXG4gICAgICBpZDogdGhhdC5vcHRpb25zLmlkLFxyXG4gICAgICBzaG93OiB0aGF0Lm9wdGlvbnMuc2hvdyxcclxuICAgICAgcG9seWxpbmU6IHtcclxuICAgICAgICBwb3NpdGlvbnM6IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzQXJyYXlIZWlnaHRzKGZyb21EZWdyZWVzQXJyYXkpLFxyXG4gICAgICAgIHdpZHRoOiB0aGF0Lm9wdGlvbnMud2lkdGgsXHJcbiAgICAgICAgY2xhbXBUb0dyb3VuZDogZ3JvdW5kLFxyXG4gICAgICAgIC8vIG1hdGVyaWFsOiB0aGF0LmdldE1hdGVyaWFsKHRoYXQub3B0aW9ucy5jb2xvciwgdGhhdC5vcHRpb25zLnR5cGUsIHRoYXQuZW50aXR5LCB0aGF0Lm9wdGlvbnMpLFxyXG4gICAgICAgIHpJbmRleDogdGhhdC5zZGsuX2VudGl0eVpJbmRleFxyXG4gICAgICB9XHJcbiAgICB9KVxyXG5cclxuICAgIHRoYXQuZW50aXR5LnBvbHlsaW5lLm9yaVdpZHRoID0gdGhhdC5vcHRpb25zLndpZHRoXHJcbiAgICB0aGF0Lmp1ZGdlTGluZSh0aGF0LmVudGl0eSwgdGhhdC5vcHRpb25zKVxyXG4gICAgbGV0IHBhcmFtcyA9IHsgLi4udGhhdC5vcHRpb25zIH1cclxuICAgIHBhcmFtcy5zcGVlZCA9IHRoYXQuaW5wdXRTcGVlZFxyXG4gICAgdGhhdC5lbnRpdHkucG9seWxpbmUubWF0ZXJpYWwgPSB0aGF0LmdldE1hdGVyaWFsKFxyXG4gICAgICB0aGF0Lm9wdGlvbnMuY29sb3IsXHJcbiAgICAgIHRoYXQub3B0aW9ucy50eXBlLFxyXG4gICAgICB0aGF0LmVudGl0eSxcclxuICAgICAgcGFyYW1zXHJcbiAgICApXHJcbiAgICB0aGF0LnNkay5fZW50aXR5WkluZGV4KytcclxuICAgIFBvbHlsaW5lT2JqZWN0LmNyZWF0ZUxhYmVsKHRoYXQpXHJcbiAgICAvLyB0aGF0LmVudGl0eS5wb2x5bGluZS5wb3NpdGlvbnNMbmdMYXQgPSBwb3NpdGlvbnNcclxuICAgIHRoYXQucmVuZXdQb2x5Z29uKGZyb21EZWdyZWVzQXJyYXkpXHJcbiAgICB0aGF0LmNvbXB1dGVEaXN0YW5jZShcclxuICAgICAgcG9zaXRpb25zLFxyXG4gICAgICAyLFxyXG4gICAgICB0aGF0Lm9wdGlvbnMud29yZHNOYW1lXHJcbiAgICApLnRoZW4ocmVzID0+IHtcclxuICAgICAgdGhhdC5sZW5ndGhCeU1ldGVyID0gcmVzXHJcbiAgICAgIHRoYXQubGVuZ3RoQ2hhbmdlQ2FsbEJhY2sgJiYgdGhhdC5sZW5ndGhDaGFuZ2VDYWxsQmFjaygpXHJcbiAgICAgIHN5bmNEYXRhKHRoYXQuc2RrLCB0aGF0Lm9wdGlvbnMuaWQpXHJcbiAgICB9KVxyXG4gICAgaWYgKHRoYXQub3B0aW9ucy5zaG93KSB7XHJcbiAgICAgIHNldFNwbGl0RGlyZWN0aW9uKDAsIHRoYXQub3B0aW9ucy5pZClcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy8gaWYgKHRoaXMub3B0aW9ucy5ub3NlVG9UYWlsKSB7XHJcbiAgICAvLyAgIGxldCBhcnJheSA9IFtdXHJcbiAgICAvLyAgIGZvciAobGV0IGkgPSAwOyBpIDwgZnJvbURlZ3JlZXNBcnJheS5sZW5ndGg7IGkgKz0gMikge1xyXG4gICAgLy8gICAgIGFycmF5LnB1c2goeyBsbmc6IGZyb21EZWdyZWVzQXJyYXlbaV0sIGxhdDogZnJvbURlZ3JlZXNBcnJheVtpICsgMV0gfSlcclxuICAgIC8vICAgfVxyXG4gICAgLy8gICB0aGlzLm9wdGlvbnMuZml0X2xlbmd0aCA9IHRvb2wuY29tcHV0ZURpc3RhbmNlKGFycmF5KVxyXG4gICAgLy8gfVxyXG4gICAgLy8gZWxzZSB7XHJcbiAgICAvLyAgIHRoaXMub3B0aW9ucy5maXRfbGVuZ3RoID0gdG9vbC5jb21wdXRlRGlzdGFuY2UocG9zaXRpb25zKVxyXG4gICAgLy8gfVxyXG4gICAgLy8gaWYgKHRoaXMub3B0aW9ucy5maXRfbGVuZ3RoX3VuaXQgPT09ICdrbScpIHtcclxuICAgIC8vICAgdGhpcy5vcHRpb25zLmZpdF9sZW5ndGggPSB0aGlzLm9wdGlvbnMuZml0X2xlbmd0aCAvIDEwMDBcclxuICAgIC8vIH1cclxuXHJcbiAgICBsZXQgc2NlbmUgPSB0aGF0LnNkay52aWV3ZXIuc2NlbmVcclxuICB9XHJcbiAganVkZ2VMaW5lKGVudGl0eSwgbmV3UGFyYW0pIHtcclxuICAgIGlmICghZW50aXR5LnBvbHlsaW5lLm9yaVJlcGVhdCkge1xyXG4gICAgICBsZXQgcGFyYW0gPSB7XHJcbiAgICAgICAgY29sb3I6IG5ld1BhcmFtLmNvbG9yLFxyXG4gICAgICAgIGltYWdlOiB0aGlzLmdldFNvdXJjZVJvb3RQYXRoKCkgKyBgL2ltZy9hcnJvdy8xLnBuZ2AsXHJcbiAgICAgICAgc3BhY2U6IG5ld1BhcmFtLnNwYWNlLFxyXG4gICAgICAgIHNwZWVkOiBuZXdQYXJhbS5zcGVlZFxyXG4gICAgICB9XHJcblxyXG4gICAgICBwYXJhbS5zcGVlZCA9IG5ld1BhcmFtLnJvdGF0ZSA/IHBhcmFtLnNwZWVkIDogMCAtIHBhcmFtLnNwZWVkXHJcblxyXG4gICAgICBjb25zdCBjYW52YXNFbGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcclxuICAgICAgY29uc3QgY3R4ID0gY2FudmFzRWxlLmdldENvbnRleHQoJzJkJylcclxuICAgICAgY29uc3QgbXlJbWcgPSBuZXcgSW1hZ2UoKVxyXG4gICAgICAvLyBteUltZy5zcmMgPSB0aGF0LmdldFNvdXJjZVJvb3RQYXRoKCkgKyAnL2ltZy9hcnJvdy8xLnBuZydcclxuICAgICAgbXlJbWcuc3JjID0gcGFyYW0uaW1hZ2VcclxuICAgICAgbGV0IHRoYXQgPSB0aGlzXHJcbiAgICAgIG15SW1nLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBjYW52YXNFbGUud2lkdGggPSBteUltZy53aWR0aCAqIChwYXJhbS5zcGFjZSArIDEpXHJcbiAgICAgICAgY2FudmFzRWxlLmhlaWdodCA9IG15SW1nLmhlaWdodFxyXG5cclxuICAgICAgICBsZXQgb3JpUmVwZWF0ID0gdGhhdC5nZXRTY2VlbkxpbmUoZW50aXR5LCBwYXJhbSwgY2FudmFzRWxlKVxyXG4gICAgICAgIG9yaVJlcGVhdCAmJiAoZW50aXR5LnBvbHlsaW5lLm9yaVJlcGVhdCA9IG9yaVJlcGVhdClcclxuXHJcblxyXG4gICAgICAgIHZhciBwb3NpdGlvblByb3BlcnR5ID0gZW50aXR5LnBvbHlsaW5lLnBvc2l0aW9ucztcclxuICAgICAgICB2YXIgcG9zaXRpb25zID0gcG9zaXRpb25Qcm9wZXJ0eS5nZXRWYWx1ZSh0aGF0LnNkay52aWV3ZXIuY2xvY2suY3VycmVudFRpbWUpO1xyXG5cclxuICAgICAgICBpZiAoIUNlc2l1bS5kZWZpbmVkKHBvc2l0aW9ucykpIHtcclxuICAgICAgICAgIHJldHVybiBuZXcgQ2VzaXVtLkNhcnRlc2lhbjIoMS4wLCAxLjApO1xyXG4gICAgICAgICAgLy8gcmV0dXJuIDEuMDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBkaXN0YW5jZSA9IDA7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwb3NpdGlvbnMubGVuZ3RoIC0gMTsgKytpKSB7XHJcbiAgICAgICAgICBkaXN0YW5jZSArPSBDZXNpdW0uQ2FydGVzaWFuMy5kaXN0YW5jZShwb3NpdGlvbnNbaV0sIHBvc2l0aW9uc1tpICsgMV0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIHJlcGVhdFggPSBkaXN0YW5jZSAvIGVudGl0eS5wb2x5bGluZS53aWR0aC5nZXRWYWx1ZSgpO1xyXG4gICAgICAgIC8vIOagueaNruWcsOWbvue8qeaUvueoi+W6puiwg+aVtHJlcGVhdFhcclxuICAgICAgICB2YXIgY2FtZXJhSGVpZ2h0ID0gdGhhdC5zZGsudmlld2VyLmNhbWVyYS5wb3NpdGlvbkNhcnRvZ3JhcGhpYy5oZWlnaHQ7XHJcbiAgICAgICAgdmFyIGJvdW5kaW5nU3BoZXJlID0gbmV3IENlc2l1bS5Cb3VuZGluZ1NwaGVyZShcclxuICAgICAgICAgIG5ldyBDZXNpdW0uQ2FydGVzaWFuMygtMTAwMDAwMCwgMCwgMCksIC8vIOS4reW/g+eCueWdkOagh1xyXG4gICAgICAgICAgNTAwMDAwIC8vIOWNiuW+hO+8iOi3neemu++8iVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIC8vIOiOt+WPlue7mOWbvue8k+WGsuWMuueahOWuveW6puWSjOmrmOW6pu+8iOmAmuW4uOaYr+Wxj+W5leeahOWIhui+qOeOh++8iVxyXG4gICAgICAgIHZhciBkcmF3aW5nQnVmZmVyV2lkdGggPSB0aGF0LnNkay52aWV3ZXIuY2FudmFzLmNsaWVudFdpZHRoO1xyXG4gICAgICAgIHZhciBkcmF3aW5nQnVmZmVySGVpZ2h0ID0gdGhhdC5zZGsudmlld2VyLmNhbnZhcy5jbGllbnRIZWlnaHQ7XHJcblxyXG4gICAgICAgIC8vIOS9v+eUqCBnZXRQaXhlbFNpemUg5pa55rOV6I635Y+W5YyF5Zu055CD5Zyo5bGP5bmV5LiK55qE5YOP57Sg5aSn5bCPXHJcbiAgICAgICAgdmFyIGdyb3VuZFJlc29sdXRpb24gPSB0aGF0LnNkay52aWV3ZXIuc2NlbmUuY2FtZXJhLmdldFBpeGVsU2l6ZShib3VuZGluZ1NwaGVyZSwgZHJhd2luZ0J1ZmZlcldpZHRoLCBkcmF3aW5nQnVmZmVySGVpZ2h0KVxyXG4gICAgICAgIHJlcGVhdFggKj0gZ3JvdW5kUmVzb2x1dGlvbiAvIGNhbWVyYUhlaWdodCAvIChwYXJhbS5zcGFjZSAqIChjYW52YXNFbGUud2lkdGggLyBjYW52YXNFbGUuaGVpZ2h0ICogNSkgKyAxKTtcclxuICAgICAgICAvLyBpZiAoZW50aXR5LnBvbHlsaW5lLm1hdGVyaWFsLm9yaVJlcGVhdCkge1xyXG5cclxuICAgICAgICBpZiAodGhhdC5zZGsudmlld2VyLnNjZW5lLm1vZGUgPT09IENlc2l1bS5TY2VuZU1vZGUuU0NFTkUzRCkge1xyXG4gICAgICAgICAgbGV0IHNwZWVkID0gcmVwZWF0WCAvIGVudGl0eS5wb2x5bGluZS5vcmlSZXBlYXRcclxuICAgICAgICAgIGVudGl0eS5wb2x5bGluZS5vcmlTcGVlZCA9IHNwZWVkXHJcbiAgICAgICAgICBlbnRpdHkucG9seWxpbmUub3JpUmVwZWF0WCA9IHJlcGVhdFhcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgbGV0IHNkazNkID0gZ2V0M0RWaWV3KClcclxuICAgICAgICAgIGxldCBzZGszZEVudGl0eSA9IHNkazNkLnZpZXdlci5lbnRpdGllcy5nZXRCeUlkKHRoYXQub3B0aW9ucy5pZClcclxuICAgICAgICAgIGVudGl0eS5wb2x5bGluZS5vcmlTcGVlZCA9IHNkazNkRW50aXR5LnBvbHlsaW5lLm9yaVNwZWVkXHJcbiAgICAgICAgICBlbnRpdHkucG9seWxpbmUub3JpUmVwZWF0WCA9IHNkazNkRW50aXR5LnBvbHlsaW5lLm9yaVJlcGVhdFhcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcblxyXG5cclxuXHJcbiAgICB9XHJcbiAgfVxyXG4gIC8qKuiOt+WPluW9k+WJjea7oeWxj+aoque6v+mAn+W6piAqL1xyXG4gIGdldFNjZWVuTGluZShlbnRpdHksIG9wdGlvbnMsIGNhbnZhc0VsZSkge1xyXG4gICAgbGV0IHBvaW50MSA9IG5ldyBDZXNpdW0uQ2FydGVzaWFuMigwLCB0aGlzLnNkay52aWV3ZXIuY2FudmFzLmNsaWVudEhlaWdodClcclxuICAgIGxldCBwb2ludDIgPSBuZXcgQ2VzaXVtLkNhcnRlc2lhbjIodGhpcy5zZGsudmlld2VyLmNhbnZhcy5jbGllbnRXaWR0aCAvIDIsIHRoaXMuc2RrLnZpZXdlci5jYW52YXMuY2xpZW50SGVpZ2h0KVxyXG4gICAgLy8gdmFyIGNhcnRlc2lhbjEgPSB0aGlzLnNkay52aWV3ZXIuc2NlbmUucGlja1Bvc2l0aW9uKHBvaW50MSlcclxuICAgIC8vIHZhciBjYXJ0ZXNpYW4yID0gdGhpcy5zZGsudmlld2VyLnNjZW5lLnBpY2tQb3NpdGlvbihwb2ludDIpXHJcblxyXG4gICAgbGV0IHJheSA9IHRoaXMuc2RrLnZpZXdlci5jYW1lcmEuZ2V0UGlja1JheShwb2ludDEpO1xyXG4gICAgbGV0IGNhcnRlc2lhbjEgPSB0aGlzLnNkay52aWV3ZXIuc2NlbmUuZ2xvYmUucGljayhyYXksIHRoaXMuc2RrLnZpZXdlci5zY2VuZSk7XHJcblxyXG4gICAgbGV0IHJheTIgPSB0aGlzLnNkay52aWV3ZXIuY2FtZXJhLmdldFBpY2tSYXkocG9pbnQyKTtcclxuICAgIGxldCBjYXJ0ZXNpYW4yID0gdGhpcy5zZGsudmlld2VyLnNjZW5lLmdsb2JlLnBpY2socmF5MiwgdGhpcy5zZGsudmlld2VyLnNjZW5lKTtcclxuICAgIC8vIGlmICghY2FydGVzaWFuMSB8fCAhY2FydGVzaWFuMikge1xyXG4gICAgLy8gICBsZXQgcmF5ID0gdGhpcy5zZGsudmlld2VyLmNhbWVyYS5nZXRQaWNrUmF5KHBvaW50MSk7XHJcbiAgICAvLyAgIGNhcnRlc2lhbjEgPSB0aGlzLnNkay52aWV3ZXIuc2NlbmUuZ2xvYmUucGljayhyYXksIHRoaXMuc2RrLnZpZXdlci5zY2VuZSk7XHJcblxyXG4gICAgLy8gICBsZXQgcmF5MiA9IHRoaXMuc2RrLnZpZXdlci5jYW1lcmEuZ2V0UGlja1JheShwb2ludDIpO1xyXG4gICAgLy8gICBjYXJ0ZXNpYW4yID0gdGhpcy5zZGsudmlld2VyLnNjZW5lLmdsb2JlLnBpY2socmF5MiwgdGhpcy5zZGsudmlld2VyLnNjZW5lKTtcclxuICAgIC8vIH1cclxuICAgIGlmIChjYXJ0ZXNpYW4xICYmIGNhcnRlc2lhbjIpIHtcclxuXHJcblxyXG4gICAgICB2YXIgZGlzdGFuY2UgPSBDZXNpdW0uQ2FydGVzaWFuMy5kaXN0YW5jZShjYXJ0ZXNpYW4xLCBjYXJ0ZXNpYW4yKTtcclxuXHJcbiAgICAgIHZhciByZXBlYXRYID0gZGlzdGFuY2UgLyBlbnRpdHkucG9seWxpbmUud2lkdGguZ2V0VmFsdWUoKTtcclxuICAgICAgLy8g5qC55o2u5Zyw5Zu+57yp5pS+56iL5bqm6LCD5pW0cmVwZWF0WFxyXG4gICAgICB2YXIgY2FtZXJhSGVpZ2h0ID0gdGhpcy5zZGsudmlld2VyLmNhbWVyYS5wb3NpdGlvbkNhcnRvZ3JhcGhpYy5oZWlnaHQ7XHJcbiAgICAgIHZhciBib3VuZGluZ1NwaGVyZSA9IG5ldyBDZXNpdW0uQm91bmRpbmdTcGhlcmUoXHJcbiAgICAgICAgbmV3IENlc2l1bS5DYXJ0ZXNpYW4zKC0xMDAwMDAwLCAwLCAwKSwgLy8g5Lit5b+D54K55Z2Q5qCHXHJcbiAgICAgICAgNTAwMDAwIC8vIOWNiuW+hO+8iOi3neemu++8iVxyXG4gICAgICApO1xyXG5cclxuXHJcbiAgICAgIC8vIOiOt+WPlue7mOWbvue8k+WGsuWMuueahOWuveW6puWSjOmrmOW6pu+8iOmAmuW4uOaYr+Wxj+W5leeahOWIhui+qOeOh++8iVxyXG4gICAgICB2YXIgZHJhd2luZ0J1ZmZlcldpZHRoID0gdGhpcy5zZGsudmlld2VyLmNhbnZhcy5jbGllbnRXaWR0aDtcclxuICAgICAgdmFyIGRyYXdpbmdCdWZmZXJIZWlnaHQgPSB0aGlzLnNkay52aWV3ZXIuY2FudmFzLmNsaWVudEhlaWdodDtcclxuXHJcbiAgICAgIC8vIOS9v+eUqCBnZXRQaXhlbFNpemUg5pa55rOV6I635Y+W5YyF5Zu055CD5Zyo5bGP5bmV5LiK55qE5YOP57Sg5aSn5bCPXHJcbiAgICAgIHZhciBncm91bmRSZXNvbHV0aW9uID0gdGhpcy5zZGsudmlld2VyLnNjZW5lLmNhbWVyYS5nZXRQaXhlbFNpemUoYm91bmRpbmdTcGhlcmUsIGRyYXdpbmdCdWZmZXJXaWR0aCwgZHJhd2luZ0J1ZmZlckhlaWdodClcclxuICAgICAgLy8gcmVwZWF0WCAqPSBncm91bmRSZXNvbHV0aW9uIC8gY2FtZXJhSGVpZ2h0IC8gKChteUltZy53aWR0aCAvIG15SW1nLmhlaWdodCAqIDUpICsgMSk7XHJcbiAgICAgIGlmIChncm91bmRSZXNvbHV0aW9uID4gNzAwKSB7XHJcbiAgICAgICAgcmVwZWF0WCAqPSBncm91bmRSZXNvbHV0aW9uIC8gY2FtZXJhSGVpZ2h0IC8gKG9wdGlvbnMuc3BhY2UgKiAoY2FudmFzRWxlLndpZHRoIC8gY2FudmFzRWxlLmhlaWdodCAqIDUpICsgMSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmVwZWF0WCA9IHVuZGVmaW5lZDtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHRoaXMuc2RrLnZpZXdlci5zY2VuZS5tb2RlID09PSBDZXNpdW0uU2NlbmVNb2RlLlNDRU5FM0QpIHtcclxuICAgICAgICByZXR1cm4gcmVwZWF0WFxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGxldCBzZGszZCA9IGdldDNEVmlldygpXHJcbiAgICAgICAgbGV0IHNkazNkRW50aXR5ID0gc2RrM2Qudmlld2VyLmVudGl0aWVzLmdldEJ5SWQodGhpcy5vcHRpb25zLmlkKVxyXG4gICAgICAgIHJldHVybiBzZGszZEVudGl0eS5wb2x5bGluZS5vcmlSZXBlYXRYXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbiAgLyoqXHJcbiAgICog57yW6L6R5qGGXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBzdGF0ZSB0cnVl5omT5byA77yMZmFsc2XlhbPpl61cclxuICAgKi9cclxuICBhc3luYyBlZGl0KHN0YXRlKSB7XHJcbiAgICByZXR1cm5cclxuICAgIGxldCBfdGhpcyA9IHRoaXNcclxuICAgIHRoaXMub3JpZ2luYWxPcHRpb25zID0gdGhpcy5kZWVwQ29weU9iaih0aGlzLm9wdGlvbnMpXHJcbiAgICBpZiAodGhpcy5fRGlhbG9nT2JqZWN0ICYmIHRoaXMuX0RpYWxvZ09iamVjdC5jbG9zZSkge1xyXG4gICAgICB0aGlzLl9EaWFsb2dPYmplY3QuY2xvc2UoKVxyXG4gICAgICB0aGlzLl9EaWFsb2dPYmplY3QgPSBudWxsXHJcbiAgICB9XHJcbiAgICBpZiAoc3RhdGUpIHtcclxuICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0ID0gYXdhaXQgbmV3IERpYWxvZyh0aGlzLnNkaywgdGhpcy5vcHRpb25zLCB7XHJcbiAgICAgICAgdGl0bGU6ICfnur/lsZ7mgKcnLFxyXG4gICAgICAgIGxlZnQ6ICcxODBweCcsXHJcbiAgICAgICAgdG9wOiAnMTAwcHgnLFxyXG4gICAgICAgIGNvbmZpcm1DYWxsQmFjazogb3B0aW9ucyA9PiB7XHJcbiAgICAgICAgICB0aGlzLm5hbWUgPSB0aGlzLm5hbWUudHJpbSgpXHJcbiAgICAgICAgICBpZiAoIXRoaXMubmFtZSkge1xyXG4gICAgICAgICAgICB0aGlzLm5hbWUgPSAn5pyq5ZG95ZCN5a+56LGhJ1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5vcHRpb25zLmxhYmVsLnBvc2l0aW9uID0ge1xyXG4gICAgICAgICAgICBsbmc6IHRoaXMubGFiZWwucG9zaXRpb25bMF0sXHJcbiAgICAgICAgICAgIGxhdDogdGhpcy5sYWJlbC5wb3NpdGlvblsxXSxcclxuICAgICAgICAgICAgYWx0OiB0aGlzLmxhYmVsLnBvc2l0aW9uWzJdXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLm9yaWdpbmFsT3B0aW9ucyA9IHRoaXMuZGVlcENvcHlPYmoodGhpcy5vcHRpb25zKVxyXG4gICAgICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0LmNsb3NlKClcclxuICAgICAgICAgIHRoaXMuRGlhbG9nLmNvbmZpcm1DYWxsQmFjayAmJlxyXG4gICAgICAgICAgICB0aGlzLkRpYWxvZy5jb25maXJtQ2FsbEJhY2sodGhpcy5vcmlnaW5hbE9wdGlvbnMpXHJcbiAgICAgICAgICBzeW5jRGF0YSh0aGlzLnNkaywgdGhpcy5vcHRpb25zLmlkKVxyXG4gICAgICAgICAgc3luY1NwbGl0RGF0YSh0aGlzLnNkaywgdGhpcy5vcHRpb25zLmlkKVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgcmVzZXRDYWxsQmFjazogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5yZXNldCgpXHJcbiAgICAgICAgICB0aGlzLkRpYWxvZy5yZXNldENhbGxCYWNrICYmIHRoaXMuRGlhbG9nLnJlc2V0Q2FsbEJhY2soKVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgcmVtb3ZlQ2FsbEJhY2s6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMuRGlhbG9nLnJlbW92ZUNhbGxCYWNrICYmIHRoaXMuRGlhbG9nLnJlbW92ZUNhbGxCYWNrKClcclxuICAgICAgICB9LFxyXG4gICAgICAgIGNsb3NlQ2FsbEJhY2s6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMucmVzZXQoKVxyXG4gICAgICAgICAgdGhpcy5EaWFsb2cuY2xvc2VDYWxsQmFjayAmJiB0aGlzLkRpYWxvZy5jbG9zZUNhbGxCYWNrKClcclxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5ub2RlUG9pbnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2RrLnZpZXdlci5lbnRpdGllcy5yZW1vdmUodGhpcy5ub2RlUG9pbnRzW2ldKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5ub2RlUG9pbnRzID0gW11cclxuICAgICAgICAgIHRoaXMucG9zaXRpb25FZGl0aW5nID0gZmFsc2VcclxuICAgICAgICAgIFlKLk1lYXN1cmUuU2V0TWVhc3VyZVN0YXR1cyhmYWxzZSlcclxuICAgICAgICAgIHRoaXMuZXZlbnQgJiYgdGhpcy5ldmVudC5kZXN0cm95KClcclxuICAgICAgICAgIHRoaXMudGlwICYmIHRoaXMudGlwLmRlc3Ryb3koKVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgc2hvd0NhbGxCYWNrOiBzaG93ID0+IHtcclxuICAgICAgICAgIHRoaXMub3B0aW9ucy5zaG93ID0gc2hvd1xyXG4gICAgICAgICAgdGhpcy5vcmlnaW5hbE9wdGlvbnMuc2hvdyA9IHNob3dcclxuICAgICAgICAgIHRoaXMuc2hvdyA9IHNob3dcclxuICAgICAgICAgIHRoaXMuRGlhbG9nLnNob3dDYWxsQmFjayAmJiB0aGlzLkRpYWxvZy5zaG93Q2FsbEJhY2soKVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgdHJhbnNsYXRpb25hbENhbGxCYWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnBvc2l0aW9uRWRpdGluZyA9ICF0aGlzLnBvc2l0aW9uRWRpdGluZ1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgLy8g5LqM5qyh57yW6L6R5Zue6LCDXHJcbiAgICAgICAgc2Vjb25kYXJ5RWRpdENhbGxCYWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLm5vZGVFZGl0KClcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICAgIHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5ib2R5LmNsYXNzTmFtZSA9XHJcbiAgICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmJvZHkuY2xhc3NOYW1lICsgJyBwb2x5bGluZSdcclxuICAgICAgbGV0IGNvbnRlbnRFbG0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKVxyXG4gICAgICBjb250ZW50RWxtLmlubmVySFRNTCA9IGh0bWwodGhpcylcclxuICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0LmNvbnRlbnRBcHBDaGlsZChjb250ZW50RWxtKVxyXG4gICAgICB0aGlzLmF0dHJpYnV0ZVR5cGUgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlVHlwZVxyXG4gICAgICAvLyB0aGlzLmF0dHJpYnV0ZUNhbWVyYSA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUuY2FtZXJhLmNvbnRlbnRcclxuICAgICAgLy8gdGhpcy5hdHRyaWJ1dGVHb29kcyA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUuZ29vZHMuY29udGVudFxyXG5cclxuICAgICAgZnVuY3Rpb24gdGFiQ2xpY2soZSkge1xyXG4gICAgICAgIGlmIChlID09PSAnMicgfHwgZSA9PT0gMikgey8v54K55Ye757q/5p2h5qC35byPXHJcbiAgICAgICAgICBpZiAoMiA8IF90aGlzLm9wdGlvbnMudHlwZSAmJiBfdGhpcy5vcHRpb25zLnR5cGUgPCAxMykgey8v6LS05Zu+5Y+C5pWwXHJcbiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkYXNoVGV4dHVyZURvbScpICYmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGFzaFRleHR1cmVEb20nKS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnKVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rhc2hUZXh0dXJlRG9tJykgJiYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkYXNoVGV4dHVyZURvbScpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZScpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyDliJvlu7rmoIfnrb7pobVcclxuICAgICAgbGV0IHRhYnNFbG0gPSBuZXcgY3lfdGFicyhcclxuICAgICAgICAncG9seWxpbmUtb2JqZWN0LWVkaXQtdGFicycsXHJcbiAgICAgICAgdGFiQ2xpY2ssXHJcbiAgICAgICAgdGhpcy5zZGtcclxuICAgICAgKVxyXG4gICAgICAvLyDpopzoibLnu4Tku7ZcclxuICAgICAgbGV0IGNvbG9yUGlja2VyID0gbmV3IFlKQ29sb3JQaWNrZXIoe1xyXG4gICAgICAgIGVsOiBjb250ZW50RWxtLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2NvbG9yJylbMF0sXHJcbiAgICAgICAgc2l6ZTogJ21pbmknLCAvL+minOiJsmJveOexu+Wei1xyXG4gICAgICAgIGFscGhhOiB0cnVlLCAvL+aYr+WQpuW8gOWQr+mAj+aYjuW6plxyXG4gICAgICAgIGRlZmF1bHRDb2xvcjogdGhpcy5jb2xvcixcclxuICAgICAgICBkaXNhYmxlZDogZmFsc2UsIC8v5piv5ZCm56aB5q2i5omT5byA6aKc6Imy6YCJ5oup5ZmoXHJcbiAgICAgICAgb3BlblBpY2tlckFuaTogJ29wYWNpdHknLCAvL+aJk+W8gOminOiJsumAieaLqeWZqOWKqOeUu1xyXG4gICAgICAgIHN1cmU6IGNvbG9yID0+IHtcclxuICAgICAgICAgIHRoaXMuY29sb3IgPSBjb2xvclxyXG4gICAgICAgIH0sIC8v54K55Ye756Gu6K6k5oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgICAgY2xlYXI6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMuY29sb3IgPSAncmdiYSgyNTUsMjU1LDI1NSwxKSdcclxuICAgICAgICB9IC8v54K55Ye75riF56m65oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgIH0pXHJcbiAgICAgIGxldCBsYWJlbENvbG9yUGlja2VyID0gbmV3IFlKQ29sb3JQaWNrZXIoe1xyXG4gICAgICAgIGVsOiBjb250ZW50RWxtLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xhYmVsQ29sb3InKVswXSxcclxuICAgICAgICBzaXplOiAnbWluaScsIC8v6aKc6ImyYm9457G75Z6LXHJcbiAgICAgICAgYWxwaGE6IHRydWUsIC8v5piv5ZCm5byA5ZCv6YCP5piO5bqmXHJcbiAgICAgICAgZGVmYXVsdENvbG9yOiB0aGlzLmxhYmVsQ29sb3IsXHJcbiAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLCAvL+aYr+WQpuemgeatouaJk+W8gOminOiJsumAieaLqeWZqFxyXG4gICAgICAgIG9wZW5QaWNrZXJBbmk6ICdvcGFjaXR5JywgLy/miZPlvIDpopzoibLpgInmi6nlmajliqjnlLtcclxuICAgICAgICBzdXJlOiBjb2xvciA9PiB7XHJcbiAgICAgICAgICB0aGlzLmxhYmVsQ29sb3IgPSBjb2xvclxyXG4gICAgICAgIH0sIC8v54K55Ye756Gu6K6k5oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgICAgY2xlYXI6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMubGFiZWxDb2xvciA9ICdyZ2JhKDI1NSwyNTUsMjU1LDEpJ1xyXG4gICAgICAgIH0gLy/ngrnlh7vmuIXnqbrmjInpkq7kuovku7blm57osINcclxuICAgICAgfSlcclxuICAgICAgbGV0IGV4dGVuZENvbG9yUGlja2VyID0gbmV3IFlKQ29sb3JQaWNrZXIoe1xyXG4gICAgICAgIGVsOiBjb250ZW50RWxtLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2V4dGVuZENvbG9yJylbMF0sXHJcbiAgICAgICAgc2l6ZTogJ21pbmknLCAvL+minOiJsmJveOexu+Wei1xyXG4gICAgICAgIGFscGhhOiB0cnVlLCAvL+aYr+WQpuW8gOWQr+mAj+aYjuW6plxyXG4gICAgICAgIGRlZmF1bHRDb2xvcjogdGhpcy5leHRlbmRDb2xvcixcclxuICAgICAgICBkaXNhYmxlZDogZmFsc2UsIC8v5piv5ZCm56aB5q2i5omT5byA6aKc6Imy6YCJ5oup5ZmoXHJcbiAgICAgICAgb3BlblBpY2tlckFuaTogJ29wYWNpdHknLCAvL+aJk+W8gOminOiJsumAieaLqeWZqOWKqOeUu1xyXG4gICAgICAgIHN1cmU6IGNvbG9yID0+IHtcclxuICAgICAgICAgIHRoaXMuZXh0ZW5kQ29sb3IgPSBjb2xvclxyXG4gICAgICAgIH0sIC8v54K55Ye756Gu6K6k5oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgICAgY2xlYXI6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMuZXh0ZW5kQ29sb3IgPSAncmdiYSgyNTUsMjU1LDI1NSwxKSdcclxuICAgICAgICB9IC8v54K55Ye75riF56m65oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgIH0pXHJcbiAgICAgIGxldCBsaW5lQ29sb3JQaWNrZXIgPSBuZXcgWUpDb2xvclBpY2tlcih7XHJcbiAgICAgICAgZWw6IGNvbnRlbnRFbG0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbGFiZWxMaW5lQ29sb3InKVswXSxcclxuICAgICAgICBzaXplOiAnbWluaScsIC8v6aKc6ImyYm9457G75Z6LXHJcbiAgICAgICAgYWxwaGE6IHRydWUsIC8v5piv5ZCm5byA5ZCv6YCP5piO5bqmXHJcbiAgICAgICAgZGVmYXVsdENvbG9yOiB0aGlzLmxhYmVsTGluZUNvbG9yLFxyXG4gICAgICAgIGRpc2FibGVkOiBmYWxzZSwgLy/mmK/lkKbnpoHmraLmiZPlvIDpopzoibLpgInmi6nlmahcclxuICAgICAgICBvcGVuUGlja2VyQW5pOiAnb3BhY2l0eScsIC8v5omT5byA6aKc6Imy6YCJ5oup5Zmo5Yqo55S7XHJcbiAgICAgICAgc3VyZTogY29sb3IgPT4ge1xyXG4gICAgICAgICAgdGhpcy5sYWJlbExpbmVDb2xvciA9IGNvbG9yXHJcbiAgICAgICAgfSwgLy/ngrnlh7vnoa7orqTmjInpkq7kuovku7blm57osINcclxuICAgICAgICBjbGVhcjogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5sYWJlbExpbmVDb2xvciA9ICdyZ2JhKDI1NSwyNTUsMjU1LDEpJ1xyXG4gICAgICAgIH0gLy/ngrnlh7vmuIXnqbrmjInpkq7kuovku7blm57osINcclxuICAgICAgfSlcclxuICAgICAgX3RoaXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JTdGFydFBpY2tlciA9IG5ldyBZSkNvbG9yUGlja2VyKHtcclxuICAgICAgICBlbDogY29udGVudEVsbS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdsYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0JylbMF0sXHJcbiAgICAgICAgc2l6ZTogJ21pbmknLFxyXG4gICAgICAgIGFscGhhOiB0cnVlLFxyXG4gICAgICAgIGRlZmF1bHRDb2xvcjogdGhpcy5sYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0LFxyXG4gICAgICAgIGRpc2FibGVkOiBmYWxzZSxcclxuICAgICAgICBvcGVuUGlja2VyQW5pOiAnb3BhY2l0eScsXHJcbiAgICAgICAgc3VyZTogY29sb3IgPT4ge1xyXG4gICAgICAgICAgdGhpcy5sYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0ID0gY29sb3JcclxuICAgICAgICB9LFxyXG4gICAgICAgIGNsZWFyOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmxhYmVsQmFja2dyb3VuZENvbG9yU3RhcnQgPSAncmdiYSgyNTUsMjU1LDI1NSwxKSdcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICAgIGxldCBsYWJlbEJhY2tncm91bmRDb2xvckVuZFBpY2tlciA9IG5ldyBZSkNvbG9yUGlja2VyKHtcclxuICAgICAgICBlbDogY29udGVudEVsbS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdsYWJlbEJhY2tncm91bmRDb2xvckVuZCcpWzBdLFxyXG4gICAgICAgIHNpemU6ICdtaW5pJyxcclxuICAgICAgICBhbHBoYTogdHJ1ZSxcclxuICAgICAgICBkZWZhdWx0Q29sb3I6IHRoaXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmQsXHJcbiAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLFxyXG4gICAgICAgIG9wZW5QaWNrZXJBbmk6ICdvcGFjaXR5JyxcclxuICAgICAgICBzdXJlOiBjb2xvciA9PiB7XHJcbiAgICAgICAgICB0aGlzLmxhYmVsQmFja2dyb3VuZENvbG9yRW5kID0gY29sb3JcclxuICAgICAgICB9LFxyXG4gICAgICAgIGNsZWFyOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmxhYmVsQmFja2dyb3VuZENvbG9yRW5kID0gJ3JnYmEoMjU1LDI1NSwyNTUsMSknXHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgICBsZXQgYWxsX2VsbSA9IGNvbnRlbnRFbG0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoJyonKVxyXG4gICAgICBFdmVudEJpbmRpbmcub24odGhpcywgYWxsX2VsbSlcclxuICAgICAgdGhpcy5fZWxtcyA9IEV2ZW50QmluZGluZy5lbGVtZW50XHJcbiAgICAgIHRoaXMuX2VsbXMuY29sb3IgPSBbY29sb3JQaWNrZXJdXHJcbiAgICAgIHRoaXMuX2VsbXMubGFiZWxDb2xvciA9IFtsYWJlbENvbG9yUGlja2VyXVxyXG4gICAgICB0aGlzLl9lbG1zLmV4dGVuZENvbG9yID0gW2V4dGVuZENvbG9yUGlja2VyXVxyXG4gICAgICB0aGlzLl9lbG1zLmxhYmVsTGluZUNvbG9yID0gW2xpbmVDb2xvclBpY2tlcl1cclxuICAgICAgdGhpcy5fZWxtcy5sYWJlbEJhY2tncm91bmRDb2xvclN0YXJ0ID0gW190aGlzLmxhYmVsQmFja2dyb3VuZENvbG9yU3RhcnRQaWNrZXJdXHJcbiAgICAgIHRoaXMuX2VsbXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmQgPSBbbGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmRQaWNrZXJdXHJcblxyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICB0aGlzLmF0dHJpYnV0ZUxpbmsgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudFxyXG4gICAgICAgIC8vIHRoaXMuYXR0cmlidXRlVnIgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnRcclxuICAgICAgICAvLyB0aGlzLmNhbWVyYVNlbGVjdCAmJiB0aGlzLmNhbWVyYVNlbGVjdCgpXHJcbiAgICAgICAgLy8gdGhpcy5nb29kc1NlbGVjdCAmJiB0aGlzLmdvb2RzU2VsZWN0KClcclxuICAgICAgICBsZXQgdGFnRGF0YSA9IHRoaXMuYXR0cmlidXRlU2VsZWN0XHJcbiAgICAgICAgbGV0IGF0dHJpYnV0ZUVsbSA9IHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXHJcbiAgICAgICAgICAnYXR0cmlidXRlLXNlbGVjdC1ib3gnXHJcbiAgICAgICAgKVswXVxyXG4gICAgICAgIGlmIChhdHRyaWJ1dGVFbG0pIHtcclxuICAgICAgICAgIGxldCBsZWdwT2JqZWN0ID0gbGVncChhdHRyaWJ1dGVFbG0sICcuYXR0cmlidXRlLXNlbGVjdCcpXHJcbiAgICAgICAgICBsZWdwT2JqZWN0LmxlZ3Bfc2VhcmNoKHRhZ0RhdGEpXHJcbiAgICAgICAgICBsZXQgYXR0cmlidXRlU2VsZWN0RWxtID0gdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnRcclxuICAgICAgICAgICAgLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2F0dHJpYnV0ZS1zZWxlY3QnKVswXVxyXG4gICAgICAgICAgICAuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2lucHV0JylbMF1cclxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGFnRGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAodGFnRGF0YVtpXS5rZXkgPT09IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGVUeXBlKSB7XHJcbiAgICAgICAgICAgICAgYXR0cmlidXRlU2VsZWN0RWxtLnZhbHVlID0gdGFnRGF0YVtpXS52YWx1ZVxyXG4gICAgICAgICAgICAgIGxlZ3BPYmplY3QubGVncF9zZWFyY2hBY3RpdmUodGFnRGF0YVtpXS52YWx1ZSlcclxuICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBhdHRyaWJ1dGVTZWxlY3RFbG0uYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGFnRGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgIGlmICh0YWdEYXRhW2ldLnZhbHVlID09PSBhdHRyaWJ1dGVTZWxlY3RFbG0udmFsdWUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYXR0cmlidXRlVHlwZSA9IHRhZ0RhdGFbaV0ua2V5XHJcbiAgICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBuYW1lRGF0YSA9IFtcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJ+epuumXtOmVv+W6picsXHJcbiAgICAgICAgICAgIHZhbHVlOiAn56m66Ze06ZW/5bqmJ1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJ+aKleW9semVv+W6picsXHJcbiAgICAgICAgICAgIHZhbHVlOiAn5oqV5b2x6ZW/5bqmJ1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJ+WcsOihqOmVv+W6picsXHJcbiAgICAgICAgICAgIHZhbHVlOiAn5Zyw6KGo6ZW/5bqmJ1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIF1cclxuXHJcbiAgICAgICAgbGV0IG5hbWVEYXRhTGVncE9iamVjdCA9IGxlZ3AoXHJcbiAgICAgICAgICB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFxyXG4gICAgICAgICAgICAnaW5wdXQtc2VsZWN0LXVuaXQtYm94J1xyXG4gICAgICAgICAgKVswXSxcclxuICAgICAgICAgICcuaW5wdXQtc2VsZWN0LXVuaXQnXHJcbiAgICAgICAgKVxyXG4gICAgICAgIGlmIChuYW1lRGF0YUxlZ3BPYmplY3QpIHtcclxuICAgICAgICAgIG5hbWVEYXRhTGVncE9iamVjdC5sZWdwX3NlYXJjaChuYW1lRGF0YSlcclxuICAgICAgICAgIGxldCBuYW1lRGF0YUxlZ3BFbG0gPSB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudFxyXG4gICAgICAgICAgICAuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaW5wdXQtc2VsZWN0LXVuaXQnKVswXVxyXG4gICAgICAgICAgICAuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2lucHV0JylbMF1cclxuICAgICAgICAgIHRoaXMuX2VsbXMud29yZHNOYW1lID0gW25hbWVEYXRhTGVncEVsbV1cclxuICAgICAgICAgIG5hbWVEYXRhTGVncEVsbS52YWx1ZSA9IHRoaXMub3B0aW9ucy53b3Jkc05hbWVcclxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmFtZURhdGEubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKG5hbWVEYXRhW2ldLnZhbHVlID09PSBuYW1lRGF0YUxlZ3BFbG0udmFsdWUpIHtcclxuICAgICAgICAgICAgICBuYW1lRGF0YUxlZ3BPYmplY3QubGVncF9zZWFyY2hBY3RpdmUobmFtZURhdGFbaV0udmFsdWUpXHJcbiAgICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgbmFtZURhdGFMZWdwRWxtLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKCkgPT4ge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5hbWVEYXRhLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgaWYgKG5hbWVEYXRhW2ldLnZhbHVlID09PSBuYW1lRGF0YUxlZ3BFbG0udmFsdWUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMud29yZHNOYW1lID0gbmFtZURhdGFbaV0udmFsdWVcclxuICAgICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8g5Y6f5aeL6ZW/5bqm5Y2V5L2NXHJcbiAgICAgICAgbGV0IHVuaXREYXRhID0gW1xyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lOiAn57GzJyxcclxuICAgICAgICAgICAgdmFsdWU6ICfnsbMnXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lOiAn5Y2D57GzJyxcclxuICAgICAgICAgICAgdmFsdWU6ICfljYPnsbMnXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgXVxyXG5cclxuICAgICAgICBsZXQgdW5pdERhdGFMZWdwT2JqZWN0ID0gbGVncChcclxuICAgICAgICAgIHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXHJcbiAgICAgICAgICAgICdpbnB1dC1zZWxlY3QtdW5pdC1ib3gnXHJcbiAgICAgICAgICApWzBdLFxyXG4gICAgICAgICAgJy5pbnB1dC1zZWxlY3QtdW5pdCcsXHJcbiAgICAgICAgICAxXHJcbiAgICAgICAgKVxyXG4gICAgICAgIGlmICh1bml0RGF0YUxlZ3BPYmplY3QpIHtcclxuICAgICAgICAgIHVuaXREYXRhTGVncE9iamVjdC5sZWdwX3NlYXJjaCh1bml0RGF0YSlcclxuICAgICAgICAgIGxldCB1bml0RGF0YUxlZ3BFbG0gPSB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudFxyXG4gICAgICAgICAgICAuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaW5wdXQtc2VsZWN0LXVuaXQnKVsxXVxyXG4gICAgICAgICAgICAuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2lucHV0JylbMF1cclxuICAgICAgICAgIHRoaXMuX2VsbXMubGVuZ3RoVW5pdCA9IFt1bml0RGF0YUxlZ3BFbG1dXHJcbiAgICAgICAgICB1bml0RGF0YUxlZ3BFbG0udmFsdWUgPSB0aGlzLm9wdGlvbnMubGVuZ3RoVW5pdFxyXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB1bml0RGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAodW5pdERhdGFbaV0udmFsdWUgPT09IHVuaXREYXRhTGVncEVsbS52YWx1ZSkge1xyXG4gICAgICAgICAgICAgIHVuaXREYXRhTGVncE9iamVjdC5sZWdwX3NlYXJjaEFjdGl2ZSh1bml0RGF0YVtpXS52YWx1ZSlcclxuICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB1bml0RGF0YUxlZ3BFbG0uYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdW5pdERhdGEubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICBpZiAodW5pdERhdGFbaV0udmFsdWUgPT09IHVuaXREYXRhTGVncEVsbS52YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sZW5ndGhVbml0ID0gdW5pdERhdGFbaV0udmFsdWVcclxuICAgICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuICAgICAgICAvL1xyXG5cclxuXHJcbiAgICAgICAgLy8g5ouf5ZCI6ZW/5bqm5Y2V5L2NXHJcbiAgICAgICAgLy8gbGV0IGZpdFVuaXREYXRhID0gW1xyXG4gICAgICAgIC8vICAge1xyXG4gICAgICAgIC8vICAgICBuYW1lOiAn57GzJyxcclxuICAgICAgICAvLyAgICAgdmFsdWU6ICfnsbMnXHJcbiAgICAgICAgLy8gICB9LFxyXG4gICAgICAgIC8vICAge1xyXG4gICAgICAgIC8vICAgICBuYW1lOiAn5Y2D57GzJyxcclxuICAgICAgICAvLyAgICAgdmFsdWU6ICfljYPnsbMnXHJcbiAgICAgICAgLy8gICB9XHJcbiAgICAgICAgLy8gXVxyXG5cclxuICAgICAgICAvLyBsZXQgZml0VW5pdERhdGFMZWdwT2JqZWN0ID0gbGVncChcclxuICAgICAgICAvLyAgIHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXHJcbiAgICAgICAgLy8gICAgICdpbnB1dC1zZWxlY3QtZml0LXVuaXQtYm94J1xyXG4gICAgICAgIC8vICAgKVswXSxcclxuICAgICAgICAvLyAgICcuaW5wdXQtc2VsZWN0LWZpdC11bml0J1xyXG4gICAgICAgIC8vIClcclxuICAgICAgICAvLyBpZiAoZml0VW5pdERhdGFMZWdwT2JqZWN0KSB7XHJcbiAgICAgICAgLy8gICBmaXRVbml0RGF0YUxlZ3BPYmplY3QubGVncF9zZWFyY2goZml0VW5pdERhdGEpXHJcbiAgICAgICAgLy8gICBsZXQgZml0VW5pdERhdGFMZWdwRWxtID0gdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnRcclxuICAgICAgICAvLyAgICAgLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2lucHV0LXNlbGVjdC1maXQtdW5pdCcpWzBdXHJcbiAgICAgICAgLy8gICAgIC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaW5wdXQnKVswXVxyXG4gICAgICAgIC8vICAgdGhpcy5fZWxtcy5maXRMZW5ndGhVbml0ID0gW2ZpdFVuaXREYXRhTGVncEVsbV1cclxuICAgICAgICAvLyAgIGZpdFVuaXREYXRhTGVncEVsbS52YWx1ZSA9IHRoaXMub3B0aW9ucy5maXRMZW5ndGhVbml0XHJcbiAgICAgICAgLy8gICBmb3IgKGxldCBpID0gMDsgaSA8IGZpdFVuaXREYXRhLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgLy8gICAgIGlmIChmaXRVbml0RGF0YVtpXS52YWx1ZSA9PT0gZml0VW5pdERhdGFMZWdwRWxtLnZhbHVlKSB7XHJcbiAgICAgICAgLy8gICAgICAgZml0VW5pdERhdGFMZWdwT2JqZWN0LmxlZ3Bfc2VhcmNoQWN0aXZlKGZpdFVuaXREYXRhW2ldLnZhbHVlKVxyXG4gICAgICAgIC8vICAgICAgIGJyZWFrXHJcbiAgICAgICAgLy8gICAgIH1cclxuICAgICAgICAvLyAgIH1cclxuICAgICAgICAvLyAgIGZpdFVuaXREYXRhTGVncEVsbS5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICgpID0+IHtcclxuICAgICAgICAvLyAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaXRVbml0RGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIC8vICAgICAgIGlmIChmaXRVbml0RGF0YVtpXS52YWx1ZSA9PT0gZml0VW5pdERhdGFMZWdwRWxtLnZhbHVlKSB7XHJcbiAgICAgICAgLy8gICAgICAgICB0aGlzLmZpdExlbmd0aFVuaXQgPSBmaXRVbml0RGF0YVtpXS52YWx1ZVxyXG4gICAgICAgIC8vICAgICAgICAgYnJlYWtcclxuICAgICAgICAvLyAgICAgICB9XHJcbiAgICAgICAgLy8gICAgIH1cclxuICAgICAgICAvLyAgIH0pXHJcbiAgICAgICAgLy8gfVxyXG5cclxuICAgICAgICBsZXQgbGluZVR5cGVEYXRhID0gW1xyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lOiAnPGkgY2xhc3M9XCJpY29uIGxpbmVcIj48L2k+5a6e57q/JyxcclxuICAgICAgICAgICAgdmFsdWU6ICflrp7nur8nLFxyXG4gICAgICAgICAgICBrZXk6IDAsXHJcbiAgICAgICAgICAgIGljb246ICdsaW5lJ1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJzxpIGNsYXNzPVwiaWNvbiBkYXNoLWxpbmVcIj48L2k+6Jma57q/JyxcclxuICAgICAgICAgICAgdmFsdWU6ICfomZrnur8nLFxyXG4gICAgICAgICAgICBrZXk6IDEsXHJcbiAgICAgICAgICAgIGljb246ICdkYXNoLWxpbmUnXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lOiAnPGkgY2xhc3M9XCJpY29uIGxpZ2h0LWxpbmVcIj48L2k+5rOb5YWJJyxcclxuICAgICAgICAgICAgdmFsdWU6ICfms5vlhYknLFxyXG4gICAgICAgICAgICBrZXk6IDIsXHJcbiAgICAgICAgICAgIGljb246ICdsaWdodC1saW5lJ1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJzxpIGNsYXNzPVwiaWNvbiB0YWlsLWxpbmVcIj48L2k+5bC+6L+55YWJ57q/JyxcclxuICAgICAgICAgICAgdmFsdWU6ICflsL7ov7nlhYnnur8nLFxyXG4gICAgICAgICAgICBrZXk6IDMsXHJcbiAgICAgICAgICAgIGljb246ICd0YWlsLWxpbmUnXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lOiAnPGkgY2xhc3M9XCJpY29uIG11bHQtdGFpbC1saW5lXCI+PC9pPuWkmuWwvui/ueWFiee6vycsXHJcbiAgICAgICAgICAgIHZhbHVlOiAn5aSa5bC+6L+55YWJ57q/JyxcclxuICAgICAgICAgICAga2V5OiA0LFxyXG4gICAgICAgICAgICBpY29uOiAnbXVsdC10YWlsLWxpbmUnXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lOiAnPGkgY2xhc3M9XCJpY29uIGZsb3ctZGFzaC1saW5lMVwiPjwvaT7mtYHliqjomZrnur8xJyxcclxuICAgICAgICAgICAgdmFsdWU6ICfmtYHliqjomZrnur8xJyxcclxuICAgICAgICAgICAga2V5OiA1LFxyXG4gICAgICAgICAgICBpY29uOiAnZmxvdy1kYXNoLWxpbmUxJ1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJzxpIGNsYXNzPVwiaWNvbiBmbG93LWRhc2gtbGluZTJcIj48L2k+5rWB5Yqo6Jma57q/MicsXHJcbiAgICAgICAgICAgIHZhbHVlOiAn5rWB5Yqo6Jma57q/MicsXHJcbiAgICAgICAgICAgIGtleTogNixcclxuICAgICAgICAgICAgaWNvbjogJ2Zsb3ctZGFzaC1saW5lMidcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIG5hbWU6ICc8aSBjbGFzcz1cImljb24gcGljLWxpbmUxXCI+PC9pPua1geWKqOeureWktDEnLFxyXG4gICAgICAgICAgICB2YWx1ZTogJ+a1geWKqOeureWktDEnLFxyXG4gICAgICAgICAgICBrZXk6IDcsXHJcbiAgICAgICAgICAgIGljb246ICdwaWMtbGluZTEnXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lOiAnPGkgY2xhc3M9XCJpY29uIHBpYy1saW5lMlwiPjwvaT7mtYHliqjnrq3lpLQyJyxcclxuICAgICAgICAgICAgdmFsdWU6ICfmtYHliqjnrq3lpLQyJyxcclxuICAgICAgICAgICAga2V5OiA4LFxyXG4gICAgICAgICAgICBpY29uOiAncGljLWxpbmUyJ1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJzxpIGNsYXNzPVwiaWNvbiBwaWMtbGluZTNcIj48L2k+5rWB5Yqo566t5aS0MycsXHJcbiAgICAgICAgICAgIHZhbHVlOiAn5rWB5Yqo566t5aS0MycsXHJcbiAgICAgICAgICAgIGtleTogOSxcclxuICAgICAgICAgICAgaWNvbjogJ3BpYy1saW5lMydcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIG5hbWU6ICc8aSBjbGFzcz1cImljb24gcGljLWxpbmU0XCI+PC9pPua1geWKqOeureWktDQnLFxyXG4gICAgICAgICAgICB2YWx1ZTogJ+a1geWKqOeureWktDQnLFxyXG4gICAgICAgICAgICBrZXk6IDEwLFxyXG4gICAgICAgICAgICBpY29uOiAncGljLWxpbmU0J1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJzxpIGNsYXNzPVwiaWNvbiBwaWMtbGluZTVcIj48L2k+5rWB5Yqo566t5aS0NScsXHJcbiAgICAgICAgICAgIHZhbHVlOiAn5rWB5Yqo566t5aS0NScsXHJcbiAgICAgICAgICAgIGtleTogMTEsXHJcbiAgICAgICAgICAgIGljb246ICdwaWMtbGluZTUnXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lOiAnPGkgY2xhc3M9XCJpY29uIHBpYy1saW5lNlwiPjwvaT7mtYHliqjnrq3lpLQ2JyxcclxuICAgICAgICAgICAgdmFsdWU6ICfmtYHliqjnrq3lpLQ2JyxcclxuICAgICAgICAgICAga2V5OiAxMixcclxuICAgICAgICAgICAgaWNvbjogJ3BpYy1saW5lNidcclxuICAgICAgICAgIH1cclxuICAgICAgICBdXHJcbiAgICAgICAgbGV0IGxpbmVUeXBlRGF0YUxlZ3BPYmplY3QgPSBsZWdwKFxyXG4gICAgICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcclxuICAgICAgICAgICAgJ2lucHV0LXNlbGVjdC1saW5lLXR5cGUtYm94J1xyXG4gICAgICAgICAgKVswXSxcclxuICAgICAgICAgICcuaW5wdXQtc2VsZWN0LWxpbmUtdHlwZSdcclxuICAgICAgICApXHJcbiAgICAgICAgaWYgKGxpbmVUeXBlRGF0YUxlZ3BPYmplY3QpIHtcclxuICAgICAgICAgIGxpbmVUeXBlRGF0YUxlZ3BPYmplY3QubGVncF9zZWFyY2gobGluZVR5cGVEYXRhKVxyXG5cclxuICAgICAgICAgIGxldCBpQWN0aXZlRWxtMiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2knKVxyXG4gICAgICAgICAgaUFjdGl2ZUVsbTIuY2xhc3NOYW1lID0gJ2ljb24gaWNvbi1hY3RpdmUnXHJcbiAgICAgICAgICB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdpbnB1dC1zZWxlY3QtbGluZS10eXBlJylbMF0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnY3lfZGF0YWxpc3QnKVswXS5hcHBlbmRDaGlsZChpQWN0aXZlRWxtMilcclxuXHJcbiAgICAgICAgICBsZXQgbGluZVR5cGVEYXRhTGVncEVsbSA9IHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50XHJcbiAgICAgICAgICAgIC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdpbnB1dC1zZWxlY3QtbGluZS10eXBlJylbMF1cclxuICAgICAgICAgICAgLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdpbnB1dCcpWzBdXHJcbiAgICAgICAgICB0aGlzLl9lbG1zLmxpbmVUeXBlID0gW2xpbmVUeXBlRGF0YUxlZ3BFbG1dXHJcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmVUeXBlRGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAobGluZVR5cGVEYXRhW2ldLmtleSA9PT0gdGhpcy5vcHRpb25zLnR5cGUpIHtcclxuICAgICAgICAgICAgICBsaW5lVHlwZURhdGFMZWdwT2JqZWN0LmxlZ3Bfc2VhcmNoQWN0aXZlKGxpbmVUeXBlRGF0YVtpXS52YWx1ZSlcclxuICAgICAgICAgICAgICBsaW5lVHlwZURhdGFMZWdwRWxtLnZhbHVlID0gbGluZVR5cGVEYXRhW2ldLnZhbHVlXHJcbiAgICAgICAgICAgICAgaUFjdGl2ZUVsbTIuY2xhc3NOYW1lID0gYGljb24gaWNvbi1hY3RpdmUgJHtsaW5lVHlwZURhdGFbaV0uaWNvbn1gXHJcbiAgICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgbGluZVR5cGVEYXRhTGVncEVsbS5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICgpID0+IHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lVHlwZURhdGEubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICBpZiAobGluZVR5cGVEYXRhW2ldLnZhbHVlID09PSBsaW5lVHlwZURhdGFMZWdwRWxtLnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxpbmVUeXBlID0gbGluZVR5cGVEYXRhW2ldLmtleVxyXG4gICAgICAgICAgICAgICAgaUFjdGl2ZUVsbTIuY2xhc3NOYW1lID0gYGljb24gaWNvbi1hY3RpdmUgJHtsaW5lVHlwZURhdGFbaV0uaWNvbn1gXHJcblxyXG4gICAgICAgICAgICAgICAgLy/mjqfliLblj4LmlbDmmL7pmpBcclxuICAgICAgICAgICAgICAgIGlmICgyIDwgdGhpcy5saW5lVHlwZSAmJiB0aGlzLmxpbmVUeXBlIDwgMTMpIHsvL+i0tOWbvuWPguaVsFxyXG4gICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGFzaFRleHR1cmVEb20nKSAmJiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rhc2hUZXh0dXJlRG9tJykuc3R5bGUuZGlzcGxheSA9ICdmbGV4JylcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkYXNoVGV4dHVyZURvbScpICYmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGFzaFRleHR1cmVEb20nKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKDIgPCB0aGlzLmxpbmVUeXBlICYmIHRoaXMubGluZVR5cGUgPCA1KSB7Ly/lsL7ov7nlj4LmlbBcclxuICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbGluZVNwYWNlJylbMF0gJiYgKGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xpbmVTcGFjZScpWzBdLnN0eWxlLmRpc3BsYXkgPSAnbm9uZScpXHJcbiAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xpbmVTcGFjZScpWzFdICYmIChkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdsaW5lU3BhY2UnKVsxXS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnKVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbGluZVNwYWNlJylbMF0gJiYgKGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xpbmVTcGFjZScpWzBdLnN0eWxlLmRpc3BsYXkgPSAnZmxleCcpXHJcbiAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xpbmVTcGFjZScpWzFdICYmIChkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdsaW5lU3BhY2UnKVsxXS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG4gICAgICAgIGxldCBoZWlnaHRCb3hFbG0gPSB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdoZWlnaHQtYm94JylbMF1cclxuICAgICAgICBsZXQgaGVpZ2h0RWxtID0gaGVpZ2h0Qm94RWxtLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2hlaWdodCcpWzBdXHJcbiAgICAgICAgbGV0IGhlaWdodENvbmZpcm1FbG0gPSB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdoZWlnaHQtY29uZmlybScpWzBdXHJcbiAgICAgICAgaGVpZ2h0RWxtLnZhbHVlID0gMTBcclxuICAgICAgICBpZiAodGhpcy5oZWlnaHRNb2RlID09IDIpIHtcclxuICAgICAgICAgIGhlaWdodEJveEVsbSAmJiAoaGVpZ2h0Qm94RWxtLmNsYXNzTmFtZSA9ICdpbnB1dC1udW1iZXIgaW5wdXQtbnVtYmVyLXVuaXQtMSBoZWlnaHQtYm94IGRpc2FibGVkJyk7XHJcbiAgICAgICAgICBoZWlnaHRDb25maXJtRWxtICYmIGhlaWdodENvbmZpcm1FbG0uc2V0QXR0cmlidXRlKCdkaXNhYmxlZCcsICdkaXNhYmxlZCcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIGhlaWdodEJveEVsbSAmJiAoaGVpZ2h0Qm94RWxtLmNsYXNzTmFtZSA9ICdpbnB1dC1udW1iZXIgaW5wdXQtbnVtYmVyLXVuaXQtMSBoZWlnaHQtYm94Jyk7XHJcbiAgICAgICAgICBoZWlnaHRDb25maXJtRWxtICYmIGhlaWdodENvbmZpcm1FbG0ucmVtb3ZlQXR0cmlidXRlKCdkaXNhYmxlZCcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgaGVpZ2h0TW9kZURhdGEgPSBbXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIG5hbWU6ICfmtbfmi5Tpq5jluqYnLFxyXG4gICAgICAgICAgICB2YWx1ZTogJ+a1t+aLlOmrmOW6picsXHJcbiAgICAgICAgICAgIGtleTogJzAnLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJ+ebuOWvueWcsOihqCcsXHJcbiAgICAgICAgICAgIHZhbHVlOiAn55u45a+55Zyw6KGoJyxcclxuICAgICAgICAgICAga2V5OiAnMScsXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lOiAn5L6d6ZmE5qih5Z6LJyxcclxuICAgICAgICAgICAgdmFsdWU6ICfkvp3pmYTmqKHlnosnLFxyXG4gICAgICAgICAgICBrZXk6ICcyJyxcclxuICAgICAgICAgIH1cclxuICAgICAgICBdXHJcbiAgICAgICAgbGV0IGhlaWdodE1vZGVPYmplY3QgPSBsZWdwKFxyXG4gICAgICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcclxuICAgICAgICAgICAgJ2hlaWdodC1tb2RlLWJveCdcclxuICAgICAgICAgIClbMF0sXHJcbiAgICAgICAgICAnLmhlaWdodC1tb2RlJ1xyXG4gICAgICAgIClcclxuICAgICAgICBpZiAoaGVpZ2h0TW9kZU9iamVjdCkge1xyXG4gICAgICAgICAgaGVpZ2h0TW9kZU9iamVjdC5sZWdwX3NlYXJjaChoZWlnaHRNb2RlRGF0YSlcclxuICAgICAgICAgIGxldCBoZWlnaHRNb2RlRGF0YUxlZ3BFbG0gPSB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudFxyXG4gICAgICAgICAgICAuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaGVpZ2h0LW1vZGUnKVswXVxyXG4gICAgICAgICAgICAuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2lucHV0JylbMF1cclxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaGVpZ2h0TW9kZURhdGEubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKGhlaWdodE1vZGVEYXRhW2ldLmtleSA9PSB0aGlzLmhlaWdodE1vZGUpIHtcclxuICAgICAgICAgICAgICBoZWlnaHRNb2RlRGF0YUxlZ3BFbG0udmFsdWUgPSBoZWlnaHRNb2RlRGF0YVtpXS52YWx1ZVxyXG4gICAgICAgICAgICAgIGhlaWdodE1vZGVPYmplY3QubGVncF9zZWFyY2hBY3RpdmUoXHJcbiAgICAgICAgICAgICAgICBoZWlnaHRNb2RlRGF0YVtpXS52YWx1ZVxyXG4gICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBoZWlnaHRNb2RlRGF0YUxlZ3BFbG0uYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaGVpZ2h0TW9kZURhdGEubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICBpZiAoaGVpZ2h0TW9kZURhdGFbaV0udmFsdWUgPT09IGhlaWdodE1vZGVEYXRhTGVncEVsbS52YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5oZWlnaHRNb2RlID0gaGVpZ2h0TW9kZURhdGFbaV0ua2V5XHJcbiAgICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSlcclxuXHJcbiAgICAgICAgICBoZWlnaHRFbG0uYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIHN3aXRjaCAodGhpcy5oZWlnaHRNb2RlKSB7XHJcbiAgICAgICAgICAgICAgY2FzZSAwOlxyXG4gICAgICAgICAgICAgIGNhc2UgJzAnOlxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgY2FzZSAxOlxyXG4gICAgICAgICAgICAgIGNhc2UgJzEnOlxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgY2FzZSAyOlxyXG4gICAgICAgICAgICAgIGNhc2UgJzInOlxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pXHJcblxyXG4gICAgICAgICAgdGhpcy5fZWxtcy5oZWlnaHQgPSBoZWlnaHRFbG1cclxuICAgICAgICAgIHRoaXMuX2VsbXMuaGVpZ2h0Qm94ID0gaGVpZ2h0Qm94RWxtXHJcbiAgICAgICAgICB0aGlzLl9lbG1zLmhlaWdodE1vZGUgPSBoZWlnaHRNb2RlRGF0YUxlZ3BFbG1cclxuICAgICAgICAgIHRoaXMuX2VsbXMuaGVpZ2h0Q29uZmlybSA9IGhlaWdodENvbmZpcm1FbG1cclxuICAgICAgICAgIHRoaXMuX2VsbXMuaGVpZ2h0TW9kZU9iamVjdCA9IGhlaWdodE1vZGVPYmplY3RcclxuXHJcbiAgICAgICAgICBoZWlnaHRDb25maXJtRWxtLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uRWRpdGluZyA9IGZhbHNlXHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5vcHRpb25zLnBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0uYWx0ID0gTnVtYmVyKCh0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmFsdCArIE51bWJlcihoZWlnaHRFbG0udmFsdWUpKS50b0ZpeGVkKDIpKVxyXG4gICAgICAgICAgICAgIHRoaXMuX2VsbXMuYWx0W2ldLmlubmVySFRNTCA9IHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0uYWx0XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGV0IGZyb21EZWdyZWVzQXJyYXkgPSB0aGlzLnJlbmV3UG9zaXRpb25zKHRoaXMub3B0aW9ucy5wb3NpdGlvbnMpXHJcbiAgICAgICAgICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLnBvc2l0aW9ucyA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzQXJyYXlIZWlnaHRzKFxyXG4gICAgICAgICAgICAgIGZyb21EZWdyZWVzQXJyYXlcclxuICAgICAgICAgICAgKVxyXG5cclxuICAgICAgICAgICAgdGhpcy5wb3NpdGlvbkVkaXRpbmcgPSBmYWxzZVxyXG4gICAgICAgICAgICB0aGlzLmNsb3NlTm9kZUVkaXQoKVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCB0YWJsZUVsbSA9IGNvbnRlbnRFbG0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnc3BhdGlhbC1pbmZvLXRhYmxlJylbMF1cclxuICAgICAgICBsZXQgdEJvZHlFbG0gPSB0YWJsZUVsbS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0YWJsZS1ib2R5JylbMF1cclxuICAgICAgICB0aGlzLl9lbG1zLmxuZyA9IFtdXHJcbiAgICAgICAgdGhpcy5fZWxtcy5sbmdJbnB1dCA9IFtdXHJcbiAgICAgICAgdGhpcy5fZWxtcy5sYXQgPSBbXVxyXG4gICAgICAgIHRoaXMuX2VsbXMubGF0SW5wdXQgPSBbXVxyXG4gICAgICAgIHRoaXMuX2VsbXMuYWx0ID0gW11cclxuICAgICAgICB0aGlzLl9lbG1zLmFsdElucHV0ID0gW11cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMub3B0aW9ucy5wb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGxldCB0ciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpXHJcbiAgICAgICAgICB0ci5jbGFzc05hbWUgPSAndHInXHJcbiAgICAgICAgICB0ci5pbm5lckhUTUwgPSBgXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZFwiPiR7aSArIDF9PC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZCBsbmcgYWxpZ24tY2VudGVyXCI+PC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZCBsYXQgYWxpZ24tY2VudGVyXCI+PC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZCBhbHQgYWxpZ24tY2VudGVyXCI+PC9kaXY+XHJcbiAgICAgICAgICBgXHJcbiAgICAgICAgICBsZXQgbG5nQm94ID0gdHIuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbG5nJylbMF1cclxuICAgICAgICAgIGxldCBsbmcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJylcclxuICAgICAgICAgIGxuZy5pbm5lckhUTUwgPSAodGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sbmcpLnRvRml4ZWQoOClcclxuICAgICAgICAgIGxuZ0JveC5hcHBlbmRDaGlsZChsbmcpXHJcbiAgICAgICAgICBsZXQgbG5nSW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpXHJcbiAgICAgICAgICBsbmdJbnB1dC5jbGFzc05hbWUgPSAnaW5wdXQnXHJcbiAgICAgICAgICBsbmdJbnB1dC50eXBlID0gJ251bWJlcidcclxuICAgICAgICAgIGxuZ0lucHV0LnRpdGxlID0gJydcclxuICAgICAgICAgIGxuZ0lucHV0Lm1pbiA9IC0xODBcclxuICAgICAgICAgIGxuZ0lucHV0Lm1heCA9IDE4MFxyXG4gICAgICAgICAgbG5nSW5wdXQudmFsdWUgPSAodGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sbmcpLnRvRml4ZWQoOClcclxuXHJcbiAgICAgICAgICBsZXQgbGF0Qm94ID0gdHIuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbGF0JylbMF1cclxuICAgICAgICAgIGxldCBsYXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJylcclxuICAgICAgICAgIGxhdC5pbm5lckhUTUwgPSAodGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sYXQpLnRvRml4ZWQoOClcclxuICAgICAgICAgIGxhdEJveC5hcHBlbmRDaGlsZChsYXQpXHJcbiAgICAgICAgICBsZXQgbGF0SW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpXHJcbiAgICAgICAgICBsYXRJbnB1dC5jbGFzc05hbWUgPSAnaW5wdXQnXHJcbiAgICAgICAgICBsYXRJbnB1dC50eXBlID0gJ251bWJlcidcclxuICAgICAgICAgIGxhdElucHV0LnRpdGxlID0gJydcclxuICAgICAgICAgIGxhdElucHV0Lm1pbiA9IC05MFxyXG4gICAgICAgICAgbGF0SW5wdXQubWF4ID0gOTBcclxuICAgICAgICAgIGxhdElucHV0LnZhbHVlID0gKHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubGF0KS50b0ZpeGVkKDgpXHJcblxyXG4gICAgICAgICAgbGV0IGFsdEJveCA9IHRyLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2FsdCcpWzBdXHJcbiAgICAgICAgICBsZXQgYWx0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpXHJcbiAgICAgICAgICBhbHQuaW5uZXJIVE1MID0gKHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0uYWx0KS50b0ZpeGVkKDIpXHJcbiAgICAgICAgICBhbHRCb3guYXBwZW5kQ2hpbGQoYWx0KVxyXG4gICAgICAgICAgbGV0IGFsdElucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKVxyXG4gICAgICAgICAgYWx0SW5wdXQuY2xhc3NOYW1lID0gJ2lucHV0J1xyXG4gICAgICAgICAgYWx0SW5wdXQudHlwZSA9ICdudW1iZXInXHJcbiAgICAgICAgICBhbHRJbnB1dC50aXRsZSA9ICcnXHJcbiAgICAgICAgICBhbHRJbnB1dC5taW4gPSAtOTk5OTk5OVxyXG4gICAgICAgICAgYWx0SW5wdXQubWF4ID0gOTk5OTk5OTk5XHJcbiAgICAgICAgICBhbHRJbnB1dC52YWx1ZSA9ICh0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmFsdCkudG9GaXhlZCgyKVxyXG5cclxuICAgICAgICAgIGxuZ0JveC5hZGRFdmVudExpc3RlbmVyKCdkYmxjbGljaycsICgpID0+IHtcclxuICAgICAgICAgICAgbG5nQm94LmlubmVySFRNTCA9ICcnXHJcbiAgICAgICAgICAgIGxuZ0lucHV0LnZhbHVlID0gTnVtYmVyKHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubG5nLnRvRml4ZWQoOCkpXHJcbiAgICAgICAgICAgIGxuZ0JveC5hcHBlbmRDaGlsZChsbmdJbnB1dClcclxuICAgICAgICAgICAgbG5nSW5wdXQuZm9jdXMoKVxyXG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uRWRpdGluZyA9IGZhbHNlXHJcbiAgICAgICAgICAgIHRoaXMuY2xvc2VOb2RlRWRpdCgpXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgbG5nSW5wdXQuYWRkRXZlbnRMaXN0ZW5lcignYmx1cicsICgpID0+IHtcclxuICAgICAgICAgICAgbG5nSW5wdXQudmFsdWUgPSBOdW1iZXIodGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sbmcudG9GaXhlZCg4KSlcclxuICAgICAgICAgICAgbG5nQm94LmlubmVySFRNTCA9ICcnXHJcbiAgICAgICAgICAgIGxuZ0JveC5hcHBlbmRDaGlsZChsbmcpXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgbG5nSW5wdXQuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubG5nID0gTnVtYmVyKE51bWJlcihsbmdJbnB1dC52YWx1ZSkudG9GaXhlZCg4KSlcclxuICAgICAgICAgICAgbG5nLmlubmVySFRNTCA9IHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubG5nLnRvRml4ZWQoOClcclxuICAgICAgICAgICAgbGV0IGZyb21EZWdyZWVzQXJyYXkgPSB0aGlzLnJlbmV3UG9zaXRpb25zKHRoaXMub3B0aW9ucy5wb3NpdGlvbnMpXHJcbiAgICAgICAgICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLnBvc2l0aW9ucyA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzQXJyYXlIZWlnaHRzKGZyb21EZWdyZWVzQXJyYXkpXHJcbiAgICAgICAgICAgIHRoaXMubGFiZWwucG9zaXRpb24gPSBbdGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXS5sbmcsIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0ubGF0LCBmcm9tRGVncmVlc0FycmF5WzJdXVxyXG4gICAgICAgICAgfSlcclxuXHJcbiAgICAgICAgICBsYXRCb3guYWRkRXZlbnRMaXN0ZW5lcignZGJsY2xpY2snLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGxhdEJveC5pbm5lckhUTUwgPSAnJ1xyXG4gICAgICAgICAgICBsYXRJbnB1dC52YWx1ZSA9IE51bWJlcih0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxhdC50b0ZpeGVkKDgpKVxyXG4gICAgICAgICAgICBsYXRCb3guYXBwZW5kQ2hpbGQobGF0SW5wdXQpXHJcbiAgICAgICAgICAgIGxhdElucHV0LmZvY3VzKClcclxuICAgICAgICAgICAgdGhpcy5wb3NpdGlvbkVkaXRpbmcgPSBmYWxzZVxyXG4gICAgICAgICAgICB0aGlzLmNsb3NlTm9kZUVkaXQoKVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIGxhdElucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2JsdXInLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGxhdElucHV0LnZhbHVlID0gTnVtYmVyKHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubGF0LnRvRml4ZWQoOCkpXHJcbiAgICAgICAgICAgIGxhdEJveC5pbm5lckhUTUwgPSAnJ1xyXG4gICAgICAgICAgICBsYXRCb3guYXBwZW5kQ2hpbGQobGF0KVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIGxhdElucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxhdCA9IE51bWJlcihOdW1iZXIobGF0SW5wdXQudmFsdWUpLnRvRml4ZWQoOCkpXHJcbiAgICAgICAgICAgIGxhdC5pbm5lckhUTUwgPSB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxhdC50b0ZpeGVkKDgpXHJcbiAgICAgICAgICAgIGxldCBmcm9tRGVncmVlc0FycmF5ID0gdGhpcy5yZW5ld1Bvc2l0aW9ucyh0aGlzLm9wdGlvbnMucG9zaXRpb25zKVxyXG4gICAgICAgICAgICB0aGlzLmVudGl0eS5wb2x5bGluZS5wb3NpdGlvbnMgPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlc0FycmF5SGVpZ2h0cyhmcm9tRGVncmVlc0FycmF5KVxyXG4gICAgICAgICAgICB0aGlzLmxhYmVsLnBvc2l0aW9uID0gW3RoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0ubG5nLCB0aGlzLm9wdGlvbnMucG9zaXRpb25zWzBdLmxhdCwgZnJvbURlZ3JlZXNBcnJheVsyXV1cclxuICAgICAgICAgIH0pXHJcblxyXG4gICAgICAgICAgYWx0Qm94LmFkZEV2ZW50TGlzdGVuZXIoJ2RibGNsaWNrJywgKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5oZWlnaHRNb2RlID09IDIpIHtcclxuICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYWx0Qm94LmlubmVySFRNTCA9ICcnXHJcbiAgICAgICAgICAgIGFsdElucHV0LnZhbHVlID0gTnVtYmVyKHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0uYWx0LnRvRml4ZWQoMikpXHJcbiAgICAgICAgICAgIGFsdEJveC5hcHBlbmRDaGlsZChhbHRJbnB1dClcclxuICAgICAgICAgICAgYWx0SW5wdXQuZm9jdXMoKVxyXG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uRWRpdGluZyA9IGZhbHNlXHJcbiAgICAgICAgICAgIHRoaXMuY2xvc2VOb2RlRWRpdCgpXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgYWx0SW5wdXQuYWRkRXZlbnRMaXN0ZW5lcignYmx1cicsICgpID0+IHtcclxuICAgICAgICAgICAgYWx0SW5wdXQudmFsdWUgPSBOdW1iZXIodGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5hbHQudG9GaXhlZCgyKSlcclxuICAgICAgICAgICAgYWx0Qm94LmlubmVySFRNTCA9ICcnXHJcbiAgICAgICAgICAgIGFsdEJveC5hcHBlbmRDaGlsZChhbHQpXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgYWx0SW5wdXQuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0uYWx0ID0gTnVtYmVyKE51bWJlcihhbHRJbnB1dC52YWx1ZSkudG9GaXhlZCgyKSlcclxuICAgICAgICAgICAgYWx0LmlubmVySFRNTCA9IHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0uYWx0LnRvRml4ZWQoMilcclxuICAgICAgICAgICAgbGV0IGZyb21EZWdyZWVzQXJyYXkgPSB0aGlzLnJlbmV3UG9zaXRpb25zKHRoaXMub3B0aW9ucy5wb3NpdGlvbnMpXHJcbiAgICAgICAgICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLnBvc2l0aW9ucyA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzQXJyYXlIZWlnaHRzKGZyb21EZWdyZWVzQXJyYXkpXHJcbiAgICAgICAgICAgIHRoaXMubGFiZWwucG9zaXRpb24gPSBbdGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXS5sbmcsIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0ubGF0LCBmcm9tRGVncmVlc0FycmF5WzJdXVxyXG4gICAgICAgICAgfSlcclxuXHJcbiAgICAgICAgICB0aGlzLl9lbG1zLmxuZy5wdXNoKGxuZylcclxuICAgICAgICAgIHRoaXMuX2VsbXMubG5nSW5wdXQucHVzaChsbmdJbnB1dClcclxuICAgICAgICAgIHRoaXMuX2VsbXMubGF0LnB1c2gobGF0KVxyXG4gICAgICAgICAgdGhpcy5fZWxtcy5sYXRJbnB1dC5wdXNoKGxhdElucHV0KVxyXG4gICAgICAgICAgdGhpcy5fZWxtcy5hbHQucHVzaChhbHQpXHJcbiAgICAgICAgICB0aGlzLl9lbG1zLmFsdElucHV0LnB1c2goYWx0SW5wdXQpXHJcbiAgICAgICAgICB0Qm9keUVsbS5hcHBlbmRDaGlsZCh0cilcclxuICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICBsZXQgZm9udERhdGEgPSBnZXRGb250TGlzdCgpXHJcbiAgICAgICAgbGV0IGZvbnRPYmplY3QgPSBsZWdwKFxyXG4gICAgICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcclxuICAgICAgICAgICAgJ2ZvbnQtc2VsZWN0LWJveCdcclxuICAgICAgICAgIClbMF0sXHJcbiAgICAgICAgICAnLmZvbnQtc2VsZWN0J1xyXG4gICAgICAgIClcclxuICAgICAgICBpZiAoZm9udE9iamVjdCkge1xyXG4gICAgICAgICAgZm9udE9iamVjdC5sZWdwX3NlYXJjaChmb250RGF0YSlcclxuICAgICAgICAgIGxldCBmb250RGF0YUxlZ3BFbG0gPSB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudFxyXG4gICAgICAgICAgICAuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnZm9udC1zZWxlY3QnKVswXVxyXG4gICAgICAgICAgICAuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2lucHV0JylbMF1cclxuICAgICAgICAgIGZvbnREYXRhTGVncEVsbS52YWx1ZSA9IGZvbnREYXRhW3RoaXMubGFiZWxGb250RmFtaWx5XS52YWx1ZVxyXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmb250RGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoZm9udERhdGFbaV0udmFsdWUgPT0gZm9udERhdGFMZWdwRWxtLnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgZm9udE9iamVjdC5sZWdwX3NlYXJjaEFjdGl2ZShmb250RGF0YVtpXS52YWx1ZSlcclxuICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBmb250RGF0YUxlZ3BFbG0uYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZm9udERhdGEubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICBpZiAoZm9udERhdGFbaV0udmFsdWUgPT09IGZvbnREYXRhTGVncEVsbS52YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sYWJlbEZvbnRGYW1pbHkgPSBmb250RGF0YVtpXS5rZXlcclxuICAgICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgdGhpcy5fZWxtcy5sYWJlbEZvbnRGYW1pbHkgPSBbZm9udERhdGFMZWdwRWxtXVxyXG4gICAgICAgIH1cclxuICAgICAgfSwgMClcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmICh0aGlzLl9EaWFsb2dPYmplY3QgJiYgdGhpcy5fRGlhbG9nT2JqZWN0LmNsb3NlKSB7XHJcbiAgICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0LmNsb3NlKClcclxuICAgICAgICB0aGlzLl9EaWFsb2dPYmplY3QgPSBudWxsXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIOW5s+a7keWkhOeQhlxyXG4gIHNtb290aEhhbmRsZShwb3NpdGlvbnMpIHtcclxuICAgIGxldCBuZXdQb3NpdGlvbnMgPSBbXVxyXG4gICAgbGV0IHRpbWUgPSBbXVxyXG4gICAgbGV0IGZyb21EZWdyZWVzQXJyYXlIZWlnaHRzID0gW11cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGZyb21EZWdyZWVzQXJyYXlIZWlnaHRzLnB1c2goXHJcbiAgICAgICAgcG9zaXRpb25zW2ldLmxuZyxcclxuICAgICAgICBwb3NpdGlvbnNbaV0ubGF0LFxyXG4gICAgICAgIHBvc2l0aW9uc1tpXS5hbHRcclxuICAgICAgKVxyXG4gICAgICB0aW1lLnB1c2goaSAvIChwb3NpdGlvbnMubGVuZ3RoIC0gMSkpXHJcbiAgICB9XHJcbiAgICBsZXQgc3BsaW5lID0gbmV3IENlc2l1bS5DYXRtdWxsUm9tU3BsaW5lKHtcclxuICAgICAgdGltZXM6IHRpbWUsXHJcbiAgICAgIHBvaW50czogQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXNBcnJheUhlaWdodHMoZnJvbURlZ3JlZXNBcnJheUhlaWdodHMpXHJcbiAgICB9KVxyXG4gICAgbGV0IGxlbmd0aCA9IHBvc2l0aW9ucy5sZW5ndGggKiAyMFxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gbGVuZ3RoOyBpKyspIHtcclxuICAgICAgbGV0IGNhcnRlc2lhbjMgPSBzcGxpbmUuZXZhbHVhdGUoaSAvIGxlbmd0aClcclxuICAgICAgbmV3UG9zaXRpb25zLnB1c2godGhpcy5jYXJ0ZXNpYW4zVG93Z3M4NChjYXJ0ZXNpYW4zLCB0aGlzLnNkay52aWV3ZXIpKVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5ld1Bvc2l0aW9uc1xyXG4gIH1cclxuXHJcbiAgLy8g5pu05paw5Z2Q5qCHXHJcbiAgcmVuZXdQb3NpdGlvbnMocG9zaXRpb25zQXJyYXksIGNkKSB7XHJcbiAgICBpZiAodGhpcy5fZXJyb3IpIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcbiAgICBsZXQgcG9zaXRpb25zID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShwb3NpdGlvbnNBcnJheSkpXHJcbiAgICBsZXQgZ3JvdW5kXHJcbiAgICBzd2l0Y2ggKHRoaXMuaGVpZ2h0TW9kZSkge1xyXG4gICAgICBjYXNlIDA6XHJcbiAgICAgIGNhc2UgJzAnOlxyXG4gICAgICAgIGdyb3VuZCA9IGZhbHNlXHJcbiAgICAgICAgYnJlYWtcclxuICAgICAgY2FzZSAxOlxyXG4gICAgICBjYXNlICcxJzpcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgbGV0IGhlaWdodCA9IHRoaXMuc2RrLnZpZXdlci5zY2VuZS5nbG9iZS5nZXRIZWlnaHQoQ2VzaXVtLkNhcnRvZ3JhcGhpYy5mcm9tRGVncmVlcyhwb3NpdGlvbnNbaV0ubG5nLCBwb3NpdGlvbnNbaV0ubGF0KSlcclxuICAgICAgICAgIHBvc2l0aW9uc1tpXS5hbHQgPSBoZWlnaHQgPyBOdW1iZXIoKHBvc2l0aW9uc1tpXS5hbHQgKyBOdW1iZXIoaGVpZ2h0KSkudG9GaXhlZCgyKSkgOiBOdW1iZXIoKHBvc2l0aW9uc1tpXS5hbHQpLnRvRml4ZWQoMikpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGdyb3VuZCA9IGZhbHNlXHJcbiAgICAgICAgYnJlYWtcclxuICAgICAgY2FzZSAyOlxyXG4gICAgICBjYXNlICcyJzpcclxuICAgICAgICBncm91bmQgPSB0cnVlXHJcbiAgICAgICAgYnJlYWtcclxuICAgIH1cclxuICAgIGxldCBuZXdQb3NpdGlvbnNcclxuICAgIGxldCBmcm9tRGVncmVlc0FycmF5ID0gW11cclxuICAgIGlmIChcclxuICAgICAgdGhpcy5vcHRpb25zLm5vc2VUb1RhaWwgJiZcclxuICAgICAgdGhpcy5vcHRpb25zLm5vc2VUb1RhaWwgIT09ICdmYWxzZSdcclxuICAgICkge1xyXG4gICAgICBuZXdQb3NpdGlvbnMgPSBbLi4ucG9zaXRpb25zLCBwb3NpdGlvbnNbMF1dXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBuZXdQb3NpdGlvbnMgPSBbLi4ucG9zaXRpb25zXVxyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5zbW9vdGggJiYgdGhpcy5vcHRpb25zLnNtb290aCAhPT0gJ2ZhbHNlJykge1xyXG4gICAgICBuZXdQb3NpdGlvbnMgPSB0aGlzLnNtb290aEhhbmRsZShuZXdQb3NpdGlvbnMpXHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmV3UG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgZnJvbURlZ3JlZXNBcnJheS5wdXNoKFxyXG4gICAgICAgICAgbmV3UG9zaXRpb25zW2ldLmxuZyxcclxuICAgICAgICAgIG5ld1Bvc2l0aW9uc1tpXS5sYXQsXHJcbiAgICAgICAgICBuZXdQb3NpdGlvbnNbaV0uYWx0XHJcbiAgICAgICAgKVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5ld1Bvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGZyb21EZWdyZWVzQXJyYXkucHVzaChcclxuICAgICAgICAgIG5ld1Bvc2l0aW9uc1tpXS5sbmcsXHJcbiAgICAgICAgICBuZXdQb3NpdGlvbnNbaV0ubGF0LFxyXG4gICAgICAgICAgbmV3UG9zaXRpb25zW2ldLmFsdFxyXG4gICAgICAgIClcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIOiuoeeul+mVv+W6plxyXG4gICAgaWYgKFxyXG4gICAgICAodGhpcy5vcHRpb25zLm5vc2VUb1RhaWwgJiZcclxuICAgICAgICB0aGlzLm9wdGlvbnMubm9zZVRvVGFpbCAhPT0gJ2ZhbHNlJykgfHxcclxuICAgICAgKHRoaXMub3B0aW9ucy5zbW9vdGggJiYgdGhpcy5vcHRpb25zLnNtb290aCAhPT0gJ2ZhbHNlJylcclxuICAgICkge1xyXG4gICAgICBsZXQgYXJyYXkgPSBbXVxyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZyb21EZWdyZWVzQXJyYXkubGVuZ3RoOyBpICs9IDMpIHtcclxuICAgICAgICBhcnJheS5wdXNoKHtcclxuICAgICAgICAgIGxuZzogZnJvbURlZ3JlZXNBcnJheVtpXSxcclxuICAgICAgICAgIGxhdDogZnJvbURlZ3JlZXNBcnJheVtpICsgMV0sXHJcbiAgICAgICAgICBhbHQ6IGZyb21EZWdyZWVzQXJyYXlbaSArIDJdXHJcbiAgICAgICAgfSlcclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IF90aGlzID0gdGhpc1xyXG4gICAgICB0aGlzLmNvbXB1dGVEaXN0YW5jZShcclxuICAgICAgICBhcnJheSxcclxuICAgICAgICAyLFxyXG4gICAgICAgIHRoaXMub3B0aW9ucy53b3Jkc05hbWVcclxuICAgICAgKS50aGVuKHJlcyA9PiB7XHJcbiAgICAgICAgX3RoaXMubGVuZ3RoQnlNZXRlciA9IHJlc1xyXG4gICAgICAgIHRoaXMubGVuZ3RoQ2hhbmdlQ2FsbEJhY2sgJiYgdGhpcy5sZW5ndGhDaGFuZ2VDYWxsQmFjaygpXHJcbiAgICAgICAgY2QgJiYgY2QoKVxyXG4gICAgICB9KVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbGV0IF90aGlzID0gdGhpc1xyXG4gICAgICB0aGlzLmNvbXB1dGVEaXN0YW5jZShcclxuICAgICAgICBwb3NpdGlvbnMsXHJcbiAgICAgICAgMixcclxuICAgICAgICB0aGlzLm9wdGlvbnMud29yZHNOYW1lXHJcbiAgICAgICkudGhlbihyZXMgPT4ge1xyXG4gICAgICAgIF90aGlzLmxlbmd0aEJ5TWV0ZXIgPSByZXNcclxuICAgICAgICB0aGlzLmxlbmd0aENoYW5nZUNhbGxCYWNrICYmIHRoaXMubGVuZ3RoQ2hhbmdlQ2FsbEJhY2soKVxyXG4gICAgICAgIGNkICYmIGNkKClcclxuICAgICAgfSlcclxuICAgIH1cclxuICAgIHJldHVybiBmcm9tRGVncmVlc0FycmF5XHJcbiAgfVxyXG5cclxuICAvLyDmm7TmlrDlpJrovrnlvaLvvIjnur/mianlsZXvvIlcclxuICByZW5ld1BvbHlnb24oZnJvbURlZ3JlZXNBcnJheSkge1xyXG4gICAgbGV0IGxpbmVQb3NpdGlvbnMgPSBbXVxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5leHRlbmQgJiYgdGhpcy5vcHRpb25zLmV4dGVuZCAhPT0gJ2ZhbHNlJykge1xyXG4gICAgICBsZXQgb3V0ZXJIb2xlID0gW11cclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmcm9tRGVncmVlc0FycmF5Lmxlbmd0aDsgaSArPSAzKSB7XHJcbiAgICAgICAgbGluZVBvc2l0aW9ucy5wdXNoKFtmcm9tRGVncmVlc0FycmF5W2ldLCBmcm9tRGVncmVlc0FycmF5W2kgKyAxXV0pXHJcbiAgICAgIH1cclxuICAgICAgbGV0IGxpbmVzdHJpbmcgPSB0dXJmLmxpbmVTdHJpbmcobGluZVBvc2l0aW9ucylcclxuICAgICAgbGV0IGJ1ZmZlcmVkID0gdHVyZi5idWZmZXIoXHJcbiAgICAgICAgbGluZXN0cmluZyxcclxuICAgICAgICB0aGlzLm9wdGlvbnMuZXh0ZW5kV2lkdGggLyAxMDAwLFxyXG4gICAgICAgIHsgdW5pdHM6ICdraWxvbWV0ZXJzJyB9XHJcbiAgICAgIClcclxuXHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnVmZmVyZWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMF0ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBvdXRlckhvbGUucHVzaChcclxuICAgICAgICAgIGJ1ZmZlcmVkLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzBdW2ldWzBdLFxyXG4gICAgICAgICAgYnVmZmVyZWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMF1baV1bMV1cclxuICAgICAgICApXHJcbiAgICAgIH1cclxuICAgICAgbGV0IGhvbGVzID0gW10gLy8g5a2UXHJcbiAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgYnVmZmVyZWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBsZXQgYXJyYXkgPSBbXVxyXG4gICAgICAgIGZvciAobGV0IG0gPSAwOyBtIDwgYnVmZmVyZWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbaV0ubGVuZ3RoOyBtKyspIHtcclxuICAgICAgICAgIGFycmF5LnB1c2goXHJcbiAgICAgICAgICAgIGJ1ZmZlcmVkLmdlb21ldHJ5LmNvb3JkaW5hdGVzW2ldW21dWzBdLFxyXG4gICAgICAgICAgICBidWZmZXJlZC5nZW9tZXRyeS5jb29yZGluYXRlc1tpXVttXVsxXVxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIH1cclxuICAgICAgICBob2xlcy5wdXNoKHsgcG9zaXRpb25zOiBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlc0FycmF5KGFycmF5KSB9KVxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuZW50aXR5LnBvbHlnb24gPSBuZXcgQ2VzaXVtLlBvbHlnb25HcmFwaGljcyh7XHJcbiAgICAgICAgaGllcmFyY2h5OiB7XHJcbiAgICAgICAgICBwb3NpdGlvbnM6IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzQXJyYXkob3V0ZXJIb2xlKSxcclxuICAgICAgICAgIGhvbGVzOiBob2xlc1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgbWF0ZXJpYWw6IENlc2l1bS5Db2xvci5mcm9tQ3NzQ29sb3JTdHJpbmcodGhpcy5vcHRpb25zLmV4dGVuZENvbG9yKVxyXG4gICAgICB9KVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5lbnRpdHkucG9seWdvbiA9IHVuZGVmaW5lZFxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgcmVzZXQoKSB7XHJcbiAgICBpZiAoIXRoaXMuZW50aXR5KSB7XHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG4gICAgdGhpcy5vcHRpb25zID0gdGhpcy5kZWVwQ29weU9iaih0aGlzLm9yaWdpbmFsT3B0aW9ucylcclxuICAgIHRoaXMubmFtZSA9IHRoaXMub3JpZ2luYWxPcHRpb25zLm5hbWVcclxuICAgIHRoaXMuY29sb3IgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5jb2xvclxyXG4gICAgdGhpcy5saW5lV2lkdGggPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy53aWR0aFxyXG4gICAgdGhpcy5saW5lVHlwZSA9IHRoaXMub3JpZ2luYWxPcHRpb25zLnR5cGVcclxuICAgIHRoaXMubm9zZVRvVGFpbCA9IHRoaXMub3JpZ2luYWxPcHRpb25zLm5vc2VUb1RhaWxcclxuICAgIHRoaXMuc21vb3RoID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMuc21vb3RoXHJcbiAgICB0aGlzLmV4dGVuZCA9IHRoaXMub3JpZ2luYWxPcHRpb25zLmV4dGVuZFxyXG4gICAgdGhpcy5leHRlbmRXaWR0aCA9IHRoaXMub3JpZ2luYWxPcHRpb25zLmV4dGVuZFdpZHRoXHJcbiAgICB0aGlzLmV4dGVuZENvbG9yID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMuZXh0ZW5kQ29sb3JcclxuICAgIHRoaXMubGFiZWxTaG93ID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMubGFiZWwuc2hvd1xyXG4gICAgdGhpcy5sYWJlbENvbG9yID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMubGFiZWwuY29sb3JcclxuICAgIHRoaXMubGFiZWxGb250U2l6ZSA9IHRoaXMub3JpZ2luYWxPcHRpb25zLmxhYmVsLmZvbnRTaXplXHJcbiAgICB0aGlzLmxhYmVsRm9udEZhbWlseSA9IHRoaXMub3JpZ2luYWxPcHRpb25zLmxhYmVsLmZvbnRGYW1pbHlcclxuICAgIHRoaXMubGFiZWxMaW5lV2lkdGggPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5sYWJlbC5saW5lV2lkdGhcclxuICAgIHRoaXMubGFiZWxQaXhlbE9mZnNldCA9IHRoaXMub3JpZ2luYWxPcHRpb25zLmxhYmVsLnBpeGVsT2Zmc2V0XHJcbiAgICB0aGlzLmxhYmVsTGluZUNvbG9yID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMubGFiZWwubGluZUNvbG9yXHJcbiAgICB0aGlzLmxhYmVsQmFja2dyb3VuZENvbG9yU3RhcnQgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5sYWJlbC5iYWNrZ3JvdW5kQ29sb3JbMF1cclxuICAgIHRoaXMubGFiZWxCYWNrZ3JvdW5kQ29sb3JFbmQgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5sYWJlbC5iYWNrZ3JvdW5kQ29sb3JbMV1cclxuICAgIC8vIHRoaXMuYXR0cmlidXRlVnIgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnRcclxuICAgIC8vIHRoaXMuYXR0cmlidXRlQ2FtZXJhID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5jYW1lcmEuY29udGVudFxyXG4gICAgLy8gdGhpcy5hdHRyaWJ1dGVHb29kcyA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUuZ29vZHMuY29udGVudFxyXG4gICAgdGhpcy5yb3RhdGUgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5yb3RhdGVcclxuICAgIHRoaXMuc3BlZWQgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5zcGVlZFxyXG4gICAgLy8gdGhpcy5kYXNoU2l6ZSA9IHRoaXMub3JpZ2luYWxPcHRpb25zLmRhc2hTaXplXHJcbiAgICB0aGlzLnNwYWNlID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMuc3BhY2VcclxuICAgIC8vIHRoaXMuY2FtZXJhU2VsZWN0ICYmIHRoaXMuY2FtZXJhU2VsZWN0KClcclxuICAgIC8vIHRoaXMuZ29vZHNTZWxlY3QgJiYgdGhpcy5nb29kc1NlbGVjdCgpXHJcblxyXG4gICAgdGhpcy5oZWlnaHRNb2RlID0gdGhpcy5vcHRpb25zLmhlaWdodE1vZGVcclxuXHJcbiAgICAvLyBsZXQgaGVpZ2h0XHJcbiAgICAvLyBpZiAodGhpcy5ncm91bmQpIHtcclxuICAgIC8vICAgaGVpZ2h0ID0gYXdhaXQgdGhhdC5nZXRDbGFtcFRvSGVpZ2h0KHtcclxuICAgIC8vICAgICBsbmc6IHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0ubG5nLFxyXG4gICAgLy8gICAgIGxhdDogdGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXS5sYXRcclxuICAgIC8vICAgfSlcclxuICAgIC8vIH0gZWxzZSB7XHJcbiAgICAvLyAgIGhlaWdodCA9IHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0uYWx0XHJcbiAgICAvLyB9XHJcbiAgICAvLyB0aGlzLm9wdGlvbnMubGFiZWwucG9zaXRpb24gPSB7XHJcbiAgICAvLyAgIGxuZzogdGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXS5sbmcsXHJcbiAgICAvLyAgIGxhdDogdGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXS5sYXQsXHJcbiAgICAvLyAgIGFsdDogaGVpZ2h0XHJcbiAgICAvLyB9XHJcbiAgICAvLyB0aGlzLmxhYmVsLnBvc2l0aW9uID0gW1xyXG4gICAgLy8gICB0aGlzLm9wdGlvbnMubGFiZWwucG9zaXRpb24ubG5nLFxyXG4gICAgLy8gICB0aGlzLm9wdGlvbnMubGFiZWwucG9zaXRpb24ubGF0LFxyXG4gICAgLy8gICB0aGlzLm9wdGlvbnMubGFiZWwucG9zaXRpb24uYWx0XHJcbiAgICAvLyBdXHJcbiAgfVxyXG5cclxuICAvLyBfYWRkUnIoKSB7XHJcbiAgLy8gICBpZiAoXHJcbiAgLy8gICAgIHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXHJcbiAgLy8gICAgICAgJ3ZyX2FkZCdcclxuICAvLyAgICAgKVswXS52YWx1ZVxyXG4gIC8vICAgKSB7XHJcbiAgLy8gICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUudnIuY29udGVudC5wdXNoKHtcclxuICAvLyAgICAgICBuYW1lOiAn5YWo5pmv5Zu+JyArICh0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnQubGVuZ3RoICsgMSksXHJcbiAgLy8gICAgICAgdXJsOiB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFxyXG4gIC8vICAgICAgICAgJ3ZyX2FkZCdcclxuICAvLyAgICAgICApWzBdLnZhbHVlXHJcbiAgLy8gICAgIH0pXHJcbiAgLy8gICAgIHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXHJcbiAgLy8gICAgICAgJ3ZyX2FkZCdcclxuICAvLyAgICAgKVswXS52YWx1ZSA9ICcnXHJcbiAgLy8gICAgIHRoaXMuYXR0cmlidXRlVnIgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnRcclxuICAvLyAgIH0gZWxzZSB7XHJcbiAgLy8gICAgIHRoaXMuRGlhbG9nLmNsaWNrQWRkVnIgJiYgdGhpcy5EaWFsb2cuY2xpY2tBZGRWcigpXHJcbiAgLy8gICB9XHJcbiAgLy8gfVxyXG5cclxuICAvLyBhZGRBdHRyaWJ1dGVScih2cikge1xyXG4gIC8vICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52ci5jb250ZW50LnB1c2goe1xyXG4gIC8vICAgICBuYW1lOiAn5YWo5pmv5Zu+JyArICh0aGlzLm9wdGlvbnMuYXR0cmlidXRlLnZyLmNvbnRlbnQubGVuZ3RoICsgMSksXHJcbiAgLy8gICAgIHVybDogdnJcclxuICAvLyAgIH0pXHJcbiAgLy8gICB0aGlzLmF0dHJpYnV0ZVZyID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS52ci5jb250ZW50XHJcbiAgLy8gfVxyXG5cclxuICAvKipcclxuICAgKiDpo57liLBcclxuICAgKi9cclxuICBhc3luYyBmbHlUbyhvcHRpb25zID0ge30pIHtcclxuICAgIGlmICh0aGlzLl9lcnJvcikge1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuICAgIHNldEFjdGl2ZVZpZXdlcigwKVxyXG4gICAgY2xvc2VSb3RhdGVBcm91bmQodGhpcy5zZGspXHJcbiAgICBjbG9zZVZpZXdGb2xsb3codGhpcy5zZGspXHJcblxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5jdXN0b21WaWV3ICYmIHRoaXMub3B0aW9ucy5jdXN0b21WaWV3LnJlbGF0aXZlUG9zaXRpb24gJiYgdGhpcy5vcHRpb25zLmN1c3RvbVZpZXcub3JpZW50YXRpb24pIHtcclxuICAgICAgbGV0IG9yaWVudGF0aW9uID0ge1xyXG4gICAgICAgIGhlYWRpbmc6IENlc2l1bS5NYXRoLnRvUmFkaWFucyh0aGlzLm9wdGlvbnMuY3VzdG9tVmlldy5vcmllbnRhdGlvbi5oZWFkaW5nIHx8IDAuMCksXHJcbiAgICAgICAgcGl0Y2g6IENlc2l1bS5NYXRoLnRvUmFkaWFucyh0aGlzLm9wdGlvbnMuY3VzdG9tVmlldy5vcmllbnRhdGlvbi5waXRjaCB8fCAtNjAuMCksXHJcbiAgICAgICAgcm9sbDogQ2VzaXVtLk1hdGgudG9SYWRpYW5zKHRoaXMub3B0aW9ucy5jdXN0b21WaWV3Lm9yaWVudGF0aW9uLnJvbGwgfHwgMC4wKVxyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgbG5nID0gdGhpcy5vcHRpb25zLmN1c3RvbVZpZXcucmVsYXRpdmVQb3NpdGlvbi5sbmdcclxuICAgICAgbGV0IGxhdCA9IHRoaXMub3B0aW9ucy5jdXN0b21WaWV3LnJlbGF0aXZlUG9zaXRpb24ubGF0XHJcbiAgICAgIGxldCBhbHQgPSB0aGlzLm9wdGlvbnMuY3VzdG9tVmlldy5yZWxhdGl2ZVBvc2l0aW9uLmFsdFxyXG4gICAgICBsZXQgZGVzdGluYXRpb24gPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlcyhsbmcsIGxhdCwgYWx0KVxyXG5cclxuICAgICAgbGV0IHBvc2l0aW9uID0geyBsbmc6IDAsIGxhdDogMCB9XHJcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMucG9zaXRpb24pIHtcclxuICAgICAgICBwb3NpdGlvbiA9IHsgLi4udGhpcy5vcHRpb25zLnBvc2l0aW9uIH1cclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmICh0aGlzLm9wdGlvbnMucG9zaXRpb25zKSB7XHJcbiAgICAgICAgcG9zaXRpb24gPSB7IC4uLnRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0gfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKHRoaXMub3B0aW9ucy5jZW50ZXIpIHtcclxuICAgICAgICBwb3NpdGlvbiA9IHsgLi4udGhpcy5vcHRpb25zLmNlbnRlciB9XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAodGhpcy5vcHRpb25zLnN0YXJ0KSB7XHJcbiAgICAgICAgcG9zaXRpb24gPSB7IC4uLnRoaXMub3B0aW9ucy5zdGFydCB9XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgnbG5nJykpIHtcclxuICAgICAgICAgIHBvc2l0aW9uLmxuZyA9IHRoaXMub3B0aW9ucy5sbmdcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgnbGF0JykpIHtcclxuICAgICAgICAgIHBvc2l0aW9uLmxhdCA9IHRoaXMub3B0aW9ucy5sYXRcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgnYWx0JykpIHtcclxuICAgICAgICAgIHBvc2l0aW9uLmFsdCA9IHRoaXMub3B0aW9ucy5hbHRcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgLy8g5aaC5p6c5rKh5pyJ6auY5bqm5YC877yM5YiZ6I635Y+W57Sn6LS06auY5bqm6K6h566XXHJcbiAgICAgIGlmICghcG9zaXRpb24uaGFzT3duUHJvcGVydHkoJ2FsdCcpKSB7XHJcbiAgICAgICAgcG9zaXRpb24uYWx0ID0gYXdhaXQgdGhpcy5nZXRDbGFtcFRvSGVpZ2h0KHBvc2l0aW9uKVxyXG4gICAgICB9XHJcbiAgICAgIGxuZyA9IHRoaXMub3B0aW9ucy5jdXN0b21WaWV3LnJlbGF0aXZlUG9zaXRpb24ubG5nICsgcG9zaXRpb24ubG5nXHJcbiAgICAgIGxhdCA9IHRoaXMub3B0aW9ucy5jdXN0b21WaWV3LnJlbGF0aXZlUG9zaXRpb24ubGF0ICsgcG9zaXRpb24ubGF0XHJcbiAgICAgIGFsdCA9IHRoaXMub3B0aW9ucy5jdXN0b21WaWV3LnJlbGF0aXZlUG9zaXRpb24uYWx0ICsgcG9zaXRpb24uYWx0XHJcbiAgICAgIGRlc3RpbmF0aW9uID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXMobG5nLCBsYXQsIGFsdClcclxuICAgICAgdGhpcy5zZGsudmlld2VyLmNhbWVyYS5mbHlUbyh7XHJcbiAgICAgICAgZGVzdGluYXRpb246IGRlc3RpbmF0aW9uLFxyXG4gICAgICAgIG9yaWVudGF0aW9uOiBvcmllbnRhdGlvblxyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGxldCBwb3NpdGlvbkFycmF5ID0gW11cclxuICAgICAgbGV0IGhlaWdodFxyXG4gICAgICBzd2l0Y2ggKHRoaXMub3B0aW9ucy5oZWlnaHRNb2RlKSB7XHJcbiAgICAgICAgY2FzZSAnMCc6XHJcbiAgICAgICAgY2FzZSAwOlxyXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm9wdGlvbnMucG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGxldCBhID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXMoXHJcbiAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sbmcsXHJcbiAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sYXQsXHJcbiAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5hbHRcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICBwb3NpdGlvbkFycmF5LnB1c2goYS54LCBhLnksIGEueilcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgY2FzZSAnMSc6XHJcbiAgICAgICAgY2FzZSAxOlxyXG4gICAgICAgICAgaGVpZ2h0ID0gYXdhaXQgdGhpcy5nZXRDbGFtcFRvSGVpZ2h0KHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0pXHJcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMub3B0aW9ucy5wb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgbGV0IGEgPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlcyhcclxuICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxuZyxcclxuICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxhdCxcclxuICAgICAgICAgICAgICBoZWlnaHQgKyB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmFsdFxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICAgIHBvc2l0aW9uQXJyYXkucHVzaChhLngsIGEueSwgYS56KVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWtcclxuICAgICAgICBjYXNlICcyJzpcclxuICAgICAgICBjYXNlIDI6XHJcbiAgICAgICAgICBoZWlnaHQgPSBhd2FpdCB0aGlzLmdldENsYW1wVG9IZWlnaHQodGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXSlcclxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5vcHRpb25zLnBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBsZXQgYSA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzKFxyXG4gICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubG5nLFxyXG4gICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubGF0LFxyXG4gICAgICAgICAgICAgIGhlaWdodFxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICAgIHBvc2l0aW9uQXJyYXkucHVzaChhLngsIGEueSwgYS56KVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWtcclxuICAgICAgfVxyXG4gICAgICBsZXQgQm91bmRpbmdTcGhlcmUgPSBDZXNpdW0uQm91bmRpbmdTcGhlcmUuZnJvbVZlcnRpY2VzKHBvc2l0aW9uQXJyYXkpXHJcbiAgICAgIHRoaXMuc2RrLnZpZXdlci5jYW1lcmEuZmx5VG9Cb3VuZGluZ1NwaGVyZShCb3VuZGluZ1NwaGVyZSwge1xyXG4gICAgICAgIG9mZnNldDogb3B0aW9ucy5vcmllbnRhdGlvbiB8fCB7XHJcbiAgICAgICAgICBoZWFkaW5nOiBDZXNpdW0uTWF0aC50b1JhZGlhbnMoMC4wKSxcclxuICAgICAgICAgIHBpdGNoOiBDZXNpdW0uTWF0aC50b1JhZGlhbnMoLTkwLjApLFxyXG4gICAgICAgICAgcm9sbDogQ2VzaXVtLk1hdGgudG9SYWRpYW5zKDAuMClcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBzdGF0aWMgbm9kZUVkaXQyKHRoYXQsIGNiID0gKCkgPT4geyB9KSB7XHJcbiAgLy8gICB0aGF0LnBvc2l0aW9uRWRpdGluZyA9IGZhbHNlXHJcbiAgLy8gICBpZiAoWUouTWVhc3VyZS5HZXRNZWFzdXJlU3RhdHVzKCkpIHtcclxuICAvLyAgICAgY2IoJ+S4iuS4gOasoea1i+mHj+acque7k+adnycpXHJcbiAgLy8gICB9IGVsc2Uge1xyXG4gIC8vICAgICBZSi5NZWFzdXJlLlNldE1lYXN1cmVTdGF0dXModHJ1ZSlcclxuICAvLyAgICAgdGhhdC50aXAgPSBuZXcgTW91c2VUaXAoJ+ivt+mAieaLqeS4gOS4qumhtueCue+8jOWPs+mUruWPlua2iCcsIHRoYXQuc2RrKVxyXG4gIC8vICAgICB0aGF0LmV2ZW50ID0gbmV3IE1vdXNlRXZlbnQodGhhdC5zZGspXHJcbiAgLy8gICAgIHRoYXQubm9kZVBvaW50cyA9IFtdXHJcbiAgLy8gICAgIGxldCBzZWxlY3RQb2ludFxyXG4gIC8vICAgICBsZXQgb3JpZ2luYWxQb3NpdGlvblxyXG4gIC8vICAgICBsZXQgbmV3cG9zaXRpb25zID0gW11cclxuICAvLyAgICAgbGV0IGZyb21EZWdyZWVzQXJyYXkgPSBbXVxyXG4gIC8vICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoYXQub3B0aW9ucy5wb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAvLyAgICAgICBmcm9tRGVncmVlc0FycmF5LnB1c2goXHJcbiAgLy8gICAgICAgICB0aGF0Lm9wdGlvbnMucG9zaXRpb25zW2ldLmxuZyxcclxuICAvLyAgICAgICAgIHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbaV0ubGF0LFxyXG4gIC8vICAgICAgICAgdGhhdC5vcHRpb25zLnBvc2l0aW9uc1tpXS5hbHRcclxuICAvLyAgICAgICApXHJcbiAgLy8gICAgIH1cclxuICAvLyAgICAgbmV3cG9zaXRpb25zID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXNBcnJheUhlaWdodHMoZnJvbURlZ3JlZXNBcnJheSlcclxuXHJcbiAgLy8gICAgIHRoYXQuZXZlbnQubW91c2VfbGVmdCgobW92ZW1lbnQsIGNhcnRlc2lhbikgPT4ge1xyXG4gIC8vICAgICAgIGlmIChzZWxlY3RQb2ludCkge1xyXG4gIC8vICAgICAgICAgdGhhdC5vcHRpb25zLnBvc2l0aW9uc1tzZWxlY3RQb2ludC5pbmRleF0gPSB0aGF0LmNhcnRlc2lhbjNUb3dnczg0KFxyXG4gIC8vICAgICAgICAgICBjYXJ0ZXNpYW4sXHJcbiAgLy8gICAgICAgICAgIHRoYXQuc2RrLnZpZXdlclxyXG4gIC8vICAgICAgICAgKVxyXG4gIC8vICAgICAgICAgb3JpZ2luYWxQb3NpdGlvbiA9IHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbc2VsZWN0UG9pbnQuaW5kZXhdXHJcbiAgLy8gICAgICAgICBsZXQgZW50aXR5ID0gdGhhdC5zZGsudmlld2VyLmVudGl0aWVzLmFkZCh7XHJcbiAgLy8gICAgICAgICAgIG5hbWU6ICdub2RlLXNlY29uZGFyeS1lZGl0LXBvaW50JyxcclxuICAvLyAgICAgICAgICAgcG9zaXRpb246IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzKFxyXG4gIC8vICAgICAgICAgICAgIHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbc2VsZWN0UG9pbnQuaW5kZXhdLmxuZyxcclxuICAvLyAgICAgICAgICAgICB0aGF0Lm9wdGlvbnMucG9zaXRpb25zW3NlbGVjdFBvaW50LmluZGV4XS5sYXQsXHJcbiAgLy8gICAgICAgICAgICAgdGhhdC5vcHRpb25zLnBvc2l0aW9uc1tzZWxlY3RQb2ludC5pbmRleF0uYWx0XHJcbiAgLy8gICAgICAgICAgICksXHJcbiAgLy8gICAgICAgICAgIGJpbGxib2FyZDoge1xyXG4gIC8vICAgICAgICAgICAgIGltYWdlOiB0aGF0LmdldFNvdXJjZVJvb3RQYXRoKCkgKyAnL2ltZy9wb2ludC5wbmcnLFxyXG4gIC8vICAgICAgICAgICAgIHdpZHRoOiAxNSxcclxuICAvLyAgICAgICAgICAgICBoZWlnaHQ6IDE1LFxyXG4gIC8vICAgICAgICAgICAgIGRpc2FibGVEZXB0aFRlc3REaXN0YW5jZTogTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZXHJcbiAgLy8gICAgICAgICAgIH1cclxuICAvLyAgICAgICAgIH0pXHJcbiAgLy8gICAgICAgICB0aGF0Lm5vZGVQb2ludHMuc3BsaWNlKHNlbGVjdFBvaW50LmluZGV4LCAwLCBlbnRpdHkpXHJcbiAgLy8gICAgICAgICB0aGF0Lm9wdGlvbnMucG9zaXRpb25zLnNwbGljZShcclxuICAvLyAgICAgICAgICAgc2VsZWN0UG9pbnQuaW5kZXgsXHJcbiAgLy8gICAgICAgICAgIDAsXHJcbiAgLy8gICAgICAgICAgIHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbc2VsZWN0UG9pbnQuaW5kZXhdXHJcbiAgLy8gICAgICAgICApXHJcbiAgLy8gICAgICAgICBsZXQgZnJvbURlZ3JlZXNBcnJheSA9IHRoYXQucmVuZXdQb3NpdGlvbnModGhhdC5vcHRpb25zLnBvc2l0aW9ucylcclxuICAvLyAgICAgICAgIHRoYXQucmVuZXdQb2x5Z29uKGZyb21EZWdyZWVzQXJyYXkpXHJcbiAgLy8gICAgICAgICB0aGF0Lm9wdGlvbnMubGVuZ3RoQnlNZXRlciA9IHRoYXQuY29tcHV0ZURpc3RhbmNlKFxyXG4gIC8vICAgICAgICAgICB0aGF0Lm9wdGlvbnMucG9zaXRpb25zLFxyXG4gIC8vICAgICAgICAgICAyLFxyXG4gIC8vICAgICAgICAgICB0aGF0Lmdyb3VuZFxyXG4gIC8vICAgICAgICAgKVxyXG4gIC8vICAgICAgICAgdGhhdC5sZW5ndGhVbml0ID0gdGhhdC5vcHRpb25zLmxlbmd0aFVuaXRcclxuICAvLyAgICAgICB9IGVsc2Uge1xyXG4gIC8vICAgICAgICAgdmFyIHBpY2sgPSB0aGF0LnNkay52aWV3ZXIuc2NlbmUucGljayhtb3ZlbWVudC5wb3NpdGlvbilcclxuICAvLyAgICAgICAgIGlmIChcclxuICAvLyAgICAgICAgICAgcGljayAmJlxyXG4gIC8vICAgICAgICAgICBwaWNrLmlkICYmXHJcbiAgLy8gICAgICAgICAgIHBpY2suaWQubmFtZSAmJlxyXG4gIC8vICAgICAgICAgICBwaWNrLmlkLm5hbWUgPT09ICdub2RlLXNlY29uZGFyeS1lZGl0LXBvaW50J1xyXG4gIC8vICAgICAgICAgKSB7XHJcbiAgLy8gICAgICAgICAgIHNlbGVjdFBvaW50ID0gcGljay5pZFxyXG4gIC8vICAgICAgICAgICB0aGF0Lm5vZGVQb2ludHMuc3BsaWNlKHBpY2suaWQuaW5kZXgsIDEpXHJcbiAgLy8gICAgICAgICAgIHRoYXQuc2RrLnZpZXdlci5lbnRpdGllcy5yZW1vdmUocGljay5pZClcclxuICAvLyAgICAgICAgICAgdGhhdC50aXAuc2V0X3RleHQoJ+W3pumUruW8gOWni++8jOWPs+mUrue7k+adn++8jENUUkwr5Y+z6ZSu5pKk6ZSAJylcclxuICAvLyAgICAgICAgICAgb3JpZ2luYWxQb3NpdGlvbiA9IHRoYXQuY2FydGVzaWFuM1Rvd2dzODQoXHJcbiAgLy8gICAgICAgICAgICAgY2FydGVzaWFuLFxyXG4gIC8vICAgICAgICAgICAgIHRoYXQuc2RrLnZpZXdlclxyXG4gIC8vICAgICAgICAgICApXHJcbiAgLy8gICAgICAgICB9XHJcbiAgLy8gICAgICAgfVxyXG4gIC8vICAgICB9KVxyXG5cclxuICAvLyAgICAgdGhhdC5ldmVudC5tb3VzZV9yaWdodCgobW92ZW1lbnQsIGNhcnRlc2lhbikgPT4ge1xyXG4gIC8vICAgICAgIGlmIChzZWxlY3RQb2ludCkge1xyXG4gIC8vICAgICAgICAgdGhhdC5vcHRpb25zLnBvc2l0aW9uc1tzZWxlY3RQb2ludC5pbmRleF0gPSBvcmlnaW5hbFBvc2l0aW9uXHJcbiAgLy8gICAgICAgICBjYihudWxsLCB0aGF0Lm9wdGlvbnMucG9zaXRpb25zKVxyXG4gIC8vICAgICAgIH1cclxuICAvLyAgICAgICBsZXQgcG9zaXRpb25zID0gdGhhdC5vcHRpb25zLnBvc2l0aW9uc1xyXG4gIC8vICAgICAgIGxldCBmcm9tRGVncmVlc0FycmF5ID0gW11cclxuICAvLyAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gIC8vICAgICAgICAgZnJvbURlZ3JlZXNBcnJheS5wdXNoKFxyXG4gIC8vICAgICAgICAgICBwb3NpdGlvbnNbaV0ubG5nLFxyXG4gIC8vICAgICAgICAgICBwb3NpdGlvbnNbaV0ubGF0LFxyXG4gIC8vICAgICAgICAgICBwb3NpdGlvbnNbaV0uYWx0XHJcbiAgLy8gICAgICAgICApXHJcbiAgLy8gICAgICAgfVxyXG4gIC8vICAgICAgIG5ld3Bvc2l0aW9ucyA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzQXJyYXlIZWlnaHRzKFxyXG4gIC8vICAgICAgICAgZnJvbURlZ3JlZXNBcnJheVxyXG4gIC8vICAgICAgIClcclxuICAvLyAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoYXQubm9kZVBvaW50cy5sZW5ndGg7IGkrKykge1xyXG4gIC8vICAgICAgICAgdGhhdC5zZGsudmlld2VyLmVudGl0aWVzLnJlbW92ZSh0aGF0Lm5vZGVQb2ludHNbaV0pXHJcbiAgLy8gICAgICAgfVxyXG4gIC8vICAgICAgIHRoYXQubm9kZVBvaW50cyA9IFtdXHJcbiAgLy8gICAgICAgdGhhdC5ldmVudC5kZXN0cm95KClcclxuICAvLyAgICAgICB0aGF0LnRpcC5kZXN0cm95KClcclxuICAvLyAgICAgfSlcclxuXHJcbiAgLy8gICAgIHRoYXQuZXZlbnQubW91c2VfbW92ZSgobW92ZW1lbnQsIGNhcnRlc2lhbikgPT4ge1xyXG4gIC8vICAgICAgIGlmIChzZWxlY3RQb2ludCkge1xyXG4gIC8vICAgICAgICAgdGhhdC5vcHRpb25zLnBvc2l0aW9uc1tzZWxlY3RQb2ludC5pbmRleF0gPSB0aGF0LmNhcnRlc2lhbjNUb3dnczg0KFxyXG4gIC8vICAgICAgICAgICBjYXJ0ZXNpYW4sXHJcbiAgLy8gICAgICAgICAgIHRoYXQuc2RrLnZpZXdlclxyXG4gIC8vICAgICAgICAgKVxyXG4gIC8vICAgICAgICAgbGV0IHBvc2l0aW9ucyA9IHRoYXQub3B0aW9ucy5wb3NpdGlvbnNcclxuICAvLyAgICAgICAgIGxldCBmcm9tRGVncmVlc0FycmF5ID0gW11cclxuICAvLyAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgLy8gICAgICAgICAgIGZyb21EZWdyZWVzQXJyYXkucHVzaChcclxuICAvLyAgICAgICAgICAgICBwb3NpdGlvbnNbaV0ubG5nLFxyXG4gIC8vICAgICAgICAgICAgIHBvc2l0aW9uc1tpXS5sYXQsXHJcbiAgLy8gICAgICAgICAgICAgcG9zaXRpb25zW2ldLmFsdFxyXG4gIC8vICAgICAgICAgICApXHJcbiAgLy8gICAgICAgICB9XHJcbiAgLy8gICAgICAgICBuZXdwb3NpdGlvbnMgPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlc0FycmF5SGVpZ2h0cyhcclxuICAvLyAgICAgICAgICAgZnJvbURlZ3JlZXNBcnJheVxyXG4gIC8vICAgICAgICAgKVxyXG4gIC8vICAgICAgICAgaWYgKHRoYXQub3B0aW9ucy5wb3NpdGlvbnMubGVuZ3RoID09PSAxKSB7XHJcbiAgLy8gICAgICAgICAgIHRoYXQubGFiZWwucG9zaXRpb24gPSBbXHJcbiAgLy8gICAgICAgICAgICAgdGhhdC5vcHRpb25zLnBvc2l0aW9uc1swXS5sbmcsXHJcbiAgLy8gICAgICAgICAgICAgdGhhdC5vcHRpb25zLnBvc2l0aW9uc1swXS5sYXQsXHJcbiAgLy8gICAgICAgICAgICAgdGhhdC5vcHRpb25zLnBvc2l0aW9uc1swXS5hbHRcclxuICAvLyAgICAgICAgICAgXVxyXG4gIC8vICAgICAgICAgICB0aGF0Lm9wdGlvbnMubGFiZWwucG9zaXRpb24gPSB7XHJcbiAgLy8gICAgICAgICAgICAgbG5nOiB0aGF0Lm9wdGlvbnMucG9zaXRpb25zWzBdLmxuZyxcclxuICAvLyAgICAgICAgICAgICBsYXQ6IHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbMF0ubGF0LFxyXG4gIC8vICAgICAgICAgICAgIGFsdDogdGhhdC5vcHRpb25zLnBvc2l0aW9uc1swXS5hbHRcclxuICAvLyAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgfVxyXG4gIC8vICAgICAgIH1cclxuICAvLyAgICAgICB0aGF0LnRpcC5zZXRQb3NpdGlvbihcclxuICAvLyAgICAgICAgIGNhcnRlc2lhbixcclxuICAvLyAgICAgICAgIG1vdmVtZW50LmVuZFBvc2l0aW9uLngsXHJcbiAgLy8gICAgICAgICBtb3ZlbWVudC5lbmRQb3NpdGlvbi55XHJcbiAgLy8gICAgICAgKVxyXG4gIC8vICAgICB9KVxyXG5cclxuICAvLyAgICAgdGhhdC5ldmVudC5tb3VzZV9yaWdodF9rZXlib2FyZF9jdHJsKChtb3ZlbWVudCwgY2FydGVzaWFuKSA9PiB7XHJcbiAgLy8gICAgICAgaWYgKHNlbGVjdFBvaW50KSB7XHJcbiAgLy8gICAgICAgICB0aGF0Lm9wdGlvbnMucG9zaXRpb25zLnBvcCgpXHJcbiAgLy8gICAgICAgICB0aGF0LnNkay52aWV3ZXIuZW50aXRpZXMucmVtb3ZlKFxyXG4gIC8vICAgICAgICAgICB0aGF0Lm5vZGVQb2ludHNbdGhhdC5ub2RlUG9pbnRzLmxlbmd0aCAtIDFdXHJcbiAgLy8gICAgICAgICApXHJcbiAgLy8gICAgICAgICB0aGF0Lm5vZGVQb2ludHMucG9wKClcclxuICAvLyAgICAgICAgIGlmIChzZWxlY3RQb2ludC5pbmRleCA9PT0gdGhhdC5vcHRpb25zLnBvc2l0aW9ucy5sZW5ndGgpIHtcclxuICAvLyAgICAgICAgICAgaWYgKHRoYXQubm9kZVBvaW50c1tzZWxlY3RQb2ludC5pbmRleCAtIDFdKSB7XHJcbiAgLy8gICAgICAgICAgICAgc2VsZWN0UG9pbnQgPSB0aGF0Lm5vZGVQb2ludHNbc2VsZWN0UG9pbnQuaW5kZXggLSAxXVxyXG4gIC8vICAgICAgICAgICB9IGVsc2Uge1xyXG4gIC8vICAgICAgICAgICAgIHNlbGVjdFBvaW50LmluZGV4ID0gMFxyXG4gIC8vICAgICAgICAgICB9XHJcbiAgLy8gICAgICAgICB9XHJcbiAgLy8gICAgICAgfVxyXG4gIC8vICAgICB9KVxyXG5cclxuICAvLyAgICAgdGhhdC5lbnRpdHkucG9seWxpbmUucG9zaXRpb25zID0gbmV3IENlc2l1bS5DYWxsYmFja1Byb3BlcnR5KGZ1bmN0aW9uICgpIHtcclxuICAvLyAgICAgICByZXR1cm4gbmV3cG9zaXRpb25zXHJcbiAgLy8gICAgIH0sIGZhbHNlKVxyXG5cclxuICAvLyAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGF0Lm9wdGlvbnMucG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgLy8gICAgICAgbGV0IGVudGl0eSA9IHRoYXQuc2RrLnZpZXdlci5lbnRpdGllcy5hZGQoe1xyXG4gIC8vICAgICAgICAgbmFtZTogJ25vZGUtc2Vjb25kYXJ5LWVkaXQtcG9pbnQnLFxyXG4gIC8vICAgICAgICAgaW5kZXg6IGksXHJcbiAgLy8gICAgICAgICBwb3NpdGlvbjogQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXMoXHJcbiAgLy8gICAgICAgICAgIHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbaV0ubG5nLFxyXG4gIC8vICAgICAgICAgICB0aGF0Lm9wdGlvbnMucG9zaXRpb25zW2ldLmxhdCxcclxuICAvLyAgICAgICAgICAgdGhhdC5vcHRpb25zLnBvc2l0aW9uc1tpXS5hbHRcclxuICAvLyAgICAgICAgICksXHJcbiAgLy8gICAgICAgICBiaWxsYm9hcmQ6IHtcclxuICAvLyAgICAgICAgICAgaW1hZ2U6IHRoYXQuZ2V0U291cmNlUm9vdFBhdGgoKSArICcvaW1nL3BvaW50LnBuZycsXHJcbiAgLy8gICAgICAgICAgIHdpZHRoOiAxNSxcclxuICAvLyAgICAgICAgICAgaGVpZ2h0OiAxNSxcclxuICAvLyAgICAgICAgICAgZGlzYWJsZURlcHRoVGVzdERpc3RhbmNlOiBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFlcclxuICAvLyAgICAgICAgIH1cclxuICAvLyAgICAgICB9KVxyXG4gIC8vICAgICAgIHRoYXQubm9kZVBvaW50cy5wdXNoKGVudGl0eSlcclxuICAvLyAgICAgfVxyXG4gIC8vICAgfVxyXG4gIC8vIH1cclxuXHJcbiAgbm9kZUVkaXQoY2IpIHtcclxuICAgIHRoaXMucG9zaXRpb25FZGl0aW5nID0gZmFsc2VcclxuICAgIHRoaXMubm9zZVRvVGFpbCA9IGZhbHNlXHJcbiAgICAvLyB0aGlzLnNtb290aCA9IGZhbHNlXHJcbiAgICB0aGlzLmhlaWdodE1vZGUgPSAwXHJcbiAgICBpZiAoWUouTWVhc3VyZS5HZXRNZWFzdXJlU3RhdHVzKCkpIHtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuY2xvc2VOb2RlRWRpdCgpXHJcbiAgICAgIFlKLk1lYXN1cmUuU2V0TWVhc3VyZVN0YXR1cyh0cnVlKVxyXG4gICAgICB0aGlzLl9ub2RlRWRpdENhbGxiYWNrID0gY2JcclxuICAgICAgdGhpcy50aXAgPSBuZXcgTW91c2VUaXAoJ+ivt+mAieaLqeS4gOS4qumhtueCue+8jOWPs+mUruWPlua2iCcsIHRoaXMuc2RrKVxyXG4gICAgICB0aGlzLmV2ZW50ID0gbmV3IE1vdXNlRXZlbnQodGhpcy5zZGspXHJcbiAgICAgIHRoaXMuQ29udHJvbGxlck9iamVjdCA9IG5ldyBDb250cm9sbGVyKHRoaXMuc2RrKVxyXG5cclxuICAgICAgbGV0IHNlbGVjdFBvaW50XHJcbiAgICAgIHRoaXMuZXZlbnQubW91c2VfbGVmdCgobW92ZW1lbnQsIGNhcnRlc2lhbikgPT4ge1xyXG4gICAgICAgIHZhciBwaWNrID0gdGhpcy5zZGsudmlld2VyLnNjZW5lLnBpY2sobW92ZW1lbnQucG9zaXRpb24pXHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgcGljayAmJlxyXG4gICAgICAgICAgcGljay5pZCAmJlxyXG4gICAgICAgICAgcGljay5pZC5uYW1lICYmXHJcbiAgICAgICAgICBwaWNrLmlkLm5hbWUgPT09ICdub2RlLXNlY29uZGFyeS1lZGl0LXBvaW50J1xyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgc2VsZWN0UG9pbnQgPSBwaWNrLmlkXHJcbiAgICAgICAgICB0aGlzLkNvbnRyb2xsZXJPYmplY3QucG9zaXRpb24gPVxyXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zW3NlbGVjdFBvaW50LmluZGV4XVxyXG4gICAgICAgICAgdGhpcy5Db250cm9sbGVyT2JqZWN0LmVkaXRUcmFuc2xhdGlvbmFsKClcclxuICAgICAgICAgIHRoaXMudGlwICYmIHRoaXMudGlwLmRlc3Ryb3koKVxyXG4gICAgICAgICAgdGhpcy5Db250cm9sbGVyT2JqZWN0LmNvbnRyb2xsZXJDYWxsQmFjayA9IHBhcmFtcyA9PiB7XHJcbiAgICAgICAgICAgIGlmIChzZWxlY3RQb2ludC5pbmRleCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgIHRoaXMubGFiZWwucG9zaXRpb24gPSBbXHJcbiAgICAgICAgICAgICAgICBwYXJhbXMucG9zaXRpb24ubG5nLFxyXG4gICAgICAgICAgICAgICAgcGFyYW1zLnBvc2l0aW9uLmxhdCxcclxuICAgICAgICAgICAgICAgIHBhcmFtcy5wb3NpdGlvbi5hbHRcclxuICAgICAgICAgICAgICBdXHJcbiAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmxhYmVsLnBvc2l0aW9uID0ge1xyXG4gICAgICAgICAgICAgICAgbG5nOiBwYXJhbXMucG9zaXRpb24ubG5nLFxyXG4gICAgICAgICAgICAgICAgbGF0OiBwYXJhbXMucG9zaXRpb24ubGF0LFxyXG4gICAgICAgICAgICAgICAgYWx0OiBwYXJhbXMucG9zaXRpb24uYWx0XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbc2VsZWN0UG9pbnQuaW5kZXhdID0gcGFyYW1zLnBvc2l0aW9uXHJcbiAgICAgICAgICAgIHRoaXMuX2VsbXMubG5nICYmICh0aGlzLl9lbG1zLmxuZ1tzZWxlY3RQb2ludC5pbmRleF0uaW5uZXJIVE1MID0gcGFyYW1zLnBvc2l0aW9uLmxuZy50b0ZpeGVkKDgpKVxyXG4gICAgICAgICAgICB0aGlzLl9lbG1zLmxuZ0lucHV0ICYmICh0aGlzLl9lbG1zLmxuZ0lucHV0W3NlbGVjdFBvaW50LmluZGV4XS52YWx1ZSA9IHBhcmFtcy5wb3NpdGlvbi5sbmcudG9GaXhlZCg4KSlcclxuICAgICAgICAgICAgdGhpcy5fZWxtcy5sYXQgJiYgKHRoaXMuX2VsbXMubGF0W3NlbGVjdFBvaW50LmluZGV4XS5pbm5lckhUTUwgPSBwYXJhbXMucG9zaXRpb24ubGF0LnRvRml4ZWQoOCkpXHJcbiAgICAgICAgICAgIHRoaXMuX2VsbXMubGF0SW5wdXQgJiYgKHRoaXMuX2VsbXMubGF0SW5wdXRbc2VsZWN0UG9pbnQuaW5kZXhdLnZhbHVlID0gcGFyYW1zLnBvc2l0aW9uLmxhdC50b0ZpeGVkKDgpKVxyXG4gICAgICAgICAgICB0aGlzLl9lbG1zLmFsdCAmJiAodGhpcy5fZWxtcy5hbHRbc2VsZWN0UG9pbnQuaW5kZXhdLmlubmVySFRNTCA9IHBhcmFtcy5wb3NpdGlvbi5hbHQudG9GaXhlZCgyKSlcclxuICAgICAgICAgICAgdGhpcy5fZWxtcy5hbHRJbnB1dCAmJiAodGhpcy5fZWxtcy5hbHRJbnB1dFtzZWxlY3RQb2ludC5pbmRleF0udmFsdWUgPSBwYXJhbXMucG9zaXRpb24uYWx0LnRvRml4ZWQoMikpXHJcbiAgICAgICAgICAgIHNlbGVjdFBvaW50LnBvc2l0aW9uID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXMoXHJcbiAgICAgICAgICAgICAgcGFyYW1zLnBvc2l0aW9uLmxuZyxcclxuICAgICAgICAgICAgICBwYXJhbXMucG9zaXRpb24ubGF0LFxyXG4gICAgICAgICAgICAgIHBhcmFtcy5wb3NpdGlvbi5hbHRcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuXHJcbiAgICAgIHRoaXMuZXZlbnQubW91c2VfcmlnaHQoKG1vdmVtZW50LCBjYXJ0ZXNpYW4pID0+IHtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubm9kZVBvaW50cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgdGhpcy5zZGsudmlld2VyLmVudGl0aWVzLnJlbW92ZSh0aGlzLm5vZGVQb2ludHNbaV0pXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMubm9kZVBvaW50cyA9IFtdXHJcbiAgICAgICAgdGhpcy5ldmVudC5kZXN0cm95KClcclxuICAgICAgICB0aGlzLnRpcCAmJiB0aGlzLnRpcC5kZXN0cm95KClcclxuICAgICAgICB0aGlzLnRpcCA9IG51bGxcclxuICAgICAgICB0aGlzLkNvbnRyb2xsZXJPYmplY3QuZGVzdHJveSgpXHJcblxyXG4gICAgICAgIGxldCBmcm9tRGVncmVlc0FycmF5ID0gdGhpcy5yZW5ld1Bvc2l0aW9ucyh0aGlzLm9wdGlvbnMucG9zaXRpb25zKVxyXG4gICAgICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLnBvc2l0aW9ucyA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzQXJyYXlIZWlnaHRzKGZyb21EZWdyZWVzQXJyYXkpXHJcbiAgICAgICAgWUouTWVhc3VyZS5TZXRNZWFzdXJlU3RhdHVzKGZhbHNlKVxyXG4gICAgICAgIHRoaXMuX25vZGVFZGl0Q2FsbGJhY2sgPSBudWxsXHJcbiAgICAgIH0pXHJcblxyXG4gICAgICB0aGlzLmV2ZW50Lm1vdXNlX21vdmUoKG1vdmVtZW50LCBjYXJ0ZXNpYW4pID0+IHtcclxuICAgICAgICB0aGlzLnRpcC5zZXRQb3NpdGlvbihcclxuICAgICAgICAgIGNhcnRlc2lhbixcclxuICAgICAgICAgIG1vdmVtZW50LmVuZFBvc2l0aW9uLngsXHJcbiAgICAgICAgICBtb3ZlbWVudC5lbmRQb3NpdGlvbi55XHJcbiAgICAgICAgKVxyXG4gICAgICB9KVxyXG5cclxuICAgICAgdGhpcy5lbnRpdHkucG9seWxpbmUucG9zaXRpb25zID0gbmV3IENlc2l1bS5DYWxsYmFja1Byb3BlcnR5KCgpID0+IHtcclxuICAgICAgICBsZXQgZnJvbURlZ3JlZXNBcnJheSA9IHRoaXMucmVuZXdQb3NpdGlvbnModGhpcy5vcHRpb25zLnBvc2l0aW9ucylcclxuICAgICAgICB0aGlzLl9ub2RlRWRpdENhbGxiYWNrKHRoaXMub3B0aW9ucy5wb3NpdGlvbnMsIHRoaXMubGVuZ3RoQnlNZXRlcilcclxuICAgICAgICByZXR1cm4gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXNBcnJheUhlaWdodHMoZnJvbURlZ3JlZXNBcnJheSlcclxuICAgICAgfSwgZmFsc2UpXHJcblxyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMub3B0aW9ucy5wb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBsZXQgZW50aXR5ID0gdGhpcy5zZGsudmlld2VyLmVudGl0aWVzLmFkZCh7XHJcbiAgICAgICAgICBuYW1lOiAnbm9kZS1zZWNvbmRhcnktZWRpdC1wb2ludCcsXHJcbiAgICAgICAgICBpbmRleDogaSxcclxuICAgICAgICAgIHBvc2l0aW9uOiBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlcyhcclxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sbmcsXHJcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubGF0LFxyXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmFsdFxyXG4gICAgICAgICAgKSxcclxuICAgICAgICAgIGJpbGxib2FyZDoge1xyXG4gICAgICAgICAgICBpbWFnZTogdGhpcy5nZXRTb3VyY2VSb290UGF0aCgpICsgJy9pbWcvcG9pbnQucG5nJyxcclxuICAgICAgICAgICAgd2lkdGg6IDE1LFxyXG4gICAgICAgICAgICBoZWlnaHQ6IDE1LFxyXG4gICAgICAgICAgICBkaXNhYmxlRGVwdGhUZXN0RGlzdGFuY2U6IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSxcclxuICAgICAgICAgICAgY29sb3I6IENlc2l1bS5Db2xvci5XSElURS53aXRoQWxwaGEoMC45OSlcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgICAgIHRoaXMubm9kZVBvaW50cy5wdXNoKGVudGl0eSlcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2xvc2VOb2RlRWRpdCgpIHtcclxuICAgIFlKLk1lYXN1cmUuU2V0TWVhc3VyZVN0YXR1cyhmYWxzZSlcclxuICAgIHRoaXMuQ29udHJvbGxlck9iamVjdCAmJiB0aGlzLkNvbnRyb2xsZXJPYmplY3QuZGVzdHJveSgpXHJcbiAgICB0aGlzLmV2ZW50ICYmIHRoaXMuZXZlbnQuZGVzdHJveSgpXHJcbiAgICB0aGlzLnRpcCAmJiB0aGlzLnRpcC5kZXN0cm95KClcclxuICAgIHRoaXMudGlwID0gbnVsbFxyXG5cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5ub2RlUG9pbnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIHRoaXMuc2RrLnZpZXdlci5lbnRpdGllcy5yZW1vdmUodGhpcy5ub2RlUG9pbnRzW2ldKVxyXG4gICAgfVxyXG4gICAgdGhpcy5ub2RlUG9pbnRzID0gW11cclxuICAgIHRoaXMuX25vZGVFZGl0Q2FsbGJhY2sgPSBudWxsXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiDliKDpmaRcclxuICAgKi9cclxuICBhc3luYyByZW1vdmUoKSB7XHJcbiAgICB0aGlzLmV2ZW50ICYmIHRoaXMuZXZlbnQuZGVzdHJveSgpXHJcbiAgICB0aGlzLnRpcCAmJiB0aGlzLnRpcC5kZXN0cm95KClcclxuICAgIHRoaXMubGFiZWwgJiYgdGhpcy5sYWJlbC5yZW1vdmUoKVxyXG4gICAgdGhpcy5zZGsudmlld2VyLmVudGl0aWVzLnJlbW92ZSh0aGlzLmVudGl0eSlcclxuICAgIHRoaXMuZW50aXR5ID0gbnVsbFxyXG4gICAgaWYgKHRoaXMuX0RpYWxvZ09iamVjdCAmJiAhdGhpcy5fRGlhbG9nT2JqZWN0LmlzRGVzdHJveSkge1xyXG4gICAgICB0aGlzLl9EaWFsb2dPYmplY3QuY2xvc2UoKVxyXG4gICAgICB0aGlzLl9EaWFsb2dPYmplY3QgPSBudWxsXHJcbiAgICB9XHJcbiAgICBhd2FpdCB0aGlzLnNkay5yZW1vdmVJbmNldGFuY2UodGhpcy5vcHRpb25zLmlkKVxyXG4gICAgYXdhaXQgc3luY0RhdGEodGhpcy5zZGssIHRoaXMub3B0aW9ucy5pZClcclxuICB9XHJcblxyXG4gIC8qKkBkZXNjIOaJk+W8gOW5s+enu+WKn+iDvVxyXG4gICAqXHJcbiAgICogQG1lbWJlck9mIFNvdXJjZVxyXG4gICAqIEBwYXJhbSBzdGF0dXMge2Jvb2xlYW59XHJcbiAgICpcclxuICAgKiAqL1xyXG4gIHNldCBwb3NpdGlvbkVkaXRpbmcoc3RhdHVzKSB7XHJcbiAgICBpZiAoWUouTWVhc3VyZS5HZXRNZWFzdXJlU3RhdHVzKCkgfHwgIXRoaXMuc2RrIHx8ICF0aGlzLnNkay52aWV3ZXIgfHwgIXRoaXMuZW50aXR5KSB7XHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG4gICAgdGhpcy5vcGVyYXRlLnBvc2l0aW9uRWRpdGluZyA9IHN0YXR1c1xyXG4gICAgaWYgKHN0YXR1cyA9PT0gdHJ1ZSkge1xyXG4gICAgICB0aGlzLmNsb3NlTm9kZUVkaXQoKVxyXG4gICAgICB0aGlzLmV2ZW50ICYmIHRoaXMuZXZlbnQuZGVzdHJveSgpXHJcbiAgICAgIHRoaXMuZXZlbnQgPSBuZXcgTW91c2VFdmVudCh0aGlzLnNkaylcclxuICAgICAgdGhpcy50aXAgJiYgdGhpcy50aXAuZGVzdHJveSgpXHJcbiAgICAgIHRoaXMudGlwID0gbmV3IE1vdXNlVGlwKCfngrnlh7vpvKDmoIflt6bplK7noa7orqTvvIzlj7PplK7lj5bmtognLCB0aGlzLnNkaylcclxuICAgICAgdGhpcy5sYWJlbCAmJlxyXG4gICAgICAgICh0aGlzLmxhYmVsLmVudGl0eS5iaWxsYm9hcmQuY29sb3IgPSBDZXNpdW0uQ29sb3IuZnJvbUNzc0NvbG9yU3RyaW5nKFxyXG4gICAgICAgICAgYHJnYmEoMjU1LDI1NSwyNTUsMC45KWBcclxuICAgICAgICApKVxyXG4gICAgICB0aGlzLnBpY2tpbmcgPSBmYWxzZVxyXG4gICAgICBsZXQgcG9zaXRpb25zID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLm9wdGlvbnMucG9zaXRpb25zKSlcclxuICAgICAgLy8gbGV0IHBvc2l0aW9uczIgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHBvc2l0aW9ucykpXHJcbiAgICAgIC8vIGZvciAobGV0IGkgPSAwOyBpIDwgcG9zaXRpb25zMi5sZW5ndGg7IGkrKykge1xyXG4gICAgICAvLyAgIGxldCBoZWlnaHQgPSB0aGlzLnNkay52aWV3ZXIuc2NlbmUuZ2xvYmUuZ2V0SGVpZ2h0KENlc2l1bS5DYXJ0b2dyYXBoaWMuZnJvbURlZ3JlZXMocG9zaXRpb25zMltpXS5sbmcsIHBvc2l0aW9uczJbaV0ubGF0KSlcclxuICAgICAgLy8gICBwb3NpdGlvbnMyW2ldID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXMoXHJcbiAgICAgIC8vICAgICBwb3NpdGlvbnMyW2ldLmxuZyxcclxuICAgICAgLy8gICAgIHBvc2l0aW9uczJbaV0ubGF0LFxyXG4gICAgICAvLyAgICAgTnVtYmVyKChwb3NpdGlvbnMyW2ldLmFsdCArIE51bWJlcihoZWlnaHQpKS50b0ZpeGVkKDIpKVxyXG4gICAgICAvLyAgIClcclxuICAgICAgLy8gfVxyXG4gICAgICB0aGlzLnByZXZpb3VzID0ge1xyXG4gICAgICAgIHBvc2l0aW9uczogWy4uLnRoaXMub3B0aW9ucy5wb3NpdGlvbnNdXHJcbiAgICAgIH1cclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBwb3NpdGlvbnNbaV0gPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlcyhcclxuICAgICAgICAgIHBvc2l0aW9uc1tpXS5sbmcsXHJcbiAgICAgICAgICBwb3NpdGlvbnNbaV0ubGF0LFxyXG4gICAgICAgICAgcG9zaXRpb25zW2ldLmFsdFxyXG4gICAgICAgIClcclxuICAgICAgfVxyXG4gICAgICBsZXQgY2VudGVyID0gcG9zaXRpb25zW01hdGguZmxvb3IocG9zaXRpb25zLmxlbmd0aCAvIDIpXVxyXG4gICAgICBsZXQgZGlzcGFyaXR5ID0gW11cclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBjZW50ZXIueCAtIHBvc2l0aW9uc1tpXS54XHJcbiAgICAgICAgZGlzcGFyaXR5LnB1c2goe1xyXG4gICAgICAgICAgeDogY2VudGVyLnggLSBwb3NpdGlvbnNbaV0ueCxcclxuICAgICAgICAgIHk6IGNlbnRlci55IC0gcG9zaXRpb25zW2ldLnksXHJcbiAgICAgICAgICB6OiBjZW50ZXIueiAtIHBvc2l0aW9uc1tpXS56XHJcbiAgICAgICAgfSlcclxuICAgICAgfVxyXG4gICAgICBsZXQgbmV3cG9zaXRpb25zID0gW11cclxuICAgICAgdGhpcy5ldmVudC5tb3VzZV9tb3ZlKChtb3ZlbWVudCwgY2FydGVzaWFuKSA9PiB7XHJcbiAgICAgICAgbmV3cG9zaXRpb25zID0gW11cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRpc3Bhcml0eS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgbGV0IG5ld1AgPSB7XHJcbiAgICAgICAgICAgIHg6IGNhcnRlc2lhbi54IC0gZGlzcGFyaXR5W2ldLngsXHJcbiAgICAgICAgICAgIHk6IGNhcnRlc2lhbi55IC0gZGlzcGFyaXR5W2ldLnksXHJcbiAgICAgICAgICAgIHo6IGNhcnRlc2lhbi56IC0gZGlzcGFyaXR5W2ldLnpcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIC8vIGxldCBwb3M4NCA9IHRoaXMuY2FydGVzaWFuM1Rvd2dzODQoXHJcbiAgICAgICAgICAvLyAgIG5ld1AsXHJcbiAgICAgICAgICAvLyAgIHRoaXMuc2RrLnZpZXdlclxyXG4gICAgICAgICAgLy8gKVxyXG4gICAgICAgICAgLy8gbGV0IGhlaWdodCA9IHRoaXMuc2RrLnZpZXdlci5zY2VuZS5nbG9iZS5nZXRIZWlnaHQoQ2VzaXVtLkNhcnRvZ3JhcGhpYy5mcm9tRGVncmVlcyhwb3M4NC5sbmcsIHBvczg0LmxhdCkpXHJcbiAgICAgICAgICAvLyBwb3M4NC5hbHQgPSBOdW1iZXIoKHBvczg0LmFsdCArIE51bWJlcihoZWlnaHQpKS50b0ZpeGVkKDIpKVxyXG4gICAgICAgICAgLy8gbmV3UCA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzKFxyXG4gICAgICAgICAgLy8gICBwb3M4NC5sbmcsXHJcbiAgICAgICAgICAvLyAgIHBvczg0LmxhdCxcclxuICAgICAgICAgIC8vICAgcG9zODQuYWx0XHJcbiAgICAgICAgICAvLyApXHJcbiAgICAgICAgICBuZXdwb3NpdGlvbnMucHVzaChuZXdQKVxyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgcG9zaXRpb244NCA9IHRoaXMuY2FydGVzaWFuM1Rvd2dzODQoXHJcbiAgICAgICAgICBuZXdwb3NpdGlvbnNbMF0sXHJcbiAgICAgICAgICB0aGlzLnNkay52aWV3ZXJcclxuICAgICAgICApXHJcbiAgICAgICAgdGhpcy5sYWJlbC5wb3NpdGlvbiA9IFtwb3NpdGlvbjg0LmxuZywgcG9zaXRpb244NC5sYXQsIHBvc2l0aW9uODQuYWx0XVxyXG4gICAgICAgIHRoaXMub3B0aW9ucy5sYWJlbC5wb3NpdGlvbiA9IHtcclxuICAgICAgICAgIGxuZzogcG9zaXRpb244NC5sbmcsXHJcbiAgICAgICAgICBsYXQ6IHBvc2l0aW9uODQubGF0LFxyXG4gICAgICAgICAgYWx0OiBwb3NpdGlvbjg0LmFsdFxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnRpcC5zZXRQb3NpdGlvbihcclxuICAgICAgICAgIGNhcnRlc2lhbixcclxuICAgICAgICAgIG1vdmVtZW50LmVuZFBvc2l0aW9uLngsXHJcbiAgICAgICAgICBtb3ZlbWVudC5lbmRQb3NpdGlvbi55XHJcbiAgICAgICAgKVxyXG4gICAgICB9KVxyXG4gICAgICB0aGlzLmV2ZW50Lm1vdXNlX2xlZnQoKG1vdmVtZW50LCBjYXJ0ZXNpYW4pID0+IHtcclxuICAgICAgICB0aGlzLmV2ZW50Lm1vdXNlX21vdmUoKCkgPT4geyB9KVxyXG4gICAgICAgIHRoaXMuZXZlbnQubW91c2VfbGVmdCgoKSA9PiB7IH0pXHJcbiAgICAgICAgdGhpcy5ldmVudC5tb3VzZV9yaWdodCgoKSA9PiB7IH0pXHJcbiAgICAgICAgbmV3cG9zaXRpb25zID0gW11cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRpc3Bhcml0eS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgbmV3cG9zaXRpb25zLnB1c2goe1xyXG4gICAgICAgICAgICB4OiBjYXJ0ZXNpYW4ueCAtIGRpc3Bhcml0eVtpXS54LFxyXG4gICAgICAgICAgICB5OiBjYXJ0ZXNpYW4ueSAtIGRpc3Bhcml0eVtpXS55LFxyXG4gICAgICAgICAgICB6OiBjYXJ0ZXNpYW4ueiAtIGRpc3Bhcml0eVtpXS56XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgcG9zaXRpb25zTG5nTGF0ID0gW11cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5ld3Bvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgbGV0IHBvc2l0aW9uID0gdGhpcy5jYXJ0ZXNpYW4zVG93Z3M4NChuZXdwb3NpdGlvbnNbaV0sIHRoaXMuc2RrLnZpZXdlcilcclxuICAgICAgICAgIHBvc2l0aW9uLmFsdCA9IHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0uYWx0XHJcbiAgICAgICAgICBwb3NpdGlvbnNMbmdMYXQucHVzaChwb3NpdGlvbilcclxuXHJcbiAgICAgICAgICB0aGlzLl9lbG1zLmxuZyAmJiAodGhpcy5fZWxtcy5sbmdbaV0uaW5uZXJIVE1MID0gcG9zaXRpb24ubG5nLnRvRml4ZWQoOCkpXHJcbiAgICAgICAgICB0aGlzLl9lbG1zLmxuZ0lucHV0ICYmICh0aGlzLl9lbG1zLmxuZ0lucHV0W2ldLnZhbHVlID0gcG9zaXRpb24ubG5nLnRvRml4ZWQoOCkpXHJcbiAgICAgICAgICB0aGlzLl9lbG1zLmxhdCAmJiAodGhpcy5fZWxtcy5sYXRbaV0uaW5uZXJIVE1MID0gcG9zaXRpb24ubGF0LnRvRml4ZWQoOCkpXHJcbiAgICAgICAgICB0aGlzLl9lbG1zLmxhdElucHV0ICYmICh0aGlzLl9lbG1zLmxhdElucHV0W2ldLnZhbHVlID0gcG9zaXRpb24ubGF0LnRvRml4ZWQoOCkpXHJcbiAgICAgICAgICB0aGlzLl9lbG1zLmFsdCAmJiAodGhpcy5fZWxtcy5hbHRbaV0uaW5uZXJIVE1MID0gcG9zaXRpb24uYWx0LnRvRml4ZWQoMikpXHJcbiAgICAgICAgICB0aGlzLl9lbG1zLmFsdElucHV0ICYmICh0aGlzLl9lbG1zLmFsdElucHV0W2ldLnZhbHVlID0gcG9zaXRpb24uYWx0LnRvRml4ZWQoMikpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zID0gcG9zaXRpb25zTG5nTGF0XHJcbiAgICAgICAgdGhpcy5wcmV2aW91cy5wb3NpdGlvbnMgPSBwb3NpdGlvbnNMbmdMYXRcclxuXHJcbiAgICAgICAgLy8gdGhpcy5lbnRpdHkucG9seWxpbmUucG9zaXRpb25zTG5nTGF0ID0gcG9zaXRpb25zTG5nTGF0XHJcbiAgICAgICAgbGV0IGZyb21EZWdyZWVzQXJyYXkgPSB0aGlzLnJlbmV3UG9zaXRpb25zKHRoaXMub3B0aW9ucy5wb3NpdGlvbnMsICgpPT57XHJcbiAgICAgICAgICBpZih0aGlzLl9wb3NpdGlvbkVkaXRpbmdDYWxsYmFjaykge1xyXG4gICAgICAgICAgICB0aGlzLl9wb3NpdGlvbkVkaXRpbmdDYWxsYmFjaygpXHJcbiAgICAgICAgICAgIHRoaXMuX3Bvc2l0aW9uRWRpdGluZ0NhbGxiYWNrID0gbnVsbFxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgdGhpcy5lbnRpdHkucG9seWxpbmUucG9zaXRpb25zID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXNBcnJheUhlaWdodHMoXHJcbiAgICAgICAgICBmcm9tRGVncmVlc0FycmF5XHJcbiAgICAgICAgKVxyXG4gICAgICAgIHRoaXMucmVuZXdQb2x5Z29uKGZyb21EZWdyZWVzQXJyYXkpXHJcbiAgICAgICAgdGhpcy5wb3NpdGlvbkVkaXRpbmcgPSBmYWxzZVxyXG4gICAgICB9KVxyXG5cclxuICAgICAgdGhpcy5ldmVudC5tb3VzZV9yaWdodCgobW92ZW1lbnQsIGNhcnRlc2lhbikgPT4ge1xyXG4gICAgICAgIHRoaXMuZXZlbnQubW91c2VfbW92ZSgoKSA9PiB7IH0pXHJcbiAgICAgICAgdGhpcy5ldmVudC5tb3VzZV9sZWZ0KCgpID0+IHsgfSlcclxuICAgICAgICB0aGlzLmV2ZW50Lm1vdXNlX3JpZ2h0KCgpID0+IHsgfSlcclxuICAgICAgICB0aGlzLnBvc2l0aW9uRWRpdGluZyA9IGZhbHNlXHJcbiAgICAgIH0pXHJcbiAgICAgIHRoaXMuZXZlbnQuZ2VzdHVyZV9waW5ja19zdGFydCgobW92ZW1lbnQsIGNhcnRlc2lhbikgPT4ge1xyXG4gICAgICAgIGxldCBzdGFydFRpbWUgPSBuZXcgRGF0ZSgpXHJcbiAgICAgICAgdGhpcy5ldmVudC5nZXN0dXJlX3BpbmNrX2VuZCgoKSA9PiB7XHJcbiAgICAgICAgICBsZXQgZW5kVGltZSA9IG5ldyBEYXRlKClcclxuICAgICAgICAgIGxldCBwb3MgPSB7XHJcbiAgICAgICAgICAgIHBvc2l0aW9uOiB7XHJcbiAgICAgICAgICAgICAgeDogKG1vdmVtZW50LnBvc2l0aW9uMS54ICsgbW92ZW1lbnQucG9zaXRpb24yLngpIC8gMixcclxuICAgICAgICAgICAgICB5OiAobW92ZW1lbnQucG9zaXRpb24xLnkgKyBtb3ZlbWVudC5wb3NpdGlvbjIueSkgLyAyXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChlbmRUaW1lIC0gc3RhcnRUaW1lID49IDUwMCkge1xyXG4gICAgICAgICAgICAvLyDplb/mjInlj5bmtohcclxuICAgICAgICAgICAgdGhpcy5ldmVudC5tb3VzZV9tb3ZlKCgpID0+IHsgfSlcclxuICAgICAgICAgICAgdGhpcy5ldmVudC5tb3VzZV9sZWZ0KCgpID0+IHsgfSlcclxuICAgICAgICAgICAgdGhpcy5ldmVudC5tb3VzZV9yaWdodCgoKSA9PiB7IH0pXHJcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb25FZGl0aW5nID0gZmFsc2VcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGxlZnRFdmVudChwb3MsIGNhcnRlc2lhbilcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgICB9KVxyXG4gICAgICB0aGlzLmVudGl0eS5wb2x5bGluZS5wb3NpdGlvbnMgPSBuZXcgQ2VzaXVtLkNhbGxiYWNrUHJvcGVydHkoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGlmIChuZXdwb3NpdGlvbnMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgcmV0dXJuIG5ld3Bvc2l0aW9uc1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZXR1cm4gcG9zaXRpb25zXHJcbiAgICAgICAgfVxyXG4gICAgICB9LCBmYWxzZSlcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmICghdGhpcy5zZGsgfHwgIXRoaXMuc2RrLnZpZXdlciB8fCAhdGhpcy5sYWJlbCB8fCAhdGhpcy5sYWJlbC5lbnRpdHkpIHtcclxuICAgICAgICB0aGlzLmxhYmVsLmVudGl0eS5iaWxsYm9hcmQuY29sb3IgPSBDZXNpdW0uQ29sb3IuZnJvbUNzc0NvbG9yU3RyaW5nKFxyXG4gICAgICAgICAgYHJnYmEoMjU1LDI1NSwyNTUsMSlgXHJcbiAgICAgICAgKVxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMucGlja2luZyA9IHRydWVcclxuICAgICAgaWYgKHRoaXMuZXZlbnQpIHtcclxuICAgICAgICB0aGlzLmV2ZW50Lm1vdXNlX21vdmUoKCkgPT4geyB9KVxyXG4gICAgICAgIHRoaXMuZXZlbnQubW91c2VfbGVmdCgoKSA9PiB7IH0pXHJcbiAgICAgICAgdGhpcy5ldmVudC5tb3VzZV9yaWdodCgoKSA9PiB7IH0pXHJcbiAgICAgICAgdGhpcy5ldmVudC5kZXN0cm95KClcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnRpcCAmJiB0aGlzLnRpcC5kZXN0cm95KClcclxuICAgICAgbGV0IGZyb21EZWdyZWVzQXJyYXkgPSB0aGlzLnJlbmV3UG9zaXRpb25zKHRoaXMub3B0aW9ucy5wb3NpdGlvbnMpXHJcbiAgICAgIHRoaXMuZW50aXR5LnBvbHlsaW5lLnBvc2l0aW9ucyA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzQXJyYXlIZWlnaHRzKFxyXG4gICAgICAgIGZyb21EZWdyZWVzQXJyYXlcclxuICAgICAgKVxyXG4gICAgICB0aGlzLnJlbmV3UG9seWdvbihmcm9tRGVncmVlc0FycmF5KVxyXG5cclxuICAgICAgc3dpdGNoICh0aGlzLmhlaWdodE1vZGUpIHtcclxuICAgICAgICBjYXNlIDA6XHJcbiAgICAgICAgY2FzZSAnMCc6XHJcbiAgICAgICAgY2FzZSAxOlxyXG4gICAgICAgIGNhc2UgJzEnOlxyXG4gICAgICAgICAgdGhpcy5sYWJlbC5wb3NpdGlvbiA9IFtcclxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXS5sbmcsXHJcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0ubGF0LFxyXG4gICAgICAgICAgICBmcm9tRGVncmVlc0FycmF5WzJdXHJcbiAgICAgICAgICBdXHJcbiAgICAgICAgICB0aGlzLm9wdGlvbnMubGFiZWwucG9zaXRpb24gPSB7XHJcbiAgICAgICAgICAgIGxuZzogdGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXS5sbmcsXHJcbiAgICAgICAgICAgIGxhdDogdGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXS5sYXQsXHJcbiAgICAgICAgICAgIGFsdDogZnJvbURlZ3JlZXNBcnJheVsyXVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSAyOlxyXG4gICAgICAgIGNhc2UgJzInOlxyXG4gICAgICAgICAgdGhpcy5sYWJlbC5wb3NpdGlvbiA9IFtcclxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXS5sbmcsXHJcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0ubGF0XHJcbiAgICAgICAgICBdXHJcbiAgICAgICAgICB0aGlzLm9wdGlvbnMubGFiZWwucG9zaXRpb24gPSB7XHJcbiAgICAgICAgICAgIGxuZzogdGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXS5sbmcsXHJcbiAgICAgICAgICAgIGxhdDogdGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXS5sYXQsXHJcbiAgICAgICAgICAgIGFsdDogZnJvbURlZ3JlZXNBcnJheVsyXVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCBwb3NpdGlvbkVkaXRpbmcoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcGVyYXRlLnBvc2l0aW9uRWRpdGluZ1xyXG4gIH1cclxuXHJcbiAgb3BlblBvc2l0aW9uRWRpdGluZyhjZCkge1xyXG4gICAgdGhpcy5wb3NpdGlvbkVkaXRpbmcgPSB0cnVlXHJcbiAgICB0aGlzLl9wb3NpdGlvbkVkaXRpbmdDYWxsYmFjayA9IGNkXHJcbiAgfVxyXG5cclxuICBnZXQgbGVuZ3RoQ2hhbmdlQ2FsbEJhY2soKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fbGVuZ3RoQ2hhbmdlQ2FsbEJhY2tcclxuICB9XHJcblxyXG4gIHNldCBsZW5ndGhDaGFuZ2VDYWxsQmFjayAoY2QpIHtcclxuICAgIHRoaXMuX2xlbmd0aENoYW5nZUNhbGxCYWNrID0gY2RcclxuICB9XHJcblxyXG4gIHNldERJVihvcHRpb25zID0geyBkb21pZDogJycsIHg6IDEwLCB5OiAxMCB9KSB7XHJcbiAgICBvcHRpb25zLnggPSBvcHRpb25zLnggfHwgb3B0aW9ucy54ID09PSAwID8gb3B0aW9ucy54IDogMTBcclxuICAgIG9wdGlvbnMueSA9IG9wdGlvbnMueSB8fCBvcHRpb25zLnkgPT09IDAgPyBvcHRpb25zLnkgOiAxMFxyXG5cclxuICAgIGxldCBwb2ludHMgPSBbXVxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm9wdGlvbnMucG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIHBvaW50cy5wdXNoKFtcclxuICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxuZyxcclxuICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmxhdFxyXG4gICAgICBdKVxyXG4gICAgfVxyXG4gICAgbGV0IGxpbmUgPSB0dXJmLmxpbmVTdHJpbmcocG9pbnRzKVxyXG4gICAgbGV0IGxlbmd0aCA9IHR1cmYubGVuZ3RoKGxpbmUsIHsgdW5pdHM6ICdraWxvbWV0ZXJzJyB9KVxyXG4gICAgbGV0IHNsaWNlZCA9IHR1cmYubGluZVNsaWNlQWxvbmcobGluZSwgMCwgbGVuZ3RoIC8gMiwge1xyXG4gICAgICB1bml0czogJ2tpbG9tZXRlcnMnXHJcbiAgICB9KVxyXG5cclxuICAgIGxldCBzaXRlSW5mb0RvbSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKG9wdGlvbnMuZG9taWQpXHJcbiAgICBsZXQgc2l0ZUluZm9Qb3NpdGlvbiA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzKFxyXG4gICAgICAuLi5zbGljZWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbc2xpY2VkLmdlb21ldHJ5LmNvb3JkaW5hdGVzLmxlbmd0aCAtIDFdXHJcbiAgICApXHJcbiAgICB0aGlzLnNkay52aWV3ZXIuc2NlbmUucG9zdFJlbmRlci5hZGRFdmVudExpc3RlbmVyKHBlcmNlbnRhZ2UgPT4ge1xyXG4gICAgICAvL+i9rOaNouWIsOWxj+W5leWdkOagh1xyXG4gICAgICBpZiAoXHJcbiAgICAgICAgc2l0ZUluZm9Eb20uc3R5bGUuZGlzcGxheSA9PT0gJ2Jsb2NrJyB8fFxyXG4gICAgICAgIHNpdGVJbmZvRG9tLnN0eWxlLmRpc3BsYXkgPT09ICcnXHJcbiAgICAgICkge1xyXG4gICAgICAgIGxldCB3aW5wb3MgPSB0aGlzLnNkay52aWV3ZXIuc2NlbmUuY2FydGVzaWFuVG9DYW52YXNDb29yZGluYXRlcyhcclxuICAgICAgICAgIHNpdGVJbmZvUG9zaXRpb25cclxuICAgICAgICApXHJcbiAgICAgICAgaWYgKHdpbnBvcykge1xyXG4gICAgICAgICAgc2l0ZUluZm9Eb20uc3R5bGUubGVmdCA9ICh3aW5wb3MueCArIG9wdGlvbnMueCkudG9GaXhlZCgwKSArICdweCdcclxuICAgICAgICAgIHNpdGVJbmZvRG9tLnN0eWxlLnRvcCA9ICh3aW5wb3MueSArIG9wdGlvbnMueSkudG9GaXhlZCgwKSArICdweCdcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG59XHJcbmV4cG9ydCBkZWZhdWx0IFBvbHlsaW5lT2JqZWN0XHJcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUlBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFwQkE7QUFBQTtBQWtCQTtBQUdBO0FBQ0E7QUFDQTtBQVFBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUVBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUE2SEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFHQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFBQTtBQUFBO0FBQUE7QUFJQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQVNBO0FBc0RBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBWUE7QUFDQTtBQU1BO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUdBO0FBTUE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUdBO0FBT0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFNQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFNQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBdEhBO0FBQUE7QUFBQTtBQXlIQTtBQUNBO0FBTUE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQWx1QkE7QUFBQTtBQUFBO0FBQUE7QUFvdUJBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQUE7QUFHQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQXREQTtBQUFBO0FBQUE7QUFBQTtBQXlEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRkE7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUFBO0FBRUE7QUF5QkE7QUFBQTtBQXRCQTtBQUNBO0FBS0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBSUE7QUFBQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFJQTtBQUFBO0FBQ0E7QUFDQTtBQUtBO0FBQ0E7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBMUdBO0FBQUE7QUFBQTtBQUFBO0FBNkdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBTUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFLQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFaQTtBQUFBO0FBQUE7QUFBQTtBQWNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUxBO0FBQUE7QUFBQTtBQUFBO0FBNE5BO0FBQ0E7QUFBQTtBQXZOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQU9BO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUlBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQTE1REE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBZUE7QUFBQTtBQVpBO0FBQ0E7QUFBQTtBQUFBO0FBSUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBSEE7QUFBQTtBQUFBO0FBT0E7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFIQTtBQUFBO0FBQUE7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQXREQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQTBEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQW15REEiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/Obj/Base/PolylineObject/index.js\n"); /***/ }), @@ -2663,7 +2663,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) * /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/toConsumableArray */ \"./node_modules/@babel/runtime/helpers/toConsumableArray.js\");\n/* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ \"./node_modules/@babel/runtime/helpers/asyncToGenerator.js\");\n/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ \"./node_modules/@babel/runtime/helpers/defineProperty.js\");\n/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ \"./node_modules/@babel/runtime/helpers/classCallCheck.js\");\n/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ \"./node_modules/@babel/runtime/helpers/createClass.js\");\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ \"./node_modules/@babel/runtime/helpers/possibleConstructorReturn.js\");\n/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ \"./node_modules/@babel/runtime/helpers/getPrototypeOf.js\");\n/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ \"./node_modules/@babel/runtime/helpers/inherits.js\");\n/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @babel/runtime/regenerator */ \"./node_modules/@babel/runtime/regenerator/index.js\");\n/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8__);\n/* harmony import */ var _Element_Dialog__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../../Element/Dialog */ \"./src/Obj/Element/Dialog/index.js\");\n/* harmony import */ var _Element_Dialog_eventBinding__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../../Element/Dialog/eventBinding */ \"./src/Obj/Element/Dialog/eventBinding.js\");\n/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./_element */ \"./src/Obj/Base/TextObject/GroundText/_element.js\");\n/* harmony import */ var _index__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../../index */ \"./src/Obj/Base/index.js\");\n/* harmony import */ var _Event_index__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../../../../Event/index */ \"./src/Event/index.js\");\n/* harmony import */ var _Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../../../../Global/MultiViewportMode */ \"./src/Global/MultiViewportMode/index.js\");\n/* harmony import */ var _MouseTip__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../../../../MouseTip */ \"./src/MouseTip/index.js\");\n/* harmony import */ var _Global_SplitScreen__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../../../../Global/SplitScreen */ \"./src/Global/SplitScreen/index.js\");\n/* harmony import */ var _Global_global__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../../../../Global/global */ \"./src/Global/global.js\");\n\n\n\n\n\n\n\n\n\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default()(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nfunction _callSuper(t, o, e) { return o = _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6___default()(o), _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_5___default()(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6___default()(t).constructor) : o.apply(t, e)); }\nfunction _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }\n\n\n\n\n\n\n\n\n\nvar GroundText = /*#__PURE__*/function (_Base) {\n /**\r\n * @constructor\r\n * @param sdk\r\n * @description 贴地文字\r\n * @param options {object} 属性\r\n * @param options.id {string} 唯一标识\r\n * @param options.show=true {boolean} 显示/隐藏\r\n * @param options.text {string} 文字\r\n * @param options.angle=0 {number} 旋转角度\r\n * @param options.scale=1 {number} 缩放比例\r\n * @param options.speed=1 {number} 文字滚动速度\r\n * @param {object} options.position 位置\r\n * @param {number} options.position.lng 经度\r\n * @param {number} options.position.lat 纬度\r\n * @param {object} options.positions 坐标集[{lon,lat}]仅在未定义 position 时有效\r\n * @param options.positions[].lng {number} 经度\r\n * @param options.positions[].lat {number} 纬度\r\n * @param options.customView {object} 默认视角\r\n * @param options.customView.orientation {object} 默认视角方位\r\n * @param options.customView.orientation.heading {number} 航向角\r\n * @param options.customView.orientation.pitch {number} 俯仰角\r\n * @param options.customView.orientation.roll {number} 翻滚角\r\n * @param options.customView.relativePosition {object} 视角相对位置\r\n * @param options.customView.relativePosition.lng {number} 经度\r\n * @param options.customView.relativePosition.lat {number} 纬度\r\n * @param options.customView.relativePosition.alt {number} 高度\r\n * */\n function GroundText(sdk) {\n var _this2;\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var _Dialog = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3___default()(this, GroundText);\n _this2 = _callSuper(this, GroundText, [sdk, options]);\n _this2.options.text = options.text || '未命名对象';\n var textArray = _this2.options.text.split('\\n');\n for (var i = 0; i < textArray.length; i++) {\n if (textArray[i].length > 80) {\n textArray[i] = textArray[i].slice(0, 80 - textArray[i].length);\n }\n }\n if (textArray.length > 70) {\n textArray.splice(70 - textArray.length);\n }\n _this2.options.text = textArray.join('\\n');\n _this2.options.name = _this2.options.text;\n _this2.options.show = options.show || options.show === false ? options.show : true;\n _this2.options.angle = options.angle || 0;\n _this2.options.scale = options.scale || options.scale === 0 ? options.scale : 1;\n _this2.options.fontSize = options.fontSize || 20;\n _this2.options.duration = options.duration || options.duration === 0 ? options.duration : 50000;\n _this2.options.speed = options.speed || options.speed === 0 ? options.speed : 1;\n _this2.options.color = options.color || '#FFC107';\n _this2.options.position = options.position;\n if (!_this2.options.position && _this2.options.positions) {\n // 计算两点与x轴正方向的夹角(弧度)\n var calculateAngle = function calculateAngle(pointA, pointB) {\n var dx = pointB[0] - pointA[0];\n var dy = pointB[1] - pointA[1];\n return Math.atan2(dy, dx);\n };\n _this2.options.position = {\n lng: (_this2.options.positions[0].lng + _this2.options.positions[1].lng) / 2,\n lat: (_this2.options.positions[0].lat + _this2.options.positions[1].lat) / 2\n };\n var point1 = turf.point([_this2.options.positions[0].lng, _this2.options.positions[0].lat]);\n var point2 = turf.point([_this2.options.positions[1].lng, _this2.options.positions[1].lat]);\n var _options = {\n units: 'miles'\n };\n var distance1 = turf.rhumbDistance(point1, point2, _options);\n var angleRadians = calculateAngle([_this2.options.positions[0].lng, _this2.options.positions[0].lat], [_this2.options.positions[1].lng, _this2.options.positions[1].lat]);\n _this2.options.angle = (360 + Cesium.Math.toDegrees(angleRadians)) % 360;\n var gap = Math.abs(Math.cos(Math.PI / 180 * _this2.options.position.lat)) * 0.0001;\n var canvas = _this2.getcanvas();\n var ratio = canvas.height / canvas.width;\n var lng1 = _this2.options.position.lng - 0.0001 / ratio;\n var lat1 = _this2.options.position.lat - gap;\n var lng2 = _this2.options.position.lng + 0.0001 / ratio;\n var lat2 = _this2.options.position.lat + gap;\n var lng = (lng1 + lng2) / 2;\n var lat = (lat1 + lat2) / 2;\n var from = turf.point([lng1, lat]);\n var to = turf.point([lng2, lat]);\n var distance2 = turf.rhumbDistance(from, to, _options);\n var latRadians = Cesium.Math.toRadians(_this2.options.position.lat);\n distance2 = distance2 * (1 + Math.abs(Math.sin(angleRadians) * Math.tan(latRadians) * Math.sin(latRadians) * Math.sin(latRadians)));\n _this2.options.scale = distance1 / distance2;\n }\n _this2.entity;\n _this2._positionEditing = false;\n _this2.Dialog = _Dialog;\n _this2._EventBinding = new _Element_Dialog_eventBinding__WEBPACK_IMPORTED_MODULE_10__[\"default\"]();\n _this2._elms = {};\n _this2.previous = {\n position: _objectSpread({}, _this2.options.position)\n };\n _this2.event = new _Event_index__WEBPACK_IMPORTED_MODULE_13__[\"default\"](_this2.sdk);\n _this2.sdk.addIncetance(_this2.options.id, _this2);\n _this2.create();\n return _this2;\n }\n _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_7___default()(GroundText, _Base);\n return _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4___default()(GroundText, [{\n key: \"lng\",\n get: function get() {\n return this.options.position.lng;\n },\n set: function set(v) {\n this.options.position.lng = v;\n this._elms.lng && this._elms.lng.forEach(function (item) {\n item.value = v;\n });\n }\n }, {\n key: \"lat\",\n get: function get() {\n return this.options.position.lat;\n },\n set: function set(v) {\n this.options.position.lat = v;\n this._elms.lat && this._elms.lat.forEach(function (item) {\n item.value = v;\n });\n }\n }, {\n key: \"text\",\n get: function get() {\n return this.options.text;\n },\n set: function set(v) {\n var _this3 = this;\n this.options.text = v;\n var textArray = this.options.text.split('\\n');\n for (var i = 0; i < textArray.length; i++) {\n if (textArray[i].length > 80) {\n var _error = '行超过80个字符,请按回车(Enter)后,继续输入';\n window.ELEMENT && window.ELEMENT.Message({\n message: _error,\n type: 'warning',\n duration: 1000\n });\n textArray[i] = textArray[i].slice(0, 80 - textArray[i].length);\n }\n }\n if (textArray.length > 70) {\n textArray.splice(70 - textArray.length);\n var _error2 = '超过最大输入字符';\n window.ELEMENT && window.ELEMENT.Message({\n message: _error2,\n type: 'warning',\n duration: 1000\n });\n }\n this.options.text = textArray.join('\\n');\n if (this.entity) {\n var canvas = this.getcanvas();\n var ratio = canvas.height / canvas.width;\n this.entity.rectangle.material = new Cesium.CustomMaterialSource({\n image: canvas.toDataURL('image/png'),\n color: this.options.color,\n repeat: new Cesium.Cartesian2(1.0, 1.0),\n duration: this.options.duration / this.options.speed,\n fltr: false,\n is2D: this.sdk.viewer.scene.mode === Cesium.SceneMode.SCENE2D ? true : false\n });\n this.entity.rectangle.coordinates = new Cesium.CallbackProperty(function () {\n var _Cesium$Rectangle;\n var gap = Math.abs(Math.cos(Math.PI / 180 * _this3.options.position.lat)) * (0.0001 * _this3.options.scale);\n var fromDegreesArray = [_this3.options.position.lng - 0.0001 * _this3.options.scale / ratio, _this3.options.position.lat - gap, _this3.options.position.lng + 0.0001 * _this3.options.scale / ratio, _this3.options.position.lat + gap];\n return (_Cesium$Rectangle = Cesium.Rectangle).fromDegrees.apply(_Cesium$Rectangle, fromDegreesArray);\n }, false);\n }\n this._elms.text && this._elms.text.forEach(function (item) {\n item.value = _this3.options.text;\n });\n }\n }, {\n key: \"angle\",\n get: function get() {\n return this.options.angle;\n },\n set: function set(v) {\n this.options.angle = v;\n this._elms.angle && this._elms.angle.forEach(function (item) {\n item.value = v;\n });\n }\n }, {\n key: \"scale\",\n get: function get() {\n return this.options.scale;\n },\n set: function set(v) {\n this.options.scale = v;\n this._elms.scale && this._elms.scale.forEach(function (item) {\n item.value = v;\n });\n }\n }, {\n key: \"duration\",\n get: function get() {\n return this.options.duration;\n },\n set: function set(v) {\n this.options.duration = v;\n var canvas = this.getcanvas();\n this.entity.rectangle.material = new Cesium.CustomMaterialSource({\n image: canvas.toDataURL('image/png'),\n color: this.options.color,\n repeat: new Cesium.Cartesian2(1.0, 1.0),\n duration: this.options.duration / this.options.speed,\n fltr: false,\n is2D: this.sdk.viewer.scene.mode === Cesium.SceneMode.SCENE2D ? true : false\n });\n this._elms.duration && this._elms.duration.forEach(function (item) {\n item.value = v;\n });\n }\n }, {\n key: \"speed\",\n get: function get() {\n return this.options.speed;\n },\n set: function set(v) {\n this.options.speed = v;\n var canvas = this.getcanvas();\n this.entity.rectangle.material = new Cesium.CustomMaterialSource({\n image: canvas.toDataURL('image/png'),\n color: this.options.color,\n repeat: new Cesium.Cartesian2(1.0, 1.0),\n duration: this.options.duration / this.options.speed,\n fltr: false,\n is2D: this.sdk.viewer.scene.mode === Cesium.SceneMode.SCENE2D ? true : false\n });\n this._elms.speed && this._elms.speed.forEach(function (item) {\n item.value = v;\n });\n }\n }, {\n key: \"color\",\n get: function get() {\n return this.options.color;\n },\n set: function set(v) {\n var _this4 = this;\n this.options.color = v;\n var canvas = this.getcanvas();\n this.entity.rectangle.material = new Cesium.CustomMaterialSource({\n image: canvas.toDataURL('image/png'),\n color: this.options.color,\n repeat: new Cesium.Cartesian2(1.0, 1.0),\n duration: this.options.duration / this.options.speed,\n fltr: false,\n is2D: this.sdk.viewer.scene.mode === Cesium.SceneMode.SCENE2D ? true : false\n });\n if (this._elms.color) {\n this._elms.color.forEach(function (item, i) {\n var colorPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: v,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(c) {\n _this4.color = c;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this4.color = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n _this4._elms.color[i] = colorPicker;\n });\n }\n }\n }, {\n key: \"create\",\n value: function create() {\n var _this5 = this;\n // let gap = Math.abs(Math.cos(Math.PI/180 * this.options.position.lat)) * (0.0001*this.options.scale)\n // let fromDegreesArray = [\n // this.options.position.lng - 0.05, this.options.position.lat - 0.05,\n // this.options.position.lng + 0.05, this.options.position.lat - 0.05,\n // this.options.position.lng + 0.05, this.options.position.lat + 0.05,\n // this.options.position.lng - 0.05, this.options.position.lat + 0.05,\n // ]\n var canvas = this.getcanvas();\n var ratio = canvas.height / canvas.width;\n this.entity = this.sdk.viewer.entities.add({\n id: this.options.id,\n show: this.options.show,\n rectangle: {\n coordinates: new Cesium.CallbackProperty(function () {\n var _Cesium$Rectangle2;\n var gap = Math.abs(Math.cos(Math.PI / 180 * _this5.options.position.lat)) * (0.0001 * _this5.options.scale);\n var fromDegreesArray = [_this5.options.position.lng - 0.0001 * _this5.options.scale / ratio, _this5.options.position.lat - gap,\n // this.options.position.lng + 0.05, this.options.position.lat - 0.05,\n _this5.options.position.lng + 0.0001 * _this5.options.scale / ratio, _this5.options.position.lat + gap\n // this.options.position.lng - 0.05, this.options.position.lat + 0.05,\n ];\n return (_Cesium$Rectangle2 = Cesium.Rectangle).fromDegrees.apply(_Cesium$Rectangle2, fromDegreesArray);\n }, false),\n material: new Cesium.CustomMaterialSource({\n image: canvas.toDataURL('image/png'),\n color: this.options.color,\n repeat: new Cesium.Cartesian2(1.0, 1.0),\n duration: this.options.duration / this.options.speed,\n fltr: false,\n is2D: this.sdk.viewer.scene.mode === Cesium.SceneMode.SCENE2D ? true : false\n }),\n rotation: new Cesium.CallbackProperty(function () {\n return Cesium.Math.toRadians(_this5.options.angle);\n }, false),\n stRotation: new Cesium.CallbackProperty(function () {\n return Cesium.Math.toRadians(_this5.options.angle);\n }, false)\n }\n });\n if (this.sdk.viewer._element.className === 'cesium-viewer 2d') {\n this.entity.rectangle.height = 10;\n }\n Object(_Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_14__[\"syncData\"])(this.sdk, this.options.id);\n if (this.options.show) {\n Object(_Global_SplitScreen__WEBPACK_IMPORTED_MODULE_16__[\"setSplitDirection\"])(0, this.options.id);\n }\n }\n\n // 编辑框\n }, {\n key: \"edit\",\n value: function () {\n var _edit = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee(state) {\n var _this6 = this;\n var _this, contentElm, all_elm, colorPicker;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee$(_context) {\n while (1) switch (_context.prev = _context.next) {\n case 0:\n _this = this;\n this.originalOptions = this.deepCopyObj(this.options);\n if (this._DialogObject && this._DialogObject.close) {\n this._DialogObject.close();\n this._DialogObject = null;\n }\n if (!state) {\n _context.next = 18;\n break;\n }\n _context.next = 6;\n return new _Element_Dialog__WEBPACK_IMPORTED_MODULE_9__[\"default\"](this.sdk, this.originalOptions, {\n title: '贴地文字属性',\n left: '180px',\n top: '100px',\n confirmCallBack: function confirmCallBack(options) {\n _this6.text = _this6.text.trim();\n if (!_this6.text) {\n _this6.text = '未命名对象';\n }\n _this6.originalOptions = _this6.deepCopyObj(_this6.options);\n _this6._DialogObject.close();\n _this6.Dialog.confirmCallBack && _this6.Dialog.confirmCallBack(_this6.originalOptions);\n Object(_Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_14__[\"syncData\"])(_this6.sdk, _this6.options.id);\n Object(_Global_SplitScreen__WEBPACK_IMPORTED_MODULE_16__[\"syncSplitData\"])(_this6.sdk, _this6.options.id);\n },\n resetCallBack: function resetCallBack() {\n _this6.reset();\n _this6.Dialog.resetCallBack && _this6.Dialog.resetCallBack();\n },\n removeCallBack: function removeCallBack() {\n _this6.Dialog.removeCallBack && _this6.Dialog.removeCallBack();\n },\n closeCallBack: function closeCallBack() {\n _this6.reset();\n _this6.positionEditing = false;\n // this.entity.style = new Cesium.Cesium3DTileStyle({\n // color: \"color('rgba(255,255,255,\" + this.newData.transparency + \")')\",\n // show: true,\n // });\n _this6.Dialog.closeCallBack && _this6.Dialog.closeCallBack();\n },\n showCallBack: function showCallBack(show) {\n _this6.show = show;\n _this6.Dialog.showCallBack && _this6.Dialog.showCallBack();\n },\n translationalCallBack: function translationalCallBack() {\n _this6.positionEditing = !_this6.positionEditing;\n }\n }, true);\n case 6:\n this._DialogObject = _context.sent;\n this._DialogObject._element.body.className = this._DialogObject._element.body.className + ' ground-text';\n contentElm = document.createElement('div');\n contentElm.innerHTML = Object(_element__WEBPACK_IMPORTED_MODULE_11__[\"html\"])();\n this._DialogObject.contentAppChild(contentElm);\n all_elm = contentElm.getElementsByTagName('*');\n this._EventBinding.on(this, all_elm);\n this._elms = this._EventBinding.element;\n\n // 颜色组件\n colorPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName('color')[0],\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: this.color,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this6.color = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this6.color = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n this._elms.color = [colorPicker];\n _context.next = 19;\n break;\n case 18:\n if (this._DialogObject && this._DialogObject.remove) {\n this._DialogObject.remove();\n this._DialogObject = null;\n }\n case 19:\n case \"end\":\n return _context.stop();\n }\n }, _callee, this);\n }));\n function edit(_x) {\n return _edit.apply(this, arguments);\n }\n return edit;\n }()\n /**@desc 打开平移功能\r\n *\r\n * @memberOf Source\r\n * @param status {boolean}\r\n *\r\n * */\n }, {\n key: \"positionEditing\",\n get: function get() {\n return this._positionEditing;\n }\n\n /**\r\n * 飞到\r\n */,\n set: function set(status) {\n var _this7 = this;\n if (!this.sdk || !this.sdk.viewer || !this.entity) {\n return;\n }\n this._positionEditing = status;\n this.previous = {\n position: _objectSpread({}, this.options.position)\n };\n if (status === true) {\n this.tip && this.tip.destroy();\n this.tip = new _MouseTip__WEBPACK_IMPORTED_MODULE_15__[\"default\"]('点击鼠标左键确认,右键取消', this.sdk);\n this.event.mouse_move(function (movement, cartesian) {\n var position = _this7.cartesian3Towgs84(cartesian, _this7.sdk.viewer);\n _this7.lng = position.lng;\n _this7.lat = position.lat;\n _this7.tip.setPosition(cartesian, movement.endPosition.x, movement.endPosition.y);\n });\n this.event.mouse_left(function (movement, cartesian) {\n var position = _this7.cartesian3Towgs84(cartesian, _this7.sdk.viewer);\n _this7.lng = position.lng;\n _this7.lat = position.lat;\n _this7.event.mouse_move(function () {});\n _this7.event.mouse_left(function () {});\n _this7.event.mouse_right(function () {});\n _this7.event.gesture_pinck_start(function () {});\n _this7.event.gesture_pinck_end(function () {});\n _this7.positionEditing = false;\n });\n this.event.mouse_right(function (movement, cartesian) {\n _this7.lng = _this7.previous.position.lng;\n _this7.lat = _this7.previous.position.lat;\n _this7.positionEditing = false;\n });\n this.event.gesture_pinck_start(function (movement, cartesian) {\n var startTime = new Date();\n _this7.event.gesture_pinck_end(function () {\n var endTime = new Date();\n if (endTime - startTime >= 500) {\n // 长按取消\n _this7.lng = _this7.previous.position.lng;\n _this7.lat = _this7.previous.position.lat;\n _this7.positionEditing = false;\n } else {\n var position = _this7.cartesian3Towgs84(cartesian, _this7.sdk.viewer);\n _this7.lng = position.lng;\n _this7.lat = position.lat;\n _this7.event.mouse_move(function () {});\n _this7.event.mouse_left(function () {});\n _this7.event.mouse_right(function () {});\n _this7.event.gesture_pinck_start(function () {});\n _this7.event.gesture_pinck_end(function () {});\n _this7.positionEditing = false;\n }\n });\n });\n } else {\n if (this.event) {\n this.event.mouse_move(function () {});\n this.event.mouse_left(function () {});\n this.event.mouse_right(function () {});\n this.event.gesture_pinck_start(function () {});\n this.event.gesture_pinck_end(function () {});\n }\n this.tip && this.tip.destroy();\n }\n }\n }, {\n key: \"flyTo\",\n value: (function () {\n var _flyTo = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee2() {\n var options,\n canvas,\n ratio,\n orientation,\n lng,\n lat,\n alt,\n destination,\n position,\n gap,\n fromDegreesArray,\n height,\n positionArray,\n i,\n _Cesium$Cartesian,\n a,\n BoundingSphere,\n _args2 = arguments;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee2$(_context2) {\n while (1) switch (_context2.prev = _context2.next) {\n case 0:\n options = _args2.length > 0 && _args2[0] !== undefined ? _args2[0] : {};\n canvas = this.getcanvas();\n ratio = canvas.height / canvas.width;\n Object(_Global_global__WEBPACK_IMPORTED_MODULE_17__[\"setActiveViewer\"])(0);\n Object(_Global_global__WEBPACK_IMPORTED_MODULE_17__[\"closeRotateAround\"])(this.sdk);\n Object(_Global_global__WEBPACK_IMPORTED_MODULE_17__[\"closeViewFollow\"])(this.sdk);\n if (!(this.options.customView && this.options.customView.relativePosition && this.options.customView.orientation)) {\n _context2.next = 25;\n break;\n }\n orientation = {\n heading: Cesium.Math.toRadians(this.options.customView.orientation.heading || 0.0),\n pitch: Cesium.Math.toRadians(this.options.customView.orientation.pitch || -60.0),\n roll: Cesium.Math.toRadians(this.options.customView.orientation.roll || 0.0)\n };\n lng = this.options.customView.relativePosition.lng;\n lat = this.options.customView.relativePosition.lat;\n alt = this.options.customView.relativePosition.alt;\n destination = Cesium.Cartesian3.fromDegrees(lng, lat, alt);\n position = {\n lng: 0,\n lat: 0\n };\n if (this.options.position) {\n position = _objectSpread({}, this.options.position);\n } else if (this.options.positions) {\n position = _objectSpread({}, this.options.positions[0]);\n } else if (this.options.center) {\n position = _objectSpread({}, this.options.center);\n } else if (this.options.start) {\n position = _objectSpread({}, this.options.start);\n } else {\n if (this.options.hasOwnProperty('lng')) {\n position.lng = this.options.lng;\n }\n if (this.options.hasOwnProperty('lat')) {\n position.lat = this.options.lat;\n }\n if (this.options.hasOwnProperty('alt')) {\n position.alt = this.options.alt;\n }\n }\n // 如果没有高度值,则获取紧贴高度计算\n if (position.hasOwnProperty('alt')) {\n _context2.next = 18;\n break;\n }\n _context2.next = 17;\n return this.getClampToHeight(position);\n case 17:\n position.alt = _context2.sent;\n case 18:\n lng = this.options.customView.relativePosition.lng + position.lng;\n lat = this.options.customView.relativePosition.lat + position.lat;\n alt = this.options.customView.relativePosition.alt + position.alt;\n destination = Cesium.Cartesian3.fromDegrees(lng, lat, alt);\n this.sdk.viewer.camera.flyTo({\n destination: destination,\n orientation: orientation\n });\n _context2.next = 34;\n break;\n case 25:\n gap = Math.abs(Math.cos(Math.PI / 180 * this.options.position.lat)) * (0.0001 * this.options.scale);\n fromDegreesArray = [[this.options.position.lng - 0.0001 * this.options.scale / ratio, this.options.position.lat - gap], [this.options.position.lng + 0.0001 * this.options.scale / ratio, this.options.position.lat + gap]];\n _context2.next = 29;\n return this.getClampToHeight(this.options.position);\n case 29:\n height = _context2.sent;\n positionArray = [];\n for (i = 0; i < fromDegreesArray.length; i++) {\n a = (_Cesium$Cartesian = Cesium.Cartesian3).fromDegrees.apply(_Cesium$Cartesian, _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default()(fromDegreesArray[i]).concat([height]));\n positionArray.push(a.x, a.y, a.z);\n }\n BoundingSphere = Cesium.BoundingSphere.fromVertices(positionArray);\n this.sdk.viewer.camera.flyToBoundingSphere(BoundingSphere, {\n offset: options.orientation || {\n heading: Cesium.Math.toRadians(0.0),\n pitch: Cesium.Math.toRadians(-90.0),\n roll: Cesium.Math.toRadians(0.0)\n }\n });\n case 34:\n case \"end\":\n return _context2.stop();\n }\n }, _callee2, this);\n }));\n function flyTo() {\n return _flyTo.apply(this, arguments);\n }\n return flyTo;\n }())\n }, {\n key: \"reset\",\n value: function reset() {\n if (!this.entity) {\n return;\n }\n this.options = this.deepCopyObj(this.originalOptions);\n this.text = this.originalOptions.text;\n this.angle = this.originalOptions.angle;\n this.scale = this.originalOptions.scale;\n this.color = this.originalOptions.color;\n }\n }, {\n key: \"remove\",\n value: function () {\n var _remove = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee3() {\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee3$(_context3) {\n while (1) switch (_context3.prev = _context3.next) {\n case 0:\n this.event && this.event.destroy();\n this.tip && this.tip.destroy();\n this.sdk.viewer.entities.remove(this.entity);\n this.entity = null;\n if (this._DialogObject && !this._DialogObject.isDestroy) {\n this._DialogObject.close();\n this._DialogObject = null;\n }\n _context3.next = 7;\n return this.sdk.removeIncetance(this.options.id);\n case 7:\n _context3.next = 9;\n return Object(_Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_14__[\"syncData\"])(this.sdk, this.options.id);\n case 9:\n case \"end\":\n return _context3.stop();\n }\n }, _callee3, this);\n }));\n function remove() {\n return _remove.apply(this, arguments);\n }\n return remove;\n }()\n }, {\n key: \"getcanvas\",\n value: function getcanvas() {\n var canvas = document.createElement('canvas');\n var ctx = canvas.getContext('2d');\n var textArray = this.options.text.split('\\n');\n for (var i = 0; i < textArray.length; i++) {\n if (textArray[i].length > 80) {\n textArray[i] = textArray[i].slice(0, 80 - textArray[i].length);\n }\n }\n if (textArray.length > 70) {\n textArray.splice(70 - textArray.length);\n }\n this.options.text = textArray.join('\\n');\n var maxWidth = 0;\n for (var _i = 0; _i < textArray.length; _i++) {\n ctx.font = 200 + 'px serif';\n var width = ctx.measureText(textArray[_i]).width;\n if (maxWidth < width) {\n maxWidth = width;\n }\n }\n canvas.width = maxWidth;\n canvas.height = 220 * textArray.length;\n for (var _i2 = 0; _i2 < textArray.length; _i2++) {\n ctx.font = 200 + 'px serif';\n ctx.fillStyle = 'rgba(255, 255, 255, 0)';\n ctx.fillRect(0, 0, maxWidth + 30, 210);\n ctx.fillStyle = 'rgba(255, 255, 255, 1)';\n ctx.font = '200px serif';\n ctx.fillText(textArray[_i2], 0, 210 * (_i2 + 1));\n }\n return canvas;\n }\n }]);\n}(_index__WEBPACK_IMPORTED_MODULE_12__[\"default\"]);\n/* harmony default export */ __webpack_exports__[\"default\"] = (GroundText);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvT2JqL0Jhc2UvVGV4dE9iamVjdC9Hcm91bmRUZXh0L2luZGV4LmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL09iai9CYXNlL1RleHRPYmplY3QvR3JvdW5kVGV4dC9pbmRleC5qcz8xY2E2Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBEaWFsb2cgZnJvbSAnLi4vLi4vLi4vRWxlbWVudC9EaWFsb2cnXHJcbmltcG9ydCBFdmVudEJpbmRpbmcgZnJvbSAnLi4vLi4vLi4vRWxlbWVudC9EaWFsb2cvZXZlbnRCaW5kaW5nJ1xyXG5pbXBvcnQgeyBodG1sIH0gZnJvbSAnLi9fZWxlbWVudCdcclxuaW1wb3J0IEJhc2UgZnJvbSAnLi4vLi4vaW5kZXgnXHJcbmltcG9ydCBNb3VzZUV2ZW50IGZyb20gJy4uLy4uLy4uLy4uL0V2ZW50L2luZGV4J1xyXG5pbXBvcnQgeyBzeW5jRGF0YSB9IGZyb20gJy4uLy4uLy4uLy4uL0dsb2JhbC9NdWx0aVZpZXdwb3J0TW9kZSdcclxuaW1wb3J0IE1vdXNlVGlwIGZyb20gJy4uLy4uLy4uLy4uL01vdXNlVGlwJ1xyXG5pbXBvcnQgeyBzZXRTcGxpdERpcmVjdGlvbiwgc3luY1NwbGl0RGF0YSwgc2V0QWN0aXZlSWQgfSBmcm9tICcuLi8uLi8uLi8uLi9HbG9iYWwvU3BsaXRTY3JlZW4nXHJcbmltcG9ydCB7IHNldEFjdGl2ZVZpZXdlciwgY2xvc2VSb3RhdGVBcm91bmQsIGNsb3NlVmlld0ZvbGxvdyB9IGZyb20gJy4uLy4uLy4uLy4uL0dsb2JhbC9nbG9iYWwnXHJcblxyXG5jbGFzcyBHcm91bmRUZXh0IGV4dGVuZHMgQmFzZSB7XHJcbiAgLyoqXHJcbiAgICogQGNvbnN0cnVjdG9yXHJcbiAgICogQHBhcmFtIHNka1xyXG4gICAqIEBkZXNjcmlwdGlvbiDotLTlnLDmloflrZdcclxuICAgKiBAcGFyYW0gb3B0aW9ucyB7b2JqZWN0fSDlsZ7mgKdcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5pZCB7c3RyaW5nfSDllK/kuIDmoIfor4ZcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5zaG93PXRydWUge2Jvb2xlYW59IOaYvuekui/pmpDol49cclxuICAgKiBAcGFyYW0gb3B0aW9ucy50ZXh0IHtzdHJpbmd9IOaWh+Wtl1xyXG4gICAqIEBwYXJhbSBvcHRpb25zLmFuZ2xlPTAge251bWJlcn0g5peL6L2s6KeS5bqmXHJcbiAgICogQHBhcmFtIG9wdGlvbnMuc2NhbGU9MSB7bnVtYmVyfSDnvKnmlL7mr5TkvotcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5zcGVlZD0xIHtudW1iZXJ9IOaWh+Wtl+a7muWKqOmAn+W6plxyXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zLnBvc2l0aW9uIOS9jee9rlxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvcHRpb25zLnBvc2l0aW9uLmxuZyDnu4/luqZcclxuICAgKiBAcGFyYW0ge251bWJlcn0gb3B0aW9ucy5wb3NpdGlvbi5sYXQg57qs5bqmXHJcbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMucG9zaXRpb25zIOWdkOagh+mbhlt7bG9uLGxhdH1d5LuF5Zyo5pyq5a6a5LmJIHBvc2l0aW9uIOaXtuacieaViFxyXG4gICAqIEBwYXJhbSBvcHRpb25zLnBvc2l0aW9uc1tdLmxuZyB7bnVtYmVyfSDnu4/luqZcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5wb3NpdGlvbnNbXS5sYXQge251bWJlcn0g57qs5bqmXHJcbiAgICogQHBhcmFtIG9wdGlvbnMuY3VzdG9tVmlldyB7b2JqZWN0fSDpu5jorqTop4bop5JcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5jdXN0b21WaWV3Lm9yaWVudGF0aW9uIHtvYmplY3R9IOm7mOiupOinhuinkuaWueS9jVxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmN1c3RvbVZpZXcub3JpZW50YXRpb24uaGVhZGluZyB7bnVtYmVyfSDoiKrlkJHop5JcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5jdXN0b21WaWV3Lm9yaWVudGF0aW9uLnBpdGNoIHtudW1iZXJ9IOS/r+S7sOinklxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmN1c3RvbVZpZXcub3JpZW50YXRpb24ucm9sbCB7bnVtYmVyfSDnv7vmu5rop5JcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5jdXN0b21WaWV3LnJlbGF0aXZlUG9zaXRpb24ge29iamVjdH0g6KeG6KeS55u45a+55L2N572uXHJcbiAgICogQHBhcmFtIG9wdGlvbnMuY3VzdG9tVmlldy5yZWxhdGl2ZVBvc2l0aW9uLmxuZyB7bnVtYmVyfSDnu4/luqZcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5jdXN0b21WaWV3LnJlbGF0aXZlUG9zaXRpb24ubGF0IHtudW1iZXJ9IOe6rOW6plxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmN1c3RvbVZpZXcucmVsYXRpdmVQb3NpdGlvbi5hbHQge251bWJlcn0g6auY5bqmXHJcbiAgICogKi9cclxuICBjb25zdHJ1Y3RvcihzZGssIG9wdGlvbnMgPSB7fSwgX0RpYWxvZyA9IHt9KSB7XHJcbiAgICBzdXBlcihzZGssIG9wdGlvbnMpXHJcbiAgICB0aGlzLm9wdGlvbnMudGV4dCA9IG9wdGlvbnMudGV4dCB8fCAn5pyq5ZG95ZCN5a+56LGhJ1xyXG4gICAgbGV0IHRleHRBcnJheSA9IHRoaXMub3B0aW9ucy50ZXh0LnNwbGl0KCdcXG4nKVxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZXh0QXJyYXkubGVuZ3RoOyBpKyspIHtcclxuICAgICAgaWYgKHRleHRBcnJheVtpXS5sZW5ndGggPiA4MCkge1xyXG4gICAgICAgIHRleHRBcnJheVtpXSA9IHRleHRBcnJheVtpXS5zbGljZSgwLCA4MCAtIHRleHRBcnJheVtpXS5sZW5ndGgpXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICh0ZXh0QXJyYXkubGVuZ3RoID4gNzApIHtcclxuICAgICAgdGV4dEFycmF5LnNwbGljZSg3MCAtIHRleHRBcnJheS5sZW5ndGgpXHJcbiAgICB9XHJcbiAgICB0aGlzLm9wdGlvbnMudGV4dCA9IHRleHRBcnJheS5qb2luKCdcXG4nKVxyXG4gICAgdGhpcy5vcHRpb25zLm5hbWUgPSB0aGlzLm9wdGlvbnMudGV4dFxyXG4gICAgdGhpcy5vcHRpb25zLnNob3cgPVxyXG4gICAgICBvcHRpb25zLnNob3cgfHwgb3B0aW9ucy5zaG93ID09PSBmYWxzZSA/IG9wdGlvbnMuc2hvdyA6IHRydWVcclxuICAgIHRoaXMub3B0aW9ucy5hbmdsZSA9IG9wdGlvbnMuYW5nbGUgfHwgMFxyXG4gICAgdGhpcy5vcHRpb25zLnNjYWxlID1cclxuICAgICAgb3B0aW9ucy5zY2FsZSB8fCBvcHRpb25zLnNjYWxlID09PSAwID8gb3B0aW9ucy5zY2FsZSA6IDFcclxuICAgIHRoaXMub3B0aW9ucy5mb250U2l6ZSA9IG9wdGlvbnMuZm9udFNpemUgfHwgMjBcclxuICAgIHRoaXMub3B0aW9ucy5kdXJhdGlvbiA9XHJcbiAgICAgIG9wdGlvbnMuZHVyYXRpb24gfHwgb3B0aW9ucy5kdXJhdGlvbiA9PT0gMCA/IG9wdGlvbnMuZHVyYXRpb24gOiA1MDAwMFxyXG4gICAgdGhpcy5vcHRpb25zLnNwZWVkID1cclxuICAgICAgb3B0aW9ucy5zcGVlZCB8fCBvcHRpb25zLnNwZWVkID09PSAwID8gb3B0aW9ucy5zcGVlZCA6IDFcclxuICAgIHRoaXMub3B0aW9ucy5jb2xvciA9IG9wdGlvbnMuY29sb3IgfHwgJyNGRkMxMDcnXHJcbiAgICB0aGlzLm9wdGlvbnMucG9zaXRpb24gPSBvcHRpb25zLnBvc2l0aW9uXHJcblxyXG4gICAgaWYgKCF0aGlzLm9wdGlvbnMucG9zaXRpb24gJiYgdGhpcy5vcHRpb25zLnBvc2l0aW9ucykge1xyXG4gICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb24gPSB7IGxuZzogKHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0ubG5nICsgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1sxXS5sbmcpIC8gMiwgbGF0OiAodGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXS5sYXQgKyB0aGlzLm9wdGlvbnMucG9zaXRpb25zWzFdLmxhdCkgLyAyIH1cclxuICAgICAgbGV0IHBvaW50MSA9IHR1cmYucG9pbnQoW3RoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0ubG5nLCB0aGlzLm9wdGlvbnMucG9zaXRpb25zWzBdLmxhdF0pO1xyXG4gICAgICBsZXQgcG9pbnQyID0gdHVyZi5wb2ludChbdGhpcy5vcHRpb25zLnBvc2l0aW9uc1sxXS5sbmcsIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMV0ubGF0XSk7XHJcblxyXG4gICAgICBsZXQgb3B0aW9ucyA9IHsgdW5pdHM6ICdtaWxlcycgfTtcclxuICAgICAgbGV0IGRpc3RhbmNlMSA9IHR1cmYucmh1bWJEaXN0YW5jZShwb2ludDEsIHBvaW50Miwgb3B0aW9ucyk7XHJcbiAgICAgIFxyXG5cclxuICAgICAgLy8g6K6h566X5Lik54K55LiOeOi9tOato+aWueWQkeeahOWkueinku+8iOW8p+W6pu+8iVxyXG4gICAgICBmdW5jdGlvbiBjYWxjdWxhdGVBbmdsZShwb2ludEEsIHBvaW50Qikge1xyXG4gICAgICAgIGxldCBkeCA9IHBvaW50QlswXSAtIHBvaW50QVswXTtcclxuICAgICAgICBsZXQgZHkgPSBwb2ludEJbMV0gLSBwb2ludEFbMV07XHJcbiAgICAgICAgcmV0dXJuIE1hdGguYXRhbjIoZHksIGR4KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IGFuZ2xlUmFkaWFucyA9IGNhbGN1bGF0ZUFuZ2xlKFt0aGlzLm9wdGlvbnMucG9zaXRpb25zWzBdLmxuZywgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXS5sYXRdLCBbdGhpcy5vcHRpb25zLnBvc2l0aW9uc1sxXS5sbmcsIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMV0ubGF0XSk7XHJcbiAgICAgIHRoaXMub3B0aW9ucy5hbmdsZSA9ICgzNjArQ2VzaXVtLk1hdGgudG9EZWdyZWVzKGFuZ2xlUmFkaWFucykpJTM2MFxyXG5cclxuICAgICAgbGV0IGdhcCA9XHJcbiAgICAgICAgTWF0aC5hYnMoTWF0aC5jb3MoKE1hdGguUEkgLyAxODApICogdGhpcy5vcHRpb25zLnBvc2l0aW9uLmxhdCkpICpcclxuICAgICAgICAwLjAwMDFcclxuICAgICAgbGV0IGNhbnZhcyA9IHRoaXMuZ2V0Y2FudmFzKClcclxuICAgICAgbGV0IHJhdGlvID0gY2FudmFzLmhlaWdodCAvIGNhbnZhcy53aWR0aFxyXG4gICAgICBsZXQgbG5nMSA9IHRoaXMub3B0aW9ucy5wb3NpdGlvbi5sbmcgLSAwLjAwMDEgLyByYXRpb1xyXG4gICAgICBsZXQgbGF0MSA9IHRoaXMub3B0aW9ucy5wb3NpdGlvbi5sYXQgLSBnYXBcclxuICAgICAgbGV0IGxuZzIgPSB0aGlzLm9wdGlvbnMucG9zaXRpb24ubG5nICsgMC4wMDAxIC8gcmF0aW9cclxuICAgICAgbGV0IGxhdDIgPSB0aGlzLm9wdGlvbnMucG9zaXRpb24ubGF0ICsgZ2FwXHJcbiAgICAgIGxldCBsbmcgPSAobG5nMSArIGxuZzIpIC8gMlxyXG4gICAgICBsZXQgbGF0ID0gKGxhdDEgKyBsYXQyKSAvIDJcclxuXHJcbiAgICAgIGxldCBmcm9tID0gdHVyZi5wb2ludChbbG5nMSwgbGF0XSk7XHJcbiAgICAgIGxldCB0byA9IHR1cmYucG9pbnQoW2xuZzIsIGxhdF0pO1xyXG4gICAgICBsZXQgZGlzdGFuY2UyID0gdHVyZi5yaHVtYkRpc3RhbmNlKGZyb20sIHRvLCBvcHRpb25zKTtcclxuICAgICAgbGV0IGxhdFJhZGlhbnMgPSBDZXNpdW0uTWF0aC50b1JhZGlhbnModGhpcy5vcHRpb25zLnBvc2l0aW9uLmxhdClcclxuICAgICAgZGlzdGFuY2UyID0gZGlzdGFuY2UyICogKDErKE1hdGguYWJzKE1hdGguc2luKGFuZ2xlUmFkaWFucykqTWF0aC50YW4obGF0UmFkaWFucykqTWF0aC5zaW4obGF0UmFkaWFucykqTWF0aC5zaW4obGF0UmFkaWFucykpKSlcclxuICAgICAgdGhpcy5vcHRpb25zLnNjYWxlID0gZGlzdGFuY2UxIC8gZGlzdGFuY2UyXHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5lbnRpdHlcclxuICAgIHRoaXMuX3Bvc2l0aW9uRWRpdGluZyA9IGZhbHNlXHJcbiAgICB0aGlzLkRpYWxvZyA9IF9EaWFsb2dcclxuICAgIHRoaXMuX0V2ZW50QmluZGluZyA9IG5ldyBFdmVudEJpbmRpbmcoKVxyXG4gICAgdGhpcy5fZWxtcyA9IHt9XHJcbiAgICB0aGlzLnByZXZpb3VzID0ge1xyXG4gICAgICBwb3NpdGlvbjogeyAuLi50aGlzLm9wdGlvbnMucG9zaXRpb24gfVxyXG4gICAgfVxyXG4gICAgdGhpcy5ldmVudCA9IG5ldyBNb3VzZUV2ZW50KHRoaXMuc2RrKVxyXG4gICAgdGhpcy5zZGsuYWRkSW5jZXRhbmNlKHRoaXMub3B0aW9ucy5pZCwgdGhpcylcclxuICAgIHRoaXMuY3JlYXRlKClcclxuICB9XHJcblxyXG4gIGdldCBsbmcoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLnBvc2l0aW9uLmxuZ1xyXG4gIH1cclxuXHJcbiAgc2V0IGxuZyh2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMucG9zaXRpb24ubG5nID0gdlxyXG4gICAgdGhpcy5fZWxtcy5sbmcgJiYgdGhpcy5fZWxtcy5sbmcuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICBpdGVtLnZhbHVlID0gdlxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGdldCBsYXQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLnBvc2l0aW9uLmxhdFxyXG4gIH1cclxuXHJcbiAgc2V0IGxhdCh2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMucG9zaXRpb24ubGF0ID0gdlxyXG4gICAgdGhpcy5fZWxtcy5sYXQgJiYgdGhpcy5fZWxtcy5sYXQuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICBpdGVtLnZhbHVlID0gdlxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGdldCB0ZXh0KCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy50ZXh0XHJcbiAgfVxyXG5cclxuICBzZXQgdGV4dCh2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMudGV4dCA9IHZcclxuICAgIGxldCB0ZXh0QXJyYXkgPSB0aGlzLm9wdGlvbnMudGV4dC5zcGxpdCgnXFxuJylcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGV4dEFycmF5Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGlmICh0ZXh0QXJyYXlbaV0ubGVuZ3RoID4gODApIHtcclxuICAgICAgICBsZXQgX2Vycm9yID0gJ+ihjOi2hei/hzgw5Liq5a2X56ymLOivt+aMieWbnui9pu+8iEVudGVy77yJ5ZCO77yM57un57ut6L6T5YWlJ1xyXG4gICAgICAgIHdpbmRvdy5FTEVNRU5UICYmIHdpbmRvdy5FTEVNRU5ULk1lc3NhZ2Uoe1xyXG4gICAgICAgICAgbWVzc2FnZTogX2Vycm9yLFxyXG4gICAgICAgICAgdHlwZTogJ3dhcm5pbmcnLFxyXG4gICAgICAgICAgZHVyYXRpb246IDEwMDBcclxuICAgICAgICB9KTtcclxuICAgICAgICB0ZXh0QXJyYXlbaV0gPSB0ZXh0QXJyYXlbaV0uc2xpY2UoMCwgODAgLSB0ZXh0QXJyYXlbaV0ubGVuZ3RoKVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAodGV4dEFycmF5Lmxlbmd0aCA+IDcwKSB7XHJcbiAgICAgIHRleHRBcnJheS5zcGxpY2UoNzAgLSB0ZXh0QXJyYXkubGVuZ3RoKVxyXG4gICAgICBsZXQgX2Vycm9yID0gJ+i2hei/h+acgOWkp+i+k+WFpeWtl+espidcclxuICAgICAgd2luZG93LkVMRU1FTlQgJiYgd2luZG93LkVMRU1FTlQuTWVzc2FnZSh7XHJcbiAgICAgICAgbWVzc2FnZTogX2Vycm9yLFxyXG4gICAgICAgIHR5cGU6ICd3YXJuaW5nJyxcclxuICAgICAgICBkdXJhdGlvbjogMTAwMFxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHRoaXMub3B0aW9ucy50ZXh0ID0gdGV4dEFycmF5LmpvaW4oJ1xcbicpXHJcbiAgICBpZiAodGhpcy5lbnRpdHkpIHtcclxuICAgICAgbGV0IGNhbnZhcyA9IHRoaXMuZ2V0Y2FudmFzKClcclxuICAgICAgbGV0IHJhdGlvID0gY2FudmFzLmhlaWdodCAvIGNhbnZhcy53aWR0aFxyXG4gICAgICB0aGlzLmVudGl0eS5yZWN0YW5nbGUubWF0ZXJpYWwgPSBuZXcgQ2VzaXVtLkN1c3RvbU1hdGVyaWFsU291cmNlKHtcclxuICAgICAgICBpbWFnZTogY2FudmFzLnRvRGF0YVVSTCgnaW1hZ2UvcG5nJyksXHJcbiAgICAgICAgY29sb3I6IHRoaXMub3B0aW9ucy5jb2xvcixcclxuICAgICAgICByZXBlYXQ6IG5ldyBDZXNpdW0uQ2FydGVzaWFuMigxLjAsIDEuMCksXHJcbiAgICAgICAgZHVyYXRpb246IHRoaXMub3B0aW9ucy5kdXJhdGlvbiAvIHRoaXMub3B0aW9ucy5zcGVlZCxcclxuICAgICAgICBmbHRyOiBmYWxzZSxcclxuICAgICAgICBpczJEOiB0aGlzLnNkay52aWV3ZXIuc2NlbmUubW9kZSA9PT0gQ2VzaXVtLlNjZW5lTW9kZS5TQ0VORTJEID8gdHJ1ZSA6IGZhbHNlXHJcbiAgICAgIH0pXHJcbiAgICAgIHRoaXMuZW50aXR5LnJlY3RhbmdsZS5jb29yZGluYXRlcyA9IG5ldyBDZXNpdW0uQ2FsbGJhY2tQcm9wZXJ0eSgoKSA9PiB7XHJcbiAgICAgICAgbGV0IGdhcCA9XHJcbiAgICAgICAgICBNYXRoLmFicyhNYXRoLmNvcygoTWF0aC5QSSAvIDE4MCkgKiB0aGlzLm9wdGlvbnMucG9zaXRpb24ubGF0KSkgKlxyXG4gICAgICAgICAgKDAuMDAwMSAqIHRoaXMub3B0aW9ucy5zY2FsZSlcclxuICAgICAgICBsZXQgZnJvbURlZ3JlZXNBcnJheSA9IFtcclxuICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbi5sbmcgLSAoMC4wMDAxICogdGhpcy5vcHRpb25zLnNjYWxlKSAvIHJhdGlvLFxyXG4gICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uLmxhdCAtIGdhcCxcclxuICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbi5sbmcgKyAoMC4wMDAxICogdGhpcy5vcHRpb25zLnNjYWxlKSAvIHJhdGlvLFxyXG4gICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uLmxhdCArIGdhcFxyXG4gICAgICAgIF1cclxuICAgICAgICByZXR1cm4gQ2VzaXVtLlJlY3RhbmdsZS5mcm9tRGVncmVlcyguLi5mcm9tRGVncmVlc0FycmF5KVxyXG4gICAgICB9LCBmYWxzZSlcclxuICAgIH1cclxuICAgIHRoaXMuX2VsbXMudGV4dCAmJlxyXG4gICAgICB0aGlzLl9lbG1zLnRleHQuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICBpdGVtLnZhbHVlID0gdGhpcy5vcHRpb25zLnRleHRcclxuICAgICAgfSlcclxuICB9XHJcblxyXG4gIGdldCBhbmdsZSgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuYW5nbGVcclxuICB9XHJcblxyXG4gIHNldCBhbmdsZSh2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMuYW5nbGUgPSB2XHJcbiAgICB0aGlzLl9lbG1zLmFuZ2xlICYmXHJcbiAgICAgIHRoaXMuX2VsbXMuYW5nbGUuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICBpdGVtLnZhbHVlID0gdlxyXG4gICAgICB9KVxyXG4gIH1cclxuXHJcbiAgZ2V0IHNjYWxlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5zY2FsZVxyXG4gIH1cclxuXHJcbiAgc2V0IHNjYWxlKHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5zY2FsZSA9IHZcclxuICAgIHRoaXMuX2VsbXMuc2NhbGUgJiZcclxuICAgICAgdGhpcy5fZWxtcy5zY2FsZS5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgIGl0ZW0udmFsdWUgPSB2XHJcbiAgICAgIH0pXHJcbiAgfVxyXG5cclxuICBnZXQgZHVyYXRpb24oKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmR1cmF0aW9uXHJcbiAgfVxyXG5cclxuICBzZXQgZHVyYXRpb24odikge1xyXG4gICAgdGhpcy5vcHRpb25zLmR1cmF0aW9uID0gdlxyXG4gICAgbGV0IGNhbnZhcyA9IHRoaXMuZ2V0Y2FudmFzKClcclxuICAgIHRoaXMuZW50aXR5LnJlY3RhbmdsZS5tYXRlcmlhbCA9IG5ldyBDZXNpdW0uQ3VzdG9tTWF0ZXJpYWxTb3VyY2Uoe1xyXG4gICAgICBpbWFnZTogY2FudmFzLnRvRGF0YVVSTCgnaW1hZ2UvcG5nJyksXHJcbiAgICAgIGNvbG9yOiB0aGlzLm9wdGlvbnMuY29sb3IsXHJcbiAgICAgIHJlcGVhdDogbmV3IENlc2l1bS5DYXJ0ZXNpYW4yKDEuMCwgMS4wKSxcclxuICAgICAgZHVyYXRpb246IHRoaXMub3B0aW9ucy5kdXJhdGlvbiAvIHRoaXMub3B0aW9ucy5zcGVlZCxcclxuICAgICAgZmx0cjogZmFsc2UsXHJcbiAgICAgIGlzMkQ6IHRoaXMuc2RrLnZpZXdlci5zY2VuZS5tb2RlID09PSBDZXNpdW0uU2NlbmVNb2RlLlNDRU5FMkQgPyB0cnVlIDogZmFsc2VcclxuICAgIH0pXHJcbiAgICB0aGlzLl9lbG1zLmR1cmF0aW9uICYmXHJcbiAgICAgIHRoaXMuX2VsbXMuZHVyYXRpb24uZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICBpdGVtLnZhbHVlID0gdlxyXG4gICAgICB9KVxyXG4gIH1cclxuICBnZXQgc3BlZWQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLnNwZWVkXHJcbiAgfVxyXG5cclxuICBzZXQgc3BlZWQodikge1xyXG4gICAgdGhpcy5vcHRpb25zLnNwZWVkID0gdlxyXG4gICAgbGV0IGNhbnZhcyA9IHRoaXMuZ2V0Y2FudmFzKClcclxuICAgIHRoaXMuZW50aXR5LnJlY3RhbmdsZS5tYXRlcmlhbCA9IG5ldyBDZXNpdW0uQ3VzdG9tTWF0ZXJpYWxTb3VyY2Uoe1xyXG4gICAgICBpbWFnZTogY2FudmFzLnRvRGF0YVVSTCgnaW1hZ2UvcG5nJyksXHJcbiAgICAgIGNvbG9yOiB0aGlzLm9wdGlvbnMuY29sb3IsXHJcbiAgICAgIHJlcGVhdDogbmV3IENlc2l1bS5DYXJ0ZXNpYW4yKDEuMCwgMS4wKSxcclxuICAgICAgZHVyYXRpb246IHRoaXMub3B0aW9ucy5kdXJhdGlvbiAvIHRoaXMub3B0aW9ucy5zcGVlZCxcclxuICAgICAgZmx0cjogZmFsc2UsXHJcbiAgICAgIGlzMkQ6IHRoaXMuc2RrLnZpZXdlci5zY2VuZS5tb2RlID09PSBDZXNpdW0uU2NlbmVNb2RlLlNDRU5FMkQgPyB0cnVlIDogZmFsc2VcclxuICAgIH0pXHJcbiAgICB0aGlzLl9lbG1zLnNwZWVkICYmXHJcbiAgICAgIHRoaXMuX2VsbXMuc3BlZWQuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICBpdGVtLnZhbHVlID0gdlxyXG4gICAgICB9KVxyXG4gIH1cclxuXHJcbiAgZ2V0IGNvbG9yKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5jb2xvclxyXG4gIH1cclxuICBzZXQgY29sb3Iodikge1xyXG4gICAgdGhpcy5vcHRpb25zLmNvbG9yID0gdlxyXG4gICAgbGV0IGNhbnZhcyA9IHRoaXMuZ2V0Y2FudmFzKClcclxuICAgIHRoaXMuZW50aXR5LnJlY3RhbmdsZS5tYXRlcmlhbCA9IG5ldyBDZXNpdW0uQ3VzdG9tTWF0ZXJpYWxTb3VyY2Uoe1xyXG4gICAgICBpbWFnZTogY2FudmFzLnRvRGF0YVVSTCgnaW1hZ2UvcG5nJyksXHJcbiAgICAgIGNvbG9yOiB0aGlzLm9wdGlvbnMuY29sb3IsXHJcbiAgICAgIHJlcGVhdDogbmV3IENlc2l1bS5DYXJ0ZXNpYW4yKDEuMCwgMS4wKSxcclxuICAgICAgZHVyYXRpb246IHRoaXMub3B0aW9ucy5kdXJhdGlvbiAvIHRoaXMub3B0aW9ucy5zcGVlZCxcclxuICAgICAgZmx0cjogZmFsc2UsXHJcbiAgICAgIGlzMkQ6IHRoaXMuc2RrLnZpZXdlci5zY2VuZS5tb2RlID09PSBDZXNpdW0uU2NlbmVNb2RlLlNDRU5FMkQgPyB0cnVlIDogZmFsc2VcclxuICAgIH0pXHJcbiAgICBpZiAodGhpcy5fZWxtcy5jb2xvcikge1xyXG4gICAgICB0aGlzLl9lbG1zLmNvbG9yLmZvckVhY2goKGl0ZW0sIGkpID0+IHtcclxuICAgICAgICBsZXQgY29sb3JQaWNrZXIgPSBuZXcgWUpDb2xvclBpY2tlcih7XHJcbiAgICAgICAgICBlbDogaXRlbS5lbCxcclxuICAgICAgICAgIHNpemU6ICdtaW5pJywgLy/popzoibJib3jnsbvlnotcclxuICAgICAgICAgIGFscGhhOiB0cnVlLCAvL+aYr+WQpuW8gOWQr+mAj+aYjuW6plxyXG4gICAgICAgICAgZGVmYXVsdENvbG9yOiB2LFxyXG4gICAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLCAvL+aYr+WQpuemgeatouaJk+W8gOminOiJsumAieaLqeWZqFxyXG4gICAgICAgICAgb3BlblBpY2tlckFuaTogJ29wYWNpdHknLCAvL+aJk+W8gOminOiJsumAieaLqeWZqOWKqOeUu1xyXG4gICAgICAgICAgc3VyZTogYyA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuY29sb3IgPSBjXHJcbiAgICAgICAgICB9LCAvL+eCueWHu+ehruiupOaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICAgICAgY2xlYXI6ICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5jb2xvciA9ICdyZ2JhKDI1NSwyNTUsMjU1LDEpJ1xyXG4gICAgICAgICAgfSAvL+eCueWHu+a4heepuuaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgdGhpcy5fZWxtcy5jb2xvcltpXSA9IGNvbG9yUGlja2VyXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjcmVhdGUoKSB7XHJcbiAgICAvLyBsZXQgZ2FwID0gTWF0aC5hYnMoTWF0aC5jb3MoTWF0aC5QSS8xODAgKiB0aGlzLm9wdGlvbnMucG9zaXRpb24ubGF0KSkgKiAoMC4wMDAxKnRoaXMub3B0aW9ucy5zY2FsZSlcclxuICAgIC8vIGxldCBmcm9tRGVncmVlc0FycmF5ID0gW1xyXG4gICAgLy8gICB0aGlzLm9wdGlvbnMucG9zaXRpb24ubG5nIC0gMC4wNSwgdGhpcy5vcHRpb25zLnBvc2l0aW9uLmxhdCAtIDAuMDUsXHJcbiAgICAvLyAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbi5sbmcgKyAwLjA1LCB0aGlzLm9wdGlvbnMucG9zaXRpb24ubGF0IC0gMC4wNSxcclxuICAgIC8vICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uLmxuZyArIDAuMDUsIHRoaXMub3B0aW9ucy5wb3NpdGlvbi5sYXQgKyAwLjA1LFxyXG4gICAgLy8gICB0aGlzLm9wdGlvbnMucG9zaXRpb24ubG5nIC0gMC4wNSwgdGhpcy5vcHRpb25zLnBvc2l0aW9uLmxhdCArIDAuMDUsXHJcbiAgICAvLyBdXHJcbiAgICBsZXQgY2FudmFzID0gdGhpcy5nZXRjYW52YXMoKVxyXG4gICAgbGV0IHJhdGlvID0gY2FudmFzLmhlaWdodCAvIGNhbnZhcy53aWR0aFxyXG5cclxuICAgIHRoaXMuZW50aXR5ID0gdGhpcy5zZGsudmlld2VyLmVudGl0aWVzLmFkZCh7XHJcbiAgICAgIGlkOiB0aGlzLm9wdGlvbnMuaWQsXHJcbiAgICAgIHNob3c6IHRoaXMub3B0aW9ucy5zaG93LFxyXG4gICAgICByZWN0YW5nbGU6IHtcclxuICAgICAgICBjb29yZGluYXRlczogbmV3IENlc2l1bS5DYWxsYmFja1Byb3BlcnR5KCgpID0+IHtcclxuICAgICAgICAgIGxldCBnYXAgPVxyXG4gICAgICAgICAgICBNYXRoLmFicyhNYXRoLmNvcygoTWF0aC5QSSAvIDE4MCkgKiB0aGlzLm9wdGlvbnMucG9zaXRpb24ubGF0KSkgKlxyXG4gICAgICAgICAgICAoMC4wMDAxICogdGhpcy5vcHRpb25zLnNjYWxlKVxyXG4gICAgICAgICAgbGV0IGZyb21EZWdyZWVzQXJyYXkgPSBbXHJcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbi5sbmcgLSAoMC4wMDAxICogdGhpcy5vcHRpb25zLnNjYWxlKSAvIHJhdGlvLFxyXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb24ubGF0IC0gZ2FwLFxyXG4gICAgICAgICAgICAvLyB0aGlzLm9wdGlvbnMucG9zaXRpb24ubG5nICsgMC4wNSwgdGhpcy5vcHRpb25zLnBvc2l0aW9uLmxhdCAtIDAuMDUsXHJcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbi5sbmcgKyAoMC4wMDAxICogdGhpcy5vcHRpb25zLnNjYWxlKSAvIHJhdGlvLFxyXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb24ubGF0ICsgZ2FwXHJcbiAgICAgICAgICAgIC8vIHRoaXMub3B0aW9ucy5wb3NpdGlvbi5sbmcgLSAwLjA1LCB0aGlzLm9wdGlvbnMucG9zaXRpb24ubGF0ICsgMC4wNSxcclxuICAgICAgICAgIF1cclxuICAgICAgICAgIHJldHVybiBDZXNpdW0uUmVjdGFuZ2xlLmZyb21EZWdyZWVzKC4uLmZyb21EZWdyZWVzQXJyYXkpXHJcbiAgICAgICAgfSwgZmFsc2UpLFxyXG4gICAgICAgIG1hdGVyaWFsOiBuZXcgQ2VzaXVtLkN1c3RvbU1hdGVyaWFsU291cmNlKHtcclxuICAgICAgICAgIGltYWdlOiBjYW52YXMudG9EYXRhVVJMKCdpbWFnZS9wbmcnKSxcclxuICAgICAgICAgIGNvbG9yOiB0aGlzLm9wdGlvbnMuY29sb3IsXHJcbiAgICAgICAgICByZXBlYXQ6IG5ldyBDZXNpdW0uQ2FydGVzaWFuMigxLjAsIDEuMCksXHJcbiAgICAgICAgICBkdXJhdGlvbjogdGhpcy5vcHRpb25zLmR1cmF0aW9uIC8gdGhpcy5vcHRpb25zLnNwZWVkLFxyXG4gICAgICAgICAgZmx0cjogZmFsc2UsXHJcbiAgICAgICAgICBpczJEOiB0aGlzLnNkay52aWV3ZXIuc2NlbmUubW9kZSA9PT0gQ2VzaXVtLlNjZW5lTW9kZS5TQ0VORTJEID8gdHJ1ZSA6IGZhbHNlXHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgcm90YXRpb246IG5ldyBDZXNpdW0uQ2FsbGJhY2tQcm9wZXJ0eSgoKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gQ2VzaXVtLk1hdGgudG9SYWRpYW5zKHRoaXMub3B0aW9ucy5hbmdsZSlcclxuICAgICAgICB9LCBmYWxzZSksXHJcbiAgICAgICAgc3RSb3RhdGlvbjogbmV3IENlc2l1bS5DYWxsYmFja1Byb3BlcnR5KCgpID0+IHtcclxuICAgICAgICAgIHJldHVybiBDZXNpdW0uTWF0aC50b1JhZGlhbnModGhpcy5vcHRpb25zLmFuZ2xlKVxyXG4gICAgICAgIH0sIGZhbHNlKVxyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gICAgaWYgKHRoaXMuc2RrLnZpZXdlci5fZWxlbWVudC5jbGFzc05hbWUgPT09ICdjZXNpdW0tdmlld2VyIDJkJykge1xyXG4gICAgICB0aGlzLmVudGl0eS5yZWN0YW5nbGUuaGVpZ2h0ID0gMTBcclxuICAgIH1cclxuICAgIHN5bmNEYXRhKHRoaXMuc2RrLCB0aGlzLm9wdGlvbnMuaWQpXHJcbiAgICBpZiAodGhpcy5vcHRpb25zLnNob3cpIHtcclxuXHJcbiAgICAgIHNldFNwbGl0RGlyZWN0aW9uKDAsIHRoaXMub3B0aW9ucy5pZClcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIOe8lui+keahhlxyXG4gIGFzeW5jIGVkaXQoc3RhdGUpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXNcclxuICAgIHRoaXMub3JpZ2luYWxPcHRpb25zID0gdGhpcy5kZWVwQ29weU9iaih0aGlzLm9wdGlvbnMpXHJcbiAgICBpZiAodGhpcy5fRGlhbG9nT2JqZWN0ICYmIHRoaXMuX0RpYWxvZ09iamVjdC5jbG9zZSkge1xyXG4gICAgICB0aGlzLl9EaWFsb2dPYmplY3QuY2xvc2UoKVxyXG4gICAgICB0aGlzLl9EaWFsb2dPYmplY3QgPSBudWxsXHJcbiAgICB9XHJcbiAgICBpZiAoc3RhdGUpIHtcclxuXHJcbiAgICAgIHRoaXMuX0RpYWxvZ09iamVjdCA9IGF3YWl0IG5ldyBEaWFsb2coXHJcbiAgICAgICAgdGhpcy5zZGssXHJcbiAgICAgICAgdGhpcy5vcmlnaW5hbE9wdGlvbnMsXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgdGl0bGU6ICfotLTlnLDmloflrZflsZ7mgKcnLFxyXG4gICAgICAgICAgbGVmdDogJzE4MHB4JyxcclxuICAgICAgICAgIHRvcDogJzEwMHB4JyxcclxuICAgICAgICAgIGNvbmZpcm1DYWxsQmFjazogb3B0aW9ucyA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMudGV4dCA9IHRoaXMudGV4dC50cmltKClcclxuICAgICAgICAgICAgaWYgKCF0aGlzLnRleHQpIHtcclxuICAgICAgICAgICAgICB0aGlzLnRleHQgPSAn5pyq5ZG95ZCN5a+56LGhJ1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMub3JpZ2luYWxPcHRpb25zID0gdGhpcy5kZWVwQ29weU9iaih0aGlzLm9wdGlvbnMpXHJcbiAgICAgICAgICAgIHRoaXMuX0RpYWxvZ09iamVjdC5jbG9zZSgpXHJcbiAgICAgICAgICAgIHRoaXMuRGlhbG9nLmNvbmZpcm1DYWxsQmFjayAmJlxyXG4gICAgICAgICAgICAgIHRoaXMuRGlhbG9nLmNvbmZpcm1DYWxsQmFjayh0aGlzLm9yaWdpbmFsT3B0aW9ucylcclxuICAgICAgICAgICAgc3luY0RhdGEodGhpcy5zZGssIHRoaXMub3B0aW9ucy5pZClcclxuICAgICAgICAgICAgc3luY1NwbGl0RGF0YSh0aGlzLnNkaywgdGhpcy5vcHRpb25zLmlkKVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHJlc2V0Q2FsbEJhY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5yZXNldCgpXHJcbiAgICAgICAgICAgIHRoaXMuRGlhbG9nLnJlc2V0Q2FsbEJhY2sgJiYgdGhpcy5EaWFsb2cucmVzZXRDYWxsQmFjaygpXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgcmVtb3ZlQ2FsbEJhY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5EaWFsb2cucmVtb3ZlQ2FsbEJhY2sgJiYgdGhpcy5EaWFsb2cucmVtb3ZlQ2FsbEJhY2soKVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIGNsb3NlQ2FsbEJhY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5yZXNldCgpXHJcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb25FZGl0aW5nID0gZmFsc2VcclxuICAgICAgICAgICAgLy8gdGhpcy5lbnRpdHkuc3R5bGUgPSBuZXcgQ2VzaXVtLkNlc2l1bTNEVGlsZVN0eWxlKHtcclxuICAgICAgICAgICAgLy8gICBjb2xvcjogXCJjb2xvcigncmdiYSgyNTUsMjU1LDI1NSxcIiArIHRoaXMubmV3RGF0YS50cmFuc3BhcmVuY3kgKyBcIiknKVwiLFxyXG4gICAgICAgICAgICAvLyAgIHNob3c6IHRydWUsXHJcbiAgICAgICAgICAgIC8vIH0pO1xyXG4gICAgICAgICAgICB0aGlzLkRpYWxvZy5jbG9zZUNhbGxCYWNrICYmIHRoaXMuRGlhbG9nLmNsb3NlQ2FsbEJhY2soKVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHNob3dDYWxsQmFjazogc2hvdyA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuc2hvdyA9IHNob3dcclxuICAgICAgICAgICAgdGhpcy5EaWFsb2cuc2hvd0NhbGxCYWNrICYmIHRoaXMuRGlhbG9nLnNob3dDYWxsQmFjaygpXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgdHJhbnNsYXRpb25hbENhbGxCYWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb25FZGl0aW5nID0gIXRoaXMucG9zaXRpb25FZGl0aW5nXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICB0cnVlXHJcbiAgICAgIClcclxuICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmJvZHkuY2xhc3NOYW1lID0gdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmJvZHkuY2xhc3NOYW1lICsgJyBncm91bmQtdGV4dCdcclxuICAgICAgbGV0IGNvbnRlbnRFbG0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKVxyXG4gICAgICBjb250ZW50RWxtLmlubmVySFRNTCA9IGh0bWwoKVxyXG4gICAgICB0aGlzLl9EaWFsb2dPYmplY3QuY29udGVudEFwcENoaWxkKGNvbnRlbnRFbG0pXHJcbiAgICAgIGxldCBhbGxfZWxtID0gY29udGVudEVsbS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnKicpXHJcbiAgICAgIHRoaXMuX0V2ZW50QmluZGluZy5vbih0aGlzLCBhbGxfZWxtKVxyXG4gICAgICB0aGlzLl9lbG1zID0gdGhpcy5fRXZlbnRCaW5kaW5nLmVsZW1lbnRcclxuXHJcbiAgICAgIC8vIOminOiJsue7hOS7tlxyXG4gICAgICBsZXQgY29sb3JQaWNrZXIgPSBuZXcgWUpDb2xvclBpY2tlcih7XHJcbiAgICAgICAgZWw6IGNvbnRlbnRFbG0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnY29sb3InKVswXSxcclxuICAgICAgICBzaXplOiAnbWluaScsIC8v6aKc6ImyYm9457G75Z6LXHJcbiAgICAgICAgYWxwaGE6IHRydWUsIC8v5piv5ZCm5byA5ZCv6YCP5piO5bqmXHJcbiAgICAgICAgZGVmYXVsdENvbG9yOiB0aGlzLmNvbG9yLFxyXG4gICAgICAgIGRpc2FibGVkOiBmYWxzZSwgLy/mmK/lkKbnpoHmraLmiZPlvIDpopzoibLpgInmi6nlmahcclxuICAgICAgICBvcGVuUGlja2VyQW5pOiAnb3BhY2l0eScsIC8v5omT5byA6aKc6Imy6YCJ5oup5Zmo5Yqo55S7XHJcbiAgICAgICAgc3VyZTogY29sb3IgPT4ge1xyXG4gICAgICAgICAgdGhpcy5jb2xvciA9IGNvbG9yXHJcbiAgICAgICAgfSwgLy/ngrnlh7vnoa7orqTmjInpkq7kuovku7blm57osINcclxuICAgICAgICBjbGVhcjogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5jb2xvciA9ICdyZ2JhKDI1NSwyNTUsMjU1LDEpJ1xyXG4gICAgICAgIH0gLy/ngrnlh7vmuIXnqbrmjInpkq7kuovku7blm57osINcclxuICAgICAgfSlcclxuICAgICAgdGhpcy5fZWxtcy5jb2xvciA9IFtjb2xvclBpY2tlcl1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmICh0aGlzLl9EaWFsb2dPYmplY3QgJiYgdGhpcy5fRGlhbG9nT2JqZWN0LnJlbW92ZSkge1xyXG4gICAgICAgIHRoaXMuX0RpYWxvZ09iamVjdC5yZW1vdmUoKVxyXG4gICAgICAgIHRoaXMuX0RpYWxvZ09iamVjdCA9IG51bGxcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqQGRlc2Mg5omT5byA5bmz56e75Yqf6IO9XHJcbiAgICpcclxuICAgKiBAbWVtYmVyT2YgU291cmNlXHJcbiAgICogQHBhcmFtIHN0YXR1cyB7Ym9vbGVhbn1cclxuICAgKlxyXG4gICAqICovXHJcbiAgc2V0IHBvc2l0aW9uRWRpdGluZyhzdGF0dXMpIHtcclxuICAgIGlmICghdGhpcy5zZGsgfHwgIXRoaXMuc2RrLnZpZXdlciB8fCAhdGhpcy5lbnRpdHkpIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcbiAgICB0aGlzLl9wb3NpdGlvbkVkaXRpbmcgPSBzdGF0dXNcclxuICAgIHRoaXMucHJldmlvdXMgPSB7XHJcbiAgICAgIHBvc2l0aW9uOiB7IC4uLnRoaXMub3B0aW9ucy5wb3NpdGlvbiB9XHJcbiAgICB9XHJcbiAgICBpZiAoc3RhdHVzID09PSB0cnVlKSB7XHJcbiAgICAgIHRoaXMudGlwICYmIHRoaXMudGlwLmRlc3Ryb3koKVxyXG4gICAgICB0aGlzLnRpcCA9IG5ldyBNb3VzZVRpcCgn54K55Ye76byg5qCH5bem6ZSu56Gu6K6k77yM5Y+z6ZSu5Y+W5raIJywgdGhpcy5zZGspXHJcbiAgICAgIHRoaXMuZXZlbnQubW91c2VfbW92ZSgobW92ZW1lbnQsIGNhcnRlc2lhbikgPT4ge1xyXG4gICAgICAgIGxldCBwb3NpdGlvbiA9IHRoaXMuY2FydGVzaWFuM1Rvd2dzODQoY2FydGVzaWFuLCB0aGlzLnNkay52aWV3ZXIpXHJcbiAgICAgICAgdGhpcy5sbmcgPSBwb3NpdGlvbi5sbmdcclxuICAgICAgICB0aGlzLmxhdCA9IHBvc2l0aW9uLmxhdFxyXG4gICAgICAgIHRoaXMudGlwLnNldFBvc2l0aW9uKFxyXG4gICAgICAgICAgY2FydGVzaWFuLFxyXG4gICAgICAgICAgbW92ZW1lbnQuZW5kUG9zaXRpb24ueCxcclxuICAgICAgICAgIG1vdmVtZW50LmVuZFBvc2l0aW9uLnlcclxuICAgICAgICApXHJcbiAgICAgIH0pXHJcbiAgICAgIHRoaXMuZXZlbnQubW91c2VfbGVmdCgobW92ZW1lbnQsIGNhcnRlc2lhbikgPT4ge1xyXG4gICAgICAgIGxldCBwb3NpdGlvbiA9IHRoaXMuY2FydGVzaWFuM1Rvd2dzODQoY2FydGVzaWFuLCB0aGlzLnNkay52aWV3ZXIpXHJcbiAgICAgICAgdGhpcy5sbmcgPSBwb3NpdGlvbi5sbmdcclxuICAgICAgICB0aGlzLmxhdCA9IHBvc2l0aW9uLmxhdFxyXG4gICAgICAgIHRoaXMuZXZlbnQubW91c2VfbW92ZSgoKSA9PiB7IH0pXHJcbiAgICAgICAgdGhpcy5ldmVudC5tb3VzZV9sZWZ0KCgpID0+IHsgfSlcclxuICAgICAgICB0aGlzLmV2ZW50Lm1vdXNlX3JpZ2h0KCgpID0+IHsgfSlcclxuICAgICAgICB0aGlzLmV2ZW50Lmdlc3R1cmVfcGluY2tfc3RhcnQoKCkgPT4geyB9KVxyXG4gICAgICAgIHRoaXMuZXZlbnQuZ2VzdHVyZV9waW5ja19lbmQoKCkgPT4geyB9KVxyXG4gICAgICAgIHRoaXMucG9zaXRpb25FZGl0aW5nID0gZmFsc2VcclxuICAgICAgfSlcclxuICAgICAgdGhpcy5ldmVudC5tb3VzZV9yaWdodCgobW92ZW1lbnQsIGNhcnRlc2lhbikgPT4ge1xyXG4gICAgICAgIHRoaXMubG5nID0gdGhpcy5wcmV2aW91cy5wb3NpdGlvbi5sbmdcclxuICAgICAgICB0aGlzLmxhdCA9IHRoaXMucHJldmlvdXMucG9zaXRpb24ubGF0XHJcbiAgICAgICAgdGhpcy5wb3NpdGlvbkVkaXRpbmcgPSBmYWxzZVxyXG4gICAgICB9KVxyXG5cclxuICAgICAgdGhpcy5ldmVudC5nZXN0dXJlX3BpbmNrX3N0YXJ0KChtb3ZlbWVudCwgY2FydGVzaWFuKSA9PiB7XHJcbiAgICAgICAgbGV0IHN0YXJ0VGltZSA9IG5ldyBEYXRlKClcclxuICAgICAgICB0aGlzLmV2ZW50Lmdlc3R1cmVfcGluY2tfZW5kKCgpID0+IHtcclxuICAgICAgICAgIGxldCBlbmRUaW1lID0gbmV3IERhdGUoKVxyXG4gICAgICAgICAgaWYgKGVuZFRpbWUgLSBzdGFydFRpbWUgPj0gNTAwKSB7XHJcbiAgICAgICAgICAgIC8vIOmVv+aMieWPlua2iFxyXG4gICAgICAgICAgICB0aGlzLmxuZyA9IHRoaXMucHJldmlvdXMucG9zaXRpb24ubG5nXHJcbiAgICAgICAgICAgIHRoaXMubGF0ID0gdGhpcy5wcmV2aW91cy5wb3NpdGlvbi5sYXRcclxuICAgICAgICAgICAgdGhpcy5wb3NpdGlvbkVkaXRpbmcgPSBmYWxzZVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGxldCBwb3NpdGlvbiA9IHRoaXMuY2FydGVzaWFuM1Rvd2dzODQoY2FydGVzaWFuLCB0aGlzLnNkay52aWV3ZXIpXHJcbiAgICAgICAgICAgIHRoaXMubG5nID0gcG9zaXRpb24ubG5nXHJcbiAgICAgICAgICAgIHRoaXMubGF0ID0gcG9zaXRpb24ubGF0XHJcbiAgICAgICAgICAgIHRoaXMuZXZlbnQubW91c2VfbW92ZSgoKSA9PiB7IH0pXHJcbiAgICAgICAgICAgIHRoaXMuZXZlbnQubW91c2VfbGVmdCgoKSA9PiB7IH0pXHJcbiAgICAgICAgICAgIHRoaXMuZXZlbnQubW91c2VfcmlnaHQoKCkgPT4geyB9KVxyXG4gICAgICAgICAgICB0aGlzLmV2ZW50Lmdlc3R1cmVfcGluY2tfc3RhcnQoKCkgPT4geyB9KVxyXG4gICAgICAgICAgICB0aGlzLmV2ZW50Lmdlc3R1cmVfcGluY2tfZW5kKCgpID0+IHsgfSlcclxuICAgICAgICAgICAgdGhpcy5wb3NpdGlvbkVkaXRpbmcgPSBmYWxzZVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgIH0pXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAodGhpcy5ldmVudCkge1xyXG4gICAgICAgIHRoaXMuZXZlbnQubW91c2VfbW92ZSgoKSA9PiB7IH0pXHJcbiAgICAgICAgdGhpcy5ldmVudC5tb3VzZV9sZWZ0KCgpID0+IHsgfSlcclxuICAgICAgICB0aGlzLmV2ZW50Lm1vdXNlX3JpZ2h0KCgpID0+IHsgfSlcclxuICAgICAgICB0aGlzLmV2ZW50Lmdlc3R1cmVfcGluY2tfc3RhcnQoKCkgPT4geyB9KVxyXG4gICAgICAgIHRoaXMuZXZlbnQuZ2VzdHVyZV9waW5ja19lbmQoKCkgPT4geyB9KVxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMudGlwICYmIHRoaXMudGlwLmRlc3Ryb3koKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IHBvc2l0aW9uRWRpdGluZygpIHtcclxuICAgIHJldHVybiB0aGlzLl9wb3NpdGlvbkVkaXRpbmdcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIOmjnuWIsFxyXG4gICAqL1xyXG4gIGFzeW5jIGZseVRvKG9wdGlvbnMgPSB7fSkge1xyXG4gICAgbGV0IGNhbnZhcyA9IHRoaXMuZ2V0Y2FudmFzKClcclxuICAgIGxldCByYXRpbyA9IGNhbnZhcy5oZWlnaHQgLyBjYW52YXMud2lkdGhcclxuICAgIHNldEFjdGl2ZVZpZXdlcigwKVxyXG4gICAgY2xvc2VSb3RhdGVBcm91bmQodGhpcy5zZGspXHJcbiAgICBjbG9zZVZpZXdGb2xsb3codGhpcy5zZGspXHJcblxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5jdXN0b21WaWV3ICYmIHRoaXMub3B0aW9ucy5jdXN0b21WaWV3LnJlbGF0aXZlUG9zaXRpb24gJiYgdGhpcy5vcHRpb25zLmN1c3RvbVZpZXcub3JpZW50YXRpb24pIHtcclxuICAgICAgbGV0IG9yaWVudGF0aW9uID0ge1xyXG4gICAgICAgIGhlYWRpbmc6IENlc2l1bS5NYXRoLnRvUmFkaWFucyh0aGlzLm9wdGlvbnMuY3VzdG9tVmlldy5vcmllbnRhdGlvbi5oZWFkaW5nIHx8IDAuMCksXHJcbiAgICAgICAgcGl0Y2g6IENlc2l1bS5NYXRoLnRvUmFkaWFucyh0aGlzLm9wdGlvbnMuY3VzdG9tVmlldy5vcmllbnRhdGlvbi5waXRjaCB8fCAtNjAuMCksXHJcbiAgICAgICAgcm9sbDogQ2VzaXVtLk1hdGgudG9SYWRpYW5zKHRoaXMub3B0aW9ucy5jdXN0b21WaWV3Lm9yaWVudGF0aW9uLnJvbGwgfHwgMC4wKVxyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgbG5nID0gdGhpcy5vcHRpb25zLmN1c3RvbVZpZXcucmVsYXRpdmVQb3NpdGlvbi5sbmdcclxuICAgICAgbGV0IGxhdCA9IHRoaXMub3B0aW9ucy5jdXN0b21WaWV3LnJlbGF0aXZlUG9zaXRpb24ubGF0XHJcbiAgICAgIGxldCBhbHQgPSB0aGlzLm9wdGlvbnMuY3VzdG9tVmlldy5yZWxhdGl2ZVBvc2l0aW9uLmFsdFxyXG4gICAgICBsZXQgZGVzdGluYXRpb24gPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlcyhsbmcsIGxhdCwgYWx0KVxyXG5cclxuICAgICAgbGV0IHBvc2l0aW9uID0geyBsbmc6IDAsIGxhdDogMCB9XHJcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMucG9zaXRpb24pIHtcclxuICAgICAgICBwb3NpdGlvbiA9IHsgLi4udGhpcy5vcHRpb25zLnBvc2l0aW9uIH1cclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmICh0aGlzLm9wdGlvbnMucG9zaXRpb25zKSB7XHJcbiAgICAgICAgcG9zaXRpb24gPSB7IC4uLnRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0gfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKHRoaXMub3B0aW9ucy5jZW50ZXIpIHtcclxuICAgICAgICBwb3NpdGlvbiA9IHsgLi4udGhpcy5vcHRpb25zLmNlbnRlciB9XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAodGhpcy5vcHRpb25zLnN0YXJ0KSB7XHJcbiAgICAgICAgcG9zaXRpb24gPSB7IC4uLnRoaXMub3B0aW9ucy5zdGFydCB9XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgnbG5nJykpIHtcclxuICAgICAgICAgIHBvc2l0aW9uLmxuZyA9IHRoaXMub3B0aW9ucy5sbmdcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgnbGF0JykpIHtcclxuICAgICAgICAgIHBvc2l0aW9uLmxhdCA9IHRoaXMub3B0aW9ucy5sYXRcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgnYWx0JykpIHtcclxuICAgICAgICAgIHBvc2l0aW9uLmFsdCA9IHRoaXMub3B0aW9ucy5hbHRcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgLy8g5aaC5p6c5rKh5pyJ6auY5bqm5YC877yM5YiZ6I635Y+W57Sn6LS06auY5bqm6K6h566XXHJcbiAgICAgIGlmICghcG9zaXRpb24uaGFzT3duUHJvcGVydHkoJ2FsdCcpKSB7XHJcbiAgICAgICAgcG9zaXRpb24uYWx0ID0gYXdhaXQgdGhpcy5nZXRDbGFtcFRvSGVpZ2h0KHBvc2l0aW9uKVxyXG4gICAgICB9XHJcbiAgICAgIGxuZyA9IHRoaXMub3B0aW9ucy5jdXN0b21WaWV3LnJlbGF0aXZlUG9zaXRpb24ubG5nICsgcG9zaXRpb24ubG5nXHJcbiAgICAgIGxhdCA9IHRoaXMub3B0aW9ucy5jdXN0b21WaWV3LnJlbGF0aXZlUG9zaXRpb24ubGF0ICsgcG9zaXRpb24ubGF0XHJcbiAgICAgIGFsdCA9IHRoaXMub3B0aW9ucy5jdXN0b21WaWV3LnJlbGF0aXZlUG9zaXRpb24uYWx0ICsgcG9zaXRpb24uYWx0XHJcbiAgICAgIGRlc3RpbmF0aW9uID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXMobG5nLCBsYXQsIGFsdClcclxuICAgICAgdGhpcy5zZGsudmlld2VyLmNhbWVyYS5mbHlUbyh7XHJcbiAgICAgICAgZGVzdGluYXRpb246IGRlc3RpbmF0aW9uLFxyXG4gICAgICAgIG9yaWVudGF0aW9uOiBvcmllbnRhdGlvblxyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGxldCBnYXAgPVxyXG4gICAgICAgIE1hdGguYWJzKE1hdGguY29zKChNYXRoLlBJIC8gMTgwKSAqIHRoaXMub3B0aW9ucy5wb3NpdGlvbi5sYXQpKSAqXHJcbiAgICAgICAgKDAuMDAwMSAqIHRoaXMub3B0aW9ucy5zY2FsZSlcclxuICAgICAgbGV0IGZyb21EZWdyZWVzQXJyYXkgPSBbXHJcbiAgICAgICAgW1xyXG4gICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uLmxuZyAtICgwLjAwMDEgKiB0aGlzLm9wdGlvbnMuc2NhbGUpIC8gcmF0aW8sXHJcbiAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb24ubGF0IC0gZ2FwXHJcbiAgICAgICAgXSxcclxuICAgICAgICBbXHJcbiAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb24ubG5nICsgKDAuMDAwMSAqIHRoaXMub3B0aW9ucy5zY2FsZSkgLyByYXRpbyxcclxuICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbi5sYXQgKyBnYXBcclxuICAgICAgICBdXHJcbiAgICAgIF1cclxuICAgICAgbGV0IGhlaWdodCA9IGF3YWl0IHRoaXMuZ2V0Q2xhbXBUb0hlaWdodCh0aGlzLm9wdGlvbnMucG9zaXRpb24pXHJcbiAgICAgIGxldCBwb3NpdGlvbkFycmF5ID0gW11cclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmcm9tRGVncmVlc0FycmF5Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgbGV0IGEgPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlcyguLi5mcm9tRGVncmVlc0FycmF5W2ldLCBoZWlnaHQpXHJcbiAgICAgICAgcG9zaXRpb25BcnJheS5wdXNoKGEueCwgYS55LCBhLnopXHJcbiAgICAgIH1cclxuICAgICAgbGV0IEJvdW5kaW5nU3BoZXJlID0gQ2VzaXVtLkJvdW5kaW5nU3BoZXJlLmZyb21WZXJ0aWNlcyhwb3NpdGlvbkFycmF5KVxyXG4gICAgICB0aGlzLnNkay52aWV3ZXIuY2FtZXJhLmZseVRvQm91bmRpbmdTcGhlcmUoQm91bmRpbmdTcGhlcmUsIHtcclxuICAgICAgICBvZmZzZXQ6IG9wdGlvbnMub3JpZW50YXRpb24gfHwge1xyXG4gICAgICAgICAgaGVhZGluZzogQ2VzaXVtLk1hdGgudG9SYWRpYW5zKDAuMCksXHJcbiAgICAgICAgICBwaXRjaDogQ2VzaXVtLk1hdGgudG9SYWRpYW5zKC05MC4wKSxcclxuICAgICAgICAgIHJvbGw6IENlc2l1bS5NYXRoLnRvUmFkaWFucygwLjApXHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVzZXQoKSB7XHJcbiAgICBpZiAoIXRoaXMuZW50aXR5KSB7XHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG4gICAgdGhpcy5vcHRpb25zID0gdGhpcy5kZWVwQ29weU9iaih0aGlzLm9yaWdpbmFsT3B0aW9ucylcclxuICAgIHRoaXMudGV4dCA9IHRoaXMub3JpZ2luYWxPcHRpb25zLnRleHRcclxuICAgIHRoaXMuYW5nbGUgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5hbmdsZVxyXG4gICAgdGhpcy5zY2FsZSA9IHRoaXMub3JpZ2luYWxPcHRpb25zLnNjYWxlXHJcbiAgICB0aGlzLmNvbG9yID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMuY29sb3JcclxuICB9XHJcblxyXG4gIGFzeW5jIHJlbW92ZSgpIHtcclxuICAgIHRoaXMuZXZlbnQgJiYgdGhpcy5ldmVudC5kZXN0cm95KClcclxuICAgIHRoaXMudGlwICYmIHRoaXMudGlwLmRlc3Ryb3koKVxyXG4gICAgdGhpcy5zZGsudmlld2VyLmVudGl0aWVzLnJlbW92ZSh0aGlzLmVudGl0eSlcclxuICAgIHRoaXMuZW50aXR5ID0gbnVsbFxyXG4gICAgaWYgKHRoaXMuX0RpYWxvZ09iamVjdCAmJiAhdGhpcy5fRGlhbG9nT2JqZWN0LmlzRGVzdHJveSkge1xyXG4gICAgICB0aGlzLl9EaWFsb2dPYmplY3QuY2xvc2UoKVxyXG4gICAgICB0aGlzLl9EaWFsb2dPYmplY3QgPSBudWxsXHJcbiAgICB9XHJcbiAgICBhd2FpdCB0aGlzLnNkay5yZW1vdmVJbmNldGFuY2UodGhpcy5vcHRpb25zLmlkKVxyXG4gICAgYXdhaXQgc3luY0RhdGEodGhpcy5zZGssIHRoaXMub3B0aW9ucy5pZClcclxuICB9XHJcblxyXG4gIGdldGNhbnZhcygpIHtcclxuICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpXHJcbiAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKVxyXG5cclxuICAgIGxldCB0ZXh0QXJyYXkgPSB0aGlzLm9wdGlvbnMudGV4dC5zcGxpdCgnXFxuJylcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGV4dEFycmF5Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGlmICh0ZXh0QXJyYXlbaV0ubGVuZ3RoID4gODApIHtcclxuICAgICAgICB0ZXh0QXJyYXlbaV0gPSB0ZXh0QXJyYXlbaV0uc2xpY2UoMCwgODAgLSB0ZXh0QXJyYXlbaV0ubGVuZ3RoKVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAodGV4dEFycmF5Lmxlbmd0aCA+IDcwKSB7XHJcbiAgICAgIHRleHRBcnJheS5zcGxpY2UoNzAgLSB0ZXh0QXJyYXkubGVuZ3RoKVxyXG4gICAgfVxyXG4gICAgdGhpcy5vcHRpb25zLnRleHQgPSB0ZXh0QXJyYXkuam9pbignXFxuJylcclxuICAgIGxldCBtYXhXaWR0aCA9IDBcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGV4dEFycmF5Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGN0eC5mb250ID0gMjAwICsgJ3B4IHNlcmlmJ1xyXG4gICAgICBjb25zdCB3aWR0aCA9IGN0eC5tZWFzdXJlVGV4dCh0ZXh0QXJyYXlbaV0pLndpZHRoXHJcbiAgICAgIGlmIChtYXhXaWR0aCA8IHdpZHRoKSB7XHJcbiAgICAgICAgbWF4V2lkdGggPSB3aWR0aFxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBjYW52YXMud2lkdGggPSBtYXhXaWR0aFxyXG4gICAgY2FudmFzLmhlaWdodCA9IDIyMCAqIHRleHRBcnJheS5sZW5ndGhcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGV4dEFycmF5Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGN0eC5mb250ID0gMjAwICsgJ3B4IHNlcmlmJ1xyXG4gICAgICBjdHguZmlsbFN0eWxlID0gJ3JnYmEoMjU1LCAyNTUsIDI1NSwgMCknXHJcbiAgICAgIGN0eC5maWxsUmVjdCgwLCAwLCBtYXhXaWR0aCArIDMwLCAyMTApXHJcbiAgICAgIGN0eC5maWxsU3R5bGUgPSAncmdiYSgyNTUsIDI1NSwgMjU1LCAxKSdcclxuICAgICAgY3R4LmZvbnQgPSAnMjAwcHggc2VyaWYnXHJcbiAgICAgIGN0eC5maWxsVGV4dCh0ZXh0QXJyYXlbaV0sIDAsIDIxMCAqIChpICsgMSkpXHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGNhbnZhc1xyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgR3JvdW5kVGV4dFxyXG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFTQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFiQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQVVBO0FBQ0E7QUFFQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFHQTtBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFHQTtBQUdBO0FBQ0E7QUFFQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUE1Q0E7QUE2Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFwRkE7QUFBQTtBQUFBO0FBQUE7QUFzRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTEE7QUFBQTtBQUFBO0FBZ0ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBN0VBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBU0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFHQTtBQVNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQXJGQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQXdGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFYQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQWNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBR0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/Obj/Base/TextObject/GroundText/index.js\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/toConsumableArray */ \"./node_modules/@babel/runtime/helpers/toConsumableArray.js\");\n/* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ \"./node_modules/@babel/runtime/helpers/asyncToGenerator.js\");\n/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ \"./node_modules/@babel/runtime/helpers/defineProperty.js\");\n/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ \"./node_modules/@babel/runtime/helpers/classCallCheck.js\");\n/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ \"./node_modules/@babel/runtime/helpers/createClass.js\");\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ \"./node_modules/@babel/runtime/helpers/possibleConstructorReturn.js\");\n/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ \"./node_modules/@babel/runtime/helpers/getPrototypeOf.js\");\n/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ \"./node_modules/@babel/runtime/helpers/inherits.js\");\n/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @babel/runtime/regenerator */ \"./node_modules/@babel/runtime/regenerator/index.js\");\n/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8__);\n/* harmony import */ var _Element_Dialog__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../../Element/Dialog */ \"./src/Obj/Element/Dialog/index.js\");\n/* harmony import */ var _Element_Dialog_eventBinding__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../../Element/Dialog/eventBinding */ \"./src/Obj/Element/Dialog/eventBinding.js\");\n/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./_element */ \"./src/Obj/Base/TextObject/GroundText/_element.js\");\n/* harmony import */ var _index__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../../index */ \"./src/Obj/Base/index.js\");\n/* harmony import */ var _Event_index__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../../../../Event/index */ \"./src/Event/index.js\");\n/* harmony import */ var _Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../../../../Global/MultiViewportMode */ \"./src/Global/MultiViewportMode/index.js\");\n/* harmony import */ var _MouseTip__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../../../../MouseTip */ \"./src/MouseTip/index.js\");\n/* harmony import */ var _Global_SplitScreen__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../../../../Global/SplitScreen */ \"./src/Global/SplitScreen/index.js\");\n/* harmony import */ var _Global_global__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../../../../Global/global */ \"./src/Global/global.js\");\n\n\n\n\n\n\n\n\n\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default()(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nfunction _callSuper(t, o, e) { return o = _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6___default()(o), _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_5___default()(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6___default()(t).constructor) : o.apply(t, e)); }\nfunction _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }\n\n\n\n\n\n\n\n\n\nvar GroundText = /*#__PURE__*/function (_Base) {\n /**\r\n * @constructor\r\n * @param sdk\r\n * @description 贴地文字\r\n * @param options {object} 属性\r\n * @param options.id {string} 唯一标识\r\n * @param options.show=true {boolean} 显示/隐藏\r\n * @param options.text {string} 文字\r\n * @param options.color=#FFC107 {string} 颜色\r\n * @param options.angle=0 {number} 旋转角度\r\n * @param options.scale=1 {number} 缩放比例\r\n * @param options.speed=1 {number} 文字滚动速度\r\n * @param {object} options.position 位置\r\n * @param {number} options.position.lng 经度\r\n * @param {number} options.position.lat 纬度\r\n * @param {object} options.positions 坐标集[{lon,lat}]仅在未定义 position 时有效\r\n * @param options.positions[].lng {number} 经度\r\n * @param options.positions[].lat {number} 纬度\r\n * @param options.customView {object} 默认视角\r\n * @param options.customView.orientation {object} 默认视角方位\r\n * @param options.customView.orientation.heading {number} 航向角\r\n * @param options.customView.orientation.pitch {number} 俯仰角\r\n * @param options.customView.orientation.roll {number} 翻滚角\r\n * @param options.customView.relativePosition {object} 视角相对位置\r\n * @param options.customView.relativePosition.lng {number} 经度\r\n * @param options.customView.relativePosition.lat {number} 纬度\r\n * @param options.customView.relativePosition.alt {number} 高度\r\n * */\n function GroundText(sdk) {\n var _this2;\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var _Dialog = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3___default()(this, GroundText);\n _this2 = _callSuper(this, GroundText, [sdk, options]);\n _this2.options.text = options.text || '未命名对象';\n var textArray = _this2.options.text.split('\\n');\n for (var i = 0; i < textArray.length; i++) {\n if (textArray[i].length > 80) {\n textArray[i] = textArray[i].slice(0, 80 - textArray[i].length);\n }\n }\n if (textArray.length > 70) {\n textArray.splice(70 - textArray.length);\n }\n _this2.options.text = textArray.join('\\n');\n _this2.options.show = options.show || options.show === false ? options.show : true;\n _this2.options.angle = options.angle || 0;\n _this2.options.scale = options.scale || options.scale === 0 ? options.scale : 1;\n // this.options.fontSize = options.fontSize || 20\n // this.options.duration =\n // options.duration || options.duration === 0 ? options.duration : 50000\n _this2.options.speed = options.speed || options.speed === 0 ? options.speed : 1;\n _this2.options.color = options.color || '#FFC107';\n _this2.options.position = options.position;\n delete _this2.options.name;\n if (!_this2.options.position && _this2.options.positions) {\n // 计算两点与x轴正方向的夹角(弧度)\n var calculateAngle = function calculateAngle(pointA, pointB) {\n var dx = pointB[0] - pointA[0];\n var dy = pointB[1] - pointA[1];\n return Math.atan2(dy, dx);\n };\n _this2.options.position = {\n lng: (_this2.options.positions[0].lng + _this2.options.positions[1].lng) / 2,\n lat: (_this2.options.positions[0].lat + _this2.options.positions[1].lat) / 2\n };\n var point1 = turf.point([_this2.options.positions[0].lng, _this2.options.positions[0].lat]);\n var point2 = turf.point([_this2.options.positions[1].lng, _this2.options.positions[1].lat]);\n var _options = {\n units: 'miles'\n };\n var distance1 = turf.rhumbDistance(point1, point2, _options);\n var angleRadians = calculateAngle([_this2.options.positions[0].lng, _this2.options.positions[0].lat], [_this2.options.positions[1].lng, _this2.options.positions[1].lat]);\n _this2.options.angle = (360 + Cesium.Math.toDegrees(angleRadians)) % 360;\n var gap = Math.abs(Math.cos(Math.PI / 180 * _this2.options.position.lat)) * 0.0001;\n var canvas = _this2.getcanvas();\n var ratio = canvas.height / canvas.width;\n var lng1 = _this2.options.position.lng - 0.0001 / ratio;\n var lat1 = _this2.options.position.lat - gap;\n var lng2 = _this2.options.position.lng + 0.0001 / ratio;\n var lat2 = _this2.options.position.lat + gap;\n var lng = (lng1 + lng2) / 2;\n var lat = (lat1 + lat2) / 2;\n var from = turf.point([lng1, lat]);\n var to = turf.point([lng2, lat]);\n var distance2 = turf.rhumbDistance(from, to, _options);\n var latRadians = Cesium.Math.toRadians(_this2.options.position.lat);\n distance2 = distance2 * (1 + Math.abs(Math.sin(angleRadians) * Math.tan(latRadians) * Math.sin(latRadians) * Math.sin(latRadians)));\n _this2.options.scale = distance1 / distance2;\n }\n _this2.duration = 50000;\n _this2.entity;\n _this2._positionEditing = false;\n _this2.Dialog = _Dialog;\n _this2._EventBinding = new _Element_Dialog_eventBinding__WEBPACK_IMPORTED_MODULE_10__[\"default\"]();\n _this2._elms = {};\n _this2.previous = {\n position: _objectSpread({}, _this2.options.position)\n };\n _this2.event = new _Event_index__WEBPACK_IMPORTED_MODULE_13__[\"default\"](_this2.sdk);\n _this2.sdk.addIncetance(_this2.options.id, _this2);\n _this2.create();\n return _this2;\n }\n _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_7___default()(GroundText, _Base);\n return _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4___default()(GroundText, [{\n key: \"lng\",\n get: function get() {\n return this.options.position.lng;\n },\n set: function set(v) {\n this.options.position.lng = v;\n this._elms.lng && this._elms.lng.forEach(function (item) {\n item.value = v;\n });\n }\n }, {\n key: \"lat\",\n get: function get() {\n return this.options.position.lat;\n },\n set: function set(v) {\n this.options.position.lat = v;\n this._elms.lat && this._elms.lat.forEach(function (item) {\n item.value = v;\n });\n }\n }, {\n key: \"name\",\n get: function get() {\n return;\n }\n }, {\n key: \"text\",\n get: function get() {\n return this.options.text;\n },\n set: function set(v) {\n var _this3 = this;\n this.options.text = v;\n var textArray = this.options.text.split('\\n');\n for (var i = 0; i < textArray.length; i++) {\n if (textArray[i].length > 80) {\n var _error = '行超过80个字符,请按回车(Enter)后,继续输入';\n window.ELEMENT && window.ELEMENT.Message({\n message: _error,\n type: 'warning',\n duration: 1000\n });\n textArray[i] = textArray[i].slice(0, 80 - textArray[i].length);\n }\n }\n if (textArray.length > 70) {\n textArray.splice(70 - textArray.length);\n var _error2 = '超过最大输入字符';\n window.ELEMENT && window.ELEMENT.Message({\n message: _error2,\n type: 'warning',\n duration: 1000\n });\n }\n this.options.text = textArray.join('\\n');\n if (this.entity) {\n var canvas = this.getcanvas();\n var ratio = canvas.height / canvas.width;\n this.entity.rectangle.material = new Cesium.CustomMaterialSource({\n image: canvas.toDataURL('image/png'),\n color: this.options.color,\n repeat: new Cesium.Cartesian2(1.0, 1.0),\n duration: this.duration / this.options.speed,\n fltr: false,\n is2D: this.sdk.viewer.scene.mode === Cesium.SceneMode.SCENE2D ? true : false\n });\n this.entity.rectangle.coordinates = new Cesium.CallbackProperty(function () {\n var _Cesium$Rectangle;\n var gap = Math.abs(Math.cos(Math.PI / 180 * _this3.options.position.lat)) * (0.0001 * _this3.options.scale);\n var fromDegreesArray = [_this3.options.position.lng - 0.0001 * _this3.options.scale / ratio, _this3.options.position.lat - gap, _this3.options.position.lng + 0.0001 * _this3.options.scale / ratio, _this3.options.position.lat + gap];\n return (_Cesium$Rectangle = Cesium.Rectangle).fromDegrees.apply(_Cesium$Rectangle, fromDegreesArray);\n }, false);\n }\n this._elms.text && this._elms.text.forEach(function (item) {\n item.value = _this3.options.text;\n });\n }\n }, {\n key: \"angle\",\n get: function get() {\n return this.options.angle;\n },\n set: function set(v) {\n this.options.angle = v;\n this._elms.angle && this._elms.angle.forEach(function (item) {\n item.value = v;\n });\n }\n }, {\n key: \"scale\",\n get: function get() {\n return this.options.scale;\n },\n set: function set(v) {\n this.options.scale = v;\n this._elms.scale && this._elms.scale.forEach(function (item) {\n item.value = v;\n });\n }\n\n // get duration() {\n // return this.options.duration\n // }\n\n // set duration(v) {\n // this.options.duration = v\n // let canvas = this.getcanvas()\n // this.entity.rectangle.material = new Cesium.CustomMaterialSource({\n // image: canvas.toDataURL('image/png'),\n // color: this.options.color,\n // repeat: new Cesium.Cartesian2(1.0, 1.0),\n // duration: this.options.duration / this.options.speed,\n // fltr: false,\n // is2D: this.sdk.viewer.scene.mode === Cesium.SceneMode.SCENE2D ? true : false\n // })\n // this._elms.duration &&\n // this._elms.duration.forEach(item => {\n // item.value = v\n // })\n // }\n }, {\n key: \"speed\",\n get: function get() {\n return this.options.speed;\n },\n set: function set(v) {\n this.options.speed = v;\n var canvas = this.getcanvas();\n this.entity.rectangle.material = new Cesium.CustomMaterialSource({\n image: canvas.toDataURL('image/png'),\n color: this.options.color,\n repeat: new Cesium.Cartesian2(1.0, 1.0),\n duration: this.duration / this.options.speed,\n fltr: false,\n is2D: this.sdk.viewer.scene.mode === Cesium.SceneMode.SCENE2D ? true : false\n });\n this._elms.speed && this._elms.speed.forEach(function (item) {\n item.value = v;\n });\n }\n }, {\n key: \"color\",\n get: function get() {\n return this.options.color;\n },\n set: function set(v) {\n var _this4 = this;\n this.options.color = v;\n var canvas = this.getcanvas();\n this.entity.rectangle.material = new Cesium.CustomMaterialSource({\n image: canvas.toDataURL('image/png'),\n color: this.options.color,\n repeat: new Cesium.Cartesian2(1.0, 1.0),\n duration: this.duration / this.options.speed,\n fltr: false,\n is2D: this.sdk.viewer.scene.mode === Cesium.SceneMode.SCENE2D ? true : false\n });\n if (this._elms.color) {\n this._elms.color.forEach(function (item, i) {\n var colorPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: v,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(c) {\n _this4.color = c;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this4.color = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n _this4._elms.color[i] = colorPicker;\n });\n }\n }\n }, {\n key: \"create\",\n value: function create() {\n var _this5 = this;\n // let gap = Math.abs(Math.cos(Math.PI/180 * this.options.position.lat)) * (0.0001*this.options.scale)\n // let fromDegreesArray = [\n // this.options.position.lng - 0.05, this.options.position.lat - 0.05,\n // this.options.position.lng + 0.05, this.options.position.lat - 0.05,\n // this.options.position.lng + 0.05, this.options.position.lat + 0.05,\n // this.options.position.lng - 0.05, this.options.position.lat + 0.05,\n // ]\n var canvas = this.getcanvas();\n var ratio = canvas.height / canvas.width;\n this.entity = this.sdk.viewer.entities.add({\n id: this.options.id,\n show: this.options.show,\n rectangle: {\n coordinates: new Cesium.CallbackProperty(function () {\n var _Cesium$Rectangle2;\n var gap = Math.abs(Math.cos(Math.PI / 180 * _this5.options.position.lat)) * (0.0001 * _this5.options.scale);\n var fromDegreesArray = [_this5.options.position.lng - 0.0001 * _this5.options.scale / ratio, _this5.options.position.lat - gap,\n // this.options.position.lng + 0.05, this.options.position.lat - 0.05,\n _this5.options.position.lng + 0.0001 * _this5.options.scale / ratio, _this5.options.position.lat + gap\n // this.options.position.lng - 0.05, this.options.position.lat + 0.05,\n ];\n return (_Cesium$Rectangle2 = Cesium.Rectangle).fromDegrees.apply(_Cesium$Rectangle2, fromDegreesArray);\n }, false),\n material: new Cesium.CustomMaterialSource({\n image: canvas.toDataURL('image/png'),\n color: this.options.color,\n repeat: new Cesium.Cartesian2(1.0, 1.0),\n duration: this.duration / this.options.speed,\n fltr: false,\n is2D: this.sdk.viewer.scene.mode === Cesium.SceneMode.SCENE2D ? true : false\n }),\n rotation: new Cesium.CallbackProperty(function () {\n return Cesium.Math.toRadians(_this5.options.angle);\n }, false),\n stRotation: new Cesium.CallbackProperty(function () {\n return Cesium.Math.toRadians(_this5.options.angle);\n }, false)\n }\n });\n if (this.sdk.viewer._element.className === 'cesium-viewer 2d') {\n this.entity.rectangle.height = 10;\n }\n Object(_Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_14__[\"syncData\"])(this.sdk, this.options.id);\n if (this.options.show) {\n Object(_Global_SplitScreen__WEBPACK_IMPORTED_MODULE_16__[\"setSplitDirection\"])(0, this.options.id);\n }\n }\n\n // 编辑框\n }, {\n key: \"edit\",\n value: function () {\n var _edit = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee(state) {\n var _this6 = this;\n var _this, contentElm, all_elm, colorPicker;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee$(_context) {\n while (1) switch (_context.prev = _context.next) {\n case 0:\n _this = this;\n this.originalOptions = this.deepCopyObj(this.options);\n if (this._DialogObject && this._DialogObject.close) {\n this._DialogObject.close();\n this._DialogObject = null;\n }\n if (!state) {\n _context.next = 18;\n break;\n }\n _context.next = 6;\n return new _Element_Dialog__WEBPACK_IMPORTED_MODULE_9__[\"default\"](this.sdk, this.originalOptions, {\n title: '贴地文字属性',\n left: '180px',\n top: '100px',\n confirmCallBack: function confirmCallBack(options) {\n _this6.text = _this6.text.trim();\n if (!_this6.text) {\n _this6.text = '未命名对象';\n }\n _this6.originalOptions = _this6.deepCopyObj(_this6.options);\n _this6._DialogObject.close();\n _this6.Dialog.confirmCallBack && _this6.Dialog.confirmCallBack(_this6.originalOptions);\n Object(_Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_14__[\"syncData\"])(_this6.sdk, _this6.options.id);\n Object(_Global_SplitScreen__WEBPACK_IMPORTED_MODULE_16__[\"syncSplitData\"])(_this6.sdk, _this6.options.id);\n },\n resetCallBack: function resetCallBack() {\n _this6.reset();\n _this6.Dialog.resetCallBack && _this6.Dialog.resetCallBack();\n },\n removeCallBack: function removeCallBack() {\n _this6.Dialog.removeCallBack && _this6.Dialog.removeCallBack();\n },\n closeCallBack: function closeCallBack() {\n _this6.reset();\n _this6.positionEditing = false;\n // this.entity.style = new Cesium.Cesium3DTileStyle({\n // color: \"color('rgba(255,255,255,\" + this.newData.transparency + \")')\",\n // show: true,\n // });\n _this6.Dialog.closeCallBack && _this6.Dialog.closeCallBack();\n },\n showCallBack: function showCallBack(show) {\n _this6.show = show;\n _this6.Dialog.showCallBack && _this6.Dialog.showCallBack();\n },\n translationalCallBack: function translationalCallBack() {\n _this6.positionEditing = !_this6.positionEditing;\n }\n }, true);\n case 6:\n this._DialogObject = _context.sent;\n this._DialogObject._element.body.className = this._DialogObject._element.body.className + ' ground-text';\n contentElm = document.createElement('div');\n contentElm.innerHTML = Object(_element__WEBPACK_IMPORTED_MODULE_11__[\"html\"])();\n this._DialogObject.contentAppChild(contentElm);\n all_elm = contentElm.getElementsByTagName('*');\n this._EventBinding.on(this, all_elm);\n this._elms = this._EventBinding.element;\n\n // 颜色组件\n colorPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName('color')[0],\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: this.color,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this6.color = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this6.color = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n this._elms.color = [colorPicker];\n _context.next = 19;\n break;\n case 18:\n if (this._DialogObject && this._DialogObject.remove) {\n this._DialogObject.remove();\n this._DialogObject = null;\n }\n case 19:\n case \"end\":\n return _context.stop();\n }\n }, _callee, this);\n }));\n function edit(_x) {\n return _edit.apply(this, arguments);\n }\n return edit;\n }()\n /**@desc 打开平移功能\r\n *\r\n * @memberOf Source\r\n * @param status {boolean}\r\n *\r\n * */\n }, {\n key: \"positionEditing\",\n get: function get() {\n return this._positionEditing;\n },\n set: function set(status) {\n var _this7 = this;\n if (!this.sdk || !this.sdk.viewer || !this.entity) {\n return;\n }\n this._positionEditing = status;\n this.previous = {\n position: _objectSpread({}, this.options.position)\n };\n if (status === true) {\n this.tip && this.tip.destroy();\n this.tip = new _MouseTip__WEBPACK_IMPORTED_MODULE_15__[\"default\"]('点击鼠标左键确认,右键取消', this.sdk);\n this.event.mouse_move(function (movement, cartesian) {\n var position = _this7.cartesian3Towgs84(cartesian, _this7.sdk.viewer);\n _this7.lng = position.lng;\n _this7.lat = position.lat;\n _this7.tip.setPosition(cartesian, movement.endPosition.x, movement.endPosition.y);\n });\n this.event.mouse_left(function (movement, cartesian) {\n var position = _this7.cartesian3Towgs84(cartesian, _this7.sdk.viewer);\n _this7.lng = position.lng;\n _this7.lat = position.lat;\n _this7.event.mouse_move(function () {});\n _this7.event.mouse_left(function () {});\n _this7.event.mouse_right(function () {});\n _this7.event.gesture_pinck_start(function () {});\n _this7.event.gesture_pinck_end(function () {});\n _this7.positionEditing = false;\n });\n this.event.mouse_right(function (movement, cartesian) {\n _this7.lng = _this7.previous.position.lng;\n _this7.lat = _this7.previous.position.lat;\n _this7.positionEditing = false;\n });\n this.event.gesture_pinck_start(function (movement, cartesian) {\n var startTime = new Date();\n _this7.event.gesture_pinck_end(function () {\n var endTime = new Date();\n if (endTime - startTime >= 500) {\n // 长按取消\n _this7.lng = _this7.previous.position.lng;\n _this7.lat = _this7.previous.position.lat;\n _this7.positionEditing = false;\n } else {\n var position = _this7.cartesian3Towgs84(cartesian, _this7.sdk.viewer);\n _this7.lng = position.lng;\n _this7.lat = position.lat;\n _this7.event.mouse_move(function () {});\n _this7.event.mouse_left(function () {});\n _this7.event.mouse_right(function () {});\n _this7.event.gesture_pinck_start(function () {});\n _this7.event.gesture_pinck_end(function () {});\n _this7.positionEditing = false;\n }\n });\n });\n } else {\n if (this._positionEditingCallback) {\n this._positionEditingCallback();\n this._positionEditingCallback = null;\n }\n if (this.event) {\n this.event.mouse_move(function () {});\n this.event.mouse_left(function () {});\n this.event.mouse_right(function () {});\n this.event.gesture_pinck_start(function () {});\n this.event.gesture_pinck_end(function () {});\n }\n this.tip && this.tip.destroy();\n }\n }\n }, {\n key: \"openPositionEditing\",\n value: function openPositionEditing(cd) {\n this.positionEditing = true;\n this._positionEditingCallback = cd;\n }\n\n /**\r\n * 飞到\r\n */\n }, {\n key: \"flyTo\",\n value: (function () {\n var _flyTo = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee2() {\n var options,\n canvas,\n ratio,\n orientation,\n lng,\n lat,\n alt,\n destination,\n position,\n gap,\n fromDegreesArray,\n height,\n positionArray,\n i,\n _Cesium$Cartesian,\n a,\n BoundingSphere,\n _args2 = arguments;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee2$(_context2) {\n while (1) switch (_context2.prev = _context2.next) {\n case 0:\n options = _args2.length > 0 && _args2[0] !== undefined ? _args2[0] : {};\n canvas = this.getcanvas();\n ratio = canvas.height / canvas.width;\n Object(_Global_global__WEBPACK_IMPORTED_MODULE_17__[\"setActiveViewer\"])(0);\n Object(_Global_global__WEBPACK_IMPORTED_MODULE_17__[\"closeRotateAround\"])(this.sdk);\n Object(_Global_global__WEBPACK_IMPORTED_MODULE_17__[\"closeViewFollow\"])(this.sdk);\n if (!(this.options.customView && this.options.customView.relativePosition && this.options.customView.orientation)) {\n _context2.next = 25;\n break;\n }\n orientation = {\n heading: Cesium.Math.toRadians(this.options.customView.orientation.heading || 0.0),\n pitch: Cesium.Math.toRadians(this.options.customView.orientation.pitch || -60.0),\n roll: Cesium.Math.toRadians(this.options.customView.orientation.roll || 0.0)\n };\n lng = this.options.customView.relativePosition.lng;\n lat = this.options.customView.relativePosition.lat;\n alt = this.options.customView.relativePosition.alt;\n destination = Cesium.Cartesian3.fromDegrees(lng, lat, alt);\n position = {\n lng: 0,\n lat: 0\n };\n if (this.options.position) {\n position = _objectSpread({}, this.options.position);\n } else if (this.options.positions) {\n position = _objectSpread({}, this.options.positions[0]);\n } else if (this.options.center) {\n position = _objectSpread({}, this.options.center);\n } else if (this.options.start) {\n position = _objectSpread({}, this.options.start);\n } else {\n if (this.options.hasOwnProperty('lng')) {\n position.lng = this.options.lng;\n }\n if (this.options.hasOwnProperty('lat')) {\n position.lat = this.options.lat;\n }\n if (this.options.hasOwnProperty('alt')) {\n position.alt = this.options.alt;\n }\n }\n // 如果没有高度值,则获取紧贴高度计算\n if (position.hasOwnProperty('alt')) {\n _context2.next = 18;\n break;\n }\n _context2.next = 17;\n return this.getClampToHeight(position);\n case 17:\n position.alt = _context2.sent;\n case 18:\n lng = this.options.customView.relativePosition.lng + position.lng;\n lat = this.options.customView.relativePosition.lat + position.lat;\n alt = this.options.customView.relativePosition.alt + position.alt;\n destination = Cesium.Cartesian3.fromDegrees(lng, lat, alt);\n this.sdk.viewer.camera.flyTo({\n destination: destination,\n orientation: orientation\n });\n _context2.next = 34;\n break;\n case 25:\n gap = Math.abs(Math.cos(Math.PI / 180 * this.options.position.lat)) * (0.0001 * this.options.scale);\n fromDegreesArray = [[this.options.position.lng - 0.0001 * this.options.scale / ratio, this.options.position.lat - gap], [this.options.position.lng + 0.0001 * this.options.scale / ratio, this.options.position.lat + gap]];\n _context2.next = 29;\n return this.getClampToHeight(this.options.position);\n case 29:\n height = _context2.sent;\n positionArray = [];\n for (i = 0; i < fromDegreesArray.length; i++) {\n a = (_Cesium$Cartesian = Cesium.Cartesian3).fromDegrees.apply(_Cesium$Cartesian, _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default()(fromDegreesArray[i]).concat([height]));\n positionArray.push(a.x, a.y, a.z);\n }\n BoundingSphere = Cesium.BoundingSphere.fromVertices(positionArray);\n this.sdk.viewer.camera.flyToBoundingSphere(BoundingSphere, {\n offset: options.orientation || {\n heading: Cesium.Math.toRadians(0.0),\n pitch: Cesium.Math.toRadians(-90.0),\n roll: Cesium.Math.toRadians(0.0)\n }\n });\n case 34:\n case \"end\":\n return _context2.stop();\n }\n }, _callee2, this);\n }));\n function flyTo() {\n return _flyTo.apply(this, arguments);\n }\n return flyTo;\n }())\n }, {\n key: \"reset\",\n value: function reset() {\n if (!this.entity) {\n return;\n }\n this.options = this.deepCopyObj(this.originalOptions);\n this.text = this.originalOptions.text;\n this.angle = this.originalOptions.angle;\n this.scale = this.originalOptions.scale;\n this.color = this.originalOptions.color;\n }\n }, {\n key: \"remove\",\n value: function () {\n var _remove = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.mark(function _callee3() {\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_8___default.a.wrap(function _callee3$(_context3) {\n while (1) switch (_context3.prev = _context3.next) {\n case 0:\n this.event && this.event.destroy();\n this.tip && this.tip.destroy();\n this.sdk.viewer.entities.remove(this.entity);\n this.entity = null;\n if (this._DialogObject && !this._DialogObject.isDestroy) {\n this._DialogObject.close();\n this._DialogObject = null;\n }\n _context3.next = 7;\n return this.sdk.removeIncetance(this.options.id);\n case 7:\n _context3.next = 9;\n return Object(_Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_14__[\"syncData\"])(this.sdk, this.options.id);\n case 9:\n case \"end\":\n return _context3.stop();\n }\n }, _callee3, this);\n }));\n function remove() {\n return _remove.apply(this, arguments);\n }\n return remove;\n }()\n }, {\n key: \"getcanvas\",\n value: function getcanvas() {\n var canvas = document.createElement('canvas');\n var ctx = canvas.getContext('2d');\n var textArray = this.options.text.split('\\n');\n for (var i = 0; i < textArray.length; i++) {\n if (textArray[i].length > 80) {\n textArray[i] = textArray[i].slice(0, 80 - textArray[i].length);\n }\n }\n if (textArray.length > 70) {\n textArray.splice(70 - textArray.length);\n }\n this.options.text = textArray.join('\\n');\n var maxWidth = 0;\n for (var _i = 0; _i < textArray.length; _i++) {\n ctx.font = 200 + 'px serif';\n var width = ctx.measureText(textArray[_i]).width;\n if (maxWidth < width) {\n maxWidth = width;\n }\n }\n canvas.width = maxWidth;\n canvas.height = 220 * textArray.length;\n for (var _i2 = 0; _i2 < textArray.length; _i2++) {\n ctx.font = 200 + 'px serif';\n ctx.fillStyle = 'rgba(255, 255, 255, 0)';\n ctx.fillRect(0, 0, maxWidth + 30, 210);\n ctx.fillStyle = 'rgba(255, 255, 255, 1)';\n ctx.font = '200px serif';\n ctx.fillText(textArray[_i2], 0, 210 * (_i2 + 1));\n }\n return canvas;\n }\n }]);\n}(_index__WEBPACK_IMPORTED_MODULE_12__[\"default\"]);\n/* harmony default export */ __webpack_exports__[\"default\"] = (GroundText);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvT2JqL0Jhc2UvVGV4dE9iamVjdC9Hcm91bmRUZXh0L2luZGV4LmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL09iai9CYXNlL1RleHRPYmplY3QvR3JvdW5kVGV4dC9pbmRleC5qcz8xY2E2Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBEaWFsb2cgZnJvbSAnLi4vLi4vLi4vRWxlbWVudC9EaWFsb2cnXHJcbmltcG9ydCBFdmVudEJpbmRpbmcgZnJvbSAnLi4vLi4vLi4vRWxlbWVudC9EaWFsb2cvZXZlbnRCaW5kaW5nJ1xyXG5pbXBvcnQgeyBodG1sIH0gZnJvbSAnLi9fZWxlbWVudCdcclxuaW1wb3J0IEJhc2UgZnJvbSAnLi4vLi4vaW5kZXgnXHJcbmltcG9ydCBNb3VzZUV2ZW50IGZyb20gJy4uLy4uLy4uLy4uL0V2ZW50L2luZGV4J1xyXG5pbXBvcnQgeyBzeW5jRGF0YSB9IGZyb20gJy4uLy4uLy4uLy4uL0dsb2JhbC9NdWx0aVZpZXdwb3J0TW9kZSdcclxuaW1wb3J0IE1vdXNlVGlwIGZyb20gJy4uLy4uLy4uLy4uL01vdXNlVGlwJ1xyXG5pbXBvcnQgeyBzZXRTcGxpdERpcmVjdGlvbiwgc3luY1NwbGl0RGF0YSwgc2V0QWN0aXZlSWQgfSBmcm9tICcuLi8uLi8uLi8uLi9HbG9iYWwvU3BsaXRTY3JlZW4nXHJcbmltcG9ydCB7IHNldEFjdGl2ZVZpZXdlciwgY2xvc2VSb3RhdGVBcm91bmQsIGNsb3NlVmlld0ZvbGxvdyB9IGZyb20gJy4uLy4uLy4uLy4uL0dsb2JhbC9nbG9iYWwnXHJcblxyXG5jbGFzcyBHcm91bmRUZXh0IGV4dGVuZHMgQmFzZSB7XHJcbiAgLyoqXHJcbiAgICogQGNvbnN0cnVjdG9yXHJcbiAgICogQHBhcmFtIHNka1xyXG4gICAqIEBkZXNjcmlwdGlvbiDotLTlnLDmloflrZdcclxuICAgKiBAcGFyYW0gb3B0aW9ucyB7b2JqZWN0fSDlsZ7mgKdcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5pZCB7c3RyaW5nfSDllK/kuIDmoIfor4ZcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5zaG93PXRydWUge2Jvb2xlYW59IOaYvuekui/pmpDol49cclxuICAgKiBAcGFyYW0gb3B0aW9ucy50ZXh0IHtzdHJpbmd9IOaWh+Wtl1xyXG4gICAqIEBwYXJhbSBvcHRpb25zLmNvbG9yPSNGRkMxMDcge3N0cmluZ30g6aKc6ImyXHJcbiAgICogQHBhcmFtIG9wdGlvbnMuYW5nbGU9MCB7bnVtYmVyfSDml4vovazop5LluqZcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5zY2FsZT0xIHtudW1iZXJ9IOe8qeaUvuavlOS+i1xyXG4gICAqIEBwYXJhbSBvcHRpb25zLnNwZWVkPTEge251bWJlcn0g5paH5a2X5rua5Yqo6YCf5bqmXHJcbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMucG9zaXRpb24g5L2N572uXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9wdGlvbnMucG9zaXRpb24ubG5nIOe7j+W6plxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvcHRpb25zLnBvc2l0aW9uLmxhdCDnuqzluqZcclxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucy5wb3NpdGlvbnMg5Z2Q5qCH6ZuGW3tsb24sbGF0fV3ku4XlnKjmnKrlrprkuYkgcG9zaXRpb24g5pe25pyJ5pWIXHJcbiAgICogQHBhcmFtIG9wdGlvbnMucG9zaXRpb25zW10ubG5nIHtudW1iZXJ9IOe7j+W6plxyXG4gICAqIEBwYXJhbSBvcHRpb25zLnBvc2l0aW9uc1tdLmxhdCB7bnVtYmVyfSDnuqzluqZcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5jdXN0b21WaWV3IHtvYmplY3R9IOm7mOiupOinhuinklxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmN1c3RvbVZpZXcub3JpZW50YXRpb24ge29iamVjdH0g6buY6K6k6KeG6KeS5pa55L2NXHJcbiAgICogQHBhcmFtIG9wdGlvbnMuY3VzdG9tVmlldy5vcmllbnRhdGlvbi5oZWFkaW5nIHtudW1iZXJ9IOiIquWQkeinklxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmN1c3RvbVZpZXcub3JpZW50YXRpb24ucGl0Y2gge251bWJlcn0g5L+v5Luw6KeSXHJcbiAgICogQHBhcmFtIG9wdGlvbnMuY3VzdG9tVmlldy5vcmllbnRhdGlvbi5yb2xsIHtudW1iZXJ9IOe/u+a7muinklxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmN1c3RvbVZpZXcucmVsYXRpdmVQb3NpdGlvbiB7b2JqZWN0fSDop4bop5Lnm7jlr7nkvY3nva5cclxuICAgKiBAcGFyYW0gb3B0aW9ucy5jdXN0b21WaWV3LnJlbGF0aXZlUG9zaXRpb24ubG5nIHtudW1iZXJ9IOe7j+W6plxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmN1c3RvbVZpZXcucmVsYXRpdmVQb3NpdGlvbi5sYXQge251bWJlcn0g57qs5bqmXHJcbiAgICogQHBhcmFtIG9wdGlvbnMuY3VzdG9tVmlldy5yZWxhdGl2ZVBvc2l0aW9uLmFsdCB7bnVtYmVyfSDpq5jluqZcclxuICAgKiAqL1xyXG4gIGNvbnN0cnVjdG9yKHNkaywgb3B0aW9ucyA9IHt9LCBfRGlhbG9nID0ge30pIHtcclxuICAgIHN1cGVyKHNkaywgb3B0aW9ucylcclxuICAgIHRoaXMub3B0aW9ucy50ZXh0ID0gb3B0aW9ucy50ZXh0IHx8ICfmnKrlkb3lkI3lr7nosaEnXHJcbiAgICBsZXQgdGV4dEFycmF5ID0gdGhpcy5vcHRpb25zLnRleHQuc3BsaXQoJ1xcbicpXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRleHRBcnJheS5sZW5ndGg7IGkrKykge1xyXG4gICAgICBpZiAodGV4dEFycmF5W2ldLmxlbmd0aCA+IDgwKSB7XHJcbiAgICAgICAgdGV4dEFycmF5W2ldID0gdGV4dEFycmF5W2ldLnNsaWNlKDAsIDgwIC0gdGV4dEFycmF5W2ldLmxlbmd0aClcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKHRleHRBcnJheS5sZW5ndGggPiA3MCkge1xyXG4gICAgICB0ZXh0QXJyYXkuc3BsaWNlKDcwIC0gdGV4dEFycmF5Lmxlbmd0aClcclxuICAgIH1cclxuICAgIHRoaXMub3B0aW9ucy50ZXh0ID0gdGV4dEFycmF5LmpvaW4oJ1xcbicpXHJcbiAgICB0aGlzLm9wdGlvbnMuc2hvdyA9XHJcbiAgICAgIG9wdGlvbnMuc2hvdyB8fCBvcHRpb25zLnNob3cgPT09IGZhbHNlID8gb3B0aW9ucy5zaG93IDogdHJ1ZVxyXG4gICAgdGhpcy5vcHRpb25zLmFuZ2xlID0gb3B0aW9ucy5hbmdsZSB8fCAwXHJcbiAgICB0aGlzLm9wdGlvbnMuc2NhbGUgPVxyXG4gICAgICBvcHRpb25zLnNjYWxlIHx8IG9wdGlvbnMuc2NhbGUgPT09IDAgPyBvcHRpb25zLnNjYWxlIDogMVxyXG4gICAgLy8gdGhpcy5vcHRpb25zLmZvbnRTaXplID0gb3B0aW9ucy5mb250U2l6ZSB8fCAyMFxyXG4gICAgLy8gdGhpcy5vcHRpb25zLmR1cmF0aW9uID1cclxuICAgIC8vICAgb3B0aW9ucy5kdXJhdGlvbiB8fCBvcHRpb25zLmR1cmF0aW9uID09PSAwID8gb3B0aW9ucy5kdXJhdGlvbiA6IDUwMDAwXHJcbiAgICB0aGlzLm9wdGlvbnMuc3BlZWQgPVxyXG4gICAgICBvcHRpb25zLnNwZWVkIHx8IG9wdGlvbnMuc3BlZWQgPT09IDAgPyBvcHRpb25zLnNwZWVkIDogMVxyXG4gICAgdGhpcy5vcHRpb25zLmNvbG9yID0gb3B0aW9ucy5jb2xvciB8fCAnI0ZGQzEwNydcclxuICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbiA9IG9wdGlvbnMucG9zaXRpb25cclxuXHJcbiAgICBkZWxldGUgdGhpcy5vcHRpb25zLm5hbWVcclxuXHJcbiAgICBpZiAoIXRoaXMub3B0aW9ucy5wb3NpdGlvbiAmJiB0aGlzLm9wdGlvbnMucG9zaXRpb25zKSB7XHJcbiAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbiA9IHsgbG5nOiAodGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXS5sbmcgKyB0aGlzLm9wdGlvbnMucG9zaXRpb25zWzFdLmxuZykgLyAyLCBsYXQ6ICh0aGlzLm9wdGlvbnMucG9zaXRpb25zWzBdLmxhdCArIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMV0ubGF0KSAvIDIgfVxyXG4gICAgICBsZXQgcG9pbnQxID0gdHVyZi5wb2ludChbdGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXS5sbmcsIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0ubGF0XSk7XHJcbiAgICAgIGxldCBwb2ludDIgPSB0dXJmLnBvaW50KFt0aGlzLm9wdGlvbnMucG9zaXRpb25zWzFdLmxuZywgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1sxXS5sYXRdKTtcclxuXHJcbiAgICAgIGxldCBvcHRpb25zID0geyB1bml0czogJ21pbGVzJyB9O1xyXG4gICAgICBsZXQgZGlzdGFuY2UxID0gdHVyZi5yaHVtYkRpc3RhbmNlKHBvaW50MSwgcG9pbnQyLCBvcHRpb25zKTtcclxuXHJcblxyXG4gICAgICAvLyDorqHnrpfkuKTngrnkuI546L205q2j5pa55ZCR55qE5aS56KeS77yI5byn5bqm77yJXHJcbiAgICAgIGZ1bmN0aW9uIGNhbGN1bGF0ZUFuZ2xlKHBvaW50QSwgcG9pbnRCKSB7XHJcbiAgICAgICAgbGV0IGR4ID0gcG9pbnRCWzBdIC0gcG9pbnRBWzBdO1xyXG4gICAgICAgIGxldCBkeSA9IHBvaW50QlsxXSAtIHBvaW50QVsxXTtcclxuICAgICAgICByZXR1cm4gTWF0aC5hdGFuMihkeSwgZHgpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgYW5nbGVSYWRpYW5zID0gY2FsY3VsYXRlQW5nbGUoW3RoaXMub3B0aW9ucy5wb3NpdGlvbnNbMF0ubG5nLCB0aGlzLm9wdGlvbnMucG9zaXRpb25zWzBdLmxhdF0sIFt0aGlzLm9wdGlvbnMucG9zaXRpb25zWzFdLmxuZywgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1sxXS5sYXRdKTtcclxuICAgICAgdGhpcy5vcHRpb25zLmFuZ2xlID0gKDM2MCArIENlc2l1bS5NYXRoLnRvRGVncmVlcyhhbmdsZVJhZGlhbnMpKSAlIDM2MFxyXG5cclxuICAgICAgbGV0IGdhcCA9XHJcbiAgICAgICAgTWF0aC5hYnMoTWF0aC5jb3MoKE1hdGguUEkgLyAxODApICogdGhpcy5vcHRpb25zLnBvc2l0aW9uLmxhdCkpICpcclxuICAgICAgICAwLjAwMDFcclxuICAgICAgbGV0IGNhbnZhcyA9IHRoaXMuZ2V0Y2FudmFzKClcclxuICAgICAgbGV0IHJhdGlvID0gY2FudmFzLmhlaWdodCAvIGNhbnZhcy53aWR0aFxyXG4gICAgICBsZXQgbG5nMSA9IHRoaXMub3B0aW9ucy5wb3NpdGlvbi5sbmcgLSAwLjAwMDEgLyByYXRpb1xyXG4gICAgICBsZXQgbGF0MSA9IHRoaXMub3B0aW9ucy5wb3NpdGlvbi5sYXQgLSBnYXBcclxuICAgICAgbGV0IGxuZzIgPSB0aGlzLm9wdGlvbnMucG9zaXRpb24ubG5nICsgMC4wMDAxIC8gcmF0aW9cclxuICAgICAgbGV0IGxhdDIgPSB0aGlzLm9wdGlvbnMucG9zaXRpb24ubGF0ICsgZ2FwXHJcbiAgICAgIGxldCBsbmcgPSAobG5nMSArIGxuZzIpIC8gMlxyXG4gICAgICBsZXQgbGF0ID0gKGxhdDEgKyBsYXQyKSAvIDJcclxuXHJcbiAgICAgIGxldCBmcm9tID0gdHVyZi5wb2ludChbbG5nMSwgbGF0XSk7XHJcbiAgICAgIGxldCB0byA9IHR1cmYucG9pbnQoW2xuZzIsIGxhdF0pO1xyXG4gICAgICBsZXQgZGlzdGFuY2UyID0gdHVyZi5yaHVtYkRpc3RhbmNlKGZyb20sIHRvLCBvcHRpb25zKTtcclxuICAgICAgbGV0IGxhdFJhZGlhbnMgPSBDZXNpdW0uTWF0aC50b1JhZGlhbnModGhpcy5vcHRpb25zLnBvc2l0aW9uLmxhdClcclxuICAgICAgZGlzdGFuY2UyID0gZGlzdGFuY2UyICogKDEgKyAoTWF0aC5hYnMoTWF0aC5zaW4oYW5nbGVSYWRpYW5zKSAqIE1hdGgudGFuKGxhdFJhZGlhbnMpICogTWF0aC5zaW4obGF0UmFkaWFucykgKiBNYXRoLnNpbihsYXRSYWRpYW5zKSkpKVxyXG4gICAgICB0aGlzLm9wdGlvbnMuc2NhbGUgPSBkaXN0YW5jZTEgLyBkaXN0YW5jZTJcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmR1cmF0aW9uID0gNTAwMDBcclxuICAgIHRoaXMuZW50aXR5XHJcbiAgICB0aGlzLl9wb3NpdGlvbkVkaXRpbmcgPSBmYWxzZVxyXG4gICAgdGhpcy5EaWFsb2cgPSBfRGlhbG9nXHJcbiAgICB0aGlzLl9FdmVudEJpbmRpbmcgPSBuZXcgRXZlbnRCaW5kaW5nKClcclxuICAgIHRoaXMuX2VsbXMgPSB7fVxyXG4gICAgdGhpcy5wcmV2aW91cyA9IHtcclxuICAgICAgcG9zaXRpb246IHsgLi4udGhpcy5vcHRpb25zLnBvc2l0aW9uIH1cclxuICAgIH1cclxuICAgIHRoaXMuZXZlbnQgPSBuZXcgTW91c2VFdmVudCh0aGlzLnNkaylcclxuICAgIHRoaXMuc2RrLmFkZEluY2V0YW5jZSh0aGlzLm9wdGlvbnMuaWQsIHRoaXMpXHJcbiAgICB0aGlzLmNyZWF0ZSgpXHJcbiAgfVxyXG5cclxuICBnZXQgbG5nKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5wb3NpdGlvbi5sbmdcclxuICB9XHJcblxyXG4gIHNldCBsbmcodikge1xyXG4gICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uLmxuZyA9IHZcclxuICAgIHRoaXMuX2VsbXMubG5nICYmIHRoaXMuX2VsbXMubG5nLmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgaXRlbS52YWx1ZSA9IHZcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBnZXQgbGF0KCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5wb3NpdGlvbi5sYXRcclxuICB9XHJcblxyXG4gIHNldCBsYXQodikge1xyXG4gICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uLmxhdCA9IHZcclxuICAgIHRoaXMuX2VsbXMubGF0ICYmIHRoaXMuX2VsbXMubGF0LmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgaXRlbS52YWx1ZSA9IHZcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBnZXQgbmFtZSgpIHtcclxuICAgIHJldHVyblxyXG4gIH1cclxuICBnZXQgdGV4dCgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMudGV4dFxyXG4gIH1cclxuXHJcbiAgc2V0IHRleHQodikge1xyXG4gICAgdGhpcy5vcHRpb25zLnRleHQgPSB2XHJcbiAgICBsZXQgdGV4dEFycmF5ID0gdGhpcy5vcHRpb25zLnRleHQuc3BsaXQoJ1xcbicpXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRleHRBcnJheS5sZW5ndGg7IGkrKykge1xyXG4gICAgICBpZiAodGV4dEFycmF5W2ldLmxlbmd0aCA+IDgwKSB7XHJcbiAgICAgICAgbGV0IF9lcnJvciA9ICfooYzotoXov4c4MOS4quWtl+espizor7fmjInlm57ovabvvIhFbnRlcu+8ieWQju+8jOe7p+e7rei+k+WFpSdcclxuICAgICAgICB3aW5kb3cuRUxFTUVOVCAmJiB3aW5kb3cuRUxFTUVOVC5NZXNzYWdlKHtcclxuICAgICAgICAgIG1lc3NhZ2U6IF9lcnJvcixcclxuICAgICAgICAgIHR5cGU6ICd3YXJuaW5nJyxcclxuICAgICAgICAgIGR1cmF0aW9uOiAxMDAwXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGV4dEFycmF5W2ldID0gdGV4dEFycmF5W2ldLnNsaWNlKDAsIDgwIC0gdGV4dEFycmF5W2ldLmxlbmd0aClcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKHRleHRBcnJheS5sZW5ndGggPiA3MCkge1xyXG4gICAgICB0ZXh0QXJyYXkuc3BsaWNlKDcwIC0gdGV4dEFycmF5Lmxlbmd0aClcclxuICAgICAgbGV0IF9lcnJvciA9ICfotoXov4fmnIDlpKfovpPlhaXlrZfnrKYnXHJcbiAgICAgIHdpbmRvdy5FTEVNRU5UICYmIHdpbmRvdy5FTEVNRU5ULk1lc3NhZ2Uoe1xyXG4gICAgICAgIG1lc3NhZ2U6IF9lcnJvcixcclxuICAgICAgICB0eXBlOiAnd2FybmluZycsXHJcbiAgICAgICAgZHVyYXRpb246IDEwMDBcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLm9wdGlvbnMudGV4dCA9IHRleHRBcnJheS5qb2luKCdcXG4nKVxyXG4gICAgaWYgKHRoaXMuZW50aXR5KSB7XHJcbiAgICAgIGxldCBjYW52YXMgPSB0aGlzLmdldGNhbnZhcygpXHJcbiAgICAgIGxldCByYXRpbyA9IGNhbnZhcy5oZWlnaHQgLyBjYW52YXMud2lkdGhcclxuICAgICAgdGhpcy5lbnRpdHkucmVjdGFuZ2xlLm1hdGVyaWFsID0gbmV3IENlc2l1bS5DdXN0b21NYXRlcmlhbFNvdXJjZSh7XHJcbiAgICAgICAgaW1hZ2U6IGNhbnZhcy50b0RhdGFVUkwoJ2ltYWdlL3BuZycpLFxyXG4gICAgICAgIGNvbG9yOiB0aGlzLm9wdGlvbnMuY29sb3IsXHJcbiAgICAgICAgcmVwZWF0OiBuZXcgQ2VzaXVtLkNhcnRlc2lhbjIoMS4wLCAxLjApLFxyXG4gICAgICAgIGR1cmF0aW9uOiB0aGlzLmR1cmF0aW9uIC8gdGhpcy5vcHRpb25zLnNwZWVkLFxyXG4gICAgICAgIGZsdHI6IGZhbHNlLFxyXG4gICAgICAgIGlzMkQ6IHRoaXMuc2RrLnZpZXdlci5zY2VuZS5tb2RlID09PSBDZXNpdW0uU2NlbmVNb2RlLlNDRU5FMkQgPyB0cnVlIDogZmFsc2VcclxuICAgICAgfSlcclxuICAgICAgdGhpcy5lbnRpdHkucmVjdGFuZ2xlLmNvb3JkaW5hdGVzID0gbmV3IENlc2l1bS5DYWxsYmFja1Byb3BlcnR5KCgpID0+IHtcclxuICAgICAgICBsZXQgZ2FwID1cclxuICAgICAgICAgIE1hdGguYWJzKE1hdGguY29zKChNYXRoLlBJIC8gMTgwKSAqIHRoaXMub3B0aW9ucy5wb3NpdGlvbi5sYXQpKSAqXHJcbiAgICAgICAgICAoMC4wMDAxICogdGhpcy5vcHRpb25zLnNjYWxlKVxyXG4gICAgICAgIGxldCBmcm9tRGVncmVlc0FycmF5ID0gW1xyXG4gICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uLmxuZyAtICgwLjAwMDEgKiB0aGlzLm9wdGlvbnMuc2NhbGUpIC8gcmF0aW8sXHJcbiAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb24ubGF0IC0gZ2FwLFxyXG4gICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uLmxuZyArICgwLjAwMDEgKiB0aGlzLm9wdGlvbnMuc2NhbGUpIC8gcmF0aW8sXHJcbiAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb24ubGF0ICsgZ2FwXHJcbiAgICAgICAgXVxyXG4gICAgICAgIHJldHVybiBDZXNpdW0uUmVjdGFuZ2xlLmZyb21EZWdyZWVzKC4uLmZyb21EZWdyZWVzQXJyYXkpXHJcbiAgICAgIH0sIGZhbHNlKVxyXG4gICAgfVxyXG4gICAgdGhpcy5fZWxtcy50ZXh0ICYmXHJcbiAgICAgIHRoaXMuX2VsbXMudGV4dC5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgIGl0ZW0udmFsdWUgPSB0aGlzLm9wdGlvbnMudGV4dFxyXG4gICAgICB9KVxyXG4gIH1cclxuXHJcbiAgZ2V0IGFuZ2xlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5hbmdsZVxyXG4gIH1cclxuXHJcbiAgc2V0IGFuZ2xlKHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5hbmdsZSA9IHZcclxuICAgIHRoaXMuX2VsbXMuYW5nbGUgJiZcclxuICAgICAgdGhpcy5fZWxtcy5hbmdsZS5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgIGl0ZW0udmFsdWUgPSB2XHJcbiAgICAgIH0pXHJcbiAgfVxyXG5cclxuICBnZXQgc2NhbGUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLnNjYWxlXHJcbiAgfVxyXG5cclxuICBzZXQgc2NhbGUodikge1xyXG4gICAgdGhpcy5vcHRpb25zLnNjYWxlID0gdlxyXG4gICAgdGhpcy5fZWxtcy5zY2FsZSAmJlxyXG4gICAgICB0aGlzLl9lbG1zLnNjYWxlLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgaXRlbS52YWx1ZSA9IHZcclxuICAgICAgfSlcclxuICB9XHJcblxyXG4gIC8vIGdldCBkdXJhdGlvbigpIHtcclxuICAvLyAgIHJldHVybiB0aGlzLm9wdGlvbnMuZHVyYXRpb25cclxuICAvLyB9XHJcblxyXG4gIC8vIHNldCBkdXJhdGlvbih2KSB7XHJcbiAgLy8gICB0aGlzLm9wdGlvbnMuZHVyYXRpb24gPSB2XHJcbiAgLy8gICBsZXQgY2FudmFzID0gdGhpcy5nZXRjYW52YXMoKVxyXG4gIC8vICAgdGhpcy5lbnRpdHkucmVjdGFuZ2xlLm1hdGVyaWFsID0gbmV3IENlc2l1bS5DdXN0b21NYXRlcmlhbFNvdXJjZSh7XHJcbiAgLy8gICAgIGltYWdlOiBjYW52YXMudG9EYXRhVVJMKCdpbWFnZS9wbmcnKSxcclxuICAvLyAgICAgY29sb3I6IHRoaXMub3B0aW9ucy5jb2xvcixcclxuICAvLyAgICAgcmVwZWF0OiBuZXcgQ2VzaXVtLkNhcnRlc2lhbjIoMS4wLCAxLjApLFxyXG4gIC8vICAgICBkdXJhdGlvbjogdGhpcy5vcHRpb25zLmR1cmF0aW9uIC8gdGhpcy5vcHRpb25zLnNwZWVkLFxyXG4gIC8vICAgICBmbHRyOiBmYWxzZSxcclxuICAvLyAgICAgaXMyRDogdGhpcy5zZGsudmlld2VyLnNjZW5lLm1vZGUgPT09IENlc2l1bS5TY2VuZU1vZGUuU0NFTkUyRCA/IHRydWUgOiBmYWxzZVxyXG4gIC8vICAgfSlcclxuICAvLyAgIHRoaXMuX2VsbXMuZHVyYXRpb24gJiZcclxuICAvLyAgICAgdGhpcy5fZWxtcy5kdXJhdGlvbi5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gIC8vICAgICAgIGl0ZW0udmFsdWUgPSB2XHJcbiAgLy8gICAgIH0pXHJcbiAgLy8gfVxyXG4gIGdldCBzcGVlZCgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuc3BlZWRcclxuICB9XHJcblxyXG4gIHNldCBzcGVlZCh2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMuc3BlZWQgPSB2XHJcbiAgICBsZXQgY2FudmFzID0gdGhpcy5nZXRjYW52YXMoKVxyXG4gICAgdGhpcy5lbnRpdHkucmVjdGFuZ2xlLm1hdGVyaWFsID0gbmV3IENlc2l1bS5DdXN0b21NYXRlcmlhbFNvdXJjZSh7XHJcbiAgICAgIGltYWdlOiBjYW52YXMudG9EYXRhVVJMKCdpbWFnZS9wbmcnKSxcclxuICAgICAgY29sb3I6IHRoaXMub3B0aW9ucy5jb2xvcixcclxuICAgICAgcmVwZWF0OiBuZXcgQ2VzaXVtLkNhcnRlc2lhbjIoMS4wLCAxLjApLFxyXG4gICAgICBkdXJhdGlvbjogdGhpcy5kdXJhdGlvbiAvIHRoaXMub3B0aW9ucy5zcGVlZCxcclxuICAgICAgZmx0cjogZmFsc2UsXHJcbiAgICAgIGlzMkQ6IHRoaXMuc2RrLnZpZXdlci5zY2VuZS5tb2RlID09PSBDZXNpdW0uU2NlbmVNb2RlLlNDRU5FMkQgPyB0cnVlIDogZmFsc2VcclxuICAgIH0pXHJcbiAgICB0aGlzLl9lbG1zLnNwZWVkICYmXHJcbiAgICAgIHRoaXMuX2VsbXMuc3BlZWQuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICBpdGVtLnZhbHVlID0gdlxyXG4gICAgICB9KVxyXG4gIH1cclxuXHJcbiAgZ2V0IGNvbG9yKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5jb2xvclxyXG4gIH1cclxuICBzZXQgY29sb3Iodikge1xyXG4gICAgdGhpcy5vcHRpb25zLmNvbG9yID0gdlxyXG4gICAgbGV0IGNhbnZhcyA9IHRoaXMuZ2V0Y2FudmFzKClcclxuICAgIHRoaXMuZW50aXR5LnJlY3RhbmdsZS5tYXRlcmlhbCA9IG5ldyBDZXNpdW0uQ3VzdG9tTWF0ZXJpYWxTb3VyY2Uoe1xyXG4gICAgICBpbWFnZTogY2FudmFzLnRvRGF0YVVSTCgnaW1hZ2UvcG5nJyksXHJcbiAgICAgIGNvbG9yOiB0aGlzLm9wdGlvbnMuY29sb3IsXHJcbiAgICAgIHJlcGVhdDogbmV3IENlc2l1bS5DYXJ0ZXNpYW4yKDEuMCwgMS4wKSxcclxuICAgICAgZHVyYXRpb246IHRoaXMuZHVyYXRpb24gLyB0aGlzLm9wdGlvbnMuc3BlZWQsXHJcbiAgICAgIGZsdHI6IGZhbHNlLFxyXG4gICAgICBpczJEOiB0aGlzLnNkay52aWV3ZXIuc2NlbmUubW9kZSA9PT0gQ2VzaXVtLlNjZW5lTW9kZS5TQ0VORTJEID8gdHJ1ZSA6IGZhbHNlXHJcbiAgICB9KVxyXG4gICAgaWYgKHRoaXMuX2VsbXMuY29sb3IpIHtcclxuICAgICAgdGhpcy5fZWxtcy5jb2xvci5mb3JFYWNoKChpdGVtLCBpKSA9PiB7XHJcbiAgICAgICAgbGV0IGNvbG9yUGlja2VyID0gbmV3IFlKQ29sb3JQaWNrZXIoe1xyXG4gICAgICAgICAgZWw6IGl0ZW0uZWwsXHJcbiAgICAgICAgICBzaXplOiAnbWluaScsIC8v6aKc6ImyYm9457G75Z6LXHJcbiAgICAgICAgICBhbHBoYTogdHJ1ZSwgLy/mmK/lkKblvIDlkK/pgI/mmI7luqZcclxuICAgICAgICAgIGRlZmF1bHRDb2xvcjogdixcclxuICAgICAgICAgIGRpc2FibGVkOiBmYWxzZSwgLy/mmK/lkKbnpoHmraLmiZPlvIDpopzoibLpgInmi6nlmahcclxuICAgICAgICAgIG9wZW5QaWNrZXJBbmk6ICdvcGFjaXR5JywgLy/miZPlvIDpopzoibLpgInmi6nlmajliqjnlLtcclxuICAgICAgICAgIHN1cmU6IGMgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmNvbG9yID0gY1xyXG4gICAgICAgICAgfSwgLy/ngrnlh7vnoa7orqTmjInpkq7kuovku7blm57osINcclxuICAgICAgICAgIGNsZWFyOiAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuY29sb3IgPSAncmdiYSgyNTUsMjU1LDI1NSwxKSdcclxuICAgICAgICAgIH0gLy/ngrnlh7vmuIXnqbrmjInpkq7kuovku7blm57osINcclxuICAgICAgICB9KVxyXG4gICAgICAgIHRoaXMuX2VsbXMuY29sb3JbaV0gPSBjb2xvclBpY2tlclxyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY3JlYXRlKCkge1xyXG4gICAgLy8gbGV0IGdhcCA9IE1hdGguYWJzKE1hdGguY29zKE1hdGguUEkvMTgwICogdGhpcy5vcHRpb25zLnBvc2l0aW9uLmxhdCkpICogKDAuMDAwMSp0aGlzLm9wdGlvbnMuc2NhbGUpXHJcbiAgICAvLyBsZXQgZnJvbURlZ3JlZXNBcnJheSA9IFtcclxuICAgIC8vICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uLmxuZyAtIDAuMDUsIHRoaXMub3B0aW9ucy5wb3NpdGlvbi5sYXQgLSAwLjA1LFxyXG4gICAgLy8gICB0aGlzLm9wdGlvbnMucG9zaXRpb24ubG5nICsgMC4wNSwgdGhpcy5vcHRpb25zLnBvc2l0aW9uLmxhdCAtIDAuMDUsXHJcbiAgICAvLyAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbi5sbmcgKyAwLjA1LCB0aGlzLm9wdGlvbnMucG9zaXRpb24ubGF0ICsgMC4wNSxcclxuICAgIC8vICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uLmxuZyAtIDAuMDUsIHRoaXMub3B0aW9ucy5wb3NpdGlvbi5sYXQgKyAwLjA1LFxyXG4gICAgLy8gXVxyXG4gICAgbGV0IGNhbnZhcyA9IHRoaXMuZ2V0Y2FudmFzKClcclxuICAgIGxldCByYXRpbyA9IGNhbnZhcy5oZWlnaHQgLyBjYW52YXMud2lkdGhcclxuXHJcbiAgICB0aGlzLmVudGl0eSA9IHRoaXMuc2RrLnZpZXdlci5lbnRpdGllcy5hZGQoe1xyXG4gICAgICBpZDogdGhpcy5vcHRpb25zLmlkLFxyXG4gICAgICBzaG93OiB0aGlzLm9wdGlvbnMuc2hvdyxcclxuICAgICAgcmVjdGFuZ2xlOiB7XHJcbiAgICAgICAgY29vcmRpbmF0ZXM6IG5ldyBDZXNpdW0uQ2FsbGJhY2tQcm9wZXJ0eSgoKSA9PiB7XHJcbiAgICAgICAgICBsZXQgZ2FwID1cclxuICAgICAgICAgICAgTWF0aC5hYnMoTWF0aC5jb3MoKE1hdGguUEkgLyAxODApICogdGhpcy5vcHRpb25zLnBvc2l0aW9uLmxhdCkpICpcclxuICAgICAgICAgICAgKDAuMDAwMSAqIHRoaXMub3B0aW9ucy5zY2FsZSlcclxuICAgICAgICAgIGxldCBmcm9tRGVncmVlc0FycmF5ID0gW1xyXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb24ubG5nIC0gKDAuMDAwMSAqIHRoaXMub3B0aW9ucy5zY2FsZSkgLyByYXRpbyxcclxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uLmxhdCAtIGdhcCxcclxuICAgICAgICAgICAgLy8gdGhpcy5vcHRpb25zLnBvc2l0aW9uLmxuZyArIDAuMDUsIHRoaXMub3B0aW9ucy5wb3NpdGlvbi5sYXQgLSAwLjA1LFxyXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb24ubG5nICsgKDAuMDAwMSAqIHRoaXMub3B0aW9ucy5zY2FsZSkgLyByYXRpbyxcclxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uLmxhdCArIGdhcFxyXG4gICAgICAgICAgICAvLyB0aGlzLm9wdGlvbnMucG9zaXRpb24ubG5nIC0gMC4wNSwgdGhpcy5vcHRpb25zLnBvc2l0aW9uLmxhdCArIDAuMDUsXHJcbiAgICAgICAgICBdXHJcbiAgICAgICAgICByZXR1cm4gQ2VzaXVtLlJlY3RhbmdsZS5mcm9tRGVncmVlcyguLi5mcm9tRGVncmVlc0FycmF5KVxyXG4gICAgICAgIH0sIGZhbHNlKSxcclxuICAgICAgICBtYXRlcmlhbDogbmV3IENlc2l1bS5DdXN0b21NYXRlcmlhbFNvdXJjZSh7XHJcbiAgICAgICAgICBpbWFnZTogY2FudmFzLnRvRGF0YVVSTCgnaW1hZ2UvcG5nJyksXHJcbiAgICAgICAgICBjb2xvcjogdGhpcy5vcHRpb25zLmNvbG9yLFxyXG4gICAgICAgICAgcmVwZWF0OiBuZXcgQ2VzaXVtLkNhcnRlc2lhbjIoMS4wLCAxLjApLFxyXG4gICAgICAgICAgZHVyYXRpb246IHRoaXMuZHVyYXRpb24gLyB0aGlzLm9wdGlvbnMuc3BlZWQsXHJcbiAgICAgICAgICBmbHRyOiBmYWxzZSxcclxuICAgICAgICAgIGlzMkQ6IHRoaXMuc2RrLnZpZXdlci5zY2VuZS5tb2RlID09PSBDZXNpdW0uU2NlbmVNb2RlLlNDRU5FMkQgPyB0cnVlIDogZmFsc2VcclxuICAgICAgICB9KSxcclxuICAgICAgICByb3RhdGlvbjogbmV3IENlc2l1bS5DYWxsYmFja1Byb3BlcnR5KCgpID0+IHtcclxuICAgICAgICAgIHJldHVybiBDZXNpdW0uTWF0aC50b1JhZGlhbnModGhpcy5vcHRpb25zLmFuZ2xlKVxyXG4gICAgICAgIH0sIGZhbHNlKSxcclxuICAgICAgICBzdFJvdGF0aW9uOiBuZXcgQ2VzaXVtLkNhbGxiYWNrUHJvcGVydHkoKCkgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIENlc2l1bS5NYXRoLnRvUmFkaWFucyh0aGlzLm9wdGlvbnMuYW5nbGUpXHJcbiAgICAgICAgfSwgZmFsc2UpXHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgICBpZiAodGhpcy5zZGsudmlld2VyLl9lbGVtZW50LmNsYXNzTmFtZSA9PT0gJ2Nlc2l1bS12aWV3ZXIgMmQnKSB7XHJcbiAgICAgIHRoaXMuZW50aXR5LnJlY3RhbmdsZS5oZWlnaHQgPSAxMFxyXG4gICAgfVxyXG4gICAgc3luY0RhdGEodGhpcy5zZGssIHRoaXMub3B0aW9ucy5pZClcclxuICAgIGlmICh0aGlzLm9wdGlvbnMuc2hvdykge1xyXG5cclxuICAgICAgc2V0U3BsaXREaXJlY3Rpb24oMCwgdGhpcy5vcHRpb25zLmlkKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8g57yW6L6R5qGGXHJcbiAgYXN5bmMgZWRpdChzdGF0ZSkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpc1xyXG4gICAgdGhpcy5vcmlnaW5hbE9wdGlvbnMgPSB0aGlzLmRlZXBDb3B5T2JqKHRoaXMub3B0aW9ucylcclxuICAgIGlmICh0aGlzLl9EaWFsb2dPYmplY3QgJiYgdGhpcy5fRGlhbG9nT2JqZWN0LmNsb3NlKSB7XHJcbiAgICAgIHRoaXMuX0RpYWxvZ09iamVjdC5jbG9zZSgpXHJcbiAgICAgIHRoaXMuX0RpYWxvZ09iamVjdCA9IG51bGxcclxuICAgIH1cclxuICAgIGlmIChzdGF0ZSkge1xyXG5cclxuICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0ID0gYXdhaXQgbmV3IERpYWxvZyhcclxuICAgICAgICB0aGlzLnNkayxcclxuICAgICAgICB0aGlzLm9yaWdpbmFsT3B0aW9ucyxcclxuICAgICAgICB7XHJcbiAgICAgICAgICB0aXRsZTogJ+i0tOWcsOaWh+Wtl+WxnuaApycsXHJcbiAgICAgICAgICBsZWZ0OiAnMTgwcHgnLFxyXG4gICAgICAgICAgdG9wOiAnMTAwcHgnLFxyXG4gICAgICAgICAgY29uZmlybUNhbGxCYWNrOiBvcHRpb25zID0+IHtcclxuICAgICAgICAgICAgdGhpcy50ZXh0ID0gdGhpcy50ZXh0LnRyaW0oKVxyXG4gICAgICAgICAgICBpZiAoIXRoaXMudGV4dCkge1xyXG4gICAgICAgICAgICAgIHRoaXMudGV4dCA9ICfmnKrlkb3lkI3lr7nosaEnXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5vcmlnaW5hbE9wdGlvbnMgPSB0aGlzLmRlZXBDb3B5T2JqKHRoaXMub3B0aW9ucylcclxuICAgICAgICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0LmNsb3NlKClcclxuICAgICAgICAgICAgdGhpcy5EaWFsb2cuY29uZmlybUNhbGxCYWNrICYmXHJcbiAgICAgICAgICAgICAgdGhpcy5EaWFsb2cuY29uZmlybUNhbGxCYWNrKHRoaXMub3JpZ2luYWxPcHRpb25zKVxyXG4gICAgICAgICAgICBzeW5jRGF0YSh0aGlzLnNkaywgdGhpcy5vcHRpb25zLmlkKVxyXG4gICAgICAgICAgICBzeW5jU3BsaXREYXRhKHRoaXMuc2RrLCB0aGlzLm9wdGlvbnMuaWQpXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgcmVzZXRDYWxsQmFjazogKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnJlc2V0KClcclxuICAgICAgICAgICAgdGhpcy5EaWFsb2cucmVzZXRDYWxsQmFjayAmJiB0aGlzLkRpYWxvZy5yZXNldENhbGxCYWNrKClcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICByZW1vdmVDYWxsQmFjazogKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLkRpYWxvZy5yZW1vdmVDYWxsQmFjayAmJiB0aGlzLkRpYWxvZy5yZW1vdmVDYWxsQmFjaygpXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgY2xvc2VDYWxsQmFjazogKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnJlc2V0KClcclxuICAgICAgICAgICAgdGhpcy5wb3NpdGlvbkVkaXRpbmcgPSBmYWxzZVxyXG4gICAgICAgICAgICAvLyB0aGlzLmVudGl0eS5zdHlsZSA9IG5ldyBDZXNpdW0uQ2VzaXVtM0RUaWxlU3R5bGUoe1xyXG4gICAgICAgICAgICAvLyAgIGNvbG9yOiBcImNvbG9yKCdyZ2JhKDI1NSwyNTUsMjU1LFwiICsgdGhpcy5uZXdEYXRhLnRyYW5zcGFyZW5jeSArIFwiKScpXCIsXHJcbiAgICAgICAgICAgIC8vICAgc2hvdzogdHJ1ZSxcclxuICAgICAgICAgICAgLy8gfSk7XHJcbiAgICAgICAgICAgIHRoaXMuRGlhbG9nLmNsb3NlQ2FsbEJhY2sgJiYgdGhpcy5EaWFsb2cuY2xvc2VDYWxsQmFjaygpXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgc2hvd0NhbGxCYWNrOiBzaG93ID0+IHtcclxuICAgICAgICAgICAgdGhpcy5zaG93ID0gc2hvd1xyXG4gICAgICAgICAgICB0aGlzLkRpYWxvZy5zaG93Q2FsbEJhY2sgJiYgdGhpcy5EaWFsb2cuc2hvd0NhbGxCYWNrKClcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB0cmFuc2xhdGlvbmFsQ2FsbEJhY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5wb3NpdGlvbkVkaXRpbmcgPSAhdGhpcy5wb3NpdGlvbkVkaXRpbmdcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIHRydWVcclxuICAgICAgKVxyXG4gICAgICB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuYm9keS5jbGFzc05hbWUgPSB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuYm9keS5jbGFzc05hbWUgKyAnIGdyb3VuZC10ZXh0J1xyXG4gICAgICBsZXQgY29udGVudEVsbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpXHJcbiAgICAgIGNvbnRlbnRFbG0uaW5uZXJIVE1MID0gaHRtbCgpXHJcbiAgICAgIHRoaXMuX0RpYWxvZ09iamVjdC5jb250ZW50QXBwQ2hpbGQoY29udGVudEVsbSlcclxuICAgICAgbGV0IGFsbF9lbG0gPSBjb250ZW50RWxtLmdldEVsZW1lbnRzQnlUYWdOYW1lKCcqJylcclxuICAgICAgdGhpcy5fRXZlbnRCaW5kaW5nLm9uKHRoaXMsIGFsbF9lbG0pXHJcbiAgICAgIHRoaXMuX2VsbXMgPSB0aGlzLl9FdmVudEJpbmRpbmcuZWxlbWVudFxyXG5cclxuICAgICAgLy8g6aKc6Imy57uE5Lu2XHJcbiAgICAgIGxldCBjb2xvclBpY2tlciA9IG5ldyBZSkNvbG9yUGlja2VyKHtcclxuICAgICAgICBlbDogY29udGVudEVsbS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdjb2xvcicpWzBdLFxyXG4gICAgICAgIHNpemU6ICdtaW5pJywgLy/popzoibJib3jnsbvlnotcclxuICAgICAgICBhbHBoYTogdHJ1ZSwgLy/mmK/lkKblvIDlkK/pgI/mmI7luqZcclxuICAgICAgICBkZWZhdWx0Q29sb3I6IHRoaXMuY29sb3IsXHJcbiAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLCAvL+aYr+WQpuemgeatouaJk+W8gOminOiJsumAieaLqeWZqFxyXG4gICAgICAgIG9wZW5QaWNrZXJBbmk6ICdvcGFjaXR5JywgLy/miZPlvIDpopzoibLpgInmi6nlmajliqjnlLtcclxuICAgICAgICBzdXJlOiBjb2xvciA9PiB7XHJcbiAgICAgICAgICB0aGlzLmNvbG9yID0gY29sb3JcclxuICAgICAgICB9LCAvL+eCueWHu+ehruiupOaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICAgIGNsZWFyOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmNvbG9yID0gJ3JnYmEoMjU1LDI1NSwyNTUsMSknXHJcbiAgICAgICAgfSAvL+eCueWHu+a4heepuuaMiemSruS6i+S7tuWbnuiwg1xyXG4gICAgICB9KVxyXG4gICAgICB0aGlzLl9lbG1zLmNvbG9yID0gW2NvbG9yUGlja2VyXVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKHRoaXMuX0RpYWxvZ09iamVjdCAmJiB0aGlzLl9EaWFsb2dPYmplY3QucmVtb3ZlKSB7XHJcbiAgICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0LnJlbW92ZSgpXHJcbiAgICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0ID0gbnVsbFxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipAZGVzYyDmiZPlvIDlubPnp7vlip/og71cclxuICAgKlxyXG4gICAqIEBtZW1iZXJPZiBTb3VyY2VcclxuICAgKiBAcGFyYW0gc3RhdHVzIHtib29sZWFufVxyXG4gICAqXHJcbiAgICogKi9cclxuICBzZXQgcG9zaXRpb25FZGl0aW5nKHN0YXR1cykge1xyXG4gICAgaWYgKCF0aGlzLnNkayB8fCAhdGhpcy5zZGsudmlld2VyIHx8ICF0aGlzLmVudGl0eSkge1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuICAgIHRoaXMuX3Bvc2l0aW9uRWRpdGluZyA9IHN0YXR1c1xyXG4gICAgdGhpcy5wcmV2aW91cyA9IHtcclxuICAgICAgcG9zaXRpb246IHsgLi4udGhpcy5vcHRpb25zLnBvc2l0aW9uIH1cclxuICAgIH1cclxuICAgIGlmIChzdGF0dXMgPT09IHRydWUpIHtcclxuICAgICAgdGhpcy50aXAgJiYgdGhpcy50aXAuZGVzdHJveSgpXHJcbiAgICAgIHRoaXMudGlwID0gbmV3IE1vdXNlVGlwKCfngrnlh7vpvKDmoIflt6bplK7noa7orqTvvIzlj7PplK7lj5bmtognLCB0aGlzLnNkaylcclxuICAgICAgdGhpcy5ldmVudC5tb3VzZV9tb3ZlKChtb3ZlbWVudCwgY2FydGVzaWFuKSA9PiB7XHJcbiAgICAgICAgbGV0IHBvc2l0aW9uID0gdGhpcy5jYXJ0ZXNpYW4zVG93Z3M4NChjYXJ0ZXNpYW4sIHRoaXMuc2RrLnZpZXdlcilcclxuICAgICAgICB0aGlzLmxuZyA9IHBvc2l0aW9uLmxuZ1xyXG4gICAgICAgIHRoaXMubGF0ID0gcG9zaXRpb24ubGF0XHJcbiAgICAgICAgdGhpcy50aXAuc2V0UG9zaXRpb24oXHJcbiAgICAgICAgICBjYXJ0ZXNpYW4sXHJcbiAgICAgICAgICBtb3ZlbWVudC5lbmRQb3NpdGlvbi54LFxyXG4gICAgICAgICAgbW92ZW1lbnQuZW5kUG9zaXRpb24ueVxyXG4gICAgICAgIClcclxuICAgICAgfSlcclxuICAgICAgdGhpcy5ldmVudC5tb3VzZV9sZWZ0KChtb3ZlbWVudCwgY2FydGVzaWFuKSA9PiB7XHJcbiAgICAgICAgbGV0IHBvc2l0aW9uID0gdGhpcy5jYXJ0ZXNpYW4zVG93Z3M4NChjYXJ0ZXNpYW4sIHRoaXMuc2RrLnZpZXdlcilcclxuICAgICAgICB0aGlzLmxuZyA9IHBvc2l0aW9uLmxuZ1xyXG4gICAgICAgIHRoaXMubGF0ID0gcG9zaXRpb24ubGF0XHJcbiAgICAgICAgdGhpcy5ldmVudC5tb3VzZV9tb3ZlKCgpID0+IHsgfSlcclxuICAgICAgICB0aGlzLmV2ZW50Lm1vdXNlX2xlZnQoKCkgPT4geyB9KVxyXG4gICAgICAgIHRoaXMuZXZlbnQubW91c2VfcmlnaHQoKCkgPT4geyB9KVxyXG4gICAgICAgIHRoaXMuZXZlbnQuZ2VzdHVyZV9waW5ja19zdGFydCgoKSA9PiB7IH0pXHJcbiAgICAgICAgdGhpcy5ldmVudC5nZXN0dXJlX3BpbmNrX2VuZCgoKSA9PiB7IH0pXHJcbiAgICAgICAgdGhpcy5wb3NpdGlvbkVkaXRpbmcgPSBmYWxzZVxyXG4gICAgICB9KVxyXG4gICAgICB0aGlzLmV2ZW50Lm1vdXNlX3JpZ2h0KChtb3ZlbWVudCwgY2FydGVzaWFuKSA9PiB7XHJcbiAgICAgICAgdGhpcy5sbmcgPSB0aGlzLnByZXZpb3VzLnBvc2l0aW9uLmxuZ1xyXG4gICAgICAgIHRoaXMubGF0ID0gdGhpcy5wcmV2aW91cy5wb3NpdGlvbi5sYXRcclxuICAgICAgICB0aGlzLnBvc2l0aW9uRWRpdGluZyA9IGZhbHNlXHJcbiAgICAgIH0pXHJcblxyXG4gICAgICB0aGlzLmV2ZW50Lmdlc3R1cmVfcGluY2tfc3RhcnQoKG1vdmVtZW50LCBjYXJ0ZXNpYW4pID0+IHtcclxuICAgICAgICBsZXQgc3RhcnRUaW1lID0gbmV3IERhdGUoKVxyXG4gICAgICAgIHRoaXMuZXZlbnQuZ2VzdHVyZV9waW5ja19lbmQoKCkgPT4ge1xyXG4gICAgICAgICAgbGV0IGVuZFRpbWUgPSBuZXcgRGF0ZSgpXHJcbiAgICAgICAgICBpZiAoZW5kVGltZSAtIHN0YXJ0VGltZSA+PSA1MDApIHtcclxuICAgICAgICAgICAgLy8g6ZW/5oyJ5Y+W5raIXHJcbiAgICAgICAgICAgIHRoaXMubG5nID0gdGhpcy5wcmV2aW91cy5wb3NpdGlvbi5sbmdcclxuICAgICAgICAgICAgdGhpcy5sYXQgPSB0aGlzLnByZXZpb3VzLnBvc2l0aW9uLmxhdFxyXG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uRWRpdGluZyA9IGZhbHNlXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgbGV0IHBvc2l0aW9uID0gdGhpcy5jYXJ0ZXNpYW4zVG93Z3M4NChjYXJ0ZXNpYW4sIHRoaXMuc2RrLnZpZXdlcilcclxuICAgICAgICAgICAgdGhpcy5sbmcgPSBwb3NpdGlvbi5sbmdcclxuICAgICAgICAgICAgdGhpcy5sYXQgPSBwb3NpdGlvbi5sYXRcclxuICAgICAgICAgICAgdGhpcy5ldmVudC5tb3VzZV9tb3ZlKCgpID0+IHsgfSlcclxuICAgICAgICAgICAgdGhpcy5ldmVudC5tb3VzZV9sZWZ0KCgpID0+IHsgfSlcclxuICAgICAgICAgICAgdGhpcy5ldmVudC5tb3VzZV9yaWdodCgoKSA9PiB7IH0pXHJcbiAgICAgICAgICAgIHRoaXMuZXZlbnQuZ2VzdHVyZV9waW5ja19zdGFydCgoKSA9PiB7IH0pXHJcbiAgICAgICAgICAgIHRoaXMuZXZlbnQuZ2VzdHVyZV9waW5ja19lbmQoKCkgPT4geyB9KVxyXG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uRWRpdGluZyA9IGZhbHNlXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgfSlcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmICh0aGlzLl9wb3NpdGlvbkVkaXRpbmdDYWxsYmFjaykge1xyXG4gICAgICAgIHRoaXMuX3Bvc2l0aW9uRWRpdGluZ0NhbGxiYWNrKClcclxuICAgICAgICB0aGlzLl9wb3NpdGlvbkVkaXRpbmdDYWxsYmFjayA9IG51bGxcclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy5ldmVudCkge1xyXG4gICAgICAgIHRoaXMuZXZlbnQubW91c2VfbW92ZSgoKSA9PiB7IH0pXHJcbiAgICAgICAgdGhpcy5ldmVudC5tb3VzZV9sZWZ0KCgpID0+IHsgfSlcclxuICAgICAgICB0aGlzLmV2ZW50Lm1vdXNlX3JpZ2h0KCgpID0+IHsgfSlcclxuICAgICAgICB0aGlzLmV2ZW50Lmdlc3R1cmVfcGluY2tfc3RhcnQoKCkgPT4geyB9KVxyXG4gICAgICAgIHRoaXMuZXZlbnQuZ2VzdHVyZV9waW5ja19lbmQoKCkgPT4geyB9KVxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMudGlwICYmIHRoaXMudGlwLmRlc3Ryb3koKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IHBvc2l0aW9uRWRpdGluZygpIHtcclxuICAgIHJldHVybiB0aGlzLl9wb3NpdGlvbkVkaXRpbmdcclxuICB9XHJcblxyXG4gIG9wZW5Qb3NpdGlvbkVkaXRpbmcoY2QpIHtcclxuICAgIHRoaXMucG9zaXRpb25FZGl0aW5nID0gdHJ1ZVxyXG4gICAgdGhpcy5fcG9zaXRpb25FZGl0aW5nQ2FsbGJhY2sgPSBjZFxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICog6aOe5YiwXHJcbiAgICovXHJcbiAgYXN5bmMgZmx5VG8ob3B0aW9ucyA9IHt9KSB7XHJcbiAgICBsZXQgY2FudmFzID0gdGhpcy5nZXRjYW52YXMoKVxyXG4gICAgbGV0IHJhdGlvID0gY2FudmFzLmhlaWdodCAvIGNhbnZhcy53aWR0aFxyXG4gICAgc2V0QWN0aXZlVmlld2VyKDApXHJcbiAgICBjbG9zZVJvdGF0ZUFyb3VuZCh0aGlzLnNkaylcclxuICAgIGNsb3NlVmlld0ZvbGxvdyh0aGlzLnNkaylcclxuXHJcbiAgICBpZiAodGhpcy5vcHRpb25zLmN1c3RvbVZpZXcgJiYgdGhpcy5vcHRpb25zLmN1c3RvbVZpZXcucmVsYXRpdmVQb3NpdGlvbiAmJiB0aGlzLm9wdGlvbnMuY3VzdG9tVmlldy5vcmllbnRhdGlvbikge1xyXG4gICAgICBsZXQgb3JpZW50YXRpb24gPSB7XHJcbiAgICAgICAgaGVhZGluZzogQ2VzaXVtLk1hdGgudG9SYWRpYW5zKHRoaXMub3B0aW9ucy5jdXN0b21WaWV3Lm9yaWVudGF0aW9uLmhlYWRpbmcgfHwgMC4wKSxcclxuICAgICAgICBwaXRjaDogQ2VzaXVtLk1hdGgudG9SYWRpYW5zKHRoaXMub3B0aW9ucy5jdXN0b21WaWV3Lm9yaWVudGF0aW9uLnBpdGNoIHx8IC02MC4wKSxcclxuICAgICAgICByb2xsOiBDZXNpdW0uTWF0aC50b1JhZGlhbnModGhpcy5vcHRpb25zLmN1c3RvbVZpZXcub3JpZW50YXRpb24ucm9sbCB8fCAwLjApXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBsbmcgPSB0aGlzLm9wdGlvbnMuY3VzdG9tVmlldy5yZWxhdGl2ZVBvc2l0aW9uLmxuZ1xyXG4gICAgICBsZXQgbGF0ID0gdGhpcy5vcHRpb25zLmN1c3RvbVZpZXcucmVsYXRpdmVQb3NpdGlvbi5sYXRcclxuICAgICAgbGV0IGFsdCA9IHRoaXMub3B0aW9ucy5jdXN0b21WaWV3LnJlbGF0aXZlUG9zaXRpb24uYWx0XHJcbiAgICAgIGxldCBkZXN0aW5hdGlvbiA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzKGxuZywgbGF0LCBhbHQpXHJcblxyXG4gICAgICBsZXQgcG9zaXRpb24gPSB7IGxuZzogMCwgbGF0OiAwIH1cclxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5wb3NpdGlvbikge1xyXG4gICAgICAgIHBvc2l0aW9uID0geyAuLi50aGlzLm9wdGlvbnMucG9zaXRpb24gfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKHRoaXMub3B0aW9ucy5wb3NpdGlvbnMpIHtcclxuICAgICAgICBwb3NpdGlvbiA9IHsgLi4udGhpcy5vcHRpb25zLnBvc2l0aW9uc1swXSB9XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAodGhpcy5vcHRpb25zLmNlbnRlcikge1xyXG4gICAgICAgIHBvc2l0aW9uID0geyAuLi50aGlzLm9wdGlvbnMuY2VudGVyIH1cclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmICh0aGlzLm9wdGlvbnMuc3RhcnQpIHtcclxuICAgICAgICBwb3NpdGlvbiA9IHsgLi4udGhpcy5vcHRpb25zLnN0YXJ0IH1cclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmhhc093blByb3BlcnR5KCdsbmcnKSkge1xyXG4gICAgICAgICAgcG9zaXRpb24ubG5nID0gdGhpcy5vcHRpb25zLmxuZ1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmhhc093blByb3BlcnR5KCdsYXQnKSkge1xyXG4gICAgICAgICAgcG9zaXRpb24ubGF0ID0gdGhpcy5vcHRpb25zLmxhdFxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmhhc093blByb3BlcnR5KCdhbHQnKSkge1xyXG4gICAgICAgICAgcG9zaXRpb24uYWx0ID0gdGhpcy5vcHRpb25zLmFsdFxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICAvLyDlpoLmnpzmsqHmnInpq5jluqblgLzvvIzliJnojrflj5bntKfotLTpq5jluqborqHnrpdcclxuICAgICAgaWYgKCFwb3NpdGlvbi5oYXNPd25Qcm9wZXJ0eSgnYWx0JykpIHtcclxuICAgICAgICBwb3NpdGlvbi5hbHQgPSBhd2FpdCB0aGlzLmdldENsYW1wVG9IZWlnaHQocG9zaXRpb24pXHJcbiAgICAgIH1cclxuICAgICAgbG5nID0gdGhpcy5vcHRpb25zLmN1c3RvbVZpZXcucmVsYXRpdmVQb3NpdGlvbi5sbmcgKyBwb3NpdGlvbi5sbmdcclxuICAgICAgbGF0ID0gdGhpcy5vcHRpb25zLmN1c3RvbVZpZXcucmVsYXRpdmVQb3NpdGlvbi5sYXQgKyBwb3NpdGlvbi5sYXRcclxuICAgICAgYWx0ID0gdGhpcy5vcHRpb25zLmN1c3RvbVZpZXcucmVsYXRpdmVQb3NpdGlvbi5hbHQgKyBwb3NpdGlvbi5hbHRcclxuICAgICAgZGVzdGluYXRpb24gPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlcyhsbmcsIGxhdCwgYWx0KVxyXG4gICAgICB0aGlzLnNkay52aWV3ZXIuY2FtZXJhLmZseVRvKHtcclxuICAgICAgICBkZXN0aW5hdGlvbjogZGVzdGluYXRpb24sXHJcbiAgICAgICAgb3JpZW50YXRpb246IG9yaWVudGF0aW9uXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgbGV0IGdhcCA9XHJcbiAgICAgICAgTWF0aC5hYnMoTWF0aC5jb3MoKE1hdGguUEkgLyAxODApICogdGhpcy5vcHRpb25zLnBvc2l0aW9uLmxhdCkpICpcclxuICAgICAgICAoMC4wMDAxICogdGhpcy5vcHRpb25zLnNjYWxlKVxyXG4gICAgICBsZXQgZnJvbURlZ3JlZXNBcnJheSA9IFtcclxuICAgICAgICBbXHJcbiAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb24ubG5nIC0gKDAuMDAwMSAqIHRoaXMub3B0aW9ucy5zY2FsZSkgLyByYXRpbyxcclxuICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbi5sYXQgLSBnYXBcclxuICAgICAgICBdLFxyXG4gICAgICAgIFtcclxuICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbi5sbmcgKyAoMC4wMDAxICogdGhpcy5vcHRpb25zLnNjYWxlKSAvIHJhdGlvLFxyXG4gICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uLmxhdCArIGdhcFxyXG4gICAgICAgIF1cclxuICAgICAgXVxyXG4gICAgICBsZXQgaGVpZ2h0ID0gYXdhaXQgdGhpcy5nZXRDbGFtcFRvSGVpZ2h0KHRoaXMub3B0aW9ucy5wb3NpdGlvbilcclxuICAgICAgbGV0IHBvc2l0aW9uQXJyYXkgPSBbXVxyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZyb21EZWdyZWVzQXJyYXkubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBsZXQgYSA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzKC4uLmZyb21EZWdyZWVzQXJyYXlbaV0sIGhlaWdodClcclxuICAgICAgICBwb3NpdGlvbkFycmF5LnB1c2goYS54LCBhLnksIGEueilcclxuICAgICAgfVxyXG4gICAgICBsZXQgQm91bmRpbmdTcGhlcmUgPSBDZXNpdW0uQm91bmRpbmdTcGhlcmUuZnJvbVZlcnRpY2VzKHBvc2l0aW9uQXJyYXkpXHJcbiAgICAgIHRoaXMuc2RrLnZpZXdlci5jYW1lcmEuZmx5VG9Cb3VuZGluZ1NwaGVyZShCb3VuZGluZ1NwaGVyZSwge1xyXG4gICAgICAgIG9mZnNldDogb3B0aW9ucy5vcmllbnRhdGlvbiB8fCB7XHJcbiAgICAgICAgICBoZWFkaW5nOiBDZXNpdW0uTWF0aC50b1JhZGlhbnMoMC4wKSxcclxuICAgICAgICAgIHBpdGNoOiBDZXNpdW0uTWF0aC50b1JhZGlhbnMoLTkwLjApLFxyXG4gICAgICAgICAgcm9sbDogQ2VzaXVtLk1hdGgudG9SYWRpYW5zKDAuMClcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZXNldCgpIHtcclxuICAgIGlmICghdGhpcy5lbnRpdHkpIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcbiAgICB0aGlzLm9wdGlvbnMgPSB0aGlzLmRlZXBDb3B5T2JqKHRoaXMub3JpZ2luYWxPcHRpb25zKVxyXG4gICAgdGhpcy50ZXh0ID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMudGV4dFxyXG4gICAgdGhpcy5hbmdsZSA9IHRoaXMub3JpZ2luYWxPcHRpb25zLmFuZ2xlXHJcbiAgICB0aGlzLnNjYWxlID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMuc2NhbGVcclxuICAgIHRoaXMuY29sb3IgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5jb2xvclxyXG4gIH1cclxuXHJcbiAgYXN5bmMgcmVtb3ZlKCkge1xyXG4gICAgdGhpcy5ldmVudCAmJiB0aGlzLmV2ZW50LmRlc3Ryb3koKVxyXG4gICAgdGhpcy50aXAgJiYgdGhpcy50aXAuZGVzdHJveSgpXHJcbiAgICB0aGlzLnNkay52aWV3ZXIuZW50aXRpZXMucmVtb3ZlKHRoaXMuZW50aXR5KVxyXG4gICAgdGhpcy5lbnRpdHkgPSBudWxsXHJcbiAgICBpZiAodGhpcy5fRGlhbG9nT2JqZWN0ICYmICF0aGlzLl9EaWFsb2dPYmplY3QuaXNEZXN0cm95KSB7XHJcbiAgICAgIHRoaXMuX0RpYWxvZ09iamVjdC5jbG9zZSgpXHJcbiAgICAgIHRoaXMuX0RpYWxvZ09iamVjdCA9IG51bGxcclxuICAgIH1cclxuICAgIGF3YWl0IHRoaXMuc2RrLnJlbW92ZUluY2V0YW5jZSh0aGlzLm9wdGlvbnMuaWQpXHJcbiAgICBhd2FpdCBzeW5jRGF0YSh0aGlzLnNkaywgdGhpcy5vcHRpb25zLmlkKVxyXG4gIH1cclxuXHJcbiAgZ2V0Y2FudmFzKCkge1xyXG4gICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJylcclxuICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpXHJcblxyXG4gICAgbGV0IHRleHRBcnJheSA9IHRoaXMub3B0aW9ucy50ZXh0LnNwbGl0KCdcXG4nKVxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZXh0QXJyYXkubGVuZ3RoOyBpKyspIHtcclxuICAgICAgaWYgKHRleHRBcnJheVtpXS5sZW5ndGggPiA4MCkge1xyXG4gICAgICAgIHRleHRBcnJheVtpXSA9IHRleHRBcnJheVtpXS5zbGljZSgwLCA4MCAtIHRleHRBcnJheVtpXS5sZW5ndGgpXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICh0ZXh0QXJyYXkubGVuZ3RoID4gNzApIHtcclxuICAgICAgdGV4dEFycmF5LnNwbGljZSg3MCAtIHRleHRBcnJheS5sZW5ndGgpXHJcbiAgICB9XHJcbiAgICB0aGlzLm9wdGlvbnMudGV4dCA9IHRleHRBcnJheS5qb2luKCdcXG4nKVxyXG4gICAgbGV0IG1heFdpZHRoID0gMFxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZXh0QXJyYXkubGVuZ3RoOyBpKyspIHtcclxuICAgICAgY3R4LmZvbnQgPSAyMDAgKyAncHggc2VyaWYnXHJcbiAgICAgIGNvbnN0IHdpZHRoID0gY3R4Lm1lYXN1cmVUZXh0KHRleHRBcnJheVtpXSkud2lkdGhcclxuICAgICAgaWYgKG1heFdpZHRoIDwgd2lkdGgpIHtcclxuICAgICAgICBtYXhXaWR0aCA9IHdpZHRoXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGNhbnZhcy53aWR0aCA9IG1heFdpZHRoXHJcbiAgICBjYW52YXMuaGVpZ2h0ID0gMjIwICogdGV4dEFycmF5Lmxlbmd0aFxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZXh0QXJyYXkubGVuZ3RoOyBpKyspIHtcclxuICAgICAgY3R4LmZvbnQgPSAyMDAgKyAncHggc2VyaWYnXHJcbiAgICAgIGN0eC5maWxsU3R5bGUgPSAncmdiYSgyNTUsIDI1NSwgMjU1LCAwKSdcclxuICAgICAgY3R4LmZpbGxSZWN0KDAsIDAsIG1heFdpZHRoICsgMzAsIDIxMClcclxuICAgICAgY3R4LmZpbGxTdHlsZSA9ICdyZ2JhKDI1NSwgMjU1LCAyNTUsIDEpJ1xyXG4gICAgICBjdHguZm9udCA9ICcyMDBweCBzZXJpZidcclxuICAgICAgY3R4LmZpbGxUZXh0KHRleHRBcnJheVtpXSwgMCwgMjEwICogKGkgKyAxKSlcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gY2FudmFzXHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBHcm91bmRUZXh0XHJcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFTQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFiQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQVVBO0FBQ0E7QUFFQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFHQTtBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUdBO0FBR0E7QUFDQTtBQUVBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQTVDQTtBQTZDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQXBGQTtBQUFBO0FBQUE7QUFBQTtBQXNGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFMQTtBQUFBO0FBQUE7QUFvRkE7QUFDQTtBQUFBO0FBL0VBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBR0E7QUFTQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFyRkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUF3RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBWEE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFjQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUdBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/Obj/Base/TextObject/GroundText/index.js\n"); /***/ }), @@ -2687,7 +2687,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) * /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ \"./node_modules/@babel/runtime/helpers/asyncToGenerator.js\");\n/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ \"./node_modules/@babel/runtime/helpers/classCallCheck.js\");\n/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ \"./node_modules/@babel/runtime/helpers/createClass.js\");\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ \"./node_modules/@babel/runtime/helpers/possibleConstructorReturn.js\");\n/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ \"./node_modules/@babel/runtime/helpers/getPrototypeOf.js\");\n/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ \"./node_modules/@babel/runtime/helpers/inherits.js\");\n/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @babel/runtime/regenerator */ \"./node_modules/@babel/runtime/regenerator/index.js\");\n/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var _Element_Dialog__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../../Element/Dialog */ \"./src/Obj/Element/Dialog/index.js\");\n/* harmony import */ var _Element_Dialog_eventBinding__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../../Element/Dialog/eventBinding */ \"./src/Obj/Element/Dialog/eventBinding.js\");\n/* harmony import */ var _Element_cy_html_tabs__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../../Element/cy_html_tabs */ \"./src/Obj/Element/cy_html_tabs.js\");\n/* harmony import */ var _Element_richText__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../../Element/richText */ \"./src/Obj/Element/richText.js\");\n/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./_element */ \"./src/Obj/Base/TextObject/StandText/_element.js\");\n/* harmony import */ var _index__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../../index */ \"./src/Obj/Base/index.js\");\n/* harmony import */ var _LabelObject__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../../LabelObject */ \"./src/Obj/Base/LabelObject/index.js\");\n/* harmony import */ var _Event__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../../../../Event */ \"./src/Event/index.js\");\n/* harmony import */ var _MouseTip__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../../../../MouseTip */ \"./src/MouseTip/index.js\");\n/* harmony import */ var _Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../../../../Global/MultiViewportMode */ \"./src/Global/MultiViewportMode/index.js\");\n/* harmony import */ var _Global_SplitScreen__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../../../../Global/SplitScreen */ \"./src/Global/SplitScreen/index.js\");\n\n\n\n\n\n\n\nfunction _callSuper(t, o, e) { return o = _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4___default()(o), _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_3___default()(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4___default()(t).constructor) : o.apply(t, e)); }\nfunction _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }\n\n\n\n\n\n\n\n\n\n\n\nvar StandText = /*#__PURE__*/function (_Base) {\n /**\r\n * @constructor\r\n * @param sdk\r\n * @description 立体文字\r\n * @param options {object}\r\n * @param options.id {string} 唯一标识\r\n * @param options.text {string} 文字\r\n * @param options.color=\"#FFC107\" {string} 颜色\r\n * @param options.speed=1 {number} 文字移动速度\r\n * @param {Array.} positions 经纬度和高度的列表,值交替 [{lon,lat,alt},...]\r\n * @param options.positions[].lng {number} 经度\r\n * @param options.positions[].lat {number} 纬度\r\n * @param options.positions[].alt {number} 高度\r\n * @param options.customView {object} 默认视角\r\n * @param options.customView.orientation {object} 默认视角方位\r\n * @param options.customView.orientation.heading {number} 航向角\r\n * @param options.customView.orientation.pitch {number} 俯仰角\r\n * @param options.customView.orientation.roll {number} 翻滚角\r\n * @param options.customView.relativePosition {object} 视角相对位置\r\n * @param options.customView.relativePosition.lng {number} 经度\r\n * @param options.customView.relativePosition.lat {number} 纬度\r\n * @param options.customView.relativePosition.alt {number} 高度\r\n * */\n function StandText(sdk, options) {\n var _this2;\n var _Dialog = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1___default()(this, StandText);\n _this2 = _callSuper(this, StandText, [sdk, options]);\n _this2.options.text = options.text || \"未命名对象\";\n var textArray = _this2.options.text.split('\\n');\n for (var i = 0; i < textArray.length; i++) {\n if (textArray[i].length > 80) {\n textArray[i] = textArray[i].slice(0, 80 - textArray[i].length);\n }\n }\n if (textArray.length > 70) {\n textArray.splice(70 - textArray.length);\n }\n _this2.options.text = textArray.join('\\n');\n _this2.options.color = options.color || \"#FFC107\";\n // this.options.cornerType = options.cornerType || 'MITERED'\n _this2.options.positions = options.positions;\n // this.options.material = Number(options.material) || 0\n _this2.options.speed = options.speed || options.speed === 0 ? options.speed : 1;\n // this.options.duration = (options.duration || options.duration === 0) ? options.duration : 50000\n _this2.options.show = options.show || options.show === false ? options.show : true;\n _this2.nodePoints = [];\n _this2.entity;\n _this2.options.instruct = options.instruct || \"\";\n _this2.options.operatingPoint = options.operatingPoint || \"\";\n _this2.options.attribute = options.attribute || {};\n _this2.options.attribute.link = _this2.options.attribute.link || {};\n _this2.options.attribute.link.content = _this2.options.attribute.link.content || [];\n _this2.options.attribute.camera = _this2.options.attribute.camera || [];\n _this2.options.attributeType = options.attributeType || 'richText';\n _this2.extrudedHeight;\n _this2._EventBinding = new _Element_Dialog_eventBinding__WEBPACK_IMPORTED_MODULE_8__[\"default\"]();\n _this2.Dialog = _Dialog;\n _this2._elms = {};\n _this2.sdk.addIncetance(_this2.options.id, _this2);\n StandText.create(_this2);\n return _this2;\n }\n _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default()(StandText, _Base);\n return _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_2___default()(StandText, [{\n key: \"text\",\n get: function get() {\n return this.options.text;\n },\n set: function set(v) {\n this.options.text = v;\n var textArray = this.options.text.split('\\n');\n for (var i = 0; i < textArray.length; i++) {\n if (textArray[i].length > 80) {\n var _error = '行超过80个字符,请按回车(Enter)后,继续输入';\n window.ELEMENT && window.ELEMENT.Message({\n message: _error,\n type: 'warning',\n duration: 1000\n });\n textArray[i] = textArray[i].slice(0, 80 - textArray[i].length);\n }\n }\n if (textArray.length > 70) {\n textArray.splice(70 - textArray.length);\n var _error2 = '超过最大输入字符';\n window.ELEMENT && window.ELEMENT.Message({\n message: _error2,\n type: 'warning',\n duration: 1000\n });\n }\n this.options.text = textArray.join('\\n');\n if (this.entity) {\n var positions = this.options.positions;\n var fromDegreesArray = [];\n var minimumHeights = [];\n var maximumHeights = [];\n var material = this.getMaterial();\n var width = this.computeDistance2(positions);\n var extrudedHeight = this.aspectRatio ? width / this.aspectRatio : 0;\n for (var _i = 0; _i < positions.length; _i++) {\n fromDegreesArray.push(positions[_i].lng, positions[_i].lat);\n minimumHeights.push(positions[_i].alt);\n maximumHeights.push(positions[_i].alt + extrudedHeight);\n }\n this.entity.wall.material = material;\n this.entity.wall.maximumHeights = maximumHeights;\n this.entity.wall.minimumHeights = minimumHeights;\n }\n this._elms.text && this._elms.text.forEach(function (item) {\n item.value = v;\n });\n }\n }, {\n key: \"color\",\n get: function get() {\n return this.options.color;\n },\n set: function set(v) {\n var _this3 = this;\n this.options.color = v;\n this.entity.wall.material = this.getMaterial();\n if (this._elms.color) {\n this._elms.color.forEach(function (item, i) {\n var colorPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: v,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(c) {\n _this3.color = c;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this3.color = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n _this3._elms.color[i] = colorPicker;\n });\n }\n }\n\n // get material() {\n // return this.options.material\n // }\n // set material(v) {\n // this.options.material = Number(v)\n // this.entity.wall.material = this.getMaterial()\n // this._elms.material && this._elms.material.forEach((item) => {\n // item.value = v\n // })\n // }\n }, {\n key: \"speed\",\n get: function get() {\n return this.options.speed;\n },\n set: function set(v) {\n this.options.speed = v;\n this.entity.wall.material = this.getMaterial();\n this._elms.speed && this._elms.speed.forEach(function (item) {\n item.value = v;\n });\n }\n\n // get attributeLink() {\n // return this.options.attribute.link.content\n // }\n\n // set attributeLink(v) {\n // this.options.attribute.link.content = v\n // if (!this._DialogObject || !this._DialogObject._element || !this._DialogObject._element.content) {\n // return\n // }\n // let table = this._DialogObject._element.content.getElementsByClassName('attribute-content-link')[1].getElementsByClassName('table')[0]\n // let tableContent = table.getElementsByClassName('table-body')[0]\n // tableContent.innerHTML = ''\n // if (this.options.attribute.link.content.length > 0) {\n // table.getElementsByClassName('table-empty')[0].style.display = 'none'\n // }\n // else {\n // table.getElementsByClassName('table-empty')[0].style.display = 'flex'\n // }\n // for (let i = 0; i < this.options.attribute.link.content.length; i++) {\n // let tr = `\n //
\n //
` + this.options.attribute.link.content[i].name + `
\n //
` + this.options.attribute.link.content[i].url + `
\n //
\n // \n // \n //
\n //
`\n // let trElm = document.createRange().createContextualFragment(tr)\n // tableContent.appendChild(trElm)\n // }\n // let item = tableContent.getElementsByClassName('tr')\n // let fun = {\n // linkEdit: async (index) => {\n // this.attributeLink = await this.options.attribute.link.content\n // let table = this._DialogObject._element.content.getElementsByClassName('attribute-content-link')[1].getElementsByClassName('table')[0]\n // let tableContent = table.getElementsByClassName('table-body')[0]\n // let item = tableContent.getElementsByClassName('tr')\n // for (let i = 0; i < item.length; i++) {\n // if (index === i) {\n // let html = `\n //
\n // \n //
\n //
\n //
\n // \n // \n // \n //
\n //
\n //
\n // \n // \n //
`\n // item[i].innerHTML = html\n // let td = item[i].getElementsByClassName('td')\n // td[0].getElementsByClassName('input')[0].value = this.options.attribute.link.content[index].name\n // td[1].getElementsByClassName('input')[0].value = this.options.attribute.link.content[index].url\n // let btn = item[i].getElementsByTagName('button')\n // for (let n = 0; n < btn.length; n++) {\n // for (let m of btn[n].attributes) {\n // if (m.name === '@click') {\n // btn[n].addEventListener('click', (e) => {\n // if (typeof (fun[m.value]) === 'function') {\n // fun[m.value]({ name: td[0].getElementsByClassName('input')[0].value, url: td[1].getElementsByClassName('input')[0].value }, i)\n // }\n // });\n // btn[n].attributes.removeNamedItem(m.name)\n // break\n // }\n // }\n // }\n // break\n // }\n // }\n // },\n // linkDelete: (i) => {\n // this.options.attribute.link.content.splice(i, 1)\n // this.attributeLink = this.options.attribute.link.content\n // },\n\n // confirmEdit: (value, i) => {\n // this.options.attribute.link.content[i] = value\n // this.attributeLink = this.options.attribute.link.content\n // },\n // cancelEdit: () => {\n // this.attributeLink = this.options.attribute.link.content\n // },\n // fileSelect: (value, i) => {\n // let fileElm = item[i].getElementsByClassName('file-select')[0]\n // fileElm.click()\n // fileElm.removeEventListener('change', fileSelect)\n // fileElm.addEventListener('change', fileSelect)\n // }\n // }\n // let fileSelect = (event) => {\n // if (event.target.value) {\n // let td = item[event.target.getAttribute('index')].getElementsByClassName('td')\n // td[1].getElementsByClassName('input')[0].value = event.target.value\n // event.target.value = null\n // }\n // }\n // for (let i = 0; i < item.length; i++) {\n // let btn = item[i].getElementsByTagName('button')\n // for (let n = 0; n < btn.length; n++) {\n // for (let m of btn[n].attributes) {\n // if (m.name === '@click') {\n // btn[n].addEventListener('click', (e) => {\n // if (typeof (fun[m.value]) === 'function') {\n // fun[m.value](i)\n // }\n // });\n // btn[n].attributes.removeNamedItem(m.name)\n // break\n // }\n // }\n // }\n // }\n\n // }\n }, {\n key: \"attributeCamera\",\n get: function get() {\n return this.options.attribute.camera;\n },\n set: function set(v) {\n this.options.attribute.camera = v;\n }\n\n //创建\n }, {\n key: \"edit\",\n value: // 编辑框\n function () {\n var _edit = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_6___default.a.mark(function _callee(state) {\n var _this4 = this;\n var _this, contentElm, colorPicker, all_elm;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_6___default.a.wrap(function _callee$(_context) {\n while (1) switch (_context.prev = _context.next) {\n case 0:\n _this = this;\n this.originalOptions = this.deepCopyObj(this.options);\n if (this._DialogObject && this._DialogObject.close) {\n this._DialogObject.close();\n this._DialogObject = null;\n }\n if (!state) {\n _context.next = 20;\n break;\n }\n _context.next = 6;\n return new _Element_Dialog__WEBPACK_IMPORTED_MODULE_7__[\"default\"](this.sdk, this.options, {\n title: '立体文字属性',\n left: '180px',\n top: '100px',\n confirmCallBack: function confirmCallBack(options) {\n _this4.text = _this4.text.trim();\n if (!_this4.text) {\n _this4.text = '未命名对象';\n }\n _this4.originalOptions = _this4.deepCopyObj(_this4.options);\n _this4._DialogObject.close();\n _this4.Dialog.confirmCallBack && _this4.Dialog.confirmCallBack(_this4.originalOptions);\n Object(_Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_16__[\"syncData\"])(_this4.sdk, _this4.options.id);\n Object(_Global_SplitScreen__WEBPACK_IMPORTED_MODULE_17__[\"syncSplitData\"])(_this4.sdk, _this4.options.id);\n },\n resetCallBack: function resetCallBack() {\n _this4.reset();\n _this4.Dialog.resetCallBack && _this4.Dialog.resetCallBack();\n },\n removeCallBack: function removeCallBack() {\n _this4.Dialog.removeCallBack && _this4.Dialog.removeCallBack();\n },\n closeCallBack: function closeCallBack() {\n _this4.reset();\n _this4.Dialog.closeCallBack && _this4.Dialog.closeCallBack();\n for (var i = 0; i < _this4.nodePoints.length; i++) {\n _this4.sdk.viewer.entities.remove(_this4.nodePoints[i]);\n }\n _this4.nodePoints = [];\n YJ.Measure.SetMeasureStatus(false);\n _this4.event && _this4.event.destroy();\n _this4.tip && _this4.tip.destroy();\n },\n showCallBack: function showCallBack(show) {\n _this4.options.show = show;\n _this4.originalOptions.show = show;\n _this4.show = show;\n _this4.Dialog.showCallBack && _this4.Dialog.showCallBack();\n },\n secondaryEditCallBack: function secondaryEditCallBack() {\n StandText.nodeEdit(_this4);\n }\n });\n case 6:\n this._DialogObject = _context.sent;\n this._DialogObject._element.body.className = this._DialogObject._element.body.className + ' stand-text';\n contentElm = document.createElement('div');\n contentElm.innerHTML = Object(_element__WEBPACK_IMPORTED_MODULE_11__[\"html\"])(this);\n this._DialogObject.contentAppChild(contentElm);\n this.attributeType = this.options.attributeType;\n this.attributeCamera = this.options.attribute.camera;\n // setTimeout(() => {\n // this.attributeLink = this.options.attribute.link.content\n // this.cameraSelect()\n // }, 500);\n\n // 创建标签页\n // let tabsElm = new cy_tabs('radar-scan-edit-tabs')\n // 颜色组件\n colorPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName(\"color\")[0],\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: this.color,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this4.color = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this4.color = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n all_elm = contentElm.getElementsByTagName(\"*\");\n this._EventBinding.on(this, all_elm);\n this._elms = this._EventBinding.element;\n this._elms.color = [colorPicker];\n _context.next = 21;\n break;\n case 20:\n if (this._DialogObject && this._DialogObject.remove) {\n this._DialogObject.remove();\n this._DialogObject = null;\n }\n case 21:\n case \"end\":\n return _context.stop();\n }\n }, _callee, this);\n }));\n function edit(_x) {\n return _edit.apply(this, arguments);\n }\n return edit;\n }()\n }, {\n key: \"reset\",\n value: function reset() {\n if (!this.entity) {\n return;\n }\n this.options = this.deepCopyObj(this.originalOptions);\n this.text = this.originalOptions.text;\n this.color = this.originalOptions.color;\n this.speed = this.originalOptions.speed;\n var positions = this.options.positions;\n var fromDegreesArray = [];\n var minimumHeights = [];\n var maximumHeights = [];\n var width = this.computeDistance2(positions);\n var extrudedHeight = this.aspectRatio ? width / this.aspectRatio : 0;\n // aspectRatio\n for (var i = 0; i < positions.length; i++) {\n fromDegreesArray.push(positions[i].lng, positions[i].lat);\n minimumHeights.push(positions[i].alt);\n maximumHeights.push(positions[i].alt + extrudedHeight);\n }\n this.entity.wall.positions = Cesium.Cartesian3.fromDegreesArray(fromDegreesArray);\n }\n }, {\n key: \"remove\",\n value: function () {\n var _remove = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_6___default.a.mark(function _callee2() {\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_6___default.a.wrap(function _callee2$(_context2) {\n while (1) switch (_context2.prev = _context2.next) {\n case 0:\n this.event && this.event.destroy();\n this.tip && this.tip.destroy();\n this.sdk.viewer.entities.remove(this.entity);\n this.entity = null;\n if (this._DialogObject && !this._DialogObject.isDestroy) {\n this._DialogObject.close();\n this._DialogObject = null;\n }\n _context2.next = 7;\n return this.sdk.removeIncetance(this.options.id);\n case 7:\n _context2.next = 9;\n return Object(_Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_16__[\"syncData\"])(this.sdk, this.options.id);\n case 9:\n case \"end\":\n return _context2.stop();\n }\n }, _callee2, this);\n }));\n function remove() {\n return _remove.apply(this, arguments);\n }\n return remove;\n }()\n }, {\n key: \"getMaterial\",\n value: function getMaterial() {\n var material;\n var canvas = this.getcanvas();\n material = new Cesium.CustomMaterialSource({\n image: canvas.toDataURL(\"image/png\"),\n color: this.options.color,\n repeat: new Cesium.Cartesian2(1, 1.0),\n duration: 50000 / this.options.speed,\n fltr: false\n });\n return material;\n }\n }, {\n key: \"getcanvas\",\n value: function getcanvas() {\n var canvas = document.createElement('canvas');\n var ctx = canvas.getContext('2d');\n var textArray = this.options.text.split('\\n');\n for (var i = 0; i < textArray.length; i++) {\n if (textArray[i].length > 80) {\n textArray[i] = textArray[i].slice(0, 80 - textArray[i].length);\n }\n }\n if (textArray.length > 70) {\n textArray.splice(70 - textArray.length);\n }\n this.options.text = textArray.join('\\n');\n var maxWidth = 0;\n for (var _i2 = 0; _i2 < textArray.length; _i2++) {\n ctx.font = 200 + \"px serif\";\n var width = ctx.measureText(textArray[_i2]).width;\n if (maxWidth < width) {\n maxWidth = width;\n }\n }\n canvas.width = maxWidth;\n canvas.height = 220 * textArray.length;\n for (var _i3 = 0; _i3 < textArray.length; _i3++) {\n ctx.font = 200 + \"px serif\";\n ctx.fillStyle = 'rgba(255, 255, 255, 0)';\n ctx.fillRect(0, 0, maxWidth + 30, 210);\n ctx.fillStyle = 'rgba(255, 255, 255, 1)';\n ctx.font = \"200px serif\";\n ctx.fillText(textArray[_i3], 0, 210 * (_i3 + 1));\n }\n this.aspectRatio = this.options.text ? canvas.width / canvas.height : 0;\n return canvas;\n }\n\n /**\r\n * 打开富文本框\r\n */\n }, {\n key: \"openRichTextEditor\",\n value: function openRichTextEditor(e) {\n var _this5 = this;\n _Element_richText__WEBPACK_IMPORTED_MODULE_10__[\"default\"].open(this.options.id, this.options.text, this.options.richTextContent);\n _Element_richText__WEBPACK_IMPORTED_MODULE_10__[\"default\"].primaryCallBack = function (content) {\n _this5.options.richTextContent = content;\n };\n }\n }], [{\n key: \"create\",\n value: function () {\n var _create = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_6___default.a.mark(function _callee3(that) {\n var positions, fromDegreesArray, minimumHeights, maximumHeights, material, width, extrudedHeight, i;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_6___default.a.wrap(function _callee3$(_context3) {\n while (1) switch (_context3.prev = _context3.next) {\n case 0:\n // console.log(new Cesium.CustomMaterialSource(), new Cesium.PolylineTrailLinkMaterialProperty())\n positions = that.options.positions;\n fromDegreesArray = [];\n minimumHeights = [];\n maximumHeights = [];\n material = that.getMaterial();\n width = that.computeDistance2(positions);\n extrudedHeight = that.aspectRatio ? width / that.aspectRatio : 0; // aspectRatio\n for (i = 0; i < positions.length; i++) {\n fromDegreesArray.push(positions[i].lng, positions[i].lat);\n minimumHeights.push(positions[i].alt);\n maximumHeights.push(positions[i].alt + extrudedHeight);\n }\n that.entity = that.sdk.viewer.entities.add({\n id: that.options.id,\n show: that.options.show,\n wall: {\n positions: Cesium.Cartesian3.fromDegreesArray(fromDegreesArray),\n cornerType: Cesium.CornerType.MITERED,\n maximumHeights: maximumHeights,\n minimumHeights: minimumHeights,\n material: material\n }\n // wall: {\n // positions: Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray),\n // maximumHeights: maximumHeights,\n // minimumHeights: minimumHeights,\n // material: new Cesium.PolylineTrailLinkMaterialProperty({duration: 1500}),\n // outline: true,\n // outlineColor: Cesium.Color.BLACK,\n // }\n });\n Object(_Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_16__[\"syncData\"])(that.sdk, that.options.id);\n if (that.options.show) {\n Object(_Global_SplitScreen__WEBPACK_IMPORTED_MODULE_17__[\"setSplitDirection\"])(0, that.options.id);\n }\n case 11:\n case \"end\":\n return _context3.stop();\n }\n }, _callee3);\n }));\n function create(_x2) {\n return _create.apply(this, arguments);\n }\n return create;\n }()\n }, {\n key: \"nodeEdit\",\n value: function nodeEdit(that) {\n var cb = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};\n if (YJ.Measure.GetMeasureStatus()) {\n cb('上一次测量未结束');\n } else {\n YJ.Measure.SetMeasureStatus(true);\n that.tip = new _MouseTip__WEBPACK_IMPORTED_MODULE_15__[\"default\"]('请选择一个顶点,右键取消', that.sdk);\n that.event = new _Event__WEBPACK_IMPORTED_MODULE_14__[\"default\"](that.sdk);\n that.nodePoints = [];\n var selectPoint;\n var originalPosition;\n var positions = that.options.positions;\n var fromDegreesArray = [];\n var minimumHeights = [];\n var maximumHeights = [];\n var width = that.computeDistance2(positions);\n var extrudedHeight = that.aspectRatio ? width / that.aspectRatio : 0;\n for (var i = 0; i < positions.length; i++) {\n fromDegreesArray.push(positions[i].lng, positions[i].lat);\n minimumHeights.push(positions[i].alt);\n maximumHeights.push(positions[i].alt + extrudedHeight);\n }\n var isAdd = false;\n var leftEvent = function leftEvent(movement, cartesian) {\n if (selectPoint) {\n isAdd = true;\n var pos3 = that.sdk.viewer.scene.clampToHeight(cartesian, [that.entity]);\n that.options.positions[selectPoint.index] = that.cartesian3Towgs84(pos3, that.sdk.viewer);\n originalPosition = that.options.positions[selectPoint.index];\n var entity = that.sdk.viewer.entities.add({\n name: 'node-secondary-edit-point',\n position: Cesium.Cartesian3.fromDegrees(that.options.positions[selectPoint.index].lng, that.options.positions[selectPoint.index].lat, that.options.positions[selectPoint.index].alt),\n billboard: {\n image: that.getSourceRootPath() + '/img/point.png',\n width: 15,\n height: 15,\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\n color: Cesium.Color.WHITE.withAlpha(0.99)\n }\n });\n that.nodePoints.splice(selectPoint.index, 0, entity);\n that.options.positions.splice(selectPoint.index, 0, that.options.positions[selectPoint.index]);\n var _positions = that.options.positions;\n fromDegreesArray = [];\n minimumHeights = [];\n maximumHeights = [];\n width = that.computeDistance2(_positions);\n extrudedHeight = that.aspectRatio ? width / that.aspectRatio : 0;\n for (var _i4 = 0; _i4 < _positions.length; _i4++) {\n fromDegreesArray.push(_positions[_i4].lng, _positions[_i4].lat);\n minimumHeights.push(_positions[_i4].alt);\n maximumHeights.push(_positions[_i4].alt + extrudedHeight);\n }\n that.tip.setPosition(cartesian, movement.position.x, movement.position.y);\n } else {\n var pick = that.sdk.viewer.scene.pick(movement.position);\n if (pick && pick.id && pick.id.name && pick.id.name === 'node-secondary-edit-point') {\n selectPoint = pick.id;\n that.nodePoints.splice(pick.id.index, 1);\n that.sdk.viewer.entities.remove(pick.id);\n that.tip.set_text('左键开始,右键结束,CTRL+右键撤销');\n originalPosition = that.cartesian3Towgs84(cartesian, that.sdk.viewer);\n that.entity.wall.positions = new Cesium.CallbackProperty(function () {\n return Cesium.Cartesian3.fromDegreesArray(fromDegreesArray);\n }, false);\n that.entity.wall.maximumHeights = new Cesium.CallbackProperty(function () {\n return maximumHeights;\n }, false);\n that.entity.wall.minimumHeights = new Cesium.CallbackProperty(function () {\n return minimumHeights;\n }, false);\n }\n }\n };\n var rightEvent = function rightEvent(movement, cartesian) {\n if (selectPoint) {\n that.options.positions[selectPoint.index] = originalPosition;\n if (isAdd) {\n that.options.positions.splice(selectPoint.index, 1);\n }\n cb(null, that.options.positions);\n }\n var positions = that.options.positions;\n fromDegreesArray = [];\n minimumHeights = [];\n maximumHeights = [];\n width = that.computeDistance2(positions);\n extrudedHeight = that.aspectRatio ? width / that.aspectRatio : 0;\n for (var _i5 = 0; _i5 < positions.length; _i5++) {\n fromDegreesArray.push(positions[_i5].lng, positions[_i5].lat);\n minimumHeights.push(positions[_i5].alt);\n maximumHeights.push(positions[_i5].alt + extrudedHeight);\n }\n that.entity.wall.positions = Cesium.Cartesian3.fromDegreesArray(fromDegreesArray);\n for (var _i6 = 0; _i6 < that.nodePoints.length; _i6++) {\n that.sdk.viewer.entities.remove(that.nodePoints[_i6]);\n }\n that.nodePoints = [];\n YJ.Measure.SetMeasureStatus(false);\n that.event.destroy();\n that.tip.destroy();\n };\n that.event.mouse_left(leftEvent);\n that.event.mouse_right(rightEvent);\n that.event.mouse_move(function (movement, cartesian) {\n if (selectPoint) {\n var pos3 = that.sdk.viewer.scene.clampToHeight(cartesian, [that.entity]);\n that.options.positions[selectPoint.index] = that.cartesian3Towgs84(pos3, that.sdk.viewer);\n var _positions2 = that.options.positions;\n fromDegreesArray = [];\n minimumHeights = [];\n maximumHeights = [];\n width = that.computeDistance2(_positions2);\n extrudedHeight = that.aspectRatio ? width / that.aspectRatio : 0;\n for (var _i7 = 0; _i7 < _positions2.length; _i7++) {\n fromDegreesArray.push(_positions2[_i7].lng, _positions2[_i7].lat);\n minimumHeights.push(_positions2[_i7].alt);\n maximumHeights.push(_positions2[_i7].alt + extrudedHeight);\n }\n }\n that.tip.setPosition(cartesian, movement.endPosition.x, movement.endPosition.y);\n });\n that.event.mouse_right_keyboard_ctrl(function (movement, cartesian) {\n if (selectPoint) {\n that.options.positions.pop();\n that.sdk.viewer.entities.remove(that.nodePoints[that.nodePoints.length - 1]);\n that.nodePoints.pop();\n if (selectPoint.index === that.options.positions.length) {\n if (that.nodePoints[selectPoint.index - 1]) {\n selectPoint = that.nodePoints[selectPoint.index - 1];\n } else {\n selectPoint.index = 0;\n }\n }\n }\n });\n that.event.gesture_pinck_start(function (movement, cartesian) {\n var startTime = new Date();\n var pos = {\n position: {\n x: (movement.position1.x + movement.position2.x) / 2,\n y: (movement.position1.y + movement.position2.y) / 2\n }\n };\n that.event.gesture_pinck_end(function () {\n var endTime = new Date();\n if (endTime - startTime >= 500) {\n // 长按取消\n rightEvent(pos, cartesian);\n } else {\n leftEvent(pos, cartesian);\n }\n });\n });\n for (var _i8 = 0; _i8 < that.options.positions.length; _i8++) {\n var entity = that.sdk.viewer.entities.add({\n name: 'node-secondary-edit-point',\n index: _i8,\n position: Cesium.Cartesian3.fromDegrees(that.options.positions[_i8].lng, that.options.positions[_i8].lat, that.options.positions[_i8].alt),\n billboard: {\n image: that.getSourceRootPath() + '/img/point.png',\n width: 15,\n height: 15,\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\n color: Cesium.Color.WHITE.withAlpha(0.99)\n }\n });\n that.nodePoints.push(entity);\n }\n }\n }\n }]);\n}(_index__WEBPACK_IMPORTED_MODULE_12__[\"default\"]);\n/* harmony default export */ __webpack_exports__[\"default\"] = (StandText);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvT2JqL0Jhc2UvVGV4dE9iamVjdC9TdGFuZFRleHQvaW5kZXguanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvT2JqL0Jhc2UvVGV4dE9iamVjdC9TdGFuZFRleHQvaW5kZXguanM/ZDk1YSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgRGlhbG9nIGZyb20gJy4uLy4uLy4uL0VsZW1lbnQvRGlhbG9nJztcclxuaW1wb3J0IEV2ZW50QmluZGluZyBmcm9tICcuLi8uLi8uLi9FbGVtZW50L0RpYWxvZy9ldmVudEJpbmRpbmcnO1xyXG5pbXBvcnQgY3lfdGFicyBmcm9tIFwiLi4vLi4vLi4vRWxlbWVudC9jeV9odG1sX3RhYnNcIjtcclxuaW1wb3J0IHJpY2hUZXh0IGZyb20gXCIuLi8uLi8uLi9FbGVtZW50L3JpY2hUZXh0XCI7XHJcbmltcG9ydCB7IGh0bWwgfSBmcm9tIFwiLi9fZWxlbWVudFwiO1xyXG5pbXBvcnQgQmFzZSBmcm9tIFwiLi4vLi4vaW5kZXhcIjtcclxuaW1wb3J0IExhYmVsT2JqZWN0IGZyb20gJy4uLy4uL0xhYmVsT2JqZWN0J1xyXG5pbXBvcnQgTW91c2VFdmVudCBmcm9tICcuLi8uLi8uLi8uLi9FdmVudCdcclxuaW1wb3J0IE1vdXNlVGlwIGZyb20gJy4uLy4uLy4uLy4uL01vdXNlVGlwJ1xyXG5pbXBvcnQgeyBzeW5jRGF0YSB9IGZyb20gJy4uLy4uLy4uLy4uL0dsb2JhbC9NdWx0aVZpZXdwb3J0TW9kZSdcclxuaW1wb3J0IHsgc2V0U3BsaXREaXJlY3Rpb24sIHN5bmNTcGxpdERhdGEsIHNldEFjdGl2ZUlkIH0gZnJvbSAnLi4vLi4vLi4vLi4vR2xvYmFsL1NwbGl0U2NyZWVuJ1xyXG5cclxuY2xhc3MgU3RhbmRUZXh0IGV4dGVuZHMgQmFzZSB7XHJcbiAgLyoqXHJcbiAgICogQGNvbnN0cnVjdG9yXHJcbiAgICogQHBhcmFtIHNka1xyXG4gICAqIEBkZXNjcmlwdGlvbiDnq4vkvZPmloflrZdcclxuICAgKiBAcGFyYW0gb3B0aW9ucyB7b2JqZWN0fVxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmlkIHtzdHJpbmd9IOWUr+S4gOagh+ivhlxyXG4gICAqIEBwYXJhbSBvcHRpb25zLnRleHQge3N0cmluZ30g5paH5a2XXHJcbiAgICogQHBhcmFtIG9wdGlvbnMuY29sb3I9XCIjRkZDMTA3XCIge3N0cmluZ30g6aKc6ImyXHJcbiAgICogQHBhcmFtIG9wdGlvbnMuc3BlZWQ9MSB7bnVtYmVyfSDmloflrZfnp7vliqjpgJ/luqZcclxuICAgKiBAcGFyYW0ge0FycmF5LjxvYmplY3Q+fSBwb3NpdGlvbnMg57uP57qs5bqm5ZKM6auY5bqm55qE5YiX6KGo77yM5YC85Lqk5pu/IFt7bG9uLGxhdCxhbHR9LC4uLl1cclxuICAgKiBAcGFyYW0gb3B0aW9ucy5wb3NpdGlvbnNbXS5sbmcge251bWJlcn0g57uP5bqmXHJcbiAgICogQHBhcmFtIG9wdGlvbnMucG9zaXRpb25zW10ubGF0IHtudW1iZXJ9IOe6rOW6plxyXG4gICAqIEBwYXJhbSBvcHRpb25zLnBvc2l0aW9uc1tdLmFsdCB7bnVtYmVyfSDpq5jluqZcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5jdXN0b21WaWV3IHtvYmplY3R9IOm7mOiupOinhuinklxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmN1c3RvbVZpZXcub3JpZW50YXRpb24ge29iamVjdH0g6buY6K6k6KeG6KeS5pa55L2NXHJcbiAgICogQHBhcmFtIG9wdGlvbnMuY3VzdG9tVmlldy5vcmllbnRhdGlvbi5oZWFkaW5nIHtudW1iZXJ9IOiIquWQkeinklxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmN1c3RvbVZpZXcub3JpZW50YXRpb24ucGl0Y2gge251bWJlcn0g5L+v5Luw6KeSXHJcbiAgICogQHBhcmFtIG9wdGlvbnMuY3VzdG9tVmlldy5vcmllbnRhdGlvbi5yb2xsIHtudW1iZXJ9IOe/u+a7muinklxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmN1c3RvbVZpZXcucmVsYXRpdmVQb3NpdGlvbiB7b2JqZWN0fSDop4bop5Lnm7jlr7nkvY3nva5cclxuICAgKiBAcGFyYW0gb3B0aW9ucy5jdXN0b21WaWV3LnJlbGF0aXZlUG9zaXRpb24ubG5nIHtudW1iZXJ9IOe7j+W6plxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmN1c3RvbVZpZXcucmVsYXRpdmVQb3NpdGlvbi5sYXQge251bWJlcn0g57qs5bqmXHJcbiAgICogQHBhcmFtIG9wdGlvbnMuY3VzdG9tVmlldy5yZWxhdGl2ZVBvc2l0aW9uLmFsdCB7bnVtYmVyfSDpq5jluqZcclxuICAgKiAqL1xyXG4gIGNvbnN0cnVjdG9yKHNkaywgb3B0aW9ucywgX0RpYWxvZyA9IHt9KSB7XHJcbiAgICBzdXBlcihzZGssIG9wdGlvbnMpO1xyXG4gICAgdGhpcy5vcHRpb25zLnRleHQgPSBvcHRpb25zLnRleHQgfHwgXCLmnKrlkb3lkI3lr7nosaFcIlxyXG4gICAgbGV0IHRleHRBcnJheSA9IHRoaXMub3B0aW9ucy50ZXh0LnNwbGl0KCdcXG4nKVxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZXh0QXJyYXkubGVuZ3RoOyBpKyspIHtcclxuICAgICAgaWYgKHRleHRBcnJheVtpXS5sZW5ndGggPiA4MCkge1xyXG4gICAgICAgIHRleHRBcnJheVtpXSA9IHRleHRBcnJheVtpXS5zbGljZSgwLCA4MC10ZXh0QXJyYXlbaV0ubGVuZ3RoKVxyXG4gICAgICB9IFxyXG4gICAgfVxyXG4gICAgaWYgKHRleHRBcnJheS5sZW5ndGggPiA3MCkge1xyXG4gICAgICB0ZXh0QXJyYXkuc3BsaWNlKDcwIC0gdGV4dEFycmF5Lmxlbmd0aClcclxuICAgIH1cclxuICAgIHRoaXMub3B0aW9ucy50ZXh0ID0gdGV4dEFycmF5LmpvaW4oJ1xcbicpXHJcbiAgICB0aGlzLm9wdGlvbnMuY29sb3IgPSBvcHRpb25zLmNvbG9yIHx8IFwiI0ZGQzEwN1wiXHJcbiAgICAvLyB0aGlzLm9wdGlvbnMuY29ybmVyVHlwZSA9IG9wdGlvbnMuY29ybmVyVHlwZSB8fCAnTUlURVJFRCdcclxuICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnMgPSBvcHRpb25zLnBvc2l0aW9uc1xyXG4gICAgLy8gdGhpcy5vcHRpb25zLm1hdGVyaWFsID0gTnVtYmVyKG9wdGlvbnMubWF0ZXJpYWwpIHx8IDBcclxuICAgIHRoaXMub3B0aW9ucy5zcGVlZCA9IChvcHRpb25zLnNwZWVkIHx8IG9wdGlvbnMuc3BlZWQgPT09IDApID8gb3B0aW9ucy5zcGVlZCA6IDFcclxuICAgIC8vIHRoaXMub3B0aW9ucy5kdXJhdGlvbiA9IChvcHRpb25zLmR1cmF0aW9uIHx8IG9wdGlvbnMuZHVyYXRpb24gPT09IDApID8gb3B0aW9ucy5kdXJhdGlvbiA6IDUwMDAwXHJcbiAgICB0aGlzLm9wdGlvbnMuc2hvdyA9IChvcHRpb25zLnNob3cgfHwgb3B0aW9ucy5zaG93ID09PSBmYWxzZSkgPyBvcHRpb25zLnNob3cgOiB0cnVlXHJcbiAgICB0aGlzLm5vZGVQb2ludHMgPSBbXVxyXG4gICAgdGhpcy5lbnRpdHlcclxuICAgIHRoaXMub3B0aW9ucy5pbnN0cnVjdCA9IG9wdGlvbnMuaW5zdHJ1Y3QgfHwgXCJcIlxyXG4gICAgdGhpcy5vcHRpb25zLm9wZXJhdGluZ1BvaW50ID0gb3B0aW9ucy5vcGVyYXRpbmdQb2ludCB8fCBcIlwiXHJcbiAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlID0gb3B0aW9ucy5hdHRyaWJ1dGUgfHwge31cclxuICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluayA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluayB8fCB7fVxyXG4gICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnQgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudCB8fCBbXVxyXG4gICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5jYW1lcmEgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmNhbWVyYSB8fCBbXVxyXG4gICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZVR5cGUgPSBvcHRpb25zLmF0dHJpYnV0ZVR5cGUgfHwgJ3JpY2hUZXh0J1xyXG4gICAgdGhpcy5leHRydWRlZEhlaWdodFxyXG4gICAgdGhpcy5fRXZlbnRCaW5kaW5nID0gbmV3IEV2ZW50QmluZGluZygpXHJcbiAgICB0aGlzLkRpYWxvZyA9IF9EaWFsb2dcclxuICAgIHRoaXMuX2VsbXMgPSB7fTtcclxuICAgIHRoaXMuc2RrLmFkZEluY2V0YW5jZSh0aGlzLm9wdGlvbnMuaWQsIHRoaXMpXHJcbiAgICBTdGFuZFRleHQuY3JlYXRlKHRoaXMpXHJcbiAgfVxyXG5cclxuICBnZXQgdGV4dCgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMudGV4dFxyXG4gIH1cclxuXHJcbiAgc2V0IHRleHQodikge1xyXG4gICAgdGhpcy5vcHRpb25zLnRleHQgPSB2XHJcbiAgICBsZXQgdGV4dEFycmF5ID0gdGhpcy5vcHRpb25zLnRleHQuc3BsaXQoJ1xcbicpXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRleHRBcnJheS5sZW5ndGg7IGkrKykge1xyXG4gICAgICBpZiAodGV4dEFycmF5W2ldLmxlbmd0aCA+IDgwKSB7XHJcbiAgICAgICAgbGV0IF9lcnJvciA9ICfooYzotoXov4c4MOS4quWtl+espizor7fmjInlm57ovabvvIhFbnRlcu+8ieWQju+8jOe7p+e7rei+k+WFpSdcclxuICAgICAgICB3aW5kb3cuRUxFTUVOVCAmJiB3aW5kb3cuRUxFTUVOVC5NZXNzYWdlKHtcclxuICAgICAgICAgIG1lc3NhZ2U6IF9lcnJvcixcclxuICAgICAgICAgIHR5cGU6ICd3YXJuaW5nJyxcclxuICAgICAgICAgIGR1cmF0aW9uOiAxMDAwXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGV4dEFycmF5W2ldID0gdGV4dEFycmF5W2ldLnNsaWNlKDAsIDgwLXRleHRBcnJheVtpXS5sZW5ndGgpXHJcbiAgICAgIH0gXHJcbiAgICB9XHJcbiAgICBpZiAodGV4dEFycmF5Lmxlbmd0aCA+IDcwKSB7XHJcbiAgICAgIHRleHRBcnJheS5zcGxpY2UoNzAgLSB0ZXh0QXJyYXkubGVuZ3RoKVxyXG4gICAgICBsZXQgX2Vycm9yID0gJ+i2hei/h+acgOWkp+i+k+WFpeWtl+espidcclxuICAgICAgICB3aW5kb3cuRUxFTUVOVCAmJiB3aW5kb3cuRUxFTUVOVC5NZXNzYWdlKHtcclxuICAgICAgICAgIG1lc3NhZ2U6IF9lcnJvcixcclxuICAgICAgICAgIHR5cGU6ICd3YXJuaW5nJyxcclxuICAgICAgICAgIGR1cmF0aW9uOiAxMDAwXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLm9wdGlvbnMudGV4dCA9IHRleHRBcnJheS5qb2luKCdcXG4nKVxyXG4gICAgaWYgKHRoaXMuZW50aXR5KSB7XHJcbiAgICAgIGxldCBwb3NpdGlvbnMgPSB0aGlzLm9wdGlvbnMucG9zaXRpb25zXHJcbiAgICAgIGxldCBmcm9tRGVncmVlc0FycmF5ID0gW11cclxuICAgICAgbGV0IG1pbmltdW1IZWlnaHRzID0gW11cclxuICAgICAgbGV0IG1heGltdW1IZWlnaHRzID0gW11cclxuICAgICAgbGV0IG1hdGVyaWFsID0gdGhpcy5nZXRNYXRlcmlhbCgpXHJcbiAgICAgIGxldCB3aWR0aCA9IHRoaXMuY29tcHV0ZURpc3RhbmNlMihwb3NpdGlvbnMpXHJcbiAgICAgIGxldCBleHRydWRlZEhlaWdodCA9IHRoaXMuYXNwZWN0UmF0aW8gPyAod2lkdGggLyB0aGlzLmFzcGVjdFJhdGlvKSA6IDBcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBmcm9tRGVncmVlc0FycmF5LnB1c2gocG9zaXRpb25zW2ldLmxuZywgcG9zaXRpb25zW2ldLmxhdClcclxuICAgICAgICBtaW5pbXVtSGVpZ2h0cy5wdXNoKHBvc2l0aW9uc1tpXS5hbHQpXHJcbiAgICAgICAgbWF4aW11bUhlaWdodHMucHVzaChwb3NpdGlvbnNbaV0uYWx0ICsgZXh0cnVkZWRIZWlnaHQpXHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5lbnRpdHkud2FsbC5tYXRlcmlhbCA9IG1hdGVyaWFsXHJcbiAgICAgIHRoaXMuZW50aXR5LndhbGwubWF4aW11bUhlaWdodHMgPSBtYXhpbXVtSGVpZ2h0c1xyXG4gICAgICB0aGlzLmVudGl0eS53YWxsLm1pbmltdW1IZWlnaHRzID0gbWluaW11bUhlaWdodHNcclxuICAgIH1cclxuICAgIHRoaXMuX2VsbXMudGV4dCAmJiB0aGlzLl9lbG1zLnRleHQuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICBpdGVtLnZhbHVlID0gdlxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGdldCBjb2xvcigpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuY29sb3JcclxuICB9XHJcbiAgc2V0IGNvbG9yKHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5jb2xvciA9IHZcclxuICAgIHRoaXMuZW50aXR5LndhbGwubWF0ZXJpYWwgPSB0aGlzLmdldE1hdGVyaWFsKClcclxuICAgIGlmICh0aGlzLl9lbG1zLmNvbG9yKSB7XHJcbiAgICAgIHRoaXMuX2VsbXMuY29sb3IuZm9yRWFjaCgoaXRlbSwgaSkgPT4ge1xyXG4gICAgICAgIGxldCBjb2xvclBpY2tlciA9IG5ldyBZSkNvbG9yUGlja2VyKHtcclxuICAgICAgICAgIGVsOiBpdGVtLmVsLFxyXG4gICAgICAgICAgc2l6ZTogJ21pbmknLC8v6aKc6ImyYm9457G75Z6LXHJcbiAgICAgICAgICBhbHBoYTogdHJ1ZSwvL+aYr+WQpuW8gOWQr+mAj+aYjuW6plxyXG4gICAgICAgICAgZGVmYXVsdENvbG9yOiB2LFxyXG4gICAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLC8v5piv5ZCm56aB5q2i5omT5byA6aKc6Imy6YCJ5oup5ZmoXHJcbiAgICAgICAgICBvcGVuUGlja2VyQW5pOiAnb3BhY2l0eScsLy/miZPlvIDpopzoibLpgInmi6nlmajliqjnlLtcclxuICAgICAgICAgIHN1cmU6IChjKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuY29sb3IgPSBjXHJcbiAgICAgICAgICB9LC8v54K55Ye756Gu6K6k5oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgICAgICBjbGVhcjogKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmNvbG9yID0gJ3JnYmEoMjU1LDI1NSwyNTUsMSknXHJcbiAgICAgICAgICB9LC8v54K55Ye75riF56m65oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgICAgfSlcclxuICAgICAgICB0aGlzLl9lbG1zLmNvbG9yW2ldID0gY29sb3JQaWNrZXJcclxuICAgICAgfSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIGdldCBtYXRlcmlhbCgpIHtcclxuICAvLyAgIHJldHVybiB0aGlzLm9wdGlvbnMubWF0ZXJpYWxcclxuICAvLyB9XHJcbiAgLy8gc2V0IG1hdGVyaWFsKHYpIHtcclxuICAvLyAgIHRoaXMub3B0aW9ucy5tYXRlcmlhbCA9IE51bWJlcih2KVxyXG4gIC8vICAgdGhpcy5lbnRpdHkud2FsbC5tYXRlcmlhbCA9IHRoaXMuZ2V0TWF0ZXJpYWwoKVxyXG4gIC8vICAgdGhpcy5fZWxtcy5tYXRlcmlhbCAmJiB0aGlzLl9lbG1zLm1hdGVyaWFsLmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAvLyAgICAgaXRlbS52YWx1ZSA9IHZcclxuICAvLyAgIH0pXHJcbiAgLy8gfVxyXG5cclxuICBnZXQgc3BlZWQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLnNwZWVkXHJcbiAgfVxyXG5cclxuICBzZXQgc3BlZWQodikge1xyXG4gICAgdGhpcy5vcHRpb25zLnNwZWVkID0gdlxyXG4gICAgdGhpcy5lbnRpdHkud2FsbC5tYXRlcmlhbCA9IHRoaXMuZ2V0TWF0ZXJpYWwoKVxyXG4gICAgdGhpcy5fZWxtcy5zcGVlZCAmJiB0aGlzLl9lbG1zLnNwZWVkLmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgaXRlbS52YWx1ZSA9IHZcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuXHJcbiAgLy8gZ2V0IGF0dHJpYnV0ZUxpbmsoKSB7XHJcbiAgLy8gICByZXR1cm4gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnRcclxuICAvLyB9XHJcblxyXG4gIC8vIHNldCBhdHRyaWJ1dGVMaW5rKHYpIHtcclxuICAvLyAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50ID0gdlxyXG4gIC8vICAgaWYgKCF0aGlzLl9EaWFsb2dPYmplY3QgfHwgIXRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudCB8fCAhdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmNvbnRlbnQpIHtcclxuICAvLyAgICAgcmV0dXJuXHJcbiAgLy8gICB9XHJcbiAgLy8gICBsZXQgdGFibGUgPSB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdhdHRyaWJ1dGUtY29udGVudC1saW5rJylbMV0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndGFibGUnKVswXVxyXG4gIC8vICAgbGV0IHRhYmxlQ29udGVudCA9IHRhYmxlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RhYmxlLWJvZHknKVswXVxyXG4gIC8vICAgdGFibGVDb250ZW50LmlubmVySFRNTCA9ICcnXHJcbiAgLy8gICBpZiAodGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnQubGVuZ3RoID4gMCkge1xyXG4gIC8vICAgICB0YWJsZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0YWJsZS1lbXB0eScpWzBdLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSdcclxuICAvLyAgIH1cclxuICAvLyAgIGVsc2Uge1xyXG4gIC8vICAgICB0YWJsZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0YWJsZS1lbXB0eScpWzBdLnN0eWxlLmRpc3BsYXkgPSAnZmxleCdcclxuICAvLyAgIH1cclxuICAvLyAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnQubGVuZ3RoOyBpKyspIHtcclxuICAvLyAgICAgbGV0IHRyID0gYFxyXG4gIC8vICAgICA8ZGl2IGNsYXNzPVwidHJcIj5cclxuICAvLyAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZFwiPmAgKyB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudFtpXS5uYW1lICsgYDwvZGl2PlxyXG4gIC8vICAgICAgICAgPGRpdiBjbGFzcz1cInRkXCI+YCArIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50W2ldLnVybCArIGA8L2Rpdj5cclxuICAvLyAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZFwiPlxyXG4gIC8vICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJ0ZXh0XCIgQGNsaWNrPVwibGlua0VkaXRcIj7nvJbovpE8L2J1dHRvbj5cclxuICAvLyAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwidGV4dFwiIEBjbGljaz1cImxpbmtEZWxldGVcIj7liKDpmaQ8L2J1dHRvbj5cclxuICAvLyAgICAgICAgIDwvZGl2PlxyXG4gIC8vICAgICA8L2Rpdj5gXHJcbiAgLy8gICAgIGxldCB0ckVsbSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCkuY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50KHRyKVxyXG4gIC8vICAgICB0YWJsZUNvbnRlbnQuYXBwZW5kQ2hpbGQodHJFbG0pXHJcbiAgLy8gICB9XHJcbiAgLy8gICBsZXQgaXRlbSA9IHRhYmxlQ29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0cicpXHJcbiAgLy8gICBsZXQgZnVuID0ge1xyXG4gIC8vICAgICBsaW5rRWRpdDogYXN5bmMgKGluZGV4KSA9PiB7XHJcbiAgLy8gICAgICAgdGhpcy5hdHRyaWJ1dGVMaW5rID0gYXdhaXQgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnRcclxuICAvLyAgICAgICBsZXQgdGFibGUgPSB0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdhdHRyaWJ1dGUtY29udGVudC1saW5rJylbMV0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndGFibGUnKVswXVxyXG4gIC8vICAgICAgIGxldCB0YWJsZUNvbnRlbnQgPSB0YWJsZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0YWJsZS1ib2R5JylbMF1cclxuICAvLyAgICAgICBsZXQgaXRlbSA9IHRhYmxlQ29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0cicpXHJcbiAgLy8gICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpdGVtLmxlbmd0aDsgaSsrKSB7XHJcbiAgLy8gICAgICAgICBpZiAoaW5kZXggPT09IGkpIHtcclxuICAvLyAgICAgICAgICAgbGV0IGh0bWwgPSBgXHJcbiAgLy8gICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRkXCI+XHJcbiAgLy8gICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJpbnB1dFwiIHR5cGU9XCJ0ZXh0XCI+XHJcbiAgLy8gICAgICAgICAgICAgPC9kaXY+XHJcbiAgLy8gICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRkXCI+XHJcbiAgLy8gICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXBcIj5cclxuICAvLyAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiaW5wdXRcIiB0eXBlPVwidGV4dFwiIHN0eWxlPVwid2lkdGg6IDE0MHB4O1wiPlxyXG4gIC8vICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImZpbGVcIiBhY2NlcHQ9XCIubXA0LCAucGRmXCIgY2xhc3M9XCJmaWxlLXNlbGVjdFwiIGluZGV4PVwiYCsgaSArIGBcIiBzdHlsZT1cImRpc3BsYXk6bm9uZVwiPlxyXG4gIC8vICAgICAgICAgICAgICAgICA8YnV0dG9uIEBjbGljaz1cImZpbGVTZWxlY3RcIj4uLi48L2J1dHRvbj5cclxuICAvLyAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gIC8vICAgICAgICAgICAgIDwvZGl2PlxyXG4gIC8vICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZFwiPlxyXG4gIC8vICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwidGV4dFwiIEBjbGljaz1cImNvbmZpcm1FZGl0XCI+56Gu6K6kPC9idXR0b24+XHJcbiAgLy8gICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJ0ZXh0XCIgQGNsaWNrPVwiY2FuY2VsRWRpdFwiPuWPlua2iDwvYnV0dG9uPlxyXG4gIC8vICAgICAgICAgICAgIDwvZGl2PmBcclxuICAvLyAgICAgICAgICAgaXRlbVtpXS5pbm5lckhUTUwgPSBodG1sXHJcbiAgLy8gICAgICAgICAgIGxldCB0ZCA9IGl0ZW1baV0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndGQnKVxyXG4gIC8vICAgICAgICAgICB0ZFswXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdpbnB1dCcpWzBdLnZhbHVlID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnRbaW5kZXhdLm5hbWVcclxuICAvLyAgICAgICAgICAgdGRbMV0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaW5wdXQnKVswXS52YWx1ZSA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50W2luZGV4XS51cmxcclxuICAvLyAgICAgICAgICAgbGV0IGJ0biA9IGl0ZW1baV0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2J1dHRvbicpXHJcbiAgLy8gICAgICAgICAgIGZvciAobGV0IG4gPSAwOyBuIDwgYnRuLmxlbmd0aDsgbisrKSB7XHJcbiAgLy8gICAgICAgICAgICAgZm9yIChsZXQgbSBvZiBidG5bbl0uYXR0cmlidXRlcykge1xyXG4gIC8vICAgICAgICAgICAgICAgaWYgKG0ubmFtZSA9PT0gJ0BjbGljaycpIHtcclxuICAvLyAgICAgICAgICAgICAgICAgYnRuW25dLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcclxuICAvLyAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIChmdW5bbS52YWx1ZV0pID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgLy8gICAgICAgICAgICAgICAgICAgICBmdW5bbS52YWx1ZV0oeyBuYW1lOiB0ZFswXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdpbnB1dCcpWzBdLnZhbHVlLCB1cmw6IHRkWzFdLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2lucHV0JylbMF0udmFsdWUgfSwgaSlcclxuICAvLyAgICAgICAgICAgICAgICAgICB9XHJcbiAgLy8gICAgICAgICAgICAgICAgIH0pO1xyXG4gIC8vICAgICAgICAgICAgICAgICBidG5bbl0uYXR0cmlidXRlcy5yZW1vdmVOYW1lZEl0ZW0obS5uYW1lKVxyXG4gIC8vICAgICAgICAgICAgICAgICBicmVha1xyXG4gIC8vICAgICAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgICAgIH1cclxuICAvLyAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgICBicmVha1xyXG4gIC8vICAgICAgICAgfVxyXG4gIC8vICAgICAgIH1cclxuICAvLyAgICAgfSxcclxuICAvLyAgICAgbGlua0RlbGV0ZTogKGkpID0+IHtcclxuICAvLyAgICAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudC5zcGxpY2UoaSwgMSlcclxuICAvLyAgICAgICB0aGlzLmF0dHJpYnV0ZUxpbmsgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudFxyXG4gIC8vICAgICB9LFxyXG5cclxuICAvLyAgICAgY29uZmlybUVkaXQ6ICh2YWx1ZSwgaSkgPT4ge1xyXG4gIC8vICAgICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50W2ldID0gdmFsdWVcclxuICAvLyAgICAgICB0aGlzLmF0dHJpYnV0ZUxpbmsgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudFxyXG4gIC8vICAgICB9LFxyXG4gIC8vICAgICBjYW5jZWxFZGl0OiAoKSA9PiB7XHJcbiAgLy8gICAgICAgdGhpcy5hdHRyaWJ1dGVMaW5rID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnRcclxuICAvLyAgICAgfSxcclxuICAvLyAgICAgZmlsZVNlbGVjdDogKHZhbHVlLCBpKSA9PiB7XHJcbiAgLy8gICAgICAgbGV0IGZpbGVFbG0gPSBpdGVtW2ldLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2ZpbGUtc2VsZWN0JylbMF1cclxuICAvLyAgICAgICBmaWxlRWxtLmNsaWNrKClcclxuICAvLyAgICAgICBmaWxlRWxtLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGZpbGVTZWxlY3QpXHJcbiAgLy8gICAgICAgZmlsZUVsbS5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBmaWxlU2VsZWN0KVxyXG4gIC8vICAgICB9XHJcbiAgLy8gICB9XHJcbiAgLy8gICBsZXQgZmlsZVNlbGVjdCA9IChldmVudCkgPT4ge1xyXG4gIC8vICAgICBpZiAoZXZlbnQudGFyZ2V0LnZhbHVlKSB7XHJcbiAgLy8gICAgICAgbGV0IHRkID0gaXRlbVtldmVudC50YXJnZXQuZ2V0QXR0cmlidXRlKCdpbmRleCcpXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0ZCcpXHJcbiAgLy8gICAgICAgdGRbMV0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaW5wdXQnKVswXS52YWx1ZSA9IGV2ZW50LnRhcmdldC52YWx1ZVxyXG4gIC8vICAgICAgIGV2ZW50LnRhcmdldC52YWx1ZSA9IG51bGxcclxuICAvLyAgICAgfVxyXG4gIC8vICAgfVxyXG4gIC8vICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpdGVtLmxlbmd0aDsgaSsrKSB7XHJcbiAgLy8gICAgIGxldCBidG4gPSBpdGVtW2ldLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdidXR0b24nKVxyXG4gIC8vICAgICBmb3IgKGxldCBuID0gMDsgbiA8IGJ0bi5sZW5ndGg7IG4rKykge1xyXG4gIC8vICAgICAgIGZvciAobGV0IG0gb2YgYnRuW25dLmF0dHJpYnV0ZXMpIHtcclxuICAvLyAgICAgICAgIGlmIChtLm5hbWUgPT09ICdAY2xpY2snKSB7XHJcbiAgLy8gICAgICAgICAgIGJ0bltuXS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XHJcbiAgLy8gICAgICAgICAgICAgaWYgKHR5cGVvZiAoZnVuW20udmFsdWVdKSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gIC8vICAgICAgICAgICAgICAgZnVuW20udmFsdWVdKGkpXHJcbiAgLy8gICAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgICB9KTtcclxuICAvLyAgICAgICAgICAgYnRuW25dLmF0dHJpYnV0ZXMucmVtb3ZlTmFtZWRJdGVtKG0ubmFtZSlcclxuICAvLyAgICAgICAgICAgYnJlYWtcclxuICAvLyAgICAgICAgIH1cclxuICAvLyAgICAgICB9XHJcbiAgLy8gICAgIH1cclxuICAvLyAgIH1cclxuXHJcblxyXG5cclxuXHJcbiAgLy8gfVxyXG5cclxuICBnZXQgYXR0cmlidXRlQ2FtZXJhKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUuY2FtZXJhXHJcbiAgfVxyXG5cclxuICBzZXQgYXR0cmlidXRlQ2FtZXJhKHYpIHtcclxuICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUuY2FtZXJhID0gdlxyXG4gIH1cclxuXHJcbiAgLy/liJvlu7pcclxuICBzdGF0aWMgYXN5bmMgY3JlYXRlKHRoYXQpIHtcclxuXHJcbiAgICAvLyBjb25zb2xlLmxvZyhuZXcgQ2VzaXVtLkN1c3RvbU1hdGVyaWFsU291cmNlKCksIG5ldyBDZXNpdW0uUG9seWxpbmVUcmFpbExpbmtNYXRlcmlhbFByb3BlcnR5KCkpXHJcbiAgICBsZXQgcG9zaXRpb25zID0gdGhhdC5vcHRpb25zLnBvc2l0aW9uc1xyXG4gICAgbGV0IGZyb21EZWdyZWVzQXJyYXkgPSBbXVxyXG4gICAgbGV0IG1pbmltdW1IZWlnaHRzID0gW11cclxuICAgIGxldCBtYXhpbXVtSGVpZ2h0cyA9IFtdXHJcbiAgICBsZXQgbWF0ZXJpYWwgPSB0aGF0LmdldE1hdGVyaWFsKClcclxuICAgIGxldCB3aWR0aCA9IHRoYXQuY29tcHV0ZURpc3RhbmNlMihwb3NpdGlvbnMpXHJcbiAgICBsZXQgZXh0cnVkZWRIZWlnaHQgPSB0aGF0LmFzcGVjdFJhdGlvID8gKHdpZHRoIC8gdGhhdC5hc3BlY3RSYXRpbykgOiAwXHJcbiAgICAvLyBhc3BlY3RSYXRpb1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgZnJvbURlZ3JlZXNBcnJheS5wdXNoKHBvc2l0aW9uc1tpXS5sbmcsIHBvc2l0aW9uc1tpXS5sYXQpXHJcbiAgICAgIG1pbmltdW1IZWlnaHRzLnB1c2gocG9zaXRpb25zW2ldLmFsdClcclxuICAgICAgbWF4aW11bUhlaWdodHMucHVzaChwb3NpdGlvbnNbaV0uYWx0ICsgZXh0cnVkZWRIZWlnaHQpXHJcbiAgICB9XHJcblxyXG4gICAgdGhhdC5lbnRpdHkgPSB0aGF0LnNkay52aWV3ZXIuZW50aXRpZXMuYWRkKHtcclxuICAgICAgaWQ6IHRoYXQub3B0aW9ucy5pZCxcclxuICAgICAgc2hvdzogdGhhdC5vcHRpb25zLnNob3csXHJcbiAgICAgIHdhbGw6IHtcclxuICAgICAgICBwb3NpdGlvbnM6IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzQXJyYXkoZnJvbURlZ3JlZXNBcnJheSksXHJcbiAgICAgICAgY29ybmVyVHlwZTogQ2VzaXVtLkNvcm5lclR5cGUuTUlURVJFRCxcclxuICAgICAgICBtYXhpbXVtSGVpZ2h0czogbWF4aW11bUhlaWdodHMsXHJcbiAgICAgICAgbWluaW11bUhlaWdodHM6IG1pbmltdW1IZWlnaHRzLFxyXG4gICAgICAgIG1hdGVyaWFsOiBtYXRlcmlhbCxcclxuICAgICAgfSxcclxuICAgICAgLy8gd2FsbDoge1xyXG4gICAgICAvLyAgIHBvc2l0aW9uczogQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXNBcnJheUhlaWdodHMoZnJvbURlZ3JlZXNBcnJheSksXHJcbiAgICAgIC8vICAgbWF4aW11bUhlaWdodHM6IG1heGltdW1IZWlnaHRzLFxyXG4gICAgICAvLyAgIG1pbmltdW1IZWlnaHRzOiBtaW5pbXVtSGVpZ2h0cyxcclxuICAgICAgLy8gICBtYXRlcmlhbDogbmV3IENlc2l1bS5Qb2x5bGluZVRyYWlsTGlua01hdGVyaWFsUHJvcGVydHkoe2R1cmF0aW9uOiAxNTAwfSksXHJcbiAgICAgIC8vICAgb3V0bGluZTogdHJ1ZSxcclxuICAgICAgLy8gICBvdXRsaW5lQ29sb3I6IENlc2l1bS5Db2xvci5CTEFDSyxcclxuICAgICAgLy8gfVxyXG4gICAgfSlcclxuICAgIHN5bmNEYXRhKHRoYXQuc2RrLCB0aGF0Lm9wdGlvbnMuaWQpXHJcbiAgICBpZih0aGF0Lm9wdGlvbnMuc2hvdykge1xyXG4gICAgICAgXHJcbiAgICAgIHNldFNwbGl0RGlyZWN0aW9uKDAsIHRoYXQub3B0aW9ucy5pZClcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIOe8lui+keahhlxyXG4gIGFzeW5jIGVkaXQoc3RhdGUpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXNcclxuICAgIHRoaXMub3JpZ2luYWxPcHRpb25zID0gdGhpcy5kZWVwQ29weU9iaih0aGlzLm9wdGlvbnMpXHJcblxyXG4gICAgaWYgKHRoaXMuX0RpYWxvZ09iamVjdCAmJiB0aGlzLl9EaWFsb2dPYmplY3QuY2xvc2UpIHtcclxuICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0LmNsb3NlKClcclxuICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0ID0gbnVsbFxyXG4gICAgfVxyXG4gICAgaWYgKHN0YXRlKSB7XHJcbiAgICAgIHRoaXMuX0RpYWxvZ09iamVjdCA9IGF3YWl0IG5ldyBEaWFsb2codGhpcy5zZGssIHRoaXMub3B0aW9ucywge1xyXG4gICAgICAgIHRpdGxlOiAn56uL5L2T5paH5a2X5bGe5oCnJywgbGVmdDogJzE4MHB4JywgdG9wOiAnMTAwcHgnLFxyXG4gICAgICAgIGNvbmZpcm1DYWxsQmFjazogKG9wdGlvbnMpID0+IHtcclxuICAgICAgICAgIHRoaXMudGV4dCA9IHRoaXMudGV4dC50cmltKClcclxuICAgICAgICAgIGlmICghdGhpcy50ZXh0KSB7XHJcbiAgICAgICAgICAgIHRoaXMudGV4dCA9ICfmnKrlkb3lkI3lr7nosaEnXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLm9yaWdpbmFsT3B0aW9ucyA9IHRoaXMuZGVlcENvcHlPYmoodGhpcy5vcHRpb25zKVxyXG4gICAgICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0LmNsb3NlKClcclxuICAgICAgICAgIHRoaXMuRGlhbG9nLmNvbmZpcm1DYWxsQmFjayAmJiB0aGlzLkRpYWxvZy5jb25maXJtQ2FsbEJhY2sodGhpcy5vcmlnaW5hbE9wdGlvbnMpXHJcbiAgICAgICAgICBzeW5jRGF0YSh0aGlzLnNkaywgdGhpcy5vcHRpb25zLmlkKVxyXG4gICAgICAgICAgc3luY1NwbGl0RGF0YSh0aGlzLnNkaywgdGhpcy5vcHRpb25zLmlkKVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgcmVzZXRDYWxsQmFjazogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5yZXNldCgpXHJcbiAgICAgICAgICB0aGlzLkRpYWxvZy5yZXNldENhbGxCYWNrICYmIHRoaXMuRGlhbG9nLnJlc2V0Q2FsbEJhY2soKVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgcmVtb3ZlQ2FsbEJhY2s6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMuRGlhbG9nLnJlbW92ZUNhbGxCYWNrICYmIHRoaXMuRGlhbG9nLnJlbW92ZUNhbGxCYWNrKClcclxuICAgICAgICB9LFxyXG4gICAgICAgIGNsb3NlQ2FsbEJhY2s6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMucmVzZXQoKVxyXG4gICAgICAgICAgdGhpcy5EaWFsb2cuY2xvc2VDYWxsQmFjayAmJiB0aGlzLkRpYWxvZy5jbG9zZUNhbGxCYWNrKClcclxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5ub2RlUG9pbnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2RrLnZpZXdlci5lbnRpdGllcy5yZW1vdmUodGhpcy5ub2RlUG9pbnRzW2ldKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5ub2RlUG9pbnRzID0gW11cclxuICAgICAgICAgIFlKLk1lYXN1cmUuU2V0TWVhc3VyZVN0YXR1cyhmYWxzZSlcclxuICAgICAgICAgIHRoaXMuZXZlbnQgJiYgdGhpcy5ldmVudC5kZXN0cm95KClcclxuICAgICAgICAgIHRoaXMudGlwICYmIHRoaXMudGlwLmRlc3Ryb3koKVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgc2hvd0NhbGxCYWNrOiAoc2hvdykgPT4ge1xyXG4gICAgICAgICAgdGhpcy5vcHRpb25zLnNob3cgPSBzaG93XHJcbiAgICAgICAgICB0aGlzLm9yaWdpbmFsT3B0aW9ucy5zaG93ID0gc2hvd1xyXG4gICAgICAgICAgdGhpcy5zaG93ID0gc2hvd1xyXG4gICAgICAgICAgdGhpcy5EaWFsb2cuc2hvd0NhbGxCYWNrICYmIHRoaXMuRGlhbG9nLnNob3dDYWxsQmFjaygpXHJcbiAgICAgICAgfSxcclxuICAgICAgICBzZWNvbmRhcnlFZGl0Q2FsbEJhY2s6ICgpID0+IHtcclxuICAgICAgICAgIFN0YW5kVGV4dC5ub2RlRWRpdCh0aGlzKVxyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmJvZHkuY2xhc3NOYW1lID0gdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50LmJvZHkuY2xhc3NOYW1lICsgJyBzdGFuZC10ZXh0J1xyXG4gICAgICBsZXQgY29udGVudEVsbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICBjb250ZW50RWxtLmlubmVySFRNTCA9IGh0bWwodGhpcylcclxuICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0LmNvbnRlbnRBcHBDaGlsZChjb250ZW50RWxtKVxyXG4gICAgICB0aGlzLmF0dHJpYnV0ZVR5cGUgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlVHlwZVxyXG4gICAgICB0aGlzLmF0dHJpYnV0ZUNhbWVyYSA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUuY2FtZXJhXHJcbiAgICAgIC8vIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAvLyAgIHRoaXMuYXR0cmlidXRlTGluayA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50XHJcbiAgICAgIC8vICAgdGhpcy5jYW1lcmFTZWxlY3QoKVxyXG4gICAgICAvLyB9LCA1MDApO1xyXG5cclxuICAgICAgLy8g5Yib5bu65qCH562+6aG1XHJcbiAgICAgIC8vIGxldCB0YWJzRWxtID0gbmV3IGN5X3RhYnMoJ3JhZGFyLXNjYW4tZWRpdC10YWJzJylcclxuICAgICAgLy8g6aKc6Imy57uE5Lu2XHJcbiAgICAgIGxldCBjb2xvclBpY2tlciA9IG5ldyBZSkNvbG9yUGlja2VyKHtcclxuICAgICAgICBlbDogY29udGVudEVsbS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFwiY29sb3JcIilbMF0sXHJcbiAgICAgICAgc2l6ZTogJ21pbmknLC8v6aKc6ImyYm9457G75Z6LXHJcbiAgICAgICAgYWxwaGE6IHRydWUsLy/mmK/lkKblvIDlkK/pgI/mmI7luqZcclxuICAgICAgICBkZWZhdWx0Q29sb3I6IHRoaXMuY29sb3IsXHJcbiAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLC8v5piv5ZCm56aB5q2i5omT5byA6aKc6Imy6YCJ5oup5ZmoXHJcbiAgICAgICAgb3BlblBpY2tlckFuaTogJ29wYWNpdHknLC8v5omT5byA6aKc6Imy6YCJ5oup5Zmo5Yqo55S7XHJcbiAgICAgICAgc3VyZTogKGNvbG9yKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmNvbG9yID0gY29sb3JcclxuICAgICAgICB9LC8v54K55Ye756Gu6K6k5oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgICAgY2xlYXI6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMuY29sb3IgPSAncmdiYSgyNTUsMjU1LDI1NSwxKSdcclxuICAgICAgICB9LC8v54K55Ye75riF56m65oyJ6ZKu5LqL5Lu25Zue6LCDXHJcbiAgICAgIH0pXHJcblxyXG4gICAgICBsZXQgYWxsX2VsbSA9IGNvbnRlbnRFbG0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCIqXCIpXHJcbiAgICAgIHRoaXMuX0V2ZW50QmluZGluZy5vbih0aGlzLCBhbGxfZWxtKVxyXG4gICAgICB0aGlzLl9lbG1zID0gdGhpcy5fRXZlbnRCaW5kaW5nLmVsZW1lbnRcclxuICAgICAgdGhpcy5fZWxtcy5jb2xvciA9IFtjb2xvclBpY2tlcl1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmICh0aGlzLl9EaWFsb2dPYmplY3QgJiYgdGhpcy5fRGlhbG9nT2JqZWN0LnJlbW92ZSkge1xyXG4gICAgICAgIHRoaXMuX0RpYWxvZ09iamVjdC5yZW1vdmUoKVxyXG4gICAgICAgIHRoaXMuX0RpYWxvZ09iamVjdCA9IG51bGxcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVzZXQoKSB7XHJcbiAgICBpZiAoIXRoaXMuZW50aXR5KSB7XHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG4gICAgdGhpcy5vcHRpb25zID0gdGhpcy5kZWVwQ29weU9iaih0aGlzLm9yaWdpbmFsT3B0aW9ucylcclxuICAgIHRoaXMudGV4dCA9IHRoaXMub3JpZ2luYWxPcHRpb25zLnRleHRcclxuICAgIHRoaXMuY29sb3IgPSB0aGlzLm9yaWdpbmFsT3B0aW9ucy5jb2xvclxyXG4gICAgdGhpcy5zcGVlZCA9IHRoaXMub3JpZ2luYWxPcHRpb25zLnNwZWVkXHJcblxyXG4gICAgbGV0IHBvc2l0aW9ucyA9IHRoaXMub3B0aW9ucy5wb3NpdGlvbnNcclxuICAgIGxldCBmcm9tRGVncmVlc0FycmF5ID0gW11cclxuICAgIGxldCBtaW5pbXVtSGVpZ2h0cyA9IFtdXHJcbiAgICBsZXQgbWF4aW11bUhlaWdodHMgPSBbXVxyXG4gICAgbGV0IHdpZHRoID0gdGhpcy5jb21wdXRlRGlzdGFuY2UyKHBvc2l0aW9ucylcclxuICAgIGxldCBleHRydWRlZEhlaWdodCA9IHRoaXMuYXNwZWN0UmF0aW8gPyAod2lkdGggLyB0aGlzLmFzcGVjdFJhdGlvKSA6IDBcclxuICAgIC8vIGFzcGVjdFJhdGlvXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBmcm9tRGVncmVlc0FycmF5LnB1c2gocG9zaXRpb25zW2ldLmxuZywgcG9zaXRpb25zW2ldLmxhdClcclxuICAgICAgbWluaW11bUhlaWdodHMucHVzaChwb3NpdGlvbnNbaV0uYWx0KVxyXG4gICAgICBtYXhpbXVtSGVpZ2h0cy5wdXNoKHBvc2l0aW9uc1tpXS5hbHQgKyBleHRydWRlZEhlaWdodClcclxuICAgIH1cclxuICAgIHRoaXMuZW50aXR5LndhbGwucG9zaXRpb25zID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXNBcnJheShmcm9tRGVncmVlc0FycmF5KVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgcmVtb3ZlKCkge1xyXG4gICAgdGhpcy5ldmVudCAmJiB0aGlzLmV2ZW50LmRlc3Ryb3koKVxyXG4gICAgdGhpcy50aXAgJiYgdGhpcy50aXAuZGVzdHJveSgpXHJcbiAgICB0aGlzLnNkay52aWV3ZXIuZW50aXRpZXMucmVtb3ZlKHRoaXMuZW50aXR5KVxyXG4gICAgdGhpcy5lbnRpdHkgPSBudWxsXHJcbiAgICBpZiAodGhpcy5fRGlhbG9nT2JqZWN0ICYmICF0aGlzLl9EaWFsb2dPYmplY3QuaXNEZXN0cm95KSB7XHJcbiAgICAgIHRoaXMuX0RpYWxvZ09iamVjdC5jbG9zZSgpXHJcbiAgICAgIHRoaXMuX0RpYWxvZ09iamVjdCA9IG51bGxcclxuICAgIH1cclxuICAgIGF3YWl0IHRoaXMuc2RrLnJlbW92ZUluY2V0YW5jZSh0aGlzLm9wdGlvbnMuaWQpXHJcbiAgICBhd2FpdCBzeW5jRGF0YSh0aGlzLnNkaywgdGhpcy5vcHRpb25zLmlkKVxyXG4gIH1cclxuXHJcbiAgZ2V0TWF0ZXJpYWwoKSB7XHJcbiAgICBsZXQgbWF0ZXJpYWxcclxuICAgIGxldCBjYW52YXMgPSB0aGlzLmdldGNhbnZhcygpXHJcbiAgICBtYXRlcmlhbCA9IG5ldyBDZXNpdW0uQ3VzdG9tTWF0ZXJpYWxTb3VyY2Uoe1xyXG4gICAgICBpbWFnZTogY2FudmFzLnRvRGF0YVVSTChcImltYWdlL3BuZ1wiKSxcclxuICAgICAgY29sb3I6IHRoaXMub3B0aW9ucy5jb2xvcixcclxuICAgICAgcmVwZWF0OiBuZXcgQ2VzaXVtLkNhcnRlc2lhbjIoMSwgMS4wKSxcclxuICAgICAgZHVyYXRpb246IDUwMDAwIC8gdGhpcy5vcHRpb25zLnNwZWVkLFxyXG4gICAgICBmbHRyOiBmYWxzZVxyXG4gICAgfSlcclxuICAgIHJldHVybiBtYXRlcmlhbFxyXG4gIH1cclxuXHJcbiAgZ2V0Y2FudmFzKCkge1xyXG4gICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XHJcbiAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKVxyXG5cclxuICAgIGxldCB0ZXh0QXJyYXkgPSB0aGlzLm9wdGlvbnMudGV4dC5zcGxpdCgnXFxuJylcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGV4dEFycmF5Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGlmICh0ZXh0QXJyYXlbaV0ubGVuZ3RoID4gODApIHtcclxuICAgICAgICB0ZXh0QXJyYXlbaV0gPSB0ZXh0QXJyYXlbaV0uc2xpY2UoMCwgODAtdGV4dEFycmF5W2ldLmxlbmd0aClcclxuICAgICAgfSBcclxuICAgIH1cclxuICAgIGlmICh0ZXh0QXJyYXkubGVuZ3RoID4gNzApIHtcclxuICAgICAgdGV4dEFycmF5LnNwbGljZSg3MCAtIHRleHRBcnJheS5sZW5ndGgpXHJcbiAgICB9XHJcbiAgICB0aGlzLm9wdGlvbnMudGV4dCA9IHRleHRBcnJheS5qb2luKCdcXG4nKVxyXG4gICAgbGV0IG1heFdpZHRoID0gMFxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZXh0QXJyYXkubGVuZ3RoOyBpKyspIHtcclxuICAgICAgY3R4LmZvbnQgPSAyMDAgKyBcInB4IHNlcmlmXCI7XHJcbiAgICAgIGNvbnN0IHdpZHRoID0gY3R4Lm1lYXN1cmVUZXh0KHRleHRBcnJheVtpXSkud2lkdGg7XHJcbiAgICAgIGlmKG1heFdpZHRoPHdpZHRoKSB7XHJcbiAgICAgICAgbWF4V2lkdGggPSB3aWR0aFxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBjYW52YXMud2lkdGggPSBtYXhXaWR0aFxyXG4gICAgY2FudmFzLmhlaWdodCA9IDIyMCAqIHRleHRBcnJheS5sZW5ndGhcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGV4dEFycmF5Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGN0eC5mb250ID0gMjAwICsgXCJweCBzZXJpZlwiO1xyXG4gICAgICBjdHguZmlsbFN0eWxlID0gJ3JnYmEoMjU1LCAyNTUsIDI1NSwgMCknXHJcbiAgICAgIGN0eC5maWxsUmVjdCgwLCAwLCBtYXhXaWR0aCArIDMwLCAyMTApXHJcbiAgICAgIGN0eC5maWxsU3R5bGUgPSAncmdiYSgyNTUsIDI1NSwgMjU1LCAxKSc7XHJcbiAgICAgIGN0eC5mb250ID0gXCIyMDBweCBzZXJpZlwiO1xyXG4gICAgICBjdHguZmlsbFRleHQodGV4dEFycmF5W2ldLCAwLCAyMTAgKiAoaSsxKSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5hc3BlY3RSYXRpbyA9IHRoaXMub3B0aW9ucy50ZXh0ID8gKGNhbnZhcy53aWR0aCAvIGNhbnZhcy5oZWlnaHQpIDogMFxyXG4gICAgcmV0dXJuIGNhbnZhc1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICog5omT5byA5a+M5paH5pys5qGGXHJcbiAgICovXHJcbiAgb3BlblJpY2hUZXh0RWRpdG9yKGUpIHtcclxuICAgIHJpY2hUZXh0Lm9wZW4odGhpcy5vcHRpb25zLmlkLCB0aGlzLm9wdGlvbnMudGV4dCwgdGhpcy5vcHRpb25zLnJpY2hUZXh0Q29udGVudClcclxuICAgIHJpY2hUZXh0LnByaW1hcnlDYWxsQmFjayA9IChjb250ZW50KSA9PiB7XHJcbiAgICAgIHRoaXMub3B0aW9ucy5yaWNoVGV4dENvbnRlbnQgPSBjb250ZW50XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgbm9kZUVkaXQodGhhdCwgY2IgPSAoKSA9PiB7IH0pIHtcclxuICAgIGlmIChZSi5NZWFzdXJlLkdldE1lYXN1cmVTdGF0dXMoKSkge1xyXG4gICAgICBjYign5LiK5LiA5qyh5rWL6YeP5pyq57uT5p2fJylcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIFlKLk1lYXN1cmUuU2V0TWVhc3VyZVN0YXR1cyh0cnVlKVxyXG4gICAgICB0aGF0LnRpcCA9IG5ldyBNb3VzZVRpcCgn6K+36YCJ5oup5LiA5Liq6aG254K577yM5Y+z6ZSu5Y+W5raIJywgdGhhdC5zZGspXHJcbiAgICAgIHRoYXQuZXZlbnQgPSBuZXcgTW91c2VFdmVudCh0aGF0LnNkaylcclxuICAgICAgdGhhdC5ub2RlUG9pbnRzID0gW11cclxuICAgICAgbGV0IHNlbGVjdFBvaW50XHJcbiAgICAgIGxldCBvcmlnaW5hbFBvc2l0aW9uXHJcblxyXG4gICAgICBsZXQgcG9zaXRpb25zID0gdGhhdC5vcHRpb25zLnBvc2l0aW9uc1xyXG4gICAgICBsZXQgZnJvbURlZ3JlZXNBcnJheSA9IFtdXHJcbiAgICAgIGxldCBtaW5pbXVtSGVpZ2h0cyA9IFtdXHJcbiAgICAgIGxldCBtYXhpbXVtSGVpZ2h0cyA9IFtdXHJcbiAgICAgIGxldCB3aWR0aCA9IHRoYXQuY29tcHV0ZURpc3RhbmNlMihwb3NpdGlvbnMpXHJcbiAgICAgIGxldCBleHRydWRlZEhlaWdodCA9IHRoYXQuYXNwZWN0UmF0aW8gPyAod2lkdGggLyB0aGF0LmFzcGVjdFJhdGlvKSA6IDBcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBmcm9tRGVncmVlc0FycmF5LnB1c2gocG9zaXRpb25zW2ldLmxuZywgcG9zaXRpb25zW2ldLmxhdClcclxuICAgICAgICBtaW5pbXVtSGVpZ2h0cy5wdXNoKHBvc2l0aW9uc1tpXS5hbHQpXHJcbiAgICAgICAgbWF4aW11bUhlaWdodHMucHVzaChwb3NpdGlvbnNbaV0uYWx0ICsgZXh0cnVkZWRIZWlnaHQpXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBpc0FkZCA9IGZhbHNlXHJcbiAgICAgIGxldCBsZWZ0RXZlbnQgPSAobW92ZW1lbnQsIGNhcnRlc2lhbikgPT4ge1xyXG4gICAgICAgIGlmIChzZWxlY3RQb2ludCkge1xyXG4gICAgICAgICAgaXNBZGQgPSB0cnVlXHJcbiAgICAgICAgICBsZXQgcG9zMyA9IHRoYXQuc2RrLnZpZXdlci5zY2VuZS5jbGFtcFRvSGVpZ2h0KGNhcnRlc2lhbiwgW3RoYXQuZW50aXR5XSlcclxuICAgICAgICAgIHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbc2VsZWN0UG9pbnQuaW5kZXhdID0gdGhhdC5jYXJ0ZXNpYW4zVG93Z3M4NChwb3MzLCB0aGF0LnNkay52aWV3ZXIpXHJcbiAgICAgICAgICBvcmlnaW5hbFBvc2l0aW9uID0gdGhhdC5vcHRpb25zLnBvc2l0aW9uc1tzZWxlY3RQb2ludC5pbmRleF1cclxuICAgICAgICAgIGxldCBlbnRpdHkgPSB0aGF0LnNkay52aWV3ZXIuZW50aXRpZXMuYWRkKHtcclxuICAgICAgICAgICAgbmFtZTogJ25vZGUtc2Vjb25kYXJ5LWVkaXQtcG9pbnQnLFxyXG4gICAgICAgICAgICBwb3NpdGlvbjogQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXModGhhdC5vcHRpb25zLnBvc2l0aW9uc1tzZWxlY3RQb2ludC5pbmRleF0ubG5nLCB0aGF0Lm9wdGlvbnMucG9zaXRpb25zW3NlbGVjdFBvaW50LmluZGV4XS5sYXQsIHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbc2VsZWN0UG9pbnQuaW5kZXhdLmFsdCksXHJcbiAgICAgICAgICAgIGJpbGxib2FyZDoge1xyXG4gICAgICAgICAgICAgIGltYWdlOiB0aGF0LmdldFNvdXJjZVJvb3RQYXRoKCkgKyAnL2ltZy9wb2ludC5wbmcnLFxyXG4gICAgICAgICAgICAgIHdpZHRoOiAxNSxcclxuICAgICAgICAgICAgICBoZWlnaHQ6IDE1LFxyXG4gICAgICAgICAgICAgIGRpc2FibGVEZXB0aFRlc3REaXN0YW5jZTogTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLFxyXG4gICAgICAgICAgICAgIGNvbG9yOiBDZXNpdW0uQ29sb3IuV0hJVEUud2l0aEFscGhhKDAuOTkpXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgdGhhdC5ub2RlUG9pbnRzLnNwbGljZShzZWxlY3RQb2ludC5pbmRleCwgMCwgZW50aXR5KVxyXG4gICAgICAgICAgdGhhdC5vcHRpb25zLnBvc2l0aW9ucy5zcGxpY2Uoc2VsZWN0UG9pbnQuaW5kZXgsIDAsIHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbc2VsZWN0UG9pbnQuaW5kZXhdKVxyXG5cclxuICAgICAgICAgIGxldCBwb3NpdGlvbnMgPSB0aGF0Lm9wdGlvbnMucG9zaXRpb25zXHJcbiAgICAgICAgICBmcm9tRGVncmVlc0FycmF5ID0gW11cclxuICAgICAgICAgIG1pbmltdW1IZWlnaHRzID0gW11cclxuICAgICAgICAgIG1heGltdW1IZWlnaHRzID0gW11cclxuICAgICAgICAgIHdpZHRoID0gdGhhdC5jb21wdXRlRGlzdGFuY2UyKHBvc2l0aW9ucylcclxuICAgICAgICAgIGV4dHJ1ZGVkSGVpZ2h0ID0gdGhhdC5hc3BlY3RSYXRpbyA/ICh3aWR0aCAvIHRoYXQuYXNwZWN0UmF0aW8pIDogMFxyXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgZnJvbURlZ3JlZXNBcnJheS5wdXNoKHBvc2l0aW9uc1tpXS5sbmcsIHBvc2l0aW9uc1tpXS5sYXQpXHJcbiAgICAgICAgICAgIG1pbmltdW1IZWlnaHRzLnB1c2gocG9zaXRpb25zW2ldLmFsdClcclxuICAgICAgICAgICAgbWF4aW11bUhlaWdodHMucHVzaChwb3NpdGlvbnNbaV0uYWx0ICsgZXh0cnVkZWRIZWlnaHQpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGF0LnRpcC5zZXRQb3NpdGlvbihcclxuICAgICAgICAgICAgY2FydGVzaWFuLFxyXG4gICAgICAgICAgICBtb3ZlbWVudC5wb3NpdGlvbi54LFxyXG4gICAgICAgICAgICBtb3ZlbWVudC5wb3NpdGlvbi55XHJcbiAgICAgICAgICApXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgdmFyIHBpY2sgPSB0aGF0LnNkay52aWV3ZXIuc2NlbmUucGljayhtb3ZlbWVudC5wb3NpdGlvbik7XHJcbiAgICAgICAgICBpZiAocGljayAmJiBwaWNrLmlkICYmIHBpY2suaWQubmFtZSAmJiBwaWNrLmlkLm5hbWUgPT09ICdub2RlLXNlY29uZGFyeS1lZGl0LXBvaW50Jykge1xyXG4gICAgICAgICAgICBzZWxlY3RQb2ludCA9IHBpY2suaWRcclxuICAgICAgICAgICAgdGhhdC5ub2RlUG9pbnRzLnNwbGljZShwaWNrLmlkLmluZGV4LCAxKVxyXG4gICAgICAgICAgICB0aGF0LnNkay52aWV3ZXIuZW50aXRpZXMucmVtb3ZlKHBpY2suaWQpXHJcbiAgICAgICAgICAgIHRoYXQudGlwLnNldF90ZXh0KCflt6bplK7lvIDlp4vvvIzlj7PplK7nu5PmnZ/vvIxDVFJMK+WPs+mUruaSpOmUgCcpXHJcbiAgICAgICAgICAgIG9yaWdpbmFsUG9zaXRpb24gPSB0aGF0LmNhcnRlc2lhbjNUb3dnczg0KGNhcnRlc2lhbiwgdGhhdC5zZGsudmlld2VyKVxyXG4gICAgICAgICAgICB0aGF0LmVudGl0eS53YWxsLnBvc2l0aW9ucyA9IG5ldyBDZXNpdW0uQ2FsbGJhY2tQcm9wZXJ0eShmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzQXJyYXkoZnJvbURlZ3JlZXNBcnJheSlcclxuICAgICAgICAgICAgfSwgZmFsc2UpXHJcbiAgICAgICAgICAgIHRoYXQuZW50aXR5LndhbGwubWF4aW11bUhlaWdodHMgPSBuZXcgQ2VzaXVtLkNhbGxiYWNrUHJvcGVydHkoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgIHJldHVybiBtYXhpbXVtSGVpZ2h0c1xyXG4gICAgICAgICAgICB9LCBmYWxzZSlcclxuICAgICAgICAgICAgdGhhdC5lbnRpdHkud2FsbC5taW5pbXVtSGVpZ2h0cyA9IG5ldyBDZXNpdW0uQ2FsbGJhY2tQcm9wZXJ0eShmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIG1pbmltdW1IZWlnaHRzXHJcbiAgICAgICAgICAgIH0sIGZhbHNlKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBsZXQgcmlnaHRFdmVudCA9IChtb3ZlbWVudCwgY2FydGVzaWFuKSA9PiB7XHJcbiAgICAgICAgaWYgKHNlbGVjdFBvaW50KSB7XHJcbiAgICAgICAgICB0aGF0Lm9wdGlvbnMucG9zaXRpb25zW3NlbGVjdFBvaW50LmluZGV4XSA9IG9yaWdpbmFsUG9zaXRpb25cclxuICAgICAgICAgIGlmKGlzQWRkKSB7XHJcbiAgICAgICAgICAgIHRoYXQub3B0aW9ucy5wb3NpdGlvbnMuc3BsaWNlKHNlbGVjdFBvaW50LmluZGV4LCAxKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgY2IobnVsbCwgdGhhdC5vcHRpb25zLnBvc2l0aW9ucylcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IHBvc2l0aW9ucyA9IHRoYXQub3B0aW9ucy5wb3NpdGlvbnNcclxuICAgICAgICBmcm9tRGVncmVlc0FycmF5ID0gW11cclxuICAgICAgICBtaW5pbXVtSGVpZ2h0cyA9IFtdXHJcbiAgICAgICAgbWF4aW11bUhlaWdodHMgPSBbXVxyXG4gICAgICAgIHdpZHRoID0gdGhhdC5jb21wdXRlRGlzdGFuY2UyKHBvc2l0aW9ucylcclxuICAgICAgICBleHRydWRlZEhlaWdodCA9IHRoYXQuYXNwZWN0UmF0aW8gPyAod2lkdGggLyB0aGF0LmFzcGVjdFJhdGlvKSA6IDBcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgZnJvbURlZ3JlZXNBcnJheS5wdXNoKHBvc2l0aW9uc1tpXS5sbmcsIHBvc2l0aW9uc1tpXS5sYXQpXHJcbiAgICAgICAgICBtaW5pbXVtSGVpZ2h0cy5wdXNoKHBvc2l0aW9uc1tpXS5hbHQpXHJcbiAgICAgICAgICBtYXhpbXVtSGVpZ2h0cy5wdXNoKHBvc2l0aW9uc1tpXS5hbHQgKyBleHRydWRlZEhlaWdodClcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhhdC5lbnRpdHkud2FsbC5wb3NpdGlvbnMgPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlc0FycmF5KGZyb21EZWdyZWVzQXJyYXkpXHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhhdC5ub2RlUG9pbnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICB0aGF0LnNkay52aWV3ZXIuZW50aXRpZXMucmVtb3ZlKHRoYXQubm9kZVBvaW50c1tpXSlcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhhdC5ub2RlUG9pbnRzID0gW11cclxuICAgICAgICBZSi5NZWFzdXJlLlNldE1lYXN1cmVTdGF0dXMoZmFsc2UpXHJcbiAgICAgICAgdGhhdC5ldmVudC5kZXN0cm95KClcclxuICAgICAgICB0aGF0LnRpcC5kZXN0cm95KClcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhhdC5ldmVudC5tb3VzZV9sZWZ0KGxlZnRFdmVudClcclxuXHJcbiAgICAgIHRoYXQuZXZlbnQubW91c2VfcmlnaHQocmlnaHRFdmVudClcclxuXHJcbiAgICAgIHRoYXQuZXZlbnQubW91c2VfbW92ZSgobW92ZW1lbnQsIGNhcnRlc2lhbikgPT4ge1xyXG4gICAgICAgIGlmIChzZWxlY3RQb2ludCkge1xyXG4gICAgICAgICAgbGV0IHBvczMgPSB0aGF0LnNkay52aWV3ZXIuc2NlbmUuY2xhbXBUb0hlaWdodChjYXJ0ZXNpYW4sIFt0aGF0LmVudGl0eV0pXHJcbiAgICAgICAgICB0aGF0Lm9wdGlvbnMucG9zaXRpb25zW3NlbGVjdFBvaW50LmluZGV4XSA9IHRoYXQuY2FydGVzaWFuM1Rvd2dzODQocG9zMywgdGhhdC5zZGsudmlld2VyKVxyXG4gICAgICAgICAgbGV0IHBvc2l0aW9ucyA9IHRoYXQub3B0aW9ucy5wb3NpdGlvbnNcclxuICAgICAgICAgIGZyb21EZWdyZWVzQXJyYXkgPSBbXVxyXG4gICAgICAgICAgbWluaW11bUhlaWdodHMgPSBbXVxyXG4gICAgICAgICAgbWF4aW11bUhlaWdodHMgPSBbXVxyXG4gICAgICAgICAgd2lkdGggPSB0aGF0LmNvbXB1dGVEaXN0YW5jZTIocG9zaXRpb25zKVxyXG4gICAgICAgICAgZXh0cnVkZWRIZWlnaHQgPSB0aGF0LmFzcGVjdFJhdGlvID8gKHdpZHRoIC8gdGhhdC5hc3BlY3RSYXRpbykgOiAwXHJcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBmcm9tRGVncmVlc0FycmF5LnB1c2gocG9zaXRpb25zW2ldLmxuZywgcG9zaXRpb25zW2ldLmxhdClcclxuICAgICAgICAgICAgbWluaW11bUhlaWdodHMucHVzaChwb3NpdGlvbnNbaV0uYWx0KVxyXG4gICAgICAgICAgICBtYXhpbXVtSGVpZ2h0cy5wdXNoKHBvc2l0aW9uc1tpXS5hbHQgKyBleHRydWRlZEhlaWdodClcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhhdC50aXAuc2V0UG9zaXRpb24oXHJcbiAgICAgICAgICBjYXJ0ZXNpYW4sXHJcbiAgICAgICAgICBtb3ZlbWVudC5lbmRQb3NpdGlvbi54LFxyXG4gICAgICAgICAgbW92ZW1lbnQuZW5kUG9zaXRpb24ueVxyXG4gICAgICAgIClcclxuICAgICAgfSlcclxuXHJcbiAgICAgIHRoYXQuZXZlbnQubW91c2VfcmlnaHRfa2V5Ym9hcmRfY3RybCgobW92ZW1lbnQsIGNhcnRlc2lhbikgPT4ge1xyXG4gICAgICAgIGlmIChzZWxlY3RQb2ludCkge1xyXG4gICAgICAgICAgdGhhdC5vcHRpb25zLnBvc2l0aW9ucy5wb3AoKVxyXG4gICAgICAgICAgdGhhdC5zZGsudmlld2VyLmVudGl0aWVzLnJlbW92ZSh0aGF0Lm5vZGVQb2ludHNbdGhhdC5ub2RlUG9pbnRzLmxlbmd0aCAtIDFdKVxyXG4gICAgICAgICAgdGhhdC5ub2RlUG9pbnRzLnBvcCgpXHJcbiAgICAgICAgICBpZiAoc2VsZWN0UG9pbnQuaW5kZXggPT09IHRoYXQub3B0aW9ucy5wb3NpdGlvbnMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGF0Lm5vZGVQb2ludHNbc2VsZWN0UG9pbnQuaW5kZXggLSAxXSkge1xyXG4gICAgICAgICAgICAgIHNlbGVjdFBvaW50ID0gdGhhdC5ub2RlUG9pbnRzW3NlbGVjdFBvaW50LmluZGV4IC0gMV1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICBzZWxlY3RQb2ludC5pbmRleCA9IDBcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuXHJcbiAgICAgIHRoYXQuZXZlbnQuZ2VzdHVyZV9waW5ja19zdGFydCgobW92ZW1lbnQsIGNhcnRlc2lhbikgPT4ge1xyXG4gICAgICAgIGxldCBzdGFydFRpbWUgPSBuZXcgRGF0ZSgpXHJcbiAgICAgICAgbGV0IHBvcyA9IHtcclxuICAgICAgICAgIHBvc2l0aW9uOiB7XHJcbiAgICAgICAgICAgIHg6IChtb3ZlbWVudC5wb3NpdGlvbjEueCArIG1vdmVtZW50LnBvc2l0aW9uMi54KSAvIDIsXHJcbiAgICAgICAgICAgIHk6IChtb3ZlbWVudC5wb3NpdGlvbjEueSArIG1vdmVtZW50LnBvc2l0aW9uMi55KSAvIDJcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhhdC5ldmVudC5nZXN0dXJlX3BpbmNrX2VuZCgoKSA9PiB7XHJcbiAgICAgICAgICBsZXQgZW5kVGltZSA9IG5ldyBEYXRlKClcclxuICAgICAgICAgIGlmIChlbmRUaW1lIC0gc3RhcnRUaW1lID49IDUwMCkge1xyXG4gICAgICAgICAgICAvLyDplb/mjInlj5bmtohcclxuICAgICAgICAgICAgcmlnaHRFdmVudChwb3MsIGNhcnRlc2lhbilcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBsZWZ0RXZlbnQocG9zLCBjYXJ0ZXNpYW4pXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgfSlcclxuXHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhhdC5vcHRpb25zLnBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGxldCBlbnRpdHkgPSB0aGF0LnNkay52aWV3ZXIuZW50aXRpZXMuYWRkKHtcclxuICAgICAgICAgIG5hbWU6ICdub2RlLXNlY29uZGFyeS1lZGl0LXBvaW50JyxcclxuICAgICAgICAgIGluZGV4OiBpLFxyXG4gICAgICAgICAgcG9zaXRpb246IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzKHRoYXQub3B0aW9ucy5wb3NpdGlvbnNbaV0ubG5nLCB0aGF0Lm9wdGlvbnMucG9zaXRpb25zW2ldLmxhdCwgdGhhdC5vcHRpb25zLnBvc2l0aW9uc1tpXS5hbHQpLFxyXG4gICAgICAgICAgYmlsbGJvYXJkOiB7XHJcbiAgICAgICAgICAgIGltYWdlOiB0aGF0LmdldFNvdXJjZVJvb3RQYXRoKCkgKyAnL2ltZy9wb2ludC5wbmcnLFxyXG4gICAgICAgICAgICB3aWR0aDogMTUsXHJcbiAgICAgICAgICAgIGhlaWdodDogMTUsXHJcbiAgICAgICAgICAgIGRpc2FibGVEZXB0aFRlc3REaXN0YW5jZTogTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLFxyXG4gICAgICAgICAgICBjb2xvcjogQ2VzaXVtLkNvbG9yLldISVRFLndpdGhBbHBoYSgwLjk5KVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICB9KVxyXG4gICAgICAgIHRoYXQubm9kZVBvaW50cy5wdXNoKGVudGl0eSlcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgU3RhbmRUZXh0XHJcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUE0Q0E7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQXhDQTtBQXlDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUF6RkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUE0RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBWEE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFjQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQXRPQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBekNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBd09BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUtBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBR0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/Obj/Base/TextObject/StandText/index.js\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ \"./node_modules/@babel/runtime/helpers/asyncToGenerator.js\");\n/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ \"./node_modules/@babel/runtime/helpers/classCallCheck.js\");\n/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ \"./node_modules/@babel/runtime/helpers/createClass.js\");\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ \"./node_modules/@babel/runtime/helpers/possibleConstructorReturn.js\");\n/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ \"./node_modules/@babel/runtime/helpers/getPrototypeOf.js\");\n/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ \"./node_modules/@babel/runtime/helpers/inherits.js\");\n/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @babel/runtime/regenerator */ \"./node_modules/@babel/runtime/regenerator/index.js\");\n/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var _Element_Dialog__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../../Element/Dialog */ \"./src/Obj/Element/Dialog/index.js\");\n/* harmony import */ var _Element_Dialog_eventBinding__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../../Element/Dialog/eventBinding */ \"./src/Obj/Element/Dialog/eventBinding.js\");\n/* harmony import */ var _Element_cy_html_tabs__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../../Element/cy_html_tabs */ \"./src/Obj/Element/cy_html_tabs.js\");\n/* harmony import */ var _Element_richText__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../../Element/richText */ \"./src/Obj/Element/richText.js\");\n/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./_element */ \"./src/Obj/Base/TextObject/StandText/_element.js\");\n/* harmony import */ var _index__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../../index */ \"./src/Obj/Base/index.js\");\n/* harmony import */ var _LabelObject__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../../LabelObject */ \"./src/Obj/Base/LabelObject/index.js\");\n/* harmony import */ var _Event__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../../../../Event */ \"./src/Event/index.js\");\n/* harmony import */ var _MouseTip__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../../../../MouseTip */ \"./src/MouseTip/index.js\");\n/* harmony import */ var _Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../../../../Global/MultiViewportMode */ \"./src/Global/MultiViewportMode/index.js\");\n/* harmony import */ var _Global_SplitScreen__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../../../../Global/SplitScreen */ \"./src/Global/SplitScreen/index.js\");\n\n\n\n\n\n\n\nfunction _callSuper(t, o, e) { return o = _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4___default()(o), _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_3___default()(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4___default()(t).constructor) : o.apply(t, e)); }\nfunction _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }\n\n\n\n\n\n\n\n\n\n\n\nvar StandText = /*#__PURE__*/function (_Base) {\n /**\r\n * @constructor\r\n * @param sdk\r\n * @description 立体文字\r\n * @param options {object}\r\n * @param options.id {string} 唯一标识\r\n * @param options.text {string} 文字\r\n * @param options.color=\"#FFC107\" {string} 颜色\r\n * @param options.speed=1 {number} 文字移动速度\r\n * @param {Array.} positions 经纬度和高度的列表,值交替 [{lon,lat,alt},...]\r\n * @param options.positions[].lng {number} 经度\r\n * @param options.positions[].lat {number} 纬度\r\n * @param options.positions[].alt {number} 高度\r\n * @param options.customView {object} 默认视角\r\n * @param options.customView.orientation {object} 默认视角方位\r\n * @param options.customView.orientation.heading {number} 航向角\r\n * @param options.customView.orientation.pitch {number} 俯仰角\r\n * @param options.customView.orientation.roll {number} 翻滚角\r\n * @param options.customView.relativePosition {object} 视角相对位置\r\n * @param options.customView.relativePosition.lng {number} 经度\r\n * @param options.customView.relativePosition.lat {number} 纬度\r\n * @param options.customView.relativePosition.alt {number} 高度\r\n * */\n function StandText(sdk, options) {\n var _this2;\n var _Dialog = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1___default()(this, StandText);\n _this2 = _callSuper(this, StandText, [sdk, options]);\n _this2.options.text = options.text || \"未命名对象\";\n var textArray = _this2.options.text.split('\\n');\n for (var i = 0; i < textArray.length; i++) {\n if (textArray[i].length > 80) {\n textArray[i] = textArray[i].slice(0, 80 - textArray[i].length);\n }\n }\n if (textArray.length > 70) {\n textArray.splice(70 - textArray.length);\n }\n _this2.options.text = textArray.join('\\n');\n _this2.options.color = options.color || \"#FFC107\";\n // this.options.cornerType = options.cornerType || 'MITERED'\n _this2.options.positions = options.positions;\n // this.options.material = Number(options.material) || 0\n _this2.options.speed = options.speed || options.speed === 0 ? options.speed : 1;\n // this.options.duration = (options.duration || options.duration === 0) ? options.duration : 50000\n _this2.options.show = options.show || options.show === false ? options.show : true;\n _this2.nodePoints = [];\n _this2.entity;\n delete _this2.options.name;\n _this2.extrudedHeight;\n _this2._EventBinding = new _Element_Dialog_eventBinding__WEBPACK_IMPORTED_MODULE_8__[\"default\"]();\n _this2.Dialog = _Dialog;\n _this2._elms = {};\n _this2.sdk.addIncetance(_this2.options.id, _this2);\n StandText.create(_this2);\n return _this2;\n }\n _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default()(StandText, _Base);\n return _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_2___default()(StandText, [{\n key: \"name\",\n get: function get() {\n return;\n }\n }, {\n key: \"text\",\n get: function get() {\n return this.options.text;\n },\n set: function set(v) {\n this.options.text = v;\n var textArray = this.options.text.split('\\n');\n for (var i = 0; i < textArray.length; i++) {\n if (textArray[i].length > 80) {\n var _error = '行超过80个字符,请按回车(Enter)后,继续输入';\n window.ELEMENT && window.ELEMENT.Message({\n message: _error,\n type: 'warning',\n duration: 1000\n });\n textArray[i] = textArray[i].slice(0, 80 - textArray[i].length);\n }\n }\n if (textArray.length > 70) {\n textArray.splice(70 - textArray.length);\n var _error2 = '超过最大输入字符';\n window.ELEMENT && window.ELEMENT.Message({\n message: _error2,\n type: 'warning',\n duration: 1000\n });\n }\n this.options.text = textArray.join('\\n');\n if (this.entity) {\n var positions = this.options.positions;\n var fromDegreesArray = [];\n var minimumHeights = [];\n var maximumHeights = [];\n var material = this.getMaterial();\n var width = this.computeDistance2(positions);\n var extrudedHeight = this.aspectRatio ? width / this.aspectRatio : 0;\n for (var _i = 0; _i < positions.length; _i++) {\n fromDegreesArray.push(positions[_i].lng, positions[_i].lat);\n minimumHeights.push(positions[_i].alt);\n maximumHeights.push(positions[_i].alt + extrudedHeight);\n }\n this.entity.wall.material = material;\n this.entity.wall.maximumHeights = maximumHeights;\n this.entity.wall.minimumHeights = minimumHeights;\n }\n this._elms.text && this._elms.text.forEach(function (item) {\n item.value = v;\n });\n }\n }, {\n key: \"color\",\n get: function get() {\n return this.options.color;\n },\n set: function set(v) {\n var _this3 = this;\n this.options.color = v;\n this.entity.wall.material = this.getMaterial();\n if (this._elms.color) {\n this._elms.color.forEach(function (item, i) {\n var colorPicker = new YJColorPicker({\n el: item.el,\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: v,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(c) {\n _this3.color = c;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this3.color = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n _this3._elms.color[i] = colorPicker;\n });\n }\n }\n\n // get material() {\n // return this.options.material\n // }\n // set material(v) {\n // this.options.material = Number(v)\n // this.entity.wall.material = this.getMaterial()\n // this._elms.material && this._elms.material.forEach((item) => {\n // item.value = v\n // })\n // }\n }, {\n key: \"speed\",\n get: function get() {\n return this.options.speed;\n },\n set: function set(v) {\n this.options.speed = v;\n this.entity.wall.material = this.getMaterial();\n this._elms.speed && this._elms.speed.forEach(function (item) {\n item.value = v;\n });\n }\n\n // get attributeLink() {\n // return this.options.attribute.link.content\n // }\n\n // set attributeLink(v) {\n // this.options.attribute.link.content = v\n // if (!this._DialogObject || !this._DialogObject._element || !this._DialogObject._element.content) {\n // return\n // }\n // let table = this._DialogObject._element.content.getElementsByClassName('attribute-content-link')[1].getElementsByClassName('table')[0]\n // let tableContent = table.getElementsByClassName('table-body')[0]\n // tableContent.innerHTML = ''\n // if (this.options.attribute.link.content.length > 0) {\n // table.getElementsByClassName('table-empty')[0].style.display = 'none'\n // }\n // else {\n // table.getElementsByClassName('table-empty')[0].style.display = 'flex'\n // }\n // for (let i = 0; i < this.options.attribute.link.content.length; i++) {\n // let tr = `\n //
\n //
` + this.options.attribute.link.content[i].name + `
\n //
` + this.options.attribute.link.content[i].url + `
\n //
\n // \n // \n //
\n //
`\n // let trElm = document.createRange().createContextualFragment(tr)\n // tableContent.appendChild(trElm)\n // }\n // let item = tableContent.getElementsByClassName('tr')\n // let fun = {\n // linkEdit: async (index) => {\n // this.attributeLink = await this.options.attribute.link.content\n // let table = this._DialogObject._element.content.getElementsByClassName('attribute-content-link')[1].getElementsByClassName('table')[0]\n // let tableContent = table.getElementsByClassName('table-body')[0]\n // let item = tableContent.getElementsByClassName('tr')\n // for (let i = 0; i < item.length; i++) {\n // if (index === i) {\n // let html = `\n //
\n // \n //
\n //
\n //
\n // \n // \n // \n //
\n //
\n //
\n // \n // \n //
`\n // item[i].innerHTML = html\n // let td = item[i].getElementsByClassName('td')\n // td[0].getElementsByClassName('input')[0].value = this.options.attribute.link.content[index].name\n // td[1].getElementsByClassName('input')[0].value = this.options.attribute.link.content[index].url\n // let btn = item[i].getElementsByTagName('button')\n // for (let n = 0; n < btn.length; n++) {\n // for (let m of btn[n].attributes) {\n // if (m.name === '@click') {\n // btn[n].addEventListener('click', (e) => {\n // if (typeof (fun[m.value]) === 'function') {\n // fun[m.value]({ name: td[0].getElementsByClassName('input')[0].value, url: td[1].getElementsByClassName('input')[0].value }, i)\n // }\n // });\n // btn[n].attributes.removeNamedItem(m.name)\n // break\n // }\n // }\n // }\n // break\n // }\n // }\n // },\n // linkDelete: (i) => {\n // this.options.attribute.link.content.splice(i, 1)\n // this.attributeLink = this.options.attribute.link.content\n // },\n\n // confirmEdit: (value, i) => {\n // this.options.attribute.link.content[i] = value\n // this.attributeLink = this.options.attribute.link.content\n // },\n // cancelEdit: () => {\n // this.attributeLink = this.options.attribute.link.content\n // },\n // fileSelect: (value, i) => {\n // let fileElm = item[i].getElementsByClassName('file-select')[0]\n // fileElm.click()\n // fileElm.removeEventListener('change', fileSelect)\n // fileElm.addEventListener('change', fileSelect)\n // }\n // }\n // let fileSelect = (event) => {\n // if (event.target.value) {\n // let td = item[event.target.getAttribute('index')].getElementsByClassName('td')\n // td[1].getElementsByClassName('input')[0].value = event.target.value\n // event.target.value = null\n // }\n // }\n // for (let i = 0; i < item.length; i++) {\n // let btn = item[i].getElementsByTagName('button')\n // for (let n = 0; n < btn.length; n++) {\n // for (let m of btn[n].attributes) {\n // if (m.name === '@click') {\n // btn[n].addEventListener('click', (e) => {\n // if (typeof (fun[m.value]) === 'function') {\n // fun[m.value](i)\n // }\n // });\n // btn[n].attributes.removeNamedItem(m.name)\n // break\n // }\n // }\n // }\n // }\n\n // }\n\n //创建\n }, {\n key: \"edit\",\n value: // 编辑框\n function () {\n var _edit = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_6___default.a.mark(function _callee(state) {\n var _this4 = this;\n var _this, contentElm, colorPicker, all_elm;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_6___default.a.wrap(function _callee$(_context) {\n while (1) switch (_context.prev = _context.next) {\n case 0:\n _this = this;\n this.originalOptions = this.deepCopyObj(this.options);\n if (this._DialogObject && this._DialogObject.close) {\n this._DialogObject.close();\n this._DialogObject = null;\n }\n if (!state) {\n _context.next = 18;\n break;\n }\n _context.next = 6;\n return new _Element_Dialog__WEBPACK_IMPORTED_MODULE_7__[\"default\"](this.sdk, this.options, {\n title: '立体文字属性',\n left: '180px',\n top: '100px',\n confirmCallBack: function confirmCallBack(options) {\n _this4.text = _this4.text.trim();\n if (!_this4.text) {\n _this4.text = '未命名对象';\n }\n _this4.originalOptions = _this4.deepCopyObj(_this4.options);\n _this4._DialogObject.close();\n _this4.Dialog.confirmCallBack && _this4.Dialog.confirmCallBack(_this4.originalOptions);\n Object(_Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_16__[\"syncData\"])(_this4.sdk, _this4.options.id);\n Object(_Global_SplitScreen__WEBPACK_IMPORTED_MODULE_17__[\"syncSplitData\"])(_this4.sdk, _this4.options.id);\n },\n resetCallBack: function resetCallBack() {\n _this4.reset();\n _this4.Dialog.resetCallBack && _this4.Dialog.resetCallBack();\n },\n removeCallBack: function removeCallBack() {\n _this4.Dialog.removeCallBack && _this4.Dialog.removeCallBack();\n },\n closeCallBack: function closeCallBack() {\n _this4.reset();\n _this4.Dialog.closeCallBack && _this4.Dialog.closeCallBack();\n for (var i = 0; i < _this4.nodePoints.length; i++) {\n _this4.sdk.viewer.entities.remove(_this4.nodePoints[i]);\n }\n _this4.nodePoints = [];\n YJ.Measure.SetMeasureStatus(false);\n _this4.event && _this4.event.destroy();\n _this4.tip && _this4.tip.destroy();\n },\n showCallBack: function showCallBack(show) {\n _this4.options.show = show;\n _this4.originalOptions.show = show;\n _this4.show = show;\n _this4.Dialog.showCallBack && _this4.Dialog.showCallBack();\n },\n secondaryEditCallBack: function secondaryEditCallBack() {\n _this4.nodeEdit();\n }\n });\n case 6:\n this._DialogObject = _context.sent;\n this._DialogObject._element.body.className = this._DialogObject._element.body.className + ' stand-text';\n contentElm = document.createElement('div');\n contentElm.innerHTML = Object(_element__WEBPACK_IMPORTED_MODULE_11__[\"html\"])(this);\n this._DialogObject.contentAppChild(contentElm);\n // setTimeout(() => {\n // this.attributeLink = this.options.attribute.link.content\n // this.cameraSelect()\n // }, 500);\n\n // 创建标签页\n // let tabsElm = new cy_tabs('radar-scan-edit-tabs')\n // 颜色组件\n colorPicker = new YJColorPicker({\n el: contentElm.getElementsByClassName(\"color\")[0],\n size: 'mini',\n //颜色box类型\n alpha: true,\n //是否开启透明度\n defaultColor: this.color,\n disabled: false,\n //是否禁止打开颜色选择器\n openPickerAni: 'opacity',\n //打开颜色选择器动画\n sure: function sure(color) {\n _this4.color = color;\n },\n //点击确认按钮事件回调\n clear: function clear() {\n _this4.color = 'rgba(255,255,255,1)';\n } //点击清空按钮事件回调\n });\n all_elm = contentElm.getElementsByTagName(\"*\");\n this._EventBinding.on(this, all_elm);\n this._elms = this._EventBinding.element;\n this._elms.color = [colorPicker];\n _context.next = 19;\n break;\n case 18:\n if (this._DialogObject && this._DialogObject.remove) {\n this._DialogObject.remove();\n this._DialogObject = null;\n }\n case 19:\n case \"end\":\n return _context.stop();\n }\n }, _callee, this);\n }));\n function edit(_x) {\n return _edit.apply(this, arguments);\n }\n return edit;\n }()\n }, {\n key: \"reset\",\n value: function reset() {\n if (!this.entity) {\n return;\n }\n this.options = this.deepCopyObj(this.originalOptions);\n this.text = this.originalOptions.text;\n this.color = this.originalOptions.color;\n this.speed = this.originalOptions.speed;\n var positions = this.options.positions;\n var fromDegreesArray = [];\n var minimumHeights = [];\n var maximumHeights = [];\n var width = this.computeDistance2(positions);\n var extrudedHeight = this.aspectRatio ? width / this.aspectRatio : 0;\n // aspectRatio\n for (var i = 0; i < positions.length; i++) {\n fromDegreesArray.push(positions[i].lng, positions[i].lat);\n minimumHeights.push(positions[i].alt);\n maximumHeights.push(positions[i].alt + extrudedHeight);\n }\n this.entity.wall.positions = Cesium.Cartesian3.fromDegreesArray(fromDegreesArray);\n }\n }, {\n key: \"remove\",\n value: function () {\n var _remove = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_6___default.a.mark(function _callee2() {\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_6___default.a.wrap(function _callee2$(_context2) {\n while (1) switch (_context2.prev = _context2.next) {\n case 0:\n this.event && this.event.destroy();\n this.tip && this.tip.destroy();\n this.sdk.viewer.entities.remove(this.entity);\n this.entity = null;\n if (this._DialogObject && !this._DialogObject.isDestroy) {\n this._DialogObject.close();\n this._DialogObject = null;\n }\n _context2.next = 7;\n return this.sdk.removeIncetance(this.options.id);\n case 7:\n _context2.next = 9;\n return Object(_Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_16__[\"syncData\"])(this.sdk, this.options.id);\n case 9:\n case \"end\":\n return _context2.stop();\n }\n }, _callee2, this);\n }));\n function remove() {\n return _remove.apply(this, arguments);\n }\n return remove;\n }()\n }, {\n key: \"getMaterial\",\n value: function getMaterial() {\n var material;\n var canvas = this.getcanvas();\n material = new Cesium.CustomMaterialSource({\n image: canvas.toDataURL(\"image/png\"),\n color: this.options.color,\n repeat: new Cesium.Cartesian2(1, 1.0),\n duration: 50000 / this.options.speed,\n fltr: false\n });\n return material;\n }\n }, {\n key: \"getcanvas\",\n value: function getcanvas() {\n var canvas = document.createElement('canvas');\n var ctx = canvas.getContext('2d');\n var textArray = this.options.text.split('\\n');\n for (var i = 0; i < textArray.length; i++) {\n if (textArray[i].length > 80) {\n textArray[i] = textArray[i].slice(0, 80 - textArray[i].length);\n }\n }\n if (textArray.length > 70) {\n textArray.splice(70 - textArray.length);\n }\n this.options.text = textArray.join('\\n');\n var maxWidth = 0;\n for (var _i2 = 0; _i2 < textArray.length; _i2++) {\n ctx.font = 200 + \"px serif\";\n var width = ctx.measureText(textArray[_i2]).width;\n if (maxWidth < width) {\n maxWidth = width;\n }\n }\n canvas.width = maxWidth;\n canvas.height = 220 * textArray.length;\n for (var _i3 = 0; _i3 < textArray.length; _i3++) {\n ctx.font = 200 + \"px serif\";\n ctx.fillStyle = 'rgba(255, 255, 255, 0)';\n ctx.fillRect(0, 0, maxWidth + 30, 210);\n ctx.fillStyle = 'rgba(255, 255, 255, 1)';\n ctx.font = \"200px serif\";\n ctx.fillText(textArray[_i3], 0, 210 * (_i3 + 1));\n }\n this.aspectRatio = this.options.text ? canvas.width / canvas.height : 0;\n return canvas;\n }\n\n /**\r\n * 打开富文本框\r\n */\n }, {\n key: \"openRichTextEditor\",\n value: function openRichTextEditor(e) {\n var _this5 = this;\n _Element_richText__WEBPACK_IMPORTED_MODULE_10__[\"default\"].open(this.options.id, this.options.text, this.options.richTextContent);\n _Element_richText__WEBPACK_IMPORTED_MODULE_10__[\"default\"].primaryCallBack = function (content) {\n _this5.options.richTextContent = content;\n };\n }\n }, {\n key: \"nodeEdit\",\n value: function nodeEdit() {\n var _this6 = this;\n var cb = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function () {};\n if (YJ.Measure.GetMeasureStatus()) {\n cb('上一次测量未结束');\n } else {\n YJ.Measure.SetMeasureStatus(true);\n this._nodeEditCallback = cb;\n this.tip = new _MouseTip__WEBPACK_IMPORTED_MODULE_15__[\"default\"]('请选择一个顶点,右键取消', this.sdk);\n this.event = new _Event__WEBPACK_IMPORTED_MODULE_14__[\"default\"](this.sdk);\n this.nodePoints = [];\n var selectPoint;\n var originalPosition;\n var positions = this.options.positions;\n var fromDegreesArray = [];\n var minimumHeights = [];\n var maximumHeights = [];\n var width = this.computeDistance2(positions);\n var extrudedHeight = this.aspectRatio ? width / this.aspectRatio : 0;\n for (var i = 0; i < positions.length; i++) {\n fromDegreesArray.push(positions[i].lng, positions[i].lat);\n minimumHeights.push(positions[i].alt);\n maximumHeights.push(positions[i].alt + extrudedHeight);\n }\n var isAdd = false;\n var leftEvent = function leftEvent(movement, cartesian) {\n if (selectPoint) {\n isAdd = true;\n var pos3 = _this6.sdk.viewer.scene.clampToHeight(cartesian, [_this6.entity]);\n _this6.options.positions[selectPoint.index] = _this6.cartesian3Towgs84(pos3, _this6.sdk.viewer);\n originalPosition = _this6.options.positions[selectPoint.index];\n var entity = _this6.sdk.viewer.entities.add({\n name: 'node-secondary-edit-point',\n position: Cesium.Cartesian3.fromDegrees(_this6.options.positions[selectPoint.index].lng, _this6.options.positions[selectPoint.index].lat, _this6.options.positions[selectPoint.index].alt),\n billboard: {\n image: _this6.getSourceRootPath() + '/img/point.png',\n width: 15,\n height: 15,\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\n color: Cesium.Color.WHITE.withAlpha(0.99)\n }\n });\n _this6.nodePoints.splice(selectPoint.index, 0, entity);\n _this6.options.positions.splice(selectPoint.index, 0, _this6.options.positions[selectPoint.index]);\n var _positions = _this6.options.positions;\n fromDegreesArray = [];\n minimumHeights = [];\n maximumHeights = [];\n width = _this6.computeDistance2(_positions);\n extrudedHeight = _this6.aspectRatio ? width / _this6.aspectRatio : 0;\n for (var _i4 = 0; _i4 < _positions.length; _i4++) {\n fromDegreesArray.push(_positions[_i4].lng, _positions[_i4].lat);\n minimumHeights.push(_positions[_i4].alt);\n maximumHeights.push(_positions[_i4].alt + extrudedHeight);\n }\n _this6.tip.setPosition(cartesian, movement.position.x, movement.position.y);\n } else {\n var pick = _this6.sdk.viewer.scene.pick(movement.position);\n if (pick && pick.id && pick.id.name && pick.id.name === 'node-secondary-edit-point') {\n selectPoint = pick.id;\n _this6.nodePoints.splice(pick.id.index, 1);\n _this6.sdk.viewer.entities.remove(pick.id);\n _this6.tip.set_text('左键开始,右键结束,CTRL+右键撤销');\n originalPosition = _this6.cartesian3Towgs84(cartesian, _this6.sdk.viewer);\n _this6.entity.wall.positions = new Cesium.CallbackProperty(function () {\n return Cesium.Cartesian3.fromDegreesArray(fromDegreesArray);\n }, false);\n _this6.entity.wall.maximumHeights = new Cesium.CallbackProperty(function () {\n return maximumHeights;\n }, false);\n _this6.entity.wall.minimumHeights = new Cesium.CallbackProperty(function () {\n return minimumHeights;\n }, false);\n }\n }\n };\n var rightEvent = function rightEvent(movement, cartesian) {\n if (selectPoint) {\n _this6.options.positions[selectPoint.index] = originalPosition;\n if (isAdd) {\n _this6.options.positions.splice(selectPoint.index, 1);\n }\n cb(null, _this6.options.positions);\n }\n var positions = _this6.options.positions;\n fromDegreesArray = [];\n minimumHeights = [];\n maximumHeights = [];\n width = _this6.computeDistance2(positions);\n extrudedHeight = _this6.aspectRatio ? width / _this6.aspectRatio : 0;\n for (var _i5 = 0; _i5 < positions.length; _i5++) {\n fromDegreesArray.push(positions[_i5].lng, positions[_i5].lat);\n minimumHeights.push(positions[_i5].alt);\n maximumHeights.push(positions[_i5].alt + extrudedHeight);\n }\n _this6.entity.wall.positions = Cesium.Cartesian3.fromDegreesArray(fromDegreesArray);\n for (var _i6 = 0; _i6 < _this6.nodePoints.length; _i6++) {\n _this6.sdk.viewer.entities.remove(_this6.nodePoints[_i6]);\n }\n _this6.nodePoints = [];\n YJ.Measure.SetMeasureStatus(false);\n _this6.event.destroy();\n _this6.tip.destroy();\n };\n this.event.mouse_left(leftEvent);\n this.event.mouse_right(rightEvent);\n this.event.mouse_move(function (movement, cartesian) {\n if (selectPoint) {\n var pos3 = _this6.sdk.viewer.scene.clampToHeight(cartesian, [_this6.entity]);\n _this6.options.positions[selectPoint.index] = _this6.cartesian3Towgs84(pos3, _this6.sdk.viewer);\n var _positions2 = _this6.options.positions;\n fromDegreesArray = [];\n minimumHeights = [];\n maximumHeights = [];\n width = _this6.computeDistance2(_positions2);\n extrudedHeight = _this6.aspectRatio ? width / _this6.aspectRatio : 0;\n for (var _i7 = 0; _i7 < _positions2.length; _i7++) {\n fromDegreesArray.push(_positions2[_i7].lng, _positions2[_i7].lat);\n minimumHeights.push(_positions2[_i7].alt);\n maximumHeights.push(_positions2[_i7].alt + extrudedHeight);\n }\n }\n _this6.tip.setPosition(cartesian, movement.endPosition.x, movement.endPosition.y);\n });\n this.event.mouse_right_keyboard_ctrl(function (movement, cartesian) {\n if (selectPoint) {\n _this6.options.positions.pop();\n _this6.sdk.viewer.entities.remove(_this6.nodePoints[_this6.nodePoints.length - 1]);\n _this6.nodePoints.pop();\n if (selectPoint.index === _this6.options.positions.length) {\n if (_this6.nodePoints[selectPoint.index - 1]) {\n selectPoint = _this6.nodePoints[selectPoint.index - 1];\n } else {\n selectPoint.index = 0;\n }\n }\n }\n });\n this.event.gesture_pinck_start(function (movement, cartesian) {\n var startTime = new Date();\n var pos = {\n position: {\n x: (movement.position1.x + movement.position2.x) / 2,\n y: (movement.position1.y + movement.position2.y) / 2\n }\n };\n _this6.event.gesture_pinck_end(function () {\n var endTime = new Date();\n if (endTime - startTime >= 500) {\n // 长按取消\n rightEvent(pos, cartesian);\n } else {\n leftEvent(pos, cartesian);\n }\n });\n });\n for (var _i8 = 0; _i8 < this.options.positions.length; _i8++) {\n var entity = this.sdk.viewer.entities.add({\n name: 'node-secondary-edit-point',\n index: _i8,\n position: Cesium.Cartesian3.fromDegrees(this.options.positions[_i8].lng, this.options.positions[_i8].lat, this.options.positions[_i8].alt),\n billboard: {\n image: this.getSourceRootPath() + '/img/point.png',\n width: 15,\n height: 15,\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\n color: Cesium.Color.WHITE.withAlpha(0.99)\n }\n });\n this.nodePoints.push(entity);\n }\n }\n }\n }], [{\n key: \"create\",\n value: function () {\n var _create = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_6___default.a.mark(function _callee3(that) {\n var positions, fromDegreesArray, minimumHeights, maximumHeights, material, width, extrudedHeight, i;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_6___default.a.wrap(function _callee3$(_context3) {\n while (1) switch (_context3.prev = _context3.next) {\n case 0:\n // console.log(new Cesium.CustomMaterialSource(), new Cesium.PolylineTrailLinkMaterialProperty())\n positions = that.options.positions;\n fromDegreesArray = [];\n minimumHeights = [];\n maximumHeights = [];\n material = that.getMaterial();\n width = that.computeDistance2(positions);\n extrudedHeight = that.aspectRatio ? width / that.aspectRatio : 0; // aspectRatio\n for (i = 0; i < positions.length; i++) {\n fromDegreesArray.push(positions[i].lng, positions[i].lat);\n minimumHeights.push(positions[i].alt);\n maximumHeights.push(positions[i].alt + extrudedHeight);\n }\n that.entity = that.sdk.viewer.entities.add({\n id: that.options.id,\n show: that.options.show,\n wall: {\n positions: Cesium.Cartesian3.fromDegreesArray(fromDegreesArray),\n cornerType: Cesium.CornerType.MITERED,\n maximumHeights: maximumHeights,\n minimumHeights: minimumHeights,\n material: material\n }\n // wall: {\n // positions: Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray),\n // maximumHeights: maximumHeights,\n // minimumHeights: minimumHeights,\n // material: new Cesium.PolylineTrailLinkMaterialProperty({duration: 1500}),\n // outline: true,\n // outlineColor: Cesium.Color.BLACK,\n // }\n });\n Object(_Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_16__[\"syncData\"])(that.sdk, that.options.id);\n if (that.options.show) {\n Object(_Global_SplitScreen__WEBPACK_IMPORTED_MODULE_17__[\"setSplitDirection\"])(0, that.options.id);\n }\n case 11:\n case \"end\":\n return _context3.stop();\n }\n }, _callee3);\n }));\n function create(_x2) {\n return _create.apply(this, arguments);\n }\n return create;\n }()\n }]);\n}(_index__WEBPACK_IMPORTED_MODULE_12__[\"default\"]);\n/* harmony default export */ __webpack_exports__[\"default\"] = (StandText);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvT2JqL0Jhc2UvVGV4dE9iamVjdC9TdGFuZFRleHQvaW5kZXguanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvT2JqL0Jhc2UvVGV4dE9iamVjdC9TdGFuZFRleHQvaW5kZXguanM/ZDk1YSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgRGlhbG9nIGZyb20gJy4uLy4uLy4uL0VsZW1lbnQvRGlhbG9nJztcclxuaW1wb3J0IEV2ZW50QmluZGluZyBmcm9tICcuLi8uLi8uLi9FbGVtZW50L0RpYWxvZy9ldmVudEJpbmRpbmcnO1xyXG5pbXBvcnQgY3lfdGFicyBmcm9tIFwiLi4vLi4vLi4vRWxlbWVudC9jeV9odG1sX3RhYnNcIjtcclxuaW1wb3J0IHJpY2hUZXh0IGZyb20gXCIuLi8uLi8uLi9FbGVtZW50L3JpY2hUZXh0XCI7XHJcbmltcG9ydCB7IGh0bWwgfSBmcm9tIFwiLi9fZWxlbWVudFwiO1xyXG5pbXBvcnQgQmFzZSBmcm9tIFwiLi4vLi4vaW5kZXhcIjtcclxuaW1wb3J0IExhYmVsT2JqZWN0IGZyb20gJy4uLy4uL0xhYmVsT2JqZWN0J1xyXG5pbXBvcnQgTW91c2VFdmVudCBmcm9tICcuLi8uLi8uLi8uLi9FdmVudCdcclxuaW1wb3J0IE1vdXNlVGlwIGZyb20gJy4uLy4uLy4uLy4uL01vdXNlVGlwJ1xyXG5pbXBvcnQgeyBzeW5jRGF0YSB9IGZyb20gJy4uLy4uLy4uLy4uL0dsb2JhbC9NdWx0aVZpZXdwb3J0TW9kZSdcclxuaW1wb3J0IHsgc2V0U3BsaXREaXJlY3Rpb24sIHN5bmNTcGxpdERhdGEsIHNldEFjdGl2ZUlkIH0gZnJvbSAnLi4vLi4vLi4vLi4vR2xvYmFsL1NwbGl0U2NyZWVuJ1xyXG5cclxuY2xhc3MgU3RhbmRUZXh0IGV4dGVuZHMgQmFzZSB7XHJcbiAgLyoqXHJcbiAgICogQGNvbnN0cnVjdG9yXHJcbiAgICogQHBhcmFtIHNka1xyXG4gICAqIEBkZXNjcmlwdGlvbiDnq4vkvZPmloflrZdcclxuICAgKiBAcGFyYW0gb3B0aW9ucyB7b2JqZWN0fVxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmlkIHtzdHJpbmd9IOWUr+S4gOagh+ivhlxyXG4gICAqIEBwYXJhbSBvcHRpb25zLnRleHQge3N0cmluZ30g5paH5a2XXHJcbiAgICogQHBhcmFtIG9wdGlvbnMuY29sb3I9XCIjRkZDMTA3XCIge3N0cmluZ30g6aKc6ImyXHJcbiAgICogQHBhcmFtIG9wdGlvbnMuc3BlZWQ9MSB7bnVtYmVyfSDmloflrZfnp7vliqjpgJ/luqZcclxuICAgKiBAcGFyYW0ge0FycmF5LjxvYmplY3Q+fSBwb3NpdGlvbnMg57uP57qs5bqm5ZKM6auY5bqm55qE5YiX6KGo77yM5YC85Lqk5pu/IFt7bG9uLGxhdCxhbHR9LC4uLl1cclxuICAgKiBAcGFyYW0gb3B0aW9ucy5wb3NpdGlvbnNbXS5sbmcge251bWJlcn0g57uP5bqmXHJcbiAgICogQHBhcmFtIG9wdGlvbnMucG9zaXRpb25zW10ubGF0IHtudW1iZXJ9IOe6rOW6plxyXG4gICAqIEBwYXJhbSBvcHRpb25zLnBvc2l0aW9uc1tdLmFsdCB7bnVtYmVyfSDpq5jluqZcclxuICAgKiBAcGFyYW0gb3B0aW9ucy5jdXN0b21WaWV3IHtvYmplY3R9IOm7mOiupOinhuinklxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmN1c3RvbVZpZXcub3JpZW50YXRpb24ge29iamVjdH0g6buY6K6k6KeG6KeS5pa55L2NXHJcbiAgICogQHBhcmFtIG9wdGlvbnMuY3VzdG9tVmlldy5vcmllbnRhdGlvbi5oZWFkaW5nIHtudW1iZXJ9IOiIquWQkeinklxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmN1c3RvbVZpZXcub3JpZW50YXRpb24ucGl0Y2gge251bWJlcn0g5L+v5Luw6KeSXHJcbiAgICogQHBhcmFtIG9wdGlvbnMuY3VzdG9tVmlldy5vcmllbnRhdGlvbi5yb2xsIHtudW1iZXJ9IOe/u+a7muinklxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmN1c3RvbVZpZXcucmVsYXRpdmVQb3NpdGlvbiB7b2JqZWN0fSDop4bop5Lnm7jlr7nkvY3nva5cclxuICAgKiBAcGFyYW0gb3B0aW9ucy5jdXN0b21WaWV3LnJlbGF0aXZlUG9zaXRpb24ubG5nIHtudW1iZXJ9IOe7j+W6plxyXG4gICAqIEBwYXJhbSBvcHRpb25zLmN1c3RvbVZpZXcucmVsYXRpdmVQb3NpdGlvbi5sYXQge251bWJlcn0g57qs5bqmXHJcbiAgICogQHBhcmFtIG9wdGlvbnMuY3VzdG9tVmlldy5yZWxhdGl2ZVBvc2l0aW9uLmFsdCB7bnVtYmVyfSDpq5jluqZcclxuICAgKiAqL1xyXG4gIGNvbnN0cnVjdG9yKHNkaywgb3B0aW9ucywgX0RpYWxvZyA9IHt9KSB7XHJcbiAgICBzdXBlcihzZGssIG9wdGlvbnMpO1xyXG4gICAgdGhpcy5vcHRpb25zLnRleHQgPSBvcHRpb25zLnRleHQgfHwgXCLmnKrlkb3lkI3lr7nosaFcIlxyXG4gICAgbGV0IHRleHRBcnJheSA9IHRoaXMub3B0aW9ucy50ZXh0LnNwbGl0KCdcXG4nKVxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZXh0QXJyYXkubGVuZ3RoOyBpKyspIHtcclxuICAgICAgaWYgKHRleHRBcnJheVtpXS5sZW5ndGggPiA4MCkge1xyXG4gICAgICAgIHRleHRBcnJheVtpXSA9IHRleHRBcnJheVtpXS5zbGljZSgwLCA4MC10ZXh0QXJyYXlbaV0ubGVuZ3RoKVxyXG4gICAgICB9IFxyXG4gICAgfVxyXG4gICAgaWYgKHRleHRBcnJheS5sZW5ndGggPiA3MCkge1xyXG4gICAgICB0ZXh0QXJyYXkuc3BsaWNlKDcwIC0gdGV4dEFycmF5Lmxlbmd0aClcclxuICAgIH1cclxuICAgIHRoaXMub3B0aW9ucy50ZXh0ID0gdGV4dEFycmF5LmpvaW4oJ1xcbicpXHJcbiAgICB0aGlzLm9wdGlvbnMuY29sb3IgPSBvcHRpb25zLmNvbG9yIHx8IFwiI0ZGQzEwN1wiXHJcbiAgICAvLyB0aGlzLm9wdGlvbnMuY29ybmVyVHlwZSA9IG9wdGlvbnMuY29ybmVyVHlwZSB8fCAnTUlURVJFRCdcclxuICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnMgPSBvcHRpb25zLnBvc2l0aW9uc1xyXG4gICAgLy8gdGhpcy5vcHRpb25zLm1hdGVyaWFsID0gTnVtYmVyKG9wdGlvbnMubWF0ZXJpYWwpIHx8IDBcclxuICAgIHRoaXMub3B0aW9ucy5zcGVlZCA9IChvcHRpb25zLnNwZWVkIHx8IG9wdGlvbnMuc3BlZWQgPT09IDApID8gb3B0aW9ucy5zcGVlZCA6IDFcclxuICAgIC8vIHRoaXMub3B0aW9ucy5kdXJhdGlvbiA9IChvcHRpb25zLmR1cmF0aW9uIHx8IG9wdGlvbnMuZHVyYXRpb24gPT09IDApID8gb3B0aW9ucy5kdXJhdGlvbiA6IDUwMDAwXHJcbiAgICB0aGlzLm9wdGlvbnMuc2hvdyA9IChvcHRpb25zLnNob3cgfHwgb3B0aW9ucy5zaG93ID09PSBmYWxzZSkgPyBvcHRpb25zLnNob3cgOiB0cnVlXHJcbiAgICB0aGlzLm5vZGVQb2ludHMgPSBbXVxyXG4gICAgdGhpcy5lbnRpdHlcclxuXHJcbiAgICBkZWxldGUgdGhpcy5vcHRpb25zLm5hbWVcclxuXHJcbiAgICB0aGlzLmV4dHJ1ZGVkSGVpZ2h0XHJcbiAgICB0aGlzLl9FdmVudEJpbmRpbmcgPSBuZXcgRXZlbnRCaW5kaW5nKClcclxuICAgIHRoaXMuRGlhbG9nID0gX0RpYWxvZ1xyXG4gICAgdGhpcy5fZWxtcyA9IHt9O1xyXG4gICAgdGhpcy5zZGsuYWRkSW5jZXRhbmNlKHRoaXMub3B0aW9ucy5pZCwgdGhpcylcclxuICAgIFN0YW5kVGV4dC5jcmVhdGUodGhpcylcclxuICB9XHJcblxyXG4gIGdldCBuYW1lKCkge1xyXG4gICAgcmV0dXJuXHJcbiAgfVxyXG4gIGdldCB0ZXh0KCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy50ZXh0XHJcbiAgfVxyXG5cclxuICBzZXQgdGV4dCh2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMudGV4dCA9IHZcclxuICAgIGxldCB0ZXh0QXJyYXkgPSB0aGlzLm9wdGlvbnMudGV4dC5zcGxpdCgnXFxuJylcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGV4dEFycmF5Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGlmICh0ZXh0QXJyYXlbaV0ubGVuZ3RoID4gODApIHtcclxuICAgICAgICBsZXQgX2Vycm9yID0gJ+ihjOi2hei/hzgw5Liq5a2X56ymLOivt+aMieWbnui9pu+8iEVudGVy77yJ5ZCO77yM57un57ut6L6T5YWlJ1xyXG4gICAgICAgIHdpbmRvdy5FTEVNRU5UICYmIHdpbmRvdy5FTEVNRU5ULk1lc3NhZ2Uoe1xyXG4gICAgICAgICAgbWVzc2FnZTogX2Vycm9yLFxyXG4gICAgICAgICAgdHlwZTogJ3dhcm5pbmcnLFxyXG4gICAgICAgICAgZHVyYXRpb246IDEwMDBcclxuICAgICAgICB9KTtcclxuICAgICAgICB0ZXh0QXJyYXlbaV0gPSB0ZXh0QXJyYXlbaV0uc2xpY2UoMCwgODAtdGV4dEFycmF5W2ldLmxlbmd0aClcclxuICAgICAgfSBcclxuICAgIH1cclxuICAgIGlmICh0ZXh0QXJyYXkubGVuZ3RoID4gNzApIHtcclxuICAgICAgdGV4dEFycmF5LnNwbGljZSg3MCAtIHRleHRBcnJheS5sZW5ndGgpXHJcbiAgICAgIGxldCBfZXJyb3IgPSAn6LaF6L+H5pyA5aSn6L6T5YWl5a2X56ymJ1xyXG4gICAgICAgIHdpbmRvdy5FTEVNRU5UICYmIHdpbmRvdy5FTEVNRU5ULk1lc3NhZ2Uoe1xyXG4gICAgICAgICAgbWVzc2FnZTogX2Vycm9yLFxyXG4gICAgICAgICAgdHlwZTogJ3dhcm5pbmcnLFxyXG4gICAgICAgICAgZHVyYXRpb246IDEwMDBcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIHRoaXMub3B0aW9ucy50ZXh0ID0gdGV4dEFycmF5LmpvaW4oJ1xcbicpXHJcbiAgICBpZiAodGhpcy5lbnRpdHkpIHtcclxuICAgICAgbGV0IHBvc2l0aW9ucyA9IHRoaXMub3B0aW9ucy5wb3NpdGlvbnNcclxuICAgICAgbGV0IGZyb21EZWdyZWVzQXJyYXkgPSBbXVxyXG4gICAgICBsZXQgbWluaW11bUhlaWdodHMgPSBbXVxyXG4gICAgICBsZXQgbWF4aW11bUhlaWdodHMgPSBbXVxyXG4gICAgICBsZXQgbWF0ZXJpYWwgPSB0aGlzLmdldE1hdGVyaWFsKClcclxuICAgICAgbGV0IHdpZHRoID0gdGhpcy5jb21wdXRlRGlzdGFuY2UyKHBvc2l0aW9ucylcclxuICAgICAgbGV0IGV4dHJ1ZGVkSGVpZ2h0ID0gdGhpcy5hc3BlY3RSYXRpbyA/ICh3aWR0aCAvIHRoaXMuYXNwZWN0UmF0aW8pIDogMFxyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGZyb21EZWdyZWVzQXJyYXkucHVzaChwb3NpdGlvbnNbaV0ubG5nLCBwb3NpdGlvbnNbaV0ubGF0KVxyXG4gICAgICAgIG1pbmltdW1IZWlnaHRzLnB1c2gocG9zaXRpb25zW2ldLmFsdClcclxuICAgICAgICBtYXhpbXVtSGVpZ2h0cy5wdXNoKHBvc2l0aW9uc1tpXS5hbHQgKyBleHRydWRlZEhlaWdodClcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmVudGl0eS53YWxsLm1hdGVyaWFsID0gbWF0ZXJpYWxcclxuICAgICAgdGhpcy5lbnRpdHkud2FsbC5tYXhpbXVtSGVpZ2h0cyA9IG1heGltdW1IZWlnaHRzXHJcbiAgICAgIHRoaXMuZW50aXR5LndhbGwubWluaW11bUhlaWdodHMgPSBtaW5pbXVtSGVpZ2h0c1xyXG4gICAgfVxyXG4gICAgdGhpcy5fZWxtcy50ZXh0ICYmIHRoaXMuX2VsbXMudGV4dC5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgIGl0ZW0udmFsdWUgPSB2XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgZ2V0IGNvbG9yKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5jb2xvclxyXG4gIH1cclxuICBzZXQgY29sb3Iodikge1xyXG4gICAgdGhpcy5vcHRpb25zLmNvbG9yID0gdlxyXG4gICAgdGhpcy5lbnRpdHkud2FsbC5tYXRlcmlhbCA9IHRoaXMuZ2V0TWF0ZXJpYWwoKVxyXG4gICAgaWYgKHRoaXMuX2VsbXMuY29sb3IpIHtcclxuICAgICAgdGhpcy5fZWxtcy5jb2xvci5mb3JFYWNoKChpdGVtLCBpKSA9PiB7XHJcbiAgICAgICAgbGV0IGNvbG9yUGlja2VyID0gbmV3IFlKQ29sb3JQaWNrZXIoe1xyXG4gICAgICAgICAgZWw6IGl0ZW0uZWwsXHJcbiAgICAgICAgICBzaXplOiAnbWluaScsLy/popzoibJib3jnsbvlnotcclxuICAgICAgICAgIGFscGhhOiB0cnVlLC8v5piv5ZCm5byA5ZCv6YCP5piO5bqmXHJcbiAgICAgICAgICBkZWZhdWx0Q29sb3I6IHYsXHJcbiAgICAgICAgICBkaXNhYmxlZDogZmFsc2UsLy/mmK/lkKbnpoHmraLmiZPlvIDpopzoibLpgInmi6nlmahcclxuICAgICAgICAgIG9wZW5QaWNrZXJBbmk6ICdvcGFjaXR5JywvL+aJk+W8gOminOiJsumAieaLqeWZqOWKqOeUu1xyXG4gICAgICAgICAgc3VyZTogKGMpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5jb2xvciA9IGNcclxuICAgICAgICAgIH0sLy/ngrnlh7vnoa7orqTmjInpkq7kuovku7blm57osINcclxuICAgICAgICAgIGNsZWFyOiAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuY29sb3IgPSAncmdiYSgyNTUsMjU1LDI1NSwxKSdcclxuICAgICAgICAgIH0sLy/ngrnlh7vmuIXnqbrmjInpkq7kuovku7blm57osINcclxuICAgICAgICB9KVxyXG4gICAgICAgIHRoaXMuX2VsbXMuY29sb3JbaV0gPSBjb2xvclBpY2tlclxyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gZ2V0IG1hdGVyaWFsKCkge1xyXG4gIC8vICAgcmV0dXJuIHRoaXMub3B0aW9ucy5tYXRlcmlhbFxyXG4gIC8vIH1cclxuICAvLyBzZXQgbWF0ZXJpYWwodikge1xyXG4gIC8vICAgdGhpcy5vcHRpb25zLm1hdGVyaWFsID0gTnVtYmVyKHYpXHJcbiAgLy8gICB0aGlzLmVudGl0eS53YWxsLm1hdGVyaWFsID0gdGhpcy5nZXRNYXRlcmlhbCgpXHJcbiAgLy8gICB0aGlzLl9lbG1zLm1hdGVyaWFsICYmIHRoaXMuX2VsbXMubWF0ZXJpYWwuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gIC8vICAgICBpdGVtLnZhbHVlID0gdlxyXG4gIC8vICAgfSlcclxuICAvLyB9XHJcblxyXG4gIGdldCBzcGVlZCgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuc3BlZWRcclxuICB9XHJcblxyXG4gIHNldCBzcGVlZCh2KSB7XHJcbiAgICB0aGlzLm9wdGlvbnMuc3BlZWQgPSB2XHJcbiAgICB0aGlzLmVudGl0eS53YWxsLm1hdGVyaWFsID0gdGhpcy5nZXRNYXRlcmlhbCgpXHJcbiAgICB0aGlzLl9lbG1zLnNwZWVkICYmIHRoaXMuX2VsbXMuc3BlZWQuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICBpdGVtLnZhbHVlID0gdlxyXG4gICAgfSlcclxuICB9XHJcblxyXG5cclxuICAvLyBnZXQgYXR0cmlidXRlTGluaygpIHtcclxuICAvLyAgIHJldHVybiB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudFxyXG4gIC8vIH1cclxuXHJcbiAgLy8gc2V0IGF0dHJpYnV0ZUxpbmsodikge1xyXG4gIC8vICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnQgPSB2XHJcbiAgLy8gICBpZiAoIXRoaXMuX0RpYWxvZ09iamVjdCB8fCAhdGhpcy5fRGlhbG9nT2JqZWN0Ll9lbGVtZW50IHx8ICF0aGlzLl9EaWFsb2dPYmplY3QuX2VsZW1lbnQuY29udGVudCkge1xyXG4gIC8vICAgICByZXR1cm5cclxuICAvLyAgIH1cclxuICAvLyAgIGxldCB0YWJsZSA9IHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2F0dHJpYnV0ZS1jb250ZW50LWxpbmsnKVsxXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0YWJsZScpWzBdXHJcbiAgLy8gICBsZXQgdGFibGVDb250ZW50ID0gdGFibGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndGFibGUtYm9keScpWzBdXHJcbiAgLy8gICB0YWJsZUNvbnRlbnQuaW5uZXJIVE1MID0gJydcclxuICAvLyAgIGlmICh0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudC5sZW5ndGggPiAwKSB7XHJcbiAgLy8gICAgIHRhYmxlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RhYmxlLWVtcHR5JylbMF0uc3R5bGUuZGlzcGxheSA9ICdub25lJ1xyXG4gIC8vICAgfVxyXG4gIC8vICAgZWxzZSB7XHJcbiAgLy8gICAgIHRhYmxlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RhYmxlLWVtcHR5JylbMF0uc3R5bGUuZGlzcGxheSA9ICdmbGV4J1xyXG4gIC8vICAgfVxyXG4gIC8vICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudC5sZW5ndGg7IGkrKykge1xyXG4gIC8vICAgICBsZXQgdHIgPSBgXHJcbiAgLy8gICAgIDxkaXYgY2xhc3M9XCJ0clwiPlxyXG4gIC8vICAgICAgICAgPGRpdiBjbGFzcz1cInRkXCI+YCArIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50W2ldLm5hbWUgKyBgPC9kaXY+XHJcbiAgLy8gICAgICAgICA8ZGl2IGNsYXNzPVwidGRcIj5gICsgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnRbaV0udXJsICsgYDwvZGl2PlxyXG4gIC8vICAgICAgICAgPGRpdiBjbGFzcz1cInRkXCI+XHJcbiAgLy8gICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInRleHRcIiBAY2xpY2s9XCJsaW5rRWRpdFwiPue8lui+kTwvYnV0dG9uPlxyXG4gIC8vICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJ0ZXh0XCIgQGNsaWNrPVwibGlua0RlbGV0ZVwiPuWIoOmZpDwvYnV0dG9uPlxyXG4gIC8vICAgICAgICAgPC9kaXY+XHJcbiAgLy8gICAgIDwvZGl2PmBcclxuICAvLyAgICAgbGV0IHRyRWxtID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKS5jcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQodHIpXHJcbiAgLy8gICAgIHRhYmxlQ29udGVudC5hcHBlbmRDaGlsZCh0ckVsbSlcclxuICAvLyAgIH1cclxuICAvLyAgIGxldCBpdGVtID0gdGFibGVDb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RyJylcclxuICAvLyAgIGxldCBmdW4gPSB7XHJcbiAgLy8gICAgIGxpbmtFZGl0OiBhc3luYyAoaW5kZXgpID0+IHtcclxuICAvLyAgICAgICB0aGlzLmF0dHJpYnV0ZUxpbmsgPSBhd2FpdCB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudFxyXG4gIC8vICAgICAgIGxldCB0YWJsZSA9IHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5jb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2F0dHJpYnV0ZS1jb250ZW50LWxpbmsnKVsxXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0YWJsZScpWzBdXHJcbiAgLy8gICAgICAgbGV0IHRhYmxlQ29udGVudCA9IHRhYmxlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RhYmxlLWJvZHknKVswXVxyXG4gIC8vICAgICAgIGxldCBpdGVtID0gdGFibGVDb250ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RyJylcclxuICAvLyAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW0ubGVuZ3RoOyBpKyspIHtcclxuICAvLyAgICAgICAgIGlmIChpbmRleCA9PT0gaSkge1xyXG4gIC8vICAgICAgICAgICBsZXQgaHRtbCA9IGBcclxuICAvLyAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGRcIj5cclxuICAvLyAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImlucHV0XCIgdHlwZT1cInRleHRcIj5cclxuICAvLyAgICAgICAgICAgICA8L2Rpdj5cclxuICAvLyAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGRcIj5cclxuICAvLyAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cFwiPlxyXG4gIC8vICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJpbnB1dFwiIHR5cGU9XCJ0ZXh0XCIgc3R5bGU9XCJ3aWR0aDogMTQwcHg7XCI+XHJcbiAgLy8gICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiZmlsZVwiIGFjY2VwdD1cIi5tcDQsIC5wZGZcIiBjbGFzcz1cImZpbGUtc2VsZWN0XCIgaW5kZXg9XCJgKyBpICsgYFwiIHN0eWxlPVwiZGlzcGxheTpub25lXCI+XHJcbiAgLy8gICAgICAgICAgICAgICAgIDxidXR0b24gQGNsaWNrPVwiZmlsZVNlbGVjdFwiPi4uLjwvYnV0dG9uPlxyXG4gIC8vICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgLy8gICAgICAgICAgICAgPC9kaXY+XHJcbiAgLy8gICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRkXCI+XHJcbiAgLy8gICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJ0ZXh0XCIgQGNsaWNrPVwiY29uZmlybUVkaXRcIj7noa7orqQ8L2J1dHRvbj5cclxuICAvLyAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInRleHRcIiBAY2xpY2s9XCJjYW5jZWxFZGl0XCI+5Y+W5raIPC9idXR0b24+XHJcbiAgLy8gICAgICAgICAgICAgPC9kaXY+YFxyXG4gIC8vICAgICAgICAgICBpdGVtW2ldLmlubmVySFRNTCA9IGh0bWxcclxuICAvLyAgICAgICAgICAgbGV0IHRkID0gaXRlbVtpXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0ZCcpXHJcbiAgLy8gICAgICAgICAgIHRkWzBdLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2lucHV0JylbMF0udmFsdWUgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudFtpbmRleF0ubmFtZVxyXG4gIC8vICAgICAgICAgICB0ZFsxXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdpbnB1dCcpWzBdLnZhbHVlID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnRbaW5kZXhdLnVybFxyXG4gIC8vICAgICAgICAgICBsZXQgYnRuID0gaXRlbVtpXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnYnV0dG9uJylcclxuICAvLyAgICAgICAgICAgZm9yIChsZXQgbiA9IDA7IG4gPCBidG4ubGVuZ3RoOyBuKyspIHtcclxuICAvLyAgICAgICAgICAgICBmb3IgKGxldCBtIG9mIGJ0bltuXS5hdHRyaWJ1dGVzKSB7XHJcbiAgLy8gICAgICAgICAgICAgICBpZiAobS5uYW1lID09PSAnQGNsaWNrJykge1xyXG4gIC8vICAgICAgICAgICAgICAgICBidG5bbl0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xyXG4gIC8vICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgKGZ1blttLnZhbHVlXSkgPT09ICdmdW5jdGlvbicpIHtcclxuICAvLyAgICAgICAgICAgICAgICAgICAgIGZ1blttLnZhbHVlXSh7IG5hbWU6IHRkWzBdLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2lucHV0JylbMF0udmFsdWUsIHVybDogdGRbMV0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaW5wdXQnKVswXS52YWx1ZSB9LCBpKVxyXG4gIC8vICAgICAgICAgICAgICAgICAgIH1cclxuICAvLyAgICAgICAgICAgICAgICAgfSk7XHJcbiAgLy8gICAgICAgICAgICAgICAgIGJ0bltuXS5hdHRyaWJ1dGVzLnJlbW92ZU5hbWVkSXRlbShtLm5hbWUpXHJcbiAgLy8gICAgICAgICAgICAgICAgIGJyZWFrXHJcbiAgLy8gICAgICAgICAgICAgICB9XHJcbiAgLy8gICAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgICB9XHJcbiAgLy8gICAgICAgICAgIGJyZWFrXHJcbiAgLy8gICAgICAgICB9XHJcbiAgLy8gICAgICAgfVxyXG4gIC8vICAgICB9LFxyXG4gIC8vICAgICBsaW5rRGVsZXRlOiAoaSkgPT4ge1xyXG4gIC8vICAgICAgIHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50LnNwbGljZShpLCAxKVxyXG4gIC8vICAgICAgIHRoaXMuYXR0cmlidXRlTGluayA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50XHJcbiAgLy8gICAgIH0sXHJcblxyXG4gIC8vICAgICBjb25maXJtRWRpdDogKHZhbHVlLCBpKSA9PiB7XHJcbiAgLy8gICAgICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnRbaV0gPSB2YWx1ZVxyXG4gIC8vICAgICAgIHRoaXMuYXR0cmlidXRlTGluayA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGUubGluay5jb250ZW50XHJcbiAgLy8gICAgIH0sXHJcbiAgLy8gICAgIGNhbmNlbEVkaXQ6ICgpID0+IHtcclxuICAvLyAgICAgICB0aGlzLmF0dHJpYnV0ZUxpbmsgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlLmxpbmsuY29udGVudFxyXG4gIC8vICAgICB9LFxyXG4gIC8vICAgICBmaWxlU2VsZWN0OiAodmFsdWUsIGkpID0+IHtcclxuICAvLyAgICAgICBsZXQgZmlsZUVsbSA9IGl0ZW1baV0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnZmlsZS1zZWxlY3QnKVswXVxyXG4gIC8vICAgICAgIGZpbGVFbG0uY2xpY2soKVxyXG4gIC8vICAgICAgIGZpbGVFbG0ucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgZmlsZVNlbGVjdClcclxuICAvLyAgICAgICBmaWxlRWxtLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGZpbGVTZWxlY3QpXHJcbiAgLy8gICAgIH1cclxuICAvLyAgIH1cclxuICAvLyAgIGxldCBmaWxlU2VsZWN0ID0gKGV2ZW50KSA9PiB7XHJcbiAgLy8gICAgIGlmIChldmVudC50YXJnZXQudmFsdWUpIHtcclxuICAvLyAgICAgICBsZXQgdGQgPSBpdGVtW2V2ZW50LnRhcmdldC5nZXRBdHRyaWJ1dGUoJ2luZGV4JyldLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RkJylcclxuICAvLyAgICAgICB0ZFsxXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdpbnB1dCcpWzBdLnZhbHVlID0gZXZlbnQudGFyZ2V0LnZhbHVlXHJcbiAgLy8gICAgICAgZXZlbnQudGFyZ2V0LnZhbHVlID0gbnVsbFxyXG4gIC8vICAgICB9XHJcbiAgLy8gICB9XHJcbiAgLy8gICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW0ubGVuZ3RoOyBpKyspIHtcclxuICAvLyAgICAgbGV0IGJ0biA9IGl0ZW1baV0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2J1dHRvbicpXHJcbiAgLy8gICAgIGZvciAobGV0IG4gPSAwOyBuIDwgYnRuLmxlbmd0aDsgbisrKSB7XHJcbiAgLy8gICAgICAgZm9yIChsZXQgbSBvZiBidG5bbl0uYXR0cmlidXRlcykge1xyXG4gIC8vICAgICAgICAgaWYgKG0ubmFtZSA9PT0gJ0BjbGljaycpIHtcclxuICAvLyAgICAgICAgICAgYnRuW25dLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcclxuICAvLyAgICAgICAgICAgICBpZiAodHlwZW9mIChmdW5bbS52YWx1ZV0pID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgLy8gICAgICAgICAgICAgICBmdW5bbS52YWx1ZV0oaSlcclxuICAvLyAgICAgICAgICAgICB9XHJcbiAgLy8gICAgICAgICAgIH0pO1xyXG4gIC8vICAgICAgICAgICBidG5bbl0uYXR0cmlidXRlcy5yZW1vdmVOYW1lZEl0ZW0obS5uYW1lKVxyXG4gIC8vICAgICAgICAgICBicmVha1xyXG4gIC8vICAgICAgICAgfVxyXG4gIC8vICAgICAgIH1cclxuICAvLyAgICAgfVxyXG4gIC8vICAgfVxyXG5cclxuXHJcblxyXG5cclxuICAvLyB9XHJcblxyXG4gIC8v5Yib5bu6XHJcbiAgc3RhdGljIGFzeW5jIGNyZWF0ZSh0aGF0KSB7XHJcblxyXG4gICAgLy8gY29uc29sZS5sb2cobmV3IENlc2l1bS5DdXN0b21NYXRlcmlhbFNvdXJjZSgpLCBuZXcgQ2VzaXVtLlBvbHlsaW5lVHJhaWxMaW5rTWF0ZXJpYWxQcm9wZXJ0eSgpKVxyXG4gICAgbGV0IHBvc2l0aW9ucyA9IHRoYXQub3B0aW9ucy5wb3NpdGlvbnNcclxuICAgIGxldCBmcm9tRGVncmVlc0FycmF5ID0gW11cclxuICAgIGxldCBtaW5pbXVtSGVpZ2h0cyA9IFtdXHJcbiAgICBsZXQgbWF4aW11bUhlaWdodHMgPSBbXVxyXG4gICAgbGV0IG1hdGVyaWFsID0gdGhhdC5nZXRNYXRlcmlhbCgpXHJcbiAgICBsZXQgd2lkdGggPSB0aGF0LmNvbXB1dGVEaXN0YW5jZTIocG9zaXRpb25zKVxyXG4gICAgbGV0IGV4dHJ1ZGVkSGVpZ2h0ID0gdGhhdC5hc3BlY3RSYXRpbyA/ICh3aWR0aCAvIHRoYXQuYXNwZWN0UmF0aW8pIDogMFxyXG4gICAgLy8gYXNwZWN0UmF0aW9cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGZyb21EZWdyZWVzQXJyYXkucHVzaChwb3NpdGlvbnNbaV0ubG5nLCBwb3NpdGlvbnNbaV0ubGF0KVxyXG4gICAgICBtaW5pbXVtSGVpZ2h0cy5wdXNoKHBvc2l0aW9uc1tpXS5hbHQpXHJcbiAgICAgIG1heGltdW1IZWlnaHRzLnB1c2gocG9zaXRpb25zW2ldLmFsdCArIGV4dHJ1ZGVkSGVpZ2h0KVxyXG4gICAgfVxyXG5cclxuICAgIHRoYXQuZW50aXR5ID0gdGhhdC5zZGsudmlld2VyLmVudGl0aWVzLmFkZCh7XHJcbiAgICAgIGlkOiB0aGF0Lm9wdGlvbnMuaWQsXHJcbiAgICAgIHNob3c6IHRoYXQub3B0aW9ucy5zaG93LFxyXG4gICAgICB3YWxsOiB7XHJcbiAgICAgICAgcG9zaXRpb25zOiBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlc0FycmF5KGZyb21EZWdyZWVzQXJyYXkpLFxyXG4gICAgICAgIGNvcm5lclR5cGU6IENlc2l1bS5Db3JuZXJUeXBlLk1JVEVSRUQsXHJcbiAgICAgICAgbWF4aW11bUhlaWdodHM6IG1heGltdW1IZWlnaHRzLFxyXG4gICAgICAgIG1pbmltdW1IZWlnaHRzOiBtaW5pbXVtSGVpZ2h0cyxcclxuICAgICAgICBtYXRlcmlhbDogbWF0ZXJpYWwsXHJcbiAgICAgIH0sXHJcbiAgICAgIC8vIHdhbGw6IHtcclxuICAgICAgLy8gICBwb3NpdGlvbnM6IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzQXJyYXlIZWlnaHRzKGZyb21EZWdyZWVzQXJyYXkpLFxyXG4gICAgICAvLyAgIG1heGltdW1IZWlnaHRzOiBtYXhpbXVtSGVpZ2h0cyxcclxuICAgICAgLy8gICBtaW5pbXVtSGVpZ2h0czogbWluaW11bUhlaWdodHMsXHJcbiAgICAgIC8vICAgbWF0ZXJpYWw6IG5ldyBDZXNpdW0uUG9seWxpbmVUcmFpbExpbmtNYXRlcmlhbFByb3BlcnR5KHtkdXJhdGlvbjogMTUwMH0pLFxyXG4gICAgICAvLyAgIG91dGxpbmU6IHRydWUsXHJcbiAgICAgIC8vICAgb3V0bGluZUNvbG9yOiBDZXNpdW0uQ29sb3IuQkxBQ0ssXHJcbiAgICAgIC8vIH1cclxuICAgIH0pXHJcbiAgICBzeW5jRGF0YSh0aGF0LnNkaywgdGhhdC5vcHRpb25zLmlkKVxyXG4gICAgaWYodGhhdC5vcHRpb25zLnNob3cpIHtcclxuICAgICAgIFxyXG4gICAgICBzZXRTcGxpdERpcmVjdGlvbigwLCB0aGF0Lm9wdGlvbnMuaWQpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyDnvJbovpHmoYZcclxuICBhc3luYyBlZGl0KHN0YXRlKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzXHJcbiAgICB0aGlzLm9yaWdpbmFsT3B0aW9ucyA9IHRoaXMuZGVlcENvcHlPYmoodGhpcy5vcHRpb25zKVxyXG5cclxuICAgIGlmICh0aGlzLl9EaWFsb2dPYmplY3QgJiYgdGhpcy5fRGlhbG9nT2JqZWN0LmNsb3NlKSB7XHJcbiAgICAgIHRoaXMuX0RpYWxvZ09iamVjdC5jbG9zZSgpXHJcbiAgICAgIHRoaXMuX0RpYWxvZ09iamVjdCA9IG51bGxcclxuICAgIH1cclxuICAgIGlmIChzdGF0ZSkge1xyXG4gICAgICB0aGlzLl9EaWFsb2dPYmplY3QgPSBhd2FpdCBuZXcgRGlhbG9nKHRoaXMuc2RrLCB0aGlzLm9wdGlvbnMsIHtcclxuICAgICAgICB0aXRsZTogJ+eri+S9k+aWh+Wtl+WxnuaApycsIGxlZnQ6ICcxODBweCcsIHRvcDogJzEwMHB4JyxcclxuICAgICAgICBjb25maXJtQ2FsbEJhY2s6IChvcHRpb25zKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnRleHQgPSB0aGlzLnRleHQudHJpbSgpXHJcbiAgICAgICAgICBpZiAoIXRoaXMudGV4dCkge1xyXG4gICAgICAgICAgICB0aGlzLnRleHQgPSAn5pyq5ZG95ZCN5a+56LGhJ1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5vcmlnaW5hbE9wdGlvbnMgPSB0aGlzLmRlZXBDb3B5T2JqKHRoaXMub3B0aW9ucylcclxuICAgICAgICAgIHRoaXMuX0RpYWxvZ09iamVjdC5jbG9zZSgpXHJcbiAgICAgICAgICB0aGlzLkRpYWxvZy5jb25maXJtQ2FsbEJhY2sgJiYgdGhpcy5EaWFsb2cuY29uZmlybUNhbGxCYWNrKHRoaXMub3JpZ2luYWxPcHRpb25zKVxyXG4gICAgICAgICAgc3luY0RhdGEodGhpcy5zZGssIHRoaXMub3B0aW9ucy5pZClcclxuICAgICAgICAgIHN5bmNTcGxpdERhdGEodGhpcy5zZGssIHRoaXMub3B0aW9ucy5pZClcclxuICAgICAgICB9LFxyXG4gICAgICAgIHJlc2V0Q2FsbEJhY2s6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMucmVzZXQoKVxyXG4gICAgICAgICAgdGhpcy5EaWFsb2cucmVzZXRDYWxsQmFjayAmJiB0aGlzLkRpYWxvZy5yZXNldENhbGxCYWNrKClcclxuICAgICAgICB9LFxyXG4gICAgICAgIHJlbW92ZUNhbGxCYWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLkRpYWxvZy5yZW1vdmVDYWxsQmFjayAmJiB0aGlzLkRpYWxvZy5yZW1vdmVDYWxsQmFjaygpXHJcbiAgICAgICAgfSxcclxuICAgICAgICBjbG9zZUNhbGxCYWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnJlc2V0KClcclxuICAgICAgICAgIHRoaXMuRGlhbG9nLmNsb3NlQ2FsbEJhY2sgJiYgdGhpcy5EaWFsb2cuY2xvc2VDYWxsQmFjaygpXHJcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubm9kZVBvaW50cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB0aGlzLnNkay52aWV3ZXIuZW50aXRpZXMucmVtb3ZlKHRoaXMubm9kZVBvaW50c1tpXSlcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMubm9kZVBvaW50cyA9IFtdXHJcbiAgICAgICAgICBZSi5NZWFzdXJlLlNldE1lYXN1cmVTdGF0dXMoZmFsc2UpXHJcbiAgICAgICAgICB0aGlzLmV2ZW50ICYmIHRoaXMuZXZlbnQuZGVzdHJveSgpXHJcbiAgICAgICAgICB0aGlzLnRpcCAmJiB0aGlzLnRpcC5kZXN0cm95KClcclxuICAgICAgICB9LFxyXG4gICAgICAgIHNob3dDYWxsQmFjazogKHNob3cpID0+IHtcclxuICAgICAgICAgIHRoaXMub3B0aW9ucy5zaG93ID0gc2hvd1xyXG4gICAgICAgICAgdGhpcy5vcmlnaW5hbE9wdGlvbnMuc2hvdyA9IHNob3dcclxuICAgICAgICAgIHRoaXMuc2hvdyA9IHNob3dcclxuICAgICAgICAgIHRoaXMuRGlhbG9nLnNob3dDYWxsQmFjayAmJiB0aGlzLkRpYWxvZy5zaG93Q2FsbEJhY2soKVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgc2Vjb25kYXJ5RWRpdENhbGxCYWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLm5vZGVFZGl0KClcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICAgIHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5ib2R5LmNsYXNzTmFtZSA9IHRoaXMuX0RpYWxvZ09iamVjdC5fZWxlbWVudC5ib2R5LmNsYXNzTmFtZSArICcgc3RhbmQtdGV4dCdcclxuICAgICAgbGV0IGNvbnRlbnRFbG0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgY29udGVudEVsbS5pbm5lckhUTUwgPSBodG1sKHRoaXMpXHJcbiAgICAgIHRoaXMuX0RpYWxvZ09iamVjdC5jb250ZW50QXBwQ2hpbGQoY29udGVudEVsbSlcclxuICAgICAgLy8gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIC8vICAgdGhpcy5hdHRyaWJ1dGVMaW5rID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZS5saW5rLmNvbnRlbnRcclxuICAgICAgLy8gICB0aGlzLmNhbWVyYVNlbGVjdCgpXHJcbiAgICAgIC8vIH0sIDUwMCk7XHJcblxyXG4gICAgICAvLyDliJvlu7rmoIfnrb7pobVcclxuICAgICAgLy8gbGV0IHRhYnNFbG0gPSBuZXcgY3lfdGFicygncmFkYXItc2Nhbi1lZGl0LXRhYnMnKVxyXG4gICAgICAvLyDpopzoibLnu4Tku7ZcclxuICAgICAgbGV0IGNvbG9yUGlja2VyID0gbmV3IFlKQ29sb3JQaWNrZXIoe1xyXG4gICAgICAgIGVsOiBjb250ZW50RWxtLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXCJjb2xvclwiKVswXSxcclxuICAgICAgICBzaXplOiAnbWluaScsLy/popzoibJib3jnsbvlnotcclxuICAgICAgICBhbHBoYTogdHJ1ZSwvL+aYr+WQpuW8gOWQr+mAj+aYjuW6plxyXG4gICAgICAgIGRlZmF1bHRDb2xvcjogdGhpcy5jb2xvcixcclxuICAgICAgICBkaXNhYmxlZDogZmFsc2UsLy/mmK/lkKbnpoHmraLmiZPlvIDpopzoibLpgInmi6nlmahcclxuICAgICAgICBvcGVuUGlja2VyQW5pOiAnb3BhY2l0eScsLy/miZPlvIDpopzoibLpgInmi6nlmajliqjnlLtcclxuICAgICAgICBzdXJlOiAoY29sb3IpID0+IHtcclxuICAgICAgICAgIHRoaXMuY29sb3IgPSBjb2xvclxyXG4gICAgICAgIH0sLy/ngrnlh7vnoa7orqTmjInpkq7kuovku7blm57osINcclxuICAgICAgICBjbGVhcjogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5jb2xvciA9ICdyZ2JhKDI1NSwyNTUsMjU1LDEpJ1xyXG4gICAgICAgIH0sLy/ngrnlh7vmuIXnqbrmjInpkq7kuovku7blm57osINcclxuICAgICAgfSlcclxuXHJcbiAgICAgIGxldCBhbGxfZWxtID0gY29udGVudEVsbS5nZXRFbGVtZW50c0J5VGFnTmFtZShcIipcIilcclxuICAgICAgdGhpcy5fRXZlbnRCaW5kaW5nLm9uKHRoaXMsIGFsbF9lbG0pXHJcbiAgICAgIHRoaXMuX2VsbXMgPSB0aGlzLl9FdmVudEJpbmRpbmcuZWxlbWVudFxyXG4gICAgICB0aGlzLl9lbG1zLmNvbG9yID0gW2NvbG9yUGlja2VyXVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKHRoaXMuX0RpYWxvZ09iamVjdCAmJiB0aGlzLl9EaWFsb2dPYmplY3QucmVtb3ZlKSB7XHJcbiAgICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0LnJlbW92ZSgpXHJcbiAgICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0ID0gbnVsbFxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZXNldCgpIHtcclxuICAgIGlmICghdGhpcy5lbnRpdHkpIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcbiAgICB0aGlzLm9wdGlvbnMgPSB0aGlzLmRlZXBDb3B5T2JqKHRoaXMub3JpZ2luYWxPcHRpb25zKVxyXG4gICAgdGhpcy50ZXh0ID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMudGV4dFxyXG4gICAgdGhpcy5jb2xvciA9IHRoaXMub3JpZ2luYWxPcHRpb25zLmNvbG9yXHJcbiAgICB0aGlzLnNwZWVkID0gdGhpcy5vcmlnaW5hbE9wdGlvbnMuc3BlZWRcclxuXHJcbiAgICBsZXQgcG9zaXRpb25zID0gdGhpcy5vcHRpb25zLnBvc2l0aW9uc1xyXG4gICAgbGV0IGZyb21EZWdyZWVzQXJyYXkgPSBbXVxyXG4gICAgbGV0IG1pbmltdW1IZWlnaHRzID0gW11cclxuICAgIGxldCBtYXhpbXVtSGVpZ2h0cyA9IFtdXHJcbiAgICBsZXQgd2lkdGggPSB0aGlzLmNvbXB1dGVEaXN0YW5jZTIocG9zaXRpb25zKVxyXG4gICAgbGV0IGV4dHJ1ZGVkSGVpZ2h0ID0gdGhpcy5hc3BlY3RSYXRpbyA/ICh3aWR0aCAvIHRoaXMuYXNwZWN0UmF0aW8pIDogMFxyXG4gICAgLy8gYXNwZWN0UmF0aW9cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGZyb21EZWdyZWVzQXJyYXkucHVzaChwb3NpdGlvbnNbaV0ubG5nLCBwb3NpdGlvbnNbaV0ubGF0KVxyXG4gICAgICBtaW5pbXVtSGVpZ2h0cy5wdXNoKHBvc2l0aW9uc1tpXS5hbHQpXHJcbiAgICAgIG1heGltdW1IZWlnaHRzLnB1c2gocG9zaXRpb25zW2ldLmFsdCArIGV4dHJ1ZGVkSGVpZ2h0KVxyXG4gICAgfVxyXG4gICAgdGhpcy5lbnRpdHkud2FsbC5wb3NpdGlvbnMgPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlc0FycmF5KGZyb21EZWdyZWVzQXJyYXkpXHJcbiAgfVxyXG5cclxuICBhc3luYyByZW1vdmUoKSB7XHJcbiAgICB0aGlzLmV2ZW50ICYmIHRoaXMuZXZlbnQuZGVzdHJveSgpXHJcbiAgICB0aGlzLnRpcCAmJiB0aGlzLnRpcC5kZXN0cm95KClcclxuICAgIHRoaXMuc2RrLnZpZXdlci5lbnRpdGllcy5yZW1vdmUodGhpcy5lbnRpdHkpXHJcbiAgICB0aGlzLmVudGl0eSA9IG51bGxcclxuICAgIGlmICh0aGlzLl9EaWFsb2dPYmplY3QgJiYgIXRoaXMuX0RpYWxvZ09iamVjdC5pc0Rlc3Ryb3kpIHtcclxuICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0LmNsb3NlKClcclxuICAgICAgdGhpcy5fRGlhbG9nT2JqZWN0ID0gbnVsbFxyXG4gICAgfVxyXG4gICAgYXdhaXQgdGhpcy5zZGsucmVtb3ZlSW5jZXRhbmNlKHRoaXMub3B0aW9ucy5pZClcclxuICAgIGF3YWl0IHN5bmNEYXRhKHRoaXMuc2RrLCB0aGlzLm9wdGlvbnMuaWQpXHJcbiAgfVxyXG5cclxuICBnZXRNYXRlcmlhbCgpIHtcclxuICAgIGxldCBtYXRlcmlhbFxyXG4gICAgbGV0IGNhbnZhcyA9IHRoaXMuZ2V0Y2FudmFzKClcclxuICAgIG1hdGVyaWFsID0gbmV3IENlc2l1bS5DdXN0b21NYXRlcmlhbFNvdXJjZSh7XHJcbiAgICAgIGltYWdlOiBjYW52YXMudG9EYXRhVVJMKFwiaW1hZ2UvcG5nXCIpLFxyXG4gICAgICBjb2xvcjogdGhpcy5vcHRpb25zLmNvbG9yLFxyXG4gICAgICByZXBlYXQ6IG5ldyBDZXNpdW0uQ2FydGVzaWFuMigxLCAxLjApLFxyXG4gICAgICBkdXJhdGlvbjogNTAwMDAgLyB0aGlzLm9wdGlvbnMuc3BlZWQsXHJcbiAgICAgIGZsdHI6IGZhbHNlXHJcbiAgICB9KVxyXG4gICAgcmV0dXJuIG1hdGVyaWFsXHJcbiAgfVxyXG5cclxuICBnZXRjYW52YXMoKSB7XHJcbiAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcclxuICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpXHJcblxyXG4gICAgbGV0IHRleHRBcnJheSA9IHRoaXMub3B0aW9ucy50ZXh0LnNwbGl0KCdcXG4nKVxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZXh0QXJyYXkubGVuZ3RoOyBpKyspIHtcclxuICAgICAgaWYgKHRleHRBcnJheVtpXS5sZW5ndGggPiA4MCkge1xyXG4gICAgICAgIHRleHRBcnJheVtpXSA9IHRleHRBcnJheVtpXS5zbGljZSgwLCA4MC10ZXh0QXJyYXlbaV0ubGVuZ3RoKVxyXG4gICAgICB9IFxyXG4gICAgfVxyXG4gICAgaWYgKHRleHRBcnJheS5sZW5ndGggPiA3MCkge1xyXG4gICAgICB0ZXh0QXJyYXkuc3BsaWNlKDcwIC0gdGV4dEFycmF5Lmxlbmd0aClcclxuICAgIH1cclxuICAgIHRoaXMub3B0aW9ucy50ZXh0ID0gdGV4dEFycmF5LmpvaW4oJ1xcbicpXHJcbiAgICBsZXQgbWF4V2lkdGggPSAwXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRleHRBcnJheS5sZW5ndGg7IGkrKykge1xyXG4gICAgICBjdHguZm9udCA9IDIwMCArIFwicHggc2VyaWZcIjtcclxuICAgICAgY29uc3Qgd2lkdGggPSBjdHgubWVhc3VyZVRleHQodGV4dEFycmF5W2ldKS53aWR0aDtcclxuICAgICAgaWYobWF4V2lkdGg8d2lkdGgpIHtcclxuICAgICAgICBtYXhXaWR0aCA9IHdpZHRoXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGNhbnZhcy53aWR0aCA9IG1heFdpZHRoXHJcbiAgICBjYW52YXMuaGVpZ2h0ID0gMjIwICogdGV4dEFycmF5Lmxlbmd0aFxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZXh0QXJyYXkubGVuZ3RoOyBpKyspIHtcclxuICAgICAgY3R4LmZvbnQgPSAyMDAgKyBcInB4IHNlcmlmXCI7XHJcbiAgICAgIGN0eC5maWxsU3R5bGUgPSAncmdiYSgyNTUsIDI1NSwgMjU1LCAwKSdcclxuICAgICAgY3R4LmZpbGxSZWN0KDAsIDAsIG1heFdpZHRoICsgMzAsIDIxMClcclxuICAgICAgY3R4LmZpbGxTdHlsZSA9ICdyZ2JhKDI1NSwgMjU1LCAyNTUsIDEpJztcclxuICAgICAgY3R4LmZvbnQgPSBcIjIwMHB4IHNlcmlmXCI7XHJcbiAgICAgIGN0eC5maWxsVGV4dCh0ZXh0QXJyYXlbaV0sIDAsIDIxMCAqIChpKzEpKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmFzcGVjdFJhdGlvID0gdGhpcy5vcHRpb25zLnRleHQgPyAoY2FudmFzLndpZHRoIC8gY2FudmFzLmhlaWdodCkgOiAwXHJcbiAgICByZXR1cm4gY2FudmFzXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiDmiZPlvIDlr4zmlofmnKzmoYZcclxuICAgKi9cclxuICBvcGVuUmljaFRleHRFZGl0b3IoZSkge1xyXG4gICAgcmljaFRleHQub3Blbih0aGlzLm9wdGlvbnMuaWQsIHRoaXMub3B0aW9ucy50ZXh0LCB0aGlzLm9wdGlvbnMucmljaFRleHRDb250ZW50KVxyXG4gICAgcmljaFRleHQucHJpbWFyeUNhbGxCYWNrID0gKGNvbnRlbnQpID0+IHtcclxuICAgICAgdGhpcy5vcHRpb25zLnJpY2hUZXh0Q29udGVudCA9IGNvbnRlbnRcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5vZGVFZGl0KGNiID0gKCkgPT4geyB9KSB7XHJcbiAgICBpZiAoWUouTWVhc3VyZS5HZXRNZWFzdXJlU3RhdHVzKCkpIHtcclxuICAgICAgY2IoJ+S4iuS4gOasoea1i+mHj+acque7k+adnycpXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBZSi5NZWFzdXJlLlNldE1lYXN1cmVTdGF0dXModHJ1ZSlcclxuICAgICAgdGhpcy5fbm9kZUVkaXRDYWxsYmFjayA9IGNiXHJcbiAgICAgIHRoaXMudGlwID0gbmV3IE1vdXNlVGlwKCfor7fpgInmi6nkuIDkuKrpobbngrnvvIzlj7PplK7lj5bmtognLCB0aGlzLnNkaylcclxuICAgICAgdGhpcy5ldmVudCA9IG5ldyBNb3VzZUV2ZW50KHRoaXMuc2RrKVxyXG4gICAgICB0aGlzLm5vZGVQb2ludHMgPSBbXVxyXG4gICAgICBsZXQgc2VsZWN0UG9pbnRcclxuICAgICAgbGV0IG9yaWdpbmFsUG9zaXRpb25cclxuXHJcbiAgICAgIGxldCBwb3NpdGlvbnMgPSB0aGlzLm9wdGlvbnMucG9zaXRpb25zXHJcbiAgICAgIGxldCBmcm9tRGVncmVlc0FycmF5ID0gW11cclxuICAgICAgbGV0IG1pbmltdW1IZWlnaHRzID0gW11cclxuICAgICAgbGV0IG1heGltdW1IZWlnaHRzID0gW11cclxuICAgICAgbGV0IHdpZHRoID0gdGhpcy5jb21wdXRlRGlzdGFuY2UyKHBvc2l0aW9ucylcclxuICAgICAgbGV0IGV4dHJ1ZGVkSGVpZ2h0ID0gdGhpcy5hc3BlY3RSYXRpbyA/ICh3aWR0aCAvIHRoaXMuYXNwZWN0UmF0aW8pIDogMFxyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGZyb21EZWdyZWVzQXJyYXkucHVzaChwb3NpdGlvbnNbaV0ubG5nLCBwb3NpdGlvbnNbaV0ubGF0KVxyXG4gICAgICAgIG1pbmltdW1IZWlnaHRzLnB1c2gocG9zaXRpb25zW2ldLmFsdClcclxuICAgICAgICBtYXhpbXVtSGVpZ2h0cy5wdXNoKHBvc2l0aW9uc1tpXS5hbHQgKyBleHRydWRlZEhlaWdodClcclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IGlzQWRkID0gZmFsc2VcclxuICAgICAgbGV0IGxlZnRFdmVudCA9IChtb3ZlbWVudCwgY2FydGVzaWFuKSA9PiB7XHJcbiAgICAgICAgaWYgKHNlbGVjdFBvaW50KSB7XHJcbiAgICAgICAgICBpc0FkZCA9IHRydWVcclxuICAgICAgICAgIGxldCBwb3MzID0gdGhpcy5zZGsudmlld2VyLnNjZW5lLmNsYW1wVG9IZWlnaHQoY2FydGVzaWFuLCBbdGhpcy5lbnRpdHldKVxyXG4gICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tzZWxlY3RQb2ludC5pbmRleF0gPSB0aGlzLmNhcnRlc2lhbjNUb3dnczg0KHBvczMsIHRoaXMuc2RrLnZpZXdlcilcclxuICAgICAgICAgIG9yaWdpbmFsUG9zaXRpb24gPSB0aGlzLm9wdGlvbnMucG9zaXRpb25zW3NlbGVjdFBvaW50LmluZGV4XVxyXG4gICAgICAgICAgbGV0IGVudGl0eSA9IHRoaXMuc2RrLnZpZXdlci5lbnRpdGllcy5hZGQoe1xyXG4gICAgICAgICAgICBuYW1lOiAnbm9kZS1zZWNvbmRhcnktZWRpdC1wb2ludCcsXHJcbiAgICAgICAgICAgIHBvc2l0aW9uOiBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlcyh0aGlzLm9wdGlvbnMucG9zaXRpb25zW3NlbGVjdFBvaW50LmluZGV4XS5sbmcsIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbc2VsZWN0UG9pbnQuaW5kZXhdLmxhdCwgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tzZWxlY3RQb2ludC5pbmRleF0uYWx0KSxcclxuICAgICAgICAgICAgYmlsbGJvYXJkOiB7XHJcbiAgICAgICAgICAgICAgaW1hZ2U6IHRoaXMuZ2V0U291cmNlUm9vdFBhdGgoKSArICcvaW1nL3BvaW50LnBuZycsXHJcbiAgICAgICAgICAgICAgd2lkdGg6IDE1LFxyXG4gICAgICAgICAgICAgIGhlaWdodDogMTUsXHJcbiAgICAgICAgICAgICAgZGlzYWJsZURlcHRoVGVzdERpc3RhbmNlOiBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksXHJcbiAgICAgICAgICAgICAgY29sb3I6IENlc2l1bS5Db2xvci5XSElURS53aXRoQWxwaGEoMC45OSlcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICB0aGlzLm5vZGVQb2ludHMuc3BsaWNlKHNlbGVjdFBvaW50LmluZGV4LCAwLCBlbnRpdHkpXHJcbiAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zLnNwbGljZShzZWxlY3RQb2ludC5pbmRleCwgMCwgdGhpcy5vcHRpb25zLnBvc2l0aW9uc1tzZWxlY3RQb2ludC5pbmRleF0pXHJcblxyXG4gICAgICAgICAgbGV0IHBvc2l0aW9ucyA9IHRoaXMub3B0aW9ucy5wb3NpdGlvbnNcclxuICAgICAgICAgIGZyb21EZWdyZWVzQXJyYXkgPSBbXVxyXG4gICAgICAgICAgbWluaW11bUhlaWdodHMgPSBbXVxyXG4gICAgICAgICAgbWF4aW11bUhlaWdodHMgPSBbXVxyXG4gICAgICAgICAgd2lkdGggPSB0aGlzLmNvbXB1dGVEaXN0YW5jZTIocG9zaXRpb25zKVxyXG4gICAgICAgICAgZXh0cnVkZWRIZWlnaHQgPSB0aGlzLmFzcGVjdFJhdGlvID8gKHdpZHRoIC8gdGhpcy5hc3BlY3RSYXRpbykgOiAwXHJcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBmcm9tRGVncmVlc0FycmF5LnB1c2gocG9zaXRpb25zW2ldLmxuZywgcG9zaXRpb25zW2ldLmxhdClcclxuICAgICAgICAgICAgbWluaW11bUhlaWdodHMucHVzaChwb3NpdGlvbnNbaV0uYWx0KVxyXG4gICAgICAgICAgICBtYXhpbXVtSGVpZ2h0cy5wdXNoKHBvc2l0aW9uc1tpXS5hbHQgKyBleHRydWRlZEhlaWdodClcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMudGlwLnNldFBvc2l0aW9uKFxyXG4gICAgICAgICAgICBjYXJ0ZXNpYW4sXHJcbiAgICAgICAgICAgIG1vdmVtZW50LnBvc2l0aW9uLngsXHJcbiAgICAgICAgICAgIG1vdmVtZW50LnBvc2l0aW9uLnlcclxuICAgICAgICAgIClcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICB2YXIgcGljayA9IHRoaXMuc2RrLnZpZXdlci5zY2VuZS5waWNrKG1vdmVtZW50LnBvc2l0aW9uKTtcclxuICAgICAgICAgIGlmIChwaWNrICYmIHBpY2suaWQgJiYgcGljay5pZC5uYW1lICYmIHBpY2suaWQubmFtZSA9PT0gJ25vZGUtc2Vjb25kYXJ5LWVkaXQtcG9pbnQnKSB7XHJcbiAgICAgICAgICAgIHNlbGVjdFBvaW50ID0gcGljay5pZFxyXG4gICAgICAgICAgICB0aGlzLm5vZGVQb2ludHMuc3BsaWNlKHBpY2suaWQuaW5kZXgsIDEpXHJcbiAgICAgICAgICAgIHRoaXMuc2RrLnZpZXdlci5lbnRpdGllcy5yZW1vdmUocGljay5pZClcclxuICAgICAgICAgICAgdGhpcy50aXAuc2V0X3RleHQoJ+W3pumUruW8gOWni++8jOWPs+mUrue7k+adn++8jENUUkwr5Y+z6ZSu5pKk6ZSAJylcclxuICAgICAgICAgICAgb3JpZ2luYWxQb3NpdGlvbiA9IHRoaXMuY2FydGVzaWFuM1Rvd2dzODQoY2FydGVzaWFuLCB0aGlzLnNkay52aWV3ZXIpXHJcbiAgICAgICAgICAgIHRoaXMuZW50aXR5LndhbGwucG9zaXRpb25zID0gbmV3IENlc2l1bS5DYWxsYmFja1Byb3BlcnR5KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICByZXR1cm4gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXNBcnJheShmcm9tRGVncmVlc0FycmF5KVxyXG4gICAgICAgICAgICB9LCBmYWxzZSlcclxuICAgICAgICAgICAgdGhpcy5lbnRpdHkud2FsbC5tYXhpbXVtSGVpZ2h0cyA9IG5ldyBDZXNpdW0uQ2FsbGJhY2tQcm9wZXJ0eShmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIG1heGltdW1IZWlnaHRzXHJcbiAgICAgICAgICAgIH0sIGZhbHNlKVxyXG4gICAgICAgICAgICB0aGlzLmVudGl0eS53YWxsLm1pbmltdW1IZWlnaHRzID0gbmV3IENlc2l1bS5DYWxsYmFja1Byb3BlcnR5KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICByZXR1cm4gbWluaW11bUhlaWdodHNcclxuICAgICAgICAgICAgfSwgZmFsc2UpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGxldCByaWdodEV2ZW50ID0gKG1vdmVtZW50LCBjYXJ0ZXNpYW4pID0+IHtcclxuICAgICAgICBpZiAoc2VsZWN0UG9pbnQpIHtcclxuICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbc2VsZWN0UG9pbnQuaW5kZXhdID0gb3JpZ2luYWxQb3NpdGlvblxyXG4gICAgICAgICAgaWYoaXNBZGQpIHtcclxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvc2l0aW9ucy5zcGxpY2Uoc2VsZWN0UG9pbnQuaW5kZXgsIDEpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBjYihudWxsLCB0aGlzLm9wdGlvbnMucG9zaXRpb25zKVxyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgcG9zaXRpb25zID0gdGhpcy5vcHRpb25zLnBvc2l0aW9uc1xyXG4gICAgICAgIGZyb21EZWdyZWVzQXJyYXkgPSBbXVxyXG4gICAgICAgIG1pbmltdW1IZWlnaHRzID0gW11cclxuICAgICAgICBtYXhpbXVtSGVpZ2h0cyA9IFtdXHJcbiAgICAgICAgd2lkdGggPSB0aGlzLmNvbXB1dGVEaXN0YW5jZTIocG9zaXRpb25zKVxyXG4gICAgICAgIGV4dHJ1ZGVkSGVpZ2h0ID0gdGhpcy5hc3BlY3RSYXRpbyA/ICh3aWR0aCAvIHRoaXMuYXNwZWN0UmF0aW8pIDogMFxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBmcm9tRGVncmVlc0FycmF5LnB1c2gocG9zaXRpb25zW2ldLmxuZywgcG9zaXRpb25zW2ldLmxhdClcclxuICAgICAgICAgIG1pbmltdW1IZWlnaHRzLnB1c2gocG9zaXRpb25zW2ldLmFsdClcclxuICAgICAgICAgIG1heGltdW1IZWlnaHRzLnB1c2gocG9zaXRpb25zW2ldLmFsdCArIGV4dHJ1ZGVkSGVpZ2h0KVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmVudGl0eS53YWxsLnBvc2l0aW9ucyA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzQXJyYXkoZnJvbURlZ3JlZXNBcnJheSlcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm5vZGVQb2ludHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIHRoaXMuc2RrLnZpZXdlci5lbnRpdGllcy5yZW1vdmUodGhpcy5ub2RlUG9pbnRzW2ldKVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLm5vZGVQb2ludHMgPSBbXVxyXG4gICAgICAgIFlKLk1lYXN1cmUuU2V0TWVhc3VyZVN0YXR1cyhmYWxzZSlcclxuICAgICAgICB0aGlzLmV2ZW50LmRlc3Ryb3koKVxyXG4gICAgICAgIHRoaXMudGlwLmRlc3Ryb3koKVxyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLmV2ZW50Lm1vdXNlX2xlZnQobGVmdEV2ZW50KVxyXG5cclxuICAgICAgdGhpcy5ldmVudC5tb3VzZV9yaWdodChyaWdodEV2ZW50KVxyXG5cclxuICAgICAgdGhpcy5ldmVudC5tb3VzZV9tb3ZlKChtb3ZlbWVudCwgY2FydGVzaWFuKSA9PiB7XHJcbiAgICAgICAgaWYgKHNlbGVjdFBvaW50KSB7XHJcbiAgICAgICAgICBsZXQgcG9zMyA9IHRoaXMuc2RrLnZpZXdlci5zY2VuZS5jbGFtcFRvSGVpZ2h0KGNhcnRlc2lhbiwgW3RoaXMuZW50aXR5XSlcclxuICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbc2VsZWN0UG9pbnQuaW5kZXhdID0gdGhpcy5jYXJ0ZXNpYW4zVG93Z3M4NChwb3MzLCB0aGlzLnNkay52aWV3ZXIpXHJcbiAgICAgICAgICBsZXQgcG9zaXRpb25zID0gdGhpcy5vcHRpb25zLnBvc2l0aW9uc1xyXG4gICAgICAgICAgZnJvbURlZ3JlZXNBcnJheSA9IFtdXHJcbiAgICAgICAgICBtaW5pbXVtSGVpZ2h0cyA9IFtdXHJcbiAgICAgICAgICBtYXhpbXVtSGVpZ2h0cyA9IFtdXHJcbiAgICAgICAgICB3aWR0aCA9IHRoaXMuY29tcHV0ZURpc3RhbmNlMihwb3NpdGlvbnMpXHJcbiAgICAgICAgICBleHRydWRlZEhlaWdodCA9IHRoaXMuYXNwZWN0UmF0aW8gPyAod2lkdGggLyB0aGlzLmFzcGVjdFJhdGlvKSA6IDBcclxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGZyb21EZWdyZWVzQXJyYXkucHVzaChwb3NpdGlvbnNbaV0ubG5nLCBwb3NpdGlvbnNbaV0ubGF0KVxyXG4gICAgICAgICAgICBtaW5pbXVtSGVpZ2h0cy5wdXNoKHBvc2l0aW9uc1tpXS5hbHQpXHJcbiAgICAgICAgICAgIG1heGltdW1IZWlnaHRzLnB1c2gocG9zaXRpb25zW2ldLmFsdCArIGV4dHJ1ZGVkSGVpZ2h0KVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnRpcC5zZXRQb3NpdGlvbihcclxuICAgICAgICAgIGNhcnRlc2lhbixcclxuICAgICAgICAgIG1vdmVtZW50LmVuZFBvc2l0aW9uLngsXHJcbiAgICAgICAgICBtb3ZlbWVudC5lbmRQb3NpdGlvbi55XHJcbiAgICAgICAgKVxyXG4gICAgICB9KVxyXG5cclxuICAgICAgdGhpcy5ldmVudC5tb3VzZV9yaWdodF9rZXlib2FyZF9jdHJsKChtb3ZlbWVudCwgY2FydGVzaWFuKSA9PiB7XHJcbiAgICAgICAgaWYgKHNlbGVjdFBvaW50KSB7XHJcbiAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zaXRpb25zLnBvcCgpXHJcbiAgICAgICAgICB0aGlzLnNkay52aWV3ZXIuZW50aXRpZXMucmVtb3ZlKHRoaXMubm9kZVBvaW50c1t0aGlzLm5vZGVQb2ludHMubGVuZ3RoIC0gMV0pXHJcbiAgICAgICAgICB0aGlzLm5vZGVQb2ludHMucG9wKClcclxuICAgICAgICAgIGlmIChzZWxlY3RQb2ludC5pbmRleCA9PT0gdGhpcy5vcHRpb25zLnBvc2l0aW9ucy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMubm9kZVBvaW50c1tzZWxlY3RQb2ludC5pbmRleCAtIDFdKSB7XHJcbiAgICAgICAgICAgICAgc2VsZWN0UG9pbnQgPSB0aGlzLm5vZGVQb2ludHNbc2VsZWN0UG9pbnQuaW5kZXggLSAxXVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgIHNlbGVjdFBvaW50LmluZGV4ID0gMFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG5cclxuICAgICAgdGhpcy5ldmVudC5nZXN0dXJlX3BpbmNrX3N0YXJ0KChtb3ZlbWVudCwgY2FydGVzaWFuKSA9PiB7XHJcbiAgICAgICAgbGV0IHN0YXJ0VGltZSA9IG5ldyBEYXRlKClcclxuICAgICAgICBsZXQgcG9zID0ge1xyXG4gICAgICAgICAgcG9zaXRpb246IHtcclxuICAgICAgICAgICAgeDogKG1vdmVtZW50LnBvc2l0aW9uMS54ICsgbW92ZW1lbnQucG9zaXRpb24yLngpIC8gMixcclxuICAgICAgICAgICAgeTogKG1vdmVtZW50LnBvc2l0aW9uMS55ICsgbW92ZW1lbnQucG9zaXRpb24yLnkpIC8gMlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmV2ZW50Lmdlc3R1cmVfcGluY2tfZW5kKCgpID0+IHtcclxuICAgICAgICAgIGxldCBlbmRUaW1lID0gbmV3IERhdGUoKVxyXG4gICAgICAgICAgaWYgKGVuZFRpbWUgLSBzdGFydFRpbWUgPj0gNTAwKSB7XHJcbiAgICAgICAgICAgIC8vIOmVv+aMieWPlua2iFxyXG4gICAgICAgICAgICByaWdodEV2ZW50KHBvcywgY2FydGVzaWFuKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGxlZnRFdmVudChwb3MsIGNhcnRlc2lhbilcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgICB9KVxyXG5cclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm9wdGlvbnMucG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgbGV0IGVudGl0eSA9IHRoaXMuc2RrLnZpZXdlci5lbnRpdGllcy5hZGQoe1xyXG4gICAgICAgICAgbmFtZTogJ25vZGUtc2Vjb25kYXJ5LWVkaXQtcG9pbnQnLFxyXG4gICAgICAgICAgaW5kZXg6IGksXHJcbiAgICAgICAgICBwb3NpdGlvbjogQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXModGhpcy5vcHRpb25zLnBvc2l0aW9uc1tpXS5sbmcsIHRoaXMub3B0aW9ucy5wb3NpdGlvbnNbaV0ubGF0LCB0aGlzLm9wdGlvbnMucG9zaXRpb25zW2ldLmFsdCksXHJcbiAgICAgICAgICBiaWxsYm9hcmQ6IHtcclxuICAgICAgICAgICAgaW1hZ2U6IHRoaXMuZ2V0U291cmNlUm9vdFBhdGgoKSArICcvaW1nL3BvaW50LnBuZycsXHJcbiAgICAgICAgICAgIHdpZHRoOiAxNSxcclxuICAgICAgICAgICAgaGVpZ2h0OiAxNSxcclxuICAgICAgICAgICAgZGlzYWJsZURlcHRoVGVzdERpc3RhbmNlOiBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksXHJcbiAgICAgICAgICAgIGNvbG9yOiBDZXNpdW0uQ29sb3IuV0hJVEUud2l0aEFscGhhKDAuOTkpXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgdGhpcy5ub2RlUG9pbnRzLnB1c2goZW50aXR5KVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBTdGFuZFRleHRcclxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQTRDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBeENBO0FBeUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBdkZBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBMEZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQVhBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBY0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUtBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQXJhQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBekNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQXdhQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/Obj/Base/TextObject/StandText/index.js\n"); /***/ }), @@ -3238,7 +3238,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) * /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/typeof */ \"./node_modules/@babel/runtime/helpers/typeof.js\");\n/* harmony import */ var _babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/toConsumableArray */ \"./node_modules/@babel/runtime/helpers/toConsumableArray.js\");\n/* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ \"./node_modules/@babel/runtime/helpers/asyncToGenerator.js\");\n/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ \"./node_modules/@babel/runtime/helpers/defineProperty.js\");\n/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ \"./node_modules/@babel/runtime/helpers/classCallCheck.js\");\n/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ \"./node_modules/@babel/runtime/helpers/createClass.js\");\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @babel/runtime/regenerator */ \"./node_modules/@babel/runtime/regenerator/index.js\");\n/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var js_md5__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! js-md5 */ \"./node_modules/js-md5/src/md5.js\");\n/* harmony import */ var js_md5__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(js_md5__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var _proj__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./proj */ \"./src/Tools/proj.js\");\n/* harmony import */ var _projConvert__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./projConvert */ \"./src/Tools/projConvert.js\");\n/* harmony import */ var _projectionConvert__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./projectionConvert */ \"./src/Tools/projectionConvert.js\");\n/* harmony import */ var _Global_global__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../Global/global */ \"./src/Global/global.js\");\n/* harmony import */ var _Obj_Materail_FlowPictureMaterialProperty__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../Obj/Materail/FlowPictureMaterialProperty */ \"./src/Obj/Materail/FlowPictureMaterialProperty.js\");\n/* harmony import */ var _Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../Global/MultiViewportMode */ \"./src/Global/MultiViewportMode/index.js\");\n\n\n\n\n\n\n\nfunction _createForOfIteratorHelper(r, e) { var t = \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && \"number\" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t.return || t.return(); } finally { if (u) throw o; } } }; }\nfunction _unsupportedIterableToArray(r, a) { if (r) { if (\"string\" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }\nfunction _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_3___default()(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\n/**\r\n * @name: index\r\n * @author: Administrator\r\n * @date: 2022-06-09 16:46\r\n * @description:index\r\n * @update: 2022-06-09 16:46\r\n */\n\n\n\n\n\n\n\nvar Tools = /*#__PURE__*/function () {\n /**\r\n * @constructor\r\n * @desc 工具类\r\n * */\n function Tools(sdk, options) {\n _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_4___default()(this, Tools);\n this.sdk = sdk;\n if (this.sdk) {\n this.name_map = this.sdk.proj.name_map;\n this.epsg_map = this.sdk.proj.epsg_map;\n this.convert = this.sdk.proj.convert;\n this.getAllProjection = this.sdk.proj.getAllProjection;\n this.projectionIsExists = this.sdk.proj.projectionIsExists;\n this.degreesToDMS = this.sdk.proj.degreesToDMS;\n this.dmsToDecimal = this.sdk.proj.dmsToDecimal;\n }\n this.options = _objectSpread({}, options);\n }\n return _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_5___default()(Tools, [{\n key: \"POST\",\n get: function get() {\n return 'POST';\n }\n }, {\n key: \"GET\",\n get: function get() {\n return 'GET';\n }\n }, {\n key: \"degreesToRadians\",\n value:\n /**\r\n * @description 将角度转换为弧度\r\n * @method degreesToRadians\r\n * @param degrees {number} 弧度制\r\n * @return radians {number}\r\n * @memberOf Tools\r\n * @example let radians = tool.degreesToRadians(20)\r\n * */\n function degreesToRadians(degrees) {\n return turf.degreesToRadians(Number(degrees)); // 1.0471975511965976\n }\n\n /**\r\n * @description 将弧度转换为角度\r\n * @method radiansToDegrees\r\n * @param radians {number} 弧度制\r\n * @return degrees {number}\r\n * @memberOf Tools\r\n * @example let degrees = tool.radiansToDegrees(2)\r\n * */\n }, {\n key: \"radiansToDegrees\",\n value: function radiansToDegrees(radians) {\n return turf.radiansToDegrees(Number(radians)); // 1.0471975511965976\n }\n\n /**\r\n * @desc 随机字符串\r\n * @function randomString\r\n * @memberOf extra\r\n * @param {number} [e=32] 字符串长度\r\n * @returns {string} str 字符串\r\n * @memberOf Tools\r\n * @example let strings=tool.randomString()\r\n * */\n }, {\n key: \"randomString\",\n value: function randomString(e) {\n /* e = e || 32\r\n var t = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678',\r\n a = t.length,\r\n n = ''\r\n for (let i = 0; i < e; i++) n += t.charAt(Math.floor(Math.random() * a))*/\n return Cesium.createGuid();\n }\n }, {\n key: \"getSourceRootPath\",\n value: function getSourceRootPath() {\n var sdkName = 'YJEarth.min.js';\n var scripts = document.querySelectorAll('script');\n var prefix = '';\n scripts.forEach(function (item) {\n if (item.src && item.src.indexOf(sdkName) > -1) {\n var arr = item.src.split('/');\n arr.pop();\n prefix = arr.join('/');\n }\n });\n return prefix;\n }\n\n /**@description 笛卡尔坐标转经纬度\r\n * @method cartesian3Towgs84\r\n * @param cartesian {Cesium.Cartesian3} 笛卡尔坐标\r\n * @param viewer\r\n * @param cartesian.x {number}\r\n * @param cartesian.y {number}\r\n * @param cartesian.z {number}\r\n * @memberOf Tools\r\n * @return {object} wgs84 返回wgs84坐标\r\n * */\n }, {\n key: \"cartesian3Towgs84\",\n value: function cartesian3Towgs84(cartesian, viewer) {\n var ellipsoid = viewer.scene.globe.ellipsoid;\n var cartesian3 = new Cesium.Cartesian3(cartesian.x, cartesian.y, cartesian.z);\n var cartographic = ellipsoid.cartesianToCartographic(cartesian3);\n var lat = Cesium.Math.toDegrees(cartographic.latitude);\n var lng = Cesium.Math.toDegrees(cartographic.longitude);\n var alt = cartographic.height < 0 ? 0 : cartographic.height;\n // var alt = cartographic.height\n return {\n lng: lng,\n lat: lat,\n alt: alt\n };\n }\n\n /**\r\n * @desc 计算多线段长度\r\n * @method computeDistance\r\n * @memberOf Tools\r\n *@param positions {Array.<{lng:number, lat:number,alt:number}>}坐标数组\r\n * @param [fractionDigits=2] 保留小数点位数\r\n * @param [ground=true] 是否贴地\r\n * */\n }, {\n key: \"computeDistance\",\n value: (function () {\n var _computeDistance = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_6___default.a.mark(function _callee() {\n var positions,\n fractionDigits,\n type,\n length,\n i,\n position1,\n position2,\n distance,\n _i,\n _position,\n _position2,\n _distance,\n meters,\n lineString2,\n line2,\n d,\n res,\n coordinates,\n arr,\n _iterator,\n _step,\n item,\n index,\n r,\n l,\n _i2,\n _position3,\n _position4,\n _distance2,\n _args = arguments;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_6___default.a.wrap(function _callee$(_context) {\n while (1) switch (_context.prev = _context.next) {\n case 0:\n positions = _args.length > 0 && _args[0] !== undefined ? _args[0] : [];\n fractionDigits = _args.length > 1 && _args[1] !== undefined ? _args[1] : 2;\n type = _args.length > 2 && _args[2] !== undefined ? _args[2] : 0;\n if (!(positions.length < 2)) {\n _context.next = 7;\n break;\n }\n return _context.abrupt(\"return\", 0);\n case 7:\n length = 0;\n _context.t0 = type;\n _context.next = _context.t0 === '0' ? 11 : _context.t0 === 0 ? 11 : _context.t0 === '1' ? 13 : _context.t0 === 1 ? 13 : _context.t0 === '2' ? 15 : _context.t0 === 2 ? 15 : 48;\n break;\n case 11:\n for (i = 0; i < positions.length - 1; i++) {\n position1 = Cesium.Cartesian3.fromDegrees(positions[i].lng, positions[i].lat, positions[i].alt);\n position2 = Cesium.Cartesian3.fromDegrees(positions[i + 1].lng, positions[i + 1].lat, positions[i + 1].alt);\n distance = Cesium.Cartesian3.distance(position1, position2);\n length = length + distance;\n }\n return _context.abrupt(\"break\", 49);\n case 13:\n for (_i = 0; _i < positions.length - 1; _i++) {\n _position = Cesium.Cartesian3.fromDegrees(positions[_i].lng, positions[_i].lat, 0);\n _position2 = Cesium.Cartesian3.fromDegrees(positions[_i + 1].lng, positions[_i + 1].lat, 0);\n _distance = Cesium.Cartesian3.distance(_position, _position2);\n length = length + _distance;\n }\n return _context.abrupt(\"break\", 49);\n case 15:\n lineString2 = [];\n positions.forEach(function (item) {\n lineString2.push([item.lng, item.lat, item.alt]);\n });\n line2 = turf.lineString(lineString2);\n d = turf.length(line2) * 1000;\n meters = d > 20 ? d / 20 : d;\n res = this.chunkLine(positions, meters);\n coordinates = [];\n res.forEach(function (Feature, index) {\n if (index === 0) {\n coordinates = _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_1___default()(Feature.geometry.coordinates);\n } else {\n coordinates.push(Feature.geometry.coordinates[1]);\n }\n });\n arr = [];\n _iterator = _createForOfIteratorHelper(coordinates);\n _context.prev = 25;\n _iterator.s();\n case 27:\n if ((_step = _iterator.n()).done) {\n _context.next = 37;\n break;\n }\n item = _step.value;\n index = coordinates.indexOf(item);\n _context.next = 32;\n return this.sampleHeight({\n lng: item[0],\n lat: item[1],\n alt: 0\n }, index);\n case 32:\n r = _context.sent;\n r.position.alt = r.position.alt < 0 ? 0 : r.position.alt;\n arr.push(r);\n case 35:\n _context.next = 27;\n break;\n case 37:\n _context.next = 42;\n break;\n case 39:\n _context.prev = 39;\n _context.t1 = _context[\"catch\"](25);\n _iterator.e(_context.t1);\n case 42:\n _context.prev = 42;\n _iterator.f();\n return _context.finish(42);\n case 45:\n l = arr.length - 1;\n for (_i2 = 0; _i2 < arr.length - 1; _i2++) {\n _position3 = Cesium.Cartesian3.fromDegrees(arr[_i2].position.lng, arr[_i2].position.lat, 0);\n _position4 = Cesium.Cartesian3.fromDegrees(arr[_i2 + 1].position.lng, arr[_i2 + 1].position.lat, 0);\n _distance2 = Cesium.Cartesian3.distance(_position3, _position4);\n length = length + _distance2;\n }\n return _context.abrupt(\"break\", 49);\n case 48:\n return _context.abrupt(\"break\", 49);\n case 49:\n return _context.abrupt(\"return\", length.toFixed(fractionDigits));\n case 50:\n case \"end\":\n return _context.stop();\n }\n }, _callee, this, [[25, 39, 42, 45]]);\n }));\n function computeDistance() {\n return _computeDistance.apply(this, arguments);\n }\n return computeDistance;\n }())\n }, {\n key: \"computeDistance2\",\n value: function computeDistance2() {\n var positions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n var fractionDigits = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 2;\n var ground = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;\n if (positions.length < 2) {\n return 0;\n } else {\n var length = 0;\n if (ground) {\n var lineString = [];\n positions.forEach(function (item) {\n lineString.push([item.lng, item.lat, item.alt]);\n });\n var line = turf.lineString(lineString);\n length = turf.length(line) * 1000;\n } else {\n for (var i = 0; i < positions.length - 1; i++) {\n var position1 = Cesium.Cartesian3.fromDegrees(positions[i].lng, positions[i].lat, positions[i].alt);\n var position2 = Cesium.Cartesian3.fromDegrees(positions[i + 1].lng, positions[i + 1].lat, positions[i + 1].alt);\n var distance = Cesium.Cartesian3.distance(position1, position2);\n length = length + distance;\n }\n }\n return length.toFixed(fractionDigits);\n }\n }\n }, {\n key: \"sampleHeight\",\n value: function () {\n var _sampleHeight = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_6___default.a.mark(function _callee2(p1, index) {\n var p2;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_6___default.a.wrap(function _callee2$(_context2) {\n while (1) switch (_context2.prev = _context2.next) {\n case 0:\n _context2.next = 2;\n return this.sampleHeightMostDetailed([p1]);\n case 2:\n p2 = _context2.sent;\n p1.alt = p2[0].height;\n return _context2.abrupt(\"return\", {\n position: p1,\n index: index\n });\n case 5:\n case \"end\":\n return _context2.stop();\n }\n }, _callee2, this);\n }));\n function sampleHeight(_x, _x2) {\n return _sampleHeight.apply(this, arguments);\n }\n return sampleHeight;\n }()\n /**@description 计算多边形面积\r\n * @method computeArea\r\n * @memberOf Tools\r\n * @param positions {Array.<{lng:number, lat:number,alt:number}>}\r\n * @param [fractionDigits=2] {number} 精确到小数点多少位\r\n * @return {number} 面积\r\n * */\n }, {\n key: \"computeArea\",\n value: function computeArea(positions) {\n var fractionDigits = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 2;\n if (positions.length < 3) {\n return 0;\n } else {\n var p = [];\n positions.forEach(function (item) {\n p.push([item.lng, item.lat]);\n });\n p.push(p[0]);\n var polygon = turf.polygon([p]);\n var triangles = turf.tesselate(polygon);\n return Number(turf.area(triangles).toFixed(fractionDigits));\n }\n }\n }, {\n key: \"computeSignedArea\",\n value: function computeSignedArea(viewer, path) {\n var _this = this;\n var fromDegreesArray = [];\n var fromDegreesArray2 = [];\n for (var i = 0; i < path.length; i++) {\n fromDegreesArray.push(path[i].lng, path[i].lat);\n fromDegreesArray2.push([path[i].lng, path[i].lat]);\n }\n var line = turf.lineString(fromDegreesArray2);\n var bbox = turf.bbox(line);\n var longRadians = Cesium.Math.toRadians(bbox[2] - bbox[0]);\n var latRadians = Cesium.Math.toRadians(bbox[3] - bbox[1]);\n var granularity;\n if (longRadians > latRadians) {\n granularity = longRadians / 10;\n } else {\n granularity = latRadians / 10;\n }\n\n // let granularity = Math.PI / Math.pow(2, 11);\n // granularity = granularity / 1250;\n var polygonGeometry = new Cesium.PolygonGeometry.fromPositions({\n positions: Cesium.Cartesian3.fromDegreesArray(fromDegreesArray),\n vertexFormat: Cesium.PerInstanceColorAppearance.FLAT_VERTEX_FORMAT,\n granularity: granularity\n });\n //创建自定义平面几何体\n var geom = new Cesium.PolygonGeometry.createGeometry(polygonGeometry);\n if (!geom || !geom.attributes || !geom.attributes.position) {\n return 0;\n }\n var indices = geom.indices; //获取顶点索引数据\n var positions = geom.attributes.position.values;\n function returnPosition(position, index) {\n var pos3 = new Cesium.Cartesian3(positions[index * 3], positions[index * 3 + 1], positions[index * 3 + 2]);\n var position1 = viewer.scene.clampToHeight(pos3) || pos3;\n // let pos84 = await _this.cartesian3Towgs84(position1, viewer)\n // let height = 0\n // try {\n // let position2 = await Cesium.sampleTerrainMostDetailed(\n // viewer.scene.terrainProvider,\n // [Cesium.Cartographic.fromCartesian(pos3)]\n // )\n // height = position2[0].height\n // } catch (error) {\n // height = 0\n // }\n // if (height > pos84.alt) {\n // pos84.alt = height\n // }\n return position1;\n }\n var area = 0;\n for (var index = 0; index < indices.length; index += 3) {\n var pos0 = returnPosition(positions, indices[index]);\n var pos1 = returnPosition(positions, indices[index + 1]);\n var pos2 = returnPosition(positions, indices[index + 2]);\n // let entity = viewer.entities.add({\n // name: \"三角面\",\n // polygon: {\n // hierarchy: [pos0, pos1, pos2],\n // perPositionHeight: true,\n // material: Cesium.Color.fromRandom(),\n // outline: true,\n // outlineColor: Cesium.Color.BLACK,\n // },\n // });\n\n var v0 = Cesium.Cartesian3.subtract(pos0, pos1, new Cesium.Cartesian3());\n var v1 = Cesium.Cartesian3.subtract(pos2, pos1, new Cesium.Cartesian3());\n var cross = Cesium.Cartesian3.cross(v0, v1, v0);\n area = area + Cesium.Cartesian3.magnitude(cross) * 0.5;\n }\n return Number(area.toFixed(2));\n }\n\n /**\r\n * @desc 创建圆\r\n *@method createCircle\r\n * @param point {object} 圆心坐标\r\n * @param point.lng {number} 经度\r\n * @param point.lat {number} 纬度\r\n * @param radius {number} 半径 单位:米\r\n * @param [options]\r\n * @param [options.steps=360] {number} 段数\r\n * @memberOf Tools\r\n * */\n }, {\n key: \"createCircle\",\n value: function createCircle(point) {\n var radius = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {\n steps: 360\n };\n if (Number(radius) <= 0) {\n radius = 0.01;\n }\n var center = [Number(point.lng), Number(point.lat)];\n var coordinates = turf.circle(center, radius / 1000, options).geometry.coordinates[0];\n var positions = [];\n coordinates.forEach(function (item) {\n positions = positions.concat(item);\n });\n return positions;\n }\n\n /**\r\n * @desc 创建椭圆\r\n *@method createEllipse\r\n * @param point {object} 圆心坐标\r\n * @param point.lng {number} 经度\r\n * @param point.lat {number} 纬度\r\n * @param [options]\r\n * @param [options.granularity=0.1] {number} 椭圆上点之间的角度\r\n * @param [options.semiMinorAxis=10] {number} 短半轴长度 单位:米\r\n * @param [options.semiMajorAxis=20] {number} 长半轴长度 单位:米\r\n * @param [options.bearing=0] {number} 椭圆旋转角度 单位:米\r\n * @memberOf Tools\r\n * */\n }, {\n key: \"createEllipse\",\n value: function createEllipse(point) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n granularity: 0.1,\n semiMinorAxis: 10,\n semiMajorAxis: 20,\n bearing: 0,\n height: 0\n };\n if (!options.granularity) {\n options.granularity = 0.1;\n }\n if (!options.height) {\n options.height = 0;\n }\n if (!options.semiMinorAxis) {\n options.semiMinorAxis = 0.00001;\n }\n if (!options.semiMajorAxis) {\n options.semiMajorAxis = 0.00001;\n }\n var ellipseGeometry = new Cesium.EllipseOutlineGeometry({\n center: Cesium.Cartesian3.fromDegrees(Number(point.lng), Number(point.lat)),\n semiMajorAxis: Number(options.semiMajorAxis),\n semiMinorAxis: Number(options.semiMinorAxis),\n height: Number(options.height),\n granularity: Cesium.Math.toRadians(options.granularity),\n rotation: Cesium.Math.toRadians(options.bearing)\n });\n var ellipse = Cesium.EllipseOutlineGeometry.createGeometry(ellipseGeometry);\n if (!ellipse || !ellipse.attributes || !ellipse.attributes.position) {\n return [];\n }\n var ellipsePositions = ellipse.attributes.position.values;\n var positions = [];\n for (var i = 0; i < ellipsePositions.length; i += 3) {\n var pos = new Cesium.Cartesian3(ellipsePositions[i], ellipsePositions[i + 1], ellipsePositions[i + 2]);\n positions.push(pos);\n }\n return positions;\n }\n\n /*计算2点的恒相线夹角*/\n }, {\n key: \"rhumbBearing\",\n value: function rhumbBearing(p1, p2) {\n var point1 = turf.point([p1.lng, p1.lat]);\n var point2 = turf.point([p2.lng, p2.lat]);\n return turf.rhumbBearing(point1, point2);\n }\n }, {\n key: \"computeCenter\",\n value: function computeCenter() {\n var positions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n var arr = [];\n positions.forEach(function (item) {\n arr.push(turf.point([item.lng, item.lat]));\n });\n var features = turf.featureCollection(arr);\n var coordinates = turf.center(features).geometry.coordinates;\n return {\n lng: coordinates[0],\n lat: coordinates[1]\n };\n }\n\n //计算2点的中心点\n }, {\n key: \"computeMidpoint\",\n value: function computeMidpoint(point1, point2) {\n var p1 = turf.point([point1.lng, point1.lat]);\n var p2 = turf.point([point2.lng, point2.lat]);\n var center = turf.midpoint(p1, p2).geometry.coordinates;\n return {\n lng: center[0],\n lat: center[1]\n };\n }\n\n //计算\n }, {\n key: \"computeAttackArrow\",\n value: function computeAttackArrow() {\n var positions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n return this.computeArrow(positions, 0);\n }\n\n //计算钳击箭头\n }, {\n key: \"computePincerArrow\",\n value: function computePincerArrow() {\n var positions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n return this.computeArrow(positions);\n }\n\n //计算攻击箭头\n }, {\n key: \"computeArrow\",\n value: function computeArrow() {\n var positions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n if (positions.length < 3) {\n return [];\n } else {\n var lnglatArr = [];\n // if(positions.every(pos => Number(pos.lng) >= 0) || positions.every(pos => Number(pos.lng) <= 0)) {\n // for (var i = 0; i < positions.length; i++) {\n // lnglatArr.push([positions[i].lng, positions[i].lat])\n // }\n // }\n // else {\n // for (var i = 0; i < positions.length; i++) {\n // if(positions[i].lng<0) {\n // lnglatArr.push([positions[i].lng+360, positions[i].lat])\n // }\n // else {\n // lnglatArr.push([positions[i].lng, positions[i].lat])\n // }\n // }\n // }\n for (var i = 0; i < positions.length; i++) {\n lnglatArr.push([positions[i].lng, positions[i].lat]);\n }\n var res;\n if (type) {\n res = xp.algorithm.doubleArrow(lnglatArr);\n } else {\n res = xp.algorithm.tailedAttackArrow(lnglatArr);\n }\n var index = JSON.stringify(res.polygonalPoint).indexOf('null');\n var returnData = [];\n if (index === -1) returnData = res.polygonalPoint;\n return returnData;\n }\n }\n\n // 计算集结地\n }, {\n key: \"computeAssemble\",\n value: function computeAssemble() {\n var positions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n var is84 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n if (positions.length < 2) {\n return [];\n } else {\n var points = positions.length;\n var pnts = new Array();\n positions.forEach(function (item) {\n pnts.push([item.lng, item.lat]);\n });\n //console.log(\"pnts6666\",pnts);\n // pnts.push(tailPoint);\n // pnts.push(headerPoint);\n\n if (pnts.length === 2) {\n var _mid = P.PlotUtils.mid(pnts[0], pnts[1]);\n //let d = utils.MathDistance(pnts[0], mid) / 0.9\n var d = P.PlotUtils.distance(pnts[0], _mid) / 0.9;\n //console.log(\"d\",d);\n var pnt = P.PlotUtils.getThirdPoint(pnts[0], _mid, P.Constants.HALF_PI, d, true);\n pnts = [pnts[0], pnt, pnts[1]];\n //console.log(\"pnt\",pnt);\n //createPoint(Cesium.Cartesian3.fromDegrees(pnt[0], pnt[1]));\n }\n var mid = P.PlotUtils.mid(pnts[0], pnts[2]);\n pnts.push(mid, pnts[0], pnts[1]);\n var normals = [],\n pnt1 = undefined,\n pnt2 = undefined,\n pnt3 = undefined,\n result = [],\n result2 = [];\n for (var i = 0; i < pnts.length - 2; i++) {\n pnt1 = pnts[i];\n pnt2 = pnts[i + 1];\n pnt3 = pnts[i + 2];\n var normalPoints = P.PlotUtils.getBisectorNormals(0.4, pnt1, pnt2, pnt3);\n normals = normals.concat(normalPoints);\n }\n var count = normals.length;\n normals = [normals[count - 1]].concat(normals.slice(0, count - 1));\n for (var _i3 = 0; _i3 < pnts.length - 2; _i3++) {\n pnt1 = pnts[_i3];\n pnt2 = pnts[_i3 + 1];\n result = result.concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_1___default()(pnt1));\n for (var t = 0; t <= P.Constants.FITTING_COUNT; t++) {\n var _pnt = P.PlotUtils.getCubicValue(t / P.Constants.FITTING_COUNT, pnt1, normals[_i3 * 2], normals[_i3 * 2 + 1], pnt2);\n result = result.concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_1___default()(_pnt));\n }\n result = result.concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_1___default()(pnt2));\n }\n if (is84) {\n return result;\n } else {\n return Cesium.Cartesian3.fromDegreesArray(result);\n }\n }\n }\n\n // 计算直线箭头\n }, {\n key: \"computeStraightArrow\",\n value: function computeStraightArrow() {\n var positions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n var is84 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n if (positions.length < 2) {\n return [];\n }\n var point1 = [positions[0].lng, positions[0].lat];\n var point2 = [positions[1].lng, positions[1].lat];\n if (positions[0].lng === positions[1].lng && positions[0].lat === positions[1].lat) {\n if (is84) {\n return [positions[0], positions[0], positions[0]];\n } else {\n var cartesian3 = Cesium.Cartesian3.fromDegrees(positions[0].lng, positions[0].lat);\n return [cartesian3, cartesian3, cartesian3];\n }\n }\n var lnglatArr = [];\n for (var i = 0; i < positions.length; i++) {\n lnglatArr.push([positions[i].lng, positions[i].lat]);\n }\n var res;\n res = xp.algorithm.fineArrow(point1, point2);\n if (is84) {\n var pos84 = [];\n for (var _i4 = 0; _i4 < res.length; _i4++) {\n var pos = this.cartesian3Towgs84(res[_i4], this.sdk.viewer);\n pos84.push(pos.lng, pos.lat);\n }\n return pos84;\n }\n return res;\n }\n }, {\n key: \"getMaterial\",\n value: function getMaterial() {\n var color = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '#2ab0c2';\n var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n var entity = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n var newParam = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n var material = '';\n var arr = {\n '7': 10,\n '8': 3,\n '9': 4,\n '10': 4,\n '11': 4,\n '12': 2\n };\n if (entity) {\n arr[type + ''] ? entity.polyline.width = entity.polyline.oriWidth + arr[type + ''] : entity.polyline.width = entity.polyline.oriWidth;\n }\n switch (Number(type)) {\n case 1:\n //虚线\n material = new Cesium.PolylineDashMaterialProperty({\n color: Cesium.Color.fromCssColorString(color),\n dashLength: 10 //短划线长度\n });\n break;\n case 2:\n //泛光\n material = new Cesium.PolylineGlowMaterialProperty({\n glowPower: 0.2,\n color: Cesium.Color.fromCssColorString(color)\n });\n break;\n case 3:\n //尾迹光线\n material = new Cesium.PolylineFlowMaterialProperty({\n color: color,\n speed: newParam.rotate ? newParam.speed : 0 - newParam.speed,\n rotate: newParam.rotate\n });\n break;\n case 4:\n //多尾迹光线\n material = new Cesium.PolylineFlowMultMaterialProperty({\n color: color,\n speed: newParam.rotate ? newParam.speed : 0 - newParam.speed,\n rotate: newParam.rotate\n });\n break;\n case 5: //普通流动虚线\n // material = new Cesium.FlowDashedLineFlowMaterialProperty({\n // color: color,\n // uType: 0,\n // speed: newParam.rotate ? newParam.speed : 0 - newParam.speed,\n // // dashSize: newParam.dashSize,\n // space: newParam.space,\n // scale: 1.0\n // })\n // break\n case 6:\n //流动虚线2\n var that = this;\n var repeatX;\n material = new Cesium.FlowDashedLineFlowMaterialProperty({\n color: color,\n uType: type == 5 ? 0 : 1,\n speed: newParam.rotate ? newParam.speed : 0 - newParam.speed,\n // dashSize: newParam.dashSize,\n space: newParam.space,\n scale: new Cesium.CallbackProperty(function () {\n if (that.sdk.viewer.scene.mode === Cesium.SceneMode.SCENE3D) {\n var oriPositions = entity.polyline.positions.getValue();\n if (!Cesium.defined(oriPositions)) {\n return 1.0;\n }\n var distance = 0;\n for (var i = 0; i < oriPositions.length - 1; ++i) {\n distance += Cesium.Cartesian3.distance(oriPositions[i], oriPositions[i + 1]);\n }\n //屏幕坐标\n var point1 = new Cesium.Cartesian2(0, that.sdk.viewer.canvas.clientHeight);\n var point2 = new Cesium.Cartesian2(that.sdk.viewer.canvas.clientWidth / 2, that.sdk.viewer.canvas.clientHeight);\n var cartesian1 = that.sdk.viewer.scene.pickPosition(point1);\n var cartesian2 = that.sdk.viewer.scene.pickPosition(point2);\n if (cartesian1 && cartesian2) {\n var distance2 = Cesium.Cartesian3.distance(cartesian1, cartesian2);\n repeatX = distance2 * 2 / distance;\n }\n return repeatX;\n } else {\n var sdk3d = Object(_Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_13__[\"get3DView\"])();\n var sdk3dEntity = sdk3d.viewer.entities.getById(that.options.id);\n var _oriPositions = sdk3dEntity.polyline.positions.getValue();\n if (!Cesium.defined(_oriPositions)) {\n return 1.0;\n }\n var _distance3 = 0;\n for (var _i5 = 0; _i5 < _oriPositions.length - 1; ++_i5) {\n _distance3 += Cesium.Cartesian3.distance(_oriPositions[_i5], _oriPositions[_i5 + 1]);\n }\n //屏幕坐标\n var _point = new Cesium.Cartesian2(0, sdk3d.viewer.canvas.clientHeight);\n var _point2 = new Cesium.Cartesian2(sdk3d.viewer.canvas.clientWidth / 2, sdk3d.viewer.canvas.clientHeight);\n var _cartesian = sdk3d.viewer.scene.pickPosition(_point);\n var _cartesian2 = sdk3d.viewer.scene.pickPosition(_point2);\n if (_cartesian && _cartesian2) {\n var _distance4 = Cesium.Cartesian3.distance(_cartesian, _cartesian2);\n repeatX = _distance4 * 2 / _distance3;\n }\n return repeatX;\n }\n })\n });\n break;\n case 7: //流动箭头1\n case 8: //流动箭头2\n case 9: //流动箭头3\n case 10: //流动箭头4\n case 11: //流动箭头5\n case 12:\n //流动箭头6\n var param = {\n color: color,\n image: this.getSourceRootPath() + \"/img/arrow/\".concat(type - 6, \".png\"),\n space: newParam.space,\n speed: newParam.speed\n };\n param.speed = newParam.rotate ? param.speed : 0 - param.speed;\n this.getFlowTexture(this, param, entity);\n break;\n default:\n material = Cesium.Color.fromCssColorString(color);\n break;\n }\n return material;\n }\n }, {\n key: \"getFlowTexture\",\n value: function getFlowTexture(that, options, entity) {\n var canvasEle = document.createElement('canvas');\n var ctx = canvasEle.getContext('2d');\n var myImg = new Image();\n // myImg.src = that.getSourceRootPath() + '/img/arrow/1.png'\n myImg.src = options.image;\n myImg.onload = function () {\n options.space = Math.max(0.1, options.space);\n if (options.speed > 0 || options.speed == 0) {\n canvasEle.width = myImg.width * (options.space + 1);\n canvasEle.height = myImg.height;\n ctx.drawImage(myImg, myImg.width * (options.space / 2), 0);\n } else {\n ctx.clearRect(0, 0, canvasEle.width, canvasEle.height);\n canvasEle.width = myImg.width * (options.space + 1);\n canvasEle.height = myImg.height;\n ctx.save(); // 保存当前状态\n ctx.translate(canvasEle.width / 2, canvasEle.height / 2); // 移动原点至中心\n ctx.rotate(Math.PI); // (弧度制)\n ctx.translate(-canvasEle.width / 2, -canvasEle.height / 2); // 移回原点\n ctx.drawImage(myImg, myImg.width * (options.space / 2), 0);\n ctx.restore(); // 恢复状态\n }\n\n // let repeat = getRepeat()\n // }, false)\n // entity.polyline.material.oriRepeat = that.getSceenLine(entity, options, canvasEle)\n // entity.polyline.material.oriSpeed = undefined\n var beforeSpeed = 0,\n repeat = 0;\n entity.polyline.material = new Cesium.LineTextureMaterialProperty({\n color: options.color,\n image: canvasEle,\n speed: options.speed,\n repeat: new Cesium.CallbackProperty(function () {\n if (that.sdk.viewer.scene.mode === Cesium.SceneMode.SCENE3D) {\n var positionProperty = entity.polyline.positions;\n var positions = positionProperty.getValue(that.sdk.viewer.clock.currentTime);\n if (!Cesium.defined(positions)) {\n return new Cesium.Cartesian2(1.0, 1.0);\n // return 1.0;\n }\n var distance = 0;\n for (var i = 0; i < positions.length - 1; ++i) {\n // if (that.sdk.viewer.scene.mode===Cesium.SceneMode.SCENE2D){}\n distance += Cesium.Cartesian3.distance(positions[i], positions[i + 1]);\n }\n var repeatX = distance / entity.polyline.width.getValue();\n // 根据地图缩放程度调整repeatX\n var cameraHeight = that.sdk.viewer.camera.positionCartographic.height;\n var boundingSphere = new Cesium.BoundingSphere(new Cesium.Cartesian3(-1000000, 0, 0),\n // 中心点坐标\n 500000 // 半径(距离)\n );\n\n // 获取绘图缓冲区的宽度和高度(通常是屏幕的分辨率)\n var drawingBufferWidth = that.sdk.viewer.canvas.clientWidth;\n var drawingBufferHeight = that.sdk.viewer.canvas.clientHeight;\n\n // 使用 getPixelSize 方法获取包围球在屏幕上的像素大小\n var groundResolution = that.sdk.viewer.scene.camera.getPixelSize(boundingSphere, drawingBufferWidth, drawingBufferHeight);\n var result;\n if (groundResolution > 700) {\n repeatX *= groundResolution / cameraHeight / (options.space * (canvasEle.width / canvasEle.height * 5) + 1);\n // if (entity.polyline.material.oriRepeat) {\n var speed = repeatX / entity.polyline.oriRepeat;\n entity.polyline.oriSpeed = speed;\n entity.polyline.oriRepeatX = repeatX;\n // } else {\n // entity.polyline.material.oriRepeat = repeatX\n // }\n beforeSpeed = speed;\n repeat = repeatX;\n result = new Cesium.Cartesian2(repeatX, speed || 1.0);\n } else {\n result = new Cesium.Cartesian2(repeat || entity.polyline.oriRepeatX, beforeSpeed || entity.polyline.oriSpeed);\n }\n return result;\n } else {\n var sdk3d = Object(_Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_13__[\"get3DView\"])();\n var sdk3dEntity = sdk3d.viewer.entities.getById(that.options.id);\n var _positionProperty = sdk3dEntity.polyline.positions;\n var _positions = _positionProperty.getValue(sdk3d.viewer.clock.currentTime);\n if (!Cesium.defined(_positions)) {\n return new Cesium.Cartesian2(1.0, 1.0);\n // return 1.0;\n }\n var _distance5 = 0;\n for (var _i6 = 0; _i6 < _positions.length - 1; ++_i6) {\n // if (that.sdk.viewer.scene.mode===Cesium.SceneMode.SCENE2D){}\n _distance5 += Cesium.Cartesian3.distance(_positions[_i6], _positions[_i6 + 1]);\n }\n var _repeatX = _distance5 / sdk3dEntity.polyline.width.getValue();\n // 根据地图缩放程度调整repeatX\n var _cameraHeight = sdk3d.viewer.camera.positionCartographic.height;\n var _boundingSphere = new Cesium.BoundingSphere(new Cesium.Cartesian3(-1000000, 0, 0),\n // 中心点坐标\n 500000 // 半径(距离)\n );\n\n // 获取绘图缓冲区的宽度和高度(通常是屏幕的分辨率)\n var _drawingBufferWidth = sdk3d.viewer.canvas.clientWidth;\n var _drawingBufferHeight = sdk3d.viewer.canvas.clientHeight;\n\n // 使用 getPixelSize 方法获取包围球在屏幕上的像素大小\n var _groundResolution = sdk3d.viewer.scene.camera.getPixelSize(_boundingSphere, _drawingBufferWidth, _drawingBufferHeight);\n var _result;\n if (_groundResolution > 700) {\n _repeatX *= _groundResolution / _cameraHeight / (options.space * (canvasEle.width / canvasEle.height * 5) + 1);\n // if (entity.polyline.material.oriRepeat) {\n var _speed = _repeatX / sdk3dEntity.polyline.oriRepeat;\n sdk3dEntity.polyline.oriSpeed = _speed;\n sdk3dEntity.polyline.oriRepeatX = _repeatX;\n // } else {\n // entity.polyline.material.oriRepeat = repeatX\n // }\n beforeSpeed = _speed;\n repeat = _repeatX;\n _result = new Cesium.Cartesian2(_repeatX, _speed || 1.0);\n } else {\n _result = new Cesium.Cartesian2(repeat || sdk3dEntity.polyline.oriRepeatX, beforeSpeed || sdk3dEntity.polyline.oriSpeed);\n }\n return _result;\n }\n\n // return repeatX;\n })\n });\n var oriRepeat = that.getSceenLine(entity, options, canvasEle);\n oriRepeat && (entity.polyline.oriRepeat = oriRepeat);\n };\n }\n /**获取当前满屏横线速度 */\n }, {\n key: \"getSceenLine\",\n value: function getSceenLine(entity, options, canvasEle) {\n var point1 = new Cesium.Cartesian2(0, this.sdk.viewer.canvas.clientHeight);\n var point2 = new Cesium.Cartesian2(this.sdk.viewer.canvas.clientWidth / 2, this.sdk.viewer.canvas.clientHeight);\n // var cartesian1 = this.sdk.viewer.scene.pickPosition(point1)\n // var cartesian2 = this.sdk.viewer.scene.pickPosition(point2)\n var ray = this.sdk.viewer.camera.getPickRay(point1);\n var cartesian1 = this.sdk.viewer.scene.globe.pick(ray, this.sdk.viewer.scene);\n var ray2 = this.sdk.viewer.camera.getPickRay(point2);\n var cartesian2 = this.sdk.viewer.scene.globe.pick(ray2, this.sdk.viewer.scene);\n if (cartesian1 && cartesian2) {\n var distance = Cesium.Cartesian3.distance(cartesian1, cartesian2);\n var repeatX = distance / entity.polyline.width.getValue();\n // 根据地图缩放程度调整repeatX\n var cameraHeight = this.sdk.viewer.camera.positionCartographic.height;\n var boundingSphere = new Cesium.BoundingSphere(new Cesium.Cartesian3(-1000000, 0, 0),\n // 中心点坐标\n 500000 // 半径(距离)\n );\n\n // 获取绘图缓冲区的宽度和高度(通常是屏幕的分辨率)\n var drawingBufferWidth = this.sdk.viewer.canvas.clientWidth;\n var drawingBufferHeight = this.sdk.viewer.canvas.clientHeight;\n\n // 使用 getPixelSize 方法获取包围球在屏幕上的像素大小\n var groundResolution = this.sdk.viewer.scene.camera.getPixelSize(boundingSphere, drawingBufferWidth, drawingBufferHeight);\n // repeatX *= groundResolution / cameraHeight / ((myImg.width / myImg.height * 5) + 1);\n if (groundResolution > 700) {\n repeatX *= groundResolution / cameraHeight / (options.space * (canvasEle.width / canvasEle.height * 5) + 1);\n } else {\n repeatX = undefined;\n }\n if (this.sdk.viewer.scene.mode === Cesium.SceneMode.SCENE3D) {\n return repeatX;\n } else {\n var sdk3d = Object(_Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_13__[\"get3DView\"])();\n var sdk3dEntity = sdk3d.viewer.entities.getById(this.options.id);\n return sdk3dEntity.polyline.oriRepeatX;\n }\n }\n }\n\n /*创建直箭头图片*/\n }, {\n key: \"create_arrow1_picture\",\n value: function create_arrow1_picture(color) {\n var canvas = new fabric.Canvas('canvas');\n canvas.width = 150;\n canvas.height = 75;\n var w_offset = 35;\n var h_offset = 20;\n var fill = color;\n var polygon = new fabric.Polygon([{\n x: canvas.width,\n y: canvas.height / 2\n },\n //箭头右边顶点\n {\n x: canvas.width - w_offset,\n y: canvas.height\n },\n //顺时针\n {\n x: canvas.width - w_offset,\n y: canvas.height - h_offset\n },\n //\n {\n x: canvas.width / 2,\n y: canvas.height - h_offset\n },\n //\n {\n x: canvas.width / 2,\n y: h_offset\n },\n //\n {\n x: canvas.width - w_offset,\n y: h_offset\n },\n //\n {\n x: canvas.width - w_offset,\n y: 0\n } //\n ], {\n fill: fill\n });\n canvas.add(polygon);\n return canvas.toDataURL();\n }\n\n /*创建箭头图片*/\n }, {\n key: \"create_arrow2_picture\",\n value: function create_arrow2_picture(color) {\n var canvas = new fabric.Canvas('canvas');\n canvas.width = 75;\n canvas.height = 75;\n var w_offset1 = 35;\n var w_offset2 = 40;\n var fill = color;\n var polygon = new fabric.Polygon([{\n x: canvas.width,\n y: canvas.height / 2\n }, {\n x: canvas.width - w_offset1,\n y: canvas.height\n }, {\n x: canvas.width - w_offset1 - w_offset2,\n y: canvas.height\n }, {\n x: canvas.width - w_offset2,\n y: canvas.height / 2\n }, {\n x: canvas.width - w_offset1 - w_offset2,\n y: 0\n }, {\n x: canvas.width - w_offset1,\n y: 0\n }], {\n fill: fill\n });\n canvas.add(polygon);\n return canvas.toDataURL();\n }\n }, {\n key: \"sampleHeightMostDetailed\",\n value: function sampleHeightMostDetailed(positions) {\n var cartesians = [];\n positions.forEach(function (item) {\n cartesians.push(new Cesium.Cartographic.fromDegrees(item.lng, item.lat));\n });\n return this.sdk.viewer.scene.sampleHeightMostDetailed(cartesians);\n }\n }, {\n key: \"flyHome\",\n value: function flyHome() {\n var duration = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 3;\n Object(_Global_global__WEBPACK_IMPORTED_MODULE_11__[\"setActiveViewer\"])(0);\n Object(_Global_global__WEBPACK_IMPORTED_MODULE_11__[\"closeRotateAround\"])(this.sdk);\n Object(_Global_global__WEBPACK_IMPORTED_MODULE_11__[\"closeViewFollow\"])(this.sdk);\n if (this.sdk.viewer.CAMERA_DEFAULT_VIEW_RECTANGLE) {\n var destination = this.sdk.viewer.CAMERA_DEFAULT_VIEW_RECTANGLE.destination;\n var orientation = this.sdk.viewer.CAMERA_DEFAULT_VIEW_RECTANGLE.orientation;\n this.sdk.viewer.camera.flyTo({\n destination: Cesium.Cartesian3.fromDegrees(destination.lng, destination.lat, destination.alt),\n orientation: {\n heading: Cesium.Math.toRadians(orientation.heading || 0),\n pitch: Cesium.Math.toRadians(orientation.pitch || 0),\n roll: Cesium.Math.toRadians(orientation.roll || 0)\n },\n duration: duration\n });\n } else {\n this.sdk.viewer.camera.flyHome(duration);\n }\n }\n\n /**\r\n * @description 设置拾取操作启停\r\n * @method setPickStatus\r\n * @param [status=true] {boolean}\r\n * @memberOf Tools\r\n * */\n }, {\n key: \"setPickStatus\",\n value: function setPickStatus() {\n var status = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n } // YJ.getEarth().interaction.picking.enabled = status\n\n /**\r\n * @description 创建点缓冲区 返回缓冲区坐标\r\n * @method create_point_buffer\r\n * @param point {object} 坐标参数\r\n * @param [radius=5] {number} 缓冲距离 (单位:米)\r\n * @param option\r\n * @param point.lng {number} 经度\r\n * @param point.lat {number} 纬度\r\n * @memberOf Tools\r\n * @returns {Array} 返回缓冲区坐标数组\r\n */\n }, {\n key: \"create_point_buffer\",\n value: function create_point_buffer(point) {\n var radius = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 5;\n var option = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {\n steps: 10\n };\n var p = turf.point([Number(point.lng), Number(point.lat)]);\n var buffered = turf.buffer(p, Number(radius) / 1000, option);\n return buffered.geometry.coordinates;\n }\n\n /**\r\n * @description 创建线缓冲区 返回缓冲区坐标\r\n * @method create_line_buffer\r\n * @param points {Array.} 坐标参数\r\n * @param [radius=5] {number} 缓冲距离 (单位:米)\r\n * @memberOf Tools\r\n * @returns {Array} 返回缓冲区坐标数组\r\n * @example let points = [{lng:\"\",lat:\"\"},{lng:\"\",lat:\"\"},{lng:\"\",lat:\"\"}]\r\n * let radius = 10\r\n * let area_buffer = sdk.create_line_buffer(points,radius)\r\n * */\n }, {\n key: \"create_line_buffer\",\n value: function create_line_buffer(points) {\n var radius = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 5;\n if (points.length === 1) {\n return this.create_point_buffer(points[0], radius);\n } else if (points.length === 0) {\n return false;\n } else {\n var arr = [];\n points.forEach(function (point) {\n arr.push([Number(point.lng), Number(point.lat)]);\n });\n var line = turf.lineString(arr);\n var buffered = turf.buffer(line, Number(radius) / 1000);\n return buffered.geometry.coordinates;\n }\n }\n\n /**\r\n * @description 创建面缓冲区 返回缓冲区坐标\r\n * @method create_area_buffer\r\n * @param points {Array.} 坐标参数\r\n * @param [radius=5] {number} 缓冲距离 (单位:米)\r\n * @memberOf Tools\r\n * @returns {Array} 返回缓冲区坐标数组\r\n * @example let points = [{lng:\"\",lat:\"\"},{lng:\"\",lat:\"\"},{lng:\"\",lat:\"\"}]\r\n * let radius = 10\r\n * let area_buffer = sdk.create_area_buffer(points,radius)\r\n * */\n }, {\n key: \"create_area_buffer\",\n value: function create_area_buffer(points) {\n var radius = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 5;\n if (points.length === 1) {\n return this.create_point_buffer(points[0], radius);\n } else if (points.length === 0) {\n return false;\n } else if (points.length === 2) {\n return this.create_line_buffer(points, radius);\n } else {\n var arr = [];\n points.forEach(function (point) {\n arr.push([Number(point.lng), Number(point.lat)]);\n });\n arr.push(arr[0]);\n var poly = turf.polygon([arr]);\n var buffered = turf.buffer(poly, Number(radius) / 1000);\n return buffered.geometry.coordinates;\n }\n }\n\n /**\r\n * @desc 计算多点范围\r\n * @method cal_envelope\r\n * @memberOf Tools\r\n * */\n }, {\n key: \"cal_envelope\",\n value: function cal_envelope() {\n var points = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n if (points.length < 2) {\n console.error('坐标数量不能少于2个');\n } else {\n var arr = [];\n points.forEach(function (p) {\n arr.push(turf.point([p.lng, p.lat]));\n });\n var features = turf.featureCollection(arr);\n return turf.envelope(features).geometry.coordinates[0];\n }\n }\n\n /**\r\n * @desc 按指定距离分段\r\n * @method chunkLine\r\n * @param positions {Array}\r\n * @param meters\r\n * @memberOf Tools\r\n * */\n }, {\n key: \"chunkLine\",\n value: function chunkLine() {\n var positions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n var meters = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1000;\n if (positions.length < 2) {\n return [];\n } else {\n var arr = [];\n positions.forEach(function (it) {\n arr.push([it.lng, it.lat]);\n });\n var line = turf.lineString(arr);\n var chunk = turf.lineChunk(line, meters / 1000);\n var __map = new Map();\n chunk.features.forEach(function (value) {\n value.geometry.coordinates.forEach(function (value1) {\n var key = value1.join(',');\n var val = {\n lng: value1[0],\n lat: value1[1]\n };\n __map.set(key, val);\n });\n });\n return chunk.features;\n }\n }\n\n /**\r\n * @desc 标注以sinx的半个周期的形式弹跳\r\n * */\n }, {\n key: \"billboardAnimation\",\n value: function billboardAnimation(viewer, _ref) {\n var id = _ref.id,\n _ref$offset = _ref.offset,\n offset = _ref$offset === void 0 ? 10 : _ref$offset,\n _ref$times = _ref.times,\n times = _ref$times === void 0 ? 3 : _ref$times;\n var entity = viewer.entities.getById(id);\n if (entity) {\n var pi = Math.PI;\n var tt = 60;\n var of = pi / tt;\n var h = 0;\n var src_p = this.cartesian3Towgs84(entity.position.getValue(), viewer);\n // let height = src_p.alt\n // entity.position = new Cesium.CallbackProperty(() => {\n // let height = offset * Math.sin(h) + src_p.alt\n // h += of\n // return Cesium.Cartesian3.fromDegrees(src_p.lng, src_p.lat, height)\n // }, false)\n var ti = setInterval(function () {\n h += of;\n var height = offset * Math.sin(h) + src_p.alt;\n if (h > pi) h = 0;\n entity.position = Cesium.Cartesian3.fromDegrees(src_p.lng, src_p.lat, height);\n }, 30);\n setTimeout(function () {\n clearInterval(ti);\n entity.position = Cesium.Cartesian3.fromDegrees(src_p.lng, src_p.lat, src_p.alt);\n }, 3000);\n }\n }\n\n /**@desc 绘制扇形\r\n * @method sector\r\n * @memberOf Tools*/\n }, {\n key: \"calSector\",\n value: function calSector() {\n var center = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var radius = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 100;\n var bearing1 = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 25;\n var bearing2 = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 45;\n var steps = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 360;\n var is84 = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : false;\n var c = turf.point([center.lng, center.lat]);\n var coordinates = turf.sector(c, radius / 1000, bearing1, bearing2, {\n steps: steps\n }).geometry.coordinates;\n var positions = [];\n coordinates.forEach(function (array) {\n array.forEach(function (item) {\n var pos;\n if (is84) {\n pos = {\n lng: item[0],\n lat: item[1]\n };\n } else {\n pos = Cesium.Cartesian3.fromDegrees(item[0], item[1]);\n }\n positions.push(pos);\n });\n });\n return positions;\n }\n\n /**\r\n * @desc获取紧贴高度\r\n * @param position 坐标\r\n */\n }, {\n key: \"getClampToHeight\",\n value: (function () {\n var _getClampToHeight = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_6___default.a.mark(function _callee3(position) {\n var objectsToExclude,\n pos3,\n position1,\n height1,\n height2,\n position2,\n _args3 = arguments;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_6___default.a.wrap(function _callee3$(_context3) {\n while (1) switch (_context3.prev = _context3.next) {\n case 0:\n objectsToExclude = _args3.length > 1 && _args3[1] !== undefined ? _args3[1] : [];\n if (!(!this.sdk || !this.sdk.viewer)) {\n _context3.next = 3;\n break;\n }\n return _context3.abrupt(\"return\", 0);\n case 3:\n pos3 = new Cesium.Cartesian3.fromDegrees(position.lng, position.lat);\n _context3.prev = 4;\n _context3.next = 7;\n return this.sdk.viewer.scene.clampToHeight(pos3, objectsToExclude);\n case 7:\n _context3.t0 = _context3.sent;\n if (_context3.t0) {\n _context3.next = 10;\n break;\n }\n _context3.t0 = pos3;\n case 10:\n position1 = _context3.t0;\n _context3.next = 16;\n break;\n case 13:\n _context3.prev = 13;\n _context3.t1 = _context3[\"catch\"](4);\n position1 = pos3;\n case 16:\n _context3.next = 18;\n return this.cartesian3Towgs84(position1, this.sdk.viewer).alt;\n case 18:\n height1 = _context3.sent;\n height2 = 0;\n _context3.prev = 20;\n if (!this.sdk.viewer.scene.terrainProvider.availability) {\n _context3.next = 26;\n break;\n }\n _context3.next = 24;\n return Cesium.sampleTerrainMostDetailed(this.sdk.viewer.scene.terrainProvider, [Cesium.Cartographic.fromDegrees(position.lng, position.lat)]);\n case 24:\n position2 = _context3.sent;\n position2[0].height && (height2 = position2[0].height);\n case 26:\n _context3.next = 31;\n break;\n case 28:\n _context3.prev = 28;\n _context3.t2 = _context3[\"catch\"](20);\n height2 = 0;\n case 31:\n if (!(height1 > height2)) {\n _context3.next = 35;\n break;\n }\n return _context3.abrupt(\"return\", Number(height1.toFixed(2)));\n case 35:\n return _context3.abrupt(\"return\", Number(height2.toFixed(2)));\n case 36:\n case \"end\":\n return _context3.stop();\n }\n }, _callee3, this, [[4, 13], [20, 28]]);\n }));\n function getClampToHeight(_x3) {\n return _getClampToHeight.apply(this, arguments);\n }\n return getClampToHeight;\n }()\n /**\r\n * @desc 深拷贝对象\r\n * */\n )\n }, {\n key: \"deepCopyObj\",\n value: function deepCopyObj(obj) {\n var newobj = null;\n // 处理数组 - 使用原生Array构造函数创建新数组\n if (Array.isArray(obj)) {\n newobj = [];\n // 只拷贝数组元素,不拷贝可能存在的扩展方法\n for (var i = 0; i < obj.length; i++) {\n newobj[i] = this.deepCopyObj(obj[i]);\n }\n return newobj;\n }\n\n // 处理对象\n else if (obj && _babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0___default()(obj) === 'object') {\n newobj = {};\n for (var _i7 in obj) {\n // 排除指定属性和方法属性\n if (_i7 !== 'earth' && _i7 !== 'Dialog' && typeof obj[_i7] !== 'function') {\n newobj[_i7] = this.deepCopyObj(obj[_i7]);\n }\n }\n return newobj;\n } else newobj = obj;\n return newobj;\n }\n\n /**\r\n * @desc 度分秒转换\r\n * */\n }, {\n key: \"projConvert\",\n value: function projConvert() {\n var status = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n var closeCallBack = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};\n if (status) {\n Object(_projConvert__WEBPACK_IMPORTED_MODULE_9__[\"open\"])(this.sdk, closeCallBack);\n } else {\n Object(_projConvert__WEBPACK_IMPORTED_MODULE_9__[\"close\"])();\n }\n }\n /**\r\n * @desc 投影转换\r\n * */\n }, {\n key: \"projectionConvert\",\n value: function projectionConvert() {\n var status = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n var closeCallBack = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};\n if (status) {\n Object(_projectionConvert__WEBPACK_IMPORTED_MODULE_10__[\"open\"])(this.sdk, closeCallBack);\n } else {\n Object(_projectionConvert__WEBPACK_IMPORTED_MODULE_10__[\"close\"])();\n }\n }\n\n /**\r\n * @desc 导出excel\r\n */\n // 导出属性\n }, {\n key: \"exportExcel\",\n value: function exportExcel(data) {\n var label = '';\n for (var key in data[0]) {\n label += \"\".concat(key, \"\");\n }\n label += '';\n var url = 'data:application/vnd.ms-excel;base64,',\n tmplWorkbookXML = '' + 'Axel Richter{created}' + '' + '' + '' + '' + '{worksheets}',\n tmplWorksheetXML = '{rows}
',\n tmplCellXML = '{data}',\n base64 = function base64(s) {\n return window.btoa(unescape(encodeURIComponent(s)));\n },\n format = function format(s, c) {\n return s.replace(/{(\\w+)}/g, function (m, p) {\n return c[p];\n });\n };\n var ctx = \"\";\n var workbookXML = \"\";\n var worksheetsXML = \"\";\n var rowsXML = \"\";\n var pil = 0;\n for (var i = 0; i < data.length; i++) {\n if (i == 0) {\n rowsXML += label;\n }\n rowsXML += '';\n for (var _key in data[i]) {\n ctx = {\n nameType: 'String',\n data: data[i][_key]\n };\n rowsXML += format(tmplCellXML, ctx);\n }\n rowsXML += '';\n if (i > 0 && i / 60000 % 1 === 0) {\n pil++;\n ctx = {\n rows: rowsXML,\n nameWS: 'Sheet' + i\n };\n worksheetsXML += format(tmplWorksheetXML, ctx);\n rowsXML = \"\";\n rowsXML += label;\n }\n }\n ctx = {\n rows: rowsXML,\n nameWS: 'Sheet'\n };\n worksheetsXML += format(tmplWorksheetXML, ctx);\n rowsXML = \"\";\n ctx = {\n created: new Date().getTime(),\n worksheets: worksheetsXML\n };\n workbookXML = format(tmplWorkbookXML, ctx);\n var link = document.createElement(\"A\");\n link.href = url + base64(workbookXML);\n link.download = \"矢量数据导出.xls\";\n link.target = '_blank';\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n }\n\n /**\r\n * @desc Gzip解压\r\n */\n }, {\n key: \"decompressGzip\",\n value: function decompressGzip(compressedData) {\n var decompressedData = pako.inflate(compressedData);\n // 将解压缩后的数据转换为字符串\n var decompressedString = new TextDecoder().decode(decompressedData);\n return decompressedString;\n }\n\n /**\r\n * @desc cmyk转rbg\r\n * @param {*} color\r\n * @returns\r\n */\n }, {\n key: \"cmykToRgb\",\n value: function cmykToRgb(color) {\n var c = color.c,\n m = color.m,\n y = color.y,\n k = color.k;\n var rgb = {\n r: 0,\n g: 0,\n b: 0\n };\n rgb.c = c / 100;\n rgb.m = m / 100;\n rgb.y = y / 100;\n rgb.k = k / 100;\n rgb.r = 1 - Math.min(1, rgb.c * (1 - rgb.k) + rgb.k);\n rgb.g = 1 - Math.min(1, rgb.m * (1 - rgb.k) + rgb.k);\n rgb.b = 1 - Math.min(1, rgb.y * (1 - rgb.k) + rgb.k);\n rgb.r = Math.round(rgb.r * 255);\n rgb.g = Math.round(rgb.g * 255);\n rgb.b = Math.round(rgb.b * 255);\n return \"rgb(\".concat(rgb.r, \", \").concat(rgb.g, \", \").concat(rgb.b, \")\");\n }\n }, {\n key: \"convertPxToRem\",\n value: function convertPxToRem(sdk, selector) {\n var htmlFontSize = parseFloat(getComputedStyle(document.documentElement).fontSize);\n var list = [];\n var elementList = [];\n if (selector) {\n list = document.getElementById(sdk.div_id).querySelectorAll(selector);\n for (var i = 0; i < list.length; i++) {\n var _elementList;\n (_elementList = elementList).push.apply(_elementList, [list[i]].concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_1___default()(list[i].querySelectorAll('*'))));\n }\n } else {\n elementList = document.getElementById(sdk.div_id).querySelectorAll('*');\n }\n elementList.forEach(function (element) {\n var style = element.style;\n var rules = Array.from(style).filter(function (prop) {\n return typeof prop === 'string' && prop.endsWith('px');\n });\n rules.forEach(function (prop) {\n var pxValue = parseFloat(style[prop]);\n var remValue = pxValue / htmlFontSize;\n element.style[prop] = \"\".concat(remValue, \"rem\");\n });\n });\n }\n }, {\n key: \"isConvex\",\n value: function isConvex() {\n var arr = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n var length = arr.length;\n var pre = 0,\n curr = 0;\n for (var i = 0; i < length; ++i) {\n var dx1 = arr[(i + 1) % length].lng - arr[i].lng;\n var dx2 = arr[(i + 2) % length].lng - arr[(i + 1) % length].lng;\n var dy1 = arr[(i + 1) % length].lat - arr[i].lat;\n var dy2 = arr[(i + 2) % length].lat - arr[(i + 1) % length].lat;\n curr = dx1 * dy2 - dx2 * dy1;\n if (curr != 0) {\n if (curr > 0 && pre < 0 || curr < 0 && pre > 0) return false;else pre = curr;\n }\n }\n return true;\n }\n }, {\n key: \"getDateTimeString\",\n value: function getDateTimeString() {\n // 创建一个表示当前时间的 Date 对象\n var now = new Date();\n // 获取年份\n var year = now.getFullYear();\n // 获取月份(从 0 开始,所以要加 1),并将其转换为两位字符串,不足两位在前面补零\n var month = String(now.getMonth() + 1).padStart(2, '0');\n // 获取日期,并将其转换为两位字符串,不足两位在前面补零\n var day = String(now.getDate()).padStart(2, '0');\n // 获取小时,并将其转换为两位字符串,不足两位在前面补零\n var hours = String(now.getHours()).padStart(2, '0');\n // 获取分钟,并将其转换为两位字符串,不足两位在前面补零\n var minutes = String(now.getMinutes()).padStart(2, '0');\n // 获取秒,并将其转换为两位字符串,不足两位在前面补零\n var seconds = String(now.getSeconds()).padStart(2, '0');\n // 获取毫秒,并将其转换为三位字符串,不足三位在前面补零\n var milliseconds = String(now.getMilliseconds()).padStart(3, '0');\n // 将年、月、日、时、分、秒、毫秒拼接成所需的字符串\n return \"\".concat(year).concat(month).concat(day).concat(hours).concat(minutes).concat(seconds).concat(milliseconds);\n }\n }, {\n key: \"replaceHost\",\n value: function replaceHost(url, host) {\n var newUrl = url;\n if (!url || !host) {\n return url;\n }\n try {\n if (!url.startsWith(\"http\")) {\n //说明是本地的json,在磁盘中存在的\n if (!url.includes(\":\")) {\n if (this.options.host) {\n var o = new URL(url, this.options.host);\n newUrl = o.href;\n }\n }\n return newUrl;\n } else {\n // 移除可能的用户名:密码前缀\n var authRegex = /^[^@]+@/;\n if (authRegex.test(url)) {\n url = url.replace(authRegex, '');\n }\n\n // 添加协议前缀(如果没有)\n if (!/^[a-z]+:\\/\\//i.test(url)) {\n url = 'http://' + url;\n }\n var parsedUrl = new URL(url);\n var parsedUrl2 = new URL(host);\n var hostname = parsedUrl.hostname;\n var port = parsedUrl.port;\n\n // 处理IPv6地址(如果有括号)\n if (hostname.startsWith('[') && hostname.endsWith(']')) {\n hostname = hostname.slice(1, -1);\n }\n if ((hostname === 'localhost' || hostname === '127.0.0.1') && parseInt(port, 10) !== 55110) {\n parsedUrl.port = parsedUrl2.port;\n parsedUrl.protocol = parsedUrl2.protocol;\n newUrl = parsedUrl.toString();\n }\n return newUrl;\n }\n } catch (error) {\n return newUrl;\n }\n }\n }, {\n key: \"message\",\n value: function message() {\n var option = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var type = option.type || 'success';\n var text = option.text || '';\n var duration = option.duration || 1500;\n var message = document.getElementById('YJ-custom-message');\n if (message) {\n document.body.removeChild(message);\n }\n message = document.createElement('div');\n message.id = 'YJ-custom-message';\n if (type == 'success') {\n message.innerHTML = \"\\n \".concat(text, \"\\n \");\n } else if (type == 'warning') {\n message.innerHTML = \"\\n \".concat(text, \"\\n \");\n }\n document.body.appendChild(message);\n message.classList.add(type);\n }\n }], [{\n key: \"_md5\",\n value: function _md5(text) {\n return js_md5__WEBPACK_IMPORTED_MODULE_7___default()(text).toUpperCase();\n }\n }]);\n}();\n/* harmony default export */ __webpack_exports__[\"default\"] = (Tools);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvVG9vbHMvaW5kZXguanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvVG9vbHMvaW5kZXguanM/MTNjZCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogQG5hbWU6IGluZGV4XHJcbiAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3JcclxuICogQGRhdGU6IDIwMjItMDYtMDkgMTY6NDZcclxuICogQGRlc2NyaXB0aW9u77yaaW5kZXhcclxuICogQHVwZGF0ZTogMjAyMi0wNi0wOSAxNjo0NlxyXG4gKi9cclxuaW1wb3J0IG1kNSBmcm9tICdqcy1tZDUnXHJcbmltcG9ydCB7IFByb2ogfSBmcm9tICcuL3Byb2onXHJcbmltcG9ydCB7IG9wZW4gYXMgcHJvakNvbnZlcnRPcGVuLCBjbG9zZSBhcyBwcm9qQ29udmVydENsb3NlIH0gZnJvbSAnLi9wcm9qQ29udmVydCdcclxuaW1wb3J0IHsgb3BlbiBhcyBwcm9qZWN0aW9uQ29udmVydE9wZW4sIGNsb3NlIGFzIHByb2plY3Rpb25Db252ZXJ0Q2xvc2UgfSBmcm9tICcuL3Byb2plY3Rpb25Db252ZXJ0J1xyXG5pbXBvcnQgeyBzZXRBY3RpdmVWaWV3ZXIsIGNsb3NlUm90YXRlQXJvdW5kLCBjbG9zZVZpZXdGb2xsb3cgfSBmcm9tICcuLi9HbG9iYWwvZ2xvYmFsJ1xyXG5pbXBvcnQgRmxvd1BpY3R1cmVNYXRlcmlhbFByb3BlcnR5IGZyb20gJy4uL09iai9NYXRlcmFpbC9GbG93UGljdHVyZU1hdGVyaWFsUHJvcGVydHknXHJcbmltcG9ydCB7IHN5bmNEYXRhLCBnZXQzRFZpZXcgfSBmcm9tICcuLi9HbG9iYWwvTXVsdGlWaWV3cG9ydE1vZGUnXHJcblxyXG5jbGFzcyBUb29scyB7XHJcbiAgLyoqXHJcbiAgICogQGNvbnN0cnVjdG9yXHJcbiAgICogQGRlc2Mg5bel5YW357G7XHJcbiAgICogKi9cclxuICBjb25zdHJ1Y3RvcihzZGssIG9wdGlvbnMpIHtcclxuICAgIHRoaXMuc2RrID0gc2RrXHJcbiAgICBpZiAodGhpcy5zZGspIHtcclxuICAgICAgdGhpcy5uYW1lX21hcCA9IHRoaXMuc2RrLnByb2oubmFtZV9tYXBcclxuICAgICAgdGhpcy5lcHNnX21hcCA9IHRoaXMuc2RrLnByb2ouZXBzZ19tYXBcclxuICAgICAgdGhpcy5jb252ZXJ0ID0gdGhpcy5zZGsucHJvai5jb252ZXJ0XHJcbiAgICAgIHRoaXMuZ2V0QWxsUHJvamVjdGlvbiA9IHRoaXMuc2RrLnByb2ouZ2V0QWxsUHJvamVjdGlvblxyXG4gICAgICB0aGlzLnByb2plY3Rpb25Jc0V4aXN0cyA9IHRoaXMuc2RrLnByb2oucHJvamVjdGlvbklzRXhpc3RzXHJcbiAgICAgIHRoaXMuZGVncmVlc1RvRE1TID0gdGhpcy5zZGsucHJvai5kZWdyZWVzVG9ETVNcclxuICAgICAgdGhpcy5kbXNUb0RlY2ltYWwgPSB0aGlzLnNkay5wcm9qLmRtc1RvRGVjaW1hbFxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMub3B0aW9ucyA9IHsgLi4ub3B0aW9ucyB9XHJcbiAgfVxyXG5cclxuICBnZXQgUE9TVCgpIHtcclxuICAgIHJldHVybiAnUE9TVCdcclxuICB9XHJcblxyXG4gIGdldCBHRVQoKSB7XHJcbiAgICByZXR1cm4gJ0dFVCdcclxuICB9XHJcblxyXG5cclxuICBzdGF0aWMgX21kNSh0ZXh0KSB7XHJcbiAgICByZXR1cm4gbWQ1KHRleHQpLnRvVXBwZXJDYXNlKClcclxuICB9XHJcblxyXG5cclxuICAvKipcclxuICAgKiBAZGVzY3JpcHRpb24g5bCG6KeS5bqm6L2s5o2i5Li65byn5bqmXHJcbiAgICogQG1ldGhvZCBkZWdyZWVzVG9SYWRpYW5zXHJcbiAgICogQHBhcmFtIGRlZ3JlZXMge251bWJlcn0g5byn5bqm5Yi2XHJcbiAgICogQHJldHVybiByYWRpYW5zIHtudW1iZXJ9XHJcbiAgICogQG1lbWJlck9mIFRvb2xzXHJcbiAgICogQGV4YW1wbGUgbGV0IHJhZGlhbnMgPSB0b29sLmRlZ3JlZXNUb1JhZGlhbnMoMjApXHJcbiAgICogKi9cclxuICBkZWdyZWVzVG9SYWRpYW5zKGRlZ3JlZXMpIHtcclxuICAgIHJldHVybiB0dXJmLmRlZ3JlZXNUb1JhZGlhbnMoTnVtYmVyKGRlZ3JlZXMpKSAvLyAxLjA0NzE5NzU1MTE5NjU5NzZcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBkZXNjcmlwdGlvbiDlsIblvKfluqbovazmjaLkuLrop5LluqZcclxuICAgKiBAbWV0aG9kIHJhZGlhbnNUb0RlZ3JlZXNcclxuICAgKiBAcGFyYW0gcmFkaWFucyB7bnVtYmVyfSDlvKfluqbliLZcclxuICAgKiBAcmV0dXJuIGRlZ3JlZXMge251bWJlcn1cclxuICAgKiBAbWVtYmVyT2YgVG9vbHNcclxuXHJcbiAgICogQGV4YW1wbGUgbGV0IGRlZ3JlZXMgPSB0b29sLnJhZGlhbnNUb0RlZ3JlZXMoMilcclxuICAgKiAqL1xyXG4gIHJhZGlhbnNUb0RlZ3JlZXMocmFkaWFucykge1xyXG4gICAgcmV0dXJuIHR1cmYucmFkaWFuc1RvRGVncmVlcyhOdW1iZXIocmFkaWFucykpIC8vIDEuMDQ3MTk3NTUxMTk2NTk3NlxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQGRlc2Mg6ZqP5py65a2X56ym5LiyXHJcbiAgICogQGZ1bmN0aW9uIHJhbmRvbVN0cmluZ1xyXG4gICAqIEBtZW1iZXJPZiBleHRyYVxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbZT0zMl0g5a2X56ym5Liy6ZW/5bqmXHJcbiAgICogQHJldHVybnMge3N0cmluZ30gc3RyIOWtl+espuS4slxyXG4gICAqIEBtZW1iZXJPZiBUb29sc1xyXG4gICAqIEBleGFtcGxlIGxldCBzdHJpbmdzPXRvb2wucmFuZG9tU3RyaW5nKClcclxuICAgKiAqL1xyXG4gIHJhbmRvbVN0cmluZyhlKSB7XHJcbiAgICAvKiAgICBlID0gZSB8fCAzMlxyXG4gICAgICAgIHZhciB0ID0gJ0FCQ0RFRkdISktNTlBRUlNUV1hZWmFiY2RlZmhpamttbnByc3R3eHl6MjM0NTY3OCcsXHJcbiAgICAgICAgICBhID0gdC5sZW5ndGgsXHJcbiAgICAgICAgICBuID0gJydcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGU7IGkrKykgbiArPSB0LmNoYXJBdChNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBhKSkqL1xyXG4gICAgcmV0dXJuIENlc2l1bS5jcmVhdGVHdWlkKClcclxuICB9XHJcblxyXG4gIGdldFNvdXJjZVJvb3RQYXRoKCkge1xyXG4gICAgbGV0IHNka05hbWUgPSAnWUpFYXJ0aC5taW4uanMnXHJcbiAgICBsZXQgc2NyaXB0cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3NjcmlwdCcpXHJcbiAgICBsZXQgcHJlZml4ID0gJydcclxuICAgIHNjcmlwdHMuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICBpZiAoaXRlbS5zcmMgJiYgaXRlbS5zcmMuaW5kZXhPZihzZGtOYW1lKSA+IC0xKSB7XHJcbiAgICAgICAgbGV0IGFyciA9IGl0ZW0uc3JjLnNwbGl0KCcvJylcclxuICAgICAgICBhcnIucG9wKClcclxuICAgICAgICBwcmVmaXggPSBhcnIuam9pbignLycpXHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgICByZXR1cm4gcHJlZml4XHJcbiAgfVxyXG5cclxuICAvKipAZGVzY3JpcHRpb24g56yb5Y2h5bCU5Z2Q5qCH6L2s57uP57qs5bqmXHJcbiAgICogQG1ldGhvZCBjYXJ0ZXNpYW4zVG93Z3M4NFxyXG4gICAqIEBwYXJhbSBjYXJ0ZXNpYW4ge0Nlc2l1bS5DYXJ0ZXNpYW4zfSDnrJvljaHlsJTlnZDmoIdcclxuICAgKiBAcGFyYW0gdmlld2VyXHJcbiAgICogQHBhcmFtIGNhcnRlc2lhbi54IHtudW1iZXJ9XHJcbiAgICogQHBhcmFtIGNhcnRlc2lhbi55IHtudW1iZXJ9XHJcbiAgICogQHBhcmFtIGNhcnRlc2lhbi56IHtudW1iZXJ9XHJcbiAgICogQG1lbWJlck9mIFRvb2xzXHJcbiAgICogQHJldHVybiB7b2JqZWN0fSB3Z3M4NCDov5Tlm553Z3M4NOWdkOagh1xyXG4gICAqICovXHJcbiAgY2FydGVzaWFuM1Rvd2dzODQoY2FydGVzaWFuLCB2aWV3ZXIpIHtcclxuICAgIHZhciBlbGxpcHNvaWQgPSB2aWV3ZXIuc2NlbmUuZ2xvYmUuZWxsaXBzb2lkXHJcbiAgICB2YXIgY2FydGVzaWFuMyA9IG5ldyBDZXNpdW0uQ2FydGVzaWFuMyhcclxuICAgICAgY2FydGVzaWFuLngsXHJcbiAgICAgIGNhcnRlc2lhbi55LFxyXG4gICAgICBjYXJ0ZXNpYW4uelxyXG4gICAgKVxyXG4gICAgdmFyIGNhcnRvZ3JhcGhpYyA9IGVsbGlwc29pZC5jYXJ0ZXNpYW5Ub0NhcnRvZ3JhcGhpYyhjYXJ0ZXNpYW4zKVxyXG4gICAgdmFyIGxhdCA9IENlc2l1bS5NYXRoLnRvRGVncmVlcyhjYXJ0b2dyYXBoaWMubGF0aXR1ZGUpXHJcbiAgICB2YXIgbG5nID0gQ2VzaXVtLk1hdGgudG9EZWdyZWVzKGNhcnRvZ3JhcGhpYy5sb25naXR1ZGUpXHJcbiAgICB2YXIgYWx0ID0gY2FydG9ncmFwaGljLmhlaWdodCA8IDAgPyAwIDogY2FydG9ncmFwaGljLmhlaWdodFxyXG4gICAgLy8gdmFyIGFsdCA9IGNhcnRvZ3JhcGhpYy5oZWlnaHRcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGxuZzogbG5nLFxyXG4gICAgICBsYXQ6IGxhdCxcclxuICAgICAgYWx0OiBhbHQsXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAZGVzYyDorqHnrpflpJrnur/mrrXplb/luqZcclxuICAgKiBAbWV0aG9kIGNvbXB1dGVEaXN0YW5jZVxyXG4gICAqIEBtZW1iZXJPZiBUb29sc1xyXG4gICAqQHBhcmFtIHBvc2l0aW9ucyB7QXJyYXkuPHtsbmc6bnVtYmVyLCBsYXQ6bnVtYmVyLGFsdDpudW1iZXJ9Pn3lnZDmoIfmlbDnu4RcclxuICAgKiBAcGFyYW0gW2ZyYWN0aW9uRGlnaXRzPTJdIOS/neeVmeWwj+aVsOeCueS9jeaVsFxyXG4gICAqIEBwYXJhbSBbZ3JvdW5kPXRydWVdIOaYr+WQpui0tOWcsFxyXG4gICAqICovXHJcbiAgYXN5bmMgY29tcHV0ZURpc3RhbmNlKHBvc2l0aW9ucyA9IFtdLCBmcmFjdGlvbkRpZ2l0cyA9IDIsIHR5cGUgPSAwKSB7XHJcbiAgICBpZiAocG9zaXRpb25zLmxlbmd0aCA8IDIpIHtcclxuICAgICAgcmV0dXJuIDBcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGxldCBsZW5ndGggPSAwXHJcbiAgICAgIHN3aXRjaCAodHlwZSkge1xyXG4gICAgICAgIGNhc2UgJzAnOlxyXG4gICAgICAgIGNhc2UgMDpcclxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9zaXRpb25zLmxlbmd0aCAtIDE7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBwb3NpdGlvbjEgPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlcyhwb3NpdGlvbnNbaV0ubG5nLCBwb3NpdGlvbnNbaV0ubGF0LCBwb3NpdGlvbnNbaV0uYWx0KTtcclxuICAgICAgICAgICAgY29uc3QgcG9zaXRpb24yID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXMocG9zaXRpb25zW2kgKyAxXS5sbmcsIHBvc2l0aW9uc1tpICsgMV0ubGF0LCBwb3NpdGlvbnNbaSArIDFdLmFsdCk7XHJcbiAgICAgICAgICAgIGNvbnN0IGRpc3RhbmNlID0gQ2VzaXVtLkNhcnRlc2lhbjMuZGlzdGFuY2UocG9zaXRpb24xLCBwb3NpdGlvbjIpO1xyXG4gICAgICAgICAgICBsZW5ndGggPSBsZW5ndGggKyBkaXN0YW5jZVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWtcclxuICAgICAgICBjYXNlICcxJzpcclxuICAgICAgICBjYXNlIDE6XHJcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGggLSAxOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgcG9zaXRpb24xID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXMocG9zaXRpb25zW2ldLmxuZywgcG9zaXRpb25zW2ldLmxhdCwgMCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHBvc2l0aW9uMiA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzKHBvc2l0aW9uc1tpICsgMV0ubG5nLCBwb3NpdGlvbnNbaSArIDFdLmxhdCwgMCk7XHJcbiAgICAgICAgICAgIGNvbnN0IGRpc3RhbmNlID0gQ2VzaXVtLkNhcnRlc2lhbjMuZGlzdGFuY2UocG9zaXRpb24xLCBwb3NpdGlvbjIpO1xyXG4gICAgICAgICAgICBsZW5ndGggPSBsZW5ndGggKyBkaXN0YW5jZVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWtcclxuICAgICAgICBjYXNlICcyJzpcclxuICAgICAgICBjYXNlIDI6XHJcbiAgICAgICAgICBsZXQgbWV0ZXJzXHJcbiAgICAgICAgICBsZXQgbGluZVN0cmluZzIgPSBbXVxyXG4gICAgICAgICAgcG9zaXRpb25zLmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgICAgICAgbGluZVN0cmluZzIucHVzaChbaXRlbS5sbmcsIGl0ZW0ubGF0LCBpdGVtLmFsdF0pXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgbGV0IGxpbmUyID0gdHVyZi5saW5lU3RyaW5nKGxpbmVTdHJpbmcyKVxyXG4gICAgICAgICAgbGV0IGQgPSB0dXJmLmxlbmd0aChsaW5lMikgKiAxMDAwXHJcbiAgICAgICAgICBtZXRlcnMgPSBkID4gMjAgPyBkIC8gMjAgOiBkXHJcblxyXG4gICAgICAgICAgbGV0IHJlcyA9IHRoaXMuY2h1bmtMaW5lKHBvc2l0aW9ucywgbWV0ZXJzKVxyXG4gICAgICAgICAgbGV0IGNvb3JkaW5hdGVzID0gW11cclxuICAgICAgICAgIHJlcy5mb3JFYWNoKChGZWF0dXJlLCBpbmRleCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoaW5kZXggPT09IDApIHtcclxuICAgICAgICAgICAgICBjb29yZGluYXRlcyA9IFsuLi5GZWF0dXJlLmdlb21ldHJ5LmNvb3JkaW5hdGVzXVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIGNvb3JkaW5hdGVzLnB1c2goRmVhdHVyZS5nZW9tZXRyeS5jb29yZGluYXRlc1sxXSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIGxldCBhcnIgPSBbXVxyXG4gICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGNvb3JkaW5hdGVzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gY29vcmRpbmF0ZXMuaW5kZXhPZihpdGVtKTtcclxuICAgICAgICAgICAgbGV0IHIgPSBhd2FpdCB0aGlzLnNhbXBsZUhlaWdodCh7IGxuZzogaXRlbVswXSwgbGF0OiBpdGVtWzFdLCBhbHQ6IDAgfSwgaW5kZXgpXHJcbiAgICAgICAgICAgIHIucG9zaXRpb24uYWx0ID0gci5wb3NpdGlvbi5hbHQgPCAwID8gMCA6IHIucG9zaXRpb24uYWx0XHJcbiAgICAgICAgICAgIGFyci5wdXNoKHIpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBsZXQgbCA9IGFyci5sZW5ndGggLSAxXHJcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGggLSAxOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgcG9zaXRpb24xID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXMoYXJyW2ldLnBvc2l0aW9uLmxuZywgYXJyW2ldLnBvc2l0aW9uLmxhdCwgMCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHBvc2l0aW9uMiA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzKGFycltpICsgMV0ucG9zaXRpb24ubG5nLCBhcnJbaSArIDFdLnBvc2l0aW9uLmxhdCwgMCk7XHJcbiAgICAgICAgICAgIGNvbnN0IGRpc3RhbmNlID0gQ2VzaXVtLkNhcnRlc2lhbjMuZGlzdGFuY2UocG9zaXRpb24xLCBwb3NpdGlvbjIpO1xyXG4gICAgICAgICAgICBsZW5ndGggPSBsZW5ndGggKyBkaXN0YW5jZVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWtcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGxlbmd0aC50b0ZpeGVkKGZyYWN0aW9uRGlnaXRzKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY29tcHV0ZURpc3RhbmNlMihwb3NpdGlvbnMgPSBbXSwgZnJhY3Rpb25EaWdpdHMgPSAyLCBncm91bmQgPSB0cnVlKSB7XHJcbiAgICBpZiAocG9zaXRpb25zLmxlbmd0aCA8IDIpIHtcclxuICAgICAgcmV0dXJuIDBcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGxldCBsZW5ndGggPSAwXHJcbiAgICAgIGlmIChncm91bmQpIHtcclxuICAgICAgICBsZXQgbGluZVN0cmluZyA9IFtdXHJcbiAgICAgICAgcG9zaXRpb25zLmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgICAgIGxpbmVTdHJpbmcucHVzaChbaXRlbS5sbmcsIGl0ZW0ubGF0LCBpdGVtLmFsdF0pXHJcbiAgICAgICAgfSlcclxuICAgICAgICBsZXQgbGluZSA9IHR1cmYubGluZVN0cmluZyhsaW5lU3RyaW5nKVxyXG4gICAgICAgIGxlbmd0aCA9IHR1cmYubGVuZ3RoKGxpbmUpICogMTAwMFxyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9zaXRpb25zLmxlbmd0aCAtIDE7IGkrKykge1xyXG4gICAgICAgICAgY29uc3QgcG9zaXRpb24xID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXMocG9zaXRpb25zW2ldLmxuZywgcG9zaXRpb25zW2ldLmxhdCwgcG9zaXRpb25zW2ldLmFsdCk7XHJcbiAgICAgICAgICBjb25zdCBwb3NpdGlvbjIgPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlcyhwb3NpdGlvbnNbaSArIDFdLmxuZywgcG9zaXRpb25zW2kgKyAxXS5sYXQsIHBvc2l0aW9uc1tpICsgMV0uYWx0KTtcclxuICAgICAgICAgIGNvbnN0IGRpc3RhbmNlID0gQ2VzaXVtLkNhcnRlc2lhbjMuZGlzdGFuY2UocG9zaXRpb24xLCBwb3NpdGlvbjIpO1xyXG4gICAgICAgICAgbGVuZ3RoID0gbGVuZ3RoICsgZGlzdGFuY2VcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGxlbmd0aC50b0ZpeGVkKGZyYWN0aW9uRGlnaXRzKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgc2FtcGxlSGVpZ2h0KHAxLCBpbmRleCkge1xyXG4gICAgbGV0IHAyID0gYXdhaXQgdGhpcy5zYW1wbGVIZWlnaHRNb3N0RGV0YWlsZWQoW3AxXSlcclxuICAgIHAxLmFsdCA9IHAyWzBdLmhlaWdodFxyXG4gICAgcmV0dXJuIHsgcG9zaXRpb246IHAxLCBpbmRleCB9XHJcbiAgfVxyXG5cclxuICAvKipAZGVzY3JpcHRpb24g6K6h566X5aSa6L655b2i6Z2i56evXHJcbiAgICogQG1ldGhvZCBjb21wdXRlQXJlYVxyXG4gICAqIEBtZW1iZXJPZiBUb29sc1xyXG4gICAqIEBwYXJhbSBwb3NpdGlvbnMge0FycmF5Ljx7bG5nOm51bWJlciwgbGF0Om51bWJlcixhbHQ6bnVtYmVyfT59XHJcbiAgICogQHBhcmFtIFtmcmFjdGlvbkRpZ2l0cz0yXSB7bnVtYmVyfSDnsr7noa7liLDlsI/mlbDngrnlpJrlsJHkvY1cclxuICAgKiBAcmV0dXJuIHtudW1iZXJ9ICDpnaLnp69cclxuICAgKiAqL1xyXG4gIGNvbXB1dGVBcmVhKHBvc2l0aW9ucywgZnJhY3Rpb25EaWdpdHMgPSAyKSB7XHJcbiAgICBpZiAocG9zaXRpb25zLmxlbmd0aCA8IDMpIHtcclxuICAgICAgcmV0dXJuIDBcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGxldCBwID0gW11cclxuICAgICAgcG9zaXRpb25zLmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgICBwLnB1c2goW2l0ZW0ubG5nLCBpdGVtLmxhdF0pXHJcbiAgICAgIH0pXHJcbiAgICAgIHAucHVzaChwWzBdKVxyXG4gICAgICBsZXQgcG9seWdvbiA9IHR1cmYucG9seWdvbihbcF0pXHJcbiAgICAgIGxldCB0cmlhbmdsZXMgPSB0dXJmLnRlc3NlbGF0ZShwb2x5Z29uKTtcclxuXHJcbiAgICAgIHJldHVybiBOdW1iZXIodHVyZi5hcmVhKHRyaWFuZ2xlcykudG9GaXhlZChmcmFjdGlvbkRpZ2l0cykpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjb21wdXRlU2lnbmVkQXJlYSh2aWV3ZXIsIHBhdGgpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXNcclxuICAgIGxldCBmcm9tRGVncmVlc0FycmF5ID0gW11cclxuICAgIGxldCBmcm9tRGVncmVlc0FycmF5MiA9IFtdXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhdGgubGVuZ3RoOyBpKyspIHtcclxuICAgICAgZnJvbURlZ3JlZXNBcnJheS5wdXNoKHBhdGhbaV0ubG5nLCBwYXRoW2ldLmxhdClcclxuICAgICAgZnJvbURlZ3JlZXNBcnJheTIucHVzaChbcGF0aFtpXS5sbmcsIHBhdGhbaV0ubGF0XSlcclxuICAgIH1cclxuICAgIGxldCBsaW5lID0gdHVyZi5saW5lU3RyaW5nKGZyb21EZWdyZWVzQXJyYXkyKTtcclxuICAgIGxldCBiYm94ID0gdHVyZi5iYm94KGxpbmUpO1xyXG4gICAgbGV0IGxvbmdSYWRpYW5zID0gQ2VzaXVtLk1hdGgudG9SYWRpYW5zKGJib3hbMl0gLSBiYm94WzBdKTtcclxuICAgIGxldCBsYXRSYWRpYW5zID0gQ2VzaXVtLk1hdGgudG9SYWRpYW5zKGJib3hbM10gLSBiYm94WzFdKTtcclxuICAgIGxldCBncmFudWxhcml0eVxyXG4gICAgaWYgKGxvbmdSYWRpYW5zID4gbGF0UmFkaWFucykge1xyXG4gICAgICBncmFudWxhcml0eSA9IGxvbmdSYWRpYW5zIC8gMTBcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBncmFudWxhcml0eSA9IGxhdFJhZGlhbnMgLyAxMFxyXG4gICAgfVxyXG5cclxuICAgIC8vIGxldCBncmFudWxhcml0eSA9IE1hdGguUEkgLyBNYXRoLnBvdygyLCAxMSk7XHJcbiAgICAvLyBncmFudWxhcml0eSA9IGdyYW51bGFyaXR5IC8gMTI1MDtcclxuICAgIGxldCBwb2x5Z29uR2VvbWV0cnkgPSBuZXcgQ2VzaXVtLlBvbHlnb25HZW9tZXRyeS5mcm9tUG9zaXRpb25zKHtcclxuICAgICAgcG9zaXRpb25zOiBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlc0FycmF5KGZyb21EZWdyZWVzQXJyYXkpLFxyXG4gICAgICB2ZXJ0ZXhGb3JtYXQ6IENlc2l1bS5QZXJJbnN0YW5jZUNvbG9yQXBwZWFyYW5jZS5GTEFUX1ZFUlRFWF9GT1JNQVQsXHJcbiAgICAgIGdyYW51bGFyaXR5OiBncmFudWxhcml0eSxcclxuICAgIH0pO1xyXG4gICAgLy/liJvlu7roh6rlrprkuYnlubPpnaLlh6DkvZXkvZNcclxuICAgIGxldCBnZW9tID0gbmV3IENlc2l1bS5Qb2x5Z29uR2VvbWV0cnkuY3JlYXRlR2VvbWV0cnkocG9seWdvbkdlb21ldHJ5KTtcclxuICAgIGlmICghZ2VvbSB8fCAhZ2VvbS5hdHRyaWJ1dGVzIHx8ICFnZW9tLmF0dHJpYnV0ZXMucG9zaXRpb24pIHtcclxuICAgICAgcmV0dXJuIDBcclxuICAgIH1cclxuICAgIGNvbnN0IGluZGljZXMgPSBnZW9tLmluZGljZXM7IC8v6I635Y+W6aG254K557Si5byV5pWw5o2uXHJcbiAgICBjb25zdCBwb3NpdGlvbnMgPSBnZW9tLmF0dHJpYnV0ZXMucG9zaXRpb24udmFsdWVzO1xyXG4gICAgZnVuY3Rpb24gcmV0dXJuUG9zaXRpb24ocG9zaXRpb24sIGluZGV4KSB7XHJcbiAgICAgIGxldCBwb3MzID0gbmV3IENlc2l1bS5DYXJ0ZXNpYW4zKFxyXG4gICAgICAgIHBvc2l0aW9uc1tpbmRleCAqIDNdLFxyXG4gICAgICAgIHBvc2l0aW9uc1tpbmRleCAqIDMgKyAxXSxcclxuICAgICAgICBwb3NpdGlvbnNbaW5kZXggKiAzICsgMl1cclxuICAgICAgKTtcclxuICAgICAgbGV0IHBvc2l0aW9uMSA9IHZpZXdlci5zY2VuZS5jbGFtcFRvSGVpZ2h0KHBvczMpIHx8IHBvczNcclxuICAgICAgLy8gbGV0IHBvczg0ID0gYXdhaXQgX3RoaXMuY2FydGVzaWFuM1Rvd2dzODQocG9zaXRpb24xLCB2aWV3ZXIpXHJcbiAgICAgIC8vIGxldCBoZWlnaHQgPSAwXHJcbiAgICAgIC8vIHRyeSB7XHJcbiAgICAgIC8vICAgbGV0IHBvc2l0aW9uMiA9IGF3YWl0IENlc2l1bS5zYW1wbGVUZXJyYWluTW9zdERldGFpbGVkKFxyXG4gICAgICAvLyAgICAgdmlld2VyLnNjZW5lLnRlcnJhaW5Qcm92aWRlcixcclxuICAgICAgLy8gICAgIFtDZXNpdW0uQ2FydG9ncmFwaGljLmZyb21DYXJ0ZXNpYW4ocG9zMyldXHJcbiAgICAgIC8vICAgKVxyXG4gICAgICAvLyAgIGhlaWdodCA9IHBvc2l0aW9uMlswXS5oZWlnaHRcclxuICAgICAgLy8gfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgLy8gICBoZWlnaHQgPSAwXHJcbiAgICAgIC8vIH1cclxuICAgICAgLy8gaWYgKGhlaWdodCA+IHBvczg0LmFsdCkge1xyXG4gICAgICAvLyAgIHBvczg0LmFsdCA9IGhlaWdodFxyXG4gICAgICAvLyB9XHJcbiAgICAgIHJldHVybiBwb3NpdGlvbjFcclxuICAgIH1cclxuXHJcbiAgICBsZXQgYXJlYSA9IDBcclxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBpbmRpY2VzLmxlbmd0aDsgaW5kZXggKz0gMykge1xyXG4gICAgICBjb25zdCBwb3MwID0gcmV0dXJuUG9zaXRpb24ocG9zaXRpb25zLCBpbmRpY2VzW2luZGV4XSk7XHJcbiAgICAgIGNvbnN0IHBvczEgPSByZXR1cm5Qb3NpdGlvbihwb3NpdGlvbnMsIGluZGljZXNbaW5kZXggKyAxXSk7XHJcbiAgICAgIGNvbnN0IHBvczIgPSByZXR1cm5Qb3NpdGlvbihwb3NpdGlvbnMsIGluZGljZXNbaW5kZXggKyAyXSk7XHJcbiAgICAgIC8vIGxldCBlbnRpdHkgPSB2aWV3ZXIuZW50aXRpZXMuYWRkKHtcclxuICAgICAgLy8gICBuYW1lOiBcIuS4ieinkumdolwiLFxyXG4gICAgICAvLyAgIHBvbHlnb246IHtcclxuICAgICAgLy8gICAgIGhpZXJhcmNoeTogW3BvczAsIHBvczEsIHBvczJdLFxyXG4gICAgICAvLyAgICAgcGVyUG9zaXRpb25IZWlnaHQ6IHRydWUsXHJcbiAgICAgIC8vICAgICBtYXRlcmlhbDogQ2VzaXVtLkNvbG9yLmZyb21SYW5kb20oKSxcclxuICAgICAgLy8gICAgIG91dGxpbmU6IHRydWUsXHJcbiAgICAgIC8vICAgICBvdXRsaW5lQ29sb3I6IENlc2l1bS5Db2xvci5CTEFDSyxcclxuICAgICAgLy8gICB9LFxyXG4gICAgICAvLyB9KTtcclxuXHJcbiAgICAgIGxldCB2MCA9IENlc2l1bS5DYXJ0ZXNpYW4zLnN1YnRyYWN0KHBvczAsIHBvczEsIG5ldyBDZXNpdW0uQ2FydGVzaWFuMygpKVxyXG4gICAgICBsZXQgdjEgPSBDZXNpdW0uQ2FydGVzaWFuMy5zdWJ0cmFjdChwb3MyLCBwb3MxLCBuZXcgQ2VzaXVtLkNhcnRlc2lhbjMoKSlcclxuICAgICAgbGV0IGNyb3NzID0gQ2VzaXVtLkNhcnRlc2lhbjMuY3Jvc3ModjAsIHYxLCB2MCk7XHJcbiAgICAgIGFyZWEgPSAoYXJlYSArIENlc2l1bS5DYXJ0ZXNpYW4zLm1hZ25pdHVkZShjcm9zcykgKiAwLjUpXHJcbiAgICB9XHJcbiAgICByZXR1cm4gTnVtYmVyKGFyZWEudG9GaXhlZCgyKSlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBkZXNjIOWIm+W7uuWchlxyXG4gICAqQG1ldGhvZCBjcmVhdGVDaXJjbGVcclxuICAgKiBAcGFyYW0gcG9pbnQge29iamVjdH0g5ZyG5b+D5Z2Q5qCHXHJcbiAgICogQHBhcmFtIHBvaW50LmxuZyB7bnVtYmVyfSDnu4/luqZcclxuICAgKiBAcGFyYW0gcG9pbnQubGF0IHtudW1iZXJ9IOe6rOW6plxyXG4gICAqIEBwYXJhbSByYWRpdXMge251bWJlcn0g5Y2K5b6EICDljZXkvY3vvJrnsbNcclxuICAgKiBAcGFyYW0gW29wdGlvbnNdXHJcbiAgICogQHBhcmFtIFtvcHRpb25zLnN0ZXBzPTM2MF0ge251bWJlcn0g5q615pWwXHJcbiAgICogQG1lbWJlck9mIFRvb2xzXHJcblxyXG4gICAqICovXHJcbiAgY3JlYXRlQ2lyY2xlKHBvaW50LCByYWRpdXMgPSAxLCBvcHRpb25zID0geyBzdGVwczogMzYwIH0pIHtcclxuICAgIGlmIChOdW1iZXIocmFkaXVzKSA8PSAwKSB7XHJcbiAgICAgIHJhZGl1cyA9IDAuMDFcclxuICAgIH1cclxuICAgIHZhciBjZW50ZXIgPSBbTnVtYmVyKHBvaW50LmxuZyksIE51bWJlcihwb2ludC5sYXQpXVxyXG4gICAgbGV0IGNvb3JkaW5hdGVzID0gdHVyZi5jaXJjbGUoY2VudGVyLCByYWRpdXMgLyAxMDAwLCBvcHRpb25zKS5nZW9tZXRyeVxyXG4gICAgICAuY29vcmRpbmF0ZXNbMF1cclxuICAgIGxldCBwb3NpdGlvbnMgPSBbXVxyXG4gICAgY29vcmRpbmF0ZXMuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICBwb3NpdGlvbnMgPSBwb3NpdGlvbnMuY29uY2F0KGl0ZW0pXHJcbiAgICB9KVxyXG4gICAgcmV0dXJuIHBvc2l0aW9uc1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQGRlc2Mg5Yib5bu65qSt5ZyGXHJcbiAgICpAbWV0aG9kIGNyZWF0ZUVsbGlwc2VcclxuICAgKiBAcGFyYW0gcG9pbnQge29iamVjdH0g5ZyG5b+D5Z2Q5qCHXHJcbiAgICogQHBhcmFtIHBvaW50LmxuZyB7bnVtYmVyfSDnu4/luqZcclxuICAgKiBAcGFyYW0gcG9pbnQubGF0IHtudW1iZXJ9IOe6rOW6plxyXG4gICAqIEBwYXJhbSBbb3B0aW9uc11cclxuICAgKiBAcGFyYW0gW29wdGlvbnMuZ3JhbnVsYXJpdHk9MC4xXSB7bnVtYmVyfSDmpK3lnIbkuIrngrnkuYvpl7TnmoTop5LluqZcclxuICAgKiBAcGFyYW0gW29wdGlvbnMuc2VtaU1pbm9yQXhpcz0xMF0ge251bWJlcn0g55+t5Y2K6L206ZW/5bqmICDljZXkvY3vvJrnsbNcclxuICAgKiBAcGFyYW0gW29wdGlvbnMuc2VtaU1ham9yQXhpcz0yMF0ge251bWJlcn0g6ZW/5Y2K6L206ZW/5bqmICDljZXkvY3vvJrnsbNcclxuICAgKiBAcGFyYW0gW29wdGlvbnMuYmVhcmluZz0wXSB7bnVtYmVyfSDmpK3lnIbml4vovazop5LluqYgIOWNleS9je+8muexs1xyXG4gICAqIEBtZW1iZXJPZiBUb29sc1xyXG5cclxuICAgKiAqL1xyXG4gIGNyZWF0ZUVsbGlwc2UocG9pbnQsIG9wdGlvbnMgPSB7IGdyYW51bGFyaXR5OiAwLjEsIHNlbWlNaW5vckF4aXM6IDEwLCBzZW1pTWFqb3JBeGlzOiAyMCwgYmVhcmluZzogMCwgaGVpZ2h0OiAwIH0pIHtcclxuICAgIGlmICghb3B0aW9ucy5ncmFudWxhcml0eSkge1xyXG4gICAgICBvcHRpb25zLmdyYW51bGFyaXR5ID0gMC4xXHJcbiAgICB9XHJcbiAgICBpZiAoIW9wdGlvbnMuaGVpZ2h0KSB7XHJcbiAgICAgIG9wdGlvbnMuaGVpZ2h0ID0gMFxyXG4gICAgfVxyXG4gICAgaWYgKCFvcHRpb25zLnNlbWlNaW5vckF4aXMpIHtcclxuICAgICAgb3B0aW9ucy5zZW1pTWlub3JBeGlzID0gMC4wMDAwMVxyXG4gICAgfVxyXG4gICAgaWYgKCFvcHRpb25zLnNlbWlNYWpvckF4aXMpIHtcclxuICAgICAgb3B0aW9ucy5zZW1pTWFqb3JBeGlzID0gMC4wMDAwMVxyXG4gICAgfVxyXG4gICAgbGV0IGVsbGlwc2VHZW9tZXRyeSA9IG5ldyBDZXNpdW0uRWxsaXBzZU91dGxpbmVHZW9tZXRyeSh7XHJcbiAgICAgIGNlbnRlcjogQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXMoTnVtYmVyKHBvaW50LmxuZyksIE51bWJlcihwb2ludC5sYXQpKSxcclxuICAgICAgc2VtaU1ham9yQXhpczogTnVtYmVyKG9wdGlvbnMuc2VtaU1ham9yQXhpcyksXHJcbiAgICAgIHNlbWlNaW5vckF4aXM6IE51bWJlcihvcHRpb25zLnNlbWlNaW5vckF4aXMpLFxyXG4gICAgICBoZWlnaHQ6IE51bWJlcihvcHRpb25zLmhlaWdodCksXHJcbiAgICAgIGdyYW51bGFyaXR5OiBDZXNpdW0uTWF0aC50b1JhZGlhbnMob3B0aW9ucy5ncmFudWxhcml0eSksXHJcbiAgICAgIHJvdGF0aW9uOiBDZXNpdW0uTWF0aC50b1JhZGlhbnMob3B0aW9ucy5iZWFyaW5nKSxcclxuICAgIH0pXHJcbiAgICBsZXQgZWxsaXBzZSA9IENlc2l1bS5FbGxpcHNlT3V0bGluZUdlb21ldHJ5LmNyZWF0ZUdlb21ldHJ5KGVsbGlwc2VHZW9tZXRyeSlcclxuICAgIGlmICghZWxsaXBzZSB8fCAhZWxsaXBzZS5hdHRyaWJ1dGVzIHx8ICFlbGxpcHNlLmF0dHJpYnV0ZXMucG9zaXRpb24pIHtcclxuICAgICAgcmV0dXJuIFtdXHJcbiAgICB9XHJcbiAgICBjb25zdCBlbGxpcHNlUG9zaXRpb25zID0gZWxsaXBzZS5hdHRyaWJ1dGVzLnBvc2l0aW9uLnZhbHVlcztcclxuICAgIGxldCBwb3NpdGlvbnMgPSBbXVxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbGxpcHNlUG9zaXRpb25zLmxlbmd0aDsgaSArPSAzKSB7XHJcbiAgICAgIGxldCBwb3MgPSBuZXcgQ2VzaXVtLkNhcnRlc2lhbjMoXHJcbiAgICAgICAgZWxsaXBzZVBvc2l0aW9uc1tpXSxcclxuICAgICAgICBlbGxpcHNlUG9zaXRpb25zW2kgKyAxXSxcclxuICAgICAgICBlbGxpcHNlUG9zaXRpb25zW2kgKyAyXVxyXG4gICAgICApXHJcbiAgICAgIHBvc2l0aW9ucy5wdXNoKHBvcylcclxuICAgIH1cclxuICAgIHJldHVybiBwb3NpdGlvbnNcclxuICB9XHJcblxyXG4gIC8q6K6h566XMueCueeahOaBkuebuOe6v+WkueinkiovXHJcbiAgcmh1bWJCZWFyaW5nKHAxLCBwMikge1xyXG4gICAgdmFyIHBvaW50MSA9IHR1cmYucG9pbnQoW3AxLmxuZywgcDEubGF0XSwpO1xyXG4gICAgdmFyIHBvaW50MiA9IHR1cmYucG9pbnQoW3AyLmxuZywgcDIubGF0XSwpO1xyXG4gICAgcmV0dXJuIHR1cmYucmh1bWJCZWFyaW5nKHBvaW50MSwgcG9pbnQyKTtcclxuICB9XHJcblxyXG5cclxuICBjb21wdXRlQ2VudGVyKHBvc2l0aW9ucyA9IFtdKSB7XHJcbiAgICBsZXQgYXJyID0gW11cclxuICAgIHBvc2l0aW9ucy5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgIGFyci5wdXNoKHR1cmYucG9pbnQoW2l0ZW0ubG5nLCBpdGVtLmxhdF0pKVxyXG4gICAgfSlcclxuICAgIHZhciBmZWF0dXJlcyA9IHR1cmYuZmVhdHVyZUNvbGxlY3Rpb24oYXJyKVxyXG5cclxuICAgIHZhciBjb29yZGluYXRlcyA9IHR1cmYuY2VudGVyKGZlYXR1cmVzKS5nZW9tZXRyeS5jb29yZGluYXRlc1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgbG5nOiBjb29yZGluYXRlc1swXSxcclxuICAgICAgbGF0OiBjb29yZGluYXRlc1sxXSxcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8v6K6h566XMueCueeahOS4reW/g+eCuVxyXG4gIGNvbXB1dGVNaWRwb2ludChwb2ludDEsIHBvaW50Mikge1xyXG4gICAgbGV0IHAxID0gdHVyZi5wb2ludChbcG9pbnQxLmxuZywgcG9pbnQxLmxhdF0pXHJcbiAgICBsZXQgcDIgPSB0dXJmLnBvaW50KFtwb2ludDIubG5nLCBwb2ludDIubGF0XSlcclxuICAgIHZhciBjZW50ZXIgPSB0dXJmLm1pZHBvaW50KHAxLCBwMikuZ2VvbWV0cnkuY29vcmRpbmF0ZXNcclxuICAgIHJldHVybiB7IGxuZzogY2VudGVyWzBdLCBsYXQ6IGNlbnRlclsxXSB9XHJcbiAgfVxyXG5cclxuICAvL+iuoeeul1xyXG4gIGNvbXB1dGVBdHRhY2tBcnJvdyhwb3NpdGlvbnMgPSBbXSkge1xyXG4gICAgcmV0dXJuIHRoaXMuY29tcHV0ZUFycm93KHBvc2l0aW9ucywgMClcclxuICB9XHJcblxyXG4gIC8v6K6h566X6ZKz5Ye7566t5aS0XHJcbiAgY29tcHV0ZVBpbmNlckFycm93KHBvc2l0aW9ucyA9IFtdKSB7XHJcbiAgICByZXR1cm4gdGhpcy5jb21wdXRlQXJyb3cocG9zaXRpb25zKVxyXG4gIH1cclxuXHJcbiAgLy/orqHnrpfmlLvlh7vnrq3lpLRcclxuICBjb21wdXRlQXJyb3cocG9zaXRpb25zID0gW10sIHR5cGUgPSAxKSB7XHJcbiAgICBpZiAocG9zaXRpb25zLmxlbmd0aCA8IDMpIHtcclxuICAgICAgcmV0dXJuIFtdXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB2YXIgbG5nbGF0QXJyID0gW11cclxuICAgICAgLy8gaWYocG9zaXRpb25zLmV2ZXJ5KHBvcyA9PiBOdW1iZXIocG9zLmxuZykgPj0gMCkgfHwgcG9zaXRpb25zLmV2ZXJ5KHBvcyA9PiBOdW1iZXIocG9zLmxuZykgPD0gMCkpIHtcclxuICAgICAgLy8gICBmb3IgKHZhciBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAvLyAgICAgbG5nbGF0QXJyLnB1c2goW3Bvc2l0aW9uc1tpXS5sbmcsIHBvc2l0aW9uc1tpXS5sYXRdKVxyXG4gICAgICAvLyAgIH1cclxuICAgICAgLy8gfVxyXG4gICAgICAvLyBlbHNlIHtcclxuICAgICAgLy8gICBmb3IgKHZhciBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAvLyAgICAgaWYocG9zaXRpb25zW2ldLmxuZzwwKSB7XHJcbiAgICAgIC8vICAgICAgIGxuZ2xhdEFyci5wdXNoKFtwb3NpdGlvbnNbaV0ubG5nKzM2MCwgcG9zaXRpb25zW2ldLmxhdF0pXHJcbiAgICAgIC8vICAgICB9XHJcbiAgICAgIC8vICAgICBlbHNlIHtcclxuICAgICAgLy8gICAgICAgbG5nbGF0QXJyLnB1c2goW3Bvc2l0aW9uc1tpXS5sbmcsIHBvc2l0aW9uc1tpXS5sYXRdKVxyXG4gICAgICAvLyAgICAgfVxyXG4gICAgICAvLyAgIH1cclxuICAgICAgLy8gfVxyXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGxuZ2xhdEFyci5wdXNoKFtwb3NpdGlvbnNbaV0ubG5nLCBwb3NpdGlvbnNbaV0ubGF0XSlcclxuICAgICAgfVxyXG4gICAgICB2YXIgcmVzXHJcbiAgICAgIGlmICh0eXBlKSB7XHJcbiAgICAgICAgcmVzID0geHAuYWxnb3JpdGhtLmRvdWJsZUFycm93KGxuZ2xhdEFycilcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXMgPSB4cC5hbGdvcml0aG0udGFpbGVkQXR0YWNrQXJyb3cobG5nbGF0QXJyKVxyXG4gICAgICB9XHJcbiAgICAgIHZhciBpbmRleCA9IEpTT04uc3RyaW5naWZ5KHJlcy5wb2x5Z29uYWxQb2ludCkuaW5kZXhPZignbnVsbCcpXHJcbiAgICAgIHZhciByZXR1cm5EYXRhID0gW11cclxuICAgICAgaWYgKGluZGV4ID09PSAtMSkgcmV0dXJuRGF0YSA9IHJlcy5wb2x5Z29uYWxQb2ludFxyXG4gICAgICByZXR1cm4gcmV0dXJuRGF0YVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8g6K6h566X6ZuG57uT5ZywXHJcbiAgY29tcHV0ZUFzc2VtYmxlKHBvc2l0aW9ucyA9IFtdLCBpczg0ID0gZmFsc2UpIHtcclxuICAgIGlmIChwb3NpdGlvbnMubGVuZ3RoIDwgMikge1xyXG4gICAgICByZXR1cm4gW11cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGxldCBwb2ludHMgPSBwb3NpdGlvbnMubGVuZ3RoO1xyXG4gICAgICBsZXQgcG50cyA9IG5ldyBBcnJheSgpO1xyXG4gICAgICBwb3NpdGlvbnMuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICAgIHBudHMucHVzaChbaXRlbS5sbmcsIGl0ZW0ubGF0XSk7XHJcbiAgICAgIH0pO1xyXG4gICAgICAvL2NvbnNvbGUubG9nKFwicG50czY2NjZcIixwbnRzKTtcclxuICAgICAgLy8gcG50cy5wdXNoKHRhaWxQb2ludCk7XHJcbiAgICAgIC8vIHBudHMucHVzaChoZWFkZXJQb2ludCk7XHJcblxyXG4gICAgICBpZiAocG50cy5sZW5ndGggPT09IDIpIHtcclxuICAgICAgICBsZXQgbWlkID0gUC5QbG90VXRpbHMubWlkKHBudHNbMF0sIHBudHNbMV0pXHJcbiAgICAgICAgLy9sZXQgZCA9IHV0aWxzLk1hdGhEaXN0YW5jZShwbnRzWzBdLCBtaWQpIC8gMC45XHJcbiAgICAgICAgbGV0IGQgPSBQLlBsb3RVdGlscy5kaXN0YW5jZShwbnRzWzBdLCBtaWQpIC8gMC45XHJcbiAgICAgICAgLy9jb25zb2xlLmxvZyhcImRcIixkKTtcclxuICAgICAgICBsZXQgcG50ID0gUC5QbG90VXRpbHMuZ2V0VGhpcmRQb2ludChwbnRzWzBdLCBtaWQsIFAuQ29uc3RhbnRzLkhBTEZfUEksIGQsIHRydWUpXHJcbiAgICAgICAgcG50cyA9IFtwbnRzWzBdLCBwbnQsIHBudHNbMV1dO1xyXG4gICAgICAgIC8vY29uc29sZS5sb2coXCJwbnRcIixwbnQpO1xyXG4gICAgICAgIC8vY3JlYXRlUG9pbnQoQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXMocG50WzBdLCBwbnRbMV0pKTtcclxuICAgICAgfVxyXG4gICAgICBsZXQgbWlkID0gUC5QbG90VXRpbHMubWlkKHBudHNbMF0sIHBudHNbMl0pXHJcbiAgICAgIHBudHMucHVzaChtaWQsIHBudHNbMF0sIHBudHNbMV0pXHJcblxyXG4gICAgICBsZXQgW25vcm1hbHMsIHBudDEsIHBudDIsIHBudDMsIHJlc3VsdCwgcmVzdWx0Ml0gPSBbW10sIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIFtdLCBbXV1cclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwbnRzLmxlbmd0aCAtIDI7IGkrKykge1xyXG4gICAgICAgIHBudDEgPSBwbnRzW2ldXHJcbiAgICAgICAgcG50MiA9IHBudHNbaSArIDFdXHJcbiAgICAgICAgcG50MyA9IHBudHNbaSArIDJdXHJcbiAgICAgICAgbGV0IG5vcm1hbFBvaW50cyA9IFAuUGxvdFV0aWxzLmdldEJpc2VjdG9yTm9ybWFscygwLjQsIHBudDEsIHBudDIsIHBudDMpXHJcbiAgICAgICAgbm9ybWFscyA9IG5vcm1hbHMuY29uY2F0KG5vcm1hbFBvaW50cylcclxuICAgICAgfVxyXG4gICAgICBsZXQgY291bnQgPSBub3JtYWxzLmxlbmd0aFxyXG4gICAgICBub3JtYWxzID0gW25vcm1hbHNbY291bnQgLSAxXV0uY29uY2F0KG5vcm1hbHMuc2xpY2UoMCwgY291bnQgLSAxKSlcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwbnRzLmxlbmd0aCAtIDI7IGkrKykge1xyXG4gICAgICAgIHBudDEgPSBwbnRzW2ldXHJcbiAgICAgICAgcG50MiA9IHBudHNbaSArIDFdXHJcbiAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmNvbmNhdChbLi4ucG50MV0pXHJcbiAgICAgICAgZm9yIChsZXQgdCA9IDA7IHQgPD0gUC5Db25zdGFudHMuRklUVElOR19DT1VOVDsgdCsrKSB7XHJcbiAgICAgICAgICBsZXQgcG50ID0gUC5QbG90VXRpbHMuZ2V0Q3ViaWNWYWx1ZSh0IC8gUC5Db25zdGFudHMuRklUVElOR19DT1VOVCwgcG50MSwgbm9ybWFsc1tpICogMl0sIG5vcm1hbHNbaSAqIDIgKyAxXSwgcG50MilcclxuICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5jb25jYXQoWy4uLnBudF0pXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJlc3VsdCA9IHJlc3VsdC5jb25jYXQoWy4uLnBudDJdKVxyXG4gICAgICB9XHJcbiAgICAgIGlmIChpczg0KSB7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdFxyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHJldHVybiBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlc0FycmF5KHJlc3VsdClcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8g6K6h566X55u057q/566t5aS0XHJcbiAgY29tcHV0ZVN0cmFpZ2h0QXJyb3cocG9zaXRpb25zID0gW10sIGlzODQgPSBmYWxzZSkge1xyXG4gICAgaWYgKHBvc2l0aW9ucy5sZW5ndGggPCAyKSB7XHJcbiAgICAgIHJldHVybiBbXVxyXG4gICAgfVxyXG4gICAgbGV0IHBvaW50MSA9IFtwb3NpdGlvbnNbMF0ubG5nLCBwb3NpdGlvbnNbMF0ubGF0XVxyXG4gICAgbGV0IHBvaW50MiA9IFtwb3NpdGlvbnNbMV0ubG5nLCBwb3NpdGlvbnNbMV0ubGF0XVxyXG4gICAgaWYgKHBvc2l0aW9uc1swXS5sbmcgPT09IHBvc2l0aW9uc1sxXS5sbmcgJiYgcG9zaXRpb25zWzBdLmxhdCA9PT0gcG9zaXRpb25zWzFdLmxhdCkge1xyXG4gICAgICBpZiAoaXM4NCkge1xyXG4gICAgICAgIHJldHVybiBbcG9zaXRpb25zWzBdLCBwb3NpdGlvbnNbMF0sIHBvc2l0aW9uc1swXV1cclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBsZXQgY2FydGVzaWFuMyA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzKHBvc2l0aW9uc1swXS5sbmcsIHBvc2l0aW9uc1swXS5sYXQpXHJcbiAgICAgICAgcmV0dXJuIFtjYXJ0ZXNpYW4zLCBjYXJ0ZXNpYW4zLCBjYXJ0ZXNpYW4zXVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBsZXQgbG5nbGF0QXJyID0gW11cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGxuZ2xhdEFyci5wdXNoKFtwb3NpdGlvbnNbaV0ubG5nLCBwb3NpdGlvbnNbaV0ubGF0XSlcclxuICAgIH1cclxuXHJcbiAgICBsZXQgcmVzXHJcbiAgICByZXMgPSB4cC5hbGdvcml0aG0uZmluZUFycm93KHBvaW50MSwgcG9pbnQyKVxyXG4gICAgaWYgKGlzODQpIHtcclxuICAgICAgbGV0IHBvczg0ID0gW11cclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBsZXQgcG9zID0gdGhpcy5jYXJ0ZXNpYW4zVG93Z3M4NChyZXNbaV0sIHRoaXMuc2RrLnZpZXdlcilcclxuICAgICAgICBwb3M4NC5wdXNoKHBvcy5sbmcsIHBvcy5sYXQpXHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHBvczg0XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzXHJcbiAgfVxyXG5cclxuICBnZXRNYXRlcmlhbChjb2xvciA9ICcjMmFiMGMyJywgdHlwZSA9IDAsIGVudGl0eSA9IG51bGwsIG5ld1BhcmFtID0ge30pIHtcclxuICAgIGxldCBtYXRlcmlhbCA9ICcnXHJcbiAgICBsZXQgYXJyID0ge1xyXG4gICAgICAnNyc6IDEwLFxyXG4gICAgICAnOCc6IDMsXHJcbiAgICAgICc5JzogNCxcclxuICAgICAgJzEwJzogNCxcclxuICAgICAgJzExJzogNCxcclxuICAgICAgJzEyJzogMlxyXG4gICAgfVxyXG4gICAgaWYgKGVudGl0eSkge1xyXG4gICAgICBhcnJbdHlwZSArICcnXSA/IChlbnRpdHkucG9seWxpbmUud2lkdGggPSBlbnRpdHkucG9seWxpbmUub3JpV2lkdGggKyBhcnJbdHlwZSArICcnXSkgOiAoZW50aXR5LnBvbHlsaW5lLndpZHRoID0gZW50aXR5LnBvbHlsaW5lLm9yaVdpZHRoKVxyXG4gICAgfVxyXG4gICAgc3dpdGNoIChOdW1iZXIodHlwZSkpIHtcclxuXHJcbiAgICAgIGNhc2UgMTogLy/omZrnur9cclxuICAgICAgICBtYXRlcmlhbCA9IG5ldyBDZXNpdW0uUG9seWxpbmVEYXNoTWF0ZXJpYWxQcm9wZXJ0eSh7XHJcbiAgICAgICAgICBjb2xvcjogQ2VzaXVtLkNvbG9yLmZyb21Dc3NDb2xvclN0cmluZyhjb2xvciksXHJcbiAgICAgICAgICBkYXNoTGVuZ3RoOiAxMCwgLy/nn63liJLnur/plb/luqZcclxuICAgICAgICB9KVxyXG4gICAgICAgIGJyZWFrXHJcbiAgICAgIGNhc2UgMjogLy/ms5vlhYlcclxuICAgICAgICBtYXRlcmlhbCA9IG5ldyBDZXNpdW0uUG9seWxpbmVHbG93TWF0ZXJpYWxQcm9wZXJ0eSh7XHJcbiAgICAgICAgICBnbG93UG93ZXI6IDAuMixcclxuICAgICAgICAgIGNvbG9yOiBDZXNpdW0uQ29sb3IuZnJvbUNzc0NvbG9yU3RyaW5nKGNvbG9yKSxcclxuICAgICAgICB9KVxyXG4gICAgICAgIGJyZWFrXHJcbiAgICAgIGNhc2UgMzogLy/lsL7ov7nlhYnnur9cclxuICAgICAgICBtYXRlcmlhbCA9IG5ldyBDZXNpdW0uUG9seWxpbmVGbG93TWF0ZXJpYWxQcm9wZXJ0eSh7XHJcbiAgICAgICAgICBjb2xvcjogY29sb3IsXHJcbiAgICAgICAgICBzcGVlZDogbmV3UGFyYW0ucm90YXRlID8gbmV3UGFyYW0uc3BlZWQgOiAwIC0gbmV3UGFyYW0uc3BlZWQsXHJcbiAgICAgICAgICByb3RhdGU6IG5ld1BhcmFtLnJvdGF0ZVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgYnJlYWtcclxuICAgICAgY2FzZSA0OiAvL+WkmuWwvui/ueWFiee6v1xyXG4gICAgICAgIG1hdGVyaWFsID0gbmV3IENlc2l1bS5Qb2x5bGluZUZsb3dNdWx0TWF0ZXJpYWxQcm9wZXJ0eSh7XHJcbiAgICAgICAgICBjb2xvcjogY29sb3IsXHJcbiAgICAgICAgICBzcGVlZDogbmV3UGFyYW0ucm90YXRlID8gbmV3UGFyYW0uc3BlZWQgOiAwIC0gbmV3UGFyYW0uc3BlZWQsXHJcbiAgICAgICAgICByb3RhdGU6IG5ld1BhcmFtLnJvdGF0ZVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgYnJlYWtcclxuICAgICAgY2FzZSA1OiAvL+aZrumAmua1geWKqOiZmue6v1xyXG4gICAgICAvLyBtYXRlcmlhbCA9IG5ldyBDZXNpdW0uRmxvd0Rhc2hlZExpbmVGbG93TWF0ZXJpYWxQcm9wZXJ0eSh7XHJcbiAgICAgIC8vICAgY29sb3I6IGNvbG9yLFxyXG4gICAgICAvLyAgIHVUeXBlOiAwLFxyXG4gICAgICAvLyAgIHNwZWVkOiBuZXdQYXJhbS5yb3RhdGUgPyBuZXdQYXJhbS5zcGVlZCA6IDAgLSBuZXdQYXJhbS5zcGVlZCxcclxuICAgICAgLy8gICAvLyBkYXNoU2l6ZTogbmV3UGFyYW0uZGFzaFNpemUsXHJcbiAgICAgIC8vICAgc3BhY2U6IG5ld1BhcmFtLnNwYWNlLFxyXG4gICAgICAvLyAgIHNjYWxlOiAxLjBcclxuICAgICAgLy8gfSlcclxuICAgICAgLy8gYnJlYWtcclxuICAgICAgY2FzZSA2OiAvL+a1geWKqOiZmue6vzJcclxuICAgICAgICBsZXQgdGhhdCA9IHRoaXNcclxuICAgICAgICBsZXQgcmVwZWF0WFxyXG4gICAgICAgIG1hdGVyaWFsID0gbmV3IENlc2l1bS5GbG93RGFzaGVkTGluZUZsb3dNYXRlcmlhbFByb3BlcnR5KHtcclxuICAgICAgICAgIGNvbG9yOiBjb2xvcixcclxuICAgICAgICAgIHVUeXBlOiB0eXBlID09IDUgPyAwIDogMSxcclxuICAgICAgICAgIHNwZWVkOiBuZXdQYXJhbS5yb3RhdGUgPyBuZXdQYXJhbS5zcGVlZCA6IDAgLSBuZXdQYXJhbS5zcGVlZCxcclxuICAgICAgICAgIC8vIGRhc2hTaXplOiBuZXdQYXJhbS5kYXNoU2l6ZSxcclxuICAgICAgICAgIHNwYWNlOiBuZXdQYXJhbS5zcGFjZSxcclxuICAgICAgICAgIHNjYWxlOiBuZXcgQ2VzaXVtLkNhbGxiYWNrUHJvcGVydHkoZnVuY3Rpb24gKCkge1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoYXQuc2RrLnZpZXdlci5zY2VuZS5tb2RlID09PSBDZXNpdW0uU2NlbmVNb2RlLlNDRU5FM0QpIHtcclxuICAgICAgICAgICAgICBsZXQgb3JpUG9zaXRpb25zID0gZW50aXR5LnBvbHlsaW5lLnBvc2l0aW9ucy5nZXRWYWx1ZSgpO1xyXG5cclxuICAgICAgICAgICAgICBpZiAoIUNlc2l1bS5kZWZpbmVkKG9yaVBvc2l0aW9ucykpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAxLjA7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGxldCBkaXN0YW5jZSA9IDA7XHJcbiAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvcmlQb3NpdGlvbnMubGVuZ3RoIC0gMTsgKytpKSB7XHJcbiAgICAgICAgICAgICAgICBkaXN0YW5jZSArPSBDZXNpdW0uQ2FydGVzaWFuMy5kaXN0YW5jZShvcmlQb3NpdGlvbnNbaV0sIG9yaVBvc2l0aW9uc1tpICsgMV0pO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAvL+Wxj+W5leWdkOagh1xyXG4gICAgICAgICAgICAgIGxldCBwb2ludDEgPSBuZXcgQ2VzaXVtLkNhcnRlc2lhbjIoMCwgdGhhdC5zZGsudmlld2VyLmNhbnZhcy5jbGllbnRIZWlnaHQpXHJcbiAgICAgICAgICAgICAgbGV0IHBvaW50MiA9IG5ldyBDZXNpdW0uQ2FydGVzaWFuMih0aGF0LnNkay52aWV3ZXIuY2FudmFzLmNsaWVudFdpZHRoIC8gMiwgdGhhdC5zZGsudmlld2VyLmNhbnZhcy5jbGllbnRIZWlnaHQpXHJcbiAgICAgICAgICAgICAgbGV0IGNhcnRlc2lhbjEgPSB0aGF0LnNkay52aWV3ZXIuc2NlbmUucGlja1Bvc2l0aW9uKHBvaW50MSlcclxuICAgICAgICAgICAgICBsZXQgY2FydGVzaWFuMiA9IHRoYXQuc2RrLnZpZXdlci5zY2VuZS5waWNrUG9zaXRpb24ocG9pbnQyKVxyXG4gICAgICAgICAgICAgIGlmIChjYXJ0ZXNpYW4xICYmIGNhcnRlc2lhbjIpIHtcclxuICAgICAgICAgICAgICAgIGxldCBkaXN0YW5jZTIgPSBDZXNpdW0uQ2FydGVzaWFuMy5kaXN0YW5jZShjYXJ0ZXNpYW4xLCBjYXJ0ZXNpYW4yKTtcclxuICAgICAgICAgICAgICAgIHJlcGVhdFggPSBkaXN0YW5jZTIgKiAyIC8gZGlzdGFuY2VcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgcmV0dXJuIHJlcGVhdFg7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgbGV0IHNkazNkID0gZ2V0M0RWaWV3KClcclxuICAgICAgICAgICAgICBsZXQgc2RrM2RFbnRpdHkgPSBzZGszZC52aWV3ZXIuZW50aXRpZXMuZ2V0QnlJZCh0aGF0Lm9wdGlvbnMuaWQpXHJcbiAgICAgICAgICAgICAgbGV0IG9yaVBvc2l0aW9ucyA9IHNkazNkRW50aXR5LnBvbHlsaW5lLnBvc2l0aW9ucy5nZXRWYWx1ZSgpO1xyXG5cclxuICAgICAgICAgICAgICBpZiAoIUNlc2l1bS5kZWZpbmVkKG9yaVBvc2l0aW9ucykpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAxLjA7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGxldCBkaXN0YW5jZSA9IDA7XHJcbiAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvcmlQb3NpdGlvbnMubGVuZ3RoIC0gMTsgKytpKSB7XHJcbiAgICAgICAgICAgICAgICBkaXN0YW5jZSArPSBDZXNpdW0uQ2FydGVzaWFuMy5kaXN0YW5jZShvcmlQb3NpdGlvbnNbaV0sIG9yaVBvc2l0aW9uc1tpICsgMV0pO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAvL+Wxj+W5leWdkOagh1xyXG4gICAgICAgICAgICAgIGxldCBwb2ludDEgPSBuZXcgQ2VzaXVtLkNhcnRlc2lhbjIoMCwgc2RrM2Qudmlld2VyLmNhbnZhcy5jbGllbnRIZWlnaHQpXHJcbiAgICAgICAgICAgICAgbGV0IHBvaW50MiA9IG5ldyBDZXNpdW0uQ2FydGVzaWFuMihzZGszZC52aWV3ZXIuY2FudmFzLmNsaWVudFdpZHRoIC8gMiwgc2RrM2Qudmlld2VyLmNhbnZhcy5jbGllbnRIZWlnaHQpXHJcbiAgICAgICAgICAgICAgbGV0IGNhcnRlc2lhbjEgPSBzZGszZC52aWV3ZXIuc2NlbmUucGlja1Bvc2l0aW9uKHBvaW50MSlcclxuICAgICAgICAgICAgICBsZXQgY2FydGVzaWFuMiA9IHNkazNkLnZpZXdlci5zY2VuZS5waWNrUG9zaXRpb24ocG9pbnQyKVxyXG4gICAgICAgICAgICAgIGlmIChjYXJ0ZXNpYW4xICYmIGNhcnRlc2lhbjIpIHtcclxuICAgICAgICAgICAgICAgIGxldCBkaXN0YW5jZTIgPSBDZXNpdW0uQ2FydGVzaWFuMy5kaXN0YW5jZShjYXJ0ZXNpYW4xLCBjYXJ0ZXNpYW4yKTtcclxuICAgICAgICAgICAgICAgIHJlcGVhdFggPSBkaXN0YW5jZTIgKiAyIC8gZGlzdGFuY2VcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgcmV0dXJuIHJlcGVhdFg7XHJcbiAgICAgICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgICAgfSlcclxuICAgICAgICB9KVxyXG5cclxuICAgICAgICBicmVha1xyXG4gICAgICBjYXNlIDc6IC8v5rWB5Yqo566t5aS0MVxyXG4gICAgICBjYXNlIDg6IC8v5rWB5Yqo566t5aS0MlxyXG4gICAgICBjYXNlIDk6IC8v5rWB5Yqo566t5aS0M1xyXG4gICAgICBjYXNlIDEwOiAvL+a1geWKqOeureWktDRcclxuICAgICAgY2FzZSAxMTogLy/mtYHliqjnrq3lpLQ1XHJcbiAgICAgIGNhc2UgMTI6IC8v5rWB5Yqo566t5aS0NlxyXG4gICAgICAgIGxldCBwYXJhbSA9IHtcclxuICAgICAgICAgIGNvbG9yOiBjb2xvcixcclxuICAgICAgICAgIGltYWdlOiB0aGlzLmdldFNvdXJjZVJvb3RQYXRoKCkgKyBgL2ltZy9hcnJvdy8ke3R5cGUgLSA2fS5wbmdgLFxyXG4gICAgICAgICAgc3BhY2U6IG5ld1BhcmFtLnNwYWNlLFxyXG4gICAgICAgICAgc3BlZWQ6IG5ld1BhcmFtLnNwZWVkXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBwYXJhbS5zcGVlZCA9IG5ld1BhcmFtLnJvdGF0ZSA/IHBhcmFtLnNwZWVkIDogMCAtIHBhcmFtLnNwZWVkXHJcblxyXG4gICAgICAgIHRoaXMuZ2V0Rmxvd1RleHR1cmUodGhpcywgcGFyYW0sIGVudGl0eSlcclxuXHJcbiAgICAgICAgYnJlYWtcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBtYXRlcmlhbCA9IENlc2l1bS5Db2xvci5mcm9tQ3NzQ29sb3JTdHJpbmcoY29sb3IpXHJcbiAgICAgICAgYnJlYWtcclxuICAgIH1cclxuICAgIHJldHVybiBtYXRlcmlhbFxyXG4gIH1cclxuXHJcbiAgZ2V0Rmxvd1RleHR1cmUodGhhdCwgb3B0aW9ucywgZW50aXR5KSB7XHJcblxyXG4gICAgY29uc3QgY2FudmFzRWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XHJcbiAgICBjb25zdCBjdHggPSBjYW52YXNFbGUuZ2V0Q29udGV4dCgnMmQnKVxyXG4gICAgY29uc3QgbXlJbWcgPSBuZXcgSW1hZ2UoKVxyXG4gICAgLy8gbXlJbWcuc3JjID0gdGhhdC5nZXRTb3VyY2VSb290UGF0aCgpICsgJy9pbWcvYXJyb3cvMS5wbmcnXHJcbiAgICBteUltZy5zcmMgPSBvcHRpb25zLmltYWdlXHJcbiAgICBteUltZy5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgIG9wdGlvbnMuc3BhY2UgPSBNYXRoLm1heCgwLjEsIG9wdGlvbnMuc3BhY2UpO1xyXG4gICAgICBpZiAob3B0aW9ucy5zcGVlZCA+IDAgfHwgb3B0aW9ucy5zcGVlZCA9PSAwKSB7XHJcbiAgICAgICAgY2FudmFzRWxlLndpZHRoID0gbXlJbWcud2lkdGggKiAob3B0aW9ucy5zcGFjZSArIDEpXHJcbiAgICAgICAgY2FudmFzRWxlLmhlaWdodCA9IG15SW1nLmhlaWdodFxyXG4gICAgICAgIGN0eC5kcmF3SW1hZ2UobXlJbWcsIG15SW1nLndpZHRoICogKG9wdGlvbnMuc3BhY2UgLyAyKSwgMClcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjdHguY2xlYXJSZWN0KDAsIDAsIGNhbnZhc0VsZS53aWR0aCwgY2FudmFzRWxlLmhlaWdodCk7XHJcbiAgICAgICAgY2FudmFzRWxlLndpZHRoID0gbXlJbWcud2lkdGggKiAob3B0aW9ucy5zcGFjZSArIDEpXHJcbiAgICAgICAgY2FudmFzRWxlLmhlaWdodCA9IG15SW1nLmhlaWdodFxyXG4gICAgICAgIGN0eC5zYXZlKCk7IC8vIOS/neWtmOW9k+WJjeeKtuaAgVxyXG4gICAgICAgIGN0eC50cmFuc2xhdGUoY2FudmFzRWxlLndpZHRoIC8gMiwgY2FudmFzRWxlLmhlaWdodCAvIDIpOyAvLyDnp7vliqjljp/ngrnoh7PkuK3lv4NcclxuICAgICAgICBjdHgucm90YXRlKE1hdGguUEkpOyAvLyDvvIjlvKfluqbliLbvvIlcclxuICAgICAgICBjdHgudHJhbnNsYXRlKC1jYW52YXNFbGUud2lkdGggLyAyLCAtY2FudmFzRWxlLmhlaWdodCAvIDIpOyAvLyDnp7vlm57ljp/ngrlcclxuICAgICAgICBjdHguZHJhd0ltYWdlKG15SW1nLCBteUltZy53aWR0aCAqIChvcHRpb25zLnNwYWNlIC8gMiksIDApXHJcbiAgICAgICAgY3R4LnJlc3RvcmUoKTsgLy8g5oGi5aSN54q25oCBXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIGxldCByZXBlYXQgPSBnZXRSZXBlYXQoKVxyXG4gICAgICAvLyB9LCBmYWxzZSlcclxuICAgICAgLy8gZW50aXR5LnBvbHlsaW5lLm1hdGVyaWFsLm9yaVJlcGVhdCA9IHRoYXQuZ2V0U2NlZW5MaW5lKGVudGl0eSwgb3B0aW9ucywgY2FudmFzRWxlKVxyXG4gICAgICAvLyBlbnRpdHkucG9seWxpbmUubWF0ZXJpYWwub3JpU3BlZWQgPSB1bmRlZmluZWRcclxuICAgICAgbGV0IGJlZm9yZVNwZWVkID0gMCwgcmVwZWF0ID0gMFxyXG4gICAgICBlbnRpdHkucG9seWxpbmUubWF0ZXJpYWwgPSBuZXcgQ2VzaXVtLkxpbmVUZXh0dXJlTWF0ZXJpYWxQcm9wZXJ0eShcclxuICAgICAgICB7XHJcbiAgICAgICAgICBjb2xvcjogb3B0aW9ucy5jb2xvcixcclxuICAgICAgICAgIGltYWdlOiBjYW52YXNFbGUsXHJcbiAgICAgICAgICBzcGVlZDogb3B0aW9ucy5zcGVlZCxcclxuICAgICAgICAgIHJlcGVhdDogbmV3IENlc2l1bS5DYWxsYmFja1Byb3BlcnR5KGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGF0LnNkay52aWV3ZXIuc2NlbmUubW9kZSA9PT0gQ2VzaXVtLlNjZW5lTW9kZS5TQ0VORTNEKSB7XHJcbiAgICAgICAgICAgICAgbGV0IHBvc2l0aW9uUHJvcGVydHkgPSBlbnRpdHkucG9seWxpbmUucG9zaXRpb25zO1xyXG4gICAgICAgICAgICAgIGxldCBwb3NpdGlvbnMgPSBwb3NpdGlvblByb3BlcnR5LmdldFZhbHVlKHRoYXQuc2RrLnZpZXdlci5jbG9jay5jdXJyZW50VGltZSk7XHJcblxyXG4gICAgICAgICAgICAgIGlmICghQ2VzaXVtLmRlZmluZWQocG9zaXRpb25zKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDZXNpdW0uQ2FydGVzaWFuMigxLjAsIDEuMCk7XHJcbiAgICAgICAgICAgICAgICAvLyByZXR1cm4gMS4wO1xyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgbGV0IGRpc3RhbmNlID0gMDtcclxuICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGggLSAxOyArK2kpIHtcclxuICAgICAgICAgICAgICAgIC8vIGlmICh0aGF0LnNkay52aWV3ZXIuc2NlbmUubW9kZT09PUNlc2l1bS5TY2VuZU1vZGUuU0NFTkUyRCl7fVxyXG4gICAgICAgICAgICAgICAgZGlzdGFuY2UgKz0gQ2VzaXVtLkNhcnRlc2lhbjMuZGlzdGFuY2UocG9zaXRpb25zW2ldLCBwb3NpdGlvbnNbaSArIDFdKTtcclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgIGxldCByZXBlYXRYID0gZGlzdGFuY2UgLyBlbnRpdHkucG9seWxpbmUud2lkdGguZ2V0VmFsdWUoKTtcclxuICAgICAgICAgICAgICAvLyDmoLnmja7lnLDlm77nvKnmlL7nqIvluqbosIPmlbRyZXBlYXRYXHJcbiAgICAgICAgICAgICAgbGV0IGNhbWVyYUhlaWdodCA9IHRoYXQuc2RrLnZpZXdlci5jYW1lcmEucG9zaXRpb25DYXJ0b2dyYXBoaWMuaGVpZ2h0O1xyXG4gICAgICAgICAgICAgIGxldCBib3VuZGluZ1NwaGVyZSA9IG5ldyBDZXNpdW0uQm91bmRpbmdTcGhlcmUoXHJcbiAgICAgICAgICAgICAgICBuZXcgQ2VzaXVtLkNhcnRlc2lhbjMoLTEwMDAwMDAsIDAsIDApLCAvLyDkuK3lv4PngrnlnZDmoIdcclxuICAgICAgICAgICAgICAgIDUwMDAwMCAvLyDljYrlvoTvvIjot53nprvvvIlcclxuICAgICAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgICAgICAvLyDojrflj5bnu5jlm77nvJPlhrLljLrnmoTlrr3luqblkozpq5jluqbvvIjpgJrluLjmmK/lsY/luZXnmoTliIbovqjnjofvvIlcclxuICAgICAgICAgICAgICBsZXQgZHJhd2luZ0J1ZmZlcldpZHRoID0gdGhhdC5zZGsudmlld2VyLmNhbnZhcy5jbGllbnRXaWR0aDtcclxuICAgICAgICAgICAgICBsZXQgZHJhd2luZ0J1ZmZlckhlaWdodCA9IHRoYXQuc2RrLnZpZXdlci5jYW52YXMuY2xpZW50SGVpZ2h0O1xyXG5cclxuICAgICAgICAgICAgICAvLyDkvb/nlKggZ2V0UGl4ZWxTaXplIOaWueazleiOt+WPluWMheWbtOeQg+WcqOWxj+W5leS4iueahOWDj+e0oOWkp+Wwj1xyXG4gICAgICAgICAgICAgIGxldCBncm91bmRSZXNvbHV0aW9uID0gdGhhdC5zZGsudmlld2VyLnNjZW5lLmNhbWVyYS5nZXRQaXhlbFNpemUoYm91bmRpbmdTcGhlcmUsIGRyYXdpbmdCdWZmZXJXaWR0aCwgZHJhd2luZ0J1ZmZlckhlaWdodClcclxuICAgICAgICAgICAgICBsZXQgcmVzdWx0XHJcbiAgICAgICAgICAgICAgaWYgKGdyb3VuZFJlc29sdXRpb24gPiA3MDApIHtcclxuICAgICAgICAgICAgICAgIHJlcGVhdFggKj0gZ3JvdW5kUmVzb2x1dGlvbiAvIGNhbWVyYUhlaWdodCAvIChvcHRpb25zLnNwYWNlICogKGNhbnZhc0VsZS53aWR0aCAvIGNhbnZhc0VsZS5oZWlnaHQgKiA1KSArIDEpO1xyXG4gICAgICAgICAgICAgICAgLy8gaWYgKGVudGl0eS5wb2x5bGluZS5tYXRlcmlhbC5vcmlSZXBlYXQpIHtcclxuICAgICAgICAgICAgICAgIGxldCBzcGVlZCA9IHJlcGVhdFggLyBlbnRpdHkucG9seWxpbmUub3JpUmVwZWF0XHJcbiAgICAgICAgICAgICAgICBlbnRpdHkucG9seWxpbmUub3JpU3BlZWQgPSBzcGVlZFxyXG4gICAgICAgICAgICAgICAgZW50aXR5LnBvbHlsaW5lLm9yaVJlcGVhdFggPSByZXBlYXRYXHJcbiAgICAgICAgICAgICAgICAvLyB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gICBlbnRpdHkucG9seWxpbmUubWF0ZXJpYWwub3JpUmVwZWF0ID0gcmVwZWF0WFxyXG4gICAgICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgICAgICAgYmVmb3JlU3BlZWQgPSBzcGVlZFxyXG4gICAgICAgICAgICAgICAgcmVwZWF0ID0gcmVwZWF0WFxyXG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IENlc2l1bS5DYXJ0ZXNpYW4yKHJlcGVhdFgsIHNwZWVkIHx8IDEuMClcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IENlc2l1bS5DYXJ0ZXNpYW4yKHJlcGVhdCB8fCBlbnRpdHkucG9seWxpbmUub3JpUmVwZWF0WCwgYmVmb3JlU3BlZWQgfHwgZW50aXR5LnBvbHlsaW5lLm9yaVNwZWVkKVxyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuXHJcblxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIGxldCBzZGszZCA9IGdldDNEVmlldygpXHJcbiAgICAgICAgICAgICAgbGV0IHNkazNkRW50aXR5ID0gc2RrM2Qudmlld2VyLmVudGl0aWVzLmdldEJ5SWQodGhhdC5vcHRpb25zLmlkKVxyXG4gICAgICAgICAgICAgIGxldCBwb3NpdGlvblByb3BlcnR5ID0gc2RrM2RFbnRpdHkucG9seWxpbmUucG9zaXRpb25zO1xyXG4gICAgICAgICAgICAgIGxldCBwb3NpdGlvbnMgPSBwb3NpdGlvblByb3BlcnR5LmdldFZhbHVlKHNkazNkLnZpZXdlci5jbG9jay5jdXJyZW50VGltZSk7XHJcblxyXG4gICAgICAgICAgICAgIGlmICghQ2VzaXVtLmRlZmluZWQocG9zaXRpb25zKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDZXNpdW0uQ2FydGVzaWFuMigxLjAsIDEuMCk7XHJcbiAgICAgICAgICAgICAgICAvLyByZXR1cm4gMS4wO1xyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgbGV0IGRpc3RhbmNlID0gMDtcclxuICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGggLSAxOyArK2kpIHtcclxuICAgICAgICAgICAgICAgIC8vIGlmICh0aGF0LnNkay52aWV3ZXIuc2NlbmUubW9kZT09PUNlc2l1bS5TY2VuZU1vZGUuU0NFTkUyRCl7fVxyXG4gICAgICAgICAgICAgICAgZGlzdGFuY2UgKz0gQ2VzaXVtLkNhcnRlc2lhbjMuZGlzdGFuY2UocG9zaXRpb25zW2ldLCBwb3NpdGlvbnNbaSArIDFdKTtcclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgIGxldCByZXBlYXRYID0gZGlzdGFuY2UgLyBzZGszZEVudGl0eS5wb2x5bGluZS53aWR0aC5nZXRWYWx1ZSgpO1xyXG4gICAgICAgICAgICAgIC8vIOagueaNruWcsOWbvue8qeaUvueoi+W6puiwg+aVtHJlcGVhdFhcclxuICAgICAgICAgICAgICBsZXQgY2FtZXJhSGVpZ2h0ID0gc2RrM2Qudmlld2VyLmNhbWVyYS5wb3NpdGlvbkNhcnRvZ3JhcGhpYy5oZWlnaHQ7XHJcbiAgICAgICAgICAgICAgbGV0IGJvdW5kaW5nU3BoZXJlID0gbmV3IENlc2l1bS5Cb3VuZGluZ1NwaGVyZShcclxuICAgICAgICAgICAgICAgIG5ldyBDZXNpdW0uQ2FydGVzaWFuMygtMTAwMDAwMCwgMCwgMCksIC8vIOS4reW/g+eCueWdkOagh1xyXG4gICAgICAgICAgICAgICAgNTAwMDAwIC8vIOWNiuW+hO+8iOi3neemu++8iVxyXG4gICAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgICAgIC8vIOiOt+WPlue7mOWbvue8k+WGsuWMuueahOWuveW6puWSjOmrmOW6pu+8iOmAmuW4uOaYr+Wxj+W5leeahOWIhui+qOeOh++8iVxyXG4gICAgICAgICAgICAgIGxldCBkcmF3aW5nQnVmZmVyV2lkdGggPSBzZGszZC52aWV3ZXIuY2FudmFzLmNsaWVudFdpZHRoO1xyXG4gICAgICAgICAgICAgIGxldCBkcmF3aW5nQnVmZmVySGVpZ2h0ID0gc2RrM2Qudmlld2VyLmNhbnZhcy5jbGllbnRIZWlnaHQ7XHJcblxyXG4gICAgICAgICAgICAgIC8vIOS9v+eUqCBnZXRQaXhlbFNpemUg5pa55rOV6I635Y+W5YyF5Zu055CD5Zyo5bGP5bmV5LiK55qE5YOP57Sg5aSn5bCPXHJcbiAgICAgICAgICAgICAgbGV0IGdyb3VuZFJlc29sdXRpb24gPSBzZGszZC52aWV3ZXIuc2NlbmUuY2FtZXJhLmdldFBpeGVsU2l6ZShib3VuZGluZ1NwaGVyZSwgZHJhd2luZ0J1ZmZlcldpZHRoLCBkcmF3aW5nQnVmZmVySGVpZ2h0KVxyXG4gICAgICAgICAgICAgIGxldCByZXN1bHRcclxuICAgICAgICAgICAgICBpZiAoZ3JvdW5kUmVzb2x1dGlvbiA+IDcwMCkge1xyXG4gICAgICAgICAgICAgICAgcmVwZWF0WCAqPSBncm91bmRSZXNvbHV0aW9uIC8gY2FtZXJhSGVpZ2h0IC8gKG9wdGlvbnMuc3BhY2UgKiAoY2FudmFzRWxlLndpZHRoIC8gY2FudmFzRWxlLmhlaWdodCAqIDUpICsgMSk7XHJcbiAgICAgICAgICAgICAgICAvLyBpZiAoZW50aXR5LnBvbHlsaW5lLm1hdGVyaWFsLm9yaVJlcGVhdCkge1xyXG4gICAgICAgICAgICAgICAgbGV0IHNwZWVkID0gcmVwZWF0WCAvIHNkazNkRW50aXR5LnBvbHlsaW5lLm9yaVJlcGVhdFxyXG4gICAgICAgICAgICAgICAgc2RrM2RFbnRpdHkucG9seWxpbmUub3JpU3BlZWQgPSBzcGVlZFxyXG4gICAgICAgICAgICAgICAgc2RrM2RFbnRpdHkucG9seWxpbmUub3JpUmVwZWF0WCA9IHJlcGVhdFhcclxuICAgICAgICAgICAgICAgIC8vIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyAgIGVudGl0eS5wb2x5bGluZS5tYXRlcmlhbC5vcmlSZXBlYXQgPSByZXBlYXRYXHJcbiAgICAgICAgICAgICAgICAvLyB9XHJcbiAgICAgICAgICAgICAgICBiZWZvcmVTcGVlZCA9IHNwZWVkXHJcbiAgICAgICAgICAgICAgICByZXBlYXQgPSByZXBlYXRYXHJcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgQ2VzaXVtLkNhcnRlc2lhbjIocmVwZWF0WCwgc3BlZWQgfHwgMS4wKVxyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgQ2VzaXVtLkNhcnRlc2lhbjIocmVwZWF0IHx8IHNkazNkRW50aXR5LnBvbHlsaW5lLm9yaVJlcGVhdFgsIGJlZm9yZVNwZWVkIHx8IHNkazNkRW50aXR5LnBvbHlsaW5lLm9yaVNwZWVkKVxyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICAgICAgfVxyXG5cclxuXHJcblxyXG4gICAgICAgICAgICAvLyByZXR1cm4gcmVwZWF0WDtcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG4gICAgICApXHJcbiAgICAgIGxldCBvcmlSZXBlYXQgPSB0aGF0LmdldFNjZWVuTGluZShlbnRpdHksIG9wdGlvbnMsIGNhbnZhc0VsZSlcclxuICAgICAgb3JpUmVwZWF0ICYmIChlbnRpdHkucG9seWxpbmUub3JpUmVwZWF0ID0gb3JpUmVwZWF0KVxyXG4gICAgfVxyXG4gIH1cclxuICAvKirojrflj5blvZPliY3mu6HlsY/mqKrnur/pgJ/luqYgKi9cclxuICBnZXRTY2VlbkxpbmUoZW50aXR5LCBvcHRpb25zLCBjYW52YXNFbGUpIHtcclxuICAgIGxldCBwb2ludDEgPSBuZXcgQ2VzaXVtLkNhcnRlc2lhbjIoMCwgdGhpcy5zZGsudmlld2VyLmNhbnZhcy5jbGllbnRIZWlnaHQpXHJcbiAgICBsZXQgcG9pbnQyID0gbmV3IENlc2l1bS5DYXJ0ZXNpYW4yKHRoaXMuc2RrLnZpZXdlci5jYW52YXMuY2xpZW50V2lkdGggLyAyLCB0aGlzLnNkay52aWV3ZXIuY2FudmFzLmNsaWVudEhlaWdodClcclxuICAgIC8vIHZhciBjYXJ0ZXNpYW4xID0gdGhpcy5zZGsudmlld2VyLnNjZW5lLnBpY2tQb3NpdGlvbihwb2ludDEpXHJcbiAgICAvLyB2YXIgY2FydGVzaWFuMiA9IHRoaXMuc2RrLnZpZXdlci5zY2VuZS5waWNrUG9zaXRpb24ocG9pbnQyKVxyXG4gICAgbGV0IHJheSA9IHRoaXMuc2RrLnZpZXdlci5jYW1lcmEuZ2V0UGlja1JheShwb2ludDEpO1xyXG4gICAgbGV0IGNhcnRlc2lhbjEgPSB0aGlzLnNkay52aWV3ZXIuc2NlbmUuZ2xvYmUucGljayhyYXksIHRoaXMuc2RrLnZpZXdlci5zY2VuZSk7XHJcblxyXG4gICAgbGV0IHJheTIgPSB0aGlzLnNkay52aWV3ZXIuY2FtZXJhLmdldFBpY2tSYXkocG9pbnQyKTtcclxuICAgIGxldCBjYXJ0ZXNpYW4yID0gdGhpcy5zZGsudmlld2VyLnNjZW5lLmdsb2JlLnBpY2socmF5MiwgdGhpcy5zZGsudmlld2VyLnNjZW5lKTtcclxuICAgIGlmIChjYXJ0ZXNpYW4xICYmIGNhcnRlc2lhbjIpIHtcclxuICAgICAgdmFyIGRpc3RhbmNlID0gQ2VzaXVtLkNhcnRlc2lhbjMuZGlzdGFuY2UoY2FydGVzaWFuMSwgY2FydGVzaWFuMik7XHJcblxyXG4gICAgICB2YXIgcmVwZWF0WCA9IGRpc3RhbmNlIC8gZW50aXR5LnBvbHlsaW5lLndpZHRoLmdldFZhbHVlKCk7XHJcbiAgICAgIC8vIOagueaNruWcsOWbvue8qeaUvueoi+W6puiwg+aVtHJlcGVhdFhcclxuICAgICAgdmFyIGNhbWVyYUhlaWdodCA9IHRoaXMuc2RrLnZpZXdlci5jYW1lcmEucG9zaXRpb25DYXJ0b2dyYXBoaWMuaGVpZ2h0O1xyXG4gICAgICB2YXIgYm91bmRpbmdTcGhlcmUgPSBuZXcgQ2VzaXVtLkJvdW5kaW5nU3BoZXJlKFxyXG4gICAgICAgIG5ldyBDZXNpdW0uQ2FydGVzaWFuMygtMTAwMDAwMCwgMCwgMCksIC8vIOS4reW/g+eCueWdkOagh1xyXG4gICAgICAgIDUwMDAwMCAvLyDljYrlvoTvvIjot53nprvvvIlcclxuICAgICAgKTtcclxuXHJcbiAgICAgIC8vIOiOt+WPlue7mOWbvue8k+WGsuWMuueahOWuveW6puWSjOmrmOW6pu+8iOmAmuW4uOaYr+Wxj+W5leeahOWIhui+qOeOh++8iVxyXG4gICAgICB2YXIgZHJhd2luZ0J1ZmZlcldpZHRoID0gdGhpcy5zZGsudmlld2VyLmNhbnZhcy5jbGllbnRXaWR0aDtcclxuICAgICAgdmFyIGRyYXdpbmdCdWZmZXJIZWlnaHQgPSB0aGlzLnNkay52aWV3ZXIuY2FudmFzLmNsaWVudEhlaWdodDtcclxuXHJcbiAgICAgIC8vIOS9v+eUqCBnZXRQaXhlbFNpemUg5pa55rOV6I635Y+W5YyF5Zu055CD5Zyo5bGP5bmV5LiK55qE5YOP57Sg5aSn5bCPXHJcbiAgICAgIHZhciBncm91bmRSZXNvbHV0aW9uID0gdGhpcy5zZGsudmlld2VyLnNjZW5lLmNhbWVyYS5nZXRQaXhlbFNpemUoYm91bmRpbmdTcGhlcmUsIGRyYXdpbmdCdWZmZXJXaWR0aCwgZHJhd2luZ0J1ZmZlckhlaWdodClcclxuICAgICAgLy8gcmVwZWF0WCAqPSBncm91bmRSZXNvbHV0aW9uIC8gY2FtZXJhSGVpZ2h0IC8gKChteUltZy53aWR0aCAvIG15SW1nLmhlaWdodCAqIDUpICsgMSk7XHJcbiAgICAgIGlmIChncm91bmRSZXNvbHV0aW9uID4gNzAwKSB7XHJcbiAgICAgICAgcmVwZWF0WCAqPSBncm91bmRSZXNvbHV0aW9uIC8gY2FtZXJhSGVpZ2h0IC8gKG9wdGlvbnMuc3BhY2UgKiAoY2FudmFzRWxlLndpZHRoIC8gY2FudmFzRWxlLmhlaWdodCAqIDUpICsgMSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmVwZWF0WCA9IHVuZGVmaW5lZDtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHRoaXMuc2RrLnZpZXdlci5zY2VuZS5tb2RlID09PSBDZXNpdW0uU2NlbmVNb2RlLlNDRU5FM0QpIHtcclxuICAgICAgICByZXR1cm4gcmVwZWF0WFxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGxldCBzZGszZCA9IGdldDNEVmlldygpXHJcbiAgICAgICAgbGV0IHNkazNkRW50aXR5ID0gc2RrM2Qudmlld2VyLmVudGl0aWVzLmdldEJ5SWQodGhpcy5vcHRpb25zLmlkKVxyXG4gICAgICAgIHJldHVybiBzZGszZEVudGl0eS5wb2x5bGluZS5vcmlSZXBlYXRYXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8q5Yib5bu655u0566t5aS05Zu+54mHKi9cclxuICBjcmVhdGVfYXJyb3cxX3BpY3R1cmUoY29sb3IpIHtcclxuICAgIGxldCBjYW52YXMgPSBuZXcgZmFicmljLkNhbnZhcygnY2FudmFzJylcclxuICAgIGNhbnZhcy53aWR0aCA9IDE1MFxyXG4gICAgY2FudmFzLmhlaWdodCA9IDc1XHJcbiAgICBsZXQgd19vZmZzZXQgPSAzNVxyXG4gICAgbGV0IGhfb2Zmc2V0ID0gMjBcclxuICAgIGxldCBmaWxsID0gY29sb3JcclxuICAgIGxldCBwb2x5Z29uID0gbmV3IGZhYnJpYy5Qb2x5Z29uKFxyXG4gICAgICBbXHJcbiAgICAgICAgeyB4OiBjYW52YXMud2lkdGgsIHk6IGNhbnZhcy5oZWlnaHQgLyAyIH0sIC8v566t5aS05Y+z6L656aG254K5XHJcbiAgICAgICAgeyB4OiBjYW52YXMud2lkdGggLSB3X29mZnNldCwgeTogY2FudmFzLmhlaWdodCB9LCAvL+mhuuaXtumSiFxyXG4gICAgICAgIHsgeDogY2FudmFzLndpZHRoIC0gd19vZmZzZXQsIHk6IGNhbnZhcy5oZWlnaHQgLSBoX29mZnNldCB9LCAvL1xyXG4gICAgICAgIHsgeDogY2FudmFzLndpZHRoIC8gMiwgeTogY2FudmFzLmhlaWdodCAtIGhfb2Zmc2V0IH0sIC8vXHJcbiAgICAgICAgeyB4OiBjYW52YXMud2lkdGggLyAyLCB5OiBoX29mZnNldCB9LCAvL1xyXG4gICAgICAgIHsgeDogY2FudmFzLndpZHRoIC0gd19vZmZzZXQsIHk6IGhfb2Zmc2V0IH0sIC8vXHJcbiAgICAgICAgeyB4OiBjYW52YXMud2lkdGggLSB3X29mZnNldCwgeTogMCB9LCAvL1xyXG4gICAgICBdLFxyXG4gICAgICB7XHJcbiAgICAgICAgZmlsbCxcclxuICAgICAgfVxyXG4gICAgKVxyXG4gICAgY2FudmFzLmFkZChwb2x5Z29uKVxyXG5cclxuICAgIHJldHVybiBjYW52YXMudG9EYXRhVVJMKClcclxuICB9XHJcblxyXG4gIC8q5Yib5bu6566t5aS05Zu+54mHKi9cclxuXHJcbiAgY3JlYXRlX2Fycm93Ml9waWN0dXJlKGNvbG9yKSB7XHJcbiAgICBsZXQgY2FudmFzID0gbmV3IGZhYnJpYy5DYW52YXMoJ2NhbnZhcycpXHJcbiAgICBjYW52YXMud2lkdGggPSA3NVxyXG4gICAgY2FudmFzLmhlaWdodCA9IDc1XHJcbiAgICBsZXQgd19vZmZzZXQxID0gMzVcclxuICAgIGxldCB3X29mZnNldDIgPSA0MFxyXG4gICAgbGV0IGZpbGwgPSBjb2xvclxyXG4gICAgbGV0IHBvbHlnb24gPSBuZXcgZmFicmljLlBvbHlnb24oXHJcbiAgICAgIFtcclxuICAgICAgICB7IHg6IGNhbnZhcy53aWR0aCwgeTogY2FudmFzLmhlaWdodCAvIDIgfSxcclxuICAgICAgICB7IHg6IGNhbnZhcy53aWR0aCAtIHdfb2Zmc2V0MSwgeTogY2FudmFzLmhlaWdodCB9LFxyXG4gICAgICAgIHsgeDogY2FudmFzLndpZHRoIC0gd19vZmZzZXQxIC0gd19vZmZzZXQyLCB5OiBjYW52YXMuaGVpZ2h0IH0sXHJcbiAgICAgICAgeyB4OiBjYW52YXMud2lkdGggLSB3X29mZnNldDIsIHk6IGNhbnZhcy5oZWlnaHQgLyAyIH0sXHJcbiAgICAgICAgeyB4OiBjYW52YXMud2lkdGggLSB3X29mZnNldDEgLSB3X29mZnNldDIsIHk6IDAgfSxcclxuICAgICAgICB7IHg6IGNhbnZhcy53aWR0aCAtIHdfb2Zmc2V0MSwgeTogMCB9LFxyXG4gICAgICBdLFxyXG4gICAgICB7XHJcbiAgICAgICAgZmlsbCxcclxuICAgICAgfVxyXG4gICAgKVxyXG4gICAgY2FudmFzLmFkZChwb2x5Z29uKVxyXG5cclxuICAgIHJldHVybiBjYW52YXMudG9EYXRhVVJMKClcclxuICB9XHJcblxyXG4gIHNhbXBsZUhlaWdodE1vc3REZXRhaWxlZChwb3NpdGlvbnMpIHtcclxuICAgIGxldCBjYXJ0ZXNpYW5zID0gW11cclxuICAgIHBvc2l0aW9ucy5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgIGNhcnRlc2lhbnMucHVzaChuZXcgQ2VzaXVtLkNhcnRvZ3JhcGhpYy5mcm9tRGVncmVlcyhpdGVtLmxuZywgaXRlbS5sYXQpKVxyXG4gICAgfSlcclxuICAgIHJldHVybiB0aGlzLnNkay52aWV3ZXIuc2NlbmUuc2FtcGxlSGVpZ2h0TW9zdERldGFpbGVkKGNhcnRlc2lhbnMpXHJcbiAgfVxyXG5cclxuICBmbHlIb21lKGR1cmF0aW9uID0gMykge1xyXG4gICAgc2V0QWN0aXZlVmlld2VyKDApXHJcbiAgICBjbG9zZVJvdGF0ZUFyb3VuZCh0aGlzLnNkaylcclxuICAgIGNsb3NlVmlld0ZvbGxvdyh0aGlzLnNkaylcclxuXHJcbiAgICBpZiAodGhpcy5zZGsudmlld2VyLkNBTUVSQV9ERUZBVUxUX1ZJRVdfUkVDVEFOR0xFKSB7XHJcbiAgICAgIGxldCBkZXN0aW5hdGlvbiA9IHRoaXMuc2RrLnZpZXdlci5DQU1FUkFfREVGQVVMVF9WSUVXX1JFQ1RBTkdMRS5kZXN0aW5hdGlvblxyXG4gICAgICBsZXQgb3JpZW50YXRpb24gPSB0aGlzLnNkay52aWV3ZXIuQ0FNRVJBX0RFRkFVTFRfVklFV19SRUNUQU5HTEUub3JpZW50YXRpb25cclxuICAgICAgdGhpcy5zZGsudmlld2VyLmNhbWVyYS5mbHlUbyh7XHJcbiAgICAgICAgZGVzdGluYXRpb246IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzKGRlc3RpbmF0aW9uLmxuZywgZGVzdGluYXRpb24ubGF0LCBkZXN0aW5hdGlvbi5hbHQpLFxyXG4gICAgICAgIG9yaWVudGF0aW9uOiB7XHJcbiAgICAgICAgICBoZWFkaW5nOiBDZXNpdW0uTWF0aC50b1JhZGlhbnMob3JpZW50YXRpb24uaGVhZGluZyB8fCAwKSxcclxuICAgICAgICAgIHBpdGNoOiBDZXNpdW0uTWF0aC50b1JhZGlhbnMob3JpZW50YXRpb24ucGl0Y2ggfHwgMCksXHJcbiAgICAgICAgICByb2xsOiBDZXNpdW0uTWF0aC50b1JhZGlhbnMob3JpZW50YXRpb24ucm9sbCB8fCAwKVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZHVyYXRpb246IGR1cmF0aW9uXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5zZGsudmlld2VyLmNhbWVyYS5mbHlIb21lKGR1cmF0aW9uKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQGRlc2NyaXB0aW9uIOiuvue9ruaLvuWPluaTjeS9nOWQr+WBnFxyXG4gICAqIEBtZXRob2Qgc2V0UGlja1N0YXR1c1xyXG4gICAqIEBwYXJhbSBbc3RhdHVzPXRydWVdIHtib29sZWFufVxyXG4gICAqIEBtZW1iZXJPZiBUb29sc1xyXG4gICAqICovXHJcbiAgc2V0UGlja1N0YXR1cyhzdGF0dXMgPSB0cnVlKSB7XHJcbiAgICAvLyBZSi5nZXRFYXJ0aCgpLmludGVyYWN0aW9uLnBpY2tpbmcuZW5hYmxlZCA9IHN0YXR1c1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQGRlc2NyaXB0aW9uIOWIm+W7uueCuee8k+WGsuWMuiDov5Tlm57nvJPlhrLljLrlnZDmoIdcclxuICAgKiBAbWV0aG9kIGNyZWF0ZV9wb2ludF9idWZmZXJcclxuICAgKiBAcGFyYW0gcG9pbnQge29iamVjdH0g5Z2Q5qCH5Y+C5pWwXHJcbiAgICogQHBhcmFtIFtyYWRpdXM9NV0ge251bWJlcn0g57yT5Yay6Led56a7ICDvvIjljZXkvY3vvJrnsbPvvIlcclxuICAgKiBAcGFyYW0gb3B0aW9uXHJcbiAgICogQHBhcmFtIHBvaW50LmxuZyB7bnVtYmVyfSDnu4/luqZcclxuICAgKiBAcGFyYW0gcG9pbnQubGF0IHtudW1iZXJ9IOe6rOW6plxyXG4gICAqIEBtZW1iZXJPZiBUb29sc1xyXG4gICAqIEByZXR1cm5zIHtBcnJheX0g6L+U5Zue57yT5Yay5Yy65Z2Q5qCH5pWw57uEXHJcbiAgICovXHJcbiAgY3JlYXRlX3BvaW50X2J1ZmZlcihwb2ludCwgcmFkaXVzID0gNSwgb3B0aW9uID0geyBzdGVwczogMTAgfSkge1xyXG4gICAgbGV0IHAgPSB0dXJmLnBvaW50KFtOdW1iZXIocG9pbnQubG5nKSwgTnVtYmVyKHBvaW50LmxhdCldKVxyXG4gICAgbGV0IGJ1ZmZlcmVkID0gdHVyZi5idWZmZXIocCwgTnVtYmVyKHJhZGl1cykgLyAxMDAwLCBvcHRpb24pXHJcbiAgICByZXR1cm4gYnVmZmVyZWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBkZXNjcmlwdGlvbiDliJvlu7rnur/nvJPlhrLljLog6L+U5Zue57yT5Yay5Yy65Z2Q5qCHXHJcbiAgICogQG1ldGhvZCBjcmVhdGVfbGluZV9idWZmZXJcclxuICAgKiBAcGFyYW0gcG9pbnRzIHtBcnJheS48bG5nOlwiXCIsbGF0OlwiXCI+fSDlnZDmoIflj4LmlbBcclxuICAgKiBAcGFyYW0gW3JhZGl1cz01XSB7bnVtYmVyfSDnvJPlhrLot53nprsgIO+8iOWNleS9je+8muexs++8iVxyXG4gICAqIEBtZW1iZXJPZiBUb29sc1xyXG4gICAqIEByZXR1cm5zIHtBcnJheX0g6L+U5Zue57yT5Yay5Yy65Z2Q5qCH5pWw57uEXHJcbiAgICogQGV4YW1wbGUgbGV0IHBvaW50cyA9IFt7bG5nOlwiXCIsbGF0OlwiXCJ9LHtsbmc6XCJcIixsYXQ6XCJcIn0se2xuZzpcIlwiLGxhdDpcIlwifV1cclxuICAgKiBsZXQgcmFkaXVzID0gMTBcclxuICAgKiBsZXQgYXJlYV9idWZmZXIgPSBzZGsuY3JlYXRlX2xpbmVfYnVmZmVyKHBvaW50cyxyYWRpdXMpXHJcbiAgICogKi9cclxuICBjcmVhdGVfbGluZV9idWZmZXIocG9pbnRzLCByYWRpdXMgPSA1KSB7XHJcbiAgICBpZiAocG9pbnRzLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGVfcG9pbnRfYnVmZmVyKHBvaW50c1swXSwgcmFkaXVzKVxyXG4gICAgfSBlbHNlIGlmIChwb2ludHMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbGV0IGFyciA9IFtdXHJcbiAgICAgIHBvaW50cy5mb3JFYWNoKChwb2ludCkgPT4ge1xyXG4gICAgICAgIGFyci5wdXNoKFtOdW1iZXIocG9pbnQubG5nKSwgTnVtYmVyKHBvaW50LmxhdCldKVxyXG4gICAgICB9KVxyXG4gICAgICBsZXQgbGluZSA9IHR1cmYubGluZVN0cmluZyhhcnIpXHJcbiAgICAgIGxldCBidWZmZXJlZCA9IHR1cmYuYnVmZmVyKGxpbmUsIE51bWJlcihyYWRpdXMpIC8gMTAwMClcclxuICAgICAgcmV0dXJuIGJ1ZmZlcmVkLmdlb21ldHJ5LmNvb3JkaW5hdGVzXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAZGVzY3JpcHRpb24g5Yib5bu66Z2i57yT5Yay5Yy6IOi/lOWbnue8k+WGsuWMuuWdkOagh1xyXG4gICAqIEBtZXRob2QgY3JlYXRlX2FyZWFfYnVmZmVyXHJcbiAgICogQHBhcmFtIHBvaW50cyB7QXJyYXkuPGxuZzpcIlwiLGxhdDpcIlwiPn0g5Z2Q5qCH5Y+C5pWwXHJcbiAgICogQHBhcmFtIFtyYWRpdXM9NV0ge251bWJlcn0g57yT5Yay6Led56a7ICDvvIjljZXkvY3vvJrnsbPvvIlcclxuICAgKiBAbWVtYmVyT2YgVG9vbHNcclxuICAgKiBAcmV0dXJucyB7QXJyYXl9IOi/lOWbnue8k+WGsuWMuuWdkOagh+aVsOe7hFxyXG4gICAqIEBleGFtcGxlIGxldCBwb2ludHMgPSBbe2xuZzpcIlwiLGxhdDpcIlwifSx7bG5nOlwiXCIsbGF0OlwiXCJ9LHtsbmc6XCJcIixsYXQ6XCJcIn1dXHJcbiAgICogbGV0IHJhZGl1cyA9IDEwXHJcbiAgICogbGV0IGFyZWFfYnVmZmVyID0gc2RrLmNyZWF0ZV9hcmVhX2J1ZmZlcihwb2ludHMscmFkaXVzKVxyXG4gICAqICovXHJcbiAgY3JlYXRlX2FyZWFfYnVmZmVyKHBvaW50cywgcmFkaXVzID0gNSkge1xyXG4gICAgaWYgKHBvaW50cy5sZW5ndGggPT09IDEpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlX3BvaW50X2J1ZmZlcihwb2ludHNbMF0sIHJhZGl1cylcclxuICAgIH0gZWxzZSBpZiAocG9pbnRzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICByZXR1cm4gZmFsc2VcclxuICAgIH0gZWxzZSBpZiAocG9pbnRzLmxlbmd0aCA9PT0gMikge1xyXG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGVfbGluZV9idWZmZXIocG9pbnRzLCByYWRpdXMpXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBsZXQgYXJyID0gW11cclxuICAgICAgcG9pbnRzLmZvckVhY2goKHBvaW50KSA9PiB7XHJcbiAgICAgICAgYXJyLnB1c2goW051bWJlcihwb2ludC5sbmcpLCBOdW1iZXIocG9pbnQubGF0KV0pXHJcbiAgICAgIH0pXHJcbiAgICAgIGFyci5wdXNoKGFyclswXSlcclxuICAgICAgbGV0IHBvbHkgPSB0dXJmLnBvbHlnb24oW2Fycl0pXHJcbiAgICAgIGxldCBidWZmZXJlZCA9IHR1cmYuYnVmZmVyKHBvbHksIE51bWJlcihyYWRpdXMpIC8gMTAwMClcclxuICAgICAgcmV0dXJuIGJ1ZmZlcmVkLmdlb21ldHJ5LmNvb3JkaW5hdGVzXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAZGVzYyDorqHnrpflpJrngrnojIPlm7RcclxuICAgKiBAbWV0aG9kIGNhbF9lbnZlbG9wZVxyXG4gICAqIEBtZW1iZXJPZiBUb29sc1xyXG4gICAqICovXHJcbiAgY2FsX2VudmVsb3BlKHBvaW50cyA9IFtdKSB7XHJcbiAgICBpZiAocG9pbnRzLmxlbmd0aCA8IDIpIHtcclxuICAgICAgY29uc29sZS5lcnJvcign5Z2Q5qCH5pWw6YeP5LiN6IO95bCR5LqOMuS4qicpXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBsZXQgYXJyID0gW11cclxuICAgICAgcG9pbnRzLmZvckVhY2goKHApID0+IHtcclxuICAgICAgICBhcnIucHVzaCh0dXJmLnBvaW50KFtwLmxuZywgcC5sYXRdKSlcclxuICAgICAgfSlcclxuICAgICAgbGV0IGZlYXR1cmVzID0gdHVyZi5mZWF0dXJlQ29sbGVjdGlvbihhcnIpXHJcbiAgICAgIHJldHVybiB0dXJmLmVudmVsb3BlKGZlYXR1cmVzKS5nZW9tZXRyeS5jb29yZGluYXRlc1swXVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQGRlc2Mg5oyJ5oyH5a6a6Led56a75YiG5q61XHJcbiAgICogQG1ldGhvZCBjaHVua0xpbmVcclxuICAgKiBAcGFyYW0gcG9zaXRpb25zIHtBcnJheX1cclxuICAgKiBAcGFyYW0gbWV0ZXJzXHJcbiAgICogQG1lbWJlck9mIFRvb2xzXHJcbiAgICogKi9cclxuICBjaHVua0xpbmUocG9zaXRpb25zID0gW10sIG1ldGVycyA9IDEwMDApIHtcclxuICAgIGlmIChwb3NpdGlvbnMubGVuZ3RoIDwgMikge1xyXG4gICAgICByZXR1cm4gW11cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGxldCBhcnIgPSBbXVxyXG4gICAgICBwb3NpdGlvbnMuZm9yRWFjaCgoaXQpID0+IHtcclxuICAgICAgICBhcnIucHVzaChbaXQubG5nLCBpdC5sYXRdKVxyXG4gICAgICB9KVxyXG4gICAgICBsZXQgbGluZSA9IHR1cmYubGluZVN0cmluZyhhcnIpXHJcblxyXG4gICAgICBsZXQgY2h1bmsgPSB0dXJmLmxpbmVDaHVuayhsaW5lLCBtZXRlcnMgLyAxMDAwKVxyXG4gICAgICBsZXQgX19tYXAgPSBuZXcgTWFwKClcclxuICAgICAgY2h1bmsuZmVhdHVyZXMuZm9yRWFjaCgodmFsdWUpID0+IHtcclxuICAgICAgICB2YWx1ZS5nZW9tZXRyeS5jb29yZGluYXRlcy5mb3JFYWNoKCh2YWx1ZTEpID0+IHtcclxuICAgICAgICAgIGxldCBrZXkgPSB2YWx1ZTEuam9pbignLCcpXHJcbiAgICAgICAgICBsZXQgdmFsID0geyBsbmc6IHZhbHVlMVswXSwgbGF0OiB2YWx1ZTFbMV0gfVxyXG4gICAgICAgICAgX19tYXAuc2V0KGtleSwgdmFsKVxyXG4gICAgICAgIH0pXHJcbiAgICAgIH0pXHJcbiAgICAgIHJldHVybiBjaHVuay5mZWF0dXJlc1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQGRlc2Mg5qCH5rOo5Lulc2lueOeahOWNiuS4quWRqOacn+eahOW9ouW8j+W8uei3s1xyXG4gICAqICovXHJcbiAgYmlsbGJvYXJkQW5pbWF0aW9uKHZpZXdlciwgeyBpZCwgb2Zmc2V0ID0gMTAsIHRpbWVzID0gMyB9KSB7XHJcbiAgICBsZXQgZW50aXR5ID0gdmlld2VyLmVudGl0aWVzLmdldEJ5SWQoaWQpXHJcbiAgICBpZiAoZW50aXR5KSB7XHJcbiAgICAgIGxldCBwaSA9IE1hdGguUElcclxuICAgICAgbGV0IHR0ID0gNjBcclxuICAgICAgbGV0IG9mID0gcGkgLyB0dFxyXG5cclxuICAgICAgbGV0IGggPSAwXHJcbiAgICAgIGxldCBzcmNfcCA9IHRoaXMuY2FydGVzaWFuM1Rvd2dzODQoZW50aXR5LnBvc2l0aW9uLmdldFZhbHVlKCksIHZpZXdlcilcclxuICAgICAgLy8gbGV0IGhlaWdodCA9IHNyY19wLmFsdFxyXG4gICAgICAvLyBlbnRpdHkucG9zaXRpb24gPSBuZXcgQ2VzaXVtLkNhbGxiYWNrUHJvcGVydHkoKCkgPT4ge1xyXG4gICAgICAvLyAgIGxldCBoZWlnaHQgPSBvZmZzZXQgKiBNYXRoLnNpbihoKSArIHNyY19wLmFsdFxyXG4gICAgICAvLyAgIGggKz0gb2ZcclxuICAgICAgLy8gICByZXR1cm4gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXMoc3JjX3AubG5nLCBzcmNfcC5sYXQsIGhlaWdodClcclxuICAgICAgLy8gfSwgZmFsc2UpXHJcbiAgICAgIGxldCB0aSA9IHNldEludGVydmFsKCgpID0+IHtcclxuICAgICAgICBoICs9IG9mXHJcbiAgICAgICAgbGV0IGhlaWdodCA9IG9mZnNldCAqIE1hdGguc2luKGgpICsgc3JjX3AuYWx0XHJcbiAgICAgICAgaWYgKGggPiBwaSkgaCA9IDBcclxuICAgICAgICBlbnRpdHkucG9zaXRpb24gPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlcyhcclxuICAgICAgICAgIHNyY19wLmxuZyxcclxuICAgICAgICAgIHNyY19wLmxhdCxcclxuICAgICAgICAgIGhlaWdodFxyXG4gICAgICAgIClcclxuICAgICAgfSwgMzApXHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIGNsZWFySW50ZXJ2YWwodGkpXHJcbiAgICAgICAgZW50aXR5LnBvc2l0aW9uID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXMoXHJcbiAgICAgICAgICBzcmNfcC5sbmcsXHJcbiAgICAgICAgICBzcmNfcC5sYXQsXHJcbiAgICAgICAgICBzcmNfcC5hbHRcclxuICAgICAgICApXHJcbiAgICAgIH0sIDMwMDApXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipAZGVzYyDnu5jliLbmiYflvaJcclxuICAgKiBAbWV0aG9kIHNlY3RvclxyXG4gICAqIEBtZW1iZXJPZiBUb29scyovXHJcbiAgY2FsU2VjdG9yKFxyXG4gICAgY2VudGVyID0ge30sXHJcbiAgICByYWRpdXMgPSAxMDAsXHJcbiAgICBiZWFyaW5nMSA9IDI1LFxyXG4gICAgYmVhcmluZzIgPSA0NSxcclxuICAgIHN0ZXBzID0gMzYwLFxyXG4gICAgaXM4NCA9IGZhbHNlXHJcbiAgKSB7XHJcbiAgICBsZXQgYyA9IHR1cmYucG9pbnQoW2NlbnRlci5sbmcsIGNlbnRlci5sYXRdKVxyXG4gICAgbGV0IGNvb3JkaW5hdGVzID0gdHVyZi5zZWN0b3IoYywgcmFkaXVzIC8gMTAwMCwgYmVhcmluZzEsIGJlYXJpbmcyLCB7IHN0ZXBzOiBzdGVwcyB9KVxyXG4gICAgICAuZ2VvbWV0cnkuY29vcmRpbmF0ZXNcclxuICAgIGxldCBwb3NpdGlvbnMgPSBbXVxyXG4gICAgY29vcmRpbmF0ZXMuZm9yRWFjaCgoYXJyYXkpID0+IHtcclxuICAgICAgYXJyYXkuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICAgIGxldCBwb3NcclxuICAgICAgICBpZiAoaXM4NCkge1xyXG4gICAgICAgICAgcG9zID0ge1xyXG4gICAgICAgICAgICBsbmc6IGl0ZW1bMF0sXHJcbiAgICAgICAgICAgIGxhdDogaXRlbVsxXSxcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBwb3MgPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlcyhpdGVtWzBdLCBpdGVtWzFdKVxyXG4gICAgICAgIH1cclxuICAgICAgICBwb3NpdGlvbnMucHVzaChwb3MpXHJcbiAgICAgIH0pXHJcbiAgICB9KVxyXG4gICAgcmV0dXJuIHBvc2l0aW9uc1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQGRlc2Pojrflj5bntKfotLTpq5jluqZcclxuICAgKiBAcGFyYW0gcG9zaXRpb24g5Z2Q5qCHXHJcbiAgICovXHJcbiAgYXN5bmMgZ2V0Q2xhbXBUb0hlaWdodChwb3NpdGlvbiwgb2JqZWN0c1RvRXhjbHVkZSA9IFtdKSB7XHJcbiAgICBpZiAoIXRoaXMuc2RrIHx8ICF0aGlzLnNkay52aWV3ZXIpIHtcclxuICAgICAgcmV0dXJuIDBcclxuICAgIH1cclxuICAgIGxldCBwb3MzID0gbmV3IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzKHBvc2l0aW9uLmxuZywgcG9zaXRpb24ubGF0KTtcclxuICAgIGxldCBwb3NpdGlvbjFcclxuICAgIHRyeSB7XHJcbiAgICAgIHBvc2l0aW9uMSA9IGF3YWl0IHRoaXMuc2RrLnZpZXdlci5zY2VuZS5jbGFtcFRvSGVpZ2h0KHBvczMsIG9iamVjdHNUb0V4Y2x1ZGUpIHx8IHBvczNcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIHBvc2l0aW9uMSA9IHBvczNcclxuICAgIH1cclxuICAgIGxldCBoZWlnaHQxID0gYXdhaXQgdGhpcy5jYXJ0ZXNpYW4zVG93Z3M4NChwb3NpdGlvbjEsIHRoaXMuc2RrLnZpZXdlcikuYWx0XHJcbiAgICBsZXQgaGVpZ2h0MiA9IDBcclxuICAgIHRyeSB7XHJcbiAgICAgIGlmICh0aGlzLnNkay52aWV3ZXIuc2NlbmUudGVycmFpblByb3ZpZGVyLmF2YWlsYWJpbGl0eSkge1xyXG4gICAgICAgIGxldCBwb3NpdGlvbjIgPSBhd2FpdCBDZXNpdW0uc2FtcGxlVGVycmFpbk1vc3REZXRhaWxlZChcclxuICAgICAgICAgIHRoaXMuc2RrLnZpZXdlci5zY2VuZS50ZXJyYWluUHJvdmlkZXIsXHJcbiAgICAgICAgICBbQ2VzaXVtLkNhcnRvZ3JhcGhpYy5mcm9tRGVncmVlcyhwb3NpdGlvbi5sbmcsIHBvc2l0aW9uLmxhdCldXHJcbiAgICAgICAgKVxyXG4gICAgICAgIHBvc2l0aW9uMlswXS5oZWlnaHQgJiYgKGhlaWdodDIgPSBwb3NpdGlvbjJbMF0uaGVpZ2h0KVxyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBoZWlnaHQyID0gMFxyXG4gICAgfVxyXG4gICAgaWYgKGhlaWdodDEgPiBoZWlnaHQyKSB7XHJcbiAgICAgIHJldHVybiBOdW1iZXIoaGVpZ2h0MS50b0ZpeGVkKDIpKVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHJldHVybiBOdW1iZXIoaGVpZ2h0Mi50b0ZpeGVkKDIpKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQGRlc2Mg5rex5ou36LSd5a+56LGhXHJcbiAgICogKi9cclxuICBkZWVwQ29weU9iaihvYmopIHtcclxuICAgIGxldCBuZXdvYmogPSBudWxsO1xyXG4gICAgLy8g5aSE55CG5pWw57uEIC0g5L2/55So5Y6f55SfQXJyYXnmnoTpgKDlh73mlbDliJvlu7rmlrDmlbDnu4RcclxuICAgIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHtcclxuICAgICAgbmV3b2JqID0gW107XHJcbiAgICAgIC8vIOWPquaLt+i0neaVsOe7hOWFg+e0oO+8jOS4jeaLt+i0neWPr+iDveWtmOWcqOeahOaJqeWxleaWueazlVxyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9iai5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIG5ld29ialtpXSA9IHRoaXMuZGVlcENvcHlPYmoob2JqW2ldKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gbmV3b2JqO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIOWkhOeQhuWvueixoVxyXG4gICAgZWxzZSBpZiAob2JqICYmIHR5cGVvZiBvYmogPT09ICdvYmplY3QnKSB7XHJcbiAgICAgIG5ld29iaiA9IHt9O1xyXG4gICAgICBmb3IgKGxldCBpIGluIG9iaikge1xyXG4gICAgICAgIC8vIOaOkumZpOaMh+WumuWxnuaAp+WSjOaWueazleWxnuaAp1xyXG4gICAgICAgIGlmIChpICE9PSAnZWFydGgnICYmIGkgIT09ICdEaWFsb2cnICYmIHR5cGVvZiBvYmpbaV0gIT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgIG5ld29ialtpXSA9IHRoaXMuZGVlcENvcHlPYmoob2JqW2ldKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIG5ld29iajtcclxuICAgIH1cclxuICAgIGVsc2UgbmV3b2JqID0gb2JqO1xyXG4gICAgcmV0dXJuIG5ld29iajtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBkZXNjIOW6puWIhuenkui9rOaNolxyXG4gICAqICovXHJcbiAgcHJvakNvbnZlcnQoc3RhdHVzID0gZmFsc2UsIGNsb3NlQ2FsbEJhY2sgPSAoKSA9PiB7IH0pIHtcclxuICAgIGlmIChzdGF0dXMpIHtcclxuICAgICAgcHJvakNvbnZlcnRPcGVuKHRoaXMuc2RrLCBjbG9zZUNhbGxCYWNrKVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHByb2pDb252ZXJ0Q2xvc2UoKVxyXG4gICAgfVxyXG4gIH1cclxuICAvKipcclxuICAgKiBAZGVzYyDmipXlvbHovazmjaJcclxuICAgKiAqL1xyXG4gIHByb2plY3Rpb25Db252ZXJ0KHN0YXR1cyA9IGZhbHNlLCBjbG9zZUNhbGxCYWNrID0gKCkgPT4geyB9KSB7XHJcbiAgICBpZiAoc3RhdHVzKSB7XHJcbiAgICAgIHByb2plY3Rpb25Db252ZXJ0T3Blbih0aGlzLnNkaywgY2xvc2VDYWxsQmFjaylcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBwcm9qZWN0aW9uQ29udmVydENsb3NlKClcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBkZXNjIOWvvOWHumV4Y2VsXHJcbiAgICovXHJcbiAgLy8g5a+85Ye65bGe5oCnXHJcbiAgZXhwb3J0RXhjZWwoZGF0YSkge1xyXG4gICAgbGV0IGxhYmVsID0gJzxSb3c+J1xyXG4gICAgZm9yIChsZXQga2V5IGluIGRhdGFbMF0pIHtcclxuICAgICAgbGFiZWwgKz0gYDxDZWxsPjxEYXRhIHNzOlR5cGU9XCJTdHJpbmdcIj4ke2tleX08L0RhdGE+PC9DZWxsPmBcclxuICAgIH1cclxuICAgIGxhYmVsICs9ICc8L1Jvdz4nXHJcbiAgICBsZXQgdXJsID0gJ2RhdGE6YXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsO2Jhc2U2NCwnLFxyXG4gICAgICB0bXBsV29ya2Jvb2tYTUwgPSAnPD94bWwgdmVyc2lvbj1cIjEuMFwiPz48P21zby1hcHBsaWNhdGlvbiBwcm9naWQ9XCJFeGNlbC5TaGVldFwiPz48V29ya2Jvb2sgeG1sbnM9XCJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpzcHJlYWRzaGVldFwiIHhtbG5zOnNzPVwidXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6c3ByZWFkc2hlZXRcIj4nXHJcbiAgICAgICAgKyAnPERvY3VtZW50UHJvcGVydGllcyB4bWxucz1cInVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZVwiPjxBdXRob3I+QXhlbCBSaWNodGVyPC9BdXRob3I+PENyZWF0ZWQ+e2NyZWF0ZWR9PC9DcmVhdGVkPjwvRG9jdW1lbnRQcm9wZXJ0aWVzPidcclxuICAgICAgICArICc8U3R5bGVzPidcclxuICAgICAgICArICc8U3R5bGUgc3M6SUQ9XCJDdXJyZW5jeVwiPjxOdW1iZXJGb3JtYXQgc3M6Rm9ybWF0PVwiQ3VycmVuY3lcIj48L051bWJlckZvcm1hdD48L1N0eWxlPidcclxuICAgICAgICArICc8U3R5bGUgc3M6SUQ9XCJEYXRlXCI+PE51bWJlckZvcm1hdCBzczpGb3JtYXQ9XCJNZWRpdW0gRGF0ZVwiPjwvTnVtYmVyRm9ybWF0PjwvU3R5bGU+J1xyXG4gICAgICAgICsgJzwvU3R5bGVzPidcclxuICAgICAgICArICd7d29ya3NoZWV0c308L1dvcmtib29rPidcclxuICAgICAgLCB0bXBsV29ya3NoZWV0WE1MID0gJzxXb3Jrc2hlZXQgc3M6TmFtZT1cIntuYW1lV1N9XCI+PFRhYmxlPjxzczpDb2x1bW4gc3M6V2lkdGg9XCIxMjBcIi8+PHNzOkNvbHVtbiBzczpXaWR0aD1cIjEyMFwiLz48c3M6Q29sdW1uIHNzOldpZHRoPVwiMTIwXCIvPjxzczpDb2x1bW4gc3M6V2lkdGg9XCIxMjBcIi8+PHNzOkNvbHVtbiBzczpXaWR0aD1cIjEyMFwiLz48c3M6Q29sdW1uIHNzOldpZHRoPVwiMTIwXCIvPjxzczpDb2x1bW4gc3M6V2lkdGg9XCIxMjBcIi8+PHNzOkNvbHVtbiBzczpXaWR0aD1cIjEyMFwiLz48c3M6Q29sdW1uIHNzOldpZHRoPVwiMTIwXCIvPjxzczpDb2x1bW4gc3M6V2lkdGg9XCIxMjBcIi8+PHNzOkNvbHVtbiBzczpXaWR0aD1cIjEyMFwiLz48c3M6Q29sdW1uIHNzOldpZHRoPVwiMTIwXCIvPjxzczpDb2x1bW4gc3M6V2lkdGg9XCIxMjBcIi8+PHNzOkNvbHVtbiBzczpXaWR0aD1cIjI0MFwiLz57cm93c308L1RhYmxlPjwvV29ya3NoZWV0PidcclxuICAgICAgLCB0bXBsQ2VsbFhNTCA9ICc8Q2VsbD48RGF0YSBzczpUeXBlPVwie25hbWVUeXBlfVwiPntkYXRhfTwvRGF0YT48L0NlbGw+J1xyXG4gICAgICAsIGJhc2U2NCA9IGZ1bmN0aW9uIChzKSB7XHJcbiAgICAgICAgcmV0dXJuIHdpbmRvdy5idG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChzKSkpXHJcbiAgICAgIH1cclxuICAgICAgLCBmb3JtYXQgPSBmdW5jdGlvbiAocywgYykge1xyXG4gICAgICAgIHJldHVybiBzLnJlcGxhY2UoL3soXFx3Kyl9L2csIGZ1bmN0aW9uIChtLCBwKSB7XHJcbiAgICAgICAgICByZXR1cm4gY1twXTtcclxuICAgICAgICB9KVxyXG4gICAgICB9XHJcblxyXG4gICAgbGV0IGN0eCA9IFwiXCI7XHJcbiAgICBsZXQgd29ya2Jvb2tYTUwgPSBcIlwiO1xyXG4gICAgbGV0IHdvcmtzaGVldHNYTUwgPSBcIlwiO1xyXG4gICAgbGV0IHJvd3NYTUwgPSBcIlwiO1xyXG5cclxuICAgIGxldCBwaWwgPSAwO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGlmIChpID09IDApIHtcclxuICAgICAgICByb3dzWE1MICs9IGxhYmVsXHJcbiAgICAgIH1cclxuICAgICAgcm93c1hNTCArPSAnPFJvdz4nO1xyXG4gICAgICBmb3IgKGxldCBrZXkgaW4gZGF0YVtpXSkge1xyXG4gICAgICAgIGN0eCA9IHtcclxuICAgICAgICAgIG5hbWVUeXBlOiAnU3RyaW5nJyxcclxuICAgICAgICAgIGRhdGE6IGRhdGFbaV1ba2V5XVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgcm93c1hNTCArPSBmb3JtYXQodG1wbENlbGxYTUwsIGN0eCk7XHJcbiAgICAgIH1cclxuICAgICAgcm93c1hNTCArPSAnPC9Sb3c+JztcclxuICAgICAgaWYgKGkgPiAwICYmIChpIC8gNjAwMDApICUgMSA9PT0gMCkge1xyXG4gICAgICAgIHBpbCsrO1xyXG4gICAgICAgIGN0eCA9IHsgcm93czogcm93c1hNTCwgbmFtZVdTOiAnU2hlZXQnICsgaSB9O1xyXG4gICAgICAgIHdvcmtzaGVldHNYTUwgKz0gZm9ybWF0KHRtcGxXb3Jrc2hlZXRYTUwsIGN0eCk7XHJcbiAgICAgICAgcm93c1hNTCA9IFwiXCI7XHJcbiAgICAgICAgcm93c1hNTCArPSBsYWJlbFxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBjdHggPSB7IHJvd3M6IHJvd3NYTUwsIG5hbWVXUzogJ1NoZWV0JyB9O1xyXG4gICAgd29ya3NoZWV0c1hNTCArPSBmb3JtYXQodG1wbFdvcmtzaGVldFhNTCwgY3R4KTtcclxuICAgIHJvd3NYTUwgPSBcIlwiO1xyXG4gICAgY3R4ID0geyBjcmVhdGVkOiAobmV3IERhdGUoKSkuZ2V0VGltZSgpLCB3b3Jrc2hlZXRzOiB3b3Jrc2hlZXRzWE1MIH07XHJcbiAgICB3b3JrYm9va1hNTCA9IGZvcm1hdCh0bXBsV29ya2Jvb2tYTUwsIGN0eCk7XHJcbiAgICBsZXQgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJBXCIpO1xyXG4gICAgbGluay5ocmVmID0gdXJsICsgYmFzZTY0KHdvcmtib29rWE1MKTtcclxuICAgIGxpbmsuZG93bmxvYWQgPSBcIuefoumHj+aVsOaNruWvvOWHui54bHNcIlxyXG4gICAgbGluay50YXJnZXQgPSAnX2JsYW5rJztcclxuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobGluayk7XHJcbiAgICBsaW5rLmNsaWNrKCk7XHJcbiAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGxpbmspO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQGRlc2MgR3ppcOino+WOi1xyXG4gICAqL1xyXG4gIGRlY29tcHJlc3NHemlwKGNvbXByZXNzZWREYXRhKSB7XHJcbiAgICBsZXQgZGVjb21wcmVzc2VkRGF0YSA9IHBha28uaW5mbGF0ZShjb21wcmVzc2VkRGF0YSk7XHJcbiAgICAvLyDlsIbop6PljovnvKnlkI7nmoTmlbDmja7ovazmjaLkuLrlrZfnrKbkuLJcclxuICAgIGxldCBkZWNvbXByZXNzZWRTdHJpbmcgPSBuZXcgVGV4dERlY29kZXIoKS5kZWNvZGUoZGVjb21wcmVzc2VkRGF0YSk7XHJcbiAgICByZXR1cm4gZGVjb21wcmVzc2VkU3RyaW5nXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAZGVzYyBjbXlr6L2scmJnXHJcbiAgICogQHBhcmFtIHsqfSBjb2xvclxyXG4gICAqIEByZXR1cm5zXHJcbiAgICovXHJcbiAgY215a1RvUmdiKGNvbG9yKSB7XHJcbiAgICBsZXQgeyBjLCBtLCB5LCBrIH0gPSBjb2xvclxyXG4gICAgbGV0IHJnYiA9IHsgcjogMCwgZzogMCwgYjogMCB9O1xyXG4gICAgcmdiLmMgPSBjIC8gMTAwO1xyXG4gICAgcmdiLm0gPSBtIC8gMTAwO1xyXG4gICAgcmdiLnkgPSB5IC8gMTAwO1xyXG4gICAgcmdiLmsgPSBrIC8gMTAwO1xyXG4gICAgcmdiLnIgPSAxIC0gTWF0aC5taW4oMSwgcmdiLmMgKiAoMSAtIHJnYi5rKSArIHJnYi5rKTtcclxuICAgIHJnYi5nID0gMSAtIE1hdGgubWluKDEsIHJnYi5tICogKDEgLSByZ2IuaykgKyByZ2Iuayk7XHJcbiAgICByZ2IuYiA9IDEgLSBNYXRoLm1pbigxLCByZ2IueSAqICgxIC0gcmdiLmspICsgcmdiLmspO1xyXG4gICAgcmdiLnIgPSBNYXRoLnJvdW5kKHJnYi5yICogMjU1KTtcclxuICAgIHJnYi5nID0gTWF0aC5yb3VuZChyZ2IuZyAqIDI1NSlcclxuICAgIHJnYi5iID0gTWF0aC5yb3VuZChyZ2IuYiAqIDI1NSk7XHJcbiAgICByZXR1cm4gYHJnYigke3JnYi5yfSwgJHtyZ2IuZ30sICR7cmdiLmJ9KWA7XHJcbiAgfVxyXG5cclxuICBjb252ZXJ0UHhUb1JlbShzZGssIHNlbGVjdG9yKSB7XHJcbiAgICBjb25zdCBodG1sRm9udFNpemUgPSBwYXJzZUZsb2F0KGdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KS5mb250U2l6ZSk7XHJcbiAgICBsZXQgbGlzdCA9IFtdXHJcbiAgICBsZXQgZWxlbWVudExpc3QgPSBbXVxyXG4gICAgaWYgKHNlbGVjdG9yKSB7XHJcbiAgICAgIGxpc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChzZGsuZGl2X2lkKS5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKVxyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBlbGVtZW50TGlzdC5wdXNoKGxpc3RbaV0sIC4uLmxpc3RbaV0ucXVlcnlTZWxlY3RvckFsbCgnKicpKVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgZWxlbWVudExpc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChzZGsuZGl2X2lkKS5xdWVyeVNlbGVjdG9yQWxsKCcqJyk7XHJcbiAgICB9XHJcbiAgICBlbGVtZW50TGlzdC5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICBjb25zdCBzdHlsZSA9IGVsZW1lbnQuc3R5bGU7XHJcbiAgICAgIGNvbnN0IHJ1bGVzID0gQXJyYXkuZnJvbShzdHlsZSkuZmlsdGVyKHByb3AgPT4ge1xyXG4gICAgICAgIHJldHVybiB0eXBlb2YgcHJvcCA9PT0gJ3N0cmluZycgJiYgcHJvcC5lbmRzV2l0aCgncHgnKTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBydWxlcy5mb3JFYWNoKHByb3AgPT4ge1xyXG4gICAgICAgIGNvbnN0IHB4VmFsdWUgPSBwYXJzZUZsb2F0KHN0eWxlW3Byb3BdKTtcclxuICAgICAgICBjb25zdCByZW1WYWx1ZSA9IHB4VmFsdWUgLyBodG1sRm9udFNpemU7XHJcbiAgICAgICAgZWxlbWVudC5zdHlsZVtwcm9wXSA9IGAke3JlbVZhbHVlfXJlbWA7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBpc0NvbnZleChhcnIgPSBbXSkge1xyXG4gICAgY29uc3QgeyBsZW5ndGggfSA9IGFyclxyXG4gICAgbGV0IHByZSA9IDAsXHJcbiAgICAgIGN1cnIgPSAwXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XHJcbiAgICAgIGxldCBkeDEgPSBhcnJbKGkgKyAxKSAlIGxlbmd0aF0ubG5nIC0gYXJyW2ldLmxuZ1xyXG4gICAgICBsZXQgZHgyID0gYXJyWyhpICsgMikgJSBsZW5ndGhdLmxuZyAtIGFyclsoaSArIDEpICUgbGVuZ3RoXS5sbmdcclxuICAgICAgbGV0IGR5MSA9IGFyclsoaSArIDEpICUgbGVuZ3RoXS5sYXQgLSBhcnJbaV0ubGF0XHJcbiAgICAgIGxldCBkeTIgPSBhcnJbKGkgKyAyKSAlIGxlbmd0aF0ubGF0IC0gYXJyWyhpICsgMSkgJSBsZW5ndGhdLmxhdFxyXG4gICAgICBjdXJyID0gZHgxICogZHkyIC0gZHgyICogZHkxXHJcbiAgICAgIGlmIChjdXJyICE9IDApIHtcclxuICAgICAgICBpZiAoKGN1cnIgPiAwICYmIHByZSA8IDApIHx8IChjdXJyIDwgMCAmJiBwcmUgPiAwKSkgcmV0dXJuIGZhbHNlXHJcbiAgICAgICAgZWxzZSBwcmUgPSBjdXJyXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlXHJcbiAgfVxyXG5cclxuICBnZXREYXRlVGltZVN0cmluZygpIHtcclxuICAgIC8vIOWIm+W7uuS4gOS4quihqOekuuW9k+WJjeaXtumXtOeahCBEYXRlIOWvueixoVxyXG4gICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcclxuICAgIC8vIOiOt+WPluW5tOS7vVxyXG4gICAgY29uc3QgeWVhciA9IG5vdy5nZXRGdWxsWWVhcigpO1xyXG4gICAgLy8g6I635Y+W5pyI5Lu977yI5LuOIDAg5byA5aeL77yM5omA5Lul6KaB5YqgIDHvvInvvIzlubblsIblhbbovazmjaLkuLrkuKTkvY3lrZfnrKbkuLLvvIzkuI3otrPkuKTkvY3lnKjliY3pnaLooaXpm7ZcclxuICAgIGNvbnN0IG1vbnRoID0gU3RyaW5nKG5vdy5nZXRNb250aCgpICsgMSkucGFkU3RhcnQoMiwgJzAnKTtcclxuICAgIC8vIOiOt+WPluaXpeacn++8jOW5tuWwhuWFtui9rOaNouS4uuS4pOS9jeWtl+espuS4su+8jOS4jei2s+S4pOS9jeWcqOWJjemdouihpembtlxyXG4gICAgY29uc3QgZGF5ID0gU3RyaW5nKG5vdy5nZXREYXRlKCkpLnBhZFN0YXJ0KDIsICcwJyk7XHJcbiAgICAvLyDojrflj5blsI/ml7bvvIzlubblsIblhbbovazmjaLkuLrkuKTkvY3lrZfnrKbkuLLvvIzkuI3otrPkuKTkvY3lnKjliY3pnaLooaXpm7ZcclxuICAgIGNvbnN0IGhvdXJzID0gU3RyaW5nKG5vdy5nZXRIb3VycygpKS5wYWRTdGFydCgyLCAnMCcpO1xyXG4gICAgLy8g6I635Y+W5YiG6ZKf77yM5bm25bCG5YW26L2s5o2i5Li65Lik5L2N5a2X56ym5Liy77yM5LiN6Laz5Lik5L2N5Zyo5YmN6Z2i6KGl6Zu2XHJcbiAgICBjb25zdCBtaW51dGVzID0gU3RyaW5nKG5vdy5nZXRNaW51dGVzKCkpLnBhZFN0YXJ0KDIsICcwJyk7XHJcbiAgICAvLyDojrflj5bnp5LvvIzlubblsIblhbbovazmjaLkuLrkuKTkvY3lrZfnrKbkuLLvvIzkuI3otrPkuKTkvY3lnKjliY3pnaLooaXpm7ZcclxuICAgIGNvbnN0IHNlY29uZHMgPSBTdHJpbmcobm93LmdldFNlY29uZHMoKSkucGFkU3RhcnQoMiwgJzAnKTtcclxuICAgIC8vIOiOt+WPluavq+enku+8jOW5tuWwhuWFtui9rOaNouS4uuS4ieS9jeWtl+espuS4su+8jOS4jei2s+S4ieS9jeWcqOWJjemdouihpembtlxyXG4gICAgY29uc3QgbWlsbGlzZWNvbmRzID0gU3RyaW5nKG5vdy5nZXRNaWxsaXNlY29uZHMoKSkucGFkU3RhcnQoMywgJzAnKTtcclxuICAgIC8vIOWwhuW5tOOAgeaciOOAgeaXpeOAgeaXtuOAgeWIhuOAgeenkuOAgeavq+enkuaLvOaOpeaIkOaJgOmcgOeahOWtl+espuS4slxyXG4gICAgcmV0dXJuIGAke3llYXJ9JHttb250aH0ke2RheX0ke2hvdXJzfSR7bWludXRlc30ke3NlY29uZHN9JHttaWxsaXNlY29uZHN9YDtcclxuICB9XHJcblxyXG4gIHJlcGxhY2VIb3N0KHVybCwgaG9zdCkge1xyXG4gICAgbGV0IG5ld1VybCA9IHVybFxyXG4gICAgaWYgKCF1cmwgfHwgIWhvc3QpIHtcclxuICAgICAgcmV0dXJuIHVybFxyXG4gICAgfVxyXG4gICAgdHJ5IHtcclxuICAgICAgaWYgKCF1cmwuc3RhcnRzV2l0aChcImh0dHBcIikpIHtcclxuICAgICAgICAvL+ivtOaYjuaYr+acrOWcsOeahGpzb27vvIzlnKjno4Hnm5jkuK3lrZjlnKjnmoRcclxuICAgICAgICBpZiAoIXVybC5pbmNsdWRlcyhcIjpcIikpIHtcclxuICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuaG9zdCkge1xyXG4gICAgICAgICAgICBsZXQgbyA9IG5ldyBVUkwodXJsLCB0aGlzLm9wdGlvbnMuaG9zdClcclxuICAgICAgICAgICAgbmV3VXJsID0gby5ocmVmXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBuZXdVcmxcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICAvLyDnp7vpmaTlj6/og73nmoTnlKjmiLflkI065a+G56CB5YmN57yAXHJcbiAgICAgICAgY29uc3QgYXV0aFJlZ2V4ID0gL15bXkBdK0AvO1xyXG4gICAgICAgIGlmIChhdXRoUmVnZXgudGVzdCh1cmwpKSB7XHJcbiAgICAgICAgICB1cmwgPSB1cmwucmVwbGFjZShhdXRoUmVnZXgsICcnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIOa3u+WKoOWNj+iuruWJjee8gO+8iOWmguaenOayoeacie+8iVxyXG4gICAgICAgIGlmICghL15bYS16XSs6XFwvXFwvL2kudGVzdCh1cmwpKSB7XHJcbiAgICAgICAgICB1cmwgPSAnaHR0cDovLycgKyB1cmw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBwYXJzZWRVcmwgPSBuZXcgVVJMKHVybCk7XHJcbiAgICAgICAgY29uc3QgcGFyc2VkVXJsMiA9IG5ldyBVUkwoaG9zdCk7XHJcbiAgICAgICAgbGV0IGhvc3RuYW1lID0gcGFyc2VkVXJsLmhvc3RuYW1lO1xyXG4gICAgICAgIGxldCBwb3J0ID0gcGFyc2VkVXJsLnBvcnQ7XHJcblxyXG4gICAgICAgIC8vIOWkhOeQhklQdjblnLDlnYDvvIjlpoLmnpzmnInmi6zlj7fvvIlcclxuICAgICAgICBpZiAoaG9zdG5hbWUuc3RhcnRzV2l0aCgnWycpICYmIGhvc3RuYW1lLmVuZHNXaXRoKCddJykpIHtcclxuICAgICAgICAgIGhvc3RuYW1lID0gaG9zdG5hbWUuc2xpY2UoMSwgLTEpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoKGhvc3RuYW1lID09PSAnbG9jYWxob3N0JyB8fCBob3N0bmFtZSA9PT0gJzEyNy4wLjAuMScpICYmIHBhcnNlSW50KHBvcnQsIDEwKSAhPT0gNTUxMTApIHtcclxuICAgICAgICAgIHBhcnNlZFVybC5wb3J0ID0gcGFyc2VkVXJsMi5wb3J0XHJcbiAgICAgICAgICBwYXJzZWRVcmwucHJvdG9jb2wgPSBwYXJzZWRVcmwyLnByb3RvY29sXHJcbiAgICAgICAgICBuZXdVcmwgPSBwYXJzZWRVcmwudG9TdHJpbmcoKVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbmV3VXJsXHJcbiAgICAgIH1cclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIHJldHVybiBuZXdVcmxcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG1lc3NhZ2Uob3B0aW9uID0ge30pIHtcclxuICAgIGxldCB0eXBlID0gb3B0aW9uLnR5cGUgfHwgJ3N1Y2Nlc3MnXHJcbiAgICBsZXQgdGV4dCA9IG9wdGlvbi50ZXh0IHx8ICcnXHJcbiAgICBsZXQgZHVyYXRpb24gPSBvcHRpb24uZHVyYXRpb24gfHwgMTUwMFxyXG5cclxuICAgIGxldCBtZXNzYWdlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ1lKLWN1c3RvbS1tZXNzYWdlJyk7XHJcbiAgICBpZiAobWVzc2FnZSkge1xyXG4gICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKG1lc3NhZ2UpXHJcbiAgICB9XHJcbiAgICBtZXNzYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcclxuICAgIG1lc3NhZ2UuaWQgPSAnWUotY3VzdG9tLW1lc3NhZ2UnXHJcbiAgICBpZiAodHlwZSA9PSAnc3VjY2VzcycpIHtcclxuICAgICAgbWVzc2FnZS5pbm5lckhUTUwgPSBgXHJcbiAgICAgIDxpPjw/eG1sIHZlcnNpb249XCIxLjBcIiBzdGFuZGFsb25lPVwibm9cIj8+PCFET0NUWVBFIHN2ZyBQVUJMSUMgXCItLy9XM0MvL0RURCBTVkcgMS4xLy9FTlwiIFwiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkXCI+PHN2ZyB0PVwiMTc1NTkyOTk2MTI4MlwiIGNsYXNzPVwiaWNvblwiIHZpZXdCb3g9XCIwIDAgMTAyNCAxMDI0XCIgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBwLWlkPVwiNTA2NFwiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiPjxwYXRoIGQ9XCJNODc0LjExOTYxOCAxNDkuODU5OTIyQTUxMC44MTY0NjEgNTEwLjgxNjQ2MSAwIDAgMCA1MTEuOTk3IDAuMDAyMDhhNTA5LjkxMDQ2MiA1MDkuOTEwNDYyIDAgMCAwLTM2Mi4xMTk2MTggMTQ5Ljg1Nzg0MmMtMTk5LjgxNzc4OSAxOTkuNjc5Nzg5LTE5OS44MTc3ODkgNTI0LjU4MTQ0NyAwIDcyNC4yNjAyMzZhNTA5Ljk2OTQ2MiA1MDkuOTY5NDYyIDAgMCAwIDM2Mi4xMTk2MTggMTQ5Ljg1Nzg0MkE1MDguODcyNDYzIDUwOC44NzI0NjMgMCAwIDAgODc0LjExOTYxOCA4NzQuMTIwMTU4YzE5OS44MzY3ODktMTk5LjY3OTc4OSAxOTkuODM2Nzg5LTUyNC41ODE0NDcgMC03MjQuMjYwMjM2ek04MTQuOTQyNjggMzc4LjIxMDY4MUw0NzAuOTk5MDQzIDc0NC4xMzIyOTVhMTUuMzU5OTg0IDE1LjM1OTk4NCAwIDAgMS01Ljg4Nzk5NCA0LjA5NTk5NmMtMS43NTE5OTggMS4xODA5OTktMi45MTM5OTcgMi4zNjI5OTgtNS4yNzY5OTQgMi45MTM5OTdhMzQuNDk5OTY0IDM0LjQ5OTk2NCAwIDAgMS0xMy40Njk5ODYgMi45MTQ5OTcgNDUuNTQ3OTUyIDQ1LjU0Nzk1MiAwIDAgMS0xMi44OTc5ODYtMi4zMDM5OThsLTQuMDk1OTk2LTIuMzYzOTk3YTQ1LjI5MTk1MiA0NS4yOTE5NTIgMCAwIDEtNy4wMDk5OTItNC4wOTU5OTZsLTE5Ni45MDI3OTMtMTkzLjc4OTc5NmEzNC4xMjY5NjQgMzQuMTI2OTY0IDAgMCAxLTEwLjU1NTk4OS0yNS4xODY5NzNjMC05LjM3Mzk5IDMuNTgzOTk2LTE4Ljc0Njk4IDkuOTgzOTktMjUuMTg2OTc0YTM2LjQyOTk2MiAzNi40Mjk5NjIgMCAwIDEgNTAuMzcyOTQ3IDBsMTY5Ljk4MzgyIDE2Ny40MjM4MjRMNzYzLjM4OTczNSAzMzAuMjIwNzMyYTM3LjA1OTk2MSAzNy4wNTk5NjEgMCAwIDEgNTAuMzcxOTQ3LTEuNzMyOTk4IDMzLjY0Nzk2NSAzMy42NDc5NjUgMCAwIDEgMTEuMTY1OTg4IDI1LjE4Njk3MyAzNS41NDQ5NjMgMzUuNTQ0OTYzIDAgMCAxLTkuOTgzOTkgMjQuNTc1OTc0di0wLjA0eiBtMCAwXCIgZmlsbD1cIiM1MkM0MUFcIiBwLWlkPVwiNTA2NVwiPjwvcGF0aD48L3N2Zz48L2k+JHt0ZXh0fVxyXG4gICAgYFxyXG4gICAgfSBlbHNlIGlmICh0eXBlID09ICd3YXJuaW5nJykge1xyXG4gICAgICBtZXNzYWdlLmlubmVySFRNTCA9IGBcclxuICAgICAgPGk+PD94bWwgdmVyc2lvbj1cIjEuMFwiIHN0YW5kYWxvbmU9XCJub1wiPz48IURPQ1RZUEUgc3ZnIFBVQkxJQyBcIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOXCIgXCJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGRcIj48c3ZnIHQ9XCIxNzU2MDkzNTk5MjU4XCIgY2xhc3M9XCJpY29uXCIgdmlld0JveD1cIjAgMCAxMDI0IDEwMjRcIiB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHAtaWQ9XCIxNjQ4XCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCI+PHBhdGggZD1cIk01MTIuMDAyNTU4IDY0LjI0NTIxYy0yNDcuMjkyMTc2IDAtNDQ3Ljc1Nzg2IDIwMC40NjQ2NjEtNDQ3Ljc1Nzg2IDQ0Ny43NTY4MzcgMCAyNDcuMjg3MDU5IDIwMC40NjQ2NjEgNDQ3Ljc1Mjc0NCA0NDcuNzU3ODYgNDQ3Ljc1Mjc0NCAyNDcuMjg2MDM2IDAgNDQ3Ljc1MTcyLTIwMC40NjQ2NjEgNDQ3Ljc1MTcyLTQ0Ny43NTI3NDRDOTU5Ljc1NDI3OSAyNjQuNzEwODk0IDc1OS4yODg1OTQgNjQuMjQ1MjEgNTEyLjAwMjU1OCA2NC4yNDUyMXpNNTEyLjAxMDc0NSA3MzUuODc1ODZjLTIwLjYwMjIyNCAwLTM3LjMxOTk3Ny0xNi43MTg3NzctMzcuMzE5OTc3LTM3LjMyMzA0NyAwLTIwLjU5NzEwNyAxNi43MTc3NTMtMzcuMzE5OTc3IDM3LjMxOTk3Ny0zNy4zMTk5NzcgMjAuNjA0MjcgMCAzNy4yOTc0NjQgMTYuNzIyODcgMzcuMjk3NDY0IDM3LjMxOTk3N0M1NDkuMzA4MjA5IDcxOS4xNTgxMDcgNTMyLjYxMzk5MiA3MzUuODc1ODYgNTEyLjAxMDc0NSA3MzUuODc1ODZ6TTU0OS4zMDgyMDkgNTY3Ljk2OTczM2MwIDIwLjYwMDE3Ny0xNi42OTMxOTQgMzcuMjkzMzcxLTM3LjI5NzQ2NCAzNy4yOTMzNzEtMjAuNjAyMjI0IDAtMzcuMzE5OTc3LTE2LjY5MzE5NC0zNy4zMTk5NzctMzcuMjkzMzcxTDQ3NC42OTA3NjggMzI1LjQyMDU4MWMwLTIwLjYwNTI5NCAxNi43MTc3NTMtMzcuMjk3NDY0IDM3LjMxOTk3Ny0zNy4yOTc0NjQgMjAuNjA0MjcgMCAzNy4yOTc0NjQgMTYuNjkzMTk0IDM3LjI5NzQ2NCAzNy4yOTc0NjRMNTQ5LjMwODIwOSA1NjcuOTY5NzMzelwiIGZpbGw9XCIjZTk4ZjM2XCIgcC1pZD1cIjE2NDlcIj48L3BhdGg+PC9zdmc+PC9pPiR7dGV4dH1cclxuICAgIGBcclxuICAgIH1cclxuXHJcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKG1lc3NhZ2UpXHJcbiAgICBtZXNzYWdlLmNsYXNzTGlzdC5hZGQodHlwZSlcclxuICB9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBUb29sc1xyXG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBUEE7QUFBQTtBQUFBO0FBVUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBUkE7QUFBQTtBQUFBO0FBVUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBVEE7QUFBQTtBQUFBO0FBV0E7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFQQTtBQUFBO0FBQUE7QUFBQTtBQVFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQUE7QUFDQTtBQW9CQTtBQUFBO0FBakJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFLQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQWhFQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQWtFQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUpBO0FBQUE7QUFBQTtBQUFBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFOQTtBQUFBO0FBQUE7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVZBO0FBQUE7QUFBQTtBQVlBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFaQTtBQUFBO0FBQUE7QUFjQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTEE7QUFBQTtBQUFBO0FBTUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVZBO0FBQUE7QUFBQTtBQVdBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFWQTtBQUFBO0FBQUE7QUFXQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFWQTtBQUFBO0FBQUE7QUFXQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFKQTtBQUFBO0FBQUE7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTkE7QUFBQTtBQUFBO0FBT0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBQUE7QUFBQTtBQUdBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFBQTtBQUFBO0FBVUE7QUFOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBQUE7QUFBQTtBQUFBO0FBSUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFJQTtBQUhBO0FBSUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUFBO0FBQUE7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFHQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQTlCQTtBQUFBO0FBQUE7QUFBQTtBQWdDQTtBQUNBO0FBQ0E7QUFGQTtBQUFBO0FBQUE7QUFBQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFBQTtBQUFBO0FBR0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBQUE7QUFBQTtBQUdBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFBQTtBQUFBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUpBO0FBQUE7QUFBQTtBQU1BO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBR0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFsOUNBO0FBQ0E7QUFBQTtBQUFBO0FBcTlDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/Tools/index.js\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/typeof */ \"./node_modules/@babel/runtime/helpers/typeof.js\");\n/* harmony import */ var _babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/toConsumableArray */ \"./node_modules/@babel/runtime/helpers/toConsumableArray.js\");\n/* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ \"./node_modules/@babel/runtime/helpers/asyncToGenerator.js\");\n/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ \"./node_modules/@babel/runtime/helpers/defineProperty.js\");\n/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ \"./node_modules/@babel/runtime/helpers/classCallCheck.js\");\n/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ \"./node_modules/@babel/runtime/helpers/createClass.js\");\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @babel/runtime/regenerator */ \"./node_modules/@babel/runtime/regenerator/index.js\");\n/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var js_md5__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! js-md5 */ \"./node_modules/js-md5/src/md5.js\");\n/* harmony import */ var js_md5__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(js_md5__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var _proj__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./proj */ \"./src/Tools/proj.js\");\n/* harmony import */ var _projConvert__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./projConvert */ \"./src/Tools/projConvert.js\");\n/* harmony import */ var _projectionConvert__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./projectionConvert */ \"./src/Tools/projectionConvert.js\");\n/* harmony import */ var _Global_global__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../Global/global */ \"./src/Global/global.js\");\n/* harmony import */ var _Obj_Materail_FlowPictureMaterialProperty__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../Obj/Materail/FlowPictureMaterialProperty */ \"./src/Obj/Materail/FlowPictureMaterialProperty.js\");\n/* harmony import */ var _Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../Global/MultiViewportMode */ \"./src/Global/MultiViewportMode/index.js\");\n\n\n\n\n\n\n\nfunction _createForOfIteratorHelper(r, e) { var t = \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && \"number\" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t.return || t.return(); } finally { if (u) throw o; } } }; }\nfunction _unsupportedIterableToArray(r, a) { if (r) { if (\"string\" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }\nfunction _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_3___default()(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\n/**\r\n * @name: index\r\n * @author: Administrator\r\n * @date: 2022-06-09 16:46\r\n * @description:index\r\n * @update: 2022-06-09 16:46\r\n */\n\n\n\n\n\n\n\nvar Tools = /*#__PURE__*/function () {\n /**\r\n * @constructor\r\n * @desc 工具类\r\n * */\n function Tools(sdk, options) {\n _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_4___default()(this, Tools);\n this.sdk = sdk;\n if (this.sdk) {\n this.name_map = this.sdk.proj.name_map;\n this.epsg_map = this.sdk.proj.epsg_map;\n this.convert = this.sdk.proj.convert;\n this.getAllProjection = this.sdk.proj.getAllProjection;\n this.projectionIsExists = this.sdk.proj.projectionIsExists;\n this.degreesToDMS = this.sdk.proj.degreesToDMS;\n this.dmsToDecimal = this.sdk.proj.dmsToDecimal;\n }\n this.options = _objectSpread({}, options);\n }\n return _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_5___default()(Tools, [{\n key: \"POST\",\n get: function get() {\n return 'POST';\n }\n }, {\n key: \"GET\",\n get: function get() {\n return 'GET';\n }\n }, {\n key: \"degreesToRadians\",\n value:\n /**\r\n * @description 将角度转换为弧度\r\n * @method degreesToRadians\r\n * @param degrees {number} 弧度制\r\n * @return radians {number}\r\n * @memberOf Tools\r\n * @example let radians = tool.degreesToRadians(20)\r\n * */\n function degreesToRadians(degrees) {\n return turf.degreesToRadians(Number(degrees)); // 1.0471975511965976\n }\n\n /**\r\n * @description 将弧度转换为角度\r\n * @method radiansToDegrees\r\n * @param radians {number} 弧度制\r\n * @return degrees {number}\r\n * @memberOf Tools\r\n * @example let degrees = tool.radiansToDegrees(2)\r\n * */\n }, {\n key: \"radiansToDegrees\",\n value: function radiansToDegrees(radians) {\n return turf.radiansToDegrees(Number(radians)); // 1.0471975511965976\n }\n\n /**\r\n * @desc 随机字符串\r\n * @function randomString\r\n * @memberOf extra\r\n * @param {number} [e=32] 字符串长度\r\n * @returns {string} str 字符串\r\n * @memberOf Tools\r\n * @example let strings=tool.randomString()\r\n * */\n }, {\n key: \"randomString\",\n value: function randomString(e) {\n /* e = e || 32\r\n var t = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678',\r\n a = t.length,\r\n n = ''\r\n for (let i = 0; i < e; i++) n += t.charAt(Math.floor(Math.random() * a))*/\n return Cesium.createGuid();\n }\n }, {\n key: \"getSourceRootPath\",\n value: function getSourceRootPath() {\n var sdkName = 'YJEarth.min.js';\n var scripts = document.querySelectorAll('script');\n var prefix = '';\n scripts.forEach(function (item) {\n if (item.src && item.src.indexOf(sdkName) > -1) {\n var arr = item.src.split('/');\n arr.pop();\n prefix = arr.join('/');\n }\n });\n return prefix;\n }\n\n /**@description 笛卡尔坐标转经纬度\r\n * @method cartesian3Towgs84\r\n * @param cartesian {Cesium.Cartesian3} 笛卡尔坐标\r\n * @param viewer\r\n * @param cartesian.x {number}\r\n * @param cartesian.y {number}\r\n * @param cartesian.z {number}\r\n * @memberOf Tools\r\n * @return {object} wgs84 返回wgs84坐标\r\n * */\n }, {\n key: \"cartesian3Towgs84\",\n value: function cartesian3Towgs84(cartesian, viewer) {\n var ellipsoid = viewer.scene.globe.ellipsoid;\n var cartesian3 = new Cesium.Cartesian3(cartesian.x, cartesian.y, cartesian.z);\n var cartographic = ellipsoid.cartesianToCartographic(cartesian3);\n var lat = Cesium.Math.toDegrees(cartographic.latitude);\n var lng = Cesium.Math.toDegrees(cartographic.longitude);\n var alt = cartographic.height < 0 ? 0 : cartographic.height;\n // var alt = cartographic.height\n return {\n lng: Number(lng.toFixed(8)),\n lat: Number(lat.toFixed(8)),\n alt: Number(alt.toFixed(2))\n };\n }\n\n /**\r\n * @desc 计算多线段长度\r\n * @method computeDistance\r\n * @memberOf Tools\r\n *@param positions {Array.<{lng:number, lat:number,alt:number}>}坐标数组\r\n * @param [fractionDigits=2] 保留小数点位数\r\n * @param [ground=true] 是否贴地\r\n * */\n }, {\n key: \"computeDistance\",\n value: (function () {\n var _computeDistance = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_6___default.a.mark(function _callee() {\n var positions,\n fractionDigits,\n type,\n length,\n i,\n position1,\n position2,\n distance,\n _i,\n _position,\n _position2,\n _distance,\n meters,\n lineString2,\n line2,\n d,\n res,\n coordinates,\n arr,\n _iterator,\n _step,\n item,\n index,\n r,\n l,\n _i2,\n _position3,\n _position4,\n _distance2,\n _args = arguments;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_6___default.a.wrap(function _callee$(_context) {\n while (1) switch (_context.prev = _context.next) {\n case 0:\n positions = _args.length > 0 && _args[0] !== undefined ? _args[0] : [];\n fractionDigits = _args.length > 1 && _args[1] !== undefined ? _args[1] : 2;\n type = _args.length > 2 && _args[2] !== undefined ? _args[2] : 0;\n if (!(positions.length < 2)) {\n _context.next = 7;\n break;\n }\n return _context.abrupt(\"return\", 0);\n case 7:\n length = 0;\n _context.t0 = type;\n _context.next = _context.t0 === '0' ? 11 : _context.t0 === 0 ? 11 : _context.t0 === '1' ? 13 : _context.t0 === 1 ? 13 : _context.t0 === '2' ? 15 : _context.t0 === 2 ? 15 : 48;\n break;\n case 11:\n for (i = 0; i < positions.length - 1; i++) {\n position1 = Cesium.Cartesian3.fromDegrees(positions[i].lng, positions[i].lat, positions[i].alt);\n position2 = Cesium.Cartesian3.fromDegrees(positions[i + 1].lng, positions[i + 1].lat, positions[i + 1].alt);\n distance = Cesium.Cartesian3.distance(position1, position2);\n length = length + distance;\n }\n return _context.abrupt(\"break\", 49);\n case 13:\n for (_i = 0; _i < positions.length - 1; _i++) {\n _position = Cesium.Cartesian3.fromDegrees(positions[_i].lng, positions[_i].lat, 0);\n _position2 = Cesium.Cartesian3.fromDegrees(positions[_i + 1].lng, positions[_i + 1].lat, 0);\n _distance = Cesium.Cartesian3.distance(_position, _position2);\n length = length + _distance;\n }\n return _context.abrupt(\"break\", 49);\n case 15:\n lineString2 = [];\n positions.forEach(function (item) {\n lineString2.push([item.lng, item.lat, item.alt]);\n });\n line2 = turf.lineString(lineString2);\n d = turf.length(line2) * 1000;\n meters = d > 20 ? d / 20 : d;\n res = this.chunkLine(positions, meters);\n coordinates = [];\n res.forEach(function (Feature, index) {\n if (index === 0) {\n coordinates = _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_1___default()(Feature.geometry.coordinates);\n } else {\n coordinates.push(Feature.geometry.coordinates[1]);\n }\n });\n arr = [];\n _iterator = _createForOfIteratorHelper(coordinates);\n _context.prev = 25;\n _iterator.s();\n case 27:\n if ((_step = _iterator.n()).done) {\n _context.next = 37;\n break;\n }\n item = _step.value;\n index = coordinates.indexOf(item);\n _context.next = 32;\n return this.sampleHeight({\n lng: item[0],\n lat: item[1],\n alt: 0\n }, index);\n case 32:\n r = _context.sent;\n r.position.alt = r.position.alt < 0 ? 0 : r.position.alt;\n arr.push(r);\n case 35:\n _context.next = 27;\n break;\n case 37:\n _context.next = 42;\n break;\n case 39:\n _context.prev = 39;\n _context.t1 = _context[\"catch\"](25);\n _iterator.e(_context.t1);\n case 42:\n _context.prev = 42;\n _iterator.f();\n return _context.finish(42);\n case 45:\n l = arr.length - 1;\n for (_i2 = 0; _i2 < arr.length - 1; _i2++) {\n _position3 = Cesium.Cartesian3.fromDegrees(arr[_i2].position.lng, arr[_i2].position.lat, 0);\n _position4 = Cesium.Cartesian3.fromDegrees(arr[_i2 + 1].position.lng, arr[_i2 + 1].position.lat, 0);\n _distance2 = Cesium.Cartesian3.distance(_position3, _position4);\n length = length + _distance2;\n }\n return _context.abrupt(\"break\", 49);\n case 48:\n return _context.abrupt(\"break\", 49);\n case 49:\n return _context.abrupt(\"return\", length.toFixed(fractionDigits));\n case 50:\n case \"end\":\n return _context.stop();\n }\n }, _callee, this, [[25, 39, 42, 45]]);\n }));\n function computeDistance() {\n return _computeDistance.apply(this, arguments);\n }\n return computeDistance;\n }())\n }, {\n key: \"computeDistance2\",\n value: function computeDistance2() {\n var positions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n var fractionDigits = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 2;\n var ground = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;\n if (positions.length < 2) {\n return 0;\n } else {\n var length = 0;\n if (ground) {\n var lineString = [];\n positions.forEach(function (item) {\n lineString.push([item.lng, item.lat, item.alt]);\n });\n var line = turf.lineString(lineString);\n length = turf.length(line) * 1000;\n } else {\n for (var i = 0; i < positions.length - 1; i++) {\n var position1 = Cesium.Cartesian3.fromDegrees(positions[i].lng, positions[i].lat, positions[i].alt);\n var position2 = Cesium.Cartesian3.fromDegrees(positions[i + 1].lng, positions[i + 1].lat, positions[i + 1].alt);\n var distance = Cesium.Cartesian3.distance(position1, position2);\n length = length + distance;\n }\n }\n return length.toFixed(fractionDigits);\n }\n }\n }, {\n key: \"sampleHeight\",\n value: function () {\n var _sampleHeight = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_6___default.a.mark(function _callee2(p1, index) {\n var p2;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_6___default.a.wrap(function _callee2$(_context2) {\n while (1) switch (_context2.prev = _context2.next) {\n case 0:\n _context2.next = 2;\n return this.sampleHeightMostDetailed([p1]);\n case 2:\n p2 = _context2.sent;\n p1.alt = p2[0].height;\n return _context2.abrupt(\"return\", {\n position: p1,\n index: index\n });\n case 5:\n case \"end\":\n return _context2.stop();\n }\n }, _callee2, this);\n }));\n function sampleHeight(_x, _x2) {\n return _sampleHeight.apply(this, arguments);\n }\n return sampleHeight;\n }()\n /**@description 计算多边形面积\r\n * @method computeArea\r\n * @memberOf Tools\r\n * @param positions {Array.<{lng:number, lat:number,alt:number}>}\r\n * @param [fractionDigits=2] {number} 精确到小数点多少位\r\n * @return {number} 面积\r\n * */\n }, {\n key: \"computeArea\",\n value: function computeArea(positions) {\n var fractionDigits = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 2;\n if (positions.length < 3) {\n return 0;\n } else {\n var p = [];\n positions.forEach(function (item) {\n p.push([item.lng, item.lat]);\n });\n p.push(p[0]);\n var polygon = turf.polygon([p]);\n var triangles = turf.tesselate(polygon);\n return Number(turf.area(triangles).toFixed(fractionDigits));\n }\n }\n }, {\n key: \"computeSignedArea\",\n value: function computeSignedArea(viewer, path) {\n var _this = this;\n var fromDegreesArray = [];\n var fromDegreesArray2 = [];\n for (var i = 0; i < path.length; i++) {\n fromDegreesArray.push(path[i].lng, path[i].lat);\n fromDegreesArray2.push([path[i].lng, path[i].lat]);\n }\n var line = turf.lineString(fromDegreesArray2);\n var bbox = turf.bbox(line);\n var longRadians = Cesium.Math.toRadians(bbox[2] - bbox[0]);\n var latRadians = Cesium.Math.toRadians(bbox[3] - bbox[1]);\n var granularity;\n if (longRadians > latRadians) {\n granularity = longRadians / 10;\n } else {\n granularity = latRadians / 10;\n }\n\n // let granularity = Math.PI / Math.pow(2, 11);\n // granularity = granularity / 1250;\n var polygonGeometry = new Cesium.PolygonGeometry.fromPositions({\n positions: Cesium.Cartesian3.fromDegreesArray(fromDegreesArray),\n vertexFormat: Cesium.PerInstanceColorAppearance.FLAT_VERTEX_FORMAT,\n granularity: granularity\n });\n //创建自定义平面几何体\n var geom = new Cesium.PolygonGeometry.createGeometry(polygonGeometry);\n if (!geom || !geom.attributes || !geom.attributes.position) {\n return 0;\n }\n var indices = geom.indices; //获取顶点索引数据\n var positions = geom.attributes.position.values;\n function returnPosition(position, index) {\n var pos3 = new Cesium.Cartesian3(positions[index * 3], positions[index * 3 + 1], positions[index * 3 + 2]);\n var position1 = viewer.scene.clampToHeight(pos3) || pos3;\n // let pos84 = await _this.cartesian3Towgs84(position1, viewer)\n // let height = 0\n // try {\n // let position2 = await Cesium.sampleTerrainMostDetailed(\n // viewer.scene.terrainProvider,\n // [Cesium.Cartographic.fromCartesian(pos3)]\n // )\n // height = position2[0].height\n // } catch (error) {\n // height = 0\n // }\n // if (height > pos84.alt) {\n // pos84.alt = height\n // }\n return position1;\n }\n var area = 0;\n for (var index = 0; index < indices.length; index += 3) {\n var pos0 = returnPosition(positions, indices[index]);\n var pos1 = returnPosition(positions, indices[index + 1]);\n var pos2 = returnPosition(positions, indices[index + 2]);\n // let entity = viewer.entities.add({\n // name: \"三角面\",\n // polygon: {\n // hierarchy: [pos0, pos1, pos2],\n // perPositionHeight: true,\n // material: Cesium.Color.fromRandom(),\n // outline: true,\n // outlineColor: Cesium.Color.BLACK,\n // },\n // });\n\n var v0 = Cesium.Cartesian3.subtract(pos0, pos1, new Cesium.Cartesian3());\n var v1 = Cesium.Cartesian3.subtract(pos2, pos1, new Cesium.Cartesian3());\n var cross = Cesium.Cartesian3.cross(v0, v1, v0);\n area = area + Cesium.Cartesian3.magnitude(cross) * 0.5;\n }\n return Number(area.toFixed(2));\n }\n\n /**\r\n * @desc 创建圆\r\n *@method createCircle\r\n * @param point {object} 圆心坐标\r\n * @param point.lng {number} 经度\r\n * @param point.lat {number} 纬度\r\n * @param radius {number} 半径 单位:米\r\n * @param [options]\r\n * @param [options.steps=360] {number} 段数\r\n * @memberOf Tools\r\n * */\n }, {\n key: \"createCircle\",\n value: function createCircle(point) {\n var radius = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {\n steps: 360\n };\n if (Number(radius) <= 0) {\n radius = 0.01;\n }\n var center = [Number(point.lng), Number(point.lat)];\n var coordinates = turf.circle(center, radius / 1000, options).geometry.coordinates[0];\n var positions = [];\n coordinates.forEach(function (item) {\n positions = positions.concat(item);\n });\n return positions;\n }\n\n /**\r\n * @desc 创建椭圆\r\n *@method createEllipse\r\n * @param point {object} 圆心坐标\r\n * @param point.lng {number} 经度\r\n * @param point.lat {number} 纬度\r\n * @param [options]\r\n * @param [options.granularity=0.1] {number} 椭圆上点之间的角度\r\n * @param [options.semiMinorAxis=10] {number} 短半轴长度 单位:米\r\n * @param [options.semiMajorAxis=20] {number} 长半轴长度 单位:米\r\n * @param [options.bearing=0] {number} 椭圆旋转角度 单位:米\r\n * @memberOf Tools\r\n * */\n }, {\n key: \"createEllipse\",\n value: function createEllipse(point) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n granularity: 0.1,\n semiMinorAxis: 10,\n semiMajorAxis: 20,\n bearing: 0,\n height: 0\n };\n if (!options.granularity) {\n options.granularity = 0.1;\n }\n if (!options.height) {\n options.height = 0;\n }\n if (!options.semiMinorAxis) {\n options.semiMinorAxis = 0.00001;\n }\n if (!options.semiMajorAxis) {\n options.semiMajorAxis = 0.00001;\n }\n var ellipseGeometry = new Cesium.EllipseOutlineGeometry({\n center: Cesium.Cartesian3.fromDegrees(Number(point.lng), Number(point.lat)),\n semiMajorAxis: Number(options.semiMajorAxis),\n semiMinorAxis: Number(options.semiMinorAxis),\n height: Number(options.height),\n granularity: Cesium.Math.toRadians(options.granularity),\n rotation: Cesium.Math.toRadians(options.bearing)\n });\n var ellipse = Cesium.EllipseOutlineGeometry.createGeometry(ellipseGeometry);\n if (!ellipse || !ellipse.attributes || !ellipse.attributes.position) {\n return [];\n }\n var ellipsePositions = ellipse.attributes.position.values;\n var positions = [];\n for (var i = 0; i < ellipsePositions.length; i += 3) {\n var pos = new Cesium.Cartesian3(ellipsePositions[i], ellipsePositions[i + 1], ellipsePositions[i + 2]);\n positions.push(pos);\n }\n return positions;\n }\n\n /*计算2点的恒相线夹角*/\n }, {\n key: \"rhumbBearing\",\n value: function rhumbBearing(p1, p2) {\n var point1 = turf.point([p1.lng, p1.lat]);\n var point2 = turf.point([p2.lng, p2.lat]);\n return turf.rhumbBearing(point1, point2);\n }\n }, {\n key: \"computeCenter\",\n value: function computeCenter() {\n var positions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n var arr = [];\n positions.forEach(function (item) {\n arr.push(turf.point([item.lng, item.lat]));\n });\n var features = turf.featureCollection(arr);\n var coordinates = turf.center(features).geometry.coordinates;\n return {\n lng: coordinates[0],\n lat: coordinates[1]\n };\n }\n\n //计算2点的中心点\n }, {\n key: \"computeMidpoint\",\n value: function computeMidpoint(point1, point2) {\n var p1 = turf.point([point1.lng, point1.lat]);\n var p2 = turf.point([point2.lng, point2.lat]);\n var center = turf.midpoint(p1, p2).geometry.coordinates;\n return {\n lng: center[0],\n lat: center[1]\n };\n }\n\n //计算\n }, {\n key: \"computeAttackArrow\",\n value: function computeAttackArrow() {\n var positions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n return this.computeArrow(positions, 0);\n }\n\n //计算钳击箭头\n }, {\n key: \"computePincerArrow\",\n value: function computePincerArrow() {\n var positions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n return this.computeArrow(positions);\n }\n\n //计算攻击箭头\n }, {\n key: \"computeArrow\",\n value: function computeArrow() {\n var positions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n if (positions.length < 3) {\n return [];\n } else {\n var lnglatArr = [];\n // if(positions.every(pos => Number(pos.lng) >= 0) || positions.every(pos => Number(pos.lng) <= 0)) {\n // for (var i = 0; i < positions.length; i++) {\n // lnglatArr.push([positions[i].lng, positions[i].lat])\n // }\n // }\n // else {\n // for (var i = 0; i < positions.length; i++) {\n // if(positions[i].lng<0) {\n // lnglatArr.push([positions[i].lng+360, positions[i].lat])\n // }\n // else {\n // lnglatArr.push([positions[i].lng, positions[i].lat])\n // }\n // }\n // }\n for (var i = 0; i < positions.length; i++) {\n lnglatArr.push([positions[i].lng, positions[i].lat]);\n }\n var res;\n if (type) {\n res = xp.algorithm.doubleArrow(lnglatArr);\n } else {\n res = xp.algorithm.tailedAttackArrow(lnglatArr);\n }\n var index = JSON.stringify(res.polygonalPoint).indexOf('null');\n var returnData = [];\n if (index === -1) returnData = res.polygonalPoint;\n return returnData;\n }\n }\n\n // 计算集结地\n }, {\n key: \"computeAssemble\",\n value: function computeAssemble() {\n var positions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n var is84 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n if (positions.length < 2) {\n return [];\n } else {\n var points = positions.length;\n var pnts = new Array();\n positions.forEach(function (item) {\n pnts.push([item.lng, item.lat]);\n });\n //console.log(\"pnts6666\",pnts);\n // pnts.push(tailPoint);\n // pnts.push(headerPoint);\n\n if (pnts.length === 2) {\n var _mid = P.PlotUtils.mid(pnts[0], pnts[1]);\n //let d = utils.MathDistance(pnts[0], mid) / 0.9\n var d = P.PlotUtils.distance(pnts[0], _mid) / 0.9;\n //console.log(\"d\",d);\n var pnt = P.PlotUtils.getThirdPoint(pnts[0], _mid, P.Constants.HALF_PI, d, true);\n pnts = [pnts[0], pnt, pnts[1]];\n //console.log(\"pnt\",pnt);\n //createPoint(Cesium.Cartesian3.fromDegrees(pnt[0], pnt[1]));\n }\n var mid = P.PlotUtils.mid(pnts[0], pnts[2]);\n pnts.push(mid, pnts[0], pnts[1]);\n var normals = [],\n pnt1 = undefined,\n pnt2 = undefined,\n pnt3 = undefined,\n result = [],\n result2 = [];\n for (var i = 0; i < pnts.length - 2; i++) {\n pnt1 = pnts[i];\n pnt2 = pnts[i + 1];\n pnt3 = pnts[i + 2];\n var normalPoints = P.PlotUtils.getBisectorNormals(0.4, pnt1, pnt2, pnt3);\n normals = normals.concat(normalPoints);\n }\n var count = normals.length;\n normals = [normals[count - 1]].concat(normals.slice(0, count - 1));\n for (var _i3 = 0; _i3 < pnts.length - 2; _i3++) {\n pnt1 = pnts[_i3];\n pnt2 = pnts[_i3 + 1];\n result = result.concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_1___default()(pnt1));\n for (var t = 0; t <= P.Constants.FITTING_COUNT; t++) {\n var _pnt = P.PlotUtils.getCubicValue(t / P.Constants.FITTING_COUNT, pnt1, normals[_i3 * 2], normals[_i3 * 2 + 1], pnt2);\n result = result.concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_1___default()(_pnt));\n }\n result = result.concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_1___default()(pnt2));\n }\n if (is84) {\n return result;\n } else {\n return Cesium.Cartesian3.fromDegreesArray(result);\n }\n }\n }\n\n // 计算直线箭头\n }, {\n key: \"computeStraightArrow\",\n value: function computeStraightArrow() {\n var positions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n var is84 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n if (positions.length < 2) {\n return [];\n }\n var point1 = [positions[0].lng, positions[0].lat];\n var point2 = [positions[1].lng, positions[1].lat];\n if (positions[0].lng === positions[1].lng && positions[0].lat === positions[1].lat) {\n if (is84) {\n return [positions[0], positions[0], positions[0]];\n } else {\n var cartesian3 = Cesium.Cartesian3.fromDegrees(positions[0].lng, positions[0].lat);\n return [cartesian3, cartesian3, cartesian3];\n }\n }\n var lnglatArr = [];\n for (var i = 0; i < positions.length; i++) {\n lnglatArr.push([positions[i].lng, positions[i].lat]);\n }\n var res;\n res = xp.algorithm.fineArrow(point1, point2);\n if (is84) {\n var pos84 = [];\n for (var _i4 = 0; _i4 < res.length; _i4++) {\n var pos = this.cartesian3Towgs84(res[_i4], this.sdk.viewer);\n pos84.push(pos.lng, pos.lat);\n }\n return pos84;\n }\n return res;\n }\n }, {\n key: \"getMaterial\",\n value: function getMaterial() {\n var color = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '#2ab0c2';\n var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n var entity = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n var newParam = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n var material = '';\n var arr = {\n '7': 10,\n '8': 3,\n '9': 4,\n '10': 4,\n '11': 4,\n '12': 2\n };\n if (entity) {\n arr[type + ''] ? entity.polyline.width = entity.polyline.oriWidth + arr[type + ''] : entity.polyline.width = entity.polyline.oriWidth;\n }\n switch (Number(type)) {\n case 1:\n //虚线\n material = new Cesium.PolylineDashMaterialProperty({\n color: Cesium.Color.fromCssColorString(color),\n dashLength: 10 //短划线长度\n });\n break;\n case 2:\n //泛光\n material = new Cesium.PolylineGlowMaterialProperty({\n glowPower: 0.2,\n color: Cesium.Color.fromCssColorString(color)\n });\n break;\n case 3:\n //尾迹光线\n material = new Cesium.PolylineFlowMaterialProperty({\n color: color,\n speed: newParam.rotate ? newParam.speed : 0 - newParam.speed,\n rotate: newParam.rotate\n });\n break;\n case 4:\n //多尾迹光线\n material = new Cesium.PolylineFlowMultMaterialProperty({\n color: color,\n speed: newParam.rotate ? newParam.speed : 0 - newParam.speed,\n rotate: newParam.rotate\n });\n break;\n case 5: //普通流动虚线\n // material = new Cesium.FlowDashedLineFlowMaterialProperty({\n // color: color,\n // uType: 0,\n // speed: newParam.rotate ? newParam.speed : 0 - newParam.speed,\n // // dashSize: newParam.dashSize,\n // space: newParam.space,\n // scale: 1.0\n // })\n // break\n case 6:\n //流动虚线2\n var that = this;\n var repeatX;\n material = new Cesium.FlowDashedLineFlowMaterialProperty({\n color: color,\n uType: type == 5 ? 0 : 1,\n speed: newParam.rotate ? newParam.speed : 0 - newParam.speed,\n // dashSize: newParam.dashSize,\n space: newParam.space,\n scale: new Cesium.CallbackProperty(function () {\n if (that.sdk.viewer.scene.mode === Cesium.SceneMode.SCENE3D) {\n var oriPositions = entity.polyline.positions.getValue();\n if (!Cesium.defined(oriPositions)) {\n return 1.0;\n }\n var distance = 0;\n for (var i = 0; i < oriPositions.length - 1; ++i) {\n distance += Cesium.Cartesian3.distance(oriPositions[i], oriPositions[i + 1]);\n }\n //屏幕坐标\n var point1 = new Cesium.Cartesian2(0, that.sdk.viewer.canvas.clientHeight);\n var point2 = new Cesium.Cartesian2(that.sdk.viewer.canvas.clientWidth / 2, that.sdk.viewer.canvas.clientHeight);\n var cartesian1 = that.sdk.viewer.scene.pickPosition(point1);\n var cartesian2 = that.sdk.viewer.scene.pickPosition(point2);\n if (cartesian1 && cartesian2) {\n var distance2 = Cesium.Cartesian3.distance(cartesian1, cartesian2);\n repeatX = distance2 * 2 / distance;\n }\n return repeatX;\n } else {\n var sdk3d = Object(_Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_13__[\"get3DView\"])();\n var sdk3dEntity = sdk3d.viewer.entities.getById(that.options.id);\n var _oriPositions = sdk3dEntity.polyline.positions.getValue();\n if (!Cesium.defined(_oriPositions)) {\n return 1.0;\n }\n var _distance3 = 0;\n for (var _i5 = 0; _i5 < _oriPositions.length - 1; ++_i5) {\n _distance3 += Cesium.Cartesian3.distance(_oriPositions[_i5], _oriPositions[_i5 + 1]);\n }\n //屏幕坐标\n var _point = new Cesium.Cartesian2(0, sdk3d.viewer.canvas.clientHeight);\n var _point2 = new Cesium.Cartesian2(sdk3d.viewer.canvas.clientWidth / 2, sdk3d.viewer.canvas.clientHeight);\n var _cartesian = sdk3d.viewer.scene.pickPosition(_point);\n var _cartesian2 = sdk3d.viewer.scene.pickPosition(_point2);\n if (_cartesian && _cartesian2) {\n var _distance4 = Cesium.Cartesian3.distance(_cartesian, _cartesian2);\n repeatX = _distance4 * 2 / _distance3;\n }\n return repeatX;\n }\n })\n });\n break;\n case 7: //流动箭头1\n case 8: //流动箭头2\n case 9: //流动箭头3\n case 10: //流动箭头4\n case 11: //流动箭头5\n case 12:\n //流动箭头6\n var param = {\n color: color,\n image: this.getSourceRootPath() + \"/img/arrow/\".concat(type - 6, \".png\"),\n space: newParam.space,\n speed: newParam.speed\n };\n param.speed = newParam.rotate ? param.speed : 0 - param.speed;\n this.getFlowTexture(this, param, entity);\n break;\n default:\n material = Cesium.Color.fromCssColorString(color);\n break;\n }\n return material;\n }\n }, {\n key: \"getFlowTexture\",\n value: function getFlowTexture(that, options, entity) {\n var canvasEle = document.createElement('canvas');\n var ctx = canvasEle.getContext('2d');\n var myImg = new Image();\n // myImg.src = that.getSourceRootPath() + '/img/arrow/1.png'\n myImg.src = options.image;\n myImg.onload = function () {\n options.space = Math.max(0.1, options.space);\n if (options.speed > 0 || options.speed == 0) {\n canvasEle.width = myImg.width * (options.space + 1);\n canvasEle.height = myImg.height;\n ctx.drawImage(myImg, myImg.width * (options.space / 2), 0);\n } else {\n ctx.clearRect(0, 0, canvasEle.width, canvasEle.height);\n canvasEle.width = myImg.width * (options.space + 1);\n canvasEle.height = myImg.height;\n ctx.save(); // 保存当前状态\n ctx.translate(canvasEle.width / 2, canvasEle.height / 2); // 移动原点至中心\n ctx.rotate(Math.PI); // (弧度制)\n ctx.translate(-canvasEle.width / 2, -canvasEle.height / 2); // 移回原点\n ctx.drawImage(myImg, myImg.width * (options.space / 2), 0);\n ctx.restore(); // 恢复状态\n }\n\n // let repeat = getRepeat()\n // }, false)\n // entity.polyline.material.oriRepeat = that.getSceenLine(entity, options, canvasEle)\n // entity.polyline.material.oriSpeed = undefined\n var beforeSpeed = 0,\n repeat = 0;\n entity.polyline.material = new Cesium.LineTextureMaterialProperty({\n color: options.color,\n image: canvasEle,\n speed: options.speed,\n repeat: new Cesium.CallbackProperty(function () {\n if (that.sdk.viewer.scene.mode === Cesium.SceneMode.SCENE3D) {\n var positionProperty = entity.polyline.positions;\n var positions = positionProperty.getValue(that.sdk.viewer.clock.currentTime);\n if (!Cesium.defined(positions)) {\n return new Cesium.Cartesian2(1.0, 1.0);\n // return 1.0;\n }\n var distance = 0;\n for (var i = 0; i < positions.length - 1; ++i) {\n // if (that.sdk.viewer.scene.mode===Cesium.SceneMode.SCENE2D){}\n distance += Cesium.Cartesian3.distance(positions[i], positions[i + 1]);\n }\n var repeatX = distance / entity.polyline.width.getValue();\n // 根据地图缩放程度调整repeatX\n var cameraHeight = that.sdk.viewer.camera.positionCartographic.height;\n var boundingSphere = new Cesium.BoundingSphere(new Cesium.Cartesian3(-1000000, 0, 0),\n // 中心点坐标\n 500000 // 半径(距离)\n );\n\n // 获取绘图缓冲区的宽度和高度(通常是屏幕的分辨率)\n var drawingBufferWidth = that.sdk.viewer.canvas.clientWidth;\n var drawingBufferHeight = that.sdk.viewer.canvas.clientHeight;\n\n // 使用 getPixelSize 方法获取包围球在屏幕上的像素大小\n var groundResolution = that.sdk.viewer.scene.camera.getPixelSize(boundingSphere, drawingBufferWidth, drawingBufferHeight);\n var result;\n if (groundResolution > 700) {\n repeatX *= groundResolution / cameraHeight / (options.space * (canvasEle.width / canvasEle.height * 5) + 1);\n // if (entity.polyline.material.oriRepeat) {\n var speed = repeatX / entity.polyline.oriRepeat;\n entity.polyline.oriSpeed = speed;\n entity.polyline.oriRepeatX = repeatX;\n // } else {\n // entity.polyline.material.oriRepeat = repeatX\n // }\n beforeSpeed = speed;\n repeat = repeatX;\n result = new Cesium.Cartesian2(repeatX, speed || 1.0);\n } else {\n result = new Cesium.Cartesian2(repeat || entity.polyline.oriRepeatX, beforeSpeed || entity.polyline.oriSpeed);\n }\n return result;\n } else {\n var sdk3d = Object(_Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_13__[\"get3DView\"])();\n var sdk3dEntity = sdk3d.viewer.entities.getById(that.options.id);\n var _positionProperty = sdk3dEntity.polyline.positions;\n var _positions = _positionProperty.getValue(sdk3d.viewer.clock.currentTime);\n if (!Cesium.defined(_positions)) {\n return new Cesium.Cartesian2(1.0, 1.0);\n // return 1.0;\n }\n var _distance5 = 0;\n for (var _i6 = 0; _i6 < _positions.length - 1; ++_i6) {\n // if (that.sdk.viewer.scene.mode===Cesium.SceneMode.SCENE2D){}\n _distance5 += Cesium.Cartesian3.distance(_positions[_i6], _positions[_i6 + 1]);\n }\n var _repeatX = _distance5 / sdk3dEntity.polyline.width.getValue();\n // 根据地图缩放程度调整repeatX\n var _cameraHeight = sdk3d.viewer.camera.positionCartographic.height;\n var _boundingSphere = new Cesium.BoundingSphere(new Cesium.Cartesian3(-1000000, 0, 0),\n // 中心点坐标\n 500000 // 半径(距离)\n );\n\n // 获取绘图缓冲区的宽度和高度(通常是屏幕的分辨率)\n var _drawingBufferWidth = sdk3d.viewer.canvas.clientWidth;\n var _drawingBufferHeight = sdk3d.viewer.canvas.clientHeight;\n\n // 使用 getPixelSize 方法获取包围球在屏幕上的像素大小\n var _groundResolution = sdk3d.viewer.scene.camera.getPixelSize(_boundingSphere, _drawingBufferWidth, _drawingBufferHeight);\n var _result;\n if (_groundResolution > 700) {\n _repeatX *= _groundResolution / _cameraHeight / (options.space * (canvasEle.width / canvasEle.height * 5) + 1);\n // if (entity.polyline.material.oriRepeat) {\n var _speed = _repeatX / sdk3dEntity.polyline.oriRepeat;\n sdk3dEntity.polyline.oriSpeed = _speed;\n sdk3dEntity.polyline.oriRepeatX = _repeatX;\n // } else {\n // entity.polyline.material.oriRepeat = repeatX\n // }\n beforeSpeed = _speed;\n repeat = _repeatX;\n _result = new Cesium.Cartesian2(_repeatX, _speed || 1.0);\n } else {\n _result = new Cesium.Cartesian2(repeat || sdk3dEntity.polyline.oriRepeatX, beforeSpeed || sdk3dEntity.polyline.oriSpeed);\n }\n return _result;\n }\n\n // return repeatX;\n })\n });\n var oriRepeat = that.getSceenLine(entity, options, canvasEle);\n oriRepeat && (entity.polyline.oriRepeat = oriRepeat);\n };\n }\n /**获取当前满屏横线速度 */\n }, {\n key: \"getSceenLine\",\n value: function getSceenLine(entity, options, canvasEle) {\n var point1 = new Cesium.Cartesian2(0, this.sdk.viewer.canvas.clientHeight);\n var point2 = new Cesium.Cartesian2(this.sdk.viewer.canvas.clientWidth / 2, this.sdk.viewer.canvas.clientHeight);\n // var cartesian1 = this.sdk.viewer.scene.pickPosition(point1)\n // var cartesian2 = this.sdk.viewer.scene.pickPosition(point2)\n var ray = this.sdk.viewer.camera.getPickRay(point1);\n var cartesian1 = this.sdk.viewer.scene.globe.pick(ray, this.sdk.viewer.scene);\n var ray2 = this.sdk.viewer.camera.getPickRay(point2);\n var cartesian2 = this.sdk.viewer.scene.globe.pick(ray2, this.sdk.viewer.scene);\n if (cartesian1 && cartesian2) {\n var distance = Cesium.Cartesian3.distance(cartesian1, cartesian2);\n var repeatX = distance / entity.polyline.width.getValue();\n // 根据地图缩放程度调整repeatX\n var cameraHeight = this.sdk.viewer.camera.positionCartographic.height;\n var boundingSphere = new Cesium.BoundingSphere(new Cesium.Cartesian3(-1000000, 0, 0),\n // 中心点坐标\n 500000 // 半径(距离)\n );\n\n // 获取绘图缓冲区的宽度和高度(通常是屏幕的分辨率)\n var drawingBufferWidth = this.sdk.viewer.canvas.clientWidth;\n var drawingBufferHeight = this.sdk.viewer.canvas.clientHeight;\n\n // 使用 getPixelSize 方法获取包围球在屏幕上的像素大小\n var groundResolution = this.sdk.viewer.scene.camera.getPixelSize(boundingSphere, drawingBufferWidth, drawingBufferHeight);\n // repeatX *= groundResolution / cameraHeight / ((myImg.width / myImg.height * 5) + 1);\n if (groundResolution > 700) {\n repeatX *= groundResolution / cameraHeight / (options.space * (canvasEle.width / canvasEle.height * 5) + 1);\n } else {\n repeatX = undefined;\n }\n if (this.sdk.viewer.scene.mode === Cesium.SceneMode.SCENE3D) {\n return repeatX;\n } else {\n var sdk3d = Object(_Global_MultiViewportMode__WEBPACK_IMPORTED_MODULE_13__[\"get3DView\"])();\n var sdk3dEntity = sdk3d.viewer.entities.getById(this.options.id);\n return sdk3dEntity.polyline.oriRepeatX;\n }\n }\n }\n\n /*创建直箭头图片*/\n }, {\n key: \"create_arrow1_picture\",\n value: function create_arrow1_picture(color) {\n var canvas = new fabric.Canvas('canvas');\n canvas.width = 150;\n canvas.height = 75;\n var w_offset = 35;\n var h_offset = 20;\n var fill = color;\n var polygon = new fabric.Polygon([{\n x: canvas.width,\n y: canvas.height / 2\n },\n //箭头右边顶点\n {\n x: canvas.width - w_offset,\n y: canvas.height\n },\n //顺时针\n {\n x: canvas.width - w_offset,\n y: canvas.height - h_offset\n },\n //\n {\n x: canvas.width / 2,\n y: canvas.height - h_offset\n },\n //\n {\n x: canvas.width / 2,\n y: h_offset\n },\n //\n {\n x: canvas.width - w_offset,\n y: h_offset\n },\n //\n {\n x: canvas.width - w_offset,\n y: 0\n } //\n ], {\n fill: fill\n });\n canvas.add(polygon);\n return canvas.toDataURL();\n }\n\n /*创建箭头图片*/\n }, {\n key: \"create_arrow2_picture\",\n value: function create_arrow2_picture(color) {\n var canvas = new fabric.Canvas('canvas');\n canvas.width = 75;\n canvas.height = 75;\n var w_offset1 = 35;\n var w_offset2 = 40;\n var fill = color;\n var polygon = new fabric.Polygon([{\n x: canvas.width,\n y: canvas.height / 2\n }, {\n x: canvas.width - w_offset1,\n y: canvas.height\n }, {\n x: canvas.width - w_offset1 - w_offset2,\n y: canvas.height\n }, {\n x: canvas.width - w_offset2,\n y: canvas.height / 2\n }, {\n x: canvas.width - w_offset1 - w_offset2,\n y: 0\n }, {\n x: canvas.width - w_offset1,\n y: 0\n }], {\n fill: fill\n });\n canvas.add(polygon);\n return canvas.toDataURL();\n }\n }, {\n key: \"sampleHeightMostDetailed\",\n value: function sampleHeightMostDetailed(positions) {\n var cartesians = [];\n positions.forEach(function (item) {\n cartesians.push(new Cesium.Cartographic.fromDegrees(item.lng, item.lat));\n });\n return this.sdk.viewer.scene.sampleHeightMostDetailed(cartesians);\n }\n }, {\n key: \"flyHome\",\n value: function flyHome() {\n var duration = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 3;\n Object(_Global_global__WEBPACK_IMPORTED_MODULE_11__[\"setActiveViewer\"])(0);\n Object(_Global_global__WEBPACK_IMPORTED_MODULE_11__[\"closeRotateAround\"])(this.sdk);\n Object(_Global_global__WEBPACK_IMPORTED_MODULE_11__[\"closeViewFollow\"])(this.sdk);\n if (this.sdk.viewer.CAMERA_DEFAULT_VIEW_RECTANGLE) {\n var destination = this.sdk.viewer.CAMERA_DEFAULT_VIEW_RECTANGLE.destination;\n var orientation = this.sdk.viewer.CAMERA_DEFAULT_VIEW_RECTANGLE.orientation;\n this.sdk.viewer.camera.flyTo({\n destination: Cesium.Cartesian3.fromDegrees(destination.lng, destination.lat, destination.alt),\n orientation: {\n heading: Cesium.Math.toRadians(orientation.heading || 0),\n pitch: Cesium.Math.toRadians(orientation.pitch || 0),\n roll: Cesium.Math.toRadians(orientation.roll || 0)\n },\n duration: duration\n });\n } else {\n this.sdk.viewer.camera.flyHome(duration);\n }\n }\n\n /**\r\n * @description 设置拾取操作启停\r\n * @method setPickStatus\r\n * @param [status=true] {boolean}\r\n * @memberOf Tools\r\n * */\n }, {\n key: \"setPickStatus\",\n value: function setPickStatus() {\n var status = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n } // YJ.getEarth().interaction.picking.enabled = status\n\n /**\r\n * @description 创建点缓冲区 返回缓冲区坐标\r\n * @method create_point_buffer\r\n * @param point {object} 坐标参数\r\n * @param [radius=5] {number} 缓冲距离 (单位:米)\r\n * @param option\r\n * @param point.lng {number} 经度\r\n * @param point.lat {number} 纬度\r\n * @memberOf Tools\r\n * @returns {Array} 返回缓冲区坐标数组\r\n */\n }, {\n key: \"create_point_buffer\",\n value: function create_point_buffer(point) {\n var radius = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 5;\n var option = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {\n steps: 10\n };\n var p = turf.point([Number(point.lng), Number(point.lat)]);\n var buffered = turf.buffer(p, Number(radius) / 1000, option);\n return buffered.geometry.coordinates;\n }\n\n /**\r\n * @description 创建线缓冲区 返回缓冲区坐标\r\n * @method create_line_buffer\r\n * @param points {Array.} 坐标参数\r\n * @param [radius=5] {number} 缓冲距离 (单位:米)\r\n * @memberOf Tools\r\n * @returns {Array} 返回缓冲区坐标数组\r\n * @example let points = [{lng:\"\",lat:\"\"},{lng:\"\",lat:\"\"},{lng:\"\",lat:\"\"}]\r\n * let radius = 10\r\n * let area_buffer = sdk.create_line_buffer(points,radius)\r\n * */\n }, {\n key: \"create_line_buffer\",\n value: function create_line_buffer(points) {\n var radius = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 5;\n if (points.length === 1) {\n return this.create_point_buffer(points[0], radius);\n } else if (points.length === 0) {\n return false;\n } else {\n var arr = [];\n points.forEach(function (point) {\n arr.push([Number(point.lng), Number(point.lat)]);\n });\n var line = turf.lineString(arr);\n var buffered = turf.buffer(line, Number(radius) / 1000);\n return buffered.geometry.coordinates;\n }\n }\n\n /**\r\n * @description 创建面缓冲区 返回缓冲区坐标\r\n * @method create_area_buffer\r\n * @param points {Array.} 坐标参数\r\n * @param [radius=5] {number} 缓冲距离 (单位:米)\r\n * @memberOf Tools\r\n * @returns {Array} 返回缓冲区坐标数组\r\n * @example let points = [{lng:\"\",lat:\"\"},{lng:\"\",lat:\"\"},{lng:\"\",lat:\"\"}]\r\n * let radius = 10\r\n * let area_buffer = sdk.create_area_buffer(points,radius)\r\n * */\n }, {\n key: \"create_area_buffer\",\n value: function create_area_buffer(points) {\n var radius = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 5;\n if (points.length === 1) {\n return this.create_point_buffer(points[0], radius);\n } else if (points.length === 0) {\n return false;\n } else if (points.length === 2) {\n return this.create_line_buffer(points, radius);\n } else {\n var arr = [];\n points.forEach(function (point) {\n arr.push([Number(point.lng), Number(point.lat)]);\n });\n arr.push(arr[0]);\n var poly = turf.polygon([arr]);\n var buffered = turf.buffer(poly, Number(radius) / 1000);\n return buffered.geometry.coordinates;\n }\n }\n\n /**\r\n * @desc 计算多点范围\r\n * @method cal_envelope\r\n * @memberOf Tools\r\n * */\n }, {\n key: \"cal_envelope\",\n value: function cal_envelope() {\n var points = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n if (points.length < 2) {\n console.error('坐标数量不能少于2个');\n } else {\n var arr = [];\n points.forEach(function (p) {\n arr.push(turf.point([p.lng, p.lat]));\n });\n var features = turf.featureCollection(arr);\n return turf.envelope(features).geometry.coordinates[0];\n }\n }\n\n /**\r\n * @desc 按指定距离分段\r\n * @method chunkLine\r\n * @param positions {Array}\r\n * @param meters\r\n * @memberOf Tools\r\n * */\n }, {\n key: \"chunkLine\",\n value: function chunkLine() {\n var positions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n var meters = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1000;\n if (positions.length < 2) {\n return [];\n } else {\n var arr = [];\n positions.forEach(function (it) {\n arr.push([it.lng, it.lat]);\n });\n var line = turf.lineString(arr);\n var chunk = turf.lineChunk(line, meters / 1000);\n var __map = new Map();\n chunk.features.forEach(function (value) {\n value.geometry.coordinates.forEach(function (value1) {\n var key = value1.join(',');\n var val = {\n lng: value1[0],\n lat: value1[1]\n };\n __map.set(key, val);\n });\n });\n return chunk.features;\n }\n }\n\n /**\r\n * @desc 标注以sinx的半个周期的形式弹跳\r\n * */\n }, {\n key: \"billboardAnimation\",\n value: function billboardAnimation(viewer, _ref) {\n var id = _ref.id,\n _ref$offset = _ref.offset,\n offset = _ref$offset === void 0 ? 10 : _ref$offset,\n _ref$times = _ref.times,\n times = _ref$times === void 0 ? 3 : _ref$times;\n var entity = viewer.entities.getById(id);\n if (entity) {\n var pi = Math.PI;\n var tt = 60;\n var of = pi / tt;\n var h = 0;\n var src_p = this.cartesian3Towgs84(entity.position.getValue(), viewer);\n // let height = src_p.alt\n // entity.position = new Cesium.CallbackProperty(() => {\n // let height = offset * Math.sin(h) + src_p.alt\n // h += of\n // return Cesium.Cartesian3.fromDegrees(src_p.lng, src_p.lat, height)\n // }, false)\n var ti = setInterval(function () {\n h += of;\n var height = offset * Math.sin(h) + src_p.alt;\n if (h > pi) h = 0;\n entity.position = Cesium.Cartesian3.fromDegrees(src_p.lng, src_p.lat, height);\n }, 30);\n setTimeout(function () {\n clearInterval(ti);\n entity.position = Cesium.Cartesian3.fromDegrees(src_p.lng, src_p.lat, src_p.alt);\n }, 3000);\n }\n }\n\n /**@desc 绘制扇形\r\n * @method sector\r\n * @memberOf Tools*/\n }, {\n key: \"calSector\",\n value: function calSector() {\n var center = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var radius = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 100;\n var bearing1 = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 25;\n var bearing2 = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 45;\n var steps = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 360;\n var is84 = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : false;\n var c = turf.point([center.lng, center.lat]);\n var coordinates = turf.sector(c, radius / 1000, bearing1, bearing2, {\n steps: steps\n }).geometry.coordinates;\n var positions = [];\n coordinates.forEach(function (array) {\n array.forEach(function (item) {\n var pos;\n if (is84) {\n pos = {\n lng: item[0],\n lat: item[1]\n };\n } else {\n pos = Cesium.Cartesian3.fromDegrees(item[0], item[1]);\n }\n positions.push(pos);\n });\n });\n return positions;\n }\n\n /**\r\n * @desc获取紧贴高度\r\n * @param position 坐标\r\n */\n }, {\n key: \"getClampToHeight\",\n value: (function () {\n var _getClampToHeight = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()(/*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_6___default.a.mark(function _callee3(position) {\n var objectsToExclude,\n pos3,\n position1,\n height1,\n height2,\n position2,\n _args3 = arguments;\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_6___default.a.wrap(function _callee3$(_context3) {\n while (1) switch (_context3.prev = _context3.next) {\n case 0:\n objectsToExclude = _args3.length > 1 && _args3[1] !== undefined ? _args3[1] : [];\n if (!(!this.sdk || !this.sdk.viewer)) {\n _context3.next = 3;\n break;\n }\n return _context3.abrupt(\"return\", 0);\n case 3:\n pos3 = new Cesium.Cartesian3.fromDegrees(position.lng, position.lat);\n _context3.prev = 4;\n _context3.next = 7;\n return this.sdk.viewer.scene.clampToHeight(pos3, objectsToExclude);\n case 7:\n _context3.t0 = _context3.sent;\n if (_context3.t0) {\n _context3.next = 10;\n break;\n }\n _context3.t0 = pos3;\n case 10:\n position1 = _context3.t0;\n _context3.next = 16;\n break;\n case 13:\n _context3.prev = 13;\n _context3.t1 = _context3[\"catch\"](4);\n position1 = pos3;\n case 16:\n _context3.next = 18;\n return this.cartesian3Towgs84(position1, this.sdk.viewer).alt;\n case 18:\n height1 = _context3.sent;\n height2 = 0;\n _context3.prev = 20;\n if (!this.sdk.viewer.scene.terrainProvider.availability) {\n _context3.next = 26;\n break;\n }\n _context3.next = 24;\n return Cesium.sampleTerrainMostDetailed(this.sdk.viewer.scene.terrainProvider, [Cesium.Cartographic.fromDegrees(position.lng, position.lat)]);\n case 24:\n position2 = _context3.sent;\n position2[0].height && (height2 = position2[0].height);\n case 26:\n _context3.next = 31;\n break;\n case 28:\n _context3.prev = 28;\n _context3.t2 = _context3[\"catch\"](20);\n height2 = 0;\n case 31:\n if (!(height1 > height2)) {\n _context3.next = 35;\n break;\n }\n return _context3.abrupt(\"return\", Number(height1.toFixed(2)));\n case 35:\n return _context3.abrupt(\"return\", Number(height2.toFixed(2)));\n case 36:\n case \"end\":\n return _context3.stop();\n }\n }, _callee3, this, [[4, 13], [20, 28]]);\n }));\n function getClampToHeight(_x3) {\n return _getClampToHeight.apply(this, arguments);\n }\n return getClampToHeight;\n }()\n /**\r\n * @desc 深拷贝对象\r\n * */\n )\n }, {\n key: \"deepCopyObj\",\n value: function deepCopyObj(obj) {\n var newobj = null;\n // 处理数组 - 使用原生Array构造函数创建新数组\n if (Array.isArray(obj)) {\n newobj = [];\n // 只拷贝数组元素,不拷贝可能存在的扩展方法\n for (var i = 0; i < obj.length; i++) {\n newobj[i] = this.deepCopyObj(obj[i]);\n }\n return newobj;\n }\n\n // 处理对象\n else if (obj && _babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0___default()(obj) === 'object') {\n newobj = {};\n for (var _i7 in obj) {\n // 排除指定属性和方法属性\n if (_i7 !== 'earth' && _i7 !== 'Dialog' && typeof obj[_i7] !== 'function') {\n newobj[_i7] = this.deepCopyObj(obj[_i7]);\n }\n }\n return newobj;\n } else newobj = obj;\n return newobj;\n }\n\n /**\r\n * @desc 度分秒转换\r\n * */\n }, {\n key: \"projConvert\",\n value: function projConvert() {\n var status = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n var closeCallBack = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};\n if (status) {\n Object(_projConvert__WEBPACK_IMPORTED_MODULE_9__[\"open\"])(this.sdk, closeCallBack);\n } else {\n Object(_projConvert__WEBPACK_IMPORTED_MODULE_9__[\"close\"])();\n }\n }\n /**\r\n * @desc 投影转换\r\n * */\n }, {\n key: \"projectionConvert\",\n value: function projectionConvert() {\n var status = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n var closeCallBack = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};\n if (status) {\n Object(_projectionConvert__WEBPACK_IMPORTED_MODULE_10__[\"open\"])(this.sdk, closeCallBack);\n } else {\n Object(_projectionConvert__WEBPACK_IMPORTED_MODULE_10__[\"close\"])();\n }\n }\n\n /**\r\n * @desc 导出excel\r\n */\n // 导出属性\n }, {\n key: \"exportExcel\",\n value: function exportExcel(data) {\n var label = '';\n for (var key in data[0]) {\n label += \"\".concat(key, \"\");\n }\n label += '';\n var url = 'data:application/vnd.ms-excel;base64,',\n tmplWorkbookXML = '' + 'Axel Richter{created}' + '' + '' + '' + '' + '{worksheets}',\n tmplWorksheetXML = '{rows}
',\n tmplCellXML = '{data}',\n base64 = function base64(s) {\n return window.btoa(unescape(encodeURIComponent(s)));\n },\n format = function format(s, c) {\n return s.replace(/{(\\w+)}/g, function (m, p) {\n return c[p];\n });\n };\n var ctx = \"\";\n var workbookXML = \"\";\n var worksheetsXML = \"\";\n var rowsXML = \"\";\n var pil = 0;\n for (var i = 0; i < data.length; i++) {\n if (i == 0) {\n rowsXML += label;\n }\n rowsXML += '';\n for (var _key in data[i]) {\n ctx = {\n nameType: 'String',\n data: data[i][_key]\n };\n rowsXML += format(tmplCellXML, ctx);\n }\n rowsXML += '';\n if (i > 0 && i / 60000 % 1 === 0) {\n pil++;\n ctx = {\n rows: rowsXML,\n nameWS: 'Sheet' + i\n };\n worksheetsXML += format(tmplWorksheetXML, ctx);\n rowsXML = \"\";\n rowsXML += label;\n }\n }\n ctx = {\n rows: rowsXML,\n nameWS: 'Sheet'\n };\n worksheetsXML += format(tmplWorksheetXML, ctx);\n rowsXML = \"\";\n ctx = {\n created: new Date().getTime(),\n worksheets: worksheetsXML\n };\n workbookXML = format(tmplWorkbookXML, ctx);\n var link = document.createElement(\"A\");\n link.href = url + base64(workbookXML);\n link.download = \"矢量数据导出.xls\";\n link.target = '_blank';\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n }\n\n /**\r\n * @desc Gzip解压\r\n */\n }, {\n key: \"decompressGzip\",\n value: function decompressGzip(compressedData) {\n var decompressedData = pako.inflate(compressedData);\n // 将解压缩后的数据转换为字符串\n var decompressedString = new TextDecoder().decode(decompressedData);\n return decompressedString;\n }\n\n /**\r\n * @desc cmyk转rbg\r\n * @param {*} color\r\n * @returns\r\n */\n }, {\n key: \"cmykToRgb\",\n value: function cmykToRgb(color) {\n var c = color.c,\n m = color.m,\n y = color.y,\n k = color.k;\n var rgb = {\n r: 0,\n g: 0,\n b: 0\n };\n rgb.c = c / 100;\n rgb.m = m / 100;\n rgb.y = y / 100;\n rgb.k = k / 100;\n rgb.r = 1 - Math.min(1, rgb.c * (1 - rgb.k) + rgb.k);\n rgb.g = 1 - Math.min(1, rgb.m * (1 - rgb.k) + rgb.k);\n rgb.b = 1 - Math.min(1, rgb.y * (1 - rgb.k) + rgb.k);\n rgb.r = Math.round(rgb.r * 255);\n rgb.g = Math.round(rgb.g * 255);\n rgb.b = Math.round(rgb.b * 255);\n return \"rgb(\".concat(rgb.r, \", \").concat(rgb.g, \", \").concat(rgb.b, \")\");\n }\n }, {\n key: \"convertPxToRem\",\n value: function convertPxToRem(sdk, selector) {\n var htmlFontSize = parseFloat(getComputedStyle(document.documentElement).fontSize);\n var list = [];\n var elementList = [];\n if (selector) {\n list = document.getElementById(sdk.div_id).querySelectorAll(selector);\n for (var i = 0; i < list.length; i++) {\n var _elementList;\n (_elementList = elementList).push.apply(_elementList, [list[i]].concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_1___default()(list[i].querySelectorAll('*'))));\n }\n } else {\n elementList = document.getElementById(sdk.div_id).querySelectorAll('*');\n }\n elementList.forEach(function (element) {\n var style = element.style;\n var rules = Array.from(style).filter(function (prop) {\n return typeof prop === 'string' && prop.endsWith('px');\n });\n rules.forEach(function (prop) {\n var pxValue = parseFloat(style[prop]);\n var remValue = pxValue / htmlFontSize;\n element.style[prop] = \"\".concat(remValue, \"rem\");\n });\n });\n }\n }, {\n key: \"isConvex\",\n value: function isConvex() {\n var arr = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n var length = arr.length;\n var pre = 0,\n curr = 0;\n for (var i = 0; i < length; ++i) {\n var dx1 = arr[(i + 1) % length].lng - arr[i].lng;\n var dx2 = arr[(i + 2) % length].lng - arr[(i + 1) % length].lng;\n var dy1 = arr[(i + 1) % length].lat - arr[i].lat;\n var dy2 = arr[(i + 2) % length].lat - arr[(i + 1) % length].lat;\n curr = dx1 * dy2 - dx2 * dy1;\n if (curr != 0) {\n if (curr > 0 && pre < 0 || curr < 0 && pre > 0) return false;else pre = curr;\n }\n }\n return true;\n }\n }, {\n key: \"getDateTimeString\",\n value: function getDateTimeString() {\n // 创建一个表示当前时间的 Date 对象\n var now = new Date();\n // 获取年份\n var year = now.getFullYear();\n // 获取月份(从 0 开始,所以要加 1),并将其转换为两位字符串,不足两位在前面补零\n var month = String(now.getMonth() + 1).padStart(2, '0');\n // 获取日期,并将其转换为两位字符串,不足两位在前面补零\n var day = String(now.getDate()).padStart(2, '0');\n // 获取小时,并将其转换为两位字符串,不足两位在前面补零\n var hours = String(now.getHours()).padStart(2, '0');\n // 获取分钟,并将其转换为两位字符串,不足两位在前面补零\n var minutes = String(now.getMinutes()).padStart(2, '0');\n // 获取秒,并将其转换为两位字符串,不足两位在前面补零\n var seconds = String(now.getSeconds()).padStart(2, '0');\n // 获取毫秒,并将其转换为三位字符串,不足三位在前面补零\n var milliseconds = String(now.getMilliseconds()).padStart(3, '0');\n // 将年、月、日、时、分、秒、毫秒拼接成所需的字符串\n return \"\".concat(year).concat(month).concat(day).concat(hours).concat(minutes).concat(seconds).concat(milliseconds);\n }\n }, {\n key: \"replaceHost\",\n value: function replaceHost(url, host) {\n var newUrl = url;\n if (!url || !host) {\n return url;\n }\n try {\n if (!url.startsWith(\"http\")) {\n //说明是本地的json,在磁盘中存在的\n if (!url.includes(\":\")) {\n if (this.options.host) {\n var o = new URL(url, this.options.host);\n newUrl = o.href;\n }\n }\n return newUrl;\n } else {\n // 移除可能的用户名:密码前缀\n var authRegex = /^[^@]+@/;\n if (authRegex.test(url)) {\n url = url.replace(authRegex, '');\n }\n\n // 添加协议前缀(如果没有)\n if (!/^[a-z]+:\\/\\//i.test(url)) {\n url = 'http://' + url;\n }\n var parsedUrl = new URL(url);\n var parsedUrl2 = new URL(host);\n var hostname = parsedUrl.hostname;\n var port = parsedUrl.port;\n\n // 处理IPv6地址(如果有括号)\n if (hostname.startsWith('[') && hostname.endsWith(']')) {\n hostname = hostname.slice(1, -1);\n }\n if ((hostname === 'localhost' || hostname === '127.0.0.1') && parseInt(port, 10) !== 55110) {\n parsedUrl.port = parsedUrl2.port;\n parsedUrl.protocol = parsedUrl2.protocol;\n newUrl = parsedUrl.toString();\n }\n return newUrl;\n }\n } catch (error) {\n return newUrl;\n }\n }\n }, {\n key: \"message\",\n value: function message() {\n var option = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var type = option.type || 'success';\n var text = option.text || '';\n var duration = option.duration || 1500;\n var message = document.getElementById('YJ-custom-message');\n if (message) {\n document.body.removeChild(message);\n }\n message = document.createElement('div');\n message.id = 'YJ-custom-message';\n if (type == 'success') {\n message.innerHTML = \"\\n \".concat(text, \"\\n \");\n } else if (type == 'warning') {\n message.innerHTML = \"\\n \".concat(text, \"\\n \");\n }\n document.body.appendChild(message);\n message.classList.add(type);\n }\n }], [{\n key: \"_md5\",\n value: function _md5(text) {\n return js_md5__WEBPACK_IMPORTED_MODULE_7___default()(text).toUpperCase();\n }\n }]);\n}();\n/* harmony default export */ __webpack_exports__[\"default\"] = (Tools);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvVG9vbHMvaW5kZXguanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvVG9vbHMvaW5kZXguanM/MTNjZCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogQG5hbWU6IGluZGV4XHJcbiAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3JcclxuICogQGRhdGU6IDIwMjItMDYtMDkgMTY6NDZcclxuICogQGRlc2NyaXB0aW9u77yaaW5kZXhcclxuICogQHVwZGF0ZTogMjAyMi0wNi0wOSAxNjo0NlxyXG4gKi9cclxuaW1wb3J0IG1kNSBmcm9tICdqcy1tZDUnXHJcbmltcG9ydCB7IFByb2ogfSBmcm9tICcuL3Byb2onXHJcbmltcG9ydCB7IG9wZW4gYXMgcHJvakNvbnZlcnRPcGVuLCBjbG9zZSBhcyBwcm9qQ29udmVydENsb3NlIH0gZnJvbSAnLi9wcm9qQ29udmVydCdcclxuaW1wb3J0IHsgb3BlbiBhcyBwcm9qZWN0aW9uQ29udmVydE9wZW4sIGNsb3NlIGFzIHByb2plY3Rpb25Db252ZXJ0Q2xvc2UgfSBmcm9tICcuL3Byb2plY3Rpb25Db252ZXJ0J1xyXG5pbXBvcnQgeyBzZXRBY3RpdmVWaWV3ZXIsIGNsb3NlUm90YXRlQXJvdW5kLCBjbG9zZVZpZXdGb2xsb3cgfSBmcm9tICcuLi9HbG9iYWwvZ2xvYmFsJ1xyXG5pbXBvcnQgRmxvd1BpY3R1cmVNYXRlcmlhbFByb3BlcnR5IGZyb20gJy4uL09iai9NYXRlcmFpbC9GbG93UGljdHVyZU1hdGVyaWFsUHJvcGVydHknXHJcbmltcG9ydCB7IHN5bmNEYXRhLCBnZXQzRFZpZXcgfSBmcm9tICcuLi9HbG9iYWwvTXVsdGlWaWV3cG9ydE1vZGUnXHJcblxyXG5jbGFzcyBUb29scyB7XHJcbiAgLyoqXHJcbiAgICogQGNvbnN0cnVjdG9yXHJcbiAgICogQGRlc2Mg5bel5YW357G7XHJcbiAgICogKi9cclxuICBjb25zdHJ1Y3RvcihzZGssIG9wdGlvbnMpIHtcclxuICAgIHRoaXMuc2RrID0gc2RrXHJcbiAgICBpZiAodGhpcy5zZGspIHtcclxuICAgICAgdGhpcy5uYW1lX21hcCA9IHRoaXMuc2RrLnByb2oubmFtZV9tYXBcclxuICAgICAgdGhpcy5lcHNnX21hcCA9IHRoaXMuc2RrLnByb2ouZXBzZ19tYXBcclxuICAgICAgdGhpcy5jb252ZXJ0ID0gdGhpcy5zZGsucHJvai5jb252ZXJ0XHJcbiAgICAgIHRoaXMuZ2V0QWxsUHJvamVjdGlvbiA9IHRoaXMuc2RrLnByb2ouZ2V0QWxsUHJvamVjdGlvblxyXG4gICAgICB0aGlzLnByb2plY3Rpb25Jc0V4aXN0cyA9IHRoaXMuc2RrLnByb2oucHJvamVjdGlvbklzRXhpc3RzXHJcbiAgICAgIHRoaXMuZGVncmVlc1RvRE1TID0gdGhpcy5zZGsucHJvai5kZWdyZWVzVG9ETVNcclxuICAgICAgdGhpcy5kbXNUb0RlY2ltYWwgPSB0aGlzLnNkay5wcm9qLmRtc1RvRGVjaW1hbFxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMub3B0aW9ucyA9IHsgLi4ub3B0aW9ucyB9XHJcbiAgfVxyXG5cclxuICBnZXQgUE9TVCgpIHtcclxuICAgIHJldHVybiAnUE9TVCdcclxuICB9XHJcblxyXG4gIGdldCBHRVQoKSB7XHJcbiAgICByZXR1cm4gJ0dFVCdcclxuICB9XHJcblxyXG5cclxuICBzdGF0aWMgX21kNSh0ZXh0KSB7XHJcbiAgICByZXR1cm4gbWQ1KHRleHQpLnRvVXBwZXJDYXNlKClcclxuICB9XHJcblxyXG5cclxuICAvKipcclxuICAgKiBAZGVzY3JpcHRpb24g5bCG6KeS5bqm6L2s5o2i5Li65byn5bqmXHJcbiAgICogQG1ldGhvZCBkZWdyZWVzVG9SYWRpYW5zXHJcbiAgICogQHBhcmFtIGRlZ3JlZXMge251bWJlcn0g5byn5bqm5Yi2XHJcbiAgICogQHJldHVybiByYWRpYW5zIHtudW1iZXJ9XHJcbiAgICogQG1lbWJlck9mIFRvb2xzXHJcbiAgICogQGV4YW1wbGUgbGV0IHJhZGlhbnMgPSB0b29sLmRlZ3JlZXNUb1JhZGlhbnMoMjApXHJcbiAgICogKi9cclxuICBkZWdyZWVzVG9SYWRpYW5zKGRlZ3JlZXMpIHtcclxuICAgIHJldHVybiB0dXJmLmRlZ3JlZXNUb1JhZGlhbnMoTnVtYmVyKGRlZ3JlZXMpKSAvLyAxLjA0NzE5NzU1MTE5NjU5NzZcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBkZXNjcmlwdGlvbiDlsIblvKfluqbovazmjaLkuLrop5LluqZcclxuICAgKiBAbWV0aG9kIHJhZGlhbnNUb0RlZ3JlZXNcclxuICAgKiBAcGFyYW0gcmFkaWFucyB7bnVtYmVyfSDlvKfluqbliLZcclxuICAgKiBAcmV0dXJuIGRlZ3JlZXMge251bWJlcn1cclxuICAgKiBAbWVtYmVyT2YgVG9vbHNcclxuXHJcbiAgICogQGV4YW1wbGUgbGV0IGRlZ3JlZXMgPSB0b29sLnJhZGlhbnNUb0RlZ3JlZXMoMilcclxuICAgKiAqL1xyXG4gIHJhZGlhbnNUb0RlZ3JlZXMocmFkaWFucykge1xyXG4gICAgcmV0dXJuIHR1cmYucmFkaWFuc1RvRGVncmVlcyhOdW1iZXIocmFkaWFucykpIC8vIDEuMDQ3MTk3NTUxMTk2NTk3NlxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQGRlc2Mg6ZqP5py65a2X56ym5LiyXHJcbiAgICogQGZ1bmN0aW9uIHJhbmRvbVN0cmluZ1xyXG4gICAqIEBtZW1iZXJPZiBleHRyYVxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbZT0zMl0g5a2X56ym5Liy6ZW/5bqmXHJcbiAgICogQHJldHVybnMge3N0cmluZ30gc3RyIOWtl+espuS4slxyXG4gICAqIEBtZW1iZXJPZiBUb29sc1xyXG4gICAqIEBleGFtcGxlIGxldCBzdHJpbmdzPXRvb2wucmFuZG9tU3RyaW5nKClcclxuICAgKiAqL1xyXG4gIHJhbmRvbVN0cmluZyhlKSB7XHJcbiAgICAvKiAgICBlID0gZSB8fCAzMlxyXG4gICAgICAgIHZhciB0ID0gJ0FCQ0RFRkdISktNTlBRUlNUV1hZWmFiY2RlZmhpamttbnByc3R3eHl6MjM0NTY3OCcsXHJcbiAgICAgICAgICBhID0gdC5sZW5ndGgsXHJcbiAgICAgICAgICBuID0gJydcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGU7IGkrKykgbiArPSB0LmNoYXJBdChNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBhKSkqL1xyXG4gICAgcmV0dXJuIENlc2l1bS5jcmVhdGVHdWlkKClcclxuICB9XHJcblxyXG4gIGdldFNvdXJjZVJvb3RQYXRoKCkge1xyXG4gICAgbGV0IHNka05hbWUgPSAnWUpFYXJ0aC5taW4uanMnXHJcbiAgICBsZXQgc2NyaXB0cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3NjcmlwdCcpXHJcbiAgICBsZXQgcHJlZml4ID0gJydcclxuICAgIHNjcmlwdHMuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICBpZiAoaXRlbS5zcmMgJiYgaXRlbS5zcmMuaW5kZXhPZihzZGtOYW1lKSA+IC0xKSB7XHJcbiAgICAgICAgbGV0IGFyciA9IGl0ZW0uc3JjLnNwbGl0KCcvJylcclxuICAgICAgICBhcnIucG9wKClcclxuICAgICAgICBwcmVmaXggPSBhcnIuam9pbignLycpXHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgICByZXR1cm4gcHJlZml4XHJcbiAgfVxyXG5cclxuICAvKipAZGVzY3JpcHRpb24g56yb5Y2h5bCU5Z2Q5qCH6L2s57uP57qs5bqmXHJcbiAgICogQG1ldGhvZCBjYXJ0ZXNpYW4zVG93Z3M4NFxyXG4gICAqIEBwYXJhbSBjYXJ0ZXNpYW4ge0Nlc2l1bS5DYXJ0ZXNpYW4zfSDnrJvljaHlsJTlnZDmoIdcclxuICAgKiBAcGFyYW0gdmlld2VyXHJcbiAgICogQHBhcmFtIGNhcnRlc2lhbi54IHtudW1iZXJ9XHJcbiAgICogQHBhcmFtIGNhcnRlc2lhbi55IHtudW1iZXJ9XHJcbiAgICogQHBhcmFtIGNhcnRlc2lhbi56IHtudW1iZXJ9XHJcbiAgICogQG1lbWJlck9mIFRvb2xzXHJcbiAgICogQHJldHVybiB7b2JqZWN0fSB3Z3M4NCDov5Tlm553Z3M4NOWdkOagh1xyXG4gICAqICovXHJcbiAgY2FydGVzaWFuM1Rvd2dzODQoY2FydGVzaWFuLCB2aWV3ZXIpIHtcclxuICAgIHZhciBlbGxpcHNvaWQgPSB2aWV3ZXIuc2NlbmUuZ2xvYmUuZWxsaXBzb2lkXHJcbiAgICB2YXIgY2FydGVzaWFuMyA9IG5ldyBDZXNpdW0uQ2FydGVzaWFuMyhcclxuICAgICAgY2FydGVzaWFuLngsXHJcbiAgICAgIGNhcnRlc2lhbi55LFxyXG4gICAgICBjYXJ0ZXNpYW4uelxyXG4gICAgKVxyXG4gICAgdmFyIGNhcnRvZ3JhcGhpYyA9IGVsbGlwc29pZC5jYXJ0ZXNpYW5Ub0NhcnRvZ3JhcGhpYyhjYXJ0ZXNpYW4zKVxyXG4gICAgdmFyIGxhdCA9IENlc2l1bS5NYXRoLnRvRGVncmVlcyhjYXJ0b2dyYXBoaWMubGF0aXR1ZGUpXHJcbiAgICB2YXIgbG5nID0gQ2VzaXVtLk1hdGgudG9EZWdyZWVzKGNhcnRvZ3JhcGhpYy5sb25naXR1ZGUpXHJcbiAgICB2YXIgYWx0ID0gY2FydG9ncmFwaGljLmhlaWdodCA8IDAgPyAwIDogY2FydG9ncmFwaGljLmhlaWdodFxyXG4gICAgLy8gdmFyIGFsdCA9IGNhcnRvZ3JhcGhpYy5oZWlnaHRcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGxuZzogTnVtYmVyKGxuZy50b0ZpeGVkKDgpKSxcclxuICAgICAgbGF0OiBOdW1iZXIobGF0LnRvRml4ZWQoOCkpLFxyXG4gICAgICBhbHQ6IE51bWJlcihhbHQudG9GaXhlZCgyKSksXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAZGVzYyDorqHnrpflpJrnur/mrrXplb/luqZcclxuICAgKiBAbWV0aG9kIGNvbXB1dGVEaXN0YW5jZVxyXG4gICAqIEBtZW1iZXJPZiBUb29sc1xyXG4gICAqQHBhcmFtIHBvc2l0aW9ucyB7QXJyYXkuPHtsbmc6bnVtYmVyLCBsYXQ6bnVtYmVyLGFsdDpudW1iZXJ9Pn3lnZDmoIfmlbDnu4RcclxuICAgKiBAcGFyYW0gW2ZyYWN0aW9uRGlnaXRzPTJdIOS/neeVmeWwj+aVsOeCueS9jeaVsFxyXG4gICAqIEBwYXJhbSBbZ3JvdW5kPXRydWVdIOaYr+WQpui0tOWcsFxyXG4gICAqICovXHJcbiAgYXN5bmMgY29tcHV0ZURpc3RhbmNlKHBvc2l0aW9ucyA9IFtdLCBmcmFjdGlvbkRpZ2l0cyA9IDIsIHR5cGUgPSAwKSB7XHJcbiAgICBpZiAocG9zaXRpb25zLmxlbmd0aCA8IDIpIHtcclxuICAgICAgcmV0dXJuIDBcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGxldCBsZW5ndGggPSAwXHJcbiAgICAgIHN3aXRjaCAodHlwZSkge1xyXG4gICAgICAgIGNhc2UgJzAnOlxyXG4gICAgICAgIGNhc2UgMDpcclxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9zaXRpb25zLmxlbmd0aCAtIDE7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBwb3NpdGlvbjEgPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlcyhwb3NpdGlvbnNbaV0ubG5nLCBwb3NpdGlvbnNbaV0ubGF0LCBwb3NpdGlvbnNbaV0uYWx0KTtcclxuICAgICAgICAgICAgY29uc3QgcG9zaXRpb24yID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXMocG9zaXRpb25zW2kgKyAxXS5sbmcsIHBvc2l0aW9uc1tpICsgMV0ubGF0LCBwb3NpdGlvbnNbaSArIDFdLmFsdCk7XHJcbiAgICAgICAgICAgIGNvbnN0IGRpc3RhbmNlID0gQ2VzaXVtLkNhcnRlc2lhbjMuZGlzdGFuY2UocG9zaXRpb24xLCBwb3NpdGlvbjIpO1xyXG4gICAgICAgICAgICBsZW5ndGggPSBsZW5ndGggKyBkaXN0YW5jZVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWtcclxuICAgICAgICBjYXNlICcxJzpcclxuICAgICAgICBjYXNlIDE6XHJcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGggLSAxOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgcG9zaXRpb24xID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXMocG9zaXRpb25zW2ldLmxuZywgcG9zaXRpb25zW2ldLmxhdCwgMCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHBvc2l0aW9uMiA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzKHBvc2l0aW9uc1tpICsgMV0ubG5nLCBwb3NpdGlvbnNbaSArIDFdLmxhdCwgMCk7XHJcbiAgICAgICAgICAgIGNvbnN0IGRpc3RhbmNlID0gQ2VzaXVtLkNhcnRlc2lhbjMuZGlzdGFuY2UocG9zaXRpb24xLCBwb3NpdGlvbjIpO1xyXG4gICAgICAgICAgICBsZW5ndGggPSBsZW5ndGggKyBkaXN0YW5jZVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWtcclxuICAgICAgICBjYXNlICcyJzpcclxuICAgICAgICBjYXNlIDI6XHJcbiAgICAgICAgICBsZXQgbWV0ZXJzXHJcbiAgICAgICAgICBsZXQgbGluZVN0cmluZzIgPSBbXVxyXG4gICAgICAgICAgcG9zaXRpb25zLmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgICAgICAgbGluZVN0cmluZzIucHVzaChbaXRlbS5sbmcsIGl0ZW0ubGF0LCBpdGVtLmFsdF0pXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgbGV0IGxpbmUyID0gdHVyZi5saW5lU3RyaW5nKGxpbmVTdHJpbmcyKVxyXG4gICAgICAgICAgbGV0IGQgPSB0dXJmLmxlbmd0aChsaW5lMikgKiAxMDAwXHJcbiAgICAgICAgICBtZXRlcnMgPSBkID4gMjAgPyBkIC8gMjAgOiBkXHJcblxyXG4gICAgICAgICAgbGV0IHJlcyA9IHRoaXMuY2h1bmtMaW5lKHBvc2l0aW9ucywgbWV0ZXJzKVxyXG4gICAgICAgICAgbGV0IGNvb3JkaW5hdGVzID0gW11cclxuICAgICAgICAgIHJlcy5mb3JFYWNoKChGZWF0dXJlLCBpbmRleCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoaW5kZXggPT09IDApIHtcclxuICAgICAgICAgICAgICBjb29yZGluYXRlcyA9IFsuLi5GZWF0dXJlLmdlb21ldHJ5LmNvb3JkaW5hdGVzXVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIGNvb3JkaW5hdGVzLnB1c2goRmVhdHVyZS5nZW9tZXRyeS5jb29yZGluYXRlc1sxXSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIGxldCBhcnIgPSBbXVxyXG4gICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGNvb3JkaW5hdGVzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gY29vcmRpbmF0ZXMuaW5kZXhPZihpdGVtKTtcclxuICAgICAgICAgICAgbGV0IHIgPSBhd2FpdCB0aGlzLnNhbXBsZUhlaWdodCh7IGxuZzogaXRlbVswXSwgbGF0OiBpdGVtWzFdLCBhbHQ6IDAgfSwgaW5kZXgpXHJcbiAgICAgICAgICAgIHIucG9zaXRpb24uYWx0ID0gci5wb3NpdGlvbi5hbHQgPCAwID8gMCA6IHIucG9zaXRpb24uYWx0XHJcbiAgICAgICAgICAgIGFyci5wdXNoKHIpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBsZXQgbCA9IGFyci5sZW5ndGggLSAxXHJcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGggLSAxOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgcG9zaXRpb24xID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXMoYXJyW2ldLnBvc2l0aW9uLmxuZywgYXJyW2ldLnBvc2l0aW9uLmxhdCwgMCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHBvc2l0aW9uMiA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzKGFycltpICsgMV0ucG9zaXRpb24ubG5nLCBhcnJbaSArIDFdLnBvc2l0aW9uLmxhdCwgMCk7XHJcbiAgICAgICAgICAgIGNvbnN0IGRpc3RhbmNlID0gQ2VzaXVtLkNhcnRlc2lhbjMuZGlzdGFuY2UocG9zaXRpb24xLCBwb3NpdGlvbjIpO1xyXG4gICAgICAgICAgICBsZW5ndGggPSBsZW5ndGggKyBkaXN0YW5jZVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWtcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGxlbmd0aC50b0ZpeGVkKGZyYWN0aW9uRGlnaXRzKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY29tcHV0ZURpc3RhbmNlMihwb3NpdGlvbnMgPSBbXSwgZnJhY3Rpb25EaWdpdHMgPSAyLCBncm91bmQgPSB0cnVlKSB7XHJcbiAgICBpZiAocG9zaXRpb25zLmxlbmd0aCA8IDIpIHtcclxuICAgICAgcmV0dXJuIDBcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGxldCBsZW5ndGggPSAwXHJcbiAgICAgIGlmIChncm91bmQpIHtcclxuICAgICAgICBsZXQgbGluZVN0cmluZyA9IFtdXHJcbiAgICAgICAgcG9zaXRpb25zLmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgICAgIGxpbmVTdHJpbmcucHVzaChbaXRlbS5sbmcsIGl0ZW0ubGF0LCBpdGVtLmFsdF0pXHJcbiAgICAgICAgfSlcclxuICAgICAgICBsZXQgbGluZSA9IHR1cmYubGluZVN0cmluZyhsaW5lU3RyaW5nKVxyXG4gICAgICAgIGxlbmd0aCA9IHR1cmYubGVuZ3RoKGxpbmUpICogMTAwMFxyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9zaXRpb25zLmxlbmd0aCAtIDE7IGkrKykge1xyXG4gICAgICAgICAgY29uc3QgcG9zaXRpb24xID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXMocG9zaXRpb25zW2ldLmxuZywgcG9zaXRpb25zW2ldLmxhdCwgcG9zaXRpb25zW2ldLmFsdCk7XHJcbiAgICAgICAgICBjb25zdCBwb3NpdGlvbjIgPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlcyhwb3NpdGlvbnNbaSArIDFdLmxuZywgcG9zaXRpb25zW2kgKyAxXS5sYXQsIHBvc2l0aW9uc1tpICsgMV0uYWx0KTtcclxuICAgICAgICAgIGNvbnN0IGRpc3RhbmNlID0gQ2VzaXVtLkNhcnRlc2lhbjMuZGlzdGFuY2UocG9zaXRpb24xLCBwb3NpdGlvbjIpO1xyXG4gICAgICAgICAgbGVuZ3RoID0gbGVuZ3RoICsgZGlzdGFuY2VcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGxlbmd0aC50b0ZpeGVkKGZyYWN0aW9uRGlnaXRzKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgc2FtcGxlSGVpZ2h0KHAxLCBpbmRleCkge1xyXG4gICAgbGV0IHAyID0gYXdhaXQgdGhpcy5zYW1wbGVIZWlnaHRNb3N0RGV0YWlsZWQoW3AxXSlcclxuICAgIHAxLmFsdCA9IHAyWzBdLmhlaWdodFxyXG4gICAgcmV0dXJuIHsgcG9zaXRpb246IHAxLCBpbmRleCB9XHJcbiAgfVxyXG5cclxuICAvKipAZGVzY3JpcHRpb24g6K6h566X5aSa6L655b2i6Z2i56evXHJcbiAgICogQG1ldGhvZCBjb21wdXRlQXJlYVxyXG4gICAqIEBtZW1iZXJPZiBUb29sc1xyXG4gICAqIEBwYXJhbSBwb3NpdGlvbnMge0FycmF5Ljx7bG5nOm51bWJlciwgbGF0Om51bWJlcixhbHQ6bnVtYmVyfT59XHJcbiAgICogQHBhcmFtIFtmcmFjdGlvbkRpZ2l0cz0yXSB7bnVtYmVyfSDnsr7noa7liLDlsI/mlbDngrnlpJrlsJHkvY1cclxuICAgKiBAcmV0dXJuIHtudW1iZXJ9ICDpnaLnp69cclxuICAgKiAqL1xyXG4gIGNvbXB1dGVBcmVhKHBvc2l0aW9ucywgZnJhY3Rpb25EaWdpdHMgPSAyKSB7XHJcbiAgICBpZiAocG9zaXRpb25zLmxlbmd0aCA8IDMpIHtcclxuICAgICAgcmV0dXJuIDBcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGxldCBwID0gW11cclxuICAgICAgcG9zaXRpb25zLmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgICBwLnB1c2goW2l0ZW0ubG5nLCBpdGVtLmxhdF0pXHJcbiAgICAgIH0pXHJcbiAgICAgIHAucHVzaChwWzBdKVxyXG4gICAgICBsZXQgcG9seWdvbiA9IHR1cmYucG9seWdvbihbcF0pXHJcbiAgICAgIGxldCB0cmlhbmdsZXMgPSB0dXJmLnRlc3NlbGF0ZShwb2x5Z29uKTtcclxuXHJcbiAgICAgIHJldHVybiBOdW1iZXIodHVyZi5hcmVhKHRyaWFuZ2xlcykudG9GaXhlZChmcmFjdGlvbkRpZ2l0cykpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjb21wdXRlU2lnbmVkQXJlYSh2aWV3ZXIsIHBhdGgpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXNcclxuICAgIGxldCBmcm9tRGVncmVlc0FycmF5ID0gW11cclxuICAgIGxldCBmcm9tRGVncmVlc0FycmF5MiA9IFtdXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhdGgubGVuZ3RoOyBpKyspIHtcclxuICAgICAgZnJvbURlZ3JlZXNBcnJheS5wdXNoKHBhdGhbaV0ubG5nLCBwYXRoW2ldLmxhdClcclxuICAgICAgZnJvbURlZ3JlZXNBcnJheTIucHVzaChbcGF0aFtpXS5sbmcsIHBhdGhbaV0ubGF0XSlcclxuICAgIH1cclxuICAgIGxldCBsaW5lID0gdHVyZi5saW5lU3RyaW5nKGZyb21EZWdyZWVzQXJyYXkyKTtcclxuICAgIGxldCBiYm94ID0gdHVyZi5iYm94KGxpbmUpO1xyXG4gICAgbGV0IGxvbmdSYWRpYW5zID0gQ2VzaXVtLk1hdGgudG9SYWRpYW5zKGJib3hbMl0gLSBiYm94WzBdKTtcclxuICAgIGxldCBsYXRSYWRpYW5zID0gQ2VzaXVtLk1hdGgudG9SYWRpYW5zKGJib3hbM10gLSBiYm94WzFdKTtcclxuICAgIGxldCBncmFudWxhcml0eVxyXG4gICAgaWYgKGxvbmdSYWRpYW5zID4gbGF0UmFkaWFucykge1xyXG4gICAgICBncmFudWxhcml0eSA9IGxvbmdSYWRpYW5zIC8gMTBcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBncmFudWxhcml0eSA9IGxhdFJhZGlhbnMgLyAxMFxyXG4gICAgfVxyXG5cclxuICAgIC8vIGxldCBncmFudWxhcml0eSA9IE1hdGguUEkgLyBNYXRoLnBvdygyLCAxMSk7XHJcbiAgICAvLyBncmFudWxhcml0eSA9IGdyYW51bGFyaXR5IC8gMTI1MDtcclxuICAgIGxldCBwb2x5Z29uR2VvbWV0cnkgPSBuZXcgQ2VzaXVtLlBvbHlnb25HZW9tZXRyeS5mcm9tUG9zaXRpb25zKHtcclxuICAgICAgcG9zaXRpb25zOiBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlc0FycmF5KGZyb21EZWdyZWVzQXJyYXkpLFxyXG4gICAgICB2ZXJ0ZXhGb3JtYXQ6IENlc2l1bS5QZXJJbnN0YW5jZUNvbG9yQXBwZWFyYW5jZS5GTEFUX1ZFUlRFWF9GT1JNQVQsXHJcbiAgICAgIGdyYW51bGFyaXR5OiBncmFudWxhcml0eSxcclxuICAgIH0pO1xyXG4gICAgLy/liJvlu7roh6rlrprkuYnlubPpnaLlh6DkvZXkvZNcclxuICAgIGxldCBnZW9tID0gbmV3IENlc2l1bS5Qb2x5Z29uR2VvbWV0cnkuY3JlYXRlR2VvbWV0cnkocG9seWdvbkdlb21ldHJ5KTtcclxuICAgIGlmICghZ2VvbSB8fCAhZ2VvbS5hdHRyaWJ1dGVzIHx8ICFnZW9tLmF0dHJpYnV0ZXMucG9zaXRpb24pIHtcclxuICAgICAgcmV0dXJuIDBcclxuICAgIH1cclxuICAgIGNvbnN0IGluZGljZXMgPSBnZW9tLmluZGljZXM7IC8v6I635Y+W6aG254K557Si5byV5pWw5o2uXHJcbiAgICBjb25zdCBwb3NpdGlvbnMgPSBnZW9tLmF0dHJpYnV0ZXMucG9zaXRpb24udmFsdWVzO1xyXG4gICAgZnVuY3Rpb24gcmV0dXJuUG9zaXRpb24ocG9zaXRpb24sIGluZGV4KSB7XHJcbiAgICAgIGxldCBwb3MzID0gbmV3IENlc2l1bS5DYXJ0ZXNpYW4zKFxyXG4gICAgICAgIHBvc2l0aW9uc1tpbmRleCAqIDNdLFxyXG4gICAgICAgIHBvc2l0aW9uc1tpbmRleCAqIDMgKyAxXSxcclxuICAgICAgICBwb3NpdGlvbnNbaW5kZXggKiAzICsgMl1cclxuICAgICAgKTtcclxuICAgICAgbGV0IHBvc2l0aW9uMSA9IHZpZXdlci5zY2VuZS5jbGFtcFRvSGVpZ2h0KHBvczMpIHx8IHBvczNcclxuICAgICAgLy8gbGV0IHBvczg0ID0gYXdhaXQgX3RoaXMuY2FydGVzaWFuM1Rvd2dzODQocG9zaXRpb24xLCB2aWV3ZXIpXHJcbiAgICAgIC8vIGxldCBoZWlnaHQgPSAwXHJcbiAgICAgIC8vIHRyeSB7XHJcbiAgICAgIC8vICAgbGV0IHBvc2l0aW9uMiA9IGF3YWl0IENlc2l1bS5zYW1wbGVUZXJyYWluTW9zdERldGFpbGVkKFxyXG4gICAgICAvLyAgICAgdmlld2VyLnNjZW5lLnRlcnJhaW5Qcm92aWRlcixcclxuICAgICAgLy8gICAgIFtDZXNpdW0uQ2FydG9ncmFwaGljLmZyb21DYXJ0ZXNpYW4ocG9zMyldXHJcbiAgICAgIC8vICAgKVxyXG4gICAgICAvLyAgIGhlaWdodCA9IHBvc2l0aW9uMlswXS5oZWlnaHRcclxuICAgICAgLy8gfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgLy8gICBoZWlnaHQgPSAwXHJcbiAgICAgIC8vIH1cclxuICAgICAgLy8gaWYgKGhlaWdodCA+IHBvczg0LmFsdCkge1xyXG4gICAgICAvLyAgIHBvczg0LmFsdCA9IGhlaWdodFxyXG4gICAgICAvLyB9XHJcbiAgICAgIHJldHVybiBwb3NpdGlvbjFcclxuICAgIH1cclxuXHJcbiAgICBsZXQgYXJlYSA9IDBcclxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBpbmRpY2VzLmxlbmd0aDsgaW5kZXggKz0gMykge1xyXG4gICAgICBjb25zdCBwb3MwID0gcmV0dXJuUG9zaXRpb24ocG9zaXRpb25zLCBpbmRpY2VzW2luZGV4XSk7XHJcbiAgICAgIGNvbnN0IHBvczEgPSByZXR1cm5Qb3NpdGlvbihwb3NpdGlvbnMsIGluZGljZXNbaW5kZXggKyAxXSk7XHJcbiAgICAgIGNvbnN0IHBvczIgPSByZXR1cm5Qb3NpdGlvbihwb3NpdGlvbnMsIGluZGljZXNbaW5kZXggKyAyXSk7XHJcbiAgICAgIC8vIGxldCBlbnRpdHkgPSB2aWV3ZXIuZW50aXRpZXMuYWRkKHtcclxuICAgICAgLy8gICBuYW1lOiBcIuS4ieinkumdolwiLFxyXG4gICAgICAvLyAgIHBvbHlnb246IHtcclxuICAgICAgLy8gICAgIGhpZXJhcmNoeTogW3BvczAsIHBvczEsIHBvczJdLFxyXG4gICAgICAvLyAgICAgcGVyUG9zaXRpb25IZWlnaHQ6IHRydWUsXHJcbiAgICAgIC8vICAgICBtYXRlcmlhbDogQ2VzaXVtLkNvbG9yLmZyb21SYW5kb20oKSxcclxuICAgICAgLy8gICAgIG91dGxpbmU6IHRydWUsXHJcbiAgICAgIC8vICAgICBvdXRsaW5lQ29sb3I6IENlc2l1bS5Db2xvci5CTEFDSyxcclxuICAgICAgLy8gICB9LFxyXG4gICAgICAvLyB9KTtcclxuXHJcbiAgICAgIGxldCB2MCA9IENlc2l1bS5DYXJ0ZXNpYW4zLnN1YnRyYWN0KHBvczAsIHBvczEsIG5ldyBDZXNpdW0uQ2FydGVzaWFuMygpKVxyXG4gICAgICBsZXQgdjEgPSBDZXNpdW0uQ2FydGVzaWFuMy5zdWJ0cmFjdChwb3MyLCBwb3MxLCBuZXcgQ2VzaXVtLkNhcnRlc2lhbjMoKSlcclxuICAgICAgbGV0IGNyb3NzID0gQ2VzaXVtLkNhcnRlc2lhbjMuY3Jvc3ModjAsIHYxLCB2MCk7XHJcbiAgICAgIGFyZWEgPSAoYXJlYSArIENlc2l1bS5DYXJ0ZXNpYW4zLm1hZ25pdHVkZShjcm9zcykgKiAwLjUpXHJcbiAgICB9XHJcbiAgICByZXR1cm4gTnVtYmVyKGFyZWEudG9GaXhlZCgyKSlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBkZXNjIOWIm+W7uuWchlxyXG4gICAqQG1ldGhvZCBjcmVhdGVDaXJjbGVcclxuICAgKiBAcGFyYW0gcG9pbnQge29iamVjdH0g5ZyG5b+D5Z2Q5qCHXHJcbiAgICogQHBhcmFtIHBvaW50LmxuZyB7bnVtYmVyfSDnu4/luqZcclxuICAgKiBAcGFyYW0gcG9pbnQubGF0IHtudW1iZXJ9IOe6rOW6plxyXG4gICAqIEBwYXJhbSByYWRpdXMge251bWJlcn0g5Y2K5b6EICDljZXkvY3vvJrnsbNcclxuICAgKiBAcGFyYW0gW29wdGlvbnNdXHJcbiAgICogQHBhcmFtIFtvcHRpb25zLnN0ZXBzPTM2MF0ge251bWJlcn0g5q615pWwXHJcbiAgICogQG1lbWJlck9mIFRvb2xzXHJcblxyXG4gICAqICovXHJcbiAgY3JlYXRlQ2lyY2xlKHBvaW50LCByYWRpdXMgPSAxLCBvcHRpb25zID0geyBzdGVwczogMzYwIH0pIHtcclxuICAgIGlmIChOdW1iZXIocmFkaXVzKSA8PSAwKSB7XHJcbiAgICAgIHJhZGl1cyA9IDAuMDFcclxuICAgIH1cclxuICAgIHZhciBjZW50ZXIgPSBbTnVtYmVyKHBvaW50LmxuZyksIE51bWJlcihwb2ludC5sYXQpXVxyXG4gICAgbGV0IGNvb3JkaW5hdGVzID0gdHVyZi5jaXJjbGUoY2VudGVyLCByYWRpdXMgLyAxMDAwLCBvcHRpb25zKS5nZW9tZXRyeVxyXG4gICAgICAuY29vcmRpbmF0ZXNbMF1cclxuICAgIGxldCBwb3NpdGlvbnMgPSBbXVxyXG4gICAgY29vcmRpbmF0ZXMuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICBwb3NpdGlvbnMgPSBwb3NpdGlvbnMuY29uY2F0KGl0ZW0pXHJcbiAgICB9KVxyXG4gICAgcmV0dXJuIHBvc2l0aW9uc1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQGRlc2Mg5Yib5bu65qSt5ZyGXHJcbiAgICpAbWV0aG9kIGNyZWF0ZUVsbGlwc2VcclxuICAgKiBAcGFyYW0gcG9pbnQge29iamVjdH0g5ZyG5b+D5Z2Q5qCHXHJcbiAgICogQHBhcmFtIHBvaW50LmxuZyB7bnVtYmVyfSDnu4/luqZcclxuICAgKiBAcGFyYW0gcG9pbnQubGF0IHtudW1iZXJ9IOe6rOW6plxyXG4gICAqIEBwYXJhbSBbb3B0aW9uc11cclxuICAgKiBAcGFyYW0gW29wdGlvbnMuZ3JhbnVsYXJpdHk9MC4xXSB7bnVtYmVyfSDmpK3lnIbkuIrngrnkuYvpl7TnmoTop5LluqZcclxuICAgKiBAcGFyYW0gW29wdGlvbnMuc2VtaU1pbm9yQXhpcz0xMF0ge251bWJlcn0g55+t5Y2K6L206ZW/5bqmICDljZXkvY3vvJrnsbNcclxuICAgKiBAcGFyYW0gW29wdGlvbnMuc2VtaU1ham9yQXhpcz0yMF0ge251bWJlcn0g6ZW/5Y2K6L206ZW/5bqmICDljZXkvY3vvJrnsbNcclxuICAgKiBAcGFyYW0gW29wdGlvbnMuYmVhcmluZz0wXSB7bnVtYmVyfSDmpK3lnIbml4vovazop5LluqYgIOWNleS9je+8muexs1xyXG4gICAqIEBtZW1iZXJPZiBUb29sc1xyXG5cclxuICAgKiAqL1xyXG4gIGNyZWF0ZUVsbGlwc2UocG9pbnQsIG9wdGlvbnMgPSB7IGdyYW51bGFyaXR5OiAwLjEsIHNlbWlNaW5vckF4aXM6IDEwLCBzZW1pTWFqb3JBeGlzOiAyMCwgYmVhcmluZzogMCwgaGVpZ2h0OiAwIH0pIHtcclxuICAgIGlmICghb3B0aW9ucy5ncmFudWxhcml0eSkge1xyXG4gICAgICBvcHRpb25zLmdyYW51bGFyaXR5ID0gMC4xXHJcbiAgICB9XHJcbiAgICBpZiAoIW9wdGlvbnMuaGVpZ2h0KSB7XHJcbiAgICAgIG9wdGlvbnMuaGVpZ2h0ID0gMFxyXG4gICAgfVxyXG4gICAgaWYgKCFvcHRpb25zLnNlbWlNaW5vckF4aXMpIHtcclxuICAgICAgb3B0aW9ucy5zZW1pTWlub3JBeGlzID0gMC4wMDAwMVxyXG4gICAgfVxyXG4gICAgaWYgKCFvcHRpb25zLnNlbWlNYWpvckF4aXMpIHtcclxuICAgICAgb3B0aW9ucy5zZW1pTWFqb3JBeGlzID0gMC4wMDAwMVxyXG4gICAgfVxyXG4gICAgbGV0IGVsbGlwc2VHZW9tZXRyeSA9IG5ldyBDZXNpdW0uRWxsaXBzZU91dGxpbmVHZW9tZXRyeSh7XHJcbiAgICAgIGNlbnRlcjogQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXMoTnVtYmVyKHBvaW50LmxuZyksIE51bWJlcihwb2ludC5sYXQpKSxcclxuICAgICAgc2VtaU1ham9yQXhpczogTnVtYmVyKG9wdGlvbnMuc2VtaU1ham9yQXhpcyksXHJcbiAgICAgIHNlbWlNaW5vckF4aXM6IE51bWJlcihvcHRpb25zLnNlbWlNaW5vckF4aXMpLFxyXG4gICAgICBoZWlnaHQ6IE51bWJlcihvcHRpb25zLmhlaWdodCksXHJcbiAgICAgIGdyYW51bGFyaXR5OiBDZXNpdW0uTWF0aC50b1JhZGlhbnMob3B0aW9ucy5ncmFudWxhcml0eSksXHJcbiAgICAgIHJvdGF0aW9uOiBDZXNpdW0uTWF0aC50b1JhZGlhbnMob3B0aW9ucy5iZWFyaW5nKSxcclxuICAgIH0pXHJcbiAgICBsZXQgZWxsaXBzZSA9IENlc2l1bS5FbGxpcHNlT3V0bGluZUdlb21ldHJ5LmNyZWF0ZUdlb21ldHJ5KGVsbGlwc2VHZW9tZXRyeSlcclxuICAgIGlmICghZWxsaXBzZSB8fCAhZWxsaXBzZS5hdHRyaWJ1dGVzIHx8ICFlbGxpcHNlLmF0dHJpYnV0ZXMucG9zaXRpb24pIHtcclxuICAgICAgcmV0dXJuIFtdXHJcbiAgICB9XHJcbiAgICBjb25zdCBlbGxpcHNlUG9zaXRpb25zID0gZWxsaXBzZS5hdHRyaWJ1dGVzLnBvc2l0aW9uLnZhbHVlcztcclxuICAgIGxldCBwb3NpdGlvbnMgPSBbXVxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbGxpcHNlUG9zaXRpb25zLmxlbmd0aDsgaSArPSAzKSB7XHJcbiAgICAgIGxldCBwb3MgPSBuZXcgQ2VzaXVtLkNhcnRlc2lhbjMoXHJcbiAgICAgICAgZWxsaXBzZVBvc2l0aW9uc1tpXSxcclxuICAgICAgICBlbGxpcHNlUG9zaXRpb25zW2kgKyAxXSxcclxuICAgICAgICBlbGxpcHNlUG9zaXRpb25zW2kgKyAyXVxyXG4gICAgICApXHJcbiAgICAgIHBvc2l0aW9ucy5wdXNoKHBvcylcclxuICAgIH1cclxuICAgIHJldHVybiBwb3NpdGlvbnNcclxuICB9XHJcblxyXG4gIC8q6K6h566XMueCueeahOaBkuebuOe6v+WkueinkiovXHJcbiAgcmh1bWJCZWFyaW5nKHAxLCBwMikge1xyXG4gICAgdmFyIHBvaW50MSA9IHR1cmYucG9pbnQoW3AxLmxuZywgcDEubGF0XSwpO1xyXG4gICAgdmFyIHBvaW50MiA9IHR1cmYucG9pbnQoW3AyLmxuZywgcDIubGF0XSwpO1xyXG4gICAgcmV0dXJuIHR1cmYucmh1bWJCZWFyaW5nKHBvaW50MSwgcG9pbnQyKTtcclxuICB9XHJcblxyXG5cclxuICBjb21wdXRlQ2VudGVyKHBvc2l0aW9ucyA9IFtdKSB7XHJcbiAgICBsZXQgYXJyID0gW11cclxuICAgIHBvc2l0aW9ucy5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgIGFyci5wdXNoKHR1cmYucG9pbnQoW2l0ZW0ubG5nLCBpdGVtLmxhdF0pKVxyXG4gICAgfSlcclxuICAgIHZhciBmZWF0dXJlcyA9IHR1cmYuZmVhdHVyZUNvbGxlY3Rpb24oYXJyKVxyXG5cclxuICAgIHZhciBjb29yZGluYXRlcyA9IHR1cmYuY2VudGVyKGZlYXR1cmVzKS5nZW9tZXRyeS5jb29yZGluYXRlc1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgbG5nOiBjb29yZGluYXRlc1swXSxcclxuICAgICAgbGF0OiBjb29yZGluYXRlc1sxXSxcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8v6K6h566XMueCueeahOS4reW/g+eCuVxyXG4gIGNvbXB1dGVNaWRwb2ludChwb2ludDEsIHBvaW50Mikge1xyXG4gICAgbGV0IHAxID0gdHVyZi5wb2ludChbcG9pbnQxLmxuZywgcG9pbnQxLmxhdF0pXHJcbiAgICBsZXQgcDIgPSB0dXJmLnBvaW50KFtwb2ludDIubG5nLCBwb2ludDIubGF0XSlcclxuICAgIHZhciBjZW50ZXIgPSB0dXJmLm1pZHBvaW50KHAxLCBwMikuZ2VvbWV0cnkuY29vcmRpbmF0ZXNcclxuICAgIHJldHVybiB7IGxuZzogY2VudGVyWzBdLCBsYXQ6IGNlbnRlclsxXSB9XHJcbiAgfVxyXG5cclxuICAvL+iuoeeul1xyXG4gIGNvbXB1dGVBdHRhY2tBcnJvdyhwb3NpdGlvbnMgPSBbXSkge1xyXG4gICAgcmV0dXJuIHRoaXMuY29tcHV0ZUFycm93KHBvc2l0aW9ucywgMClcclxuICB9XHJcblxyXG4gIC8v6K6h566X6ZKz5Ye7566t5aS0XHJcbiAgY29tcHV0ZVBpbmNlckFycm93KHBvc2l0aW9ucyA9IFtdKSB7XHJcbiAgICByZXR1cm4gdGhpcy5jb21wdXRlQXJyb3cocG9zaXRpb25zKVxyXG4gIH1cclxuXHJcbiAgLy/orqHnrpfmlLvlh7vnrq3lpLRcclxuICBjb21wdXRlQXJyb3cocG9zaXRpb25zID0gW10sIHR5cGUgPSAxKSB7XHJcbiAgICBpZiAocG9zaXRpb25zLmxlbmd0aCA8IDMpIHtcclxuICAgICAgcmV0dXJuIFtdXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB2YXIgbG5nbGF0QXJyID0gW11cclxuICAgICAgLy8gaWYocG9zaXRpb25zLmV2ZXJ5KHBvcyA9PiBOdW1iZXIocG9zLmxuZykgPj0gMCkgfHwgcG9zaXRpb25zLmV2ZXJ5KHBvcyA9PiBOdW1iZXIocG9zLmxuZykgPD0gMCkpIHtcclxuICAgICAgLy8gICBmb3IgKHZhciBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAvLyAgICAgbG5nbGF0QXJyLnB1c2goW3Bvc2l0aW9uc1tpXS5sbmcsIHBvc2l0aW9uc1tpXS5sYXRdKVxyXG4gICAgICAvLyAgIH1cclxuICAgICAgLy8gfVxyXG4gICAgICAvLyBlbHNlIHtcclxuICAgICAgLy8gICBmb3IgKHZhciBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAvLyAgICAgaWYocG9zaXRpb25zW2ldLmxuZzwwKSB7XHJcbiAgICAgIC8vICAgICAgIGxuZ2xhdEFyci5wdXNoKFtwb3NpdGlvbnNbaV0ubG5nKzM2MCwgcG9zaXRpb25zW2ldLmxhdF0pXHJcbiAgICAgIC8vICAgICB9XHJcbiAgICAgIC8vICAgICBlbHNlIHtcclxuICAgICAgLy8gICAgICAgbG5nbGF0QXJyLnB1c2goW3Bvc2l0aW9uc1tpXS5sbmcsIHBvc2l0aW9uc1tpXS5sYXRdKVxyXG4gICAgICAvLyAgICAgfVxyXG4gICAgICAvLyAgIH1cclxuICAgICAgLy8gfVxyXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGxuZ2xhdEFyci5wdXNoKFtwb3NpdGlvbnNbaV0ubG5nLCBwb3NpdGlvbnNbaV0ubGF0XSlcclxuICAgICAgfVxyXG4gICAgICB2YXIgcmVzXHJcbiAgICAgIGlmICh0eXBlKSB7XHJcbiAgICAgICAgcmVzID0geHAuYWxnb3JpdGhtLmRvdWJsZUFycm93KGxuZ2xhdEFycilcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXMgPSB4cC5hbGdvcml0aG0udGFpbGVkQXR0YWNrQXJyb3cobG5nbGF0QXJyKVxyXG4gICAgICB9XHJcbiAgICAgIHZhciBpbmRleCA9IEpTT04uc3RyaW5naWZ5KHJlcy5wb2x5Z29uYWxQb2ludCkuaW5kZXhPZignbnVsbCcpXHJcbiAgICAgIHZhciByZXR1cm5EYXRhID0gW11cclxuICAgICAgaWYgKGluZGV4ID09PSAtMSkgcmV0dXJuRGF0YSA9IHJlcy5wb2x5Z29uYWxQb2ludFxyXG4gICAgICByZXR1cm4gcmV0dXJuRGF0YVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8g6K6h566X6ZuG57uT5ZywXHJcbiAgY29tcHV0ZUFzc2VtYmxlKHBvc2l0aW9ucyA9IFtdLCBpczg0ID0gZmFsc2UpIHtcclxuICAgIGlmIChwb3NpdGlvbnMubGVuZ3RoIDwgMikge1xyXG4gICAgICByZXR1cm4gW11cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGxldCBwb2ludHMgPSBwb3NpdGlvbnMubGVuZ3RoO1xyXG4gICAgICBsZXQgcG50cyA9IG5ldyBBcnJheSgpO1xyXG4gICAgICBwb3NpdGlvbnMuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICAgIHBudHMucHVzaChbaXRlbS5sbmcsIGl0ZW0ubGF0XSk7XHJcbiAgICAgIH0pO1xyXG4gICAgICAvL2NvbnNvbGUubG9nKFwicG50czY2NjZcIixwbnRzKTtcclxuICAgICAgLy8gcG50cy5wdXNoKHRhaWxQb2ludCk7XHJcbiAgICAgIC8vIHBudHMucHVzaChoZWFkZXJQb2ludCk7XHJcblxyXG4gICAgICBpZiAocG50cy5sZW5ndGggPT09IDIpIHtcclxuICAgICAgICBsZXQgbWlkID0gUC5QbG90VXRpbHMubWlkKHBudHNbMF0sIHBudHNbMV0pXHJcbiAgICAgICAgLy9sZXQgZCA9IHV0aWxzLk1hdGhEaXN0YW5jZShwbnRzWzBdLCBtaWQpIC8gMC45XHJcbiAgICAgICAgbGV0IGQgPSBQLlBsb3RVdGlscy5kaXN0YW5jZShwbnRzWzBdLCBtaWQpIC8gMC45XHJcbiAgICAgICAgLy9jb25zb2xlLmxvZyhcImRcIixkKTtcclxuICAgICAgICBsZXQgcG50ID0gUC5QbG90VXRpbHMuZ2V0VGhpcmRQb2ludChwbnRzWzBdLCBtaWQsIFAuQ29uc3RhbnRzLkhBTEZfUEksIGQsIHRydWUpXHJcbiAgICAgICAgcG50cyA9IFtwbnRzWzBdLCBwbnQsIHBudHNbMV1dO1xyXG4gICAgICAgIC8vY29uc29sZS5sb2coXCJwbnRcIixwbnQpO1xyXG4gICAgICAgIC8vY3JlYXRlUG9pbnQoQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXMocG50WzBdLCBwbnRbMV0pKTtcclxuICAgICAgfVxyXG4gICAgICBsZXQgbWlkID0gUC5QbG90VXRpbHMubWlkKHBudHNbMF0sIHBudHNbMl0pXHJcbiAgICAgIHBudHMucHVzaChtaWQsIHBudHNbMF0sIHBudHNbMV0pXHJcblxyXG4gICAgICBsZXQgW25vcm1hbHMsIHBudDEsIHBudDIsIHBudDMsIHJlc3VsdCwgcmVzdWx0Ml0gPSBbW10sIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIFtdLCBbXV1cclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwbnRzLmxlbmd0aCAtIDI7IGkrKykge1xyXG4gICAgICAgIHBudDEgPSBwbnRzW2ldXHJcbiAgICAgICAgcG50MiA9IHBudHNbaSArIDFdXHJcbiAgICAgICAgcG50MyA9IHBudHNbaSArIDJdXHJcbiAgICAgICAgbGV0IG5vcm1hbFBvaW50cyA9IFAuUGxvdFV0aWxzLmdldEJpc2VjdG9yTm9ybWFscygwLjQsIHBudDEsIHBudDIsIHBudDMpXHJcbiAgICAgICAgbm9ybWFscyA9IG5vcm1hbHMuY29uY2F0KG5vcm1hbFBvaW50cylcclxuICAgICAgfVxyXG4gICAgICBsZXQgY291bnQgPSBub3JtYWxzLmxlbmd0aFxyXG4gICAgICBub3JtYWxzID0gW25vcm1hbHNbY291bnQgLSAxXV0uY29uY2F0KG5vcm1hbHMuc2xpY2UoMCwgY291bnQgLSAxKSlcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwbnRzLmxlbmd0aCAtIDI7IGkrKykge1xyXG4gICAgICAgIHBudDEgPSBwbnRzW2ldXHJcbiAgICAgICAgcG50MiA9IHBudHNbaSArIDFdXHJcbiAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmNvbmNhdChbLi4ucG50MV0pXHJcbiAgICAgICAgZm9yIChsZXQgdCA9IDA7IHQgPD0gUC5Db25zdGFudHMuRklUVElOR19DT1VOVDsgdCsrKSB7XHJcbiAgICAgICAgICBsZXQgcG50ID0gUC5QbG90VXRpbHMuZ2V0Q3ViaWNWYWx1ZSh0IC8gUC5Db25zdGFudHMuRklUVElOR19DT1VOVCwgcG50MSwgbm9ybWFsc1tpICogMl0sIG5vcm1hbHNbaSAqIDIgKyAxXSwgcG50MilcclxuICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5jb25jYXQoWy4uLnBudF0pXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJlc3VsdCA9IHJlc3VsdC5jb25jYXQoWy4uLnBudDJdKVxyXG4gICAgICB9XHJcbiAgICAgIGlmIChpczg0KSB7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdFxyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHJldHVybiBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlc0FycmF5KHJlc3VsdClcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8g6K6h566X55u057q/566t5aS0XHJcbiAgY29tcHV0ZVN0cmFpZ2h0QXJyb3cocG9zaXRpb25zID0gW10sIGlzODQgPSBmYWxzZSkge1xyXG4gICAgaWYgKHBvc2l0aW9ucy5sZW5ndGggPCAyKSB7XHJcbiAgICAgIHJldHVybiBbXVxyXG4gICAgfVxyXG4gICAgbGV0IHBvaW50MSA9IFtwb3NpdGlvbnNbMF0ubG5nLCBwb3NpdGlvbnNbMF0ubGF0XVxyXG4gICAgbGV0IHBvaW50MiA9IFtwb3NpdGlvbnNbMV0ubG5nLCBwb3NpdGlvbnNbMV0ubGF0XVxyXG4gICAgaWYgKHBvc2l0aW9uc1swXS5sbmcgPT09IHBvc2l0aW9uc1sxXS5sbmcgJiYgcG9zaXRpb25zWzBdLmxhdCA9PT0gcG9zaXRpb25zWzFdLmxhdCkge1xyXG4gICAgICBpZiAoaXM4NCkge1xyXG4gICAgICAgIHJldHVybiBbcG9zaXRpb25zWzBdLCBwb3NpdGlvbnNbMF0sIHBvc2l0aW9uc1swXV1cclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBsZXQgY2FydGVzaWFuMyA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzKHBvc2l0aW9uc1swXS5sbmcsIHBvc2l0aW9uc1swXS5sYXQpXHJcbiAgICAgICAgcmV0dXJuIFtjYXJ0ZXNpYW4zLCBjYXJ0ZXNpYW4zLCBjYXJ0ZXNpYW4zXVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBsZXQgbG5nbGF0QXJyID0gW11cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGxuZ2xhdEFyci5wdXNoKFtwb3NpdGlvbnNbaV0ubG5nLCBwb3NpdGlvbnNbaV0ubGF0XSlcclxuICAgIH1cclxuXHJcbiAgICBsZXQgcmVzXHJcbiAgICByZXMgPSB4cC5hbGdvcml0aG0uZmluZUFycm93KHBvaW50MSwgcG9pbnQyKVxyXG4gICAgaWYgKGlzODQpIHtcclxuICAgICAgbGV0IHBvczg0ID0gW11cclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBsZXQgcG9zID0gdGhpcy5jYXJ0ZXNpYW4zVG93Z3M4NChyZXNbaV0sIHRoaXMuc2RrLnZpZXdlcilcclxuICAgICAgICBwb3M4NC5wdXNoKHBvcy5sbmcsIHBvcy5sYXQpXHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHBvczg0XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzXHJcbiAgfVxyXG5cclxuICBnZXRNYXRlcmlhbChjb2xvciA9ICcjMmFiMGMyJywgdHlwZSA9IDAsIGVudGl0eSA9IG51bGwsIG5ld1BhcmFtID0ge30pIHtcclxuICAgIGxldCBtYXRlcmlhbCA9ICcnXHJcbiAgICBsZXQgYXJyID0ge1xyXG4gICAgICAnNyc6IDEwLFxyXG4gICAgICAnOCc6IDMsXHJcbiAgICAgICc5JzogNCxcclxuICAgICAgJzEwJzogNCxcclxuICAgICAgJzExJzogNCxcclxuICAgICAgJzEyJzogMlxyXG4gICAgfVxyXG4gICAgaWYgKGVudGl0eSkge1xyXG4gICAgICBhcnJbdHlwZSArICcnXSA/IChlbnRpdHkucG9seWxpbmUud2lkdGggPSBlbnRpdHkucG9seWxpbmUub3JpV2lkdGggKyBhcnJbdHlwZSArICcnXSkgOiAoZW50aXR5LnBvbHlsaW5lLndpZHRoID0gZW50aXR5LnBvbHlsaW5lLm9yaVdpZHRoKVxyXG4gICAgfVxyXG4gICAgc3dpdGNoIChOdW1iZXIodHlwZSkpIHtcclxuXHJcbiAgICAgIGNhc2UgMTogLy/omZrnur9cclxuICAgICAgICBtYXRlcmlhbCA9IG5ldyBDZXNpdW0uUG9seWxpbmVEYXNoTWF0ZXJpYWxQcm9wZXJ0eSh7XHJcbiAgICAgICAgICBjb2xvcjogQ2VzaXVtLkNvbG9yLmZyb21Dc3NDb2xvclN0cmluZyhjb2xvciksXHJcbiAgICAgICAgICBkYXNoTGVuZ3RoOiAxMCwgLy/nn63liJLnur/plb/luqZcclxuICAgICAgICB9KVxyXG4gICAgICAgIGJyZWFrXHJcbiAgICAgIGNhc2UgMjogLy/ms5vlhYlcclxuICAgICAgICBtYXRlcmlhbCA9IG5ldyBDZXNpdW0uUG9seWxpbmVHbG93TWF0ZXJpYWxQcm9wZXJ0eSh7XHJcbiAgICAgICAgICBnbG93UG93ZXI6IDAuMixcclxuICAgICAgICAgIGNvbG9yOiBDZXNpdW0uQ29sb3IuZnJvbUNzc0NvbG9yU3RyaW5nKGNvbG9yKSxcclxuICAgICAgICB9KVxyXG4gICAgICAgIGJyZWFrXHJcbiAgICAgIGNhc2UgMzogLy/lsL7ov7nlhYnnur9cclxuICAgICAgICBtYXRlcmlhbCA9IG5ldyBDZXNpdW0uUG9seWxpbmVGbG93TWF0ZXJpYWxQcm9wZXJ0eSh7XHJcbiAgICAgICAgICBjb2xvcjogY29sb3IsXHJcbiAgICAgICAgICBzcGVlZDogbmV3UGFyYW0ucm90YXRlID8gbmV3UGFyYW0uc3BlZWQgOiAwIC0gbmV3UGFyYW0uc3BlZWQsXHJcbiAgICAgICAgICByb3RhdGU6IG5ld1BhcmFtLnJvdGF0ZVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgYnJlYWtcclxuICAgICAgY2FzZSA0OiAvL+WkmuWwvui/ueWFiee6v1xyXG4gICAgICAgIG1hdGVyaWFsID0gbmV3IENlc2l1bS5Qb2x5bGluZUZsb3dNdWx0TWF0ZXJpYWxQcm9wZXJ0eSh7XHJcbiAgICAgICAgICBjb2xvcjogY29sb3IsXHJcbiAgICAgICAgICBzcGVlZDogbmV3UGFyYW0ucm90YXRlID8gbmV3UGFyYW0uc3BlZWQgOiAwIC0gbmV3UGFyYW0uc3BlZWQsXHJcbiAgICAgICAgICByb3RhdGU6IG5ld1BhcmFtLnJvdGF0ZVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgYnJlYWtcclxuICAgICAgY2FzZSA1OiAvL+aZrumAmua1geWKqOiZmue6v1xyXG4gICAgICAvLyBtYXRlcmlhbCA9IG5ldyBDZXNpdW0uRmxvd0Rhc2hlZExpbmVGbG93TWF0ZXJpYWxQcm9wZXJ0eSh7XHJcbiAgICAgIC8vICAgY29sb3I6IGNvbG9yLFxyXG4gICAgICAvLyAgIHVUeXBlOiAwLFxyXG4gICAgICAvLyAgIHNwZWVkOiBuZXdQYXJhbS5yb3RhdGUgPyBuZXdQYXJhbS5zcGVlZCA6IDAgLSBuZXdQYXJhbS5zcGVlZCxcclxuICAgICAgLy8gICAvLyBkYXNoU2l6ZTogbmV3UGFyYW0uZGFzaFNpemUsXHJcbiAgICAgIC8vICAgc3BhY2U6IG5ld1BhcmFtLnNwYWNlLFxyXG4gICAgICAvLyAgIHNjYWxlOiAxLjBcclxuICAgICAgLy8gfSlcclxuICAgICAgLy8gYnJlYWtcclxuICAgICAgY2FzZSA2OiAvL+a1geWKqOiZmue6vzJcclxuICAgICAgICBsZXQgdGhhdCA9IHRoaXNcclxuICAgICAgICBsZXQgcmVwZWF0WFxyXG4gICAgICAgIG1hdGVyaWFsID0gbmV3IENlc2l1bS5GbG93RGFzaGVkTGluZUZsb3dNYXRlcmlhbFByb3BlcnR5KHtcclxuICAgICAgICAgIGNvbG9yOiBjb2xvcixcclxuICAgICAgICAgIHVUeXBlOiB0eXBlID09IDUgPyAwIDogMSxcclxuICAgICAgICAgIHNwZWVkOiBuZXdQYXJhbS5yb3RhdGUgPyBuZXdQYXJhbS5zcGVlZCA6IDAgLSBuZXdQYXJhbS5zcGVlZCxcclxuICAgICAgICAgIC8vIGRhc2hTaXplOiBuZXdQYXJhbS5kYXNoU2l6ZSxcclxuICAgICAgICAgIHNwYWNlOiBuZXdQYXJhbS5zcGFjZSxcclxuICAgICAgICAgIHNjYWxlOiBuZXcgQ2VzaXVtLkNhbGxiYWNrUHJvcGVydHkoZnVuY3Rpb24gKCkge1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoYXQuc2RrLnZpZXdlci5zY2VuZS5tb2RlID09PSBDZXNpdW0uU2NlbmVNb2RlLlNDRU5FM0QpIHtcclxuICAgICAgICAgICAgICBsZXQgb3JpUG9zaXRpb25zID0gZW50aXR5LnBvbHlsaW5lLnBvc2l0aW9ucy5nZXRWYWx1ZSgpO1xyXG5cclxuICAgICAgICAgICAgICBpZiAoIUNlc2l1bS5kZWZpbmVkKG9yaVBvc2l0aW9ucykpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAxLjA7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGxldCBkaXN0YW5jZSA9IDA7XHJcbiAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvcmlQb3NpdGlvbnMubGVuZ3RoIC0gMTsgKytpKSB7XHJcbiAgICAgICAgICAgICAgICBkaXN0YW5jZSArPSBDZXNpdW0uQ2FydGVzaWFuMy5kaXN0YW5jZShvcmlQb3NpdGlvbnNbaV0sIG9yaVBvc2l0aW9uc1tpICsgMV0pO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAvL+Wxj+W5leWdkOagh1xyXG4gICAgICAgICAgICAgIGxldCBwb2ludDEgPSBuZXcgQ2VzaXVtLkNhcnRlc2lhbjIoMCwgdGhhdC5zZGsudmlld2VyLmNhbnZhcy5jbGllbnRIZWlnaHQpXHJcbiAgICAgICAgICAgICAgbGV0IHBvaW50MiA9IG5ldyBDZXNpdW0uQ2FydGVzaWFuMih0aGF0LnNkay52aWV3ZXIuY2FudmFzLmNsaWVudFdpZHRoIC8gMiwgdGhhdC5zZGsudmlld2VyLmNhbnZhcy5jbGllbnRIZWlnaHQpXHJcbiAgICAgICAgICAgICAgbGV0IGNhcnRlc2lhbjEgPSB0aGF0LnNkay52aWV3ZXIuc2NlbmUucGlja1Bvc2l0aW9uKHBvaW50MSlcclxuICAgICAgICAgICAgICBsZXQgY2FydGVzaWFuMiA9IHRoYXQuc2RrLnZpZXdlci5zY2VuZS5waWNrUG9zaXRpb24ocG9pbnQyKVxyXG4gICAgICAgICAgICAgIGlmIChjYXJ0ZXNpYW4xICYmIGNhcnRlc2lhbjIpIHtcclxuICAgICAgICAgICAgICAgIGxldCBkaXN0YW5jZTIgPSBDZXNpdW0uQ2FydGVzaWFuMy5kaXN0YW5jZShjYXJ0ZXNpYW4xLCBjYXJ0ZXNpYW4yKTtcclxuICAgICAgICAgICAgICAgIHJlcGVhdFggPSBkaXN0YW5jZTIgKiAyIC8gZGlzdGFuY2VcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgcmV0dXJuIHJlcGVhdFg7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgbGV0IHNkazNkID0gZ2V0M0RWaWV3KClcclxuICAgICAgICAgICAgICBsZXQgc2RrM2RFbnRpdHkgPSBzZGszZC52aWV3ZXIuZW50aXRpZXMuZ2V0QnlJZCh0aGF0Lm9wdGlvbnMuaWQpXHJcbiAgICAgICAgICAgICAgbGV0IG9yaVBvc2l0aW9ucyA9IHNkazNkRW50aXR5LnBvbHlsaW5lLnBvc2l0aW9ucy5nZXRWYWx1ZSgpO1xyXG5cclxuICAgICAgICAgICAgICBpZiAoIUNlc2l1bS5kZWZpbmVkKG9yaVBvc2l0aW9ucykpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAxLjA7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGxldCBkaXN0YW5jZSA9IDA7XHJcbiAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvcmlQb3NpdGlvbnMubGVuZ3RoIC0gMTsgKytpKSB7XHJcbiAgICAgICAgICAgICAgICBkaXN0YW5jZSArPSBDZXNpdW0uQ2FydGVzaWFuMy5kaXN0YW5jZShvcmlQb3NpdGlvbnNbaV0sIG9yaVBvc2l0aW9uc1tpICsgMV0pO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAvL+Wxj+W5leWdkOagh1xyXG4gICAgICAgICAgICAgIGxldCBwb2ludDEgPSBuZXcgQ2VzaXVtLkNhcnRlc2lhbjIoMCwgc2RrM2Qudmlld2VyLmNhbnZhcy5jbGllbnRIZWlnaHQpXHJcbiAgICAgICAgICAgICAgbGV0IHBvaW50MiA9IG5ldyBDZXNpdW0uQ2FydGVzaWFuMihzZGszZC52aWV3ZXIuY2FudmFzLmNsaWVudFdpZHRoIC8gMiwgc2RrM2Qudmlld2VyLmNhbnZhcy5jbGllbnRIZWlnaHQpXHJcbiAgICAgICAgICAgICAgbGV0IGNhcnRlc2lhbjEgPSBzZGszZC52aWV3ZXIuc2NlbmUucGlja1Bvc2l0aW9uKHBvaW50MSlcclxuICAgICAgICAgICAgICBsZXQgY2FydGVzaWFuMiA9IHNkazNkLnZpZXdlci5zY2VuZS5waWNrUG9zaXRpb24ocG9pbnQyKVxyXG4gICAgICAgICAgICAgIGlmIChjYXJ0ZXNpYW4xICYmIGNhcnRlc2lhbjIpIHtcclxuICAgICAgICAgICAgICAgIGxldCBkaXN0YW5jZTIgPSBDZXNpdW0uQ2FydGVzaWFuMy5kaXN0YW5jZShjYXJ0ZXNpYW4xLCBjYXJ0ZXNpYW4yKTtcclxuICAgICAgICAgICAgICAgIHJlcGVhdFggPSBkaXN0YW5jZTIgKiAyIC8gZGlzdGFuY2VcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgcmV0dXJuIHJlcGVhdFg7XHJcbiAgICAgICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgICAgfSlcclxuICAgICAgICB9KVxyXG5cclxuICAgICAgICBicmVha1xyXG4gICAgICBjYXNlIDc6IC8v5rWB5Yqo566t5aS0MVxyXG4gICAgICBjYXNlIDg6IC8v5rWB5Yqo566t5aS0MlxyXG4gICAgICBjYXNlIDk6IC8v5rWB5Yqo566t5aS0M1xyXG4gICAgICBjYXNlIDEwOiAvL+a1geWKqOeureWktDRcclxuICAgICAgY2FzZSAxMTogLy/mtYHliqjnrq3lpLQ1XHJcbiAgICAgIGNhc2UgMTI6IC8v5rWB5Yqo566t5aS0NlxyXG4gICAgICAgIGxldCBwYXJhbSA9IHtcclxuICAgICAgICAgIGNvbG9yOiBjb2xvcixcclxuICAgICAgICAgIGltYWdlOiB0aGlzLmdldFNvdXJjZVJvb3RQYXRoKCkgKyBgL2ltZy9hcnJvdy8ke3R5cGUgLSA2fS5wbmdgLFxyXG4gICAgICAgICAgc3BhY2U6IG5ld1BhcmFtLnNwYWNlLFxyXG4gICAgICAgICAgc3BlZWQ6IG5ld1BhcmFtLnNwZWVkXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBwYXJhbS5zcGVlZCA9IG5ld1BhcmFtLnJvdGF0ZSA/IHBhcmFtLnNwZWVkIDogMCAtIHBhcmFtLnNwZWVkXHJcblxyXG4gICAgICAgIHRoaXMuZ2V0Rmxvd1RleHR1cmUodGhpcywgcGFyYW0sIGVudGl0eSlcclxuXHJcbiAgICAgICAgYnJlYWtcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBtYXRlcmlhbCA9IENlc2l1bS5Db2xvci5mcm9tQ3NzQ29sb3JTdHJpbmcoY29sb3IpXHJcbiAgICAgICAgYnJlYWtcclxuICAgIH1cclxuICAgIHJldHVybiBtYXRlcmlhbFxyXG4gIH1cclxuXHJcbiAgZ2V0Rmxvd1RleHR1cmUodGhhdCwgb3B0aW9ucywgZW50aXR5KSB7XHJcblxyXG4gICAgY29uc3QgY2FudmFzRWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XHJcbiAgICBjb25zdCBjdHggPSBjYW52YXNFbGUuZ2V0Q29udGV4dCgnMmQnKVxyXG4gICAgY29uc3QgbXlJbWcgPSBuZXcgSW1hZ2UoKVxyXG4gICAgLy8gbXlJbWcuc3JjID0gdGhhdC5nZXRTb3VyY2VSb290UGF0aCgpICsgJy9pbWcvYXJyb3cvMS5wbmcnXHJcbiAgICBteUltZy5zcmMgPSBvcHRpb25zLmltYWdlXHJcbiAgICBteUltZy5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgIG9wdGlvbnMuc3BhY2UgPSBNYXRoLm1heCgwLjEsIG9wdGlvbnMuc3BhY2UpO1xyXG4gICAgICBpZiAob3B0aW9ucy5zcGVlZCA+IDAgfHwgb3B0aW9ucy5zcGVlZCA9PSAwKSB7XHJcbiAgICAgICAgY2FudmFzRWxlLndpZHRoID0gbXlJbWcud2lkdGggKiAob3B0aW9ucy5zcGFjZSArIDEpXHJcbiAgICAgICAgY2FudmFzRWxlLmhlaWdodCA9IG15SW1nLmhlaWdodFxyXG4gICAgICAgIGN0eC5kcmF3SW1hZ2UobXlJbWcsIG15SW1nLndpZHRoICogKG9wdGlvbnMuc3BhY2UgLyAyKSwgMClcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjdHguY2xlYXJSZWN0KDAsIDAsIGNhbnZhc0VsZS53aWR0aCwgY2FudmFzRWxlLmhlaWdodCk7XHJcbiAgICAgICAgY2FudmFzRWxlLndpZHRoID0gbXlJbWcud2lkdGggKiAob3B0aW9ucy5zcGFjZSArIDEpXHJcbiAgICAgICAgY2FudmFzRWxlLmhlaWdodCA9IG15SW1nLmhlaWdodFxyXG4gICAgICAgIGN0eC5zYXZlKCk7IC8vIOS/neWtmOW9k+WJjeeKtuaAgVxyXG4gICAgICAgIGN0eC50cmFuc2xhdGUoY2FudmFzRWxlLndpZHRoIC8gMiwgY2FudmFzRWxlLmhlaWdodCAvIDIpOyAvLyDnp7vliqjljp/ngrnoh7PkuK3lv4NcclxuICAgICAgICBjdHgucm90YXRlKE1hdGguUEkpOyAvLyDvvIjlvKfluqbliLbvvIlcclxuICAgICAgICBjdHgudHJhbnNsYXRlKC1jYW52YXNFbGUud2lkdGggLyAyLCAtY2FudmFzRWxlLmhlaWdodCAvIDIpOyAvLyDnp7vlm57ljp/ngrlcclxuICAgICAgICBjdHguZHJhd0ltYWdlKG15SW1nLCBteUltZy53aWR0aCAqIChvcHRpb25zLnNwYWNlIC8gMiksIDApXHJcbiAgICAgICAgY3R4LnJlc3RvcmUoKTsgLy8g5oGi5aSN54q25oCBXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIGxldCByZXBlYXQgPSBnZXRSZXBlYXQoKVxyXG4gICAgICAvLyB9LCBmYWxzZSlcclxuICAgICAgLy8gZW50aXR5LnBvbHlsaW5lLm1hdGVyaWFsLm9yaVJlcGVhdCA9IHRoYXQuZ2V0U2NlZW5MaW5lKGVudGl0eSwgb3B0aW9ucywgY2FudmFzRWxlKVxyXG4gICAgICAvLyBlbnRpdHkucG9seWxpbmUubWF0ZXJpYWwub3JpU3BlZWQgPSB1bmRlZmluZWRcclxuICAgICAgbGV0IGJlZm9yZVNwZWVkID0gMCwgcmVwZWF0ID0gMFxyXG4gICAgICBlbnRpdHkucG9seWxpbmUubWF0ZXJpYWwgPSBuZXcgQ2VzaXVtLkxpbmVUZXh0dXJlTWF0ZXJpYWxQcm9wZXJ0eShcclxuICAgICAgICB7XHJcbiAgICAgICAgICBjb2xvcjogb3B0aW9ucy5jb2xvcixcclxuICAgICAgICAgIGltYWdlOiBjYW52YXNFbGUsXHJcbiAgICAgICAgICBzcGVlZDogb3B0aW9ucy5zcGVlZCxcclxuICAgICAgICAgIHJlcGVhdDogbmV3IENlc2l1bS5DYWxsYmFja1Byb3BlcnR5KGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGF0LnNkay52aWV3ZXIuc2NlbmUubW9kZSA9PT0gQ2VzaXVtLlNjZW5lTW9kZS5TQ0VORTNEKSB7XHJcbiAgICAgICAgICAgICAgbGV0IHBvc2l0aW9uUHJvcGVydHkgPSBlbnRpdHkucG9seWxpbmUucG9zaXRpb25zO1xyXG4gICAgICAgICAgICAgIGxldCBwb3NpdGlvbnMgPSBwb3NpdGlvblByb3BlcnR5LmdldFZhbHVlKHRoYXQuc2RrLnZpZXdlci5jbG9jay5jdXJyZW50VGltZSk7XHJcblxyXG4gICAgICAgICAgICAgIGlmICghQ2VzaXVtLmRlZmluZWQocG9zaXRpb25zKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDZXNpdW0uQ2FydGVzaWFuMigxLjAsIDEuMCk7XHJcbiAgICAgICAgICAgICAgICAvLyByZXR1cm4gMS4wO1xyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgbGV0IGRpc3RhbmNlID0gMDtcclxuICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGggLSAxOyArK2kpIHtcclxuICAgICAgICAgICAgICAgIC8vIGlmICh0aGF0LnNkay52aWV3ZXIuc2NlbmUubW9kZT09PUNlc2l1bS5TY2VuZU1vZGUuU0NFTkUyRCl7fVxyXG4gICAgICAgICAgICAgICAgZGlzdGFuY2UgKz0gQ2VzaXVtLkNhcnRlc2lhbjMuZGlzdGFuY2UocG9zaXRpb25zW2ldLCBwb3NpdGlvbnNbaSArIDFdKTtcclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgIGxldCByZXBlYXRYID0gZGlzdGFuY2UgLyBlbnRpdHkucG9seWxpbmUud2lkdGguZ2V0VmFsdWUoKTtcclxuICAgICAgICAgICAgICAvLyDmoLnmja7lnLDlm77nvKnmlL7nqIvluqbosIPmlbRyZXBlYXRYXHJcbiAgICAgICAgICAgICAgbGV0IGNhbWVyYUhlaWdodCA9IHRoYXQuc2RrLnZpZXdlci5jYW1lcmEucG9zaXRpb25DYXJ0b2dyYXBoaWMuaGVpZ2h0O1xyXG4gICAgICAgICAgICAgIGxldCBib3VuZGluZ1NwaGVyZSA9IG5ldyBDZXNpdW0uQm91bmRpbmdTcGhlcmUoXHJcbiAgICAgICAgICAgICAgICBuZXcgQ2VzaXVtLkNhcnRlc2lhbjMoLTEwMDAwMDAsIDAsIDApLCAvLyDkuK3lv4PngrnlnZDmoIdcclxuICAgICAgICAgICAgICAgIDUwMDAwMCAvLyDljYrlvoTvvIjot53nprvvvIlcclxuICAgICAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgICAgICAvLyDojrflj5bnu5jlm77nvJPlhrLljLrnmoTlrr3luqblkozpq5jluqbvvIjpgJrluLjmmK/lsY/luZXnmoTliIbovqjnjofvvIlcclxuICAgICAgICAgICAgICBsZXQgZHJhd2luZ0J1ZmZlcldpZHRoID0gdGhhdC5zZGsudmlld2VyLmNhbnZhcy5jbGllbnRXaWR0aDtcclxuICAgICAgICAgICAgICBsZXQgZHJhd2luZ0J1ZmZlckhlaWdodCA9IHRoYXQuc2RrLnZpZXdlci5jYW52YXMuY2xpZW50SGVpZ2h0O1xyXG5cclxuICAgICAgICAgICAgICAvLyDkvb/nlKggZ2V0UGl4ZWxTaXplIOaWueazleiOt+WPluWMheWbtOeQg+WcqOWxj+W5leS4iueahOWDj+e0oOWkp+Wwj1xyXG4gICAgICAgICAgICAgIGxldCBncm91bmRSZXNvbHV0aW9uID0gdGhhdC5zZGsudmlld2VyLnNjZW5lLmNhbWVyYS5nZXRQaXhlbFNpemUoYm91bmRpbmdTcGhlcmUsIGRyYXdpbmdCdWZmZXJXaWR0aCwgZHJhd2luZ0J1ZmZlckhlaWdodClcclxuICAgICAgICAgICAgICBsZXQgcmVzdWx0XHJcbiAgICAgICAgICAgICAgaWYgKGdyb3VuZFJlc29sdXRpb24gPiA3MDApIHtcclxuICAgICAgICAgICAgICAgIHJlcGVhdFggKj0gZ3JvdW5kUmVzb2x1dGlvbiAvIGNhbWVyYUhlaWdodCAvIChvcHRpb25zLnNwYWNlICogKGNhbnZhc0VsZS53aWR0aCAvIGNhbnZhc0VsZS5oZWlnaHQgKiA1KSArIDEpO1xyXG4gICAgICAgICAgICAgICAgLy8gaWYgKGVudGl0eS5wb2x5bGluZS5tYXRlcmlhbC5vcmlSZXBlYXQpIHtcclxuICAgICAgICAgICAgICAgIGxldCBzcGVlZCA9IHJlcGVhdFggLyBlbnRpdHkucG9seWxpbmUub3JpUmVwZWF0XHJcbiAgICAgICAgICAgICAgICBlbnRpdHkucG9seWxpbmUub3JpU3BlZWQgPSBzcGVlZFxyXG4gICAgICAgICAgICAgICAgZW50aXR5LnBvbHlsaW5lLm9yaVJlcGVhdFggPSByZXBlYXRYXHJcbiAgICAgICAgICAgICAgICAvLyB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gICBlbnRpdHkucG9seWxpbmUubWF0ZXJpYWwub3JpUmVwZWF0ID0gcmVwZWF0WFxyXG4gICAgICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgICAgICAgYmVmb3JlU3BlZWQgPSBzcGVlZFxyXG4gICAgICAgICAgICAgICAgcmVwZWF0ID0gcmVwZWF0WFxyXG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IENlc2l1bS5DYXJ0ZXNpYW4yKHJlcGVhdFgsIHNwZWVkIHx8IDEuMClcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IENlc2l1bS5DYXJ0ZXNpYW4yKHJlcGVhdCB8fCBlbnRpdHkucG9seWxpbmUub3JpUmVwZWF0WCwgYmVmb3JlU3BlZWQgfHwgZW50aXR5LnBvbHlsaW5lLm9yaVNwZWVkKVxyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuXHJcblxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIGxldCBzZGszZCA9IGdldDNEVmlldygpXHJcbiAgICAgICAgICAgICAgbGV0IHNkazNkRW50aXR5ID0gc2RrM2Qudmlld2VyLmVudGl0aWVzLmdldEJ5SWQodGhhdC5vcHRpb25zLmlkKVxyXG4gICAgICAgICAgICAgIGxldCBwb3NpdGlvblByb3BlcnR5ID0gc2RrM2RFbnRpdHkucG9seWxpbmUucG9zaXRpb25zO1xyXG4gICAgICAgICAgICAgIGxldCBwb3NpdGlvbnMgPSBwb3NpdGlvblByb3BlcnR5LmdldFZhbHVlKHNkazNkLnZpZXdlci5jbG9jay5jdXJyZW50VGltZSk7XHJcblxyXG4gICAgICAgICAgICAgIGlmICghQ2VzaXVtLmRlZmluZWQocG9zaXRpb25zKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDZXNpdW0uQ2FydGVzaWFuMigxLjAsIDEuMCk7XHJcbiAgICAgICAgICAgICAgICAvLyByZXR1cm4gMS4wO1xyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgbGV0IGRpc3RhbmNlID0gMDtcclxuICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGggLSAxOyArK2kpIHtcclxuICAgICAgICAgICAgICAgIC8vIGlmICh0aGF0LnNkay52aWV3ZXIuc2NlbmUubW9kZT09PUNlc2l1bS5TY2VuZU1vZGUuU0NFTkUyRCl7fVxyXG4gICAgICAgICAgICAgICAgZGlzdGFuY2UgKz0gQ2VzaXVtLkNhcnRlc2lhbjMuZGlzdGFuY2UocG9zaXRpb25zW2ldLCBwb3NpdGlvbnNbaSArIDFdKTtcclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgIGxldCByZXBlYXRYID0gZGlzdGFuY2UgLyBzZGszZEVudGl0eS5wb2x5bGluZS53aWR0aC5nZXRWYWx1ZSgpO1xyXG4gICAgICAgICAgICAgIC8vIOagueaNruWcsOWbvue8qeaUvueoi+W6puiwg+aVtHJlcGVhdFhcclxuICAgICAgICAgICAgICBsZXQgY2FtZXJhSGVpZ2h0ID0gc2RrM2Qudmlld2VyLmNhbWVyYS5wb3NpdGlvbkNhcnRvZ3JhcGhpYy5oZWlnaHQ7XHJcbiAgICAgICAgICAgICAgbGV0IGJvdW5kaW5nU3BoZXJlID0gbmV3IENlc2l1bS5Cb3VuZGluZ1NwaGVyZShcclxuICAgICAgICAgICAgICAgIG5ldyBDZXNpdW0uQ2FydGVzaWFuMygtMTAwMDAwMCwgMCwgMCksIC8vIOS4reW/g+eCueWdkOagh1xyXG4gICAgICAgICAgICAgICAgNTAwMDAwIC8vIOWNiuW+hO+8iOi3neemu++8iVxyXG4gICAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgICAgIC8vIOiOt+WPlue7mOWbvue8k+WGsuWMuueahOWuveW6puWSjOmrmOW6pu+8iOmAmuW4uOaYr+Wxj+W5leeahOWIhui+qOeOh++8iVxyXG4gICAgICAgICAgICAgIGxldCBkcmF3aW5nQnVmZmVyV2lkdGggPSBzZGszZC52aWV3ZXIuY2FudmFzLmNsaWVudFdpZHRoO1xyXG4gICAgICAgICAgICAgIGxldCBkcmF3aW5nQnVmZmVySGVpZ2h0ID0gc2RrM2Qudmlld2VyLmNhbnZhcy5jbGllbnRIZWlnaHQ7XHJcblxyXG4gICAgICAgICAgICAgIC8vIOS9v+eUqCBnZXRQaXhlbFNpemUg5pa55rOV6I635Y+W5YyF5Zu055CD5Zyo5bGP5bmV5LiK55qE5YOP57Sg5aSn5bCPXHJcbiAgICAgICAgICAgICAgbGV0IGdyb3VuZFJlc29sdXRpb24gPSBzZGszZC52aWV3ZXIuc2NlbmUuY2FtZXJhLmdldFBpeGVsU2l6ZShib3VuZGluZ1NwaGVyZSwgZHJhd2luZ0J1ZmZlcldpZHRoLCBkcmF3aW5nQnVmZmVySGVpZ2h0KVxyXG4gICAgICAgICAgICAgIGxldCByZXN1bHRcclxuICAgICAgICAgICAgICBpZiAoZ3JvdW5kUmVzb2x1dGlvbiA+IDcwMCkge1xyXG4gICAgICAgICAgICAgICAgcmVwZWF0WCAqPSBncm91bmRSZXNvbHV0aW9uIC8gY2FtZXJhSGVpZ2h0IC8gKG9wdGlvbnMuc3BhY2UgKiAoY2FudmFzRWxlLndpZHRoIC8gY2FudmFzRWxlLmhlaWdodCAqIDUpICsgMSk7XHJcbiAgICAgICAgICAgICAgICAvLyBpZiAoZW50aXR5LnBvbHlsaW5lLm1hdGVyaWFsLm9yaVJlcGVhdCkge1xyXG4gICAgICAgICAgICAgICAgbGV0IHNwZWVkID0gcmVwZWF0WCAvIHNkazNkRW50aXR5LnBvbHlsaW5lLm9yaVJlcGVhdFxyXG4gICAgICAgICAgICAgICAgc2RrM2RFbnRpdHkucG9seWxpbmUub3JpU3BlZWQgPSBzcGVlZFxyXG4gICAgICAgICAgICAgICAgc2RrM2RFbnRpdHkucG9seWxpbmUub3JpUmVwZWF0WCA9IHJlcGVhdFhcclxuICAgICAgICAgICAgICAgIC8vIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyAgIGVudGl0eS5wb2x5bGluZS5tYXRlcmlhbC5vcmlSZXBlYXQgPSByZXBlYXRYXHJcbiAgICAgICAgICAgICAgICAvLyB9XHJcbiAgICAgICAgICAgICAgICBiZWZvcmVTcGVlZCA9IHNwZWVkXHJcbiAgICAgICAgICAgICAgICByZXBlYXQgPSByZXBlYXRYXHJcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgQ2VzaXVtLkNhcnRlc2lhbjIocmVwZWF0WCwgc3BlZWQgfHwgMS4wKVxyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgQ2VzaXVtLkNhcnRlc2lhbjIocmVwZWF0IHx8IHNkazNkRW50aXR5LnBvbHlsaW5lLm9yaVJlcGVhdFgsIGJlZm9yZVNwZWVkIHx8IHNkazNkRW50aXR5LnBvbHlsaW5lLm9yaVNwZWVkKVxyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICAgICAgfVxyXG5cclxuXHJcblxyXG4gICAgICAgICAgICAvLyByZXR1cm4gcmVwZWF0WDtcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG4gICAgICApXHJcbiAgICAgIGxldCBvcmlSZXBlYXQgPSB0aGF0LmdldFNjZWVuTGluZShlbnRpdHksIG9wdGlvbnMsIGNhbnZhc0VsZSlcclxuICAgICAgb3JpUmVwZWF0ICYmIChlbnRpdHkucG9seWxpbmUub3JpUmVwZWF0ID0gb3JpUmVwZWF0KVxyXG4gICAgfVxyXG4gIH1cclxuICAvKirojrflj5blvZPliY3mu6HlsY/mqKrnur/pgJ/luqYgKi9cclxuICBnZXRTY2VlbkxpbmUoZW50aXR5LCBvcHRpb25zLCBjYW52YXNFbGUpIHtcclxuICAgIGxldCBwb2ludDEgPSBuZXcgQ2VzaXVtLkNhcnRlc2lhbjIoMCwgdGhpcy5zZGsudmlld2VyLmNhbnZhcy5jbGllbnRIZWlnaHQpXHJcbiAgICBsZXQgcG9pbnQyID0gbmV3IENlc2l1bS5DYXJ0ZXNpYW4yKHRoaXMuc2RrLnZpZXdlci5jYW52YXMuY2xpZW50V2lkdGggLyAyLCB0aGlzLnNkay52aWV3ZXIuY2FudmFzLmNsaWVudEhlaWdodClcclxuICAgIC8vIHZhciBjYXJ0ZXNpYW4xID0gdGhpcy5zZGsudmlld2VyLnNjZW5lLnBpY2tQb3NpdGlvbihwb2ludDEpXHJcbiAgICAvLyB2YXIgY2FydGVzaWFuMiA9IHRoaXMuc2RrLnZpZXdlci5zY2VuZS5waWNrUG9zaXRpb24ocG9pbnQyKVxyXG4gICAgbGV0IHJheSA9IHRoaXMuc2RrLnZpZXdlci5jYW1lcmEuZ2V0UGlja1JheShwb2ludDEpO1xyXG4gICAgbGV0IGNhcnRlc2lhbjEgPSB0aGlzLnNkay52aWV3ZXIuc2NlbmUuZ2xvYmUucGljayhyYXksIHRoaXMuc2RrLnZpZXdlci5zY2VuZSk7XHJcblxyXG4gICAgbGV0IHJheTIgPSB0aGlzLnNkay52aWV3ZXIuY2FtZXJhLmdldFBpY2tSYXkocG9pbnQyKTtcclxuICAgIGxldCBjYXJ0ZXNpYW4yID0gdGhpcy5zZGsudmlld2VyLnNjZW5lLmdsb2JlLnBpY2socmF5MiwgdGhpcy5zZGsudmlld2VyLnNjZW5lKTtcclxuICAgIGlmIChjYXJ0ZXNpYW4xICYmIGNhcnRlc2lhbjIpIHtcclxuICAgICAgdmFyIGRpc3RhbmNlID0gQ2VzaXVtLkNhcnRlc2lhbjMuZGlzdGFuY2UoY2FydGVzaWFuMSwgY2FydGVzaWFuMik7XHJcblxyXG4gICAgICB2YXIgcmVwZWF0WCA9IGRpc3RhbmNlIC8gZW50aXR5LnBvbHlsaW5lLndpZHRoLmdldFZhbHVlKCk7XHJcbiAgICAgIC8vIOagueaNruWcsOWbvue8qeaUvueoi+W6puiwg+aVtHJlcGVhdFhcclxuICAgICAgdmFyIGNhbWVyYUhlaWdodCA9IHRoaXMuc2RrLnZpZXdlci5jYW1lcmEucG9zaXRpb25DYXJ0b2dyYXBoaWMuaGVpZ2h0O1xyXG4gICAgICB2YXIgYm91bmRpbmdTcGhlcmUgPSBuZXcgQ2VzaXVtLkJvdW5kaW5nU3BoZXJlKFxyXG4gICAgICAgIG5ldyBDZXNpdW0uQ2FydGVzaWFuMygtMTAwMDAwMCwgMCwgMCksIC8vIOS4reW/g+eCueWdkOagh1xyXG4gICAgICAgIDUwMDAwMCAvLyDljYrlvoTvvIjot53nprvvvIlcclxuICAgICAgKTtcclxuXHJcbiAgICAgIC8vIOiOt+WPlue7mOWbvue8k+WGsuWMuueahOWuveW6puWSjOmrmOW6pu+8iOmAmuW4uOaYr+Wxj+W5leeahOWIhui+qOeOh++8iVxyXG4gICAgICB2YXIgZHJhd2luZ0J1ZmZlcldpZHRoID0gdGhpcy5zZGsudmlld2VyLmNhbnZhcy5jbGllbnRXaWR0aDtcclxuICAgICAgdmFyIGRyYXdpbmdCdWZmZXJIZWlnaHQgPSB0aGlzLnNkay52aWV3ZXIuY2FudmFzLmNsaWVudEhlaWdodDtcclxuXHJcbiAgICAgIC8vIOS9v+eUqCBnZXRQaXhlbFNpemUg5pa55rOV6I635Y+W5YyF5Zu055CD5Zyo5bGP5bmV5LiK55qE5YOP57Sg5aSn5bCPXHJcbiAgICAgIHZhciBncm91bmRSZXNvbHV0aW9uID0gdGhpcy5zZGsudmlld2VyLnNjZW5lLmNhbWVyYS5nZXRQaXhlbFNpemUoYm91bmRpbmdTcGhlcmUsIGRyYXdpbmdCdWZmZXJXaWR0aCwgZHJhd2luZ0J1ZmZlckhlaWdodClcclxuICAgICAgLy8gcmVwZWF0WCAqPSBncm91bmRSZXNvbHV0aW9uIC8gY2FtZXJhSGVpZ2h0IC8gKChteUltZy53aWR0aCAvIG15SW1nLmhlaWdodCAqIDUpICsgMSk7XHJcbiAgICAgIGlmIChncm91bmRSZXNvbHV0aW9uID4gNzAwKSB7XHJcbiAgICAgICAgcmVwZWF0WCAqPSBncm91bmRSZXNvbHV0aW9uIC8gY2FtZXJhSGVpZ2h0IC8gKG9wdGlvbnMuc3BhY2UgKiAoY2FudmFzRWxlLndpZHRoIC8gY2FudmFzRWxlLmhlaWdodCAqIDUpICsgMSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmVwZWF0WCA9IHVuZGVmaW5lZDtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHRoaXMuc2RrLnZpZXdlci5zY2VuZS5tb2RlID09PSBDZXNpdW0uU2NlbmVNb2RlLlNDRU5FM0QpIHtcclxuICAgICAgICByZXR1cm4gcmVwZWF0WFxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGxldCBzZGszZCA9IGdldDNEVmlldygpXHJcbiAgICAgICAgbGV0IHNkazNkRW50aXR5ID0gc2RrM2Qudmlld2VyLmVudGl0aWVzLmdldEJ5SWQodGhpcy5vcHRpb25zLmlkKVxyXG4gICAgICAgIHJldHVybiBzZGszZEVudGl0eS5wb2x5bGluZS5vcmlSZXBlYXRYXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8q5Yib5bu655u0566t5aS05Zu+54mHKi9cclxuICBjcmVhdGVfYXJyb3cxX3BpY3R1cmUoY29sb3IpIHtcclxuICAgIGxldCBjYW52YXMgPSBuZXcgZmFicmljLkNhbnZhcygnY2FudmFzJylcclxuICAgIGNhbnZhcy53aWR0aCA9IDE1MFxyXG4gICAgY2FudmFzLmhlaWdodCA9IDc1XHJcbiAgICBsZXQgd19vZmZzZXQgPSAzNVxyXG4gICAgbGV0IGhfb2Zmc2V0ID0gMjBcclxuICAgIGxldCBmaWxsID0gY29sb3JcclxuICAgIGxldCBwb2x5Z29uID0gbmV3IGZhYnJpYy5Qb2x5Z29uKFxyXG4gICAgICBbXHJcbiAgICAgICAgeyB4OiBjYW52YXMud2lkdGgsIHk6IGNhbnZhcy5oZWlnaHQgLyAyIH0sIC8v566t5aS05Y+z6L656aG254K5XHJcbiAgICAgICAgeyB4OiBjYW52YXMud2lkdGggLSB3X29mZnNldCwgeTogY2FudmFzLmhlaWdodCB9LCAvL+mhuuaXtumSiFxyXG4gICAgICAgIHsgeDogY2FudmFzLndpZHRoIC0gd19vZmZzZXQsIHk6IGNhbnZhcy5oZWlnaHQgLSBoX29mZnNldCB9LCAvL1xyXG4gICAgICAgIHsgeDogY2FudmFzLndpZHRoIC8gMiwgeTogY2FudmFzLmhlaWdodCAtIGhfb2Zmc2V0IH0sIC8vXHJcbiAgICAgICAgeyB4OiBjYW52YXMud2lkdGggLyAyLCB5OiBoX29mZnNldCB9LCAvL1xyXG4gICAgICAgIHsgeDogY2FudmFzLndpZHRoIC0gd19vZmZzZXQsIHk6IGhfb2Zmc2V0IH0sIC8vXHJcbiAgICAgICAgeyB4OiBjYW52YXMud2lkdGggLSB3X29mZnNldCwgeTogMCB9LCAvL1xyXG4gICAgICBdLFxyXG4gICAgICB7XHJcbiAgICAgICAgZmlsbCxcclxuICAgICAgfVxyXG4gICAgKVxyXG4gICAgY2FudmFzLmFkZChwb2x5Z29uKVxyXG5cclxuICAgIHJldHVybiBjYW52YXMudG9EYXRhVVJMKClcclxuICB9XHJcblxyXG4gIC8q5Yib5bu6566t5aS05Zu+54mHKi9cclxuXHJcbiAgY3JlYXRlX2Fycm93Ml9waWN0dXJlKGNvbG9yKSB7XHJcbiAgICBsZXQgY2FudmFzID0gbmV3IGZhYnJpYy5DYW52YXMoJ2NhbnZhcycpXHJcbiAgICBjYW52YXMud2lkdGggPSA3NVxyXG4gICAgY2FudmFzLmhlaWdodCA9IDc1XHJcbiAgICBsZXQgd19vZmZzZXQxID0gMzVcclxuICAgIGxldCB3X29mZnNldDIgPSA0MFxyXG4gICAgbGV0IGZpbGwgPSBjb2xvclxyXG4gICAgbGV0IHBvbHlnb24gPSBuZXcgZmFicmljLlBvbHlnb24oXHJcbiAgICAgIFtcclxuICAgICAgICB7IHg6IGNhbnZhcy53aWR0aCwgeTogY2FudmFzLmhlaWdodCAvIDIgfSxcclxuICAgICAgICB7IHg6IGNhbnZhcy53aWR0aCAtIHdfb2Zmc2V0MSwgeTogY2FudmFzLmhlaWdodCB9LFxyXG4gICAgICAgIHsgeDogY2FudmFzLndpZHRoIC0gd19vZmZzZXQxIC0gd19vZmZzZXQyLCB5OiBjYW52YXMuaGVpZ2h0IH0sXHJcbiAgICAgICAgeyB4OiBjYW52YXMud2lkdGggLSB3X29mZnNldDIsIHk6IGNhbnZhcy5oZWlnaHQgLyAyIH0sXHJcbiAgICAgICAgeyB4OiBjYW52YXMud2lkdGggLSB3X29mZnNldDEgLSB3X29mZnNldDIsIHk6IDAgfSxcclxuICAgICAgICB7IHg6IGNhbnZhcy53aWR0aCAtIHdfb2Zmc2V0MSwgeTogMCB9LFxyXG4gICAgICBdLFxyXG4gICAgICB7XHJcbiAgICAgICAgZmlsbCxcclxuICAgICAgfVxyXG4gICAgKVxyXG4gICAgY2FudmFzLmFkZChwb2x5Z29uKVxyXG5cclxuICAgIHJldHVybiBjYW52YXMudG9EYXRhVVJMKClcclxuICB9XHJcblxyXG4gIHNhbXBsZUhlaWdodE1vc3REZXRhaWxlZChwb3NpdGlvbnMpIHtcclxuICAgIGxldCBjYXJ0ZXNpYW5zID0gW11cclxuICAgIHBvc2l0aW9ucy5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgIGNhcnRlc2lhbnMucHVzaChuZXcgQ2VzaXVtLkNhcnRvZ3JhcGhpYy5mcm9tRGVncmVlcyhpdGVtLmxuZywgaXRlbS5sYXQpKVxyXG4gICAgfSlcclxuICAgIHJldHVybiB0aGlzLnNkay52aWV3ZXIuc2NlbmUuc2FtcGxlSGVpZ2h0TW9zdERldGFpbGVkKGNhcnRlc2lhbnMpXHJcbiAgfVxyXG5cclxuICBmbHlIb21lKGR1cmF0aW9uID0gMykge1xyXG4gICAgc2V0QWN0aXZlVmlld2VyKDApXHJcbiAgICBjbG9zZVJvdGF0ZUFyb3VuZCh0aGlzLnNkaylcclxuICAgIGNsb3NlVmlld0ZvbGxvdyh0aGlzLnNkaylcclxuXHJcbiAgICBpZiAodGhpcy5zZGsudmlld2VyLkNBTUVSQV9ERUZBVUxUX1ZJRVdfUkVDVEFOR0xFKSB7XHJcbiAgICAgIGxldCBkZXN0aW5hdGlvbiA9IHRoaXMuc2RrLnZpZXdlci5DQU1FUkFfREVGQVVMVF9WSUVXX1JFQ1RBTkdMRS5kZXN0aW5hdGlvblxyXG4gICAgICBsZXQgb3JpZW50YXRpb24gPSB0aGlzLnNkay52aWV3ZXIuQ0FNRVJBX0RFRkFVTFRfVklFV19SRUNUQU5HTEUub3JpZW50YXRpb25cclxuICAgICAgdGhpcy5zZGsudmlld2VyLmNhbWVyYS5mbHlUbyh7XHJcbiAgICAgICAgZGVzdGluYXRpb246IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzKGRlc3RpbmF0aW9uLmxuZywgZGVzdGluYXRpb24ubGF0LCBkZXN0aW5hdGlvbi5hbHQpLFxyXG4gICAgICAgIG9yaWVudGF0aW9uOiB7XHJcbiAgICAgICAgICBoZWFkaW5nOiBDZXNpdW0uTWF0aC50b1JhZGlhbnMob3JpZW50YXRpb24uaGVhZGluZyB8fCAwKSxcclxuICAgICAgICAgIHBpdGNoOiBDZXNpdW0uTWF0aC50b1JhZGlhbnMob3JpZW50YXRpb24ucGl0Y2ggfHwgMCksXHJcbiAgICAgICAgICByb2xsOiBDZXNpdW0uTWF0aC50b1JhZGlhbnMob3JpZW50YXRpb24ucm9sbCB8fCAwKVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZHVyYXRpb246IGR1cmF0aW9uXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5zZGsudmlld2VyLmNhbWVyYS5mbHlIb21lKGR1cmF0aW9uKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQGRlc2NyaXB0aW9uIOiuvue9ruaLvuWPluaTjeS9nOWQr+WBnFxyXG4gICAqIEBtZXRob2Qgc2V0UGlja1N0YXR1c1xyXG4gICAqIEBwYXJhbSBbc3RhdHVzPXRydWVdIHtib29sZWFufVxyXG4gICAqIEBtZW1iZXJPZiBUb29sc1xyXG4gICAqICovXHJcbiAgc2V0UGlja1N0YXR1cyhzdGF0dXMgPSB0cnVlKSB7XHJcbiAgICAvLyBZSi5nZXRFYXJ0aCgpLmludGVyYWN0aW9uLnBpY2tpbmcuZW5hYmxlZCA9IHN0YXR1c1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQGRlc2NyaXB0aW9uIOWIm+W7uueCuee8k+WGsuWMuiDov5Tlm57nvJPlhrLljLrlnZDmoIdcclxuICAgKiBAbWV0aG9kIGNyZWF0ZV9wb2ludF9idWZmZXJcclxuICAgKiBAcGFyYW0gcG9pbnQge29iamVjdH0g5Z2Q5qCH5Y+C5pWwXHJcbiAgICogQHBhcmFtIFtyYWRpdXM9NV0ge251bWJlcn0g57yT5Yay6Led56a7ICDvvIjljZXkvY3vvJrnsbPvvIlcclxuICAgKiBAcGFyYW0gb3B0aW9uXHJcbiAgICogQHBhcmFtIHBvaW50LmxuZyB7bnVtYmVyfSDnu4/luqZcclxuICAgKiBAcGFyYW0gcG9pbnQubGF0IHtudW1iZXJ9IOe6rOW6plxyXG4gICAqIEBtZW1iZXJPZiBUb29sc1xyXG4gICAqIEByZXR1cm5zIHtBcnJheX0g6L+U5Zue57yT5Yay5Yy65Z2Q5qCH5pWw57uEXHJcbiAgICovXHJcbiAgY3JlYXRlX3BvaW50X2J1ZmZlcihwb2ludCwgcmFkaXVzID0gNSwgb3B0aW9uID0geyBzdGVwczogMTAgfSkge1xyXG4gICAgbGV0IHAgPSB0dXJmLnBvaW50KFtOdW1iZXIocG9pbnQubG5nKSwgTnVtYmVyKHBvaW50LmxhdCldKVxyXG4gICAgbGV0IGJ1ZmZlcmVkID0gdHVyZi5idWZmZXIocCwgTnVtYmVyKHJhZGl1cykgLyAxMDAwLCBvcHRpb24pXHJcbiAgICByZXR1cm4gYnVmZmVyZWQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBkZXNjcmlwdGlvbiDliJvlu7rnur/nvJPlhrLljLog6L+U5Zue57yT5Yay5Yy65Z2Q5qCHXHJcbiAgICogQG1ldGhvZCBjcmVhdGVfbGluZV9idWZmZXJcclxuICAgKiBAcGFyYW0gcG9pbnRzIHtBcnJheS48bG5nOlwiXCIsbGF0OlwiXCI+fSDlnZDmoIflj4LmlbBcclxuICAgKiBAcGFyYW0gW3JhZGl1cz01XSB7bnVtYmVyfSDnvJPlhrLot53nprsgIO+8iOWNleS9je+8muexs++8iVxyXG4gICAqIEBtZW1iZXJPZiBUb29sc1xyXG4gICAqIEByZXR1cm5zIHtBcnJheX0g6L+U5Zue57yT5Yay5Yy65Z2Q5qCH5pWw57uEXHJcbiAgICogQGV4YW1wbGUgbGV0IHBvaW50cyA9IFt7bG5nOlwiXCIsbGF0OlwiXCJ9LHtsbmc6XCJcIixsYXQ6XCJcIn0se2xuZzpcIlwiLGxhdDpcIlwifV1cclxuICAgKiBsZXQgcmFkaXVzID0gMTBcclxuICAgKiBsZXQgYXJlYV9idWZmZXIgPSBzZGsuY3JlYXRlX2xpbmVfYnVmZmVyKHBvaW50cyxyYWRpdXMpXHJcbiAgICogKi9cclxuICBjcmVhdGVfbGluZV9idWZmZXIocG9pbnRzLCByYWRpdXMgPSA1KSB7XHJcbiAgICBpZiAocG9pbnRzLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGVfcG9pbnRfYnVmZmVyKHBvaW50c1swXSwgcmFkaXVzKVxyXG4gICAgfSBlbHNlIGlmIChwb2ludHMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbGV0IGFyciA9IFtdXHJcbiAgICAgIHBvaW50cy5mb3JFYWNoKChwb2ludCkgPT4ge1xyXG4gICAgICAgIGFyci5wdXNoKFtOdW1iZXIocG9pbnQubG5nKSwgTnVtYmVyKHBvaW50LmxhdCldKVxyXG4gICAgICB9KVxyXG4gICAgICBsZXQgbGluZSA9IHR1cmYubGluZVN0cmluZyhhcnIpXHJcbiAgICAgIGxldCBidWZmZXJlZCA9IHR1cmYuYnVmZmVyKGxpbmUsIE51bWJlcihyYWRpdXMpIC8gMTAwMClcclxuICAgICAgcmV0dXJuIGJ1ZmZlcmVkLmdlb21ldHJ5LmNvb3JkaW5hdGVzXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAZGVzY3JpcHRpb24g5Yib5bu66Z2i57yT5Yay5Yy6IOi/lOWbnue8k+WGsuWMuuWdkOagh1xyXG4gICAqIEBtZXRob2QgY3JlYXRlX2FyZWFfYnVmZmVyXHJcbiAgICogQHBhcmFtIHBvaW50cyB7QXJyYXkuPGxuZzpcIlwiLGxhdDpcIlwiPn0g5Z2Q5qCH5Y+C5pWwXHJcbiAgICogQHBhcmFtIFtyYWRpdXM9NV0ge251bWJlcn0g57yT5Yay6Led56a7ICDvvIjljZXkvY3vvJrnsbPvvIlcclxuICAgKiBAbWVtYmVyT2YgVG9vbHNcclxuICAgKiBAcmV0dXJucyB7QXJyYXl9IOi/lOWbnue8k+WGsuWMuuWdkOagh+aVsOe7hFxyXG4gICAqIEBleGFtcGxlIGxldCBwb2ludHMgPSBbe2xuZzpcIlwiLGxhdDpcIlwifSx7bG5nOlwiXCIsbGF0OlwiXCJ9LHtsbmc6XCJcIixsYXQ6XCJcIn1dXHJcbiAgICogbGV0IHJhZGl1cyA9IDEwXHJcbiAgICogbGV0IGFyZWFfYnVmZmVyID0gc2RrLmNyZWF0ZV9hcmVhX2J1ZmZlcihwb2ludHMscmFkaXVzKVxyXG4gICAqICovXHJcbiAgY3JlYXRlX2FyZWFfYnVmZmVyKHBvaW50cywgcmFkaXVzID0gNSkge1xyXG4gICAgaWYgKHBvaW50cy5sZW5ndGggPT09IDEpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlX3BvaW50X2J1ZmZlcihwb2ludHNbMF0sIHJhZGl1cylcclxuICAgIH0gZWxzZSBpZiAocG9pbnRzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICByZXR1cm4gZmFsc2VcclxuICAgIH0gZWxzZSBpZiAocG9pbnRzLmxlbmd0aCA9PT0gMikge1xyXG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGVfbGluZV9idWZmZXIocG9pbnRzLCByYWRpdXMpXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBsZXQgYXJyID0gW11cclxuICAgICAgcG9pbnRzLmZvckVhY2goKHBvaW50KSA9PiB7XHJcbiAgICAgICAgYXJyLnB1c2goW051bWJlcihwb2ludC5sbmcpLCBOdW1iZXIocG9pbnQubGF0KV0pXHJcbiAgICAgIH0pXHJcbiAgICAgIGFyci5wdXNoKGFyclswXSlcclxuICAgICAgbGV0IHBvbHkgPSB0dXJmLnBvbHlnb24oW2Fycl0pXHJcbiAgICAgIGxldCBidWZmZXJlZCA9IHR1cmYuYnVmZmVyKHBvbHksIE51bWJlcihyYWRpdXMpIC8gMTAwMClcclxuICAgICAgcmV0dXJuIGJ1ZmZlcmVkLmdlb21ldHJ5LmNvb3JkaW5hdGVzXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAZGVzYyDorqHnrpflpJrngrnojIPlm7RcclxuICAgKiBAbWV0aG9kIGNhbF9lbnZlbG9wZVxyXG4gICAqIEBtZW1iZXJPZiBUb29sc1xyXG4gICAqICovXHJcbiAgY2FsX2VudmVsb3BlKHBvaW50cyA9IFtdKSB7XHJcbiAgICBpZiAocG9pbnRzLmxlbmd0aCA8IDIpIHtcclxuICAgICAgY29uc29sZS5lcnJvcign5Z2Q5qCH5pWw6YeP5LiN6IO95bCR5LqOMuS4qicpXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBsZXQgYXJyID0gW11cclxuICAgICAgcG9pbnRzLmZvckVhY2goKHApID0+IHtcclxuICAgICAgICBhcnIucHVzaCh0dXJmLnBvaW50KFtwLmxuZywgcC5sYXRdKSlcclxuICAgICAgfSlcclxuICAgICAgbGV0IGZlYXR1cmVzID0gdHVyZi5mZWF0dXJlQ29sbGVjdGlvbihhcnIpXHJcbiAgICAgIHJldHVybiB0dXJmLmVudmVsb3BlKGZlYXR1cmVzKS5nZW9tZXRyeS5jb29yZGluYXRlc1swXVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQGRlc2Mg5oyJ5oyH5a6a6Led56a75YiG5q61XHJcbiAgICogQG1ldGhvZCBjaHVua0xpbmVcclxuICAgKiBAcGFyYW0gcG9zaXRpb25zIHtBcnJheX1cclxuICAgKiBAcGFyYW0gbWV0ZXJzXHJcbiAgICogQG1lbWJlck9mIFRvb2xzXHJcbiAgICogKi9cclxuICBjaHVua0xpbmUocG9zaXRpb25zID0gW10sIG1ldGVycyA9IDEwMDApIHtcclxuICAgIGlmIChwb3NpdGlvbnMubGVuZ3RoIDwgMikge1xyXG4gICAgICByZXR1cm4gW11cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGxldCBhcnIgPSBbXVxyXG4gICAgICBwb3NpdGlvbnMuZm9yRWFjaCgoaXQpID0+IHtcclxuICAgICAgICBhcnIucHVzaChbaXQubG5nLCBpdC5sYXRdKVxyXG4gICAgICB9KVxyXG4gICAgICBsZXQgbGluZSA9IHR1cmYubGluZVN0cmluZyhhcnIpXHJcblxyXG4gICAgICBsZXQgY2h1bmsgPSB0dXJmLmxpbmVDaHVuayhsaW5lLCBtZXRlcnMgLyAxMDAwKVxyXG4gICAgICBsZXQgX19tYXAgPSBuZXcgTWFwKClcclxuICAgICAgY2h1bmsuZmVhdHVyZXMuZm9yRWFjaCgodmFsdWUpID0+IHtcclxuICAgICAgICB2YWx1ZS5nZW9tZXRyeS5jb29yZGluYXRlcy5mb3JFYWNoKCh2YWx1ZTEpID0+IHtcclxuICAgICAgICAgIGxldCBrZXkgPSB2YWx1ZTEuam9pbignLCcpXHJcbiAgICAgICAgICBsZXQgdmFsID0geyBsbmc6IHZhbHVlMVswXSwgbGF0OiB2YWx1ZTFbMV0gfVxyXG4gICAgICAgICAgX19tYXAuc2V0KGtleSwgdmFsKVxyXG4gICAgICAgIH0pXHJcbiAgICAgIH0pXHJcbiAgICAgIHJldHVybiBjaHVuay5mZWF0dXJlc1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQGRlc2Mg5qCH5rOo5Lulc2lueOeahOWNiuS4quWRqOacn+eahOW9ouW8j+W8uei3s1xyXG4gICAqICovXHJcbiAgYmlsbGJvYXJkQW5pbWF0aW9uKHZpZXdlciwgeyBpZCwgb2Zmc2V0ID0gMTAsIHRpbWVzID0gMyB9KSB7XHJcbiAgICBsZXQgZW50aXR5ID0gdmlld2VyLmVudGl0aWVzLmdldEJ5SWQoaWQpXHJcbiAgICBpZiAoZW50aXR5KSB7XHJcbiAgICAgIGxldCBwaSA9IE1hdGguUElcclxuICAgICAgbGV0IHR0ID0gNjBcclxuICAgICAgbGV0IG9mID0gcGkgLyB0dFxyXG5cclxuICAgICAgbGV0IGggPSAwXHJcbiAgICAgIGxldCBzcmNfcCA9IHRoaXMuY2FydGVzaWFuM1Rvd2dzODQoZW50aXR5LnBvc2l0aW9uLmdldFZhbHVlKCksIHZpZXdlcilcclxuICAgICAgLy8gbGV0IGhlaWdodCA9IHNyY19wLmFsdFxyXG4gICAgICAvLyBlbnRpdHkucG9zaXRpb24gPSBuZXcgQ2VzaXVtLkNhbGxiYWNrUHJvcGVydHkoKCkgPT4ge1xyXG4gICAgICAvLyAgIGxldCBoZWlnaHQgPSBvZmZzZXQgKiBNYXRoLnNpbihoKSArIHNyY19wLmFsdFxyXG4gICAgICAvLyAgIGggKz0gb2ZcclxuICAgICAgLy8gICByZXR1cm4gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXMoc3JjX3AubG5nLCBzcmNfcC5sYXQsIGhlaWdodClcclxuICAgICAgLy8gfSwgZmFsc2UpXHJcbiAgICAgIGxldCB0aSA9IHNldEludGVydmFsKCgpID0+IHtcclxuICAgICAgICBoICs9IG9mXHJcbiAgICAgICAgbGV0IGhlaWdodCA9IG9mZnNldCAqIE1hdGguc2luKGgpICsgc3JjX3AuYWx0XHJcbiAgICAgICAgaWYgKGggPiBwaSkgaCA9IDBcclxuICAgICAgICBlbnRpdHkucG9zaXRpb24gPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlcyhcclxuICAgICAgICAgIHNyY19wLmxuZyxcclxuICAgICAgICAgIHNyY19wLmxhdCxcclxuICAgICAgICAgIGhlaWdodFxyXG4gICAgICAgIClcclxuICAgICAgfSwgMzApXHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIGNsZWFySW50ZXJ2YWwodGkpXHJcbiAgICAgICAgZW50aXR5LnBvc2l0aW9uID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbURlZ3JlZXMoXHJcbiAgICAgICAgICBzcmNfcC5sbmcsXHJcbiAgICAgICAgICBzcmNfcC5sYXQsXHJcbiAgICAgICAgICBzcmNfcC5hbHRcclxuICAgICAgICApXHJcbiAgICAgIH0sIDMwMDApXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipAZGVzYyDnu5jliLbmiYflvaJcclxuICAgKiBAbWV0aG9kIHNlY3RvclxyXG4gICAqIEBtZW1iZXJPZiBUb29scyovXHJcbiAgY2FsU2VjdG9yKFxyXG4gICAgY2VudGVyID0ge30sXHJcbiAgICByYWRpdXMgPSAxMDAsXHJcbiAgICBiZWFyaW5nMSA9IDI1LFxyXG4gICAgYmVhcmluZzIgPSA0NSxcclxuICAgIHN0ZXBzID0gMzYwLFxyXG4gICAgaXM4NCA9IGZhbHNlXHJcbiAgKSB7XHJcbiAgICBsZXQgYyA9IHR1cmYucG9pbnQoW2NlbnRlci5sbmcsIGNlbnRlci5sYXRdKVxyXG4gICAgbGV0IGNvb3JkaW5hdGVzID0gdHVyZi5zZWN0b3IoYywgcmFkaXVzIC8gMTAwMCwgYmVhcmluZzEsIGJlYXJpbmcyLCB7IHN0ZXBzOiBzdGVwcyB9KVxyXG4gICAgICAuZ2VvbWV0cnkuY29vcmRpbmF0ZXNcclxuICAgIGxldCBwb3NpdGlvbnMgPSBbXVxyXG4gICAgY29vcmRpbmF0ZXMuZm9yRWFjaCgoYXJyYXkpID0+IHtcclxuICAgICAgYXJyYXkuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICAgIGxldCBwb3NcclxuICAgICAgICBpZiAoaXM4NCkge1xyXG4gICAgICAgICAgcG9zID0ge1xyXG4gICAgICAgICAgICBsbmc6IGl0ZW1bMF0sXHJcbiAgICAgICAgICAgIGxhdDogaXRlbVsxXSxcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBwb3MgPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tRGVncmVlcyhpdGVtWzBdLCBpdGVtWzFdKVxyXG4gICAgICAgIH1cclxuICAgICAgICBwb3NpdGlvbnMucHVzaChwb3MpXHJcbiAgICAgIH0pXHJcbiAgICB9KVxyXG4gICAgcmV0dXJuIHBvc2l0aW9uc1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQGRlc2Pojrflj5bntKfotLTpq5jluqZcclxuICAgKiBAcGFyYW0gcG9zaXRpb24g5Z2Q5qCHXHJcbiAgICovXHJcbiAgYXN5bmMgZ2V0Q2xhbXBUb0hlaWdodChwb3NpdGlvbiwgb2JqZWN0c1RvRXhjbHVkZSA9IFtdKSB7XHJcbiAgICBpZiAoIXRoaXMuc2RrIHx8ICF0aGlzLnNkay52aWV3ZXIpIHtcclxuICAgICAgcmV0dXJuIDBcclxuICAgIH1cclxuICAgIGxldCBwb3MzID0gbmV3IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzKHBvc2l0aW9uLmxuZywgcG9zaXRpb24ubGF0KTtcclxuICAgIGxldCBwb3NpdGlvbjFcclxuICAgIHRyeSB7XHJcbiAgICAgIHBvc2l0aW9uMSA9IGF3YWl0IHRoaXMuc2RrLnZpZXdlci5zY2VuZS5jbGFtcFRvSGVpZ2h0KHBvczMsIG9iamVjdHNUb0V4Y2x1ZGUpIHx8IHBvczNcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIHBvc2l0aW9uMSA9IHBvczNcclxuICAgIH1cclxuICAgIGxldCBoZWlnaHQxID0gYXdhaXQgdGhpcy5jYXJ0ZXNpYW4zVG93Z3M4NChwb3NpdGlvbjEsIHRoaXMuc2RrLnZpZXdlcikuYWx0XHJcbiAgICBsZXQgaGVpZ2h0MiA9IDBcclxuICAgIHRyeSB7XHJcbiAgICAgIGlmICh0aGlzLnNkay52aWV3ZXIuc2NlbmUudGVycmFpblByb3ZpZGVyLmF2YWlsYWJpbGl0eSkge1xyXG4gICAgICAgIGxldCBwb3NpdGlvbjIgPSBhd2FpdCBDZXNpdW0uc2FtcGxlVGVycmFpbk1vc3REZXRhaWxlZChcclxuICAgICAgICAgIHRoaXMuc2RrLnZpZXdlci5zY2VuZS50ZXJyYWluUHJvdmlkZXIsXHJcbiAgICAgICAgICBbQ2VzaXVtLkNhcnRvZ3JhcGhpYy5mcm9tRGVncmVlcyhwb3NpdGlvbi5sbmcsIHBvc2l0aW9uLmxhdCldXHJcbiAgICAgICAgKVxyXG4gICAgICAgIHBvc2l0aW9uMlswXS5oZWlnaHQgJiYgKGhlaWdodDIgPSBwb3NpdGlvbjJbMF0uaGVpZ2h0KVxyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBoZWlnaHQyID0gMFxyXG4gICAgfVxyXG4gICAgaWYgKGhlaWdodDEgPiBoZWlnaHQyKSB7XHJcbiAgICAgIHJldHVybiBOdW1iZXIoaGVpZ2h0MS50b0ZpeGVkKDIpKVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHJldHVybiBOdW1iZXIoaGVpZ2h0Mi50b0ZpeGVkKDIpKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQGRlc2Mg5rex5ou36LSd5a+56LGhXHJcbiAgICogKi9cclxuICBkZWVwQ29weU9iaihvYmopIHtcclxuICAgIGxldCBuZXdvYmogPSBudWxsO1xyXG4gICAgLy8g5aSE55CG5pWw57uEIC0g5L2/55So5Y6f55SfQXJyYXnmnoTpgKDlh73mlbDliJvlu7rmlrDmlbDnu4RcclxuICAgIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHtcclxuICAgICAgbmV3b2JqID0gW107XHJcbiAgICAgIC8vIOWPquaLt+i0neaVsOe7hOWFg+e0oO+8jOS4jeaLt+i0neWPr+iDveWtmOWcqOeahOaJqeWxleaWueazlVxyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9iai5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIG5ld29ialtpXSA9IHRoaXMuZGVlcENvcHlPYmoob2JqW2ldKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gbmV3b2JqO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIOWkhOeQhuWvueixoVxyXG4gICAgZWxzZSBpZiAob2JqICYmIHR5cGVvZiBvYmogPT09ICdvYmplY3QnKSB7XHJcbiAgICAgIG5ld29iaiA9IHt9O1xyXG4gICAgICBmb3IgKGxldCBpIGluIG9iaikge1xyXG4gICAgICAgIC8vIOaOkumZpOaMh+WumuWxnuaAp+WSjOaWueazleWxnuaAp1xyXG4gICAgICAgIGlmIChpICE9PSAnZWFydGgnICYmIGkgIT09ICdEaWFsb2cnICYmIHR5cGVvZiBvYmpbaV0gIT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgIG5ld29ialtpXSA9IHRoaXMuZGVlcENvcHlPYmoob2JqW2ldKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIG5ld29iajtcclxuICAgIH1cclxuICAgIGVsc2UgbmV3b2JqID0gb2JqO1xyXG4gICAgcmV0dXJuIG5ld29iajtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBkZXNjIOW6puWIhuenkui9rOaNolxyXG4gICAqICovXHJcbiAgcHJvakNvbnZlcnQoc3RhdHVzID0gZmFsc2UsIGNsb3NlQ2FsbEJhY2sgPSAoKSA9PiB7IH0pIHtcclxuICAgIGlmIChzdGF0dXMpIHtcclxuICAgICAgcHJvakNvbnZlcnRPcGVuKHRoaXMuc2RrLCBjbG9zZUNhbGxCYWNrKVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHByb2pDb252ZXJ0Q2xvc2UoKVxyXG4gICAgfVxyXG4gIH1cclxuICAvKipcclxuICAgKiBAZGVzYyDmipXlvbHovazmjaJcclxuICAgKiAqL1xyXG4gIHByb2plY3Rpb25Db252ZXJ0KHN0YXR1cyA9IGZhbHNlLCBjbG9zZUNhbGxCYWNrID0gKCkgPT4geyB9KSB7XHJcbiAgICBpZiAoc3RhdHVzKSB7XHJcbiAgICAgIHByb2plY3Rpb25Db252ZXJ0T3Blbih0aGlzLnNkaywgY2xvc2VDYWxsQmFjaylcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBwcm9qZWN0aW9uQ29udmVydENsb3NlKClcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBkZXNjIOWvvOWHumV4Y2VsXHJcbiAgICovXHJcbiAgLy8g5a+85Ye65bGe5oCnXHJcbiAgZXhwb3J0RXhjZWwoZGF0YSkge1xyXG4gICAgbGV0IGxhYmVsID0gJzxSb3c+J1xyXG4gICAgZm9yIChsZXQga2V5IGluIGRhdGFbMF0pIHtcclxuICAgICAgbGFiZWwgKz0gYDxDZWxsPjxEYXRhIHNzOlR5cGU9XCJTdHJpbmdcIj4ke2tleX08L0RhdGE+PC9DZWxsPmBcclxuICAgIH1cclxuICAgIGxhYmVsICs9ICc8L1Jvdz4nXHJcbiAgICBsZXQgdXJsID0gJ2RhdGE6YXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsO2Jhc2U2NCwnLFxyXG4gICAgICB0bXBsV29ya2Jvb2tYTUwgPSAnPD94bWwgdmVyc2lvbj1cIjEuMFwiPz48P21zby1hcHBsaWNhdGlvbiBwcm9naWQ9XCJFeGNlbC5TaGVldFwiPz48V29ya2Jvb2sgeG1sbnM9XCJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpzcHJlYWRzaGVldFwiIHhtbG5zOnNzPVwidXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6c3ByZWFkc2hlZXRcIj4nXHJcbiAgICAgICAgKyAnPERvY3VtZW50UHJvcGVydGllcyB4bWxucz1cInVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZVwiPjxBdXRob3I+QXhlbCBSaWNodGVyPC9BdXRob3I+PENyZWF0ZWQ+e2NyZWF0ZWR9PC9DcmVhdGVkPjwvRG9jdW1lbnRQcm9wZXJ0aWVzPidcclxuICAgICAgICArICc8U3R5bGVzPidcclxuICAgICAgICArICc8U3R5bGUgc3M6SUQ9XCJDdXJyZW5jeVwiPjxOdW1iZXJGb3JtYXQgc3M6Rm9ybWF0PVwiQ3VycmVuY3lcIj48L051bWJlckZvcm1hdD48L1N0eWxlPidcclxuICAgICAgICArICc8U3R5bGUgc3M6SUQ9XCJEYXRlXCI+PE51bWJlckZvcm1hdCBzczpGb3JtYXQ9XCJNZWRpdW0gRGF0ZVwiPjwvTnVtYmVyRm9ybWF0PjwvU3R5bGU+J1xyXG4gICAgICAgICsgJzwvU3R5bGVzPidcclxuICAgICAgICArICd7d29ya3NoZWV0c308L1dvcmtib29rPidcclxuICAgICAgLCB0bXBsV29ya3NoZWV0WE1MID0gJzxXb3Jrc2hlZXQgc3M6TmFtZT1cIntuYW1lV1N9XCI+PFRhYmxlPjxzczpDb2x1bW4gc3M6V2lkdGg9XCIxMjBcIi8+PHNzOkNvbHVtbiBzczpXaWR0aD1cIjEyMFwiLz48c3M6Q29sdW1uIHNzOldpZHRoPVwiMTIwXCIvPjxzczpDb2x1bW4gc3M6V2lkdGg9XCIxMjBcIi8+PHNzOkNvbHVtbiBzczpXaWR0aD1cIjEyMFwiLz48c3M6Q29sdW1uIHNzOldpZHRoPVwiMTIwXCIvPjxzczpDb2x1bW4gc3M6V2lkdGg9XCIxMjBcIi8+PHNzOkNvbHVtbiBzczpXaWR0aD1cIjEyMFwiLz48c3M6Q29sdW1uIHNzOldpZHRoPVwiMTIwXCIvPjxzczpDb2x1bW4gc3M6V2lkdGg9XCIxMjBcIi8+PHNzOkNvbHVtbiBzczpXaWR0aD1cIjEyMFwiLz48c3M6Q29sdW1uIHNzOldpZHRoPVwiMTIwXCIvPjxzczpDb2x1bW4gc3M6V2lkdGg9XCIxMjBcIi8+PHNzOkNvbHVtbiBzczpXaWR0aD1cIjI0MFwiLz57cm93c308L1RhYmxlPjwvV29ya3NoZWV0PidcclxuICAgICAgLCB0bXBsQ2VsbFhNTCA9ICc8Q2VsbD48RGF0YSBzczpUeXBlPVwie25hbWVUeXBlfVwiPntkYXRhfTwvRGF0YT48L0NlbGw+J1xyXG4gICAgICAsIGJhc2U2NCA9IGZ1bmN0aW9uIChzKSB7XHJcbiAgICAgICAgcmV0dXJuIHdpbmRvdy5idG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChzKSkpXHJcbiAgICAgIH1cclxuICAgICAgLCBmb3JtYXQgPSBmdW5jdGlvbiAocywgYykge1xyXG4gICAgICAgIHJldHVybiBzLnJlcGxhY2UoL3soXFx3Kyl9L2csIGZ1bmN0aW9uIChtLCBwKSB7XHJcbiAgICAgICAgICByZXR1cm4gY1twXTtcclxuICAgICAgICB9KVxyXG4gICAgICB9XHJcblxyXG4gICAgbGV0IGN0eCA9IFwiXCI7XHJcbiAgICBsZXQgd29ya2Jvb2tYTUwgPSBcIlwiO1xyXG4gICAgbGV0IHdvcmtzaGVldHNYTUwgPSBcIlwiO1xyXG4gICAgbGV0IHJvd3NYTUwgPSBcIlwiO1xyXG5cclxuICAgIGxldCBwaWwgPSAwO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGlmIChpID09IDApIHtcclxuICAgICAgICByb3dzWE1MICs9IGxhYmVsXHJcbiAgICAgIH1cclxuICAgICAgcm93c1hNTCArPSAnPFJvdz4nO1xyXG4gICAgICBmb3IgKGxldCBrZXkgaW4gZGF0YVtpXSkge1xyXG4gICAgICAgIGN0eCA9IHtcclxuICAgICAgICAgIG5hbWVUeXBlOiAnU3RyaW5nJyxcclxuICAgICAgICAgIGRhdGE6IGRhdGFbaV1ba2V5XVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgcm93c1hNTCArPSBmb3JtYXQodG1wbENlbGxYTUwsIGN0eCk7XHJcbiAgICAgIH1cclxuICAgICAgcm93c1hNTCArPSAnPC9Sb3c+JztcclxuICAgICAgaWYgKGkgPiAwICYmIChpIC8gNjAwMDApICUgMSA9PT0gMCkge1xyXG4gICAgICAgIHBpbCsrO1xyXG4gICAgICAgIGN0eCA9IHsgcm93czogcm93c1hNTCwgbmFtZVdTOiAnU2hlZXQnICsgaSB9O1xyXG4gICAgICAgIHdvcmtzaGVldHNYTUwgKz0gZm9ybWF0KHRtcGxXb3Jrc2hlZXRYTUwsIGN0eCk7XHJcbiAgICAgICAgcm93c1hNTCA9IFwiXCI7XHJcbiAgICAgICAgcm93c1hNTCArPSBsYWJlbFxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBjdHggPSB7IHJvd3M6IHJvd3NYTUwsIG5hbWVXUzogJ1NoZWV0JyB9O1xyXG4gICAgd29ya3NoZWV0c1hNTCArPSBmb3JtYXQodG1wbFdvcmtzaGVldFhNTCwgY3R4KTtcclxuICAgIHJvd3NYTUwgPSBcIlwiO1xyXG4gICAgY3R4ID0geyBjcmVhdGVkOiAobmV3IERhdGUoKSkuZ2V0VGltZSgpLCB3b3Jrc2hlZXRzOiB3b3Jrc2hlZXRzWE1MIH07XHJcbiAgICB3b3JrYm9va1hNTCA9IGZvcm1hdCh0bXBsV29ya2Jvb2tYTUwsIGN0eCk7XHJcbiAgICBsZXQgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJBXCIpO1xyXG4gICAgbGluay5ocmVmID0gdXJsICsgYmFzZTY0KHdvcmtib29rWE1MKTtcclxuICAgIGxpbmsuZG93bmxvYWQgPSBcIuefoumHj+aVsOaNruWvvOWHui54bHNcIlxyXG4gICAgbGluay50YXJnZXQgPSAnX2JsYW5rJztcclxuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobGluayk7XHJcbiAgICBsaW5rLmNsaWNrKCk7XHJcbiAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGxpbmspO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQGRlc2MgR3ppcOino+WOi1xyXG4gICAqL1xyXG4gIGRlY29tcHJlc3NHemlwKGNvbXByZXNzZWREYXRhKSB7XHJcbiAgICBsZXQgZGVjb21wcmVzc2VkRGF0YSA9IHBha28uaW5mbGF0ZShjb21wcmVzc2VkRGF0YSk7XHJcbiAgICAvLyDlsIbop6PljovnvKnlkI7nmoTmlbDmja7ovazmjaLkuLrlrZfnrKbkuLJcclxuICAgIGxldCBkZWNvbXByZXNzZWRTdHJpbmcgPSBuZXcgVGV4dERlY29kZXIoKS5kZWNvZGUoZGVjb21wcmVzc2VkRGF0YSk7XHJcbiAgICByZXR1cm4gZGVjb21wcmVzc2VkU3RyaW5nXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAZGVzYyBjbXlr6L2scmJnXHJcbiAgICogQHBhcmFtIHsqfSBjb2xvclxyXG4gICAqIEByZXR1cm5zXHJcbiAgICovXHJcbiAgY215a1RvUmdiKGNvbG9yKSB7XHJcbiAgICBsZXQgeyBjLCBtLCB5LCBrIH0gPSBjb2xvclxyXG4gICAgbGV0IHJnYiA9IHsgcjogMCwgZzogMCwgYjogMCB9O1xyXG4gICAgcmdiLmMgPSBjIC8gMTAwO1xyXG4gICAgcmdiLm0gPSBtIC8gMTAwO1xyXG4gICAgcmdiLnkgPSB5IC8gMTAwO1xyXG4gICAgcmdiLmsgPSBrIC8gMTAwO1xyXG4gICAgcmdiLnIgPSAxIC0gTWF0aC5taW4oMSwgcmdiLmMgKiAoMSAtIHJnYi5rKSArIHJnYi5rKTtcclxuICAgIHJnYi5nID0gMSAtIE1hdGgubWluKDEsIHJnYi5tICogKDEgLSByZ2IuaykgKyByZ2Iuayk7XHJcbiAgICByZ2IuYiA9IDEgLSBNYXRoLm1pbigxLCByZ2IueSAqICgxIC0gcmdiLmspICsgcmdiLmspO1xyXG4gICAgcmdiLnIgPSBNYXRoLnJvdW5kKHJnYi5yICogMjU1KTtcclxuICAgIHJnYi5nID0gTWF0aC5yb3VuZChyZ2IuZyAqIDI1NSlcclxuICAgIHJnYi5iID0gTWF0aC5yb3VuZChyZ2IuYiAqIDI1NSk7XHJcbiAgICByZXR1cm4gYHJnYigke3JnYi5yfSwgJHtyZ2IuZ30sICR7cmdiLmJ9KWA7XHJcbiAgfVxyXG5cclxuICBjb252ZXJ0UHhUb1JlbShzZGssIHNlbGVjdG9yKSB7XHJcbiAgICBjb25zdCBodG1sRm9udFNpemUgPSBwYXJzZUZsb2F0KGdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KS5mb250U2l6ZSk7XHJcbiAgICBsZXQgbGlzdCA9IFtdXHJcbiAgICBsZXQgZWxlbWVudExpc3QgPSBbXVxyXG4gICAgaWYgKHNlbGVjdG9yKSB7XHJcbiAgICAgIGxpc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChzZGsuZGl2X2lkKS5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKVxyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBlbGVtZW50TGlzdC5wdXNoKGxpc3RbaV0sIC4uLmxpc3RbaV0ucXVlcnlTZWxlY3RvckFsbCgnKicpKVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgZWxlbWVudExpc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChzZGsuZGl2X2lkKS5xdWVyeVNlbGVjdG9yQWxsKCcqJyk7XHJcbiAgICB9XHJcbiAgICBlbGVtZW50TGlzdC5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICBjb25zdCBzdHlsZSA9IGVsZW1lbnQuc3R5bGU7XHJcbiAgICAgIGNvbnN0IHJ1bGVzID0gQXJyYXkuZnJvbShzdHlsZSkuZmlsdGVyKHByb3AgPT4ge1xyXG4gICAgICAgIHJldHVybiB0eXBlb2YgcHJvcCA9PT0gJ3N0cmluZycgJiYgcHJvcC5lbmRzV2l0aCgncHgnKTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBydWxlcy5mb3JFYWNoKHByb3AgPT4ge1xyXG4gICAgICAgIGNvbnN0IHB4VmFsdWUgPSBwYXJzZUZsb2F0KHN0eWxlW3Byb3BdKTtcclxuICAgICAgICBjb25zdCByZW1WYWx1ZSA9IHB4VmFsdWUgLyBodG1sRm9udFNpemU7XHJcbiAgICAgICAgZWxlbWVudC5zdHlsZVtwcm9wXSA9IGAke3JlbVZhbHVlfXJlbWA7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBpc0NvbnZleChhcnIgPSBbXSkge1xyXG4gICAgY29uc3QgeyBsZW5ndGggfSA9IGFyclxyXG4gICAgbGV0IHByZSA9IDAsXHJcbiAgICAgIGN1cnIgPSAwXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XHJcbiAgICAgIGxldCBkeDEgPSBhcnJbKGkgKyAxKSAlIGxlbmd0aF0ubG5nIC0gYXJyW2ldLmxuZ1xyXG4gICAgICBsZXQgZHgyID0gYXJyWyhpICsgMikgJSBsZW5ndGhdLmxuZyAtIGFyclsoaSArIDEpICUgbGVuZ3RoXS5sbmdcclxuICAgICAgbGV0IGR5MSA9IGFyclsoaSArIDEpICUgbGVuZ3RoXS5sYXQgLSBhcnJbaV0ubGF0XHJcbiAgICAgIGxldCBkeTIgPSBhcnJbKGkgKyAyKSAlIGxlbmd0aF0ubGF0IC0gYXJyWyhpICsgMSkgJSBsZW5ndGhdLmxhdFxyXG4gICAgICBjdXJyID0gZHgxICogZHkyIC0gZHgyICogZHkxXHJcbiAgICAgIGlmIChjdXJyICE9IDApIHtcclxuICAgICAgICBpZiAoKGN1cnIgPiAwICYmIHByZSA8IDApIHx8IChjdXJyIDwgMCAmJiBwcmUgPiAwKSkgcmV0dXJuIGZhbHNlXHJcbiAgICAgICAgZWxzZSBwcmUgPSBjdXJyXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlXHJcbiAgfVxyXG5cclxuICBnZXREYXRlVGltZVN0cmluZygpIHtcclxuICAgIC8vIOWIm+W7uuS4gOS4quihqOekuuW9k+WJjeaXtumXtOeahCBEYXRlIOWvueixoVxyXG4gICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcclxuICAgIC8vIOiOt+WPluW5tOS7vVxyXG4gICAgY29uc3QgeWVhciA9IG5vdy5nZXRGdWxsWWVhcigpO1xyXG4gICAgLy8g6I635Y+W5pyI5Lu977yI5LuOIDAg5byA5aeL77yM5omA5Lul6KaB5YqgIDHvvInvvIzlubblsIblhbbovazmjaLkuLrkuKTkvY3lrZfnrKbkuLLvvIzkuI3otrPkuKTkvY3lnKjliY3pnaLooaXpm7ZcclxuICAgIGNvbnN0IG1vbnRoID0gU3RyaW5nKG5vdy5nZXRNb250aCgpICsgMSkucGFkU3RhcnQoMiwgJzAnKTtcclxuICAgIC8vIOiOt+WPluaXpeacn++8jOW5tuWwhuWFtui9rOaNouS4uuS4pOS9jeWtl+espuS4su+8jOS4jei2s+S4pOS9jeWcqOWJjemdouihpembtlxyXG4gICAgY29uc3QgZGF5ID0gU3RyaW5nKG5vdy5nZXREYXRlKCkpLnBhZFN0YXJ0KDIsICcwJyk7XHJcbiAgICAvLyDojrflj5blsI/ml7bvvIzlubblsIblhbbovazmjaLkuLrkuKTkvY3lrZfnrKbkuLLvvIzkuI3otrPkuKTkvY3lnKjliY3pnaLooaXpm7ZcclxuICAgIGNvbnN0IGhvdXJzID0gU3RyaW5nKG5vdy5nZXRIb3VycygpKS5wYWRTdGFydCgyLCAnMCcpO1xyXG4gICAgLy8g6I635Y+W5YiG6ZKf77yM5bm25bCG5YW26L2s5o2i5Li65Lik5L2N5a2X56ym5Liy77yM5LiN6Laz5Lik5L2N5Zyo5YmN6Z2i6KGl6Zu2XHJcbiAgICBjb25zdCBtaW51dGVzID0gU3RyaW5nKG5vdy5nZXRNaW51dGVzKCkpLnBhZFN0YXJ0KDIsICcwJyk7XHJcbiAgICAvLyDojrflj5bnp5LvvIzlubblsIblhbbovazmjaLkuLrkuKTkvY3lrZfnrKbkuLLvvIzkuI3otrPkuKTkvY3lnKjliY3pnaLooaXpm7ZcclxuICAgIGNvbnN0IHNlY29uZHMgPSBTdHJpbmcobm93LmdldFNlY29uZHMoKSkucGFkU3RhcnQoMiwgJzAnKTtcclxuICAgIC8vIOiOt+WPluavq+enku+8jOW5tuWwhuWFtui9rOaNouS4uuS4ieS9jeWtl+espuS4su+8jOS4jei2s+S4ieS9jeWcqOWJjemdouihpembtlxyXG4gICAgY29uc3QgbWlsbGlzZWNvbmRzID0gU3RyaW5nKG5vdy5nZXRNaWxsaXNlY29uZHMoKSkucGFkU3RhcnQoMywgJzAnKTtcclxuICAgIC8vIOWwhuW5tOOAgeaciOOAgeaXpeOAgeaXtuOAgeWIhuOAgeenkuOAgeavq+enkuaLvOaOpeaIkOaJgOmcgOeahOWtl+espuS4slxyXG4gICAgcmV0dXJuIGAke3llYXJ9JHttb250aH0ke2RheX0ke2hvdXJzfSR7bWludXRlc30ke3NlY29uZHN9JHttaWxsaXNlY29uZHN9YDtcclxuICB9XHJcblxyXG4gIHJlcGxhY2VIb3N0KHVybCwgaG9zdCkge1xyXG4gICAgbGV0IG5ld1VybCA9IHVybFxyXG4gICAgaWYgKCF1cmwgfHwgIWhvc3QpIHtcclxuICAgICAgcmV0dXJuIHVybFxyXG4gICAgfVxyXG4gICAgdHJ5IHtcclxuICAgICAgaWYgKCF1cmwuc3RhcnRzV2l0aChcImh0dHBcIikpIHtcclxuICAgICAgICAvL+ivtOaYjuaYr+acrOWcsOeahGpzb27vvIzlnKjno4Hnm5jkuK3lrZjlnKjnmoRcclxuICAgICAgICBpZiAoIXVybC5pbmNsdWRlcyhcIjpcIikpIHtcclxuICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuaG9zdCkge1xyXG4gICAgICAgICAgICBsZXQgbyA9IG5ldyBVUkwodXJsLCB0aGlzLm9wdGlvbnMuaG9zdClcclxuICAgICAgICAgICAgbmV3VXJsID0gby5ocmVmXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBuZXdVcmxcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICAvLyDnp7vpmaTlj6/og73nmoTnlKjmiLflkI065a+G56CB5YmN57yAXHJcbiAgICAgICAgY29uc3QgYXV0aFJlZ2V4ID0gL15bXkBdK0AvO1xyXG4gICAgICAgIGlmIChhdXRoUmVnZXgudGVzdCh1cmwpKSB7XHJcbiAgICAgICAgICB1cmwgPSB1cmwucmVwbGFjZShhdXRoUmVnZXgsICcnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIOa3u+WKoOWNj+iuruWJjee8gO+8iOWmguaenOayoeacie+8iVxyXG4gICAgICAgIGlmICghL15bYS16XSs6XFwvXFwvL2kudGVzdCh1cmwpKSB7XHJcbiAgICAgICAgICB1cmwgPSAnaHR0cDovLycgKyB1cmw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBwYXJzZWRVcmwgPSBuZXcgVVJMKHVybCk7XHJcbiAgICAgICAgY29uc3QgcGFyc2VkVXJsMiA9IG5ldyBVUkwoaG9zdCk7XHJcbiAgICAgICAgbGV0IGhvc3RuYW1lID0gcGFyc2VkVXJsLmhvc3RuYW1lO1xyXG4gICAgICAgIGxldCBwb3J0ID0gcGFyc2VkVXJsLnBvcnQ7XHJcblxyXG4gICAgICAgIC8vIOWkhOeQhklQdjblnLDlnYDvvIjlpoLmnpzmnInmi6zlj7fvvIlcclxuICAgICAgICBpZiAoaG9zdG5hbWUuc3RhcnRzV2l0aCgnWycpICYmIGhvc3RuYW1lLmVuZHNXaXRoKCddJykpIHtcclxuICAgICAgICAgIGhvc3RuYW1lID0gaG9zdG5hbWUuc2xpY2UoMSwgLTEpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoKGhvc3RuYW1lID09PSAnbG9jYWxob3N0JyB8fCBob3N0bmFtZSA9PT0gJzEyNy4wLjAuMScpICYmIHBhcnNlSW50KHBvcnQsIDEwKSAhPT0gNTUxMTApIHtcclxuICAgICAgICAgIHBhcnNlZFVybC5wb3J0ID0gcGFyc2VkVXJsMi5wb3J0XHJcbiAgICAgICAgICBwYXJzZWRVcmwucHJvdG9jb2wgPSBwYXJzZWRVcmwyLnByb3RvY29sXHJcbiAgICAgICAgICBuZXdVcmwgPSBwYXJzZWRVcmwudG9TdHJpbmcoKVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbmV3VXJsXHJcbiAgICAgIH1cclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIHJldHVybiBuZXdVcmxcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG1lc3NhZ2Uob3B0aW9uID0ge30pIHtcclxuICAgIGxldCB0eXBlID0gb3B0aW9uLnR5cGUgfHwgJ3N1Y2Nlc3MnXHJcbiAgICBsZXQgdGV4dCA9IG9wdGlvbi50ZXh0IHx8ICcnXHJcbiAgICBsZXQgZHVyYXRpb24gPSBvcHRpb24uZHVyYXRpb24gfHwgMTUwMFxyXG5cclxuICAgIGxldCBtZXNzYWdlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ1lKLWN1c3RvbS1tZXNzYWdlJyk7XHJcbiAgICBpZiAobWVzc2FnZSkge1xyXG4gICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKG1lc3NhZ2UpXHJcbiAgICB9XHJcbiAgICBtZXNzYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcclxuICAgIG1lc3NhZ2UuaWQgPSAnWUotY3VzdG9tLW1lc3NhZ2UnXHJcbiAgICBpZiAodHlwZSA9PSAnc3VjY2VzcycpIHtcclxuICAgICAgbWVzc2FnZS5pbm5lckhUTUwgPSBgXHJcbiAgICAgIDxpPjw/eG1sIHZlcnNpb249XCIxLjBcIiBzdGFuZGFsb25lPVwibm9cIj8+PCFET0NUWVBFIHN2ZyBQVUJMSUMgXCItLy9XM0MvL0RURCBTVkcgMS4xLy9FTlwiIFwiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkXCI+PHN2ZyB0PVwiMTc1NTkyOTk2MTI4MlwiIGNsYXNzPVwiaWNvblwiIHZpZXdCb3g9XCIwIDAgMTAyNCAxMDI0XCIgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBwLWlkPVwiNTA2NFwiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiPjxwYXRoIGQ9XCJNODc0LjExOTYxOCAxNDkuODU5OTIyQTUxMC44MTY0NjEgNTEwLjgxNjQ2MSAwIDAgMCA1MTEuOTk3IDAuMDAyMDhhNTA5LjkxMDQ2MiA1MDkuOTEwNDYyIDAgMCAwLTM2Mi4xMTk2MTggMTQ5Ljg1Nzg0MmMtMTk5LjgxNzc4OSAxOTkuNjc5Nzg5LTE5OS44MTc3ODkgNTI0LjU4MTQ0NyAwIDcyNC4yNjAyMzZhNTA5Ljk2OTQ2MiA1MDkuOTY5NDYyIDAgMCAwIDM2Mi4xMTk2MTggMTQ5Ljg1Nzg0MkE1MDguODcyNDYzIDUwOC44NzI0NjMgMCAwIDAgODc0LjExOTYxOCA4NzQuMTIwMTU4YzE5OS44MzY3ODktMTk5LjY3OTc4OSAxOTkuODM2Nzg5LTUyNC41ODE0NDcgMC03MjQuMjYwMjM2ek04MTQuOTQyNjggMzc4LjIxMDY4MUw0NzAuOTk5MDQzIDc0NC4xMzIyOTVhMTUuMzU5OTg0IDE1LjM1OTk4NCAwIDAgMS01Ljg4Nzk5NCA0LjA5NTk5NmMtMS43NTE5OTggMS4xODA5OTktMi45MTM5OTcgMi4zNjI5OTgtNS4yNzY5OTQgMi45MTM5OTdhMzQuNDk5OTY0IDM0LjQ5OTk2NCAwIDAgMS0xMy40Njk5ODYgMi45MTQ5OTcgNDUuNTQ3OTUyIDQ1LjU0Nzk1MiAwIDAgMS0xMi44OTc5ODYtMi4zMDM5OThsLTQuMDk1OTk2LTIuMzYzOTk3YTQ1LjI5MTk1MiA0NS4yOTE5NTIgMCAwIDEtNy4wMDk5OTItNC4wOTU5OTZsLTE5Ni45MDI3OTMtMTkzLjc4OTc5NmEzNC4xMjY5NjQgMzQuMTI2OTY0IDAgMCAxLTEwLjU1NTk4OS0yNS4xODY5NzNjMC05LjM3Mzk5IDMuNTgzOTk2LTE4Ljc0Njk4IDkuOTgzOTktMjUuMTg2OTc0YTM2LjQyOTk2MiAzNi40Mjk5NjIgMCAwIDEgNTAuMzcyOTQ3IDBsMTY5Ljk4MzgyIDE2Ny40MjM4MjRMNzYzLjM4OTczNSAzMzAuMjIwNzMyYTM3LjA1OTk2MSAzNy4wNTk5NjEgMCAwIDEgNTAuMzcxOTQ3LTEuNzMyOTk4IDMzLjY0Nzk2NSAzMy42NDc5NjUgMCAwIDEgMTEuMTY1OTg4IDI1LjE4Njk3MyAzNS41NDQ5NjMgMzUuNTQ0OTYzIDAgMCAxLTkuOTgzOTkgMjQuNTc1OTc0di0wLjA0eiBtMCAwXCIgZmlsbD1cIiM1MkM0MUFcIiBwLWlkPVwiNTA2NVwiPjwvcGF0aD48L3N2Zz48L2k+JHt0ZXh0fVxyXG4gICAgYFxyXG4gICAgfSBlbHNlIGlmICh0eXBlID09ICd3YXJuaW5nJykge1xyXG4gICAgICBtZXNzYWdlLmlubmVySFRNTCA9IGBcclxuICAgICAgPGk+PD94bWwgdmVyc2lvbj1cIjEuMFwiIHN0YW5kYWxvbmU9XCJub1wiPz48IURPQ1RZUEUgc3ZnIFBVQkxJQyBcIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOXCIgXCJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGRcIj48c3ZnIHQ9XCIxNzU2MDkzNTk5MjU4XCIgY2xhc3M9XCJpY29uXCIgdmlld0JveD1cIjAgMCAxMDI0IDEwMjRcIiB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHAtaWQ9XCIxNjQ4XCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCI+PHBhdGggZD1cIk01MTIuMDAyNTU4IDY0LjI0NTIxYy0yNDcuMjkyMTc2IDAtNDQ3Ljc1Nzg2IDIwMC40NjQ2NjEtNDQ3Ljc1Nzg2IDQ0Ny43NTY4MzcgMCAyNDcuMjg3MDU5IDIwMC40NjQ2NjEgNDQ3Ljc1Mjc0NCA0NDcuNzU3ODYgNDQ3Ljc1Mjc0NCAyNDcuMjg2MDM2IDAgNDQ3Ljc1MTcyLTIwMC40NjQ2NjEgNDQ3Ljc1MTcyLTQ0Ny43NTI3NDRDOTU5Ljc1NDI3OSAyNjQuNzEwODk0IDc1OS4yODg1OTQgNjQuMjQ1MjEgNTEyLjAwMjU1OCA2NC4yNDUyMXpNNTEyLjAxMDc0NSA3MzUuODc1ODZjLTIwLjYwMjIyNCAwLTM3LjMxOTk3Ny0xNi43MTg3NzctMzcuMzE5OTc3LTM3LjMyMzA0NyAwLTIwLjU5NzEwNyAxNi43MTc3NTMtMzcuMzE5OTc3IDM3LjMxOTk3Ny0zNy4zMTk5NzcgMjAuNjA0MjcgMCAzNy4yOTc0NjQgMTYuNzIyODcgMzcuMjk3NDY0IDM3LjMxOTk3N0M1NDkuMzA4MjA5IDcxOS4xNTgxMDcgNTMyLjYxMzk5MiA3MzUuODc1ODYgNTEyLjAxMDc0NSA3MzUuODc1ODZ6TTU0OS4zMDgyMDkgNTY3Ljk2OTczM2MwIDIwLjYwMDE3Ny0xNi42OTMxOTQgMzcuMjkzMzcxLTM3LjI5NzQ2NCAzNy4yOTMzNzEtMjAuNjAyMjI0IDAtMzcuMzE5OTc3LTE2LjY5MzE5NC0zNy4zMTk5NzctMzcuMjkzMzcxTDQ3NC42OTA3NjggMzI1LjQyMDU4MWMwLTIwLjYwNTI5NCAxNi43MTc3NTMtMzcuMjk3NDY0IDM3LjMxOTk3Ny0zNy4yOTc0NjQgMjAuNjA0MjcgMCAzNy4yOTc0NjQgMTYuNjkzMTk0IDM3LjI5NzQ2NCAzNy4yOTc0NjRMNTQ5LjMwODIwOSA1NjcuOTY5NzMzelwiIGZpbGw9XCIjZTk4ZjM2XCIgcC1pZD1cIjE2NDlcIj48L3BhdGg+PC9zdmc+PC9pPiR7dGV4dH1cclxuICAgIGBcclxuICAgIH1cclxuXHJcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKG1lc3NhZ2UpXHJcbiAgICBtZXNzYWdlLmNsYXNzTGlzdC5hZGQodHlwZSlcclxuICB9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBUb29sc1xyXG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBUEE7QUFBQTtBQUFBO0FBVUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBUkE7QUFBQTtBQUFBO0FBVUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBVEE7QUFBQTtBQUFBO0FBV0E7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFQQTtBQUFBO0FBQUE7QUFBQTtBQVFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQUE7QUFDQTtBQW9CQTtBQUFBO0FBakJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFLQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQWhFQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQWtFQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUpBO0FBQUE7QUFBQTtBQUFBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFOQTtBQUFBO0FBQUE7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVZBO0FBQUE7QUFBQTtBQVlBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFaQTtBQUFBO0FBQUE7QUFjQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTEE7QUFBQTtBQUFBO0FBTUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVZBO0FBQUE7QUFBQTtBQVdBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFWQTtBQUFBO0FBQUE7QUFXQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFWQTtBQUFBO0FBQUE7QUFXQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFKQTtBQUFBO0FBQUE7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTkE7QUFBQTtBQUFBO0FBT0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBQUE7QUFBQTtBQUdBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFBQTtBQUFBO0FBVUE7QUFOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBQUE7QUFBQTtBQUFBO0FBSUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFJQTtBQUhBO0FBSUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUFBO0FBQUE7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFHQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQTlCQTtBQUFBO0FBQUE7QUFBQTtBQWdDQTtBQUNBO0FBQ0E7QUFGQTtBQUFBO0FBQUE7QUFBQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFBQTtBQUFBO0FBR0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBQUE7QUFBQTtBQUdBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFBQTtBQUFBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUpBO0FBQUE7QUFBQTtBQU1BO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBR0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFsOUNBO0FBQ0E7QUFBQTtBQUFBO0FBcTlDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/Tools/index.js\n"); /***/ }), diff --git a/src/renderer/src/api/tree/index.ts b/src/renderer/src/api/tree/index.ts index 4323f53..074a05d 100644 --- a/src/renderer/src/api/tree/index.ts +++ b/src/renderer/src/api/tree/index.ts @@ -12,13 +12,18 @@ export const TreeApi = { return await request.post({ url: `/source/addOtherSource`, data + }).then((res) => { + ElMessage({ + message: '添加成功', + type: 'success' + }) }) }, - //新增节点 + //新增目录 addDirectory: async (data: any) => { return await request.post({ - url: `/source/addOtherSource`, + url: `/source/addDirectory`, data }).then((res) => { ElMessage({ diff --git a/src/renderer/src/components/dialog/baseDialog.vue b/src/renderer/src/components/dialog/baseDialog.vue index 859163e..64c2423 100644 --- a/src/renderer/src/components/dialog/baseDialog.vue +++ b/src/renderer/src/components/dialog/baseDialog.vue @@ -2,6 +2,8 @@
{{ title }} { const add = throttle(async () => { let parentId = getKeyOfSelectedNode(window.treeObj, 'id') let fnone = getSelectedNode(window.treeObj) - const res = await TreeApi.addDirectory({ + const res:any = await TreeApi.addDirectory({ + id: new YJ.Tools().randomString(), sourceName: form.sourceName, parentId }) diff --git a/src/renderer/src/main.ts b/src/renderer/src/main.ts index 5b9437f..3371fbd 100644 --- a/src/renderer/src/main.ts +++ b/src/renderer/src/main.ts @@ -25,7 +25,7 @@ import '../public/tree/jquery.ztree.exhide.js' import '../public/tree/fuzzysearch.js' import '../public/tree/newFuzzySearch' import Pagination from './components/Pagination/index.vue' -process.env["ELECTRON_DISABLE_SECURITY_WARNINGS"] = "true"; +// process.env["ELECTRON_DISABLE_SECURITY_WARNINGS"] = "true"; const i18n = createI18n({ legacy: false, locale: 'zh-CN', diff --git a/src/renderer/src/views/components/bottomSide/bottomSide.vue b/src/renderer/src/views/components/bottomSide/bottomSide.vue index c00f702..7f9de3d 100644 --- a/src/renderer/src/views/components/bottomSide/bottomSide.vue +++ b/src/renderer/src/views/components/bottomSide/bottomSide.vue @@ -19,7 +19,7 @@ import { inject } from "vue"; import { TreeApi } from '@/api/tree' import { initMapData } from '../tree/initMapData' const { t } = useI18n() -const eventBus = inject("bus"); +const eventBus: any = inject("bus"); const i8n = ref({ DrawRect: 'rect', @@ -42,7 +42,7 @@ const bottomMenuList = ref([ sourceType: 'groundText', className: 'public', fun: () => { - eventBus.emit("openDialog", 'groundText'); + eventBus.emit("openDialog", 'addGroundText'); } }, { @@ -51,7 +51,8 @@ const bottomMenuList = ref([ sourceType: 'standText', className: 'public', fun: () => { - eventBus.emit("openDialog", 'standText'); + eventBus.emit("openDialog", 'addStandText'); + // eventBus.emit("openDialog", 'standText'); } }, { @@ -82,7 +83,7 @@ const bottomMenuList = ref([ // "treeIndex": 0, "params": options } - TreeApi.addDirectory(params) + TreeApi.addOtherSource(params) }) } }, @@ -115,7 +116,7 @@ const bottomMenuList = ref([ // "treeIndex": 0, "params": options } - TreeApi.addDirectory(params) + TreeApi.addOtherSource(params) }) } }, @@ -137,7 +138,7 @@ const bottomMenuList = ref([ name: name, positions: positions, }) - + let selectedNodes = window.treeObj.getSelectedNodes() let params = { "id": id, @@ -147,7 +148,7 @@ const bottomMenuList = ref([ // "treeIndex": 0, "params": options } - TreeApi.addDirectory(params) + TreeApi.addOtherSource(params) }) } }, @@ -158,7 +159,7 @@ const bottomMenuList = ref([ className: 'public', fun: () => { let Draw = new YJ.Draw.DrawPolygon(window.earth) - Draw.start((a, positions) => { + Draw.start(async (a, positions) => { if (!positions || positions.length < 3) { ElMessage({ message: '至少需要绘制三个坐标!', @@ -166,11 +167,27 @@ const bottomMenuList = ref([ }) return } - let PolygonObject = new YJ.Obj.PolygonObject(window.earth, { id: new YJ.Tools().randomString(), positions: positions }) - PolygonObject.onClick = (a, b, c) => { - console.log(a, b, c) + let id = new YJ.Tools().randomString() + // let id = 'aaa' + let name = '面标注' + let options: any = await initMapData('panel', { + id: id, + name: name, + positions: positions, + }) + + let selectedNodes = window.treeObj.getSelectedNodes() + let params = { + "id": id, + "sourceName": name, + "sourceType": "panel", + "parentId": (selectedNodes && selectedNodes[selectedNodes.length - 1]) ? selectedNodes[selectedNodes.length - 1].id : undefined, + // "treeIndex": 0, + "params": options } - eventBus.emit("openDialog", 'panel', PolygonObject.options.id); + console.log(params) + // eventBus.emit("openDialog", 'panel'); + TreeApi.addOtherSource(params) }) } }, @@ -178,32 +195,169 @@ const bottomMenuList = ref([ sourceName: '圆标注', key: 'DrawCircle', sourceType: 'circle', - className: 'public' + className: 'public', }, { sourceName: '矩形', key: 'DrawRect', sourceType: 'rectangle', - className: 'public' + className: 'public', + fun: () => { + let Draw = new YJ.Draw.DrawRect(window.earth) + Draw.start(async (a, positions) => { + if (!positions || positions.length < 3) { + ElMessage({ + message: '至少需要绘制三个坐标!', + type: 'warning' + }) + return + } + let id = new YJ.Tools().randomString() + // let id = 'aaa' + let name = '矩形' + let options: any = await initMapData('panel', { + id: id, + name: name, + positions: positions, + }) + + let selectedNodes = window.treeObj.getSelectedNodes() + let params = { + "id": id, + "sourceName": name, + "sourceType": "rectangle", + "parentId": (selectedNodes && selectedNodes[selectedNodes.length - 1]) ? selectedNodes[selectedNodes.length - 1].id : undefined, + // "treeIndex": 0, + "params": options + } + console.log(params) + // eventBus.emit("openDialog", 'panel'); + TreeApi.addOtherSource(params) + }) + } }, { sourceName: '集结地', key: 'DrawAssemble', sourceType: 'rendezvous', - className: 'public' + className: 'public', + fun: () => { + let Draw = new YJ.Draw.DrawAssemble(window.earth) + Draw.start(async (a, positions) => { + if (!positions || positions.length < 3) { + ElMessage({ + message: '至少需要绘制三个坐标!', + type: 'warning' + }) + return + } + let id = new YJ.Tools().randomString() + // let id = 'aaa' + let name = '集结地' + let options: any = await initMapData('rendezvous', { + id: id, + name: name, + positions: positions, + }) + + delete options.label.ground + delete options.label.position + let selectedNodes = window.treeObj.getSelectedNodes() + let params = { + "id": id, + "sourceName": name, + "sourceType": "rendezvous", + "parentId": (selectedNodes && selectedNodes[selectedNodes.length - 1]) ? selectedNodes[selectedNodes.length - 1].id : undefined, + // "treeIndex": 0, + "params": options + } + console.log(params) + // eventBus.emit("openDialog", 'panel'); + TreeApi.addOtherSource(params) + }) + } }, { sourceName: '箭头', key: 'DrawAttackArrow', sourceType: 'attackArrow', - className: 'public' + className: 'public', + fun: () => { + let Draw = new YJ.Draw.DrawAttackArrow(window.earth) + Draw.start(async (a, positions) => { + if (!positions || positions.length < 3) { + ElMessage({ + message: '至少需要绘制三个坐标!', + type: 'warning' + }) + return + } + let id = new YJ.Tools().randomString() + // let id = 'aaa' + let name = '箭头' + let options: any = await initMapData('attackArrow', { + id: id, + name: name, + positions: positions, + }) + + delete options.label.ground + delete options.label.position + let selectedNodes = window.treeObj.getSelectedNodes() + let params = { + "id": id, + "sourceName": name, + "sourceType": "attackArrow", + "parentId": (selectedNodes && selectedNodes[selectedNodes.length - 1]) ? selectedNodes[selectedNodes.length - 1].id : undefined, + // "treeIndex": 0, + "params": options + } + console.log(params) + // eventBus.emit("openDialog", 'panel'); + TreeApi.addOtherSource(params) + }) + } }, { sourceName: '钳形箭头', key: 'DrawPincerArrow', sourceType: 'pincerArrow', - className: 'public' + className: 'public', + fun: () => { + let Draw = new YJ.Draw.DrawPincerArrow(window.earth) + Draw.start(async (a, positions) => { + if (!positions || positions.length < 5) { + ElMessage({ + message: '至少需要绘制五个坐标!', + type: 'warning' + }) + return + } + let id = new YJ.Tools().randomString() + // let id = 'aaa' + let name = '双箭头' + let options: any = await initMapData('pincerArrow', { + id: id, + name: name, + positions: positions, + }) + + delete options.label.ground + delete options.label.position + let selectedNodes = window.treeObj.getSelectedNodes() + let params = { + "id": id, + "sourceName": name, + "sourceType": "pincerArrow", + "parentId": (selectedNodes && selectedNodes[selectedNodes.length - 1]) ? selectedNodes[selectedNodes.length - 1].id : undefined, + // "treeIndex": 0, + "params": options + } + // eventBus.emit("openDialog", 'panel'); + TreeApi.addOtherSource(params) + }) + } } // { // sourceName: "锁定", diff --git a/src/renderer/src/views/components/propertyBox/addGroundText.vue b/src/renderer/src/views/components/propertyBox/addGroundText.vue index 3c69439..989ffea 100644 --- a/src/renderer/src/views/components/propertyBox/addGroundText.vue +++ b/src/renderer/src/views/components/propertyBox/addGroundText.vue @@ -1,5 +1,5 @@